From 4e526fa16ab007706a2e9eda21b7e2c945ae0233 Mon Sep 17 00:00:00 2001 From: "Hugo.M" Date: Wed, 21 Sep 2022 16:12:39 +0200 Subject: [PATCH 01/53] 2 slash --- ADECal.ics | 5247 ++++++++++++------------ __pycache__/ics_reader.cpython-310.pyc | Bin 0 -> 3968 bytes sche.py | 13 +- 3 files changed, 2626 insertions(+), 2634 deletions(-) create mode 100644 __pycache__/ics_reader.cpython-310.pyc diff --git a/ADECal.ics b/ADECal.ics index 8e4b71a..de492e1 100644 --- a/ADECal.ics +++ b/ADECal.ics @@ -4,3557 +4,3540 @@ PRODID:-//ADE/version 6.0 VERSION:2.0 CALSCALE:GREGORIAN BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T083000Z -DTEND:20221017T103000Z -SUMMARY:DI Sc_Ingé G2 -LOCATION:224 (TP Systèmes) -DESCRIPTION:\n\nMONMARCHE NICOLAS\nR2 PeiP1 S1\nGAUCHER PIERRE\n(Exported - :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393638312d302d33 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T141500Z -DTEND:20221010T161500Z -SUMMARY:Anglais S1 A5 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221017T120000Z +DTEND:20221017T140000Z +SUMMARY:DAE Sc_Ingé G5 +LOCATION:DAE-214 Info +DESCRIPTION:\n\nHACINI CHEMS EDDINE\nR5 PeiP1 S1\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393537342d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221011T113000Z -DTEND:20221011T130000Z +DTSTAMP:20220921T133408Z +DTSTART:20221202T091500Z +DTEND:20221202T111500Z SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI -PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31302d30 + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630302d32302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221025T113000Z -DTEND:20221025T130000Z -SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI - -PEIP Maths) +DTSTAMP:20220921T133408Z +DTSTART:20221117T141500Z +DTEND:20221117T154500Z +SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31322d30 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221121T130000Z -DTEND:20221121T150000Z -SUMMARY:Anglais S1 A2 -LOCATION:STD 5 -DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d39 +DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31382d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z +DTSTAMP:20220921T133408Z DTSTART:20221128T130000Z DTEND:20221128T150000Z -SUMMARY:Anglais S1 A4 -LOCATION:STD 3 -DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d3130 +SUMMARY:Anglais S1 A3 +LOCATION:STD 6 +DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d3130 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z +DTSTAMP:20220921T133408Z DTSTART:20221121T130000Z DTEND:20221121T150000Z -SUMMARY:DAE Sc_Ingé G4 -LOCATION:DAE-214 Info -DESCRIPTION:\n\nR4 PeiP1 S1\nHACINI CHEMS EDDINE\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393536302d332d30 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221004T063000Z -DTEND:20221004T080000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d39 +SUMMARY:Anglais S1 A2 +LOCATION:STD 5 +DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d39 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221103T071500Z -DTEND:20221103T171500Z -SUMMARY:CONGES AUTOMNE -LOCATION: -DESCRIPTION:\n\nPeiP1 S1\nPeiP2 S3\nPeiP1 S2\nPeiP2 S4\n(Exported :20/09/ - 2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d32303634312d332d30 +DTSTAMP:20220921T133408Z +DTSTART:20221003T061500Z +DTEND:20221003T081500Z +SUMMARY:Séance Libre Sc_Ingé +LOCATION:Amphi Dassault\,S Elec 2\,S Info A\,DAE-214 Info\,DAE-218 Info\, + S BEAO +DESCRIPTION:\n\nGAUCHER PIERRE\nR1 PeiP1 S1\nR2 PeiP1 S1\nR3 PeiP1 S1\nR4 + PeiP1 S1\nR5 PeiP1 S1\nMONMARCHE NICOLAS\nMAKRIS PASCAL\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393931352d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221129T123000Z -DTEND:20221129T140000Z +DTSTAMP:20220921T133408Z +DTSTART:20220930T081500Z +DTEND:20220930T094500Z SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI -PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31392d30 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T093000Z -DTEND:20221107T113000Z -SUMMARY:DI Sc_Ingé G2 -LOCATION:224 (TP Systèmes) -DESCRIPTION:\n\nMONMARCHE NICOLAS\nR2 PeiP1 S1\nGAUCHER PIERRE\n(Exported - :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393638312d302d30 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T130000Z -DTEND:20221128T150000Z -SUMMARY:DAE Sc_Ingé G5 -LOCATION:DAE-214 Info -DESCRIPTION:\n\nHACINI CHEMS EDDINE\nR5 PeiP1 S1\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393537342d302d33 + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630302d372d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T120000Z -DTEND:20221010T140000Z -SUMMARY:Anglais S1 A3 -LOCATION:STD 6 -DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d34 +DTSTAMP:20220921T133408Z +DTSTART:20220926T141500Z +DTEND:20220926T161500Z +SUMMARY:Anglais S1 A5 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221117T141500Z -DTEND:20221117T154500Z -SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) -LOCATION:GR E1 2040 -DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31382d30 +DTSTAMP:20220921T133408Z +DTSTART:20221128T071500Z +DTEND:20221128T091500Z +SUMMARY:DEE Sc_Ingé G2 +LOCATION:S Elec 2\,S Elec 1 +DESCRIPTION:\n\nBUSSEUIL REMI\nR2 PeiP1 S1\nMAKRIS PASCAL\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393632382d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221206T143000Z -DTEND:20221206T173000Z -SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths -LOCATION:GR L 0040 - Info -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy - sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :20/09/2022 18:46)\n - -UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d36 +DTSTAMP:20220921T133408Z +DTSTART:20221019T134500Z +DTEND:20221019T164500Z +SUMMARY:EP1 : Mécanique du point / EP2 : Electrostatique et électrocinéti + que MPI + PCST - CC +LOCATION:GR F Amphi Physique\,GR F Amphi Biologie\,GR F Amphi 22\,GR F Am + phi 21\,GR E1 Amphi 040\,GR E1 Amphi 030 +DESCRIPTION:\n\nL1 Maths - LAS1 TPB\nL1 Maths - Groupe 6 - MPI\nL1 Maths + - Groupe 4 - MPI\nL1 Maths - Groupe 5 - MPI\nL1 - Maths / Physique Gr8 P + EIP - (MPI)\nL1 - Maths / Physique Gr7 PEIP - (MPI)\nL1 Physique - Group + e 6 - MPI\nL1 Physique - Groupe 4 - MPI\nL1 Physique - Groupe 5 - MPI\nL + 1 Physique /Maths PEIP Gr10 PEIP\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - + Maths / Physique Gr11 PEIP - (MPI)\nL1 Chimie - Groupe 17 - CST\nL1 Phy + sique - Groupe 15 - PCST\nL1 Physique - Groupe 16 - PCST - LAS1\nL1 Phys + ique - Groupe 17 - C\nL1 Physique /Maths PEIP Gr11 PEIP\nL1 Info / Physi + que- Groupe 2\nL1 Info - Groupe 3 OUI/SI\nL1 ST - Groupe 16 - LAS Chimie + \nL1 ST - Groupe 17 - C\nL1 Chimie - Groupe 15 - CST\nL1 Chimie - Groupe + 12 - CST\nL1 Chimie - Groupe 13 - PC\nL1 Chimie - Groupe 14 - CST\nL1 P + hysique - Groupe 14 - PCST\nL1 Physique - Groupe 12 - PCST\nL1 Physique + - Groupe 13 - PCST\nL1 ST - Groupe 15 - CST\nL1 ST - Groupe 12 - CST\nL1 + ST - Groupe 13 - PC\nL1 ST - Groupe 14 - CST\nL1 Chimie - Groupe 16 - L + .AS1 Chimie\nL1 - Maths / Physique Gr10 PEIP - (MPI)\nL1 - Maths / Physi + que Gr9 PEIP - (MPI)\nL1 Physique /Maths PEIP Gr7 PEIP\nL1 Physique /Mat + hs PEIP Gr8 PEIP\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31353935372d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T071500Z -DTEND:20221107T091500Z -SUMMARY:DMS Sc_Ingé G1 -LOCATION:S Info 4-5 -DESCRIPTION:\n\nR1 PeiP1 S1\nMOFID WAFAA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393830312d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221010T141500Z +DTEND:20221010T161500Z +SUMMARY:Anglais S1 A7 +LOCATION:STD 6 +DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221115T143000Z -DTEND:20221115T173000Z -SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths -LOCATION:GR L 0080 - Info -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy - sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :20/09/2022 18:46)\n - -UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d35 +DTSTAMP:20220921T133408Z +DTSTART:20221027T063000Z +DTEND:20221027T093000Z +SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths +LOCATION:Polytech +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy + sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :21/09/2022 15 + :34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d39 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T093000Z -DTEND:20221128T113000Z -SUMMARY:DEE Sc_Ingé G4 -LOCATION:S Elec 1\,S Elec 2 -DESCRIPTION:\n\nBUSSEUIL REMI\nR4 PeiP1 S1\nMAKRIS PASCAL\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393633392d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221010T083000Z +DTEND:20221010T103000Z +SUMMARY:DAE Sc_Ingé G4 +LOCATION:DAE-214 Info +DESCRIPTION:\n\nR4 PeiP1 S1\nHACINI CHEMS EDDINE\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393536302d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T071500Z -DTEND:20221128T091500Z -SUMMARY:DMS Sc_Ingé G1 -LOCATION:S Info 4-5 -DESCRIPTION:\n\nR1 PeiP1 S1\nMOFID WAFAA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393830312d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221003T120000Z +DTEND:20221003T140000Z +SUMMARY:Anglais S1 A4 +LOCATION:STD 3 +DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T120000Z -DTEND:20221017T140000Z -SUMMARY:Anglais S1 A4 -LOCATION:STD 3 -DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d35 +DTSTAMP:20220921T133408Z +DTSTART:20221026T113000Z +DTEND:20221026T130000Z +SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) +LOCATION:GR E1 2040 +DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31332d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z +DTSTAMP:20220921T133408Z DTSTART:20221121T151500Z DTEND:20221121T171500Z -SUMMARY:Anglais S1 A6 -LOCATION:STD 5 -DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d36 +SUMMARY:DMS Sc_Ingé G2 +LOCATION:S Info A +DESCRIPTION:\n\nR2 PeiP1 S1\nMOFID WAFAA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393831362d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221031T071500Z -DTEND:20221031T171500Z -SUMMARY:CONGES AUTOMNE +DTSTAMP:20220921T133408Z +DTSTART:20220929T103000Z +DTEND:20220929T153000Z +SUMMARY:Rentr'écolo LOCATION: -DESCRIPTION:\n\nPeiP1 S1\nPeiP2 S3\nPeiP1 S2\nPeiP2 S4\n(Exported :20/09/ - 2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d32303634312d302d30 +DESCRIPTION:\n\nL1 Chimie\nL2 Chimie\nL3 Chimie\nL1 Informatique (Parcour + s MPI)\nL2 Informatique\nL3 Informatique\nLP Indus agro gest° product° e + t valor / Spé Méd Tech Ana Senso\nLP Prod. Animales specialité dvpt et v + alorisat° pdts de l'élevage\nL1 Maths Semestre 1\nL1 Maths Semestre 2\nL + 2 Mathématiques\nL2 Mathématiques Parcours PEIP\nL3 Mathématiques\nRMLQA + \nL1 Physique Semestre 1\nL1 Physique Semestre 2\nL2 Physique\nL2 Physiq + ue Parcours PEIP\nL3 Physique\nL1 Sciences de la Terre\nL2 Sciences de l + a Terre\nL3 Sciences de la Terre\nLicences CPES\nL1 Sciences de la Vie\n + L3 Sciences de la Vie\nAgrosciences\nBiodiversité Ecologie Evolutive (B + EE)\nM1 Biologie Santé\nM2 Biologie Santé\nM2 Compétence Complémentaire + en Informatique (CCI)\nMEEF\nMathématiques\nMatériaux\nSciences de l'eau + \nSciences du Vivant\nPhysique Fondamentale et Applications\nSéminaire\n + (Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d34323133352d302d30 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221107T093000Z +DTEND:20221107T113000Z +SUMMARY:DAE Sc_Ingé G1 +LOCATION:DAE-214 Info +DESCRIPTION:\n\nBREVET NATHALIE\nR1 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d3237352d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T083000Z -DTEND:20221010T103000Z -SUMMARY:DAE Sc_Ingé G4 -LOCATION:DAE-214 Info -DESCRIPTION:\n\nR4 PeiP1 S1\nHACINI CHEMS EDDINE\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393536302d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221027T113000Z +DTEND:20221027T130000Z +SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3134 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T093000Z -DTEND:20221128T113000Z -SUMMARY:DMS Sc_Ingé G3 -LOCATION:S Info 4-5 -DESCRIPTION:\n\nMOFID WAFAA\nR3 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393838312d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221017T141500Z +DTEND:20221017T161500Z +SUMMARY:Anglais S1 A6 +LOCATION:STD 5 +DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d34 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221004T113000Z -DTEND:20221004T130000Z +DTSTAMP:20220921T133408Z +DTSTART:20221108T123000Z +DTEND:20221108T140000Z SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI -PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d382d30 + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31342d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221121T130000Z -DTEND:20221121T150000Z -SUMMARY:Anglais S1 A3 -LOCATION:STD 6 -DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d39 +DTSTAMP:20220921T133408Z +DTSTART:20221129T123000Z +DTEND:20221129T140000Z +SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI + -PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31392d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220926T061500Z -DTEND:20220926T081500Z -SUMMARY:DMS Sc_Ingé G1 -LOCATION:S Info 4-5 -DESCRIPTION:\n\nR1 PeiP1 S1\nALTMEYER GUILLAUME\n(Exported :20/09/2022 18 - :46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393830312d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221103T071500Z +DTEND:20221103T171500Z +SUMMARY:CONGES AUTOMNE +LOCATION: +DESCRIPTION:\n\nPeiP1 S1\nPeiP2 S3\nPeiP1 S2\nPeiP2 S4\n(Exported :21/09/ + 2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d32303634312d332d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T141500Z -DTEND:20221017T161500Z -SUMMARY:Anglais S1 A7 -LOCATION:STD 6 -DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d35 +DTSTAMP:20220921T133408Z +DTSTART:20221117T073000Z +DTEND:20221117T103000Z +SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths +LOCATION:Polytech +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy + sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :21/09/2022 15 + :34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d38 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221114T151500Z -DTEND:20221114T171500Z -SUMMARY:Anglais S1 A6 -LOCATION:STD 5 -DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d3130 +DTSTAMP:20220921T133408Z +DTSTART:20221124T073000Z +DTEND:20221124T103000Z +SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths +LOCATION:Polytech +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy + sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :21/09/2022 15 + :34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d35 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220926T120000Z -DTEND:20220926T140000Z -SUMMARY:Anglais S1 A1 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221118T091500Z +DTEND:20221118T104500Z +SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI + -PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31362d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221108T073000Z -DTEND:20221108T090000Z +DTSTAMP:20220921T133408Z +DTSTART:20221206T073000Z +DTEND:20221206T090000Z SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3135 + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221005T060000Z -DTEND:20221005T080000Z -SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d34 +DTSTAMP:20220921T133408Z +DTSTART:20221017T083000Z +DTEND:20221017T103000Z +SUMMARY:DAE Sc_Ingé G1 +LOCATION:DAE-214 Info +DESCRIPTION:\n\nHACINI CHEMS EDDINE\nR1 PeiP1 S1\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3237352d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221005T131500Z -DTEND:20221005T161500Z -SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths -LOCATION:GR L 0080 - Info -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333239352d372d30 +DTSTAMP:20220921T133408Z +DTSTART:20221011T131500Z +DTEND:20221011T161500Z +SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths +LOCATION:GR L 0090 - Info +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy + sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :21/09/2022 15:34)\n + +UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220926T061500Z -DTEND:20220926T081500Z -SUMMARY:DAE Sc_Ingé G3 -LOCATION:DAE-113 -DESCRIPTION:\n\nR3 PeiP1 S1\nBREVET NATHALIE\n(Exported :20/09/2022 18:46 +DTSTAMP:20220921T133408Z +DTSTART:20221024T141500Z +DTEND:20221024T161500Z +SUMMARY:DAE Sc_Ingé G2 +LOCATION:DAE-214 Info +DESCRIPTION:\n\nBREVET NATHALIE\nR2 PeiP1 S1\n(Exported :21/09/2022 15:34 )\n -UID:ADE60506c616e6e696e67323032322d323032332d31393535342d302d30 +UID:ADE60506c616e6e696e67323032322d323032332d31393533382d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221114T130000Z -DTEND:20221114T150000Z -SUMMARY:Anglais S1 A2 -LOCATION:STD 5 -DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d38 +DTSTAMP:20220921T133408Z +DTSTART:20221010T120000Z +DTEND:20221010T140000Z +SUMMARY:Anglais S1 A4 +LOCATION:STD 3 +DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d34 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T130000Z -DTEND:20221107T150000Z -SUMMARY:DAE Sc_Ingé G5 -LOCATION:DAE-214 Info -DESCRIPTION:\n\nBREVET NATHALIE\nR5 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d31393537342d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221017T120000Z +DTEND:20221017T140000Z +SUMMARY:Anglais S1 A4 +LOCATION:STD 3 +DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d35 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T083000Z -DTEND:20221017T103000Z -SUMMARY:DEE Sc_Ingé G4 -LOCATION:S Elec 1\,S Elec 2 -DESCRIPTION:\n\nBUSSEUIL REMI\nR4 PeiP1 S1\nMAKRIS PASCAL\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393633392d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221121T130000Z +DTEND:20221121T150000Z +SUMMARY:Anglais S1 A3 +LOCATION:STD 6 +DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d39 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T093000Z -DTEND:20221107T113000Z -SUMMARY:DAE Sc_Ingé G1 -LOCATION:DAE-214 Info -DESCRIPTION:\n\nBREVET NATHALIE\nR1 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3237352d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20220927T063000Z +DTEND:20220927T080000Z +SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d38 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221110T123000Z -DTEND:20221110T140000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +DTSTAMP:20220921T133408Z +DTSTART:20221109T070000Z +DTEND:20221109T090000Z +SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3136 + r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d37 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T151500Z -DTEND:20221107T171500Z +DTSTAMP:20220921T133408Z +DTSTART:20221114T151500Z +DTEND:20221114T171500Z SUMMARY:Anglais S1 A7 LOCATION:STD 6 -DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d37 +DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d3131 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221121T071500Z -DTEND:20221121T091500Z -SUMMARY:DI Sc_Ingé G3 -LOCATION:224 (TP Systèmes) -DESCRIPTION:\n\nGAUCHER PIERRE\nR3 PeiP1 S1\nMONMARCHE NICOLAS\n(Exported - :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393734312d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221024T083000Z +DTEND:20221024T103000Z +SUMMARY:DMS Sc_Ingé G5 +LOCATION:S Info A +DESCRIPTION:\n\nR5 PeiP1 S1\nMOFID WAFAA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393931342d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221114T130000Z -DTEND:20221114T150000Z -SUMMARY:Anglais S1 A3 -LOCATION:STD 6 -DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d38 +DTSTAMP:20220921T133408Z +DTSTART:20221110T160000Z +DTEND:20221110T173000Z +SUMMARY:Tutorat Calculus et Raisonnment - PEIP +LOCATION:GR E1 1050 +DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 + Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d33393339322d332d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221012T081500Z -DTEND:20221012T094500Z -SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) -LOCATION:GR E1 2080 -DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d332d30 +DTSTAMP:20220921T133408Z +DTSTART:20221024T083000Z +DTEND:20221024T103000Z +SUMMARY:DI Sc_Ingé G1 +LOCATION:224 (TP Systèmes) +DESCRIPTION:\n\nR1 PeiP1 S1\nMONMARCHE NICOLAS\nGAUCHER PIERRE\n(Exported + :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393634382d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221003T120000Z -DTEND:20221003T140000Z -SUMMARY:Anglais S1 A2 -LOCATION:STD 5 -DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20220926T061500Z +DTEND:20220926T081500Z +SUMMARY:DAE Sc_Ingé G3 +LOCATION:DAE-113 +DESCRIPTION:\n\nR3 PeiP1 S1\nBREVET NATHALIE\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d31393535342d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221027T063000Z -DTEND:20221027T093000Z -SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths -LOCATION:Polytech -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy - sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :20/09/2022 18 - :46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d39 +DTSTAMP:20220921T133408Z +DTSTART:20221017T111500Z +DTEND:20221017T120000Z +SUMMARY:Réunion d'information Projets S2 +LOCATION:Amphi Dassault +DESCRIPTION:\n\nR1 PeiP1 S1\nA2 PeiP1 S1\nR2 PeiP1 S1\nA3 PeiP1 S1\nR3 Pe + iP1 S1\nR5 PeiP1 S1\nA4 PeiP1 S1\nA7 PeiP1 S1\nR4 PeiP1 S1\nA5 PeiP1 S1\ + nA6 PeiP1 S1\nA1 PeiP1 S1\nBOCQUILLON RONAN\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d33343334322d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221124T160000Z -DTEND:20221124T173000Z -SUMMARY:Tutorat Calculus et Raisonnment - PEIP -LOCATION:GR E1 1050 -DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 - Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d33393339322d322d30 +DTSTAMP:20220921T133408Z +DTSTART:20221017T120000Z +DTEND:20221017T140000Z +SUMMARY:Anglais S1 A2 +LOCATION:STD 5 +DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d35 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T141500Z -DTEND:20221017T161500Z -SUMMARY:Anglais S1 A5 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d35 +DTSTAMP:20220921T133408Z +DTSTART:20221128T130000Z +DTEND:20221128T150000Z +SUMMARY:DAE Sc_Ingé G5 +LOCATION:DAE-214 Info +DESCRIPTION:\n\nHACINI CHEMS EDDINE\nR5 PeiP1 S1\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393537342d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221121T093000Z -DTEND:20221121T113000Z -SUMMARY:DAE Sc_Ingé G2 -LOCATION:DAE-214 Info -DESCRIPTION:\n\nHACINI CHEMS EDDINE\nR2 PeiP1 S1\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393533382d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221121T071500Z +DTEND:20221121T091500Z +SUMMARY:DEE Sc_Ingé G1 +LOCATION:S Elec 1\,S Elec 2 +DESCRIPTION:\n\nR1 PeiP1 S1\nMAKRIS PASCAL\nBUSSEUIL REMI\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393539332d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221007T081500Z -DTEND:20221007T094500Z -SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI - -PEIP Maths) +DTSTAMP:20220921T133408Z +DTSTART:20221122T073000Z +DTEND:20221122T090000Z +SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d392d30 + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3139 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221117T123000Z -DTEND:20221117T140000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +DTSTAMP:20220921T133408Z +DTSTART:20220922T131500Z +DTEND:20220922T144500Z +SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3138 +DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d352d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221121T071500Z -DTEND:20221121T091500Z -SUMMARY:DEE Sc_Ingé G1 -LOCATION:S Elec 1\,S Elec 2 -DESCRIPTION:\n\nR1 PeiP1 S1\nMAKRIS PASCAL\nBUSSEUIL REMI\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393539332d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221116T123000Z +DTEND:20221116T140000Z +SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) +LOCATION:GR E1 2040 +DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31372d30 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20220926T061500Z +DTEND:20220926T081500Z +SUMMARY:DMS Sc_Ingé G1 +LOCATION:S Info 4-5 +DESCRIPTION:\n\nR1 PeiP1 S1\nALTMEYER GUILLAUME\n(Exported :21/09/2022 15 + :34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393830312d302d32 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221107T071500Z +DTEND:20221107T091500Z +SUMMARY:DAE Sc_Ingé G3 +LOCATION:DAE-214 Info +DESCRIPTION:\n\nR3 PeiP1 S1\nBREVET NATHALIE\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d31393535342d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z +DTSTAMP:20220921T133408Z DTSTART:20221201T141500Z DTEND:20221201T161500Z SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) LOCATION:GR E1 2040 DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n UID:ADE60506c616e6e696e67323032322d323032332d31333436382d32302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220920T113000Z -DTEND:20220920T130000Z -SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI - -PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d342d30 +DTSTAMP:20220921T133408Z +DTSTART:20221110T073000Z +DTEND:20221110T103000Z +SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths +LOCATION:Polytech +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy + sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :21/09/2022 15 + :34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221208T161500Z -DTEND:20221208T174500Z -SUMMARY:Tutorat Calculus et Raisonnment - PEIP -LOCATION:GR E1 1050 -DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 - Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d33393339322d312d30 +DTSTAMP:20220921T133408Z +DTSTART:20221117T123000Z +DTEND:20221117T140000Z +SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3138 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220928T081500Z -DTEND:20220928T094500Z +DTSTAMP:20220921T133408Z +DTSTART:20221129T073000Z +DTEND:20221129T090000Z SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) -LOCATION:GR L 1120 +LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3130 + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3231 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220926T061500Z -DTEND:20220926T081500Z -SUMMARY:DI Sc_Ingé G4 -LOCATION:230 (Unix A) -DESCRIPTION:\n\nR4 PeiP1 S1\nMONMARCHE NICOLAS\n(Exported :20/09/2022 18: - 46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393735302d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221024T061500Z +DTEND:20221024T081500Z +SUMMARY:DI Sc_Ingé G3 +LOCATION:224 (TP Systèmes) +DESCRIPTION:\n\nGAUCHER PIERRE\nR3 PeiP1 S1\nMONMARCHE NICOLAS\n(Exported + :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393734312d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T120000Z -DTEND:20221024T140000Z -SUMMARY:Anglais S1 A2 -LOCATION:STD 5 -DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d36 +DTSTAMP:20220921T133408Z +DTSTART:20221109T123000Z +DTEND:20221109T140000Z +SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) +LOCATION:GR E1 2040 +DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31352d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221114T071500Z -DTEND:20221114T091500Z -SUMMARY:Séance Libre Sc_Ingé -LOCATION:Amphi Dassault\,S Elec 2\,DAE-213 Info\,DAE-214 Info\,S Elec 1\, - S Info 4-5 -DESCRIPTION:\n\nGAUCHER PIERRE\nR1 PeiP1 S1\nR2 PeiP1 S1\nR3 PeiP1 S1\nR4 - PeiP1 S1\nR5 PeiP1 S1\nMONMARCHE NICOLAS\nMAKRIS PASCAL\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393931352d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20220928T133000Z +DTEND:20220928T163000Z +SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths +LOCATION:GR L 0040 - Info +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333239352d332d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T061500Z -DTEND:20221017T081500Z -SUMMARY:DEE Sc_Ingé G2 -LOCATION:S Elec 2\,S Elec 1 -DESCRIPTION:\n\nBUSSEUIL REMI\nR2 PeiP1 S1\nMAKRIS PASCAL\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393632382d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221205T093000Z +DTEND:20221205T113000Z +SUMMARY:Sciences de l'ingénieur S1 Evaluation +LOCATION:Amphi Dassault\,S BEAO\,S Info 4-5\,S Info A\,PAF +DESCRIPTION:\n\nMAKRIS PASCAL\nBUSSEUIL REMI\nGAUCHER PIERRE\nCHALON FLOR + ENT\nMOFID WAFAA\nMONMARCHE NICOLAS\nBREVET NATHALIE\nR5 PeiP1 S1\nR4 Pe + iP1 S1\nR3 PeiP1 S1\nR2 PeiP1 S1\nR1 PeiP1 S1\n(Exported :21/09/2022 15: + 34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3237372d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221003T120000Z -DTEND:20221003T140000Z -SUMMARY:Anglais S1 A1 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221121T071500Z +DTEND:20221121T091500Z +SUMMARY:DMS Sc_Ingé G5 +LOCATION:S Info A +DESCRIPTION:\n\nR5 PeiP1 S1\nMOFID WAFAA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393931342d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221117T160000Z -DTEND:20221117T173000Z -SUMMARY:Tutorat Calculus et Raisonnment - PEIP -LOCATION:GR E1 1050 -DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 - Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d33393339322d342d30 +DTSTAMP:20220921T133408Z +DTSTART:20220927T131500Z +DTEND:20220927T161500Z +SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths +LOCATION:GR L 0090 - Info +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy + sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :21/09/2022 15:34)\n + +UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d3130 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T151500Z -DTEND:20221107T171500Z -SUMMARY:Anglais S1 A5 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d37 +DTSTAMP:20220921T133408Z +DTSTART:20220928T060000Z +DTEND:20220928T080000Z +SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221114T151500Z -DTEND:20221114T171500Z -SUMMARY:Anglais S1 A5 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :20/09/2022 18:46 +DTSTAMP:20220921T133408Z +DTSTART:20221130T091500Z +DTEND:20221130T111500Z +SUMMARY:EP1 Mécanique du point TP Gr9A PEIP (Parcours MPI-PEIP Maths) +LOCATION:GR E 0290 (salle TP Physique) +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy + sique Gr9A PEIP - (MPI)\nNICOLIS STAMATIOS\n(Exported :21/09/2022 15:34 )\n -UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d38 +UID:ADE60506c616e6e696e67323032322d323032332d31343539332d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T151500Z -DTEND:20221128T171500Z -SUMMARY:Anglais S1 A5 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d3130 +DTSTAMP:20220921T133408Z +DTSTART:20221017T083000Z +DTEND:20221017T103000Z +SUMMARY:DMS Sc_Ingé G3 +LOCATION:S Info 4-5 +DESCRIPTION:\n\nMOFID WAFAA\nR3 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393838312d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T061500Z -DTEND:20221010T081500Z -SUMMARY:DI Sc_Ingé G3 -LOCATION:224 (TP Systèmes) -DESCRIPTION:\n\nGAUCHER PIERRE\nR3 PeiP1 S1\nMONMARCHE NICOLAS\n(Exported - :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393734312d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221027T150000Z +DTEND:20221027T163000Z +SUMMARY:Tutorat Calculus et Raisonnment - PEIP +LOCATION:GR E1 1050 +DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 + Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d33393339322d372d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220926T083000Z -DTEND:20220926T103000Z -SUMMARY:DI Sc_Ingé G2 -LOCATION:224 (TP Systèmes) -DESCRIPTION:\n\nMONMARCHE NICOLAS\nR2 PeiP1 S1\nGAUCHER PIERRE\n(Exported - :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393638312d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221121T130000Z +DTEND:20221121T150000Z +SUMMARY:Anglais S1 A1 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d39 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T071500Z -DTEND:20221128T091500Z -SUMMARY:DI Sc_Ingé G5 -LOCATION:224 (TP Systèmes) -DESCRIPTION:\n\nGAUCHER PIERRE\nR5 PeiP1 S1\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d31393736302d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221010T120000Z +DTEND:20221010T140000Z +SUMMARY:DMS Sc_Ingé G4 +LOCATION:S Info A +DESCRIPTION:\n\nR4 PeiP1 S1\nMOFID WAFAA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393930342d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221019T134500Z -DTEND:20221019T164500Z -SUMMARY:EP1 : Mécanique du point / EP2 : Electrostatique et électrocinéti - que MPI + PCST - CC -LOCATION:GR F Amphi Physique\,GR F Amphi Biologie\,GR F Amphi 22\,GR F Am - phi 21\,GR E1 Amphi 040\,GR E1 Amphi 030 -DESCRIPTION:\n\nL1 Maths - LAS1 TPB\nL1 Maths - Groupe 6 - MPI\nL1 Maths - - Groupe 4 - MPI\nL1 Maths - Groupe 5 - MPI\nL1 - Maths / Physique Gr8 P - EIP - (MPI)\nL1 - Maths / Physique Gr7 PEIP - (MPI)\nL1 Physique - Group - e 6 - MPI\nL1 Physique - Groupe 4 - MPI\nL1 Physique - Groupe 5 - MPI\nL - 1 Physique /Maths PEIP Gr10 PEIP\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - - Maths / Physique Gr11 PEIP - (MPI)\nL1 Chimie - Groupe 17 - CST\nL1 Phy - sique - Groupe 15 - PCST\nL1 Physique - Groupe 16 - PCST - LAS1\nL1 Phys - ique - Groupe 17 - C\nL1 Physique /Maths PEIP Gr11 PEIP\nL1 Info / Physi - que- Groupe 2\nL1 Info - Groupe 3 OUI/SI\nL1 ST - Groupe 16 - LAS Chimie - \nL1 ST - Groupe 17 - C\nL1 Chimie - Groupe 15 - CST\nL1 Chimie - Groupe - 12 - CST\nL1 Chimie - Groupe 13 - PC\nL1 Chimie - Groupe 14 - CST\nL1 P - hysique - Groupe 14 - PCST\nL1 Physique - Groupe 12 - PCST\nL1 Physique - - Groupe 13 - PCST\nL1 ST - Groupe 15 - CST\nL1 ST - Groupe 12 - CST\nL1 - ST - Groupe 13 - PC\nL1 ST - Groupe 14 - CST\nL1 Chimie - Groupe 16 - L - .AS1 Chimie\nL1 - Maths / Physique Gr10 PEIP - (MPI)\nL1 - Maths / Physi - que Gr9 PEIP - (MPI)\nL1 Physique /Maths PEIP Gr7 PEIP\nL1 Physique /Mat - hs PEIP Gr8 PEIP\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31353935372d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20220926T083000Z +DTEND:20220926T103000Z +SUMMARY:DAE Sc_Ingé G1 +LOCATION:DAE-113 +DESCRIPTION:\n\nBREVET NATHALIE\nR1 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d3237352d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221121T130000Z -DTEND:20221121T150000Z -SUMMARY:DEE Sc_Ingé G5 -LOCATION:S Elec 2\,S Elec 1 -DESCRIPTION:\n\nBUSSEUIL REMI\nMAKRIS PASCAL\nR5 PeiP1 S1\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393634302d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221003T141500Z +DTEND:20221003T161500Z +SUMMARY:Anglais S1 A6 +LOCATION:STD 5 +DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z +DTSTAMP:20220921T133408Z DTSTART:20221004T131500Z DTEND:20221004T161500Z SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths LOCATION:GR L 0090 - Info DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy - sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :20/09/2022 18:46)\n + sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :21/09/2022 15:34)\n UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T083000Z -DTEND:20221024T103000Z -SUMMARY:DMS Sc_Ingé G5 -LOCATION:S Info A -DESCRIPTION:\n\nR5 PeiP1 S1\nMOFID WAFAA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393931342d302d31 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221107T071500Z +DTEND:20221107T091500Z +SUMMARY:DI Sc_Ingé G4 +LOCATION:230 (Unix A) +DESCRIPTION:\n\nR4 PeiP1 S1\nMONMARCHE NICOLAS\n(Exported :21/09/2022 15: + 34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393735302d302d31 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220928T060000Z -DTEND:20220928T080000Z -SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221121T093000Z +DTEND:20221121T113000Z +SUMMARY:DMS Sc_Ingé G4 +LOCATION:S Info A +DESCRIPTION:\n\nR4 PeiP1 S1\nMOFID WAFAA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393930342d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221116T143000Z -DTEND:20221116T173000Z -SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths -LOCATION:GR E1 1010 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333239352d322d30 +DTSTAMP:20220921T133408Z +DTSTART:20221107T130000Z +DTEND:20221107T150000Z +SUMMARY:Anglais S1 A2 +LOCATION:STD 5 +DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d37 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221017T061500Z +DTEND:20221017T081500Z +SUMMARY:DI Sc_Ingé G5 +LOCATION:224 (TP Systèmes) +DESCRIPTION:\n\nGAUCHER PIERRE\nR5 PeiP1 S1\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d31393736302d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z +DTSTAMP:20220921T133408Z DTSTART:20221124T141500Z DTEND:20221124T154500Z SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) LOCATION:GR E1 2040 DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31312d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221116T070000Z -DTEND:20221116T090000Z -SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d38 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220929T063000Z -DTEND:20220929T093000Z -SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths -LOCATION:Polytech -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy - sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :20/09/2022 18 - :46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221107T130000Z +DTEND:20221107T150000Z +SUMMARY:Anglais S1 A1 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d37 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221130T091500Z -DTEND:20221130T111500Z -SUMMARY:EP1 Mécanique du point TP Gr9A PEIP (Parcours MPI-PEIP Maths) -LOCATION:GR E 0290 (salle TP Physique) -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy - sique Gr9A PEIP - (MPI)\nNICOLIS STAMATIOS\n(Exported :20/09/2022 18:46 +DTSTAMP:20220921T133408Z +DTSTART:20221003T120000Z +DTEND:20221003T140000Z +SUMMARY:Anglais S1 A1 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :21/09/2022 15:34 )\n -UID:ADE60506c616e6e696e67323032322d323032332d31343539332d302d31 +UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221003T083000Z -DTEND:20221003T103000Z -SUMMARY:Séance Libre Sc_Ingé -LOCATION:Amphi Dassault\,S Elec 2\,S Info A\,224 (TP Systèmes)\,DAE-213 I - nfo\,S Elec 1 -DESCRIPTION:\n\nGAUCHER PIERRE\nR1 PeiP1 S1\nR2 PeiP1 S1\nR3 PeiP1 S1\nR4 - PeiP1 S1\nR5 PeiP1 S1\nMONMARCHE NICOLAS\nMAKRIS PASCAL\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393931352d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221128T093000Z +DTEND:20221128T113000Z +SUMMARY:DEE Sc_Ingé G4 +LOCATION:S Elec 1\,S Elec 2 +DESCRIPTION:\n\nBUSSEUIL REMI\nR4 PeiP1 S1\nMAKRIS PASCAL\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393633392d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T061500Z -DTEND:20221010T081500Z -SUMMARY:DMS Sc_Ingé G2 -LOCATION:S Info A -DESCRIPTION:\n\nR2 PeiP1 S1\nMOFID WAFAA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393831362d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221026T131500Z +DTEND:20221026T161500Z +SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths +LOCATION:GR Pharma Info. A 1010 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333239352d392d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221124T070000Z -DTEND:20221124T090000Z -SUMMARY:EP1 Mécanique du point TP Gr9B PEIP (Parcours MPI-PEIP Maths) -LOCATION:GR E 0290 (salle TP Physique) +DTSTAMP:20220921T133408Z +DTSTART:20221108T141500Z +DTEND:20221108T171500Z +SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths +LOCATION:GR L 1150 - Info DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy - sique Gr9B PEIP - (MPI)\nBELLIARD SAMUEL\n(Exported :20/09/2022 18:46)\ - n -UID:ADE60506c616e6e696e67323032322d323032332d31343539362d302d30 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T071500Z -DTEND:20221128T091500Z -SUMMARY:DEE Sc_Ingé G2 -LOCATION:S Elec 2\,S Elec 1 -DESCRIPTION:\n\nBUSSEUIL REMI\nR2 PeiP1 S1\nMAKRIS PASCAL\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393632382d302d30 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T071500Z -DTEND:20221107T091500Z -SUMMARY:DI Sc_Ingé G5 -LOCATION:224 (TP Systèmes) -DESCRIPTION:\n\nGAUCHER PIERRE\nR5 PeiP1 S1\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d31393736302d302d33 + sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :21/09/2022 15:34)\n + +UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d39 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221027T150000Z -DTEND:20221027T163000Z -SUMMARY:Tutorat Calculus et Raisonnment - PEIP -LOCATION:GR E1 1050 -DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 - Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d33393339322d372d30 +DTSTAMP:20220921T133408Z +DTSTART:20221124T123000Z +DTEND:20221124T140000Z +SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3230 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221020T081500Z -DTEND:20221020T101500Z -SUMMARY:EP2 Raisonnement CC -LOCATION:GR F 23\,GR F Amphi Physique\,GR F Amphi Biologie\,GR F Amphi 22 - \,GR F Amphi 21 -DESCRIPTION:\n\nL1 Informatique (Parcours MPI)\nL1 Mathématiques (MPI) -1 - er Semestre\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 P - hysique (Parcours MPI) -1er Semestre\nL1 Physique /Maths Parcours PEIP ( - MPI)\nTRAIZET MARTIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31313031392d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221121T151500Z +DTEND:20221121T171500Z +SUMMARY:Anglais S1 A5 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d39 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z +DTSTAMP:20220921T133408Z DTSTART:20220926T083000Z DTEND:20220926T103000Z -SUMMARY:DEE Sc_Ingé G4 -LOCATION:S Elec 1\,S Elec 2 -DESCRIPTION:\n\nBUSSEUIL REMI\nR4 PeiP1 S1\nMAKRIS PASCAL\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393633392d302d30 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221121T151500Z -DTEND:20221121T171500Z -SUMMARY:DMS Sc_Ingé G2 -LOCATION:S Info A -DESCRIPTION:\n\nR2 PeiP1 S1\nMOFID WAFAA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393831362d302d33 +SUMMARY:DMS Sc_Ingé G3 +LOCATION:S Info 4-5 +DESCRIPTION:\n\nR3 PeiP1 S1\nALTMEYER GUILLAUME\n(Exported :21/09/2022 15 + :34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393838312d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221116T123000Z -DTEND:20221116T140000Z +DTSTAMP:20220921T133408Z +DTSTART:20221006T131500Z +DTEND:20221006T144500Z SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) LOCATION:GR E1 2040 DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31372d30 + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d382d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221109T143000Z -DTEND:20221109T173000Z -SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths -LOCATION:GR L 0020 - Info +DTSTAMP:20220921T133408Z +DTSTART:20221116T070000Z +DTEND:20221116T090000Z +SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333239352d302d30 + r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d38 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T130000Z -DTEND:20221107T150000Z -SUMMARY:Anglais S1 A4 -LOCATION:STD 3 -DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d37 +DTSTAMP:20220921T133408Z +DTSTART:20221024T083000Z +DTEND:20221024T103000Z +SUMMARY:DEE Sc_Ingé G3 +LOCATION:S Elec 1\,S Elec 2 +DESCRIPTION:\n\nBUSSEUIL REMI\nR3 PeiP1 S1\nMAKRIS PASCAL\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393632392d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220930T081500Z -DTEND:20220930T094500Z -SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI - -PEIP Maths) +DTSTAMP:20220921T133408Z +DTSTART:20221005T060000Z +DTEND:20221005T080000Z +SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d372d30 + r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d34 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221003T120000Z -DTEND:20221003T140000Z -SUMMARY:Anglais S1 A4 -LOCATION:STD 3 -DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221024T141500Z +DTEND:20221024T161500Z +SUMMARY:Anglais S1 A6 +LOCATION:STD 5 +DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d37 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T083000Z -DTEND:20221024T103000Z -SUMMARY:DAE Sc_Ingé G4 -LOCATION:DAE-214 Info -DESCRIPTION:\n\nBREVET NATHALIE\nR4 PeiP1 S1\n(Exported :20/09/2022 18:46 +DTSTAMP:20220921T133408Z +DTSTART:20221010T141500Z +DTEND:20221010T161500Z +SUMMARY:Anglais S1 A5 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :21/09/2022 15:34 )\n -UID:ADE60506c616e6e696e67323032322d323032332d31393536302d312d30 +UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221121T093000Z -DTEND:20221121T113000Z -SUMMARY:DI Sc_Ingé G1 -LOCATION:224 (TP Systèmes) -DESCRIPTION:\n\nR1 PeiP1 S1\nMONMARCHE NICOLAS\nGAUCHER PIERRE\n(Exported - :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393634382d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221104T071500Z +DTEND:20221104T171500Z +SUMMARY:CONGES AUTOMNE +LOCATION: +DESCRIPTION:\n\nPeiP1 S1\nPeiP2 S3\nPeiP1 S2\nPeiP2 S4\n(Exported :21/09/ + 2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d32303634312d342d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T061500Z -DTEND:20221010T081500Z -SUMMARY:DEE Sc_Ingé G1 -LOCATION:S Elec 1\,S Elec 2 -DESCRIPTION:\n\nR1 PeiP1 S1\nMAKRIS PASCAL\nBUSSEUIL REMI\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393539332d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221128T071500Z +DTEND:20221128T091500Z +SUMMARY:DAE Sc_Ingé G3 +LOCATION:DAE-214 Info +DESCRIPTION:\n\nR3 PeiP1 S1\nHACINI CHEMS EDDINE\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393535342d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T083000Z -DTEND:20221010T103000Z -SUMMARY:DI Sc_Ingé G1 -LOCATION:224 (TP Systèmes) -DESCRIPTION:\n\nR1 PeiP1 S1\nMONMARCHE NICOLAS\nGAUCHER PIERRE\n(Exported - :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393634382d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221111T071500Z +DTEND:20221111T171500Z +SUMMARY:FERIE +LOCATION: +DESCRIPTION:\n\nPeiP1 S2\nPeiP2 S4\nPeiP1 S1\nPeiP2 S3\n(Exported :21/09/ + 2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d32303636372d362d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T120000Z -DTEND:20221010T140000Z -SUMMARY:DMS Sc_Ingé G4 -LOCATION:S Info A -DESCRIPTION:\n\nR4 PeiP1 S1\nMOFID WAFAA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393930342d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221107T151500Z +DTEND:20221107T171500Z +SUMMARY:Anglais S1 A7 +LOCATION:STD 6 +DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d37 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221109T123000Z -DTEND:20221109T140000Z -SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) -LOCATION:GR E1 2040 -DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31352d30 +DTSTAMP:20220921T133408Z +DTSTART:20221128T130000Z +DTEND:20221128T150000Z +SUMMARY:Anglais S1 A1 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d3130 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220920T081500Z -DTEND:20220920T094500Z +DTSTAMP:20220921T133408Z +DTSTART:20220927T081500Z +DTEND:20220927T094500Z SUMMARY:EP1 Calculus CM - (PEIP + LAS1) LOCATION:GR F Amphi 21 DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 Physique /Maths Parcours PEIP (MPI)\nL1 Maths - LAS1-18\nSANDIER NATALI - YA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d333731372d322d30 + YA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d333731372d332d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T141500Z -DTEND:20221024T161500Z -SUMMARY:Anglais S1 A6 +DTSTAMP:20220921T133408Z +DTSTART:20221107T071500Z +DTEND:20221107T091500Z +SUMMARY:DEE Sc_Ingé G2 +LOCATION:S Elec 2\,S Elec 1 +DESCRIPTION:\n\nBUSSEUIL REMI\nR2 PeiP1 S1\nMAKRIS PASCAL\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393632382d302d31 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221010T120000Z +DTEND:20221010T140000Z +SUMMARY:Anglais S1 A2 LOCATION:STD 5 -DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) +DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) \n -UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d37 +UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d34 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221005T081500Z -DTEND:20221005T101500Z -SUMMARY:EP2 Electrostatique et électrocinétique TP Gr9A PEIP (Parcours MP - I-PEIP Maths ) -LOCATION:GR E 0290 (salle TP Physique) +DTSTAMP:20220921T133408Z +DTSTART:20221006T063000Z +DTEND:20221006T093000Z +SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths +LOCATION:Polytech DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy - sique Gr9A PEIP - (MPI)\nGRAU MATHIEU\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630382d302d31 + sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :21/09/2022 15 + :34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d3131 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T141500Z -DTEND:20221024T161500Z -SUMMARY:Anglais S1 A7 -LOCATION:STD 6 -DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d36 +DTSTAMP:20220921T133408Z +DTSTART:20221109T143000Z +DTEND:20221109T173000Z +SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths +LOCATION:GR L 0020 - Info +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333239352d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221011T131500Z -DTEND:20221011T161500Z -SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths -LOCATION:GR L 0090 - Info -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy - sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :20/09/2022 18:46)\n - -UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221123T123000Z +DTEND:20221123T140000Z +SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) +LOCATION:GR E1 2040 +DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31392d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221201T123000Z -DTEND:20221201T140000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +DTSTAMP:20220921T133408Z +DTSTART:20221115T123000Z +DTEND:20221115T140000Z +SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI + -PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3232 + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31352d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T120000Z -DTEND:20221024T140000Z -SUMMARY:DEE Sc_Ingé G5 +DTSTAMP:20220921T133408Z +DTSTART:20221017T061500Z +DTEND:20221017T081500Z +SUMMARY:DAE Sc_Ingé G3 +LOCATION:DAE-214 Info +DESCRIPTION:\n\nR3 PeiP1 S1\nHACINI CHEMS EDDINE\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393535342d302d31 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221017T061500Z +DTEND:20221017T081500Z +SUMMARY:DEE Sc_Ingé G2 LOCATION:S Elec 2\,S Elec 1 -DESCRIPTION:\n\nBUSSEUIL REMI\nMAKRIS PASCAL\nR5 PeiP1 S1\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393634302d302d31 +DESCRIPTION:\n\nBUSSEUIL REMI\nR2 PeiP1 S1\nMAKRIS PASCAL\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393632382d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T083000Z -DTEND:20221024T103000Z -SUMMARY:DI Sc_Ingé G1 -LOCATION:224 (TP Systèmes) -DESCRIPTION:\n\nR1 PeiP1 S1\nMONMARCHE NICOLAS\nGAUCHER PIERRE\n(Exported - :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393634382d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221010T083000Z +DTEND:20221010T103000Z +SUMMARY:DMS Sc_Ingé G5 +LOCATION:S Info A +DESCRIPTION:\n\nR5 PeiP1 S1\nMOFID WAFAA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393931342d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T141500Z -DTEND:20221024T161500Z -SUMMARY:Anglais S1 A5 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d36 +DTSTAMP:20220921T133408Z +DTSTART:20221208T070000Z +DTEND:20221208T090000Z +SUMMARY:EP1 Mécanique du point TP Gr9B PEIP (Parcours MPI-PEIP Maths) +LOCATION:GR E 0290 (salle TP Physique) +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy + sique Gr9B PEIP - (MPI)\nBELLIARD SAMUEL\n(Exported :21/09/2022 15:34)\ + n +UID:ADE60506c616e6e696e67323032322d323032332d31343539362d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221202T091500Z -DTEND:20221202T111500Z -SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI - -PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d32302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221010T061500Z +DTEND:20221010T081500Z +SUMMARY:DI Sc_Ingé G3 +LOCATION:224 (TP Systèmes) +DESCRIPTION:\n\nGAUCHER PIERRE\nR3 PeiP1 S1\nMONMARCHE NICOLAS\n(Exported + :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393734312d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221110T073000Z -DTEND:20221110T103000Z +DTSTAMP:20220921T133408Z +DTSTART:20221201T073000Z +DTEND:20221201T103000Z SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths LOCATION:Polytech DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy - sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :20/09/2022 18 - :46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d33 + sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :21/09/2022 15 + :34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d37 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T061500Z -DTEND:20221017T081500Z -SUMMARY:DMS Sc_Ingé G1 -LOCATION:S Info 4-5 -DESCRIPTION:\n\nR1 PeiP1 S1\nMOFID WAFAA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393830312d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221024T141500Z +DTEND:20221024T161500Z +SUMMARY:Anglais S1 A7 +LOCATION:STD 6 +DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d36 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221013T063000Z -DTEND:20221013T093000Z -SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths -LOCATION:Polytech -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy - sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :20/09/2022 18 - :46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d3130 +DTSTAMP:20220921T133408Z +DTSTART:20221207T143000Z +DTEND:20221207T173000Z +SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths +LOCATION:GR L 0090 - Info +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333239352d342d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T120000Z -DTEND:20221010T140000Z -SUMMARY:Anglais S1 A1 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d34 +DTSTAMP:20220921T133408Z +DTSTART:20221024T120000Z +DTEND:20221024T140000Z +SUMMARY:Anglais S1 A3 +LOCATION:STD 6 +DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d36 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T071500Z -DTEND:20221128T091500Z -SUMMARY:DI Sc_Ingé G4 -LOCATION:230 (Unix A) -DESCRIPTION:\n\nR4 PeiP1 S1\nMONMARCHE NICOLAS\n(Exported :20/09/2022 18: - 46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393735302d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221024T141500Z +DTEND:20221024T161500Z +SUMMARY:Anglais S1 A5 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d36 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221208T123000Z -DTEND:20221208T140000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221114T130000Z +DTEND:20221114T150000Z +SUMMARY:Anglais S1 A1 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d38 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221205T071500Z -DTEND:20221205T091500Z -SUMMARY:Sciences de l'ingénieur S1 Evaluation -LOCATION:Amphi Dassault\,S BEAO\,S Info 4-5\,S Info A\,PAF -DESCRIPTION:\n\nMAKRIS PASCAL\nBUSSEUIL REMI\nGAUCHER PIERRE\nCHALON FLOR - ENT\nMOFID WAFAA\nMONMARCHE NICOLAS\nBREVET NATHALIE\nR5 PeiP1 S1\nR4 Pe - iP1 S1\nR3 PeiP1 S1\nR2 PeiP1 S1\nR1 PeiP1 S1\n(Exported :20/09/2022 18: - 46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3237372d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221107T151500Z +DTEND:20221107T171500Z +SUMMARY:Anglais S1 A6 +LOCATION:STD 5 +DESCRIPTION:\n\nALQUIER LI-WEN\nA6 PeiP1 S1\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T120000Z -DTEND:20221024T140000Z -SUMMARY:Anglais S1 A3 -LOCATION:STD 6 -DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d36 +DTSTAMP:20220921T133408Z +DTSTART:20221010T141500Z +DTEND:20221010T161500Z +SUMMARY:Anglais S1 A6 +LOCATION:STD 5 +DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z +DTSTAMP:20220921T133408Z DTSTART:20220923T081500Z DTEND:20220923T094500Z SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI -PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n UID:ADE60506c616e6e696e67323032322d323032332d31343630302d352d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220921T081500Z -DTEND:20220921T101500Z -SUMMARY:EP2 Electrostatique et électrocinétique TP Gr9A PEIP (Parcours MP - I-PEIP Maths ) -LOCATION:GR E 0290 (salle TP Physique) -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy - sique Gr9A PEIP - (MPI)\nGRAU MATHIEU\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630382d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221207T070000Z +DTEND:20221207T090000Z +SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d3131 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T120000Z -DTEND:20221010T140000Z -SUMMARY:Anglais S1 A4 -LOCATION:STD 3 -DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d34 +DTSTAMP:20220921T133408Z +DTSTART:20221031T071500Z +DTEND:20221031T171500Z +SUMMARY:CONGES AUTOMNE +LOCATION: +DESCRIPTION:\n\nPeiP1 S1\nPeiP2 S3\nPeiP1 S2\nPeiP2 S4\n(Exported :21/09/ + 2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d32303634312d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221005T113000Z -DTEND:20221005T130000Z -SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) -LOCATION:GR E1 2040 -DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d372d30 +DTSTAMP:20220921T133408Z +DTSTART:20221122T143000Z +DTEND:20221122T173000Z +SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths +LOCATION:GR L 0040 - Info +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy + sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :21/09/2022 15:34)\n + +UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d38 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221205T130000Z -DTEND:20221205T170000Z -SUMMARY:Peip1-Anglais Contrôle de fin de semestre -LOCATION:Amphi Dassault\,SC 2 -DESCRIPTION:\n\nA5 PeiP1 S1\nA6 PeiP1 S1\nA2 PeiP1 S1\nA3 PeiP1 S1\nA4 Pe - iP1 S1\nA7 PeiP1 S1\nA1 PeiP1 S1\nCLOUET MAUD\nROUSSEAU CELINE\nONAK SCO - TT\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d36383136352d302d30 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220927T063000Z -DTEND:20220927T080000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d38 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221121T093000Z -DTEND:20221121T113000Z -SUMMARY:DEE Sc_Ingé G3 -LOCATION:S Elec 1\,S Elec 2 -DESCRIPTION:\n\nBUSSEUIL REMI\nR3 PeiP1 S1\nMAKRIS PASCAL\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393632392d302d30 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221130T070000Z -DTEND:20221130T090000Z -SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d3130 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221114T093000Z -DTEND:20221114T113000Z -SUMMARY:Séance Libre Sc_Ingé -LOCATION:Amphi Dassault\,S Info A\,224 (TP Systèmes)\,DAE-214 Info\,S Ele - c 1\,S Info 4-5 -DESCRIPTION:\n\nGAUCHER PIERRE\nR1 PeiP1 S1\nR2 PeiP1 S1\nR3 PeiP1 S1\nR4 - PeiP1 S1\nR5 PeiP1 S1\nMONMARCHE NICOLAS\nMAKRIS PASCAL\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393931352d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221101T071500Z +DTEND:20221101T171500Z +SUMMARY:CONGES AUTOMNE +LOCATION: +DESCRIPTION:\n\nPeiP1 S1\nPeiP2 S3\nPeiP1 S2\nPeiP2 S4\n(Exported :21/09/ + 2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d32303634312d312d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T071500Z -DTEND:20221107T091500Z -SUMMARY:DEE Sc_Ingé G2 -LOCATION:S Elec 2\,S Elec 1 -DESCRIPTION:\n\nBUSSEUIL REMI\nR2 PeiP1 S1\nMAKRIS PASCAL\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393632382d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221121T130000Z +DTEND:20221121T150000Z +SUMMARY:Anglais S1 A4 +LOCATION:STD 3 +DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d39 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220921T131500Z -DTEND:20220921T161500Z -SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths -LOCATION:GR L 1140 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333239352d352d30 +DTSTAMP:20220921T133408Z +DTSTART:20221114T151500Z +DTEND:20221114T171500Z +SUMMARY:Anglais S1 A5 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d38 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221121T151500Z -DTEND:20221121T171500Z -SUMMARY:Anglais S1 A7 -LOCATION:STD 6 -DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d38 +DTSTAMP:20220921T133408Z +DTSTART:20221025T081500Z +DTEND:20221025T094500Z +SUMMARY:EP1 Calculus CM - (PEIP + LAS1) +LOCATION:GR F Amphi 21 +DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 + Physique /Maths Parcours PEIP (MPI)\nL1 Maths - LAS1-18\nSANDIER NATALI + YA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d333731372d362d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221122T143000Z -DTEND:20221122T173000Z -SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths -LOCATION:GR L 0040 - Info -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy - sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :20/09/2022 18:46)\n - -UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d38 +DTSTAMP:20220921T133408Z +DTSTART:20221024T120000Z +DTEND:20221024T140000Z +SUMMARY:Anglais S1 A1 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d36 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z +DTSTAMP:20220921T133408Z DTSTART:20221025T131500Z DTEND:20221025T161500Z SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths LOCATION:GR L 1150 - Info DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy - sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :20/09/2022 18:46)\n + sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :21/09/2022 15:34)\n UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T111500Z -DTEND:20221017T120000Z -SUMMARY:Réunion d'information Projets S2 -LOCATION:Amphi Dassault -DESCRIPTION:\n\nR1 PeiP1 S1\nA2 PeiP1 S1\nR2 PeiP1 S1\nA3 PeiP1 S1\nR3 Pe - iP1 S1\nR5 PeiP1 S1\nA4 PeiP1 S1\nA7 PeiP1 S1\nR4 PeiP1 S1\nA5 PeiP1 S1\ - nA6 PeiP1 S1\nA1 PeiP1 S1\nBOCQUILLON RONAN\n(Exported :20/09/2022 18:46 +DTSTAMP:20220921T133408Z +DTSTART:20221128T151500Z +DTEND:20221128T171500Z +SUMMARY:Anglais S1 A5 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :21/09/2022 15:34 )\n -UID:ADE60506c616e6e696e67323032322d323032332d33343334322d302d30 +UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d3130 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221109T070000Z -DTEND:20221109T090000Z +DTSTAMP:20220921T133408Z +DTSTART:20221130T070000Z +DTEND:20221130T090000Z SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d37 + r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d3130 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221201T164500Z -DTEND:20221201T181500Z -SUMMARY:Tutorat Calculus et Raisonnment - PEIP -LOCATION:GR E1 1050 -DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 - Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d33393339322d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221017T061500Z +DTEND:20221017T081500Z +SUMMARY:DI Sc_Ingé G4 +LOCATION:230 (Unix A) +DESCRIPTION:\n\nR4 PeiP1 S1\nMONMARCHE NICOLAS\n(Exported :21/09/2022 15: + 34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393735302d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221129T073000Z -DTEND:20221129T090000Z +DTSTAMP:20220921T133408Z +DTSTART:20221201T123000Z +DTEND:20221201T140000Z SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3231 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T151500Z -DTEND:20221128T171500Z -SUMMARY:Anglais S1 A6 -LOCATION:STD 5 -DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d35 + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3232 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221013T151500Z -DTEND:20221013T164500Z -SUMMARY:Tutorat Calculus et Raisonnment - PEIP -LOCATION:GR E1 1050 -DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 - Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d33393339322d362d30 +DTSTAMP:20220921T133408Z +DTSTART:20221017T141500Z +DTEND:20221017T161500Z +SUMMARY:Anglais S1 A7 +LOCATION:STD 6 +DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d35 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221003T141500Z -DTEND:20221003T161500Z -SUMMARY:Anglais S1 A7 -LOCATION:STD 6 -DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221004T063000Z +DTEND:20221004T080000Z +SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d39 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T120000Z -DTEND:20221010T140000Z -SUMMARY:Anglais S1 A2 -LOCATION:STD 5 -DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d34 +DTSTAMP:20220921T133408Z +DTSTART:20221025T113000Z +DTEND:20221025T130000Z +SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI + -PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31322d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221208T070000Z -DTEND:20221208T090000Z -SUMMARY:EP1 Mécanique du point TP Gr9B PEIP (Parcours MPI-PEIP Maths) -LOCATION:GR E 0290 (salle TP Physique) -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy - sique Gr9B PEIP - (MPI)\nBELLIARD SAMUEL\n(Exported :20/09/2022 18:46)\ - n -UID:ADE60506c616e6e696e67323032322d323032332d31343539362d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221115T091500Z +DTEND:20221115T104500Z +SUMMARY:EP1 Calculus CM - (PEIP + LAS1) +LOCATION:GR F Amphi 21 +DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 + Physique /Maths Parcours PEIP (MPI)\nL1 Maths - LAS1-18\nSANDIER NATALI + YA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d333731372d372d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221209T073000Z -DTEND:20221209T103000Z -SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths -LOCATION:GR L 0020 - Info -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy - sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :20/09/2022 18:46)\n - -UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d3131 +DTSTAMP:20220921T133408Z +DTSTART:20221121T071500Z +DTEND:20221121T091500Z +SUMMARY:DI Sc_Ingé G3 +LOCATION:224 (TP Systèmes) +DESCRIPTION:\n\nGAUCHER PIERRE\nR3 PeiP1 S1\nMONMARCHE NICOLAS\n(Exported + :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393734312d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221207T143000Z -DTEND:20221207T173000Z -SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths -LOCATION:GR L 0090 - Info +DTSTAMP:20220921T133408Z +DTSTART:20221026T060000Z +DTEND:20221026T080000Z +SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333239352d342d30 + r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d36 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221013T060000Z -DTEND:20221013T080000Z -SUMMARY:EP2 Electrostatique et électrocinétique TP Gr9B PEIP (Parcours MP +DTSTAMP:20220921T133408Z +DTSTART:20221005T081500Z +DTEND:20221005T101500Z +SUMMARY:EP2 Electrostatique et électrocinétique TP Gr9A PEIP (Parcours MP I-PEIP Maths ) LOCATION:GR E 0290 (salle TP Physique) -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy - sique Gr9B PEIP - (MPI)\nYAHYA BEY NOUR-EDDINE\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343631332d302d30 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy + sique Gr9A PEIP - (MPI)\nGRAU MATHIEU\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630382d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T120000Z -DTEND:20221017T140000Z -SUMMARY:Anglais S1 A3 -LOCATION:STD 6 -DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d35 +DTSTAMP:20220921T133408Z +DTSTART:20221010T061500Z +DTEND:20221010T081500Z +SUMMARY:DEE Sc_Ingé G1 +LOCATION:S Elec 1\,S Elec 2 +DESCRIPTION:\n\nR1 PeiP1 S1\nMAKRIS PASCAL\nBUSSEUIL REMI\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393539332d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221102T071500Z -DTEND:20221102T171500Z -SUMMARY:CONGES AUTOMNE -LOCATION: -DESCRIPTION:\n\nPeiP1 S1\nPeiP2 S3\nPeiP1 S2\nPeiP2 S4\n(Exported :20/09/ - 2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d32303634312d322d30 +DTSTAMP:20220921T133408Z +DTSTART:20221121T151500Z +DTEND:20221121T171500Z +SUMMARY:Anglais S1 A7 +LOCATION:STD 6 +DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d38 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220922T063000Z -DTEND:20220922T093000Z -SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths -LOCATION:Polytech -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy - sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :20/09/2022 18 - :46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221003T083000Z +DTEND:20221003T103000Z +SUMMARY:Séance Libre Sc_Ingé +LOCATION:Amphi Dassault\,S Elec 2\,S Info A\,224 (TP Systèmes)\,DAE-213 I + nfo\,S Elec 1 +DESCRIPTION:\n\nGAUCHER PIERRE\nR1 PeiP1 S1\nR2 PeiP1 S1\nR3 PeiP1 S1\nR4 + PeiP1 S1\nR5 PeiP1 S1\nMONMARCHE NICOLAS\nMAKRIS PASCAL\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393931352d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220926T120000Z -DTEND:20220926T140000Z -SUMMARY:Anglais S1 A3 -LOCATION:STD 6 -DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d32 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221121T130000Z -DTEND:20221121T150000Z -SUMMARY:Anglais S1 A4 -LOCATION:STD 3 -DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d39 +DTSTAMP:20220921T133408Z +DTSTART:20221013T113000Z +DTEND:20221013T130000Z +SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3132 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T151500Z -DTEND:20221128T171500Z -SUMMARY:Anglais S1 A7 -LOCATION:STD 6 -DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d3130 +DTSTAMP:20220921T133408Z +DTSTART:20221017T061500Z +DTEND:20221017T081500Z +SUMMARY:DMS Sc_Ingé G1 +LOCATION:S Info 4-5 +DESCRIPTION:\n\nR1 PeiP1 S1\nMOFID WAFAA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393830312d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T130000Z -DTEND:20221107T150000Z +DTSTAMP:20220921T133408Z +DTSTART:20221017T120000Z +DTEND:20221017T140000Z SUMMARY:Anglais S1 A3 LOCATION:STD 6 -DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d37 +DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d35 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221121T151500Z -DTEND:20221121T171500Z -SUMMARY:Anglais S1 A5 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d39 +DTSTAMP:20220921T133408Z +DTSTART:20221013T131500Z +DTEND:20221013T144500Z +SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) +LOCATION:GR E1 2040 +DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220926T120000Z -DTEND:20220926T140000Z -SUMMARY:DAE Sc_Ingé G5 -LOCATION:DAE-113 -DESCRIPTION:\n\nBREVET NATHALIE\nR5 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d31393537342d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221116T143000Z +DTEND:20221116T173000Z +SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths +LOCATION:GR E1 1010 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333239352d322d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T083000Z -DTEND:20221017T103000Z -SUMMARY:DAE Sc_Ingé G1 -LOCATION:DAE-214 Info -DESCRIPTION:\n\nHACINI CHEMS EDDINE\nR1 PeiP1 S1\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3237352d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221115T143000Z +DTEND:20221115T173000Z +SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths +LOCATION:GR L 0080 - Info +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy + sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :21/09/2022 15:34)\n + +UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d35 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T130000Z -DTEND:20221128T150000Z -SUMMARY:Anglais S1 A3 -LOCATION:STD 6 -DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d3130 +DTSTAMP:20220921T133408Z +DTSTART:20221107T071500Z +DTEND:20221107T091500Z +SUMMARY:DMS Sc_Ingé G1 +LOCATION:S Info 4-5 +DESCRIPTION:\n\nR1 PeiP1 S1\nMOFID WAFAA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393830312d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T130000Z -DTEND:20221107T150000Z -SUMMARY:Anglais S1 A2 -LOCATION:STD 5 -DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d37 +DTSTAMP:20220921T133408Z +DTSTART:20221006T151500Z +DTEND:20221006T164500Z +SUMMARY:Tutorat Calculus et Raisonnment - PEIP +LOCATION:GR E1 1050 +DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 + Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d33393339322d352d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221013T113000Z -DTEND:20221013T130000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3132 +DTSTAMP:20220921T133408Z +DTSTART:20220926T083000Z +DTEND:20220926T103000Z +SUMMARY:DEE Sc_Ingé G4 +LOCATION:S Elec 1\,S Elec 2 +DESCRIPTION:\n\nBUSSEUIL REMI\nR4 PeiP1 S1\nMAKRIS PASCAL\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393633392d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T151500Z -DTEND:20221107T171500Z -SUMMARY:Anglais S1 A6 -LOCATION:STD 5 -DESCRIPTION:\n\nALQUIER LI-WEN\nA6 PeiP1 S1\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221012T131500Z +DTEND:20221012T161500Z +SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths +LOCATION:GR Pharma Info. A 1010 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333239352d31302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T141500Z -DTEND:20221010T161500Z -SUMMARY:DAE Sc_Ingé G2 -LOCATION:DAE-214 Info -DESCRIPTION:\n\nHACINI CHEMS EDDINE\nR2 PeiP1 S1\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393533382d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221128T151500Z +DTEND:20221128T171500Z +SUMMARY:Anglais S1 A7 +LOCATION:STD 6 +DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d3130 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221125T091500Z -DTEND:20221125T104500Z -SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI - -PEIP Maths) +DTSTAMP:20220921T133408Z +DTSTART:20220928T113000Z +DTEND:20220928T130000Z +SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31382d30 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220926T141500Z -DTEND:20220926T161500Z -SUMMARY:Anglais S1 A7 -LOCATION:STD 6 -DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d31 +DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d362d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T083000Z -DTEND:20221017T103000Z -SUMMARY:DMS Sc_Ingé G3 -LOCATION:S Info 4-5 -DESCRIPTION:\n\nMOFID WAFAA\nR3 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393838312d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221124T160000Z +DTEND:20221124T173000Z +SUMMARY:Tutorat Calculus et Raisonnment - PEIP +LOCATION:GR E1 1050 +DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 + Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d33393339322d322d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221111T071500Z -DTEND:20221111T171500Z -SUMMARY:FERIE -LOCATION: -DESCRIPTION:\n\nPeiP1 S2\nPeiP2 S4\nPeiP1 S1\nPeiP2 S3\n(Exported :20/09/ - 2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d32303636372d362d30 +DTSTAMP:20220921T133408Z +DTSTART:20221128T093000Z +DTEND:20221128T113000Z +SUMMARY:DAE Sc_Ingé G1 +LOCATION:DAE-214 Info +DESCRIPTION:\n\nHACINI CHEMS EDDINE\nR1 PeiP1 S1\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3237352d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221124T073000Z -DTEND:20221124T103000Z -SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths -LOCATION:Polytech -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy - sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :20/09/2022 18 - :46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d35 +DTSTAMP:20220921T133408Z +DTSTART:20221003T141500Z +DTEND:20221003T161500Z +SUMMARY:Anglais S1 A5 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221003T120000Z -DTEND:20221003T140000Z -SUMMARY:Anglais S1 A3 -LOCATION:STD 6 -DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221128T130000Z +DTEND:20221128T150000Z +SUMMARY:Anglais S1 A2 +LOCATION:STD 5 +DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d3130 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221006T151500Z -DTEND:20221006T164500Z -SUMMARY:Tutorat Calculus et Raisonnment - PEIP -LOCATION:GR E1 1050 -DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 - Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d33393339322d352d30 +DTSTAMP:20220921T133408Z +DTSTART:20221021T063000Z +DTEND:20221021T080000Z +SUMMARY:EP1 Calculus CC +LOCATION:GR F 23\,GR F Amphi Physique\,GR F Amphi Biologie\,GR F Amphi 22 + \,GR F Amphi 21\,GR E1 Amphi 040\,GR E1 Amphi 030 +DESCRIPTION:\n\nL1 Informatique (Parcours MPI)\nL1 Maths / Physique Parco + urs PEIP (MPI) -1er Semestre\nL1 Chimie (Parcours PCST)\nL1 Physique (Pa + rcours PCST) -1er Semestre\nL1 Maths - Groupe 4 - MPI\nL1 Maths - Groupe + 5 - MPI\nL1 Maths - Groupe 6 - MPI\nL1 Maths - LAS1-18\nL1 Physique - G + roupe 4 - MPI\nL1 Physique - Groupe 5 - MPI\nL1 Physique - Groupe 6 - MP + I\nL1 Physique /Maths Parcours PEIP (MPI)\nL1 Sciences de la Terre (Parc + ours PCST) - Sem 1\nSANDIER NATALIYA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31303930312d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221026T060000Z -DTEND:20221026T080000Z -SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) +DTSTAMP:20220921T133408Z +DTSTART:20221004T113000Z +DTEND:20221004T130000Z +SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI + -PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d36 + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630302d382d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221114T130000Z -DTEND:20221114T150000Z -SUMMARY:Anglais S1 A4 -LOCATION:STD 3 -DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d38 +DTSTAMP:20220921T133408Z +DTSTART:20221124T070000Z +DTEND:20221124T090000Z +SUMMARY:EP1 Mécanique du point TP Gr9B PEIP (Parcours MPI-PEIP Maths) +LOCATION:GR E 0290 (salle TP Physique) +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy + sique Gr9B PEIP - (MPI)\nBELLIARD SAMUEL\n(Exported :21/09/2022 15:34)\ + n +UID:ADE60506c616e6e696e67323032322d323032332d31343539362d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221026T131500Z -DTEND:20221026T161500Z -SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths -LOCATION:GR Pharma Info. A 1010 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333239352d392d30 +DTSTAMP:20220921T133408Z +DTSTART:20221116T091500Z +DTEND:20221116T111500Z +SUMMARY:EP1 Mécanique du point TP Gr9A PEIP (Parcours MPI-PEIP Maths) +LOCATION:GR E 0290 (salle TP Physique) +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy + sique Gr9A PEIP - (MPI)\nOLIVE ENRICK\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343539332d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221027T131500Z -DTEND:20221027T144500Z -SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) -LOCATION:GR E1 2040 -DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31342d30 +DTSTAMP:20220921T133408Z +DTSTART:20221114T071500Z +DTEND:20221114T091500Z +SUMMARY:Séance Libre Sc_Ingé +LOCATION:Amphi Dassault\,S Elec 2\,DAE-213 Info\,DAE-214 Info\,S Elec 1\, + S Info 4-5 +DESCRIPTION:\n\nGAUCHER PIERRE\nR1 PeiP1 S1\nR2 PeiP1 S1\nR3 PeiP1 S1\nR4 + PeiP1 S1\nR5 PeiP1 S1\nMONMARCHE NICOLAS\nMAKRIS PASCAL\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393931352d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221207T070000Z -DTEND:20221207T090000Z -SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d3131 +DTSTAMP:20220921T133408Z +DTSTART:20221107T130000Z +DTEND:20221107T150000Z +SUMMARY:Anglais S1 A3 +LOCATION:STD 6 +DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d37 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221012T060000Z -DTEND:20221012T080000Z -SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d35 +DTSTAMP:20220921T133408Z +DTSTART:20221114T093000Z +DTEND:20221114T113000Z +SUMMARY:Séance Libre Sc_Ingé +LOCATION:Amphi Dassault\,S Info A\,224 (TP Systèmes)\,DAE-214 Info\,S Ele + c 1\,S Info 4-5 +DESCRIPTION:\n\nGAUCHER PIERRE\nR1 PeiP1 S1\nR2 PeiP1 S1\nR3 PeiP1 S1\nR4 + PeiP1 S1\nR5 PeiP1 S1\nMONMARCHE NICOLAS\nMAKRIS PASCAL\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393931352d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T141500Z -DTEND:20221017T161500Z -SUMMARY:Anglais S1 A6 -LOCATION:STD 5 -DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d34 +DTSTAMP:20220921T133408Z +DTSTART:20221201T164500Z +DTEND:20221201T181500Z +SUMMARY:Tutorat Calculus et Raisonnment - PEIP +LOCATION:GR E1 1050 +DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 + Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d33393339322d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221012T131500Z -DTEND:20221012T161500Z -SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths -LOCATION:GR Pharma Info. A 1010 +DTSTAMP:20220921T133408Z +DTSTART:20220930T063000Z +DTEND:20220930T080000Z +SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2080 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333239352d31302d30 + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3233 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221028T081500Z -DTEND:20221028T094500Z -SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI - -PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31332d30 +DTSTAMP:20220921T133408Z +DTSTART:20220926T061500Z +DTEND:20220926T081500Z +SUMMARY:DEE Sc_Ingé G2 +LOCATION:S Elec 2\,S Elec 1 +DESCRIPTION:\n\nBUSSEUIL REMI\nR2 PeiP1 S1\nMAKRIS PASCAL\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393632382d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220926T083000Z -DTEND:20220926T103000Z -SUMMARY:DAE Sc_Ingé G1 -LOCATION:DAE-113 -DESCRIPTION:\n\nBREVET NATHALIE\nR1 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3237352d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221121T093000Z +DTEND:20221121T113000Z +SUMMARY:DAE Sc_Ingé G2 +LOCATION:DAE-214 Info +DESCRIPTION:\n\nHACINI CHEMS EDDINE\nR2 PeiP1 S1\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393533382d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221201T073000Z -DTEND:20221201T103000Z -SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths -LOCATION:Polytech -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy - sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :20/09/2022 18 - :46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d37 +DTSTAMP:20220921T133408Z +DTSTART:20220928T081500Z +DTEND:20220928T094500Z +SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +LOCATION:GR L 1120 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3130 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T141500Z -DTEND:20221010T161500Z -SUMMARY:Anglais S1 A6 -LOCATION:STD 5 -DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221110T141500Z +DTEND:20221110T154500Z +SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) +LOCATION:GR E1 2040 +DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31362d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T130000Z -DTEND:20221128T150000Z +DTSTAMP:20220921T133408Z +DTSTART:20221003T120000Z +DTEND:20221003T140000Z SUMMARY:Anglais S1 A2 LOCATION:STD 5 -DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) +DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) \n -UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d3130 +UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T120000Z -DTEND:20221010T140000Z -SUMMARY:DEE Sc_Ingé G5 -LOCATION:S Elec 2\,S Elec 1 -DESCRIPTION:\n\nBUSSEUIL REMI\nMAKRIS PASCAL\nR5 PeiP1 S1\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393634302d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221107T130000Z +DTEND:20221107T150000Z +SUMMARY:DAE Sc_Ingé G5 +LOCATION:DAE-214 Info +DESCRIPTION:\n\nBREVET NATHALIE\nR5 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d31393537342d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T093000Z -DTEND:20221107T113000Z -SUMMARY:DMS Sc_Ingé G3 -LOCATION:S Info 4-5 -DESCRIPTION:\n\nMOFID WAFAA\nR3 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393838312d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20220921T131500Z +DTEND:20220921T161500Z +SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths +LOCATION:GR L 1140 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333239352d352d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220920T063000Z -DTEND:20220920T080000Z +DTSTAMP:20220921T133408Z +DTSTART:20221108T073000Z +DTEND:20221108T090000Z SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d36 + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3135 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221124T123000Z -DTEND:20221124T140000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3230 +DTSTAMP:20220921T133408Z +DTSTART:20221102T071500Z +DTEND:20221102T171500Z +SUMMARY:CONGES AUTOMNE +LOCATION: +DESCRIPTION:\n\nPeiP1 S1\nPeiP2 S3\nPeiP1 S2\nPeiP2 S4\n(Exported :21/09/ + 2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d32303634312d322d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T093000Z -DTEND:20221107T113000Z -SUMMARY:DEE Sc_Ingé G4 -LOCATION:S Elec 1\,S Elec 2 -DESCRIPTION:\n\nBUSSEUIL REMI\nR4 PeiP1 S1\nMAKRIS PASCAL\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393633392d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20220929T063000Z +DTEND:20220929T093000Z +SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths +LOCATION:Polytech +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy + sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :21/09/2022 15 + :34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T141500Z -DTEND:20221024T161500Z -SUMMARY:DAE Sc_Ingé G2 -LOCATION:DAE-214 Info -DESCRIPTION:\n\nBREVET NATHALIE\nR2 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d31393533382d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221017T083000Z +DTEND:20221017T103000Z +SUMMARY:DI Sc_Ingé G2 +LOCATION:224 (TP Systèmes) +DESCRIPTION:\n\nMONMARCHE NICOLAS\nR2 PeiP1 S1\nGAUCHER PIERRE\n(Exported + :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393638312d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T141500Z -DTEND:20221010T161500Z -SUMMARY:Anglais S1 A7 -LOCATION:STD 6 -DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221128T093000Z +DTEND:20221128T113000Z +SUMMARY:DMS Sc_Ingé G3 +LOCATION:S Info 4-5 +DESCRIPTION:\n\nMOFID WAFAA\nR3 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393838312d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T120000Z -DTEND:20221024T140000Z -SUMMARY:DMS Sc_Ingé G4 -LOCATION:S Info A -DESCRIPTION:\n\nR4 PeiP1 S1\nMOFID WAFAA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393930342d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221025T063000Z +DTEND:20221025T080000Z +SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3133 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T061500Z -DTEND:20221024T081500Z -SUMMARY:DI Sc_Ingé G3 -LOCATION:224 (TP Systèmes) -DESCRIPTION:\n\nGAUCHER PIERRE\nR3 PeiP1 S1\nMONMARCHE NICOLAS\n(Exported - :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393734312d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20220921T081500Z +DTEND:20220921T101500Z +SUMMARY:EP2 Electrostatique et électrocinétique TP Gr9A PEIP (Parcours MP + I-PEIP Maths ) +LOCATION:GR E 0290 (salle TP Physique) +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy + sique Gr9A PEIP - (MPI)\nGRAU MATHIEU\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630382d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220928T113000Z -DTEND:20220928T130000Z -SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) -LOCATION:GR E1 2040 -DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d362d30 +DTSTAMP:20220921T133408Z +DTSTART:20221205T130000Z +DTEND:20221205T170000Z +SUMMARY:Peip1-Anglais Contrôle de fin de semestre +LOCATION:Amphi Dassault\,SC 2 +DESCRIPTION:\n\nA5 PeiP1 S1\nA6 PeiP1 S1\nA2 PeiP1 S1\nA3 PeiP1 S1\nA4 Pe + iP1 S1\nA7 PeiP1 S1\nA1 PeiP1 S1\nCLOUET MAUD\nROUSSEAU CELINE\nONAK SCO + TT\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d36383136352d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T061500Z -DTEND:20221017T081500Z -SUMMARY:DI Sc_Ingé G4 -LOCATION:230 (Unix A) -DESCRIPTION:\n\nR4 PeiP1 S1\nMONMARCHE NICOLAS\n(Exported :20/09/2022 18: - 46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393735302d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221122T123000Z +DTEND:20221122T140000Z +SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI + -PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31372d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T083000Z -DTEND:20221010T103000Z -SUMMARY:DEE Sc_Ingé G3 -LOCATION:S Elec 1\,S Elec 2 -DESCRIPTION:\n\nBUSSEUIL REMI\nR3 PeiP1 S1\nMAKRIS PASCAL\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393632392d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221017T141500Z +DTEND:20221017T161500Z +SUMMARY:Anglais S1 A5 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d35 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T120000Z -DTEND:20221024T140000Z +DTSTAMP:20220921T133408Z +DTSTART:20221128T130000Z +DTEND:20221128T150000Z SUMMARY:Anglais S1 A4 LOCATION:STD 3 -DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d36 +DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d3130 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221110T160000Z -DTEND:20221110T173000Z -SUMMARY:Tutorat Calculus et Raisonnment - PEIP -LOCATION:GR E1 1050 -DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 - Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d33393339322d332d30 +DTSTAMP:20220921T133408Z +DTSTART:20221121T151500Z +DTEND:20221121T171500Z +SUMMARY:Anglais S1 A6 +LOCATION:STD 5 +DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d36 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220921T113000Z -DTEND:20220921T130000Z +DTSTAMP:20220921T133408Z +DTSTART:20221128T071500Z +DTEND:20221128T091500Z +SUMMARY:DI Sc_Ingé G5 +LOCATION:224 (TP Systèmes) +DESCRIPTION:\n\nGAUCHER PIERRE\nR5 PeiP1 S1\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d31393736302d302d32 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221027T131500Z +DTEND:20221027T144500Z SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) LOCATION:GR E1 2040 DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d342d30 + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31342d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221121T130000Z -DTEND:20221121T150000Z -SUMMARY:Anglais S1 A1 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d39 +DTSTAMP:20220921T133408Z +DTSTART:20221010T120000Z +DTEND:20221010T140000Z +SUMMARY:DEE Sc_Ingé G5 +LOCATION:S Elec 2\,S Elec 1 +DESCRIPTION:\n\nBUSSEUIL REMI\nMAKRIS PASCAL\nR5 PeiP1 S1\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393634302d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221006T063000Z -DTEND:20221006T093000Z -SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths -LOCATION:Polytech -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy - sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :20/09/2022 18 - :46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d3131 +DTSTAMP:20220921T133408Z +DTSTART:20221013T151500Z +DTEND:20221013T164500Z +SUMMARY:Tutorat Calculus et Raisonnment - PEIP +LOCATION:GR E1 1050 +DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 + Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d33393339322d362d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221108T141500Z -DTEND:20221108T171500Z -SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths -LOCATION:GR L 1150 - Info -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy - sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :20/09/2022 18:46)\n - -UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d39 +DTSTAMP:20220921T133408Z +DTSTART:20220926T061500Z +DTEND:20220926T081500Z +SUMMARY:DI Sc_Ingé G4 +LOCATION:230 (Unix A) +DESCRIPTION:\n\nR4 PeiP1 S1\nMONMARCHE NICOLAS\n(Exported :21/09/2022 15: + 34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393735302d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221129T141500Z -DTEND:20221129T171500Z -SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths -LOCATION:GR L 1150 - Info -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy - sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :20/09/2022 18:46)\n - -UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d37 +DTSTAMP:20220921T133408Z +DTSTART:20221110T123000Z +DTEND:20221110T140000Z +SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3136 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221130T141500Z -DTEND:20221130T171500Z -SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths -LOCATION:GR Pharma Info. A 1010 +DTSTAMP:20220921T133408Z +DTSTART:20221115T073000Z +DTEND:20221115T090000Z +SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333239352d31312d30 + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3137 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221208T073000Z -DTEND:20221208T103000Z -SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths -LOCATION:Polytech -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy - sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :20/09/2022 18 - :46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d36 +DTSTAMP:20220921T133408Z +DTSTART:20220927T113000Z +DTEND:20220927T130000Z +SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI + -PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630302d362d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221027T113000Z -DTEND:20221027T130000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3134 +DTSTAMP:20220921T133408Z +DTSTART:20221121T130000Z +DTEND:20221121T150000Z +SUMMARY:DEE Sc_Ingé G5 +LOCATION:S Elec 2\,S Elec 1 +DESCRIPTION:\n\nBUSSEUIL REMI\nMAKRIS PASCAL\nR5 PeiP1 S1\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393634302d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221110T141500Z -DTEND:20221110T154500Z -SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) -LOCATION:GR E1 2040 -DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31362d30 +DTSTAMP:20220921T133408Z +DTSTART:20220926T061500Z +DTEND:20220926T081500Z +SUMMARY:DI Sc_Ingé G5 +LOCATION:224 (TP Systèmes) +DESCRIPTION:\n\nGAUCHER PIERRE\nR5 PeiP1 S1\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d31393736302d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221114T151500Z -DTEND:20221114T171500Z -SUMMARY:Anglais S1 A7 -LOCATION:STD 6 -DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d3131 +DTSTAMP:20220921T133408Z +DTSTART:20221107T071500Z +DTEND:20221107T091500Z +SUMMARY:DI Sc_Ingé G5 +LOCATION:224 (TP Systèmes) +DESCRIPTION:\n\nGAUCHER PIERRE\nR5 PeiP1 S1\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d31393736302d302d33 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221128T071500Z +DTEND:20221128T091500Z +SUMMARY:DI Sc_Ingé G4 +LOCATION:230 (Unix A) +DESCRIPTION:\n\nR4 PeiP1 S1\nMONMARCHE NICOLAS\n(Exported :21/09/2022 15: + 34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393735302d302d33 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20220926T083000Z +DTEND:20220926T103000Z +SUMMARY:DI Sc_Ingé G2 +LOCATION:224 (TP Systèmes) +DESCRIPTION:\n\nMONMARCHE NICOLAS\nR2 PeiP1 S1\nGAUCHER PIERRE\n(Exported + :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393638312d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221021T063000Z -DTEND:20221021T080000Z -SUMMARY:EP1 Calculus CC -LOCATION:GR F 23\,GR F Amphi Physique\,GR F Amphi Biologie\,GR F Amphi 22 - \,GR F Amphi 21\,GR E1 Amphi 040\,GR E1 Amphi 030 -DESCRIPTION:\n\nL1 Informatique (Parcours MPI)\nL1 Maths / Physique Parco - urs PEIP (MPI) -1er Semestre\nL1 Chimie (Parcours PCST)\nL1 Physique (Pa - rcours PCST) -1er Semestre\nL1 Maths - Groupe 4 - MPI\nL1 Maths - Groupe - 5 - MPI\nL1 Maths - Groupe 6 - MPI\nL1 Maths - LAS1-18\nL1 Physique - G - roupe 4 - MPI\nL1 Physique - Groupe 5 - MPI\nL1 Physique - Groupe 6 - MP - I\nL1 Physique /Maths Parcours PEIP (MPI)\nL1 Sciences de la Terre (Parc - ours PCST) - Sem 1\nSANDIER NATALIYA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31303930312d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221011T081500Z +DTEND:20221011T094500Z +SUMMARY:EP1 Calculus CM - (PEIP + LAS1) +LOCATION:GR F Amphi 21 +DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 + Physique /Maths Parcours PEIP (MPI)\nL1 Maths - LAS1-18\nSANDIER NATALI + YA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d333731372d352d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221014T081500Z -DTEND:20221014T094500Z -SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI - -PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31312d30 +DTSTAMP:20220921T133408Z +DTSTART:20221024T061500Z +DTEND:20221024T081500Z +SUMMARY:DMS Sc_Ingé G2 +LOCATION:S Info A +DESCRIPTION:\n\nR2 PeiP1 S1\nMOFID WAFAA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393831362d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221108T123000Z -DTEND:20221108T140000Z -SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI - -PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31342d30 +DTSTAMP:20220921T133408Z +DTSTART:20221003T120000Z +DTEND:20221003T140000Z +SUMMARY:Anglais S1 A3 +LOCATION:STD 6 +DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221117T073000Z -DTEND:20221117T103000Z -SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths -LOCATION:Polytech -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy - sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :20/09/2022 18 - :46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d38 +DTSTAMP:20220921T133408Z +DTSTART:20221208T161500Z +DTEND:20221208T174500Z +SUMMARY:Tutorat Calculus et Raisonnment - PEIP +LOCATION:GR E1 1050 +DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 + Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d33393339322d312d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T061500Z -DTEND:20221024T081500Z -SUMMARY:DEE Sc_Ingé G1 -LOCATION:S Elec 1\,S Elec 2 -DESCRIPTION:\n\nR1 PeiP1 S1\nMAKRIS PASCAL\nBUSSEUIL REMI\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393539332d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221024T120000Z +DTEND:20221024T140000Z +SUMMARY:Anglais S1 A4 +LOCATION:STD 3 +DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d36 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221206T073000Z -DTEND:20221206T090000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221020T081500Z +DTEND:20221020T101500Z +SUMMARY:EP2 Raisonnement CC +LOCATION:GR F 23\,GR F Amphi Physique\,GR F Amphi Biologie\,GR F Amphi 22 + \,GR F Amphi 21 +DESCRIPTION:\n\nL1 Informatique (Parcours MPI)\nL1 Mathématiques (MPI) -1 + er Semestre\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 P + hysique (Parcours MPI) -1er Semestre\nL1 Physique /Maths Parcours PEIP ( + MPI)\nTRAIZET MARTIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31313031392d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z +DTSTAMP:20220921T133408Z DTSTART:20220926T120000Z DTEND:20220926T140000Z -SUMMARY:Anglais S1 A2 -LOCATION:STD 5 -DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d32 +SUMMARY:Anglais S1 A4 +LOCATION:STD 3 +DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221122T073000Z -DTEND:20221122T090000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3139 +DTSTAMP:20220921T133408Z +DTSTART:20220926T141500Z +DTEND:20220926T161500Z +SUMMARY:Anglais S1 A6 +LOCATION:STD 5 +DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221003T061500Z -DTEND:20221003T081500Z -SUMMARY:Séance Libre Sc_Ingé -LOCATION:Amphi Dassault\,S Elec 2\,S Info A\,DAE-214 Info\,DAE-218 Info\, - S BEAO -DESCRIPTION:\n\nGAUCHER PIERRE\nR1 PeiP1 S1\nR2 PeiP1 S1\nR3 PeiP1 S1\nR4 - PeiP1 S1\nR5 PeiP1 S1\nMONMARCHE NICOLAS\nMAKRIS PASCAL\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393931352d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221010T083000Z +DTEND:20221010T103000Z +SUMMARY:DI Sc_Ingé G1 +LOCATION:224 (TP Systèmes) +DESCRIPTION:\n\nR1 PeiP1 S1\nMONMARCHE NICOLAS\nGAUCHER PIERRE\n(Exported + :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393634382d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221013T131500Z -DTEND:20221013T144500Z +DTSTAMP:20220921T133408Z +DTSTART:20221005T113000Z +DTEND:20221005T130000Z SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) LOCATION:GR E1 2040 DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31302d30 + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d372d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221025T081500Z -DTEND:20221025T094500Z -SUMMARY:EP1 Calculus CM - (PEIP + LAS1) -LOCATION:GR F Amphi 21 -DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 - Physique /Maths Parcours PEIP (MPI)\nL1 Maths - LAS1-18\nSANDIER NATALI - YA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d333731372d362d30 +DTSTAMP:20220921T133408Z +DTSTART:20221107T151500Z +DTEND:20221107T171500Z +SUMMARY:Anglais S1 A5 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d37 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T071500Z -DTEND:20221107T091500Z -SUMMARY:DAE Sc_Ingé G3 -LOCATION:DAE-214 Info -DESCRIPTION:\n\nR3 PeiP1 S1\nBREVET NATHALIE\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d31393535342d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221013T063000Z +DTEND:20221013T093000Z +SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths +LOCATION:Polytech +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy + sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :21/09/2022 15 + :34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d3130 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220927T081500Z -DTEND:20220927T094500Z -SUMMARY:EP1 Calculus CM - (PEIP + LAS1) -LOCATION:GR F Amphi 21 -DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 - Physique /Maths Parcours PEIP (MPI)\nL1 Maths - LAS1-18\nSANDIER NATALI - YA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d333731372d332d30 +DTSTAMP:20220921T133408Z +DTSTART:20221024T120000Z +DTEND:20221024T140000Z +SUMMARY:Anglais S1 A2 +LOCATION:STD 5 +DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d36 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221114T130000Z -DTEND:20221114T150000Z +DTSTAMP:20220921T133408Z +DTSTART:20221017T120000Z +DTEND:20221017T140000Z SUMMARY:Anglais S1 A1 LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :20/09/2022 18:46 +DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :21/09/2022 15:34 )\n -UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d38 +UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d35 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221130T123000Z -DTEND:20221130T140000Z -SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) -LOCATION:GR E1 2040 -DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31322d30 +DTSTAMP:20220921T133408Z +DTSTART:20221206T143000Z +DTEND:20221206T173000Z +SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths +LOCATION:GR L 0040 - Info +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy + sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :21/09/2022 15:34)\n + +UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d36 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220926T061500Z -DTEND:20220926T081500Z -SUMMARY:DI Sc_Ingé G5 -LOCATION:224 (TP Systèmes) -DESCRIPTION:\n\nGAUCHER PIERRE\nR5 PeiP1 S1\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d31393736302d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221003T141500Z +DTEND:20221003T161500Z +SUMMARY:Anglais S1 A7 +LOCATION:STD 6 +DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221121T071500Z -DTEND:20221121T091500Z -SUMMARY:DMS Sc_Ingé G5 -LOCATION:S Info A -DESCRIPTION:\n\nR5 PeiP1 S1\nMOFID WAFAA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393931342d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20220923T113000Z +DTEND:20220923T130000Z +SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) +LOCATION:GR E1 2010 +DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d322d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T120000Z -DTEND:20221024T140000Z -SUMMARY:Anglais S1 A1 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d36 +DTSTAMP:20220921T133408Z +DTSTART:20221012T060000Z +DTEND:20221012T080000Z +SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d35 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T130000Z -DTEND:20221128T150000Z -SUMMARY:Anglais S1 A1 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d3130 +DTSTAMP:20220921T133408Z +DTSTART:20221010T141500Z +DTEND:20221010T161500Z +SUMMARY:DAE Sc_Ingé G2 +LOCATION:DAE-214 Info +DESCRIPTION:\n\nHACINI CHEMS EDDINE\nR2 PeiP1 S1\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393533382d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221006T131500Z -DTEND:20221006T144500Z -SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) -LOCATION:GR E1 2040 -DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d382d30 +DTSTAMP:20220921T133408Z +DTSTART:20221128T093000Z +DTEND:20221128T113000Z +SUMMARY:DI Sc_Ingé G2 +LOCATION:224 (TP Systèmes) +DESCRIPTION:\n\nMONMARCHE NICOLAS\nR2 PeiP1 S1\nGAUCHER PIERRE\n(Exported + :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393638312d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220929T060000Z -DTEND:20220929T080000Z -SUMMARY:EP2 Electrostatique et électrocinétique TP Gr9B PEIP (Parcours MP - I-PEIP Maths ) -LOCATION:GR E 0290 (salle TP Physique) -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy - sique Gr9B PEIP - (MPI)\nYAHYA BEY NOUR-EDDINE\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343631332d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221107T130000Z +DTEND:20221107T150000Z +SUMMARY:Anglais S1 A4 +LOCATION:STD 3 +DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d37 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T061500Z -DTEND:20221024T081500Z +DTSTAMP:20220921T133408Z +DTSTART:20221010T061500Z +DTEND:20221010T081500Z SUMMARY:DMS Sc_Ingé G2 LOCATION:S Info A -DESCRIPTION:\n\nR2 PeiP1 S1\nMOFID WAFAA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393831362d302d32 +DESCRIPTION:\n\nR2 PeiP1 S1\nMOFID WAFAA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393831362d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220922T113000Z -DTEND:20220922T130000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +DTSTAMP:20220921T133408Z +DTSTART:20220921T060000Z +DTEND:20220921T080000Z +SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d37 + r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221118T091500Z -DTEND:20221118T104500Z +DTSTAMP:20220921T133408Z +DTSTART:20221007T081500Z +DTEND:20221007T094500Z SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI -PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31362d30 + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630302d392d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220921T060000Z -DTEND:20220921T080000Z -SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) +DTSTAMP:20220921T133408Z +DTSTART:20221011T063000Z +DTEND:20221011T080000Z +SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d32 + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3131 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221024T083000Z -DTEND:20221024T103000Z +DTSTAMP:20220921T133408Z +DTSTART:20220921T113000Z +DTEND:20220921T130000Z +SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) +LOCATION:GR E1 2040 +DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d342d30 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221010T083000Z +DTEND:20221010T103000Z SUMMARY:DEE Sc_Ingé G3 LOCATION:S Elec 1\,S Elec 2 -DESCRIPTION:\n\nBUSSEUIL REMI\nR3 PeiP1 S1\nMAKRIS PASCAL\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393632392d302d31 +DESCRIPTION:\n\nBUSSEUIL REMI\nR3 PeiP1 S1\nMAKRIS PASCAL\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393632392d302d33 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220928T133000Z -DTEND:20220928T163000Z +DTSTAMP:20220921T133408Z +DTSTART:20221005T131500Z +DTEND:20221005T161500Z SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths -LOCATION:GR L 0040 - Info +LOCATION:GR L 0080 - Info DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333239352d332d30 + r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333239352d372d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220927T113000Z -DTEND:20220927T130000Z +DTSTAMP:20220921T133408Z +DTSTART:20221114T130000Z +DTEND:20221114T150000Z +SUMMARY:Anglais S1 A3 +LOCATION:STD 6 +DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d38 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221208T073000Z +DTEND:20221208T103000Z +SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths +LOCATION:Polytech +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy + sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :21/09/2022 15 + :34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d36 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221028T081500Z +DTEND:20221028T094500Z SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI -PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d362d30 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221101T071500Z -DTEND:20221101T171500Z -SUMMARY:CONGES AUTOMNE -LOCATION: -DESCRIPTION:\n\nPeiP1 S1\nPeiP2 S3\nPeiP1 S2\nPeiP2 S4\n(Exported :20/09/ - 2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d32303634312d312d30 + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31332d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220926T083000Z -DTEND:20220926T103000Z -SUMMARY:DMS Sc_Ingé G3 -LOCATION:S Info 4-5 -DESCRIPTION:\n\nR3 PeiP1 S1\nALTMEYER GUILLAUME\n(Exported :20/09/2022 18 - :46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393838312d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20220926T120000Z +DTEND:20220926T140000Z +SUMMARY:DAE Sc_Ingé G5 +LOCATION:DAE-113 +DESCRIPTION:\n\nBREVET NATHALIE\nR5 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d31393537342d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z +DTSTAMP:20220921T133408Z DTSTART:20221123T141500Z DTEND:20221123T171500Z SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths LOCATION:GR Pharma Info. A 1160 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :20/09/2022 18:46)\n + r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :21/09/2022 15:34)\n UID:ADE60506c616e6e696e67323032322d323032332d31333239352d312d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T071500Z -DTEND:20221128T091500Z -SUMMARY:DAE Sc_Ingé G3 -LOCATION:DAE-214 Info -DESCRIPTION:\n\nR3 PeiP1 S1\nHACINI CHEMS EDDINE\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393535342d302d33 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221010T083000Z -DTEND:20221010T103000Z -SUMMARY:DMS Sc_Ingé G5 -LOCATION:S Info A -DESCRIPTION:\n\nR5 PeiP1 S1\nMOFID WAFAA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393931342d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221130T141500Z +DTEND:20221130T171500Z +SUMMARY:I1.1 Informatique TD Gr9 PEIP Physique / Maths +LOCATION:GR Pharma Info. A 1010 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nBRAHEM AMINA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333239352d31312d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T061500Z -DTEND:20221017T081500Z -SUMMARY:DAE Sc_Ingé G3 -LOCATION:DAE-214 Info -DESCRIPTION:\n\nR3 PeiP1 S1\nHACINI CHEMS EDDINE\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393535342d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20221010T120000Z +DTEND:20221010T140000Z +SUMMARY:Anglais S1 A1 +LOCATION:STD 4 +DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d34 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221012T113000Z -DTEND:20221012T130000Z -SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) -LOCATION:GR E1 2040 -DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d392d30 +DTSTAMP:20220921T133408Z +DTSTART:20221013T060000Z +DTEND:20221013T080000Z +SUMMARY:EP2 Electrostatique et électrocinétique TP Gr9B PEIP (Parcours MP + I-PEIP Maths ) +LOCATION:GR E 0290 (salle TP Physique) +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy + sique Gr9B PEIP - (MPI)\nYAHYA BEY NOUR-EDDINE\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343631332d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T061500Z -DTEND:20221017T081500Z -SUMMARY:DI Sc_Ingé G5 -LOCATION:224 (TP Systèmes) -DESCRIPTION:\n\nGAUCHER PIERRE\nR5 PeiP1 S1\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d31393736302d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20220926T120000Z +DTEND:20220926T140000Z +SUMMARY:Anglais S1 A3 +LOCATION:STD 6 +DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220926T120000Z -DTEND:20220926T140000Z -SUMMARY:Anglais S1 A4 -LOCATION:STD 3 -DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221107T093000Z +DTEND:20221107T113000Z +SUMMARY:DEE Sc_Ingé G4 +LOCATION:S Elec 1\,S Elec 2 +DESCRIPTION:\n\nBUSSEUIL REMI\nR4 PeiP1 S1\nMAKRIS PASCAL\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393633392d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T093000Z -DTEND:20221128T113000Z -SUMMARY:DAE Sc_Ingé G1 -LOCATION:DAE-214 Info -DESCRIPTION:\n\nHACINI CHEMS EDDINE\nR1 PeiP1 S1\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3237352d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221121T093000Z +DTEND:20221121T113000Z +SUMMARY:DEE Sc_Ingé G3 +LOCATION:S Elec 1\,S Elec 2 +DESCRIPTION:\n\nBUSSEUIL REMI\nR3 PeiP1 S1\nMAKRIS PASCAL\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393632392d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221104T071500Z -DTEND:20221104T171500Z -SUMMARY:CONGES AUTOMNE -LOCATION: -DESCRIPTION:\n\nPeiP1 S1\nPeiP2 S3\nPeiP1 S2\nPeiP2 S4\n(Exported :20/09/ - 2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d32303634312d342d30 +DTSTAMP:20220921T133408Z +DTSTART:20221117T160000Z +DTEND:20221117T173000Z +SUMMARY:Tutorat Calculus et Raisonnment - PEIP +LOCATION:GR E1 1050 +DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 + Physique /Maths Parcours PEIP (MPI)\n*\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d33393339322d342d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z +DTSTAMP:20220921T133408Z DTSTART:20221123T070000Z DTEND:20221123T090000Z SUMMARY:EP1 Calculus TD Gr 9 (Parcours MPI - PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :20/09/2022 18:46)\n + r9 PEIP - (MPI)\nHAMZA HICHEM\n(Exported :21/09/2022 15:34)\n UID:ADE60506c616e6e696e67323032322d323032332d31333434332d302d39 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221011T081500Z -DTEND:20221011T094500Z -SUMMARY:EP1 Calculus CM - (PEIP + LAS1) -LOCATION:GR F Amphi 21 -DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 - Physique /Maths Parcours PEIP (MPI)\nL1 Maths - LAS1-18\nSANDIER NATALI - YA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d333731372d352d30 +DTSTAMP:20220921T133408Z +DTSTART:20221128T151500Z +DTEND:20221128T171500Z +SUMMARY:Anglais S1 A6 +LOCATION:STD 5 +DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d35 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221115T123000Z -DTEND:20221115T140000Z -SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI - -PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31352d30 +DTSTAMP:20220921T133408Z +DTSTART:20220926T141500Z +DTEND:20220926T161500Z +SUMMARY:Anglais S1 A7 +LOCATION:STD 6 +DESCRIPTION:\n\nA7 PeiP1 S1\nONAK SCOTT\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d34323430322d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220926T141500Z -DTEND:20220926T161500Z -SUMMARY:Anglais S1 A5 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221205T071500Z +DTEND:20221205T091500Z +SUMMARY:Sciences de l'ingénieur S1 Evaluation +LOCATION:Amphi Dassault\,S BEAO\,S Info 4-5\,S Info A\,PAF +DESCRIPTION:\n\nMAKRIS PASCAL\nBUSSEUIL REMI\nGAUCHER PIERRE\nCHALON FLOR + ENT\nMOFID WAFAA\nMONMARCHE NICOLAS\nBREVET NATHALIE\nR5 PeiP1 S1\nR4 Pe + iP1 S1\nR3 PeiP1 S1\nR2 PeiP1 S1\nR1 PeiP1 S1\n(Exported :21/09/2022 15: + 34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3237372d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220926T141500Z -DTEND:20220926T161500Z -SUMMARY:Anglais S1 A6 +DTSTAMP:20220921T133408Z +DTSTART:20220926T120000Z +DTEND:20220926T140000Z +SUMMARY:Anglais S1 A2 LOCATION:STD 5 -DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) +DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) \n -UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d30 +UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d32 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221017T083000Z +DTEND:20221017T103000Z +SUMMARY:DEE Sc_Ingé G4 +LOCATION:S Elec 1\,S Elec 2 +DESCRIPTION:\n\nBUSSEUIL REMI\nR4 PeiP1 S1\nMAKRIS PASCAL\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393633392d302d32 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221128T071500Z +DTEND:20221128T091500Z +SUMMARY:DMS Sc_Ingé G1 +LOCATION:S Info 4-5 +DESCRIPTION:\n\nR1 PeiP1 S1\nMOFID WAFAA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393830312d302d30 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221024T120000Z +DTEND:20221024T140000Z +SUMMARY:DEE Sc_Ingé G5 +LOCATION:S Elec 2\,S Elec 1 +DESCRIPTION:\n\nBUSSEUIL REMI\nMAKRIS PASCAL\nR5 PeiP1 S1\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393634302d302d31 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221209T073000Z +DTEND:20221209T103000Z +SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths +LOCATION:GR L 0020 - Info +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy + sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :21/09/2022 15:34)\n + +UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d3131 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221130T123000Z +DTEND:20221130T140000Z +SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) +LOCATION:GR E1 2040 +DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31322d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221003T141500Z -DTEND:20221003T161500Z -SUMMARY:Anglais S1 A5 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA5 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3236382d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221114T130000Z +DTEND:20221114T150000Z +SUMMARY:Anglais S1 A4 +LOCATION:STD 3 +DESCRIPTION:\n\nCLOUET MAUD\nA4 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236342d302d38 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221115T073000Z -DTEND:20221115T090000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +DTSTAMP:20220921T133408Z +DTSTART:20221011T113000Z +DTEND:20221011T130000Z +SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI + -PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3137 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221205T093000Z -DTEND:20221205T113000Z -SUMMARY:Sciences de l'ingénieur S1 Evaluation -LOCATION:Amphi Dassault\,S BEAO\,S Info 4-5\,S Info A\,PAF -DESCRIPTION:\n\nMAKRIS PASCAL\nBUSSEUIL REMI\nGAUCHER PIERRE\nCHALON FLOR - ENT\nMOFID WAFAA\nMONMARCHE NICOLAS\nBREVET NATHALIE\nR5 PeiP1 S1\nR4 Pe - iP1 S1\nR3 PeiP1 S1\nR2 PeiP1 S1\nR1 PeiP1 S1\n(Exported :20/09/2022 18: - 46)\n -UID:ADE60506c616e6e696e67323032322d323032332d3237372d302d30 + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221003T141500Z -DTEND:20221003T161500Z -SUMMARY:Anglais S1 A6 -LOCATION:STD 5 -DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) - \n -UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221107T093000Z +DTEND:20221107T113000Z +SUMMARY:DI Sc_Ingé G2 +LOCATION:224 (TP Systèmes) +DESCRIPTION:\n\nMONMARCHE NICOLAS\nR2 PeiP1 S1\nGAUCHER PIERRE\n(Exported + :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393638312d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z +DTSTAMP:20220921T133408Z DTSTART:20221004T081500Z DTEND:20221004T094500Z SUMMARY:EP1 Calculus CM - (PEIP + LAS1) LOCATION:GR F Amphi 21 DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 Physique /Maths Parcours PEIP (MPI)\nL1 Maths - LAS1-18\nSANDIER NATALI - YA\n(Exported :20/09/2022 18:46)\n + YA\n(Exported :21/09/2022 15:34)\n UID:ADE60506c616e6e696e67323032322d323032332d333731372d342d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221115T091500Z -DTEND:20221115T104500Z -SUMMARY:EP1 Calculus CM - (PEIP + LAS1) -LOCATION:GR F Amphi 21 -DESCRIPTION:\n\nL1 Maths / Physique Parcours PEIP (MPI) -1er Semestre\nL1 - Physique /Maths Parcours PEIP (MPI)\nL1 Maths - LAS1-18\nSANDIER NATALI - YA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d333731372d372d30 +DTSTAMP:20220921T133408Z +DTSTART:20221125T091500Z +DTEND:20221125T104500Z +SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI + -PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31382d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221123T123000Z -DTEND:20221123T140000Z -SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) -LOCATION:GR E1 2040 -DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31392d30 +DTSTAMP:20220921T133408Z +DTSTART:20221114T151500Z +DTEND:20221114T171500Z +SUMMARY:Anglais S1 A6 +LOCATION:STD 5 +DESCRIPTION:\n\nA6 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) + \n +UID:ADE60506c616e6e696e67323032322d323032332d3439342d302d3130 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221011T063000Z -DTEND:20221011T080000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2040 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3131 +DTSTAMP:20220921T133408Z +DTSTART:20221010T120000Z +DTEND:20221010T140000Z +SUMMARY:Anglais S1 A3 +LOCATION:STD 6 +DESCRIPTION:\n\nONAK SCOTT\nA3 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d3236322d302d34 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220923T113000Z -DTEND:20220923T130000Z -SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) -LOCATION:GR E1 2010 -DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d322d30 +DTSTAMP:20220921T133408Z +DTSTART:20221129T141500Z +DTEND:20221129T171500Z +SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths +LOCATION:GR L 1150 - Info +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy + sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :21/09/2022 15:34)\n + +UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d37 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T120000Z -DTEND:20221017T140000Z +DTSTAMP:20220921T133408Z +DTSTART:20220926T120000Z +DTEND:20220926T140000Z SUMMARY:Anglais S1 A1 LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :20/09/2022 18:46 +DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :21/09/2022 15:34 )\n -UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d35 -CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221128T093000Z -DTEND:20221128T113000Z -SUMMARY:DI Sc_Ingé G2 -LOCATION:224 (TP Systèmes) -DESCRIPTION:\n\nMONMARCHE NICOLAS\nR2 PeiP1 S1\nGAUCHER PIERRE\n(Exported - :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393638312d302d31 +UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T120000Z -DTEND:20221017T140000Z +DTSTAMP:20220921T133408Z +DTSTART:20221114T130000Z +DTEND:20221114T150000Z SUMMARY:Anglais S1 A2 LOCATION:STD 5 -DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :20/09/2022 18:46) +DESCRIPTION:\n\nA2 PeiP1 S1\nALQUIER LI-WEN\n(Exported :21/09/2022 15:34) \n -UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d35 +UID:ADE60506c616e6e696e67323032322d323032332d3236302d302d38 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221026T113000Z -DTEND:20221026T130000Z -SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) -LOCATION:GR E1 2040 -DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d31332d30 +DTSTAMP:20220921T133408Z +DTSTART:20220929T060000Z +DTEND:20220929T080000Z +SUMMARY:EP2 Electrostatique et électrocinétique TP Gr9B PEIP (Parcours MP + I-PEIP Maths ) +LOCATION:GR E 0290 (salle TP Physique) +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy + sique Gr9B PEIP - (MPI)\nYAHYA BEY NOUR-EDDINE\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343631332d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221017T120000Z -DTEND:20221017T140000Z -SUMMARY:DAE Sc_Ingé G5 -LOCATION:DAE-214 Info -DESCRIPTION:\n\nHACINI CHEMS EDDINE\nR5 PeiP1 S1\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393537342d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221121T093000Z +DTEND:20221121T113000Z +SUMMARY:DI Sc_Ingé G1 +LOCATION:224 (TP Systèmes) +DESCRIPTION:\n\nR1 PeiP1 S1\nMONMARCHE NICOLAS\nGAUCHER PIERRE\n(Exported + :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393634382d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220922T131500Z -DTEND:20220922T144500Z +DTSTAMP:20220921T133408Z +DTSTART:20221012T081500Z +DTEND:20221012T094500Z SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) -LOCATION:GR E1 2040 +LOCATION:GR E1 2080 DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat - hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :20/09/2022 1 - 8:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333436382d352d30 + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d332d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221122T123000Z -DTEND:20221122T140000Z -SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI - -PEIP Maths) +DTSTAMP:20220921T133408Z +DTSTART:20220922T113000Z +DTEND:20220922T130000Z +SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31372d30 + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d37 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220930T063000Z -DTEND:20220930T080000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) -LOCATION:GR E1 2080 -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3233 +DTSTAMP:20220921T133408Z +DTSTART:20221024T120000Z +DTEND:20221024T140000Z +SUMMARY:DMS Sc_Ingé G4 +LOCATION:S Info A +DESCRIPTION:\n\nR4 PeiP1 S1\nMOFID WAFAA\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393930342d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221116T091500Z -DTEND:20221116T111500Z -SUMMARY:EP1 Mécanique du point TP Gr9A PEIP (Parcours MPI-PEIP Maths) -LOCATION:GR E 0290 (salle TP Physique) -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy - sique Gr9A PEIP - (MPI)\nOLIVE ENRICK\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31343539332d302d30 +DTSTAMP:20220921T133408Z +DTSTART:20221107T093000Z +DTEND:20221107T113000Z +SUMMARY:DMS Sc_Ingé G3 +LOCATION:S Info 4-5 +DESCRIPTION:\n\nMOFID WAFAA\nR3 PeiP1 S1\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393838312d302d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221025T063000Z -DTEND:20221025T080000Z -SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +DTSTAMP:20220921T133408Z +DTSTART:20221024T083000Z +DTEND:20221024T103000Z +SUMMARY:DAE Sc_Ingé G4 +LOCATION:DAE-214 Info +DESCRIPTION:\n\nBREVET NATHALIE\nR4 PeiP1 S1\n(Exported :21/09/2022 15:34 + )\n +UID:ADE60506c616e6e696e67323032322d323032332d31393536302d312d30 +CREATED:19700101T000000Z +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 +END:VEVENT +BEGIN:VEVENT +DTSTAMP:20220921T133408Z +DTSTART:20221014T081500Z +DTEND:20221014T094500Z +SUMMARY:EP2 Electrostatique et électrocinétique TD Gr9 PEIP (Parcours MPI + -PEIP Maths) LOCATION:GR E1 2040 DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G - r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d3133 + r9 PEIP - (MPI)\nGERVALLE ROMAIN\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31343630302d31312d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T130000Z -DTEND:20221107T150000Z -SUMMARY:Anglais S1 A1 -LOCATION:STD 4 -DESCRIPTION:\n\nROUSSEAU CELINE\nA1 PeiP1 S1\n(Exported :20/09/2022 18:46 - )\n -UID:ADE60506c616e6e696e67323032322d323032332d3235352d302d37 +DTSTAMP:20220921T133408Z +DTSTART:20221024T061500Z +DTEND:20221024T081500Z +SUMMARY:DEE Sc_Ingé G1 +LOCATION:S Elec 1\,S Elec 2 +DESCRIPTION:\n\nR1 PeiP1 S1\nMAKRIS PASCAL\nBUSSEUIL REMI\n(Exported :21/ + 09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393539332d302d32 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220927T131500Z -DTEND:20220927T161500Z -SUMMARY:I1.1 Informatique 9B TP PEIP Physique/ Maths -LOCATION:GR L 0090 - Info -DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9B PEIP (MPI)\nL1 - Maths / Phy - sique Gr9B PEIP - (MPI)\nGOUBIN ANTHONY\n(Exported :20/09/2022 18:46)\n - -UID:ADE60506c616e6e696e67323032322d323032332d31333332362d302d3130 +DTSTAMP:20220921T133408Z +DTSTART:20221121T130000Z +DTEND:20221121T150000Z +SUMMARY:DAE Sc_Ingé G4 +LOCATION:DAE-214 Info +DESCRIPTION:\n\nR4 PeiP1 S1\nHACINI CHEMS EDDINE\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31393536302d332d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20220926T061500Z -DTEND:20220926T081500Z -SUMMARY:DEE Sc_Ingé G2 -LOCATION:S Elec 2\,S Elec 1 -DESCRIPTION:\n\nBUSSEUIL REMI\nR2 PeiP1 S1\nMAKRIS PASCAL\n(Exported :20/ - 09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393632382d302d32 +DTSTAMP:20220921T133408Z +DTSTART:20221012T113000Z +DTEND:20221012T130000Z +SUMMARY:EP1 Mécanique du point TD Gr9 (Parcours MPI-PEIP Maths ) +LOCATION:GR E1 2040 +DESCRIPTION:\nyannick herfray\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Mat + hs / Physique Gr9 PEIP - (MPI)\nHERFRAY YANNICK\n(Exported :21/09/2022 1 + 5:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333436382d392d30 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221107T071500Z -DTEND:20221107T091500Z -SUMMARY:DI Sc_Ingé G4 -LOCATION:230 (Unix A) -DESCRIPTION:\n\nR4 PeiP1 S1\nMONMARCHE NICOLAS\n(Exported :20/09/2022 18: - 46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393735302d302d31 +DTSTAMP:20220921T133408Z +DTSTART:20220922T063000Z +DTEND:20220922T093000Z +SUMMARY:I1.1 Informatique 9A TP PEIP Physique / Maths +LOCATION:Polytech +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9A PEIP (MPI)\nL1 - Maths / Phy + sique Gr9A PEIP - (MPI)\nBILLAUT JEAN-CHARLES\n(Exported :21/09/2022 15 + :34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333332352d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT BEGIN:VEVENT -DTSTAMP:20220920T164622Z -DTSTART:20221121T093000Z -DTEND:20221121T113000Z -SUMMARY:DMS Sc_Ingé G4 -LOCATION:S Info A -DESCRIPTION:\n\nR4 PeiP1 S1\nMOFID WAFAA\n(Exported :20/09/2022 18:46)\n -UID:ADE60506c616e6e696e67323032322d323032332d31393930342d302d33 +DTSTAMP:20220921T133408Z +DTSTART:20221208T123000Z +DTEND:20221208T140000Z +SUMMARY:Raisonnement TD Gr9 (Parcours MPI - PEIP Maths) +LOCATION:GR E1 2040 +DESCRIPTION:\n\nL1 Physique /Maths PEIP Gr9 PEIP\nL1 - Maths / Physique G + r9 PEIP - (MPI)\nLASCHON GILLES\n(Exported :21/09/2022 15:34)\n +UID:ADE60506c616e6e696e67323032322d323032332d31333536382d302d31 CREATED:19700101T000000Z -LAST-MODIFIED:20220920T164622Z -SEQUENCE:-2068599714 +LAST-MODIFIED:20220921T133408Z +SEQUENCE:-2068511248 END:VEVENT END:VCALENDAR diff --git a/__pycache__/ics_reader.cpython-310.pyc b/__pycache__/ics_reader.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d612e14a1e35048a85176e948d9e9fdae3f85a7 GIT binary patch literal 3968 zcmeHK&2JmW6`z@1lFJWKvLjm`PEzNijo8?vNQtCuq-h*WHdLf;5Gy$>l(Ng6S!t>L zpl4^Lh#-pqYI_J^z^9(cqyK@lhu(7OEd_epQ-PlNF9c}SH!FU~asdN%E&;lWeLMT! zoA)vA&Ehxy%uEKs_4iBfn$|Kx|CAr+F9kk6fG79@2t^b-$i+Iwa!efJD!SsTx*C5g zPC`!rUv-jhN>90(uDNMFJ(6Yg49FBGt7mC~CVz+Y98FOT-ZLyu(+7m#P9v5(K^U=Y zf0kwk;N?-7Di2X1Hw5pffFtG8ox24RX?G2WdDP%hV(XB3;z2=)65Fn^$D(xn+T_O3 zXn4=}gej+wFPTyjp1be_?*S2z79~`nDos3Adr06up~(U6;Vy0|o9OdYk91LA?UFd8 zIT$Af5GF+sTIxY3S1jGx+=7sbwi!hDsFMhVb#o)a85t_`OrP4`UX=3Kkz;$T^XuAnx;{$HE+@N4b!Tv(v4e&L915tRp)#Z<>`g%dD@l^;M%*u{KO*td*;@ z&M2#ytL3%&jdCFwseYSzk;d7hkOd-$lszUQRj@BalsV$IU^4L_N|=rxu!5rJAceSq z_iTqn3I~}gRh}X~4;A^YY~J4eG+;c~-4FMCzWXbWZF2jN?S2??W`w&B&3(2DtKEPv z%6PGT9L3&AG^nmoz-9$e-K%3}^ z^7)^7nQo?)lP&&4;r|e7OYP5eGyOcx3~+09fJYqYxP!zCHSk1Z?z|0}1?z-gqq$y| zo>|Wi@FC(3o$X~kC5`AMkX#m*y2=S&K=E9uf%zZkE5KDRav!aT%XIz(HlesY)|Ovg zt@R4M0{7La|Ni^{wXV>GMKq5V5M8_=xk{Io&m_x}dDmp_|8?F}GMQ(o-7J0eF@abX zrm@i14%8=@ry-(6`a0bILqrxC+k>CeYriK;i2evxCrz)@Hy*=p&0G0?tWPbDGI(=< zPw*&%*2u?OFOdP*dqD;-X?>c(DB8DQBHAAhaDR#Z1Y&+?>D+3MERTC@+6fnXYbu%a z2who37J*Kl?5t6D6&4Vz^iLPibF!$<*o<8qWghbly}N&zr8tqm_8q-57V$ zA%dN_LT|#pdz%)Y;jYmVaF^)nGu-!S8Mt{`d4{`9*G4+=g=A9O{(J|Rm|H+9F`a|}C(QbFjt20t#S7gV^^3pF4Q&BnI3_svsKk-Q6f5xx`Q z`fYR_QNhG!%z9q>l5c@005@5LixCH=OwQR>3O4K{N2c)AEi^Z{v z*w2I%h^|_Io%uVU7io@f8p8Iyp(p45QS!2s1tz!KlFcRD8vg6_^mMo)N8l8Fhi`Y3 z>o>3KxlbTz-}9IYSRK5*3Bofn@uo{iZ-!17fLt!&@UK!yW) zlN{c}%UA_Y5)*jeAOvel9{-lilV9VHM^q<&CaN+AI_Dp$uaW0k literal 0 HcmV?d00001 diff --git a/sche.py b/sche.py index adab8eb..67a6968 100644 --- a/sche.py +++ b/sche.py @@ -29,11 +29,12 @@ async def on_ready(self): bot = abot() tree = app_commands.CommandTree(bot) +tree ##Commands @tree.command(name='timetable', description="Show the timetable of the day.", guilds=[discord.Object(id=972500345815195700)]) -@app_commands.checks.has_permissions(manage_guild=True) +@app_commands.checks.has_permissions(send_messages=True) @app_commands.choices(month = [ Choice(name='Janvier', value='1'), Choice(name='Fevrier', value='2'), @@ -49,7 +50,7 @@ async def on_ready(self): Choice(name='Décembre', value='12'), ]) -async def self(interaction: discord.Interaction, day: str, month: str, year: str, englishgroup: str, sigroup: str): +async def timetable(interaction: discord.Interaction, day: str, month: str, year: str, englishgroup: str, sigroup: str): if int(day) < 1 or int(day) > 31: await interaction.response.send_message("The day is not valid.", ephemeral=True) else: @@ -59,6 +60,14 @@ async def self(interaction: discord.Interaction, day: str, month: str, year: str except ValueError: await interaction.response.send_message("Wrong date", ephemeral=True) +@tree.command(name="setup", description="Setup the bot for timetable of the day, every day.", guilds=[discord.Object(id=972500345815195700)]) +@app_commands.checks.has_permissions(manage_guild=True) + +async def setup(interaction: discord.Interaction): + await interaction.response.send_message("Setup the bot for timetable of the day, every day.", ephemeral=True) + dateofday = datetime.datetime.now() + print(dateofday) + ##Error From 8ca774dfa7cc86f992d61b3305203a9e96592398 Mon Sep 17 00:00:00 2001 From: "Hugo.M" Date: Wed, 21 Sep 2022 17:31:22 +0200 Subject: [PATCH 02/53] Bot update (version = 1.0.0) --- cogs/setup.py | 26 +++++++++++ cogs/timetable.py | 48 ++++++++++++++++++++ image.jpg | Bin 2449 -> 0 bytes sche.py | 113 ++++++++++------------------------------------ 4 files changed, 99 insertions(+), 88 deletions(-) create mode 100644 cogs/setup.py create mode 100644 cogs/timetable.py delete mode 100644 image.jpg diff --git a/cogs/setup.py b/cogs/setup.py new file mode 100644 index 0000000..2940a91 --- /dev/null +++ b/cogs/setup.py @@ -0,0 +1,26 @@ +import discord +from discord.ext import commands +from discord import app_commands +import datetime +import time + +class setup(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @app_commands.command(name="setup", description="Setup the bot for timetable of the day, every day.", guilds=[discord.Object(id=972500345815195700)]) + @app_commands.checks.has_permissions(manage_guild=True) + async def setup(self, interaction: discord.Interaction): + dateofday = datetime.datetime.now() + await interaction.response.send_message("Setup the bot for timetable of the day, every day.", ephemeral=True) + await interaction.response.send_message(file=discord.File('./calendar.png'), ephemeral=True) + while True: + dateofday = datetime.datetime.now() + if dateofday.hour == 19 and dateofday.minute >= 0 and dateofday.minute <= 5: + await interaction.response.send_message(file=discord.File('./calendar.png'), ephemeral=True) + time.sleep(60*60*24) + else: + time.sleep(60*60*(19-dateofday.hour)+60*(60-dateofday.minute)+60-dateofday.second) + +def setup(bot): + bot.add_cog(setup(bot), guilds=[discord.Object(id=972500345815195700)]) \ No newline at end of file diff --git a/cogs/timetable.py b/cogs/timetable.py new file mode 100644 index 0000000..90f8108 --- /dev/null +++ b/cogs/timetable.py @@ -0,0 +1,48 @@ +import discord +from discord.ext import commands +from discord import app_commands +from discord.app_commands import Choice +import ics_reader + +class TimeTable(commands.Cog): + def __init__(self, bot: commands.Bot): + self.bot = bot + + @commands.Cog.listener() + async def on_ready(self): + print("TimeTable cog is ready.") + + @commands.commands() + async def sync(self, ctx) -> None: + fat = await ctx.bot.tree.sync(guild=ctx.guild) + + await ctx.send(f"Synced {len(fat)} commands.") + + @app_commands.command(name='timetable', description="Show the timetable of the day.", guilds=[discord.Object(id=972500345815195700)]) + @app_commands.checks.has_permissions(send_messages=True) + @app_commands.choices(month = [ + Choice(name='Janvier', value='1'), + Choice(name='Fevrier', value='2'), + Choice(name='Mars', value='3'), + Choice(name='Avril', value='4'), + Choice(name='Mai', value='5'), + Choice(name='Juin', value='6'), + Choice(name='Juillet', value='7'), + Choice(name='Août', value='8'), + Choice(name='Septembre', value='9'), + Choice(name='Octobre', value='10'), + Choice(name='Novembre', value='11'), + Choice(name='Décembre', value='12'), + ]) + async def timetable(self, interaction: discord.Interaction, day: str, month: str, year: str, englishgroup: str, sigroup: str): + if int(day) < 1 or int(day) > 31: + await interaction.response.send_message("The day is not valid.", ephemeral=True) + else: + try: + await ics_reader.getTimetable(year, month, day, englishgroup, sigroup) + await interaction.response.send_message(file=discord.File('./calendar.png'), ephemeral=True) + except ValueError: + await interaction.response.send_message("Wrong date", ephemeral=True) + + async def setup(bot): + await bot.add_cog(TimeTable(bot), guilds=[discord.Object(id=972500345815195700)]) \ No newline at end of file diff --git a/image.jpg b/image.jpg deleted file mode 100644 index 42c4dc6446d85f3710775e5770283cd1000a1554..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2449 zcmb7_XHe7W7RLWcAe7Lugx*7qKv)EpzCbV#ItHaGut+B$h`0+<6&49S0R#alCP+t$ zB2pyOuq+mch2Es2AWd<>+<5QIow*qTs#Nk$E*BuyC$b4I(KWM_~|6xp0&N zB94uMk2#M61!0w`h{T_Atr&Q~npLyO`rvN~R_1U73Yv-(0d*}y7$Q4#tm#+oOpFRQt04Rqc&}F zabdSD<7EG&QK3b5ZQAZ6M!hR+(C?|Iy{%?KNa*0r=(81f9MyTji7+iyws2}SQRM1_3F)tsqNNKHg)(OC zt2II0txVuT#Fffe1twsVYHv^*zdHNP{qxql)YvhI5@2gj=$}|}Lk9&_j&pAE-#Tzy z`%>Qa^gT*Pv~t8dvMwst(&441n=c_O4*MtU4bChQ~RVtbRlUzq?qV|nuG zpcsR==W@-DHgu!UM?*#+GMl?Crb?Ui<&V~7@?LXq{-8#^1ER?|ha+d${%+?3jB52m z?`~m-boNMJx<2lmNAvJW@4tV(WgI`EN#)NtUsW)VB&R)y(1tE9T}a%$T)yp(b|!R) zM*cOnN{@sUAIZAgX_$&O@wGc8G;FIMEJPVQEOmD-=hLR89{c;A`v;vv_T*BK&{|2V zC(m4!_8So5E3g6ezWOXBRMj7_c#RALelZa`%kwv5WoC9Pdq=$U> zyr5RbsUOdUF{0#N(M75&i<$|E%^7c{1i%0xjHR0+D<6+D{HO6ipsA-&nHz zR2zrlx_!H5liH{D=M%a9IfoY3inJW)on{SYXJnkDNk%If1fFuasq6o2DtpUm_O@TU z^(%(b{OBcz5A~VBCaQ`|>1AS`d?T8?jZ-4o@`(|r+ zz|Hq_pW7~vxGa@u_D`+u&|J-)j28Vdjukt4e|5!;daM3^s4Km6T)f9v$TEFt0vTCg zIw#~d)@*NciJzPDB0`GWN6*&?;@ovaardvy>*aHn~4(_O|#i>a=k07dZ@+w?XgDr79m7lXBf8jEEi2TnpKs>U{7Tel$ijs5#K~5($aUn zsWsC>>;uToB@ZE>1L$=zyaDd3A-ep=b;}(%m-u81M7pm!D76dakJm+ve9E`WlyzVj-_u~PE4nyAat$*Vc!~*XiLwu zK?`LxzkA9e7T~4Tq#O0!E(t{MaI!Z{S8@4ThgR)L0lEU+8*M5&wcYdayK0|r=k><$ zjSxnNo9w`1Z2qe2*nV?Q7-ZkYndm>(B~0kQlMvd-D5~f64%|f$A3rK6$S62EQdglI zl(Y3Vvkapu&(s~`iwE3)*a>g}A8b1$qNmeE3X%Z7EqZ8Zf|iWzm)7m+66HTuT@OD; z_wkJ&UcrJswEScEFeC7?VdA_>*t`YE{PWfq51kO{E&Y*J&+723G_I$V>c>`rEoa8X z*?-U3t+lm7^i~vXu0M)G>1rQ0WONTFHn+N(M+;*DZTG}GPrIp36Fxgy?y+Jc&W~>x zb-b7go(LqclMRQ%Wk_4YSs$`IR;ur@T_ZYJqk_cx@F-&y3TW2)9#(}AgUqSQNqo)e zWE~{I3$w8?9r&(+&ukPP0{yd0E%e5hFoFDw6U)%i>QodZ# 31: - await interaction.response.send_message("The day is not valid.", ephemeral=True) - else: - try: - await ics_reader.getTimetable(year, month, day, englishgroup, sigroup) - await interaction.response.send_message(file=discord.File('./calendar.png'), ephemeral=True) - except ValueError: - await interaction.response.send_message("Wrong date", ephemeral=True) - -@tree.command(name="setup", description="Setup the bot for timetable of the day, every day.", guilds=[discord.Object(id=972500345815195700)]) -@app_commands.checks.has_permissions(manage_guild=True) - -async def setup(interaction: discord.Interaction): - await interaction.response.send_message("Setup the bot for timetable of the day, every day.", ephemeral=True) - dateofday = datetime.datetime.now() - print(dateofday) - - -##Error - -@tree.error -async def error_handler(interaction: discord.Interaction, error: Exception): - if isinstance(error, app_commands.CommandNotFound): - await interaction.response.send_message(f"Command not found.", ephemeral=True) - elif isinstance(error, app_commands.MissingPermissions): - await interaction.response.send_message(f"Missing permissions: {error.missing_permissions}", ephemeral=True) - elif isinstance(error, app_commands.CommandInvokeError): - channel_connected = bot.get_channel(1020707241243967538) - embed=discord.Embed(title=f"{bot.user.name} get an error !", description=f"Command invoke error for __/{interaction.command.name}__:,\n{error.original},\n\nin {interaction.guild.name}", color=0xED4245) - await channel_connected.send(embed=embed) - await interaction.response.send_message(f"Command invoke error: {error.original}", ephemeral=True) - elif isinstance(error, app_commands.BotMissingPermissions): - await interaction.response.send_message(f"Bot missing permissions: {error.missing_permissions}", ephemeral=True) - elif isinstance(error, app_commands.CommandOnCooldown): - await interaction.response.send_message(f"Command on cooldown: {error.retry_after}", ephemeral=True) - else: - await interaction.response.send_message(f"Error: {error}") - -##Run Bot - -bot.run(f"{token}") +@bot.event +async def on_ready(): + now = datetime.datetime.now() + dt_string = now.strftime("%d/%m/%Y %H:%M:%S") + channel_connected = bot.get_channel(972811106580058132) + embed=discord.Embed(title=f"{bot.user.name} is ready !", description=f"Up date: {dt_string},\n\nVersion: {version},\n{bot.user.name} by Rog#8698.", color=0x33DAFF) + await channel_connected.send(embed=embed) + print(f"{bot.user.name} is ready.") + +async def load_cogs(): + for filename in os.listdir('./cogs'): + if filename.endswith('.py'): + bot.load_extension(f'cogs.{filename[:-3]}') + +async def main(): + await load_cogs() + await bot.start("MTAyMDA0NzI1OTE1NDUzNDU2Mg.GPGJNa.yeqbFGCNogTDEYM-X2bOdCj7VStCLxcjeH3F4Q") + +asyncio.run(main()) \ No newline at end of file From 40459af8f6c3ed31e6edb1f96915c6fbb3bfcb37 Mon Sep 17 00:00:00 2001 From: "Hugo.M" Date: Thu, 22 Sep 2022 08:19:27 +0200 Subject: [PATCH 03/53] Sche v1.0.0 --- .../TatSu-5.8.3.dist-info/INSTALLER | 1 - .../TatSu-5.8.3.dist-info/LICENSE.txt | 36 - .../TatSu-5.8.3.dist-info/METADATA | 327 - .../TatSu-5.8.3.dist-info/RECORD | 160 - .../site-packages/TatSu-5.8.3.dist-info/WHEEL | 6 - .../TatSu-5.8.3.dist-info/entry_points.txt | 3 - .../TatSu-5.8.3.dist-info/top_level.txt | 2 - .../__pycache__/six.cpython-38.pyc | Bin 27472 -> 0 bytes .../site-packages/_distutils_hack/__init__.py | 128 - .../__pycache__/__init__.cpython-38.pyc | Bin 5124 -> 0 bytes .../__pycache__/override.cpython-38.pyc | Bin 236 -> 0 bytes .../site-packages/_distutils_hack/override.py | 1 - .../aiohttp-3.8.1.dist-info/INSTALLER | 1 - .../aiohttp-3.8.1.dist-info/LICENSE.txt | 13 - .../aiohttp-3.8.1.dist-info/METADATA | 255 - .../aiohttp-3.8.1.dist-info/RECORD | 123 - .../aiohttp-3.8.1.dist-info/WHEEL | 5 - .../aiohttp-3.8.1.dist-info/top_level.txt | 1 - .../aiohttp/.hash/_cparser.pxd.hash | 1 - .../aiohttp/.hash/_find_header.pxd.hash | 1 - .../aiohttp/.hash/_helpers.pyi.hash | 1 - .../aiohttp/.hash/_helpers.pyx.hash | 1 - .../aiohttp/.hash/_http_parser.pyx.hash | 1 - .../aiohttp/.hash/_http_writer.pyx.hash | 1 - .../aiohttp/.hash/_websocket.pyx.hash | 1 - .../site-packages/aiohttp/.hash/hdrs.py.hash | 1 - .venv/Lib/site-packages/aiohttp/__init__.py | 216 - .../__pycache__/__init__.cpython-38.pyc | Bin 3692 -> 0 bytes .../aiohttp/__pycache__/abc.cpython-38.pyc | Bin 8671 -> 0 bytes .../__pycache__/base_protocol.cpython-38.pyc | Bin 2647 -> 0 bytes .../aiohttp/__pycache__/client.cpython-38.pyc | Bin 29429 -> 0 bytes .../client_exceptions.cpython-38.pyc | Bin 11292 -> 0 bytes .../__pycache__/client_proto.cpython-38.pyc | Bin 6149 -> 0 bytes .../__pycache__/client_reqrep.cpython-38.pyc | Bin 27971 -> 0 bytes .../__pycache__/client_ws.cpython-38.pyc | Bin 8992 -> 0 bytes .../__pycache__/connector.cpython-38.pyc | Bin 35167 -> 0 bytes .../__pycache__/cookiejar.cpython-38.pyc | Bin 10653 -> 0 bytes .../__pycache__/formdata.cpython-38.pyc | Bin 4556 -> 0 bytes .../aiohttp/__pycache__/hdrs.cpython-38.pyc | Bin 5298 -> 0 bytes .../__pycache__/helpers.cpython-38.pyc | Bin 26000 -> 0 bytes .../aiohttp/__pycache__/http.cpython-38.pyc | Bin 1258 -> 0 bytes .../http_exceptions.cpython-38.pyc | Bin 4286 -> 0 bytes .../__pycache__/http_parser.cpython-38.pyc | Bin 17985 -> 0 bytes .../__pycache__/http_websocket.cpython-38.pyc | Bin 15164 -> 0 bytes .../__pycache__/http_writer.cpython-38.pyc | Bin 5616 -> 0 bytes .../aiohttp/__pycache__/locks.cpython-38.pyc | Bin 1636 -> 0 bytes .../aiohttp/__pycache__/log.cpython-38.pyc | Bin 457 -> 0 bytes .../__pycache__/multipart.cpython-38.pyc | Bin 26342 -> 0 bytes .../__pycache__/payload.cpython-38.pyc | Bin 13393 -> 0 bytes .../payload_streamer.cpython-38.pyc | Bin 3242 -> 0 bytes .../__pycache__/pytest_plugin.cpython-38.pyc | Bin 9886 -> 0 bytes .../__pycache__/resolver.cpython-38.pyc | Bin 4011 -> 0 bytes .../__pycache__/streams.cpython-38.pyc | Bin 18585 -> 0 bytes .../__pycache__/tcp_helpers.cpython-38.pyc | Bin 1122 -> 0 bytes .../__pycache__/test_utils.cpython-38.pyc | Bin 21513 -> 0 bytes .../__pycache__/tracing.cpython-38.pyc | Bin 15123 -> 0 bytes .../__pycache__/typedefs.cpython-38.pyc | Bin 1512 -> 0 bytes .../aiohttp/__pycache__/web.cpython-38.pyc | Bin 9975 -> 0 bytes .../__pycache__/web_app.cpython-38.pyc | Bin 15346 -> 0 bytes .../__pycache__/web_exceptions.cpython-38.pyc | Bin 12033 -> 0 bytes .../web_fileresponse.cpython-38.pyc | Bin 6056 -> 0 bytes .../__pycache__/web_log.cpython-38.pyc | Bin 7145 -> 0 bytes .../web_middlewares.cpython-38.pyc | Bin 3901 -> 0 bytes .../__pycache__/web_protocol.cpython-38.pyc | Bin 15876 -> 0 bytes .../__pycache__/web_request.cpython-38.pyc | Bin 23991 -> 0 bytes .../__pycache__/web_response.cpython-38.pyc | Bin 21255 -> 0 bytes .../__pycache__/web_routedef.cpython-38.pyc | Bin 7771 -> 0 bytes .../__pycache__/web_runner.cpython-38.pyc | Bin 11739 -> 0 bytes .../__pycache__/web_server.cpython-38.pyc | Bin 2777 -> 0 bytes .../web_urldispatcher.cpython-38.pyc | Bin 42216 -> 0 bytes .../aiohttp/__pycache__/web_ws.cpython-38.pyc | Bin 13449 -> 0 bytes .../aiohttp/__pycache__/worker.cpython-38.pyc | Bin 7053 -> 0 bytes .venv/Lib/site-packages/aiohttp/_cparser.pxd | 190 - .../Lib/site-packages/aiohttp/_find_header.c | 9870 ------- .../Lib/site-packages/aiohttp/_find_header.h | 14 - .../site-packages/aiohttp/_find_header.pxd | 2 - .venv/Lib/site-packages/aiohttp/_headers.pxi | 83 - .venv/Lib/site-packages/aiohttp/_helpers.c | 5467 ---- .../aiohttp/_helpers.cp38-win_amd64.pyd | Bin 48640 -> 0 bytes .venv/Lib/site-packages/aiohttp/_helpers.pyi | 6 - .venv/Lib/site-packages/aiohttp/_helpers.pyx | 35 - .../Lib/site-packages/aiohttp/_http_parser.c | 23880 ---------------- .../aiohttp/_http_parser.cp38-win_amd64.pyd | Bin 245248 -> 0 bytes .../site-packages/aiohttp/_http_parser.pyx | 818 - .../Lib/site-packages/aiohttp/_http_writer.c | 6047 ---- .../aiohttp/_http_writer.cp38-win_amd64.pyd | Bin 44544 -> 0 bytes .../site-packages/aiohttp/_http_writer.pyx | 163 - .venv/Lib/site-packages/aiohttp/_websocket.c | 3622 --- .../aiohttp/_websocket.cp38-win_amd64.pyd | Bin 28672 -> 0 bytes .../Lib/site-packages/aiohttp/_websocket.pyx | 56 - .venv/Lib/site-packages/aiohttp/abc.py | 207 - .../site-packages/aiohttp/base_protocol.py | 87 - .venv/Lib/site-packages/aiohttp/client.py | 1302 - .../aiohttp/client_exceptions.py | 342 - .../Lib/site-packages/aiohttp/client_proto.py | 251 - .../site-packages/aiohttp/client_reqrep.py | 1133 - .venv/Lib/site-packages/aiohttp/client_ws.py | 300 - .venv/Lib/site-packages/aiohttp/connector.py | 1449 - .venv/Lib/site-packages/aiohttp/cookiejar.py | 413 - .venv/Lib/site-packages/aiohttp/formdata.py | 172 - .venv/Lib/site-packages/aiohttp/hdrs.py | 114 - .venv/Lib/site-packages/aiohttp/helpers.py | 875 - .venv/Lib/site-packages/aiohttp/http.py | 72 - .../site-packages/aiohttp/http_exceptions.py | 105 - .../Lib/site-packages/aiohttp/http_parser.py | 956 - .../site-packages/aiohttp/http_websocket.py | 701 - .../Lib/site-packages/aiohttp/http_writer.py | 200 - .venv/Lib/site-packages/aiohttp/locks.py | 41 - .venv/Lib/site-packages/aiohttp/log.py | 8 - .venv/Lib/site-packages/aiohttp/multipart.py | 963 - .venv/Lib/site-packages/aiohttp/payload.py | 465 - .../site-packages/aiohttp/payload_streamer.py | 75 - .venv/Lib/site-packages/aiohttp/py.typed | 1 - .../site-packages/aiohttp/pytest_plugin.py | 391 - .venv/Lib/site-packages/aiohttp/resolver.py | 160 - .venv/Lib/site-packages/aiohttp/streams.py | 660 - .../Lib/site-packages/aiohttp/tcp_helpers.py | 38 - .venv/Lib/site-packages/aiohttp/test_utils.py | 698 - .venv/Lib/site-packages/aiohttp/tracing.py | 472 - .venv/Lib/site-packages/aiohttp/typedefs.py | 64 - .venv/Lib/site-packages/aiohttp/web.py | 586 - .venv/Lib/site-packages/aiohttp/web_app.py | 557 - .../site-packages/aiohttp/web_exceptions.py | 441 - .../site-packages/aiohttp/web_fileresponse.py | 288 - .venv/Lib/site-packages/aiohttp/web_log.py | 208 - .../site-packages/aiohttp/web_middlewares.py | 119 - .../Lib/site-packages/aiohttp/web_protocol.py | 681 - .../Lib/site-packages/aiohttp/web_request.py | 874 - .../Lib/site-packages/aiohttp/web_response.py | 825 - .../Lib/site-packages/aiohttp/web_routedef.py | 213 - .venv/Lib/site-packages/aiohttp/web_runner.py | 381 - .venv/Lib/site-packages/aiohttp/web_server.py | 62 - .../aiohttp/web_urldispatcher.py | 1220 - .venv/Lib/site-packages/aiohttp/web_ws.py | 487 - .venv/Lib/site-packages/aiohttp/worker.py | 269 - .../aiosignal-1.2.0.dist-info/INSTALLER | 1 - .../aiosignal-1.2.0.dist-info/LICENSE | 201 - .../aiosignal-1.2.0.dist-info/METADATA | 208 - .../aiosignal-1.2.0.dist-info/RECORD | 10 - .../aiosignal-1.2.0.dist-info/WHEEL | 5 - .../aiosignal-1.2.0.dist-info/top_level.txt | 1 - .venv/Lib/site-packages/aiosignal/__init__.py | 36 - .../Lib/site-packages/aiosignal/__init__.pyi | 12 - .../__pycache__/__init__.cpython-38.pyc | Bin 1333 -> 0 bytes .venv/Lib/site-packages/aiosignal/py.typed | 0 .../arrow-1.2.3.dist-info/INSTALLER | 1 - .../arrow-1.2.3.dist-info/LICENSE | 201 - .../arrow-1.2.3.dist-info/METADATA | 163 - .../arrow-1.2.3.dist-info/RECORD | 27 - .../site-packages/arrow-1.2.3.dist-info/WHEEL | 5 - .../arrow-1.2.3.dist-info/top_level.txt | 1 - .venv/Lib/site-packages/arrow/__init__.py | 39 - .../arrow/__pycache__/__init__.cpython-38.pyc | Bin 829 -> 0 bytes .../arrow/__pycache__/_version.cpython-38.pyc | Bin 196 -> 0 bytes .../arrow/__pycache__/api.cpython-38.pyc | Bin 2831 -> 0 bytes .../arrow/__pycache__/arrow.cpython-38.pyc | Bin 52229 -> 0 bytes .../__pycache__/constants.cpython-38.pyc | Bin 2248 -> 0 bytes .../arrow/__pycache__/factory.cpython-38.pyc | Bin 9240 -> 0 bytes .../__pycache__/formatter.cpython-38.pyc | Bin 4208 -> 0 bytes .../arrow/__pycache__/locales.cpython-38.pyc | Bin 108781 -> 0 bytes .../arrow/__pycache__/parser.cpython-38.pyc | Bin 14735 -> 0 bytes .../arrow/__pycache__/util.cpython-38.pyc | Bin 3709 -> 0 bytes .venv/Lib/site-packages/arrow/_version.py | 1 - .venv/Lib/site-packages/arrow/api.py | 126 - .venv/Lib/site-packages/arrow/arrow.py | 1886 -- .venv/Lib/site-packages/arrow/constants.py | 177 - .venv/Lib/site-packages/arrow/factory.py | 348 - .venv/Lib/site-packages/arrow/formatter.py | 152 - .venv/Lib/site-packages/arrow/locales.py | 6475 ----- .venv/Lib/site-packages/arrow/parser.py | 779 - .venv/Lib/site-packages/arrow/py.typed | 0 .venv/Lib/site-packages/arrow/util.py | 117 - .../async_timeout-4.0.2.dist-info/INSTALLER | 1 - .../async_timeout-4.0.2.dist-info/LICENSE | 13 - .../async_timeout-4.0.2.dist-info/METADATA | 133 - .../async_timeout-4.0.2.dist-info/RECORD | 10 - .../async_timeout-4.0.2.dist-info/WHEEL | 5 - .../top_level.txt | 1 - .../async_timeout-4.0.2.dist-info/zip-safe | 1 - .../site-packages/async_timeout/__init__.py | 247 - .../__pycache__/__init__.cpython-38.pyc | Bin 6881 -> 0 bytes .../Lib/site-packages/async_timeout/py.typed | 1 - .venv/Lib/site-packages/attr/__init__.py | 79 - .venv/Lib/site-packages/attr/__init__.pyi | 486 - .../attr/__pycache__/__init__.cpython-38.pyc | Bin 1715 -> 0 bytes .../attr/__pycache__/_cmp.cpython-38.pyc | Bin 3773 -> 0 bytes .../attr/__pycache__/_compat.cpython-38.pyc | Bin 4242 -> 0 bytes .../attr/__pycache__/_config.cpython-38.pyc | Bin 994 -> 0 bytes .../attr/__pycache__/_funcs.cpython-38.pyc | Bin 10278 -> 0 bytes .../attr/__pycache__/_make.cpython-38.pyc | Bin 72609 -> 0 bytes .../attr/__pycache__/_next_gen.cpython-38.pyc | Bin 4968 -> 0 bytes .../__pycache__/_version_info.cpython-38.pyc | Bin 2322 -> 0 bytes .../__pycache__/converters.cpython-38.pyc | Bin 3547 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 3146 -> 0 bytes .../attr/__pycache__/filters.cpython-38.pyc | Bin 1625 -> 0 bytes .../attr/__pycache__/setters.cpython-38.pyc | Bin 1518 -> 0 bytes .../__pycache__/validators.cpython-38.pyc | Bin 16862 -> 0 bytes .venv/Lib/site-packages/attr/_cmp.py | 155 - .venv/Lib/site-packages/attr/_cmp.pyi | 13 - .venv/Lib/site-packages/attr/_compat.py | 185 - .venv/Lib/site-packages/attr/_config.py | 31 - .venv/Lib/site-packages/attr/_funcs.py | 420 - .venv/Lib/site-packages/attr/_make.py | 3006 -- .venv/Lib/site-packages/attr/_next_gen.py | 220 - .venv/Lib/site-packages/attr/_version_info.py | 86 - .../Lib/site-packages/attr/_version_info.pyi | 9 - .venv/Lib/site-packages/attr/converters.py | 144 - .venv/Lib/site-packages/attr/converters.pyi | 13 - .venv/Lib/site-packages/attr/exceptions.py | 92 - .venv/Lib/site-packages/attr/exceptions.pyi | 17 - .venv/Lib/site-packages/attr/filters.py | 51 - .venv/Lib/site-packages/attr/filters.pyi | 6 - .venv/Lib/site-packages/attr/py.typed | 0 .venv/Lib/site-packages/attr/setters.py | 73 - .venv/Lib/site-packages/attr/setters.pyi | 19 - .venv/Lib/site-packages/attr/validators.py | 594 - .venv/Lib/site-packages/attr/validators.pyi | 80 - .../attrs-22.1.0.dist-info/AUTHORS.rst | 11 - .../attrs-22.1.0.dist-info/INSTALLER | 1 - .../attrs-22.1.0.dist-info/LICENSE | 21 - .../attrs-22.1.0.dist-info/METADATA | 240 - .../attrs-22.1.0.dist-info/RECORD | 56 - .../attrs-22.1.0.dist-info/WHEEL | 6 - .../attrs-22.1.0.dist-info/top_level.txt | 2 - .venv/Lib/site-packages/attrs/__init__.py | 70 - .venv/Lib/site-packages/attrs/__init__.pyi | 66 - .../attrs/__pycache__/__init__.cpython-38.pyc | Bin 1198 -> 0 bytes .../__pycache__/converters.cpython-38.pyc | Bin 209 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 209 -> 0 bytes .../attrs/__pycache__/filters.cpython-38.pyc | Bin 203 -> 0 bytes .../attrs/__pycache__/setters.cpython-38.pyc | Bin 203 -> 0 bytes .../__pycache__/validators.cpython-38.pyc | Bin 209 -> 0 bytes .venv/Lib/site-packages/attrs/converters.py | 3 - .venv/Lib/site-packages/attrs/exceptions.py | 3 - .venv/Lib/site-packages/attrs/filters.py | 3 - .venv/Lib/site-packages/attrs/py.typed | 0 .venv/Lib/site-packages/attrs/setters.py | 3 - .venv/Lib/site-packages/attrs/validators.py | 3 - .../INSTALLER | 1 - .../LICENSE | 21 - .../METADATA | 269 - .../charset_normalizer-2.1.1.dist-info/RECORD | 33 - .../charset_normalizer-2.1.1.dist-info/WHEEL | 5 - .../entry_points.txt | 2 - .../top_level.txt | 1 - .../charset_normalizer/__init__.py | 56 - .../__pycache__/__init__.cpython-38.pyc | Bin 1724 -> 0 bytes .../__pycache__/api.cpython-38.pyc | Bin 11071 -> 0 bytes .../__pycache__/cd.cpython-38.pyc | Bin 8640 -> 0 bytes .../__pycache__/constant.cpython-38.pyc | Bin 14109 -> 0 bytes .../__pycache__/legacy.cpython-38.pyc | Bin 3022 -> 0 bytes .../__pycache__/md.cpython-38.pyc | Bin 14726 -> 0 bytes .../__pycache__/models.cpython-38.pyc | Bin 13221 -> 0 bytes .../__pycache__/utils.cpython-38.pyc | Bin 9134 -> 0 bytes .../__pycache__/version.cpython-38.pyc | Bin 272 -> 0 bytes .../site-packages/charset_normalizer/api.py | 584 - .../charset_normalizer/assets/__init__.py | 1122 - .../__pycache__/__init__.cpython-38.pyc | Bin 7822 -> 0 bytes .../site-packages/charset_normalizer/cd.py | 339 - .../charset_normalizer/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-38.pyc | Bin 192 -> 0 bytes .../cli/__pycache__/normalizer.cpython-38.pyc | Bin 6293 -> 0 bytes .../charset_normalizer/cli/normalizer.py | 295 - .../charset_normalizer/constant.py | 497 - .../charset_normalizer/legacy.py | 95 - .../site-packages/charset_normalizer/md.py | 553 - .../charset_normalizer/models.py | 401 - .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 424 - .../charset_normalizer/version.py | 6 - .venv/Lib/site-packages/dateutil/__init__.py | 8 - .../__pycache__/__init__.cpython-38.pyc | Bin 383 -> 0 bytes .../__pycache__/_common.cpython-38.pyc | Bin 1429 -> 0 bytes .../__pycache__/_version.cpython-38.pyc | Bin 233 -> 0 bytes .../__pycache__/easter.cpython-38.pyc | Bin 2194 -> 0 bytes .../__pycache__/relativedelta.cpython-38.pyc | Bin 14907 -> 0 bytes .../dateutil/__pycache__/rrule.cpython-38.pyc | Bin 43561 -> 0 bytes .../dateutil/__pycache__/tzwin.cpython-38.pyc | Bin 198 -> 0 bytes .../dateutil/__pycache__/utils.cpython-38.pyc | Bin 2266 -> 0 bytes .venv/Lib/site-packages/dateutil/_common.py | 43 - .venv/Lib/site-packages/dateutil/_version.py | 5 - .venv/Lib/site-packages/dateutil/easter.py | 89 - .../site-packages/dateutil/parser/__init__.py | 61 - .../__pycache__/__init__.cpython-38.pyc | Bin 2081 -> 0 bytes .../parser/__pycache__/_parser.cpython-38.pyc | Bin 40806 -> 0 bytes .../__pycache__/isoparser.cpython-38.pyc | Bin 11282 -> 0 bytes .../site-packages/dateutil/parser/_parser.py | 1613 -- .../dateutil/parser/isoparser.py | 416 - .../site-packages/dateutil/relativedelta.py | 599 - .venv/Lib/site-packages/dateutil/rrule.py | 1737 -- .../Lib/site-packages/dateutil/tz/__init__.py | 12 - .../tz/__pycache__/__init__.cpython-38.pyc | Bin 714 -> 0 bytes .../tz/__pycache__/_common.cpython-38.pyc | Bin 10757 -> 0 bytes .../tz/__pycache__/_factories.cpython-38.pyc | Bin 2868 -> 0 bytes .../dateutil/tz/__pycache__/tz.cpython-38.pyc | Bin 44891 -> 0 bytes .../tz/__pycache__/win.cpython-38.pyc | Bin 11262 -> 0 bytes .../Lib/site-packages/dateutil/tz/_common.py | 419 - .../site-packages/dateutil/tz/_factories.py | 80 - .venv/Lib/site-packages/dateutil/tz/tz.py | 1849 -- .venv/Lib/site-packages/dateutil/tz/win.py | 370 - .venv/Lib/site-packages/dateutil/tzwin.py | 2 - .venv/Lib/site-packages/dateutil/utils.py | 71 - .../dateutil/zoneinfo/__init__.py | 167 - .../__pycache__/__init__.cpython-38.pyc | Bin 5696 -> 0 bytes .../__pycache__/rebuild.cpython-38.pyc | Bin 2599 -> 0 bytes .../zoneinfo/dateutil-zoneinfo.tar.gz | Bin 174394 -> 0 bytes .../dateutil/zoneinfo/rebuild.py | 75 - .../discord-2.0.0.dist-info/INSTALLER | 1 - .../discord-2.0.0.dist-info/METADATA | 16 - .../discord-2.0.0.dist-info/RECORD | 6 - .../discord-2.0.0.dist-info/REQUESTED | 0 .../discord-2.0.0.dist-info/WHEEL | 5 - .../discord-2.0.0.dist-info/top_level.txt | 1 - .../discord.py-2.0.1.dist-info/INSTALLER | 1 - .../discord.py-2.0.1.dist-info/LICENSE | 21 - .../discord.py-2.0.1.dist-info/METADATA | 166 - .../discord.py-2.0.1.dist-info/RECORD | 239 - .../discord.py-2.0.1.dist-info/WHEEL | 5 - .../discord.py-2.0.1.dist-info/top_level.txt | 1 - .venv/Lib/site-packages/discord/__init__.py | 85 - .venv/Lib/site-packages/discord/__main__.py | 351 - .../__pycache__/__init__.cpython-38.pyc | Bin 2042 -> 0 bytes .../__pycache__/__main__.cpython-38.pyc | Bin 10084 -> 0 bytes .../discord/__pycache__/abc.cpython-38.pyc | Bin 57947 -> 0 bytes .../__pycache__/activity.cpython-38.pyc | Bin 26147 -> 0 bytes .../__pycache__/appinfo.cpython-38.pyc | Bin 9724 -> 0 bytes .../discord/__pycache__/asset.cpython-38.pyc | Bin 15591 -> 0 bytes .../__pycache__/audit_logs.cpython-38.pyc | Bin 26080 -> 0 bytes .../__pycache__/automod.cpython-38.pyc | Bin 19927 -> 0 bytes .../__pycache__/backoff.cpython-38.pyc | Bin 4152 -> 0 bytes .../__pycache__/channel.cpython-38.pyc | Bin 96784 -> 0 bytes .../discord/__pycache__/client.cpython-38.pyc | Bin 62844 -> 0 bytes .../discord/__pycache__/colour.cpython-38.pyc | Bin 14961 -> 0 bytes .../__pycache__/components.cpython-38.pyc | Bin 16013 -> 0 bytes .../context_managers.cpython-38.pyc | Bin 3621 -> 0 bytes .../discord/__pycache__/embeds.cpython-38.pyc | Bin 21190 -> 0 bytes .../discord/__pycache__/emoji.cpython-38.pyc | Bin 9521 -> 0 bytes .../discord/__pycache__/enums.cpython-38.pyc | Bin 22371 -> 0 bytes .../discord/__pycache__/errors.cpython-38.pyc | Bin 9933 -> 0 bytes .../discord/__pycache__/file.cpython-38.pyc | Bin 5046 -> 0 bytes .../discord/__pycache__/flags.cpython-38.pyc | Bin 55475 -> 0 bytes .../__pycache__/gateway.cpython-38.pyc | Bin 29526 -> 0 bytes .../discord/__pycache__/guild.cpython-38.pyc | Bin 126116 -> 0 bytes .../discord/__pycache__/http.cpython-38.pyc | Bin 68501 -> 0 bytes .../__pycache__/integrations.cpython-38.pyc | Bin 13431 -> 0 bytes .../__pycache__/interactions.cpython-38.pyc | Bin 34655 -> 0 bytes .../discord/__pycache__/invite.cpython-38.pyc | Bin 18953 -> 0 bytes .../discord/__pycache__/member.cpython-38.pyc | Bin 37264 -> 0 bytes .../__pycache__/mentions.cpython-38.pyc | Bin 5848 -> 0 bytes .../__pycache__/message.cpython-38.pyc | Bin 72766 -> 0 bytes .../discord/__pycache__/mixins.cpython-38.pyc | Bin 2061 -> 0 bytes .../discord/__pycache__/object.cpython-38.pyc | Bin 4250 -> 0 bytes .../__pycache__/oggparse.cpython-38.pyc | Bin 4005 -> 0 bytes .../discord/__pycache__/opus.cpython-38.pyc | Bin 14954 -> 0 bytes .../__pycache__/partial_emoji.cpython-38.pyc | Bin 8678 -> 0 bytes .../__pycache__/permissions.cpython-38.pyc | Bin 30100 -> 0 bytes .../discord/__pycache__/player.cpython-38.pyc | Bin 25665 -> 0 bytes .../__pycache__/raw_models.cpython-38.pyc | Bin 17252 -> 0 bytes .../__pycache__/reaction.cpython-38.pyc | Bin 8617 -> 0 bytes .../discord/__pycache__/role.cpython-38.pyc | Bin 16775 -> 0 bytes .../scheduled_event.cpython-38.pyc | Bin 18663 -> 0 bytes .../discord/__pycache__/shard.cpython-38.pyc | Bin 19931 -> 0 bytes .../__pycache__/stage_instance.cpython-38.pyc | Bin 6579 -> 0 bytes .../discord/__pycache__/state.cpython-38.pyc | Bin 59899 -> 0 bytes .../__pycache__/sticker.cpython-38.pyc | Bin 17401 -> 0 bytes .../discord/__pycache__/team.cpython-38.pyc | Bin 5298 -> 0 bytes .../__pycache__/template.cpython-38.pyc | Bin 10628 -> 0 bytes .../__pycache__/threads.cpython-38.pyc | Bin 28544 -> 0 bytes .../discord/__pycache__/user.cpython-38.pyc | Bin 16825 -> 0 bytes .../discord/__pycache__/utils.cpython-38.pyc | Bin 41325 -> 0 bytes .../__pycache__/voice_client.cpython-38.pyc | Bin 22843 -> 0 bytes .../__pycache__/welcome_screen.cpython-38.pyc | Bin 7672 -> 0 bytes .../discord/__pycache__/widget.cpython-38.pyc | Bin 10710 -> 0 bytes .venv/Lib/site-packages/discord/abc.py | 1888 -- .venv/Lib/site-packages/discord/activity.py | 842 - .../discord/app_commands/__init__.py | 20 - .../__pycache__/__init__.cpython-38.pyc | Bin 590 -> 0 bytes .../__pycache__/checks.cpython-38.pyc | Bin 18660 -> 0 bytes .../__pycache__/commands.cpython-38.pyc | Bin 77058 -> 0 bytes .../__pycache__/errors.cpython-38.pyc | Bin 19820 -> 0 bytes .../__pycache__/models.cpython-38.pyc | Bin 36928 -> 0 bytes .../__pycache__/namespace.cpython-38.pyc | Bin 11309 -> 0 bytes .../__pycache__/transformers.cpython-38.pyc | Bin 29723 -> 0 bytes .../__pycache__/translator.cpython-38.pyc | Bin 11308 -> 0 bytes .../__pycache__/tree.cpython-38.pyc | Bin 38137 -> 0 bytes .../discord/app_commands/checks.py | 537 - .../discord/app_commands/commands.py | 2509 -- .../discord/app_commands/errors.py | 528 - .../discord/app_commands/models.py | 1091 - .../discord/app_commands/namespace.py | 258 - .../discord/app_commands/transformers.py | 871 - .../discord/app_commands/translator.py | 305 - .../discord/app_commands/tree.py | 1247 - .venv/Lib/site-packages/discord/appinfo.py | 315 - .venv/Lib/site-packages/discord/asset.py | 516 - .venv/Lib/site-packages/discord/audit_logs.py | 774 - .venv/Lib/site-packages/discord/automod.py | 540 - .venv/Lib/site-packages/discord/backoff.py | 108 - .../discord/bin/libopus-0.x64.dll | Bin 441856 -> 0 bytes .../discord/bin/libopus-0.x86.dll | Bin 366080 -> 0 bytes .venv/Lib/site-packages/discord/channel.py | 2848 -- .venv/Lib/site-packages/discord/client.py | 1980 -- .venv/Lib/site-packages/discord/colour.py | 401 - .venv/Lib/site-packages/discord/components.py | 528 - .../site-packages/discord/context_managers.py | 92 - .venv/Lib/site-packages/discord/embeds.py | 757 - .venv/Lib/site-packages/discord/emoji.py | 259 - .venv/Lib/site-packages/discord/enums.py | 741 - .venv/Lib/site-packages/discord/errors.py | 280 - .../discord/ext/commands/__init__.py | 21 - .../__pycache__/__init__.cpython-38.pyc | Bin 597 -> 0 bytes .../__pycache__/_types.cpython-38.pyc | Bin 2852 -> 0 bytes .../commands/__pycache__/bot.cpython-38.pyc | Bin 46348 -> 0 bytes .../commands/__pycache__/cog.cpython-38.pyc | Bin 23822 -> 0 bytes .../__pycache__/context.cpython-38.pyc | Bin 30194 -> 0 bytes .../__pycache__/converter.cpython-38.pyc | Bin 39117 -> 0 bytes .../__pycache__/cooldowns.cpython-38.pyc | Bin 10406 -> 0 bytes .../commands/__pycache__/core.cpython-38.pyc | Bin 74716 -> 0 bytes .../__pycache__/errors.cpython-38.pyc | Bin 42847 -> 0 bytes .../commands/__pycache__/flags.cpython-38.pyc | Bin 17170 -> 0 bytes .../commands/__pycache__/help.cpython-38.pyc | Bin 53593 -> 0 bytes .../__pycache__/hybrid.cpython-38.pyc | Bin 28083 -> 0 bytes .../__pycache__/parameters.cpython-38.pyc | Bin 7624 -> 0 bytes .../commands/__pycache__/view.cpython-38.pyc | Bin 5130 -> 0 bytes .../discord/ext/commands/_types.py | 73 - .../site-packages/discord/ext/commands/bot.py | 1497 - .../site-packages/discord/ext/commands/cog.py | 744 - .../discord/ext/commands/context.py | 880 - .../discord/ext/commands/converter.py | 1323 - .../discord/ext/commands/cooldowns.py | 285 - .../discord/ext/commands/core.py | 2586 -- .../discord/ext/commands/errors.py | 1226 - .../discord/ext/commands/flags.py | 618 - .../discord/ext/commands/help.py | 1565 - .../discord/ext/commands/hybrid.py | 920 - .../discord/ext/commands/parameters.py | 286 - .../discord/ext/commands/view.py | 196 - .../discord/ext/tasks/__init__.py | 826 - .../tasks/__pycache__/__init__.cpython-38.pyc | Bin 24728 -> 0 bytes .venv/Lib/site-packages/discord/file.py | 159 - .venv/Lib/site-packages/discord/flags.py | 1594 -- .venv/Lib/site-packages/discord/gateway.py | 1012 - .venv/Lib/site-packages/discord/guild.py | 3971 --- .venv/Lib/site-packages/discord/http.py | 2383 -- .../Lib/site-packages/discord/integrations.py | 420 - .../Lib/site-packages/discord/interactions.py | 1102 - .venv/Lib/site-packages/discord/invite.py | 564 - .venv/Lib/site-packages/discord/member.py | 1090 - .venv/Lib/site-packages/discord/mentions.py | 153 - .venv/Lib/site-packages/discord/message.py | 2147 -- .venv/Lib/site-packages/discord/mixins.py | 46 - .venv/Lib/site-packages/discord/object.py | 117 - .venv/Lib/site-packages/discord/oggparse.py | 117 - .venv/Lib/site-packages/discord/opus.py | 466 - .../site-packages/discord/partial_emoji.py | 262 - .../Lib/site-packages/discord/permissions.py | 840 - .venv/Lib/site-packages/discord/player.py | 751 - .venv/Lib/site-packages/discord/py.typed | 0 .venv/Lib/site-packages/discord/raw_models.py | 469 - .venv/Lib/site-packages/discord/reaction.py | 254 - .venv/Lib/site-packages/discord/role.py | 511 - .../site-packages/discord/scheduled_event.py | 586 - .venv/Lib/site-packages/discord/shard.py | 566 - .../site-packages/discord/stage_instance.py | 194 - .venv/Lib/site-packages/discord/state.py | 1740 -- .venv/Lib/site-packages/discord/sticker.py | 522 - .venv/Lib/site-packages/discord/team.py | 143 - .venv/Lib/site-packages/discord/template.py | 319 - .venv/Lib/site-packages/discord/threads.py | 845 - .../site-packages/discord/types/__init__.py | 10 - .../types/__pycache__/__init__.cpython-38.pyc | Bin 337 -> 0 bytes .../types/__pycache__/activity.cpython-38.pyc | Bin 4030 -> 0 bytes .../types/__pycache__/appinfo.cpython-38.pyc | Bin 3158 -> 0 bytes .../__pycache__/audit_log.cpython-38.pyc | Bin 8683 -> 0 bytes .../types/__pycache__/automod.cpython-38.pyc | Bin 5155 -> 0 bytes .../types/__pycache__/channel.cpython-38.pyc | Bin 5701 -> 0 bytes .../types/__pycache__/command.cpython-38.pyc | Bin 7609 -> 0 bytes .../__pycache__/components.cpython-38.pyc | Bin 3182 -> 0 bytes .../types/__pycache__/embed.cpython-38.pyc | Bin 3466 -> 0 bytes .../types/__pycache__/emoji.cpython-38.pyc | Bin 2154 -> 0 bytes .../types/__pycache__/gateway.cpython-38.pyc | Bin 12047 -> 0 bytes .../types/__pycache__/guild.cpython-38.pyc | Bin 6223 -> 0 bytes .../__pycache__/integration.cpython-38.pyc | Bin 3148 -> 0 bytes .../__pycache__/interactions.cpython-38.pyc | Bin 8675 -> 0 bytes .../types/__pycache__/invite.cpython-38.pyc | Bin 3646 -> 0 bytes .../types/__pycache__/member.cpython-38.pyc | Bin 2796 -> 0 bytes .../types/__pycache__/message.cpython-38.pyc | Bin 5291 -> 0 bytes .../types/__pycache__/role.cpython-38.pyc | Bin 2158 -> 0 bytes .../scheduled_event.cpython-38.pyc | Bin 4460 -> 0 bytes .../__pycache__/snowflake.cpython-38.pyc | Bin 1397 -> 0 bytes .../types/__pycache__/sticker.cpython-38.pyc | Bin 3267 -> 0 bytes .../types/__pycache__/team.cpython-38.pyc | Bin 2024 -> 0 bytes .../types/__pycache__/template.cpython-38.pyc | Bin 2164 -> 0 bytes .../types/__pycache__/threads.cpython-38.pyc | Bin 3248 -> 0 bytes .../types/__pycache__/user.cpython-38.pyc | Bin 2075 -> 0 bytes .../types/__pycache__/voice.cpython-38.pyc | Bin 3365 -> 0 bytes .../types/__pycache__/webhook.cpython-38.pyc | Bin 2823 -> 0 bytes .../__pycache__/welcome_screen.cpython-38.pyc | Bin 1983 -> 0 bytes .../types/__pycache__/widget.cpython-38.pyc | Bin 2750 -> 0 bytes .../site-packages/discord/types/activity.py | 105 - .../site-packages/discord/types/appinfo.py | 79 - .../site-packages/discord/types/audit_log.py | 307 - .../site-packages/discord/types/automod.py | 127 - .../site-packages/discord/types/channel.py | 153 - .../site-packages/discord/types/command.py | 218 - .../site-packages/discord/types/components.py | 83 - .../Lib/site-packages/discord/types/embed.py | 90 - .../Lib/site-packages/discord/types/emoji.py | 46 - .../site-packages/discord/types/gateway.py | 339 - .../Lib/site-packages/discord/types/guild.py | 169 - .../discord/types/integration.py | 82 - .../discord/types/interactions.py | 238 - .../Lib/site-packages/discord/types/invite.py | 93 - .../Lib/site-packages/discord/types/member.py | 65 - .../site-packages/discord/types/message.py | 136 - .venv/Lib/site-packages/discord/types/role.py | 50 - .../discord/types/scheduled_event.py | 111 - .../site-packages/discord/types/snowflake.py | 28 - .../site-packages/discord/types/sticker.py | 83 - .venv/Lib/site-packages/discord/types/team.py | 45 - .../site-packages/discord/types/template.py | 49 - .../site-packages/discord/types/threads.py | 79 - .venv/Lib/site-packages/discord/types/user.py | 48 - .../Lib/site-packages/discord/types/voice.py | 84 - .../site-packages/discord/types/webhook.py | 67 - .../discord/types/welcome_screen.py | 40 - .../Lib/site-packages/discord/types/widget.py | 65 - .../Lib/site-packages/discord/ui/__init__.py | 17 - .../ui/__pycache__/__init__.cpython-38.pyc | Bin 455 -> 0 bytes .../ui/__pycache__/button.cpython-38.pyc | Bin 10518 -> 0 bytes .../ui/__pycache__/item.cpython-38.pyc | Bin 5197 -> 0 bytes .../ui/__pycache__/modal.cpython-38.pyc | Bin 7176 -> 0 bytes .../ui/__pycache__/select.cpython-38.pyc | Bin 13503 -> 0 bytes .../ui/__pycache__/text_input.cpython-38.pyc | Bin 8682 -> 0 bytes .../ui/__pycache__/view.cpython-38.pyc | Bin 20926 -> 0 bytes .venv/Lib/site-packages/discord/ui/button.py | 295 - .venv/Lib/site-packages/discord/ui/item.py | 134 - .venv/Lib/site-packages/discord/ui/modal.py | 206 - .venv/Lib/site-packages/discord/ui/select.py | 364 - .../site-packages/discord/ui/text_input.py | 243 - .venv/Lib/site-packages/discord/ui/view.py | 657 - .venv/Lib/site-packages/discord/user.py | 497 - .venv/Lib/site-packages/discord/utils.py | 1299 - .../Lib/site-packages/discord/voice_client.py | 687 - .../site-packages/discord/webhook/__init__.py | 13 - .../__pycache__/__init__.cpython-38.pyc | Bin 373 -> 0 bytes .../webhook/__pycache__/async_.cpython-38.pyc | Bin 53594 -> 0 bytes .../webhook/__pycache__/sync.cpython-38.pyc | Bin 34593 -> 0 bytes .../site-packages/discord/webhook/async_.py | 1971 -- .../Lib/site-packages/discord/webhook/sync.py | 1212 - .../site-packages/discord/welcome_screen.py | 218 - .venv/Lib/site-packages/discord/widget.py | 323 - .../INSTALLER | 1 - .../LICENSE | 21 - .../METADATA | 220 - .../RECORD | 31 - .../REQUESTED | 0 .../WHEEL | 5 - .../top_level.txt | 1 - .../site-packages/discord_slash/__init__.py | 17 - .../__pycache__/__init__.cpython-38.pyc | Bin 750 -> 0 bytes .../__pycache__/client.cpython-38.pyc | Bin 44051 -> 0 bytes .../__pycache__/cog_ext.cpython-38.pyc | Bin 8305 -> 0 bytes .../__pycache__/const.cpython-38.pyc | Bin 285 -> 0 bytes .../__pycache__/context.cpython-38.pyc | Bin 13783 -> 0 bytes .../__pycache__/dpy_overrides.cpython-38.pyc | Bin 8185 -> 0 bytes .../__pycache__/error.cpython-38.pyc | Bin 3645 -> 0 bytes .../__pycache__/http.cpython-38.pyc | Bin 8702 -> 0 bytes .../__pycache__/model.cpython-38.pyc | Bin 21183 -> 0 bytes .../Lib/site-packages/discord_slash/client.py | 1428 - .../site-packages/discord_slash/cog_ext.py | 220 - .../Lib/site-packages/discord_slash/const.py | 5 - .../site-packages/discord_slash/context.py | 439 - .../discord_slash/dpy_overrides.py | 326 - .../Lib/site-packages/discord_slash/error.py | 90 - .venv/Lib/site-packages/discord_slash/http.py | 201 - .../Lib/site-packages/discord_slash/model.py | 656 - .../discord_slash/utils/__init__.py | 9 - .../utils/__pycache__/__init__.cpython-38.pyc | Bin 354 -> 0 bytes .../manage_commands.cpython-38.pyc | Bin 14920 -> 0 bytes .../manage_components.cpython-38.pyc | Bin 9244 -> 0 bytes .../discord_slash/utils/manage_commands.py | 405 - .../discord_slash/utils/manage_components.py | 288 - .../site-packages/distutils-precedence.pth | 1 - .../frozenlist-1.3.1.dist-info/INSTALLER | 1 - .../frozenlist-1.3.1.dist-info/LICENSE | 201 - .../frozenlist-1.3.1.dist-info/METADATA | 150 - .../frozenlist-1.3.1.dist-info/RECORD | 12 - .../frozenlist-1.3.1.dist-info/WHEEL | 5 - .../frozenlist-1.3.1.dist-info/top_level.txt | 1 - .../Lib/site-packages/frozenlist/__init__.py | 96 - .../Lib/site-packages/frozenlist/__init__.pyi | 47 - .../__pycache__/__init__.cpython-38.pyc | Bin 3285 -> 0 bytes .../frozenlist/_frozenlist.cp38-win_amd64.pyd | Bin 53760 -> 0 bytes .../site-packages/frozenlist/_frozenlist.pyx | 123 - .venv/Lib/site-packages/frozenlist/py.typed | 1 - .../icalendar-4.1.0.dist-info/INSTALLER | 1 - .../icalendar-4.1.0.dist-info/LICENSE.rst | 26 - .../icalendar-4.1.0.dist-info/METADATA | 891 - .../icalendar-4.1.0.dist-info/RECORD | 74 - .../icalendar-4.1.0.dist-info/REQUESTED | 0 .../icalendar-4.1.0.dist-info/WHEEL | 6 - .../entry_points.txt | 2 - .../icalendar-4.1.0.dist-info/top_level.txt | 1 - .venv/Lib/site-packages/icalendar/__init__.py | 49 - .../__pycache__/__init__.cpython-38.pyc | Bin 955 -> 0 bytes .../icalendar/__pycache__/cal.cpython-38.pyc | Bin 17864 -> 0 bytes .../__pycache__/caselessdict.cpython-38.pyc | Bin 5221 -> 0 bytes .../icalendar/__pycache__/cli.cpython-38.pyc | Bin 3214 -> 0 bytes .../__pycache__/compat.cpython-38.pyc | Bin 550 -> 0 bytes .../__pycache__/parser.cpython-38.pyc | Bin 10857 -> 0 bytes .../__pycache__/parser_tools.cpython-38.pyc | Bin 1061 -> 0 bytes .../icalendar/__pycache__/prop.cpython-38.pyc | Bin 30668 -> 0 bytes .../__pycache__/timezone_cache.cpython-38.pyc | Bin 203 -> 0 bytes .../__pycache__/tools.cpython-38.pyc | Bin 1562 -> 0 bytes .../windows_to_olson.cpython-38.pyc | Bin 5382 -> 0 bytes .venv/Lib/site-packages/icalendar/cal.py | 699 - .../site-packages/icalendar/caselessdict.py | 107 - .venv/Lib/site-packages/icalendar/cli.py | 111 - .venv/Lib/site-packages/icalendar/compat.py | 12 - .venv/Lib/site-packages/icalendar/parser.py | 399 - .../site-packages/icalendar/parser_tools.py | 34 - .venv/Lib/site-packages/icalendar/prop.py | 1045 - .../site-packages/icalendar/tests/__init__.py | 0 .../tests/__pycache__/__init__.cpython-38.pyc | Bin 185 -> 0 bytes .../__pycache__/test_encoding.cpython-38.pyc | Bin 3007 -> 0 bytes .../test_fixed_issues.cpython-38.pyc | Bin 14632 -> 0 bytes .../__pycache__/test_icalendar.cpython-38.pyc | Bin 7998 -> 0 bytes .../__pycache__/test_multiple.cpython-38.pyc | Bin 1398 -> 0 bytes .../test_property_params.cpython-38.pyc | Bin 6094 -> 0 bytes .../test_recurrence.cpython-38.pyc | Bin 1827 -> 0 bytes .../__pycache__/test_time.cpython-38.pyc | Bin 1513 -> 0 bytes .../__pycache__/test_timezoned.cpython-38.pyc | Bin 9998 -> 0 bytes .../__pycache__/test_unit_cal.cpython-38.pyc | Bin 10887 -> 0 bytes .../test_unit_caselessdict.cpython-38.pyc | Bin 2616 -> 0 bytes .../test_unit_parser_tools.cpython-38.pyc | Bin 1405 -> 0 bytes .../__pycache__/test_unit_prop.cpython-38.pyc | Bin 15373 -> 0 bytes .../test_unit_tools.cpython-38.pyc | Bin 927 -> 0 bytes .../icalendar/tests/america_new_york.ics | 61 - .../icalendar/tests/encoding.ics | 16 - .../__pycache__/test_fuzzing.cpython-38.pyc | Bin 1452 -> 0 bytes .../tests/hypothesis/test_fuzzing.py | 38 - .../issue_112_missing_tzinfo_on_exdate.ics | 48 - .../tests/issue_53_parsing_failure.ics | 78 - .../icalendar/tests/multiple.ics | 80 - .../icalendar/tests/pacific_fiji.ics | 52 - .../icalendar/tests/recurrence.ics | 24 - .../icalendar/tests/test_encoding.py | 93 - .../icalendar/tests/test_fixed_issues.py | 480 - .../icalendar/tests/test_icalendar.py | 323 - .../icalendar/tests/test_multiple.py | 28 - .../icalendar/tests/test_property_params.py | 218 - .../icalendar/tests/test_recurrence.py | 62 - .../icalendar/tests/test_time.py | 30 - .../icalendar/tests/test_timezoned.py | 375 - .../icalendar/tests/test_unit_cal.py | 460 - .../icalendar/tests/test_unit_caselessdict.py | 100 - .../icalendar/tests/test_unit_parser_tools.py | 31 - .../icalendar/tests/test_unit_prop.py | 537 - .../icalendar/tests/test_unit_tools.py | 29 - .../site-packages/icalendar/tests/time.ics | 3 - .../icalendar/tests/timezone_rdate.ics | 55 - .../icalendar/tests/timezone_same_start.ics | 27 - .../tests/timezone_same_start_and_offset.ics | 23 - .../icalendar/tests/timezoned.ics | 36 - .../icalendar/tests/x_location.ics | 48 - .../site-packages/icalendar/timezone_cache.py | 3 - .venv/Lib/site-packages/icalendar/tools.py | 34 - .../icalendar/windows_to_olson.py | 119 - .../ics-0.7.2.dist-info/INSTALLER | 1 - .../ics-0.7.2.dist-info/LICENSE.rst | 191 - .../ics-0.7.2.dist-info/METADATA | 145 - .../site-packages/ics-0.7.2.dist-info/RECORD | 76 - .../ics-0.7.2.dist-info/REQUESTED | 0 .../site-packages/ics-0.7.2.dist-info/WHEEL | 6 - .../ics-0.7.2.dist-info/top_level.txt | 1 - .venv/Lib/site-packages/ics/__init__.py | 7 - .venv/Lib/site-packages/ics/__meta__.py | 5 - .../ics/__pycache__/__init__.cpython-38.pyc | Bin 552 -> 0 bytes .../ics/__pycache__/__meta__.cpython-38.pyc | Bin 385 -> 0 bytes .../ics/__pycache__/attendee.cpython-38.pyc | Bin 3792 -> 0 bytes .../ics/__pycache__/component.cpython-38.pyc | Bin 3431 -> 0 bytes .../ics/__pycache__/event.cpython-38.pyc | Bin 13091 -> 0 bytes .../ics/__pycache__/icalendar.cpython-38.pyc | Bin 5297 -> 0 bytes .../ics/__pycache__/timeline.cpython-38.pyc | Bin 4416 -> 0 bytes .../ics/__pycache__/todo.cpython-38.pyc | Bin 9019 -> 0 bytes .../ics/__pycache__/tools.cpython-38.pyc | Bin 1165 -> 0 bytes .../ics/__pycache__/types.cpython-38.pyc | Bin 297 -> 0 bytes .../ics/__pycache__/utils.cpython-38.pyc | Bin 5590 -> 0 bytes .venv/Lib/site-packages/ics/alarm/__init__.py | 3 - .../alarm/__pycache__/__init__.cpython-38.pyc | Bin 333 -> 0 bytes .../alarm/__pycache__/audio.cpython-38.pyc | Bin 1697 -> 0 bytes .../ics/alarm/__pycache__/base.cpython-38.pyc | Bin 5084 -> 0 bytes .../alarm/__pycache__/custom.cpython-38.pyc | Bin 1376 -> 0 bytes .../alarm/__pycache__/display.cpython-38.pyc | Bin 1364 -> 0 bytes .../alarm/__pycache__/email.cpython-38.pyc | Bin 1491 -> 0 bytes .../ics/alarm/__pycache__/none.cpython-38.pyc | Bin 927 -> 0 bytes .../alarm/__pycache__/utils.cpython-38.pyc | Bin 1019 -> 0 bytes .venv/Lib/site-packages/ics/alarm/audio.py | 44 - .venv/Lib/site-packages/ics/alarm/base.py | 154 - .venv/Lib/site-packages/ics/alarm/custom.py | 33 - .venv/Lib/site-packages/ics/alarm/display.py | 34 - .venv/Lib/site-packages/ics/alarm/email.py | 38 - .venv/Lib/site-packages/ics/alarm/none.py | 19 - .venv/Lib/site-packages/ics/alarm/utils.py | 28 - .venv/Lib/site-packages/ics/attendee.py | 92 - .venv/Lib/site-packages/ics/component.py | 89 - .venv/Lib/site-packages/ics/event.py | 489 - .../Lib/site-packages/ics/grammar/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 181 -> 0 bytes .../__pycache__/contentline.cpython-38.pyc | Bin 6797 -> 0 bytes .../grammar/__pycache__/parse.cpython-38.pyc | Bin 7426 -> 0 bytes .../ics/grammar/contentline.ebnf | 18 - .../site-packages/ics/grammar/contentline.py | 235 - .venv/Lib/site-packages/ics/grammar/parse.py | 227 - .venv/Lib/site-packages/ics/icalendar.py | 148 - .../__pycache__/alarm_parser.cpython-38.pyc | Bin 3235 -> 0 bytes .../attendee_parser.cpython-38.pyc | Bin 1774 -> 0 bytes .../__pycache__/event_parser.cpython-38.pyc | Bin 4325 -> 0 bytes .../icalendar_parser.cpython-38.pyc | Bin 2920 -> 0 bytes .../parsers/__pycache__/parser.cpython-38.pyc | Bin 2011 -> 0 bytes .../__pycache__/todo_parser.cpython-38.pyc | Bin 3832 -> 0 bytes .../site-packages/ics/parsers/alarm_parser.py | 65 - .../ics/parsers/attendee_parser.py | 34 - .../site-packages/ics/parsers/event_parser.py | 98 - .../ics/parsers/icalendar_parser.py | 80 - .venv/Lib/site-packages/ics/parsers/parser.py | 45 - .../site-packages/ics/parsers/todo_parser.py | 83 - .../alarm_serializer.cpython-38.pyc | Bin 3446 -> 0 bytes .../attendee_serializer.cpython-38.pyc | Bin 2094 -> 0 bytes .../event_serializer.cpython-38.pyc | Bin 5244 -> 0 bytes .../icalendar_serializer.cpython-38.pyc | Bin 1774 -> 0 bytes .../__pycache__/serializer.cpython-38.pyc | Bin 1130 -> 0 bytes .../todo_serializer.cpython-38.pyc | Bin 4078 -> 0 bytes .../ics/serializers/alarm_serializer.py | 72 - .../ics/serializers/attendee_serializer.py | 35 - .../ics/serializers/event_serializer.py | 121 - .../ics/serializers/icalendar_serializer.py | 31 - .../ics/serializers/serializer.py | 16 - .../ics/serializers/todo_serializer.py | 88 - .venv/Lib/site-packages/ics/timeline.py | 110 - .venv/Lib/site-packages/ics/todo.py | 336 - .venv/Lib/site-packages/ics/tools.py | 26 - .venv/Lib/site-packages/ics/types.py | 6 - .venv/Lib/site-packages/ics/utils.py | 235 - .../idna-3.4.dist-info/INSTALLER | 1 - .../idna-3.4.dist-info/LICENSE.md | 29 - .../site-packages/idna-3.4.dist-info/METADATA | 242 - .../site-packages/idna-3.4.dist-info/RECORD | 22 - .../site-packages/idna-3.4.dist-info/WHEEL | 4 - .venv/Lib/site-packages/idna/__init__.py | 44 - .../idna/__pycache__/__init__.cpython-38.pyc | Bin 903 -> 0 bytes .../idna/__pycache__/codec.cpython-38.pyc | Bin 3070 -> 0 bytes .../idna/__pycache__/compat.cpython-38.pyc | Bin 752 -> 0 bytes .../idna/__pycache__/core.cpython-38.pyc | Bin 9892 -> 0 bytes .../idna/__pycache__/idnadata.cpython-38.pyc | Bin 23187 -> 0 bytes .../idna/__pycache__/intranges.cpython-38.pyc | Bin 1983 -> 0 bytes .../__pycache__/package_data.cpython-38.pyc | Bin 197 -> 0 bytes .../idna/__pycache__/uts46data.cpython-38.pyc | Bin 185412 -> 0 bytes .venv/Lib/site-packages/idna/codec.py | 112 - .venv/Lib/site-packages/idna/compat.py | 13 - .venv/Lib/site-packages/idna/core.py | 400 - .venv/Lib/site-packages/idna/idnadata.py | 2151 -- .venv/Lib/site-packages/idna/intranges.py | 54 - .venv/Lib/site-packages/idna/package_data.py | 2 - .venv/Lib/site-packages/idna/py.typed | 0 .venv/Lib/site-packages/idna/uts46data.py | 8600 ------ .../multidict-6.0.2.dist-info/INSTALLER | 1 - .../multidict-6.0.2.dist-info/LICENSE | 13 - .../multidict-6.0.2.dist-info/METADATA | 131 - .../multidict-6.0.2.dist-info/RECORD | 19 - .../multidict-6.0.2.dist-info/WHEEL | 5 - .../multidict-6.0.2.dist-info/top_level.txt | 1 - .venv/Lib/site-packages/multidict/__init__.py | 48 - .../Lib/site-packages/multidict/__init__.pyi | 155 - .../__pycache__/__init__.cpython-38.pyc | Bin 856 -> 0 bytes .../multidict/__pycache__/_abc.cpython-38.pyc | Bin 1988 -> 0 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 465 -> 0 bytes .../_multidict_base.cpython-38.pyc | Bin 3454 -> 0 bytes .../__pycache__/_multidict_py.cpython-38.pyc | Bin 16703 -> 0 bytes .venv/Lib/site-packages/multidict/_abc.py | 48 - .venv/Lib/site-packages/multidict/_compat.py | 14 - .../multidict/_multidict.cp38-win_amd64.pyd | Bin 46592 -> 0 bytes .../multidict/_multidict_base.py | 144 - .../site-packages/multidict/_multidict_py.py | 520 - .venv/Lib/site-packages/multidict/py.typed | 1 - .../pip-22.2.2.dist-info/INSTALLER | 1 - .../pip-22.2.2.dist-info/LICENSE.txt | 20 - .../pip-22.2.2.dist-info/METADATA | 90 - .../site-packages/pip-22.2.2.dist-info/RECORD | 992 - .../pip-22.2.2.dist-info/REQUESTED | 0 .../site-packages/pip-22.2.2.dist-info/WHEEL | 5 - .../pip-22.2.2.dist-info/entry_points.txt | 4 - .../pip-22.2.2.dist-info/top_level.txt | 1 - .venv/Lib/site-packages/pip/__init__.py | 13 - .venv/Lib/site-packages/pip/__main__.py | 31 - .venv/Lib/site-packages/pip/__pip-runner__.py | 36 - .../pip/__pycache__/__init__.cpython-38.pyc | Bin 629 -> 0 bytes .../pip/__pycache__/__main__.cpython-38.pyc | Bin 589 -> 0 bytes .../__pycache__/__pip-runner__.cpython-38.pyc | Bin 1403 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 19 - .../__pycache__/__init__.cpython-38.pyc | Bin 750 -> 0 bytes .../__pycache__/build_env.cpython-38.pyc | Bin 9090 -> 0 bytes .../__pycache__/cache.cpython-38.pyc | Bin 9176 -> 0 bytes .../__pycache__/configuration.cpython-38.pyc | Bin 11275 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 23373 -> 0 bytes .../_internal/__pycache__/main.cpython-38.pyc | Bin 615 -> 0 bytes .../__pycache__/pyproject.cpython-38.pyc | Bin 3631 -> 0 bytes .../self_outdated_check.cpython-38.pyc | Bin 6508 -> 0 bytes .../__pycache__/wheel_builder.cpython-38.pyc | Bin 9243 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 290 - .../Lib/site-packages/pip/_internal/cache.py | 289 - .../pip/_internal/cli/__init__.py | 4 - .../cli/__pycache__/__init__.cpython-38.pyc | Bin 270 -> 0 bytes .../__pycache__/autocompletion.cpython-38.pyc | Bin 5295 -> 0 bytes .../__pycache__/base_command.cpython-38.pyc | Bin 6363 -> 0 bytes .../cli/__pycache__/cmdoptions.cpython-38.pyc | Bin 23860 -> 0 bytes .../command_context.cpython-38.pyc | Bin 1286 -> 0 bytes .../cli/__pycache__/main.cpython-38.pyc | Bin 1356 -> 0 bytes .../__pycache__/main_parser.cpython-38.pyc | Bin 2157 -> 0 bytes .../cli/__pycache__/parser.cpython-38.pyc | Bin 9946 -> 0 bytes .../__pycache__/progress_bars.cpython-38.pyc | Bin 1882 -> 0 bytes .../__pycache__/req_command.cpython-38.pyc | Bin 13024 -> 0 bytes .../cli/__pycache__/spinners.cpython-38.pyc | Bin 4923 -> 0 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 349 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 171 - .../pip/_internal/cli/base_command.py | 223 - .../pip/_internal/cli/cmdoptions.py | 1062 - .../pip/_internal/cli/command_context.py | 27 - .../site-packages/pip/_internal/cli/main.py | 70 - .../pip/_internal/cli/main_parser.py | 87 - .../site-packages/pip/_internal/cli/parser.py | 294 - .../pip/_internal/cli/progress_bars.py | 68 - .../pip/_internal/cli/req_command.py | 502 - .../pip/_internal/cli/spinners.py | 159 - .../pip/_internal/cli/status_codes.py | 6 - .../pip/_internal/commands/__init__.py | 132 - .../__pycache__/__init__.cpython-38.pyc | Bin 3157 -> 0 bytes .../commands/__pycache__/cache.cpython-38.pyc | Bin 6234 -> 0 bytes .../commands/__pycache__/check.cpython-38.pyc | Bin 1563 -> 0 bytes .../__pycache__/completion.cpython-38.pyc | Bin 4164 -> 0 bytes .../__pycache__/configuration.cpython-38.pyc | Bin 8784 -> 0 bytes .../commands/__pycache__/debug.cpython-38.pyc | Bin 6581 -> 0 bytes .../__pycache__/download.cpython-38.pyc | Bin 4059 -> 0 bytes .../__pycache__/freeze.cpython-38.pyc | Bin 2632 -> 0 bytes .../commands/__pycache__/hash.cpython-38.pyc | Bin 2114 -> 0 bytes .../commands/__pycache__/help.cpython-38.pyc | Bin 1303 -> 0 bytes .../commands/__pycache__/index.cpython-38.pyc | Bin 4511 -> 0 bytes .../__pycache__/inspect.cpython-38.pyc | Bin 3128 -> 0 bytes .../__pycache__/install.cpython-38.pyc | Bin 19352 -> 0 bytes .../commands/__pycache__/list.cpython-38.pyc | Bin 10100 -> 0 bytes .../__pycache__/search.cpython-38.pyc | Bin 5315 -> 0 bytes .../commands/__pycache__/show.cpython-38.pyc | Bin 6301 -> 0 bytes .../__pycache__/uninstall.cpython-38.pyc | Bin 3215 -> 0 bytes .../commands/__pycache__/wheel.cpython-38.pyc | Bin 4908 -> 0 bytes .../pip/_internal/commands/cache.py | 223 - .../pip/_internal/commands/check.py | 53 - .../pip/_internal/commands/completion.py | 126 - .../pip/_internal/commands/configuration.py | 276 - .../pip/_internal/commands/debug.py | 199 - .../pip/_internal/commands/download.py | 142 - .../pip/_internal/commands/freeze.py | 97 - .../pip/_internal/commands/hash.py | 59 - .../pip/_internal/commands/help.py | 41 - .../pip/_internal/commands/index.py | 138 - .../pip/_internal/commands/inspect.py | 97 - .../pip/_internal/commands/install.py | 827 - .../pip/_internal/commands/list.py | 360 - .../pip/_internal/commands/search.py | 174 - .../pip/_internal/commands/show.py | 183 - .../pip/_internal/commands/uninstall.py | 106 - .../pip/_internal/commands/wheel.py | 178 - .../pip/_internal/configuration.py | 374 - .../pip/_internal/distributions/__init__.py | 21 - .../__pycache__/__init__.cpython-38.pyc | Bin 793 -> 0 bytes .../__pycache__/base.cpython-38.pyc | Bin 1897 -> 0 bytes .../__pycache__/installed.cpython-38.pyc | Bin 1271 -> 0 bytes .../__pycache__/sdist.cpython-38.pyc | Bin 5085 -> 0 bytes .../__pycache__/wheel.cpython-38.pyc | Bin 1638 -> 0 bytes .../pip/_internal/distributions/base.py | 39 - .../pip/_internal/distributions/installed.py | 23 - .../pip/_internal/distributions/sdist.py | 150 - .../pip/_internal/distributions/wheel.py | 34 - .../site-packages/pip/_internal/exceptions.py | 658 - .../pip/_internal/index/__init__.py | 2 - .../index/__pycache__/__init__.cpython-38.pyc | Bin 224 -> 0 bytes .../__pycache__/collector.cpython-38.pyc | Bin 17708 -> 0 bytes .../__pycache__/package_finder.cpython-38.pyc | Bin 29056 -> 0 bytes .../index/__pycache__/sources.cpython-38.pyc | Bin 7189 -> 0 bytes .../pip/_internal/index/collector.py | 621 - .../pip/_internal/index/package_finder.py | 1025 - .../pip/_internal/index/sources.py | 224 - .../pip/_internal/locations/__init__.py | 528 - .../__pycache__/__init__.cpython-38.pyc | Bin 12620 -> 0 bytes .../__pycache__/_distutils.cpython-38.pyc | Bin 4806 -> 0 bytes .../__pycache__/_sysconfig.cpython-38.pyc | Bin 6246 -> 0 bytes .../locations/__pycache__/base.cpython-38.pyc | Bin 2413 -> 0 bytes .../pip/_internal/locations/_distutils.py | 180 - .../pip/_internal/locations/_sysconfig.py | 218 - .../pip/_internal/locations/base.py | 81 - .venv/Lib/site-packages/pip/_internal/main.py | 12 - .../pip/_internal/metadata/__init__.py | 105 - .../__pycache__/__init__.cpython-38.pyc | Bin 4028 -> 0 bytes .../metadata/__pycache__/_json.cpython-38.pyc | Bin 2283 -> 0 bytes .../metadata/__pycache__/base.cpython-38.pyc | Bin 26313 -> 0 bytes .../__pycache__/pkg_resources.cpython-38.pyc | Bin 9868 -> 0 bytes .../pip/_internal/metadata/_json.py | 84 - .../pip/_internal/metadata/base.py | 670 - .../_internal/metadata/importlib/__init__.py | 4 - .../__pycache__/__init__.cpython-38.pyc | Bin 315 -> 0 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 2134 -> 0 bytes .../__pycache__/_dists.cpython-38.pyc | Bin 8342 -> 0 bytes .../__pycache__/_envs.cpython-38.pyc | Bin 7372 -> 0 bytes .../_internal/metadata/importlib/_compat.py | 43 - .../_internal/metadata/importlib/_dists.py | 206 - .../pip/_internal/metadata/importlib/_envs.py | 180 - .../pip/_internal/metadata/pkg_resources.py | 253 - .../pip/_internal/models/__init__.py | 2 - .../__pycache__/__init__.cpython-38.pyc | Bin 258 -> 0 bytes .../__pycache__/candidate.cpython-38.pyc | Bin 1441 -> 0 bytes .../__pycache__/direct_url.cpython-38.pyc | Bin 7099 -> 0 bytes .../__pycache__/format_control.cpython-38.pyc | Bin 2720 -> 0 bytes .../models/__pycache__/index.cpython-38.pyc | Bin 1234 -> 0 bytes .../installation_report.cpython-38.pyc | Bin 1758 -> 0 bytes .../models/__pycache__/link.cpython-38.pyc | Bin 10638 -> 0 bytes .../models/__pycache__/scheme.cpython-38.pyc | Bin 1030 -> 0 bytes .../__pycache__/search_scope.cpython-38.pyc | Bin 3483 -> 0 bytes .../selection_prefs.cpython-38.pyc | Bin 1696 -> 0 bytes .../__pycache__/target_python.cpython-38.pyc | Bin 3434 -> 0 bytes .../models/__pycache__/wheel.cpython-38.pyc | Bin 4444 -> 0 bytes .../pip/_internal/models/candidate.py | 34 - .../pip/_internal/models/direct_url.py | 212 - .../pip/_internal/models/format_control.py | 80 - .../pip/_internal/models/index.py | 28 - .../_internal/models/installation_report.py | 53 - .../pip/_internal/models/link.py | 314 - .../pip/_internal/models/scheme.py | 31 - .../pip/_internal/models/search_scope.py | 129 - .../pip/_internal/models/selection_prefs.py | 51 - .../pip/_internal/models/target_python.py | 110 - .../pip/_internal/models/wheel.py | 92 - .../pip/_internal/network/__init__.py | 2 - .../__pycache__/__init__.cpython-38.pyc | Bin 246 -> 0 bytes .../network/__pycache__/auth.cpython-38.pyc | Bin 7501 -> 0 bytes .../network/__pycache__/cache.cpython-38.pyc | Bin 2846 -> 0 bytes .../__pycache__/download.cpython-38.pyc | Bin 5525 -> 0 bytes .../__pycache__/lazy_wheel.cpython-38.pyc | Bin 8358 -> 0 bytes .../__pycache__/session.cpython-38.pyc | Bin 12447 -> 0 bytes .../network/__pycache__/utils.cpython-38.pyc | Bin 1439 -> 0 bytes .../network/__pycache__/xmlrpc.cpython-38.pyc | Bin 2063 -> 0 bytes .../pip/_internal/network/auth.py | 323 - .../pip/_internal/network/cache.py | 69 - .../pip/_internal/network/download.py | 186 - .../pip/_internal/network/lazy_wheel.py | 210 - .../pip/_internal/network/session.py | 518 - .../pip/_internal/network/utils.py | 96 - .../pip/_internal/network/xmlrpc.py | 60 - .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 194 -> 0 bytes .../__pycache__/check.cpython-38.pyc | Bin 4004 -> 0 bytes .../__pycache__/freeze.cpython-38.pyc | Bin 6145 -> 0 bytes .../__pycache__/prepare.cpython-38.pyc | Bin 13933 -> 0 bytes .../_internal/operations/build/__init__.py | 0 .../build/__pycache__/__init__.cpython-38.pyc | Bin 200 -> 0 bytes .../__pycache__/build_tracker.cpython-38.pyc | Bin 4114 -> 0 bytes .../build/__pycache__/metadata.cpython-38.pyc | Bin 1373 -> 0 bytes .../metadata_editable.cpython-38.pyc | Bin 1407 -> 0 bytes .../metadata_legacy.cpython-38.pyc | Bin 2285 -> 0 bytes .../build/__pycache__/wheel.cpython-38.pyc | Bin 1193 -> 0 bytes .../__pycache__/wheel_editable.cpython-38.pyc | Bin 1409 -> 0 bytes .../__pycache__/wheel_legacy.cpython-38.pyc | Bin 2708 -> 0 bytes .../operations/build/build_tracker.py | 124 - .../_internal/operations/build/metadata.py | 39 - .../operations/build/metadata_editable.py | 41 - .../operations/build/metadata_legacy.py | 74 - .../pip/_internal/operations/build/wheel.py | 37 - .../operations/build/wheel_editable.py | 46 - .../operations/build/wheel_legacy.py | 102 - .../pip/_internal/operations/check.py | 149 - .../pip/_internal/operations/freeze.py | 254 - .../_internal/operations/install/__init__.py | 2 - .../__pycache__/__init__.cpython-38.pyc | Bin 258 -> 0 bytes .../editable_legacy.cpython-38.pyc | Bin 1439 -> 0 bytes .../install/__pycache__/legacy.cpython-38.pyc | Bin 3202 -> 0 bytes .../install/__pycache__/wheel.cpython-38.pyc | Bin 20797 -> 0 bytes .../operations/install/editable_legacy.py | 47 - .../_internal/operations/install/legacy.py | 120 - .../pip/_internal/operations/install/wheel.py | 736 - .../pip/_internal/operations/prepare.py | 614 - .../site-packages/pip/_internal/pyproject.py | 175 - .../pip/_internal/req/__init__.py | 94 - .../req/__pycache__/__init__.cpython-38.pyc | Bin 2543 -> 0 bytes .../__pycache__/constructors.cpython-38.pyc | Bin 12284 -> 0 bytes .../req/__pycache__/req_file.cpython-38.pyc | Bin 13421 -> 0 bytes .../__pycache__/req_install.cpython-38.pyc | Bin 22646 -> 0 bytes .../req/__pycache__/req_set.cpython-38.pyc | Bin 3979 -> 0 bytes .../__pycache__/req_uninstall.cpython-38.pyc | Bin 18868 -> 0 bytes .../pip/_internal/req/constructors.py | 501 - .../pip/_internal/req/req_file.py | 540 - .../pip/_internal/req/req_install.py | 879 - .../pip/_internal/req/req_set.py | 82 - .../pip/_internal/req/req_uninstall.py | 640 - .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 194 -> 0 bytes .../__pycache__/base.cpython-38.pyc | Bin 1053 -> 0 bytes .../pip/_internal/resolution/base.py | 20 - .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 201 -> 0 bytes .../__pycache__/resolver.cpython-38.pyc | Bin 14895 -> 0 bytes .../_internal/resolution/legacy/resolver.py | 600 - .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 205 -> 0 bytes .../__pycache__/base.cpython-38.pyc | Bin 6614 -> 0 bytes .../__pycache__/candidates.cpython-38.pyc | Bin 18799 -> 0 bytes .../__pycache__/factory.cpython-38.pyc | Bin 18993 -> 0 bytes .../found_candidates.cpython-38.pyc | Bin 4846 -> 0 bytes .../__pycache__/provider.cpython-38.pyc | Bin 7660 -> 0 bytes .../__pycache__/reporter.cpython-38.pyc | Bin 3266 -> 0 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 7602 -> 0 bytes .../__pycache__/resolver.cpython-38.pyc | Bin 8160 -> 0 bytes .../_internal/resolution/resolvelib/base.py | 141 - .../resolution/resolvelib/candidates.py | 556 - .../resolution/resolvelib/factory.py | 731 - .../resolution/resolvelib/found_candidates.py | 155 - .../resolution/resolvelib/provider.py | 248 - .../resolution/resolvelib/reporter.py | 68 - .../resolution/resolvelib/requirements.py | 166 - .../resolution/resolvelib/resolver.py | 296 - .../pip/_internal/self_outdated_check.py | 239 - .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-38.pyc | Bin 189 -> 0 bytes .../utils/__pycache__/_log.cpython-38.pyc | Bin 1508 -> 0 bytes .../utils/__pycache__/appdirs.cpython-38.pyc | Bin 1620 -> 0 bytes .../utils/__pycache__/compat.cpython-38.pyc | Bin 1502 -> 0 bytes .../compatibility_tags.cpython-38.pyc | Bin 4070 -> 0 bytes .../utils/__pycache__/datetime.cpython-38.pyc | Bin 508 -> 0 bytes .../__pycache__/deprecation.cpython-38.pyc | Bin 3248 -> 0 bytes .../direct_url_helpers.cpython-38.pyc | Bin 2110 -> 0 bytes .../__pycache__/distutils_args.cpython-38.pyc | Bin 1100 -> 0 bytes .../utils/__pycache__/egg_link.cpython-38.pyc | Bin 2135 -> 0 bytes .../utils/__pycache__/encoding.cpython-38.pyc | Bin 1316 -> 0 bytes .../__pycache__/entrypoints.cpython-38.pyc | Bin 2641 -> 0 bytes .../__pycache__/filesystem.cpython-38.pyc | Bin 4439 -> 0 bytes .../__pycache__/filetypes.cpython-38.pyc | Bin 939 -> 0 bytes .../utils/__pycache__/glibc.cpython-38.pyc | Bin 1676 -> 0 bytes .../utils/__pycache__/hashes.cpython-38.pyc | Bin 5181 -> 0 bytes .../inject_securetransport.cpython-38.pyc | Bin 982 -> 0 bytes .../utils/__pycache__/logging.cpython-38.pyc | Bin 9686 -> 0 bytes .../utils/__pycache__/misc.cpython-38.pyc | Bin 21752 -> 0 bytes .../utils/__pycache__/models.cpython-38.pyc | Bin 2057 -> 0 bytes .../__pycache__/packaging.cpython-38.pyc | Bin 2079 -> 0 bytes .../setuptools_build.cpython-38.pyc | Bin 4591 -> 0 bytes .../__pycache__/subprocess.cpython-38.pyc | Bin 5675 -> 0 bytes .../utils/__pycache__/temp_dir.cpython-38.pyc | Bin 7271 -> 0 bytes .../__pycache__/unpacking.cpython-38.pyc | Bin 6640 -> 0 bytes .../utils/__pycache__/urls.cpython-38.pyc | Bin 1609 -> 0 bytes .../__pycache__/virtualenv.cpython-38.pyc | Bin 3273 -> 0 bytes .../utils/__pycache__/wheel.cpython-38.pyc | Bin 4483 -> 0 bytes .../site-packages/pip/_internal/utils/_log.py | 38 - .../pip/_internal/utils/appdirs.py | 52 - .../pip/_internal/utils/compat.py | 63 - .../pip/_internal/utils/compatibility_tags.py | 165 - .../pip/_internal/utils/datetime.py | 11 - .../pip/_internal/utils/deprecation.py | 120 - .../pip/_internal/utils/direct_url_helpers.py | 87 - .../pip/_internal/utils/distutils_args.py | 43 - .../pip/_internal/utils/egg_link.py | 75 - .../pip/_internal/utils/encoding.py | 36 - .../pip/_internal/utils/entrypoints.py | 79 - .../pip/_internal/utils/filesystem.py | 153 - .../pip/_internal/utils/filetypes.py | 27 - .../pip/_internal/utils/glibc.py | 88 - .../pip/_internal/utils/hashes.py | 144 - .../_internal/utils/inject_securetransport.py | 35 - .../pip/_internal/utils/logging.py | 348 - .../site-packages/pip/_internal/utils/misc.py | 723 - .../pip/_internal/utils/models.py | 39 - .../pip/_internal/utils/packaging.py | 57 - .../pip/_internal/utils/setuptools_build.py | 195 - .../pip/_internal/utils/subprocess.py | 260 - .../pip/_internal/utils/temp_dir.py | 246 - .../pip/_internal/utils/unpacking.py | 257 - .../site-packages/pip/_internal/utils/urls.py | 62 - .../pip/_internal/utils/virtualenv.py | 104 - .../pip/_internal/utils/wheel.py | 136 - .../pip/_internal/vcs/__init__.py | 15 - .../vcs/__pycache__/__init__.cpython-38.pyc | Bin 512 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-38.pyc | Bin 3363 -> 0 bytes .../vcs/__pycache__/git.cpython-38.pyc | Bin 12601 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-38.pyc | Bin 5057 -> 0 bytes .../vcs/__pycache__/subversion.cpython-38.pyc | Bin 8502 -> 0 bytes .../__pycache__/versioncontrol.cpython-38.pyc | Bin 21211 -> 0 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 101 - .../site-packages/pip/_internal/vcs/git.py | 526 - .../pip/_internal/vcs/mercurial.py | 163 - .../pip/_internal/vcs/subversion.py | 324 - .../pip/_internal/vcs/versioncontrol.py | 705 - .../pip/_internal/wheel_builder.py | 383 - .../Lib/site-packages/pip/_vendor/__init__.py | 120 - .../__pycache__/__init__.cpython-38.pyc | Bin 3117 -> 0 bytes .../_vendor/__pycache__/six.cpython-38.pyc | Bin 27484 -> 0 bytes .../typing_extensions.cpython-38.pyc | Bin 61866 -> 0 bytes .../pip/_vendor/cachecontrol/__init__.py | 18 - .../__pycache__/__init__.cpython-38.pyc | Bin 640 -> 0 bytes .../__pycache__/_cmd.cpython-38.pyc | Bin 1574 -> 0 bytes .../__pycache__/adapter.cpython-38.pyc | Bin 3137 -> 0 bytes .../__pycache__/cache.cpython-38.pyc | Bin 2664 -> 0 bytes .../__pycache__/compat.cpython-38.pyc | Bin 754 -> 0 bytes .../__pycache__/controller.cpython-38.pyc | Bin 8604 -> 0 bytes .../__pycache__/filewrapper.cpython-38.pyc | Bin 2788 -> 0 bytes .../__pycache__/heuristics.cpython-38.pyc | Bin 4732 -> 0 bytes .../__pycache__/serialize.cpython-38.pyc | Bin 4374 -> 0 bytes .../__pycache__/wrapper.cpython-38.pyc | Bin 671 -> 0 bytes .../pip/_vendor/cachecontrol/_cmd.py | 61 - .../pip/_vendor/cachecontrol/adapter.py | 137 - .../pip/_vendor/cachecontrol/cache.py | 65 - .../_vendor/cachecontrol/caches/__init__.py | 9 - .../__pycache__/__init__.cpython-38.pyc | Bin 359 -> 0 bytes .../__pycache__/file_cache.cpython-38.pyc | Bin 4875 -> 0 bytes .../__pycache__/redis_cache.cpython-38.pyc | Bin 1607 -> 0 bytes .../_vendor/cachecontrol/caches/file_cache.py | 188 - .../cachecontrol/caches/redis_cache.py | 39 - .../pip/_vendor/cachecontrol/compat.py | 32 - .../pip/_vendor/cachecontrol/controller.py | 439 - .../pip/_vendor/cachecontrol/filewrapper.py | 111 - .../pip/_vendor/cachecontrol/heuristics.py | 139 - .../pip/_vendor/cachecontrol/serialize.py | 190 - .../pip/_vendor/cachecontrol/wrapper.py | 33 - .../pip/_vendor/certifi/__init__.py | 4 - .../pip/_vendor/certifi/__main__.py | 12 - .../__pycache__/__init__.cpython-38.pyc | Bin 302 -> 0 bytes .../__pycache__/__main__.cpython-38.pyc | Bin 450 -> 0 bytes .../certifi/__pycache__/core.cpython-38.pyc | Bin 1771 -> 0 bytes .../pip/_vendor/certifi/cacert.pem | 4685 --- .../site-packages/pip/_vendor/certifi/core.py | 84 - .../pip/_vendor/chardet/__init__.py | 93 - .../__pycache__/__init__.cpython-38.pyc | Bin 2373 -> 0 bytes .../__pycache__/big5freq.cpython-38.pyc | Bin 27176 -> 0 bytes .../__pycache__/big5prober.cpython-38.pyc | Bin 1122 -> 0 bytes .../chardistribution.cpython-38.pyc | Bin 6731 -> 0 bytes .../charsetgroupprober.cpython-38.pyc | Bin 2250 -> 0 bytes .../__pycache__/charsetprober.cpython-38.pyc | Bin 3400 -> 0 bytes .../codingstatemachine.cpython-38.pyc | Bin 2893 -> 0 bytes .../__pycache__/cp949prober.cpython-38.pyc | Bin 1129 -> 0 bytes .../chardet/__pycache__/enums.cpython-38.pyc | Bin 2625 -> 0 bytes .../__pycache__/escprober.cpython-38.pyc | Bin 2604 -> 0 bytes .../chardet/__pycache__/escsm.cpython-38.pyc | Bin 7471 -> 0 bytes .../__pycache__/eucjpprober.cpython-38.pyc | Bin 2417 -> 0 bytes .../__pycache__/euckrfreq.cpython-38.pyc | Bin 12060 -> 0 bytes .../__pycache__/euckrprober.cpython-38.pyc | Bin 1130 -> 0 bytes .../__pycache__/euctwfreq.cpython-38.pyc | Bin 27180 -> 0 bytes .../__pycache__/euctwprober.cpython-38.pyc | Bin 1130 -> 0 bytes .../__pycache__/gb2312freq.cpython-38.pyc | Bin 19104 -> 0 bytes .../__pycache__/gb2312prober.cpython-38.pyc | Bin 1138 -> 0 bytes .../__pycache__/hebrewprober.cpython-38.pyc | Bin 3013 -> 0 bytes .../__pycache__/jisfreq.cpython-38.pyc | Bin 22132 -> 0 bytes .../__pycache__/johabfreq.cpython-38.pyc | Bin 37359 -> 0 bytes .../__pycache__/johabprober.cpython-38.pyc | Bin 1129 -> 0 bytes .../chardet/__pycache__/jpcntx.cpython-38.pyc | Bin 37590 -> 0 bytes .../langbulgarianmodel.cpython-38.pyc | Bin 21811 -> 0 bytes .../__pycache__/langgreekmodel.cpython-38.pyc | Bin 20487 -> 0 bytes .../langhebrewmodel.cpython-38.pyc | Bin 20553 -> 0 bytes .../langhungarianmodel.cpython-38.pyc | Bin 21756 -> 0 bytes .../langrussianmodel.cpython-38.pyc | Bin 26367 -> 0 bytes .../__pycache__/langthaimodel.cpython-38.pyc | Bin 20729 -> 0 bytes .../langturkishmodel.cpython-38.pyc | Bin 20569 -> 0 bytes .../__pycache__/latin1prober.cpython-38.pyc | Bin 3376 -> 0 bytes .../mbcharsetprober.cpython-38.pyc | Bin 2236 -> 0 bytes .../mbcsgroupprober.cpython-38.pyc | Bin 1177 -> 0 bytes .../chardet/__pycache__/mbcssm.cpython-38.pyc | Bin 18494 -> 0 bytes .../sbcharsetprober.cpython-38.pyc | Bin 3249 -> 0 bytes .../sbcsgroupprober.cpython-38.pyc | Bin 1724 -> 0 bytes .../__pycache__/sjisprober.cpython-38.pyc | Bin 2453 -> 0 bytes .../universaldetector.cpython-38.pyc | Bin 6486 -> 0 bytes .../__pycache__/utf1632prober.cpython-38.pyc | Bin 5960 -> 0 bytes .../__pycache__/utf8prober.cpython-38.pyc | Bin 1963 -> 0 bytes .../__pycache__/version.cpython-38.pyc | Bin 436 -> 0 bytes .../pip/_vendor/chardet/big5freq.py | 386 - .../pip/_vendor/chardet/big5prober.py | 47 - .../pip/_vendor/chardet/chardistribution.py | 259 - .../pip/_vendor/chardet/charsetgroupprober.py | 109 - .../pip/_vendor/chardet/charsetprober.py | 138 - .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-38.pyc | Bin 193 -> 0 bytes .../cli/__pycache__/chardetect.cpython-38.pyc | Bin 2395 -> 0 bytes .../pip/_vendor/chardet/cli/chardetect.py | 86 - .../pip/_vendor/chardet/codingstatemachine.py | 88 - .../pip/_vendor/chardet/cp949prober.py | 49 - .../pip/_vendor/chardet/enums.py | 82 - .../pip/_vendor/chardet/escprober.py | 102 - .../pip/_vendor/chardet/escsm.py | 260 - .../pip/_vendor/chardet/eucjpprober.py | 95 - .../pip/_vendor/chardet/euckrfreq.py | 196 - .../pip/_vendor/chardet/euckrprober.py | 47 - .../pip/_vendor/chardet/euctwfreq.py | 388 - .../pip/_vendor/chardet/euctwprober.py | 47 - .../pip/_vendor/chardet/gb2312freq.py | 284 - .../pip/_vendor/chardet/gb2312prober.py | 47 - .../pip/_vendor/chardet/hebrewprober.py | 302 - .../pip/_vendor/chardet/jisfreq.py | 325 - .../pip/_vendor/chardet/johabfreq.py | 2382 -- .../pip/_vendor/chardet/johabprober.py | 47 - .../pip/_vendor/chardet/jpcntx.py | 237 - .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 --- .../pip/_vendor/chardet/langgreekmodel.py | 4397 --- .../pip/_vendor/chardet/langhebrewmodel.py | 4380 --- .../pip/_vendor/chardet/langhungarianmodel.py | 4649 --- .../pip/_vendor/chardet/langrussianmodel.py | 5725 ---- .../pip/_vendor/chardet/langthaimodel.py | 4380 --- .../pip/_vendor/chardet/langturkishmodel.py | 4380 --- .../pip/_vendor/chardet/latin1prober.py | 145 - .../pip/_vendor/chardet/mbcharsetprober.py | 95 - .../pip/_vendor/chardet/mbcsgroupprober.py | 56 - .../pip/_vendor/chardet/mbcssm.py | 660 - .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 198 -> 0 bytes .../__pycache__/languages.cpython-38.pyc | Bin 7856 -> 0 bytes .../pip/_vendor/chardet/metadata/languages.py | 351 - .../pip/_vendor/chardet/sbcharsetprober.py | 160 - .../pip/_vendor/chardet/sbcsgroupprober.py | 88 - .../pip/_vendor/chardet/sjisprober.py | 98 - .../pip/_vendor/chardet/universaldetector.py | 328 - .../pip/_vendor/chardet/utf1632prober.py | 223 - .../pip/_vendor/chardet/utf8prober.py | 80 - .../pip/_vendor/chardet/version.py | 9 - .../pip/_vendor/colorama/__init__.py | 6 - .../__pycache__/__init__.cpython-38.pyc | Bin 441 -> 0 bytes .../colorama/__pycache__/ansi.cpython-38.pyc | Bin 3226 -> 0 bytes .../__pycache__/ansitowin32.cpython-38.pyc | Bin 8074 -> 0 bytes .../__pycache__/initialise.cpython-38.pyc | Bin 1702 -> 0 bytes .../colorama/__pycache__/win32.cpython-38.pyc | Bin 3978 -> 0 bytes .../__pycache__/winterm.cpython-38.pyc | Bin 4662 -> 0 bytes .../pip/_vendor/colorama/ansi.py | 102 - .../pip/_vendor/colorama/ansitowin32.py | 266 - .../pip/_vendor/colorama/initialise.py | 80 - .../pip/_vendor/colorama/win32.py | 152 - .../pip/_vendor/colorama/winterm.py | 169 - .../pip/_vendor/distlib/__init__.py | 23 - .../__pycache__/__init__.cpython-38.pyc | Bin 1056 -> 0 bytes .../distlib/__pycache__/compat.cpython-38.pyc | Bin 31757 -> 0 bytes .../__pycache__/database.cpython-38.pyc | Bin 42651 -> 0 bytes .../distlib/__pycache__/index.cpython-38.pyc | Bin 17195 -> 0 bytes .../__pycache__/locators.cpython-38.pyc | Bin 38160 -> 0 bytes .../__pycache__/manifest.cpython-38.pyc | Bin 10231 -> 0 bytes .../__pycache__/markers.cpython-38.pyc | Bin 5068 -> 0 bytes .../__pycache__/metadata.cpython-38.pyc | Bin 26814 -> 0 bytes .../__pycache__/resources.cpython-38.pyc | Bin 10994 -> 0 bytes .../__pycache__/scripts.cpython-38.pyc | Bin 11470 -> 0 bytes .../distlib/__pycache__/util.cpython-38.pyc | Bin 51618 -> 0 bytes .../__pycache__/version.cpython-38.pyc | Bin 20413 -> 0 bytes .../distlib/__pycache__/wheel.cpython-38.pyc | Bin 27394 -> 0 bytes .../pip/_vendor/distlib/compat.py | 1116 - .../pip/_vendor/distlib/database.py | 1350 - .../pip/_vendor/distlib/index.py | 508 - .../pip/_vendor/distlib/locators.py | 1300 - .../pip/_vendor/distlib/manifest.py | 393 - .../pip/_vendor/distlib/markers.py | 152 - .../pip/_vendor/distlib/metadata.py | 1076 - .../pip/_vendor/distlib/resources.py | 358 - .../pip/_vendor/distlib/scripts.py | 437 - .../site-packages/pip/_vendor/distlib/t32.exe | Bin 97792 -> 0 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 182784 -> 0 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 107520 -> 0 bytes .../site-packages/pip/_vendor/distlib/util.py | 1932 -- .../pip/_vendor/distlib/version.py | 739 - .../site-packages/pip/_vendor/distlib/w32.exe | Bin 91648 -> 0 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 168448 -> 0 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 101888 -> 0 bytes .../pip/_vendor/distlib/wheel.py | 1082 - .../pip/_vendor/distro/__init__.py | 54 - .../pip/_vendor/distro/__main__.py | 4 - .../__pycache__/__init__.cpython-38.pyc | Bin 999 -> 0 bytes .../__pycache__/__main__.cpython-38.pyc | Bin 261 -> 0 bytes .../distro/__pycache__/distro.cpython-38.pyc | Bin 41620 -> 0 bytes .../pip/_vendor/distro/distro.py | 1374 - .../pip/_vendor/idna/__init__.py | 44 - .../idna/__pycache__/__init__.cpython-38.pyc | Bin 915 -> 0 bytes .../idna/__pycache__/codec.cpython-38.pyc | Bin 3082 -> 0 bytes .../idna/__pycache__/compat.cpython-38.pyc | Bin 764 -> 0 bytes .../idna/__pycache__/core.cpython-38.pyc | Bin 9786 -> 0 bytes .../idna/__pycache__/idnadata.cpython-38.pyc | Bin 23041 -> 0 bytes .../idna/__pycache__/intranges.cpython-38.pyc | Bin 1995 -> 0 bytes .../__pycache__/package_data.cpython-38.pyc | Bin 209 -> 0 bytes .../idna/__pycache__/uts46data.cpython-38.pyc | Bin 183636 -> 0 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 - .../site-packages/pip/_vendor/idna/compat.py | 13 - .../site-packages/pip/_vendor/idna/core.py | 397 - .../pip/_vendor/idna/idnadata.py | 2137 -- .../pip/_vendor/idna/intranges.py | 54 - .../pip/_vendor/idna/package_data.py | 2 - .../pip/_vendor/idna/uts46data.py | 8512 ------ .../pip/_vendor/msgpack/__init__.py | 57 - .../__pycache__/__init__.cpython-38.pyc | Bin 1420 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 1850 -> 0 bytes .../msgpack/__pycache__/ext.cpython-38.pyc | Bin 6282 -> 0 bytes .../__pycache__/fallback.cpython-38.pyc | Bin 25698 -> 0 bytes .../pip/_vendor/msgpack/exceptions.py | 48 - .../site-packages/pip/_vendor/msgpack/ext.py | 193 - .../pip/_vendor/msgpack/fallback.py | 1010 - .../pip/_vendor/packaging/__about__.py | 26 - .../pip/_vendor/packaging/__init__.py | 25 - .../__pycache__/__about__.cpython-38.pyc | Bin 614 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 470 -> 0 bytes .../__pycache__/_manylinux.cpython-38.pyc | Bin 7288 -> 0 bytes .../__pycache__/_musllinux.cpython-38.pyc | Bin 4621 -> 0 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 2801 -> 0 bytes .../__pycache__/markers.cpython-38.pyc | Bin 9477 -> 0 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 3974 -> 0 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 21563 -> 0 bytes .../packaging/__pycache__/tags.cpython-38.pyc | Bin 12259 -> 0 bytes .../__pycache__/utils.cpython-38.pyc | Bin 3615 -> 0 bytes .../__pycache__/version.cpython-38.pyc | Bin 13170 -> 0 bytes .../pip/_vendor/packaging/_manylinux.py | 301 - .../pip/_vendor/packaging/_musllinux.py | 136 - .../pip/_vendor/packaging/_structures.py | 61 - .../pip/_vendor/packaging/markers.py | 304 - .../pip/_vendor/packaging/requirements.py | 146 - .../pip/_vendor/packaging/specifiers.py | 802 - .../pip/_vendor/packaging/tags.py | 487 - .../pip/_vendor/packaging/utils.py | 136 - .../pip/_vendor/packaging/version.py | 504 - .../pip/_vendor/pep517/__init__.py | 6 - .../__pycache__/__init__.cpython-38.pyc | Bin 311 -> 0 bytes .../pep517/__pycache__/build.cpython-38.pyc | Bin 3502 -> 0 bytes .../pep517/__pycache__/check.cpython-38.pyc | Bin 4930 -> 0 bytes .../__pycache__/colorlog.cpython-38.pyc | Bin 2950 -> 0 bytes .../pep517/__pycache__/compat.cpython-38.pyc | Bin 1451 -> 0 bytes .../__pycache__/dirtools.cpython-38.pyc | Bin 1329 -> 0 bytes .../__pycache__/envbuild.cpython-38.pyc | Bin 4471 -> 0 bytes .../pep517/__pycache__/meta.cpython-38.pyc | Bin 2856 -> 0 bytes .../__pycache__/wrappers.cpython-38.pyc | Bin 12432 -> 0 bytes .../site-packages/pip/_vendor/pep517/build.py | 127 - .../site-packages/pip/_vendor/pep517/check.py | 207 - .../pip/_vendor/pep517/colorlog.py | 115 - .../pip/_vendor/pep517/compat.py | 51 - .../pip/_vendor/pep517/dirtools.py | 44 - .../pip/_vendor/pep517/envbuild.py | 171 - .../pip/_vendor/pep517/in_process/__init__.py | 17 - .../__pycache__/__init__.cpython-38.pyc | Bin 915 -> 0 bytes .../__pycache__/_in_process.cpython-38.pyc | Bin 10146 -> 0 bytes .../_vendor/pep517/in_process/_in_process.py | 363 - .../site-packages/pip/_vendor/pep517/meta.py | 92 - .../pip/_vendor/pep517/wrappers.py | 375 - .../pip/_vendor/pkg_resources/__init__.py | 3296 --- .../__pycache__/__init__.cpython-38.pyc | Bin 100353 -> 0 bytes .../__pycache__/py31compat.cpython-38.pyc | Bin 646 -> 0 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 - .../pip/_vendor/platformdirs/__init__.py | 340 - .../pip/_vendor/platformdirs/__main__.py | 46 - .../__pycache__/__init__.cpython-38.pyc | Bin 10697 -> 0 bytes .../__pycache__/__main__.cpython-38.pyc | Bin 1220 -> 0 bytes .../__pycache__/android.cpython-38.pyc | Bin 4423 -> 0 bytes .../__pycache__/api.cpython-38.pyc | Bin 5280 -> 0 bytes .../__pycache__/macos.cpython-38.pyc | Bin 3304 -> 0 bytes .../__pycache__/unix.cpython-38.pyc | Bin 7036 -> 0 bytes .../__pycache__/version.cpython-38.pyc | Bin 291 -> 0 bytes .../__pycache__/windows.cpython-38.pyc | Bin 6452 -> 0 bytes .../pip/_vendor/platformdirs/android.py | 120 - .../pip/_vendor/platformdirs/api.py | 156 - .../pip/_vendor/platformdirs/macos.py | 64 - .../pip/_vendor/platformdirs/unix.py | 181 - .../pip/_vendor/platformdirs/version.py | 4 - .../pip/_vendor/platformdirs/windows.py | 182 - .../pip/_vendor/pygments/__init__.py | 83 - .../pip/_vendor/pygments/__main__.py | 17 - .../__pycache__/__init__.cpython-38.pyc | Bin 3004 -> 0 bytes .../__pycache__/__main__.cpython-38.pyc | Bin 586 -> 0 bytes .../__pycache__/cmdline.cpython-38.pyc | Bin 15326 -> 0 bytes .../__pycache__/console.cpython-38.pyc | Bin 1912 -> 0 bytes .../__pycache__/filter.cpython-38.pyc | Bin 2638 -> 0 bytes .../__pycache__/formatter.cpython-38.pyc | Bin 3006 -> 0 bytes .../pygments/__pycache__/lexer.cpython-38.pyc | Bin 24469 -> 0 bytes .../__pycache__/modeline.cpython-38.pyc | Bin 1184 -> 0 bytes .../__pycache__/plugin.cpython-38.pyc | Bin 2106 -> 0 bytes .../__pycache__/regexopt.cpython-38.pyc | Bin 2950 -> 0 bytes .../__pycache__/scanner.cpython-38.pyc | Bin 3552 -> 0 bytes .../__pycache__/sphinxext.cpython-38.pyc | Bin 4556 -> 0 bytes .../pygments/__pycache__/style.cpython-38.pyc | Bin 4478 -> 0 bytes .../pygments/__pycache__/token.cpython-38.pyc | Bin 4511 -> 0 bytes .../__pycache__/unistring.cpython-38.pyc | Bin 31233 -> 0 bytes .../pygments/__pycache__/util.cpython-38.pyc | Bin 9187 -> 0 bytes .../pip/_vendor/pygments/cmdline.py | 663 - .../pip/_vendor/pygments/console.py | 70 - .../pip/_vendor/pygments/filter.py | 71 - .../pip/_vendor/pygments/filters/__init__.py | 937 - .../__pycache__/__init__.cpython-38.pyc | Bin 23362 -> 0 bytes .../pip/_vendor/pygments/formatter.py | 94 - .../_vendor/pygments/formatters/__init__.py | 153 - .../__pycache__/__init__.cpython-38.pyc | Bin 4609 -> 0 bytes .../__pycache__/_mapping.cpython-38.pyc | Bin 5374 -> 0 bytes .../__pycache__/bbcode.cpython-38.pyc | Bin 3059 -> 0 bytes .../__pycache__/groff.cpython-38.pyc | Bin 4367 -> 0 bytes .../__pycache__/html.cpython-38.pyc | Bin 29106 -> 0 bytes .../formatters/__pycache__/img.cpython-38.pyc | Bin 17476 -> 0 bytes .../formatters/__pycache__/irc.cpython-38.pyc | Bin 4450 -> 0 bytes .../__pycache__/latex.cpython-38.pyc | Bin 13818 -> 0 bytes .../__pycache__/other.cpython-38.pyc | Bin 4766 -> 0 bytes .../__pycache__/pangomarkup.cpython-38.pyc | Bin 2088 -> 0 bytes .../formatters/__pycache__/rtf.cpython-38.pyc | Bin 4122 -> 0 bytes .../formatters/__pycache__/svg.cpython-38.pyc | Bin 6340 -> 0 bytes .../__pycache__/terminal.cpython-38.pyc | Bin 3953 -> 0 bytes .../__pycache__/terminal256.cpython-38.pyc | Bin 9215 -> 0 bytes .../_vendor/pygments/formatters/_mapping.py | 84 - .../pip/_vendor/pygments/formatters/bbcode.py | 108 - .../pip/_vendor/pygments/formatters/groff.py | 170 - .../pip/_vendor/pygments/formatters/html.py | 989 - .../pip/_vendor/pygments/formatters/img.py | 641 - .../pip/_vendor/pygments/formatters/irc.py | 179 - .../pip/_vendor/pygments/formatters/latex.py | 521 - .../pip/_vendor/pygments/formatters/other.py | 161 - .../pygments/formatters/pangomarkup.py | 83 - .../pip/_vendor/pygments/formatters/rtf.py | 146 - .../pip/_vendor/pygments/formatters/svg.py | 188 - .../_vendor/pygments/formatters/terminal.py | 127 - .../pygments/formatters/terminal256.py | 338 - .../pip/_vendor/pygments/lexer.py | 882 - .../pip/_vendor/pygments/lexers/__init__.py | 345 - .../__pycache__/__init__.cpython-38.pyc | Bin 9220 -> 0 bytes .../__pycache__/_mapping.cpython-38.pyc | Bin 52388 -> 0 bytes .../lexers/__pycache__/python.cpython-38.pyc | Bin 30832 -> 0 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 596 - .../pip/_vendor/pygments/lexers/python.py | 1191 - .../pip/_vendor/pygments/modeline.py | 43 - .../pip/_vendor/pygments/plugin.py | 69 - .../pip/_vendor/pygments/regexopt.py | 91 - .../pip/_vendor/pygments/scanner.py | 104 - .../pip/_vendor/pygments/sphinxext.py | 155 - .../pip/_vendor/pygments/style.py | 197 - .../pip/_vendor/pygments/styles/__init__.py | 93 - .../__pycache__/__init__.cpython-38.pyc | Bin 3008 -> 0 bytes .../pip/_vendor/pygments/token.py | 212 - .../pip/_vendor/pygments/unistring.py | 153 - .../pip/_vendor/pygments/util.py | 308 - .../pip/_vendor/pyparsing/__init__.py | 331 - .../__pycache__/__init__.cpython-38.pyc | Bin 7750 -> 0 bytes .../__pycache__/actions.cpython-38.pyc | Bin 7167 -> 0 bytes .../__pycache__/common.cpython-38.pyc | Bin 10063 -> 0 bytes .../pyparsing/__pycache__/core.cpython-38.pyc | Bin 178233 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 9157 -> 0 bytes .../__pycache__/helpers.cpython-38.pyc | Bin 35327 -> 0 bytes .../__pycache__/results.cpython-38.pyc | Bin 24858 -> 0 bytes .../__pycache__/testing.cpython-38.pyc | Bin 12122 -> 0 bytes .../__pycache__/unicode.cpython-38.pyc | Bin 10916 -> 0 bytes .../pyparsing/__pycache__/util.cpython-38.pyc | Bin 8633 -> 0 bytes .../pip/_vendor/pyparsing/actions.py | 207 - .../pip/_vendor/pyparsing/common.py | 424 - .../pip/_vendor/pyparsing/core.py | 5814 ---- .../pip/_vendor/pyparsing/diagram/__init__.py | 642 - .../__pycache__/__init__.cpython-38.pyc | Bin 16557 -> 0 bytes .../pip/_vendor/pyparsing/exceptions.py | 267 - .../pip/_vendor/pyparsing/helpers.py | 1088 - .../pip/_vendor/pyparsing/results.py | 760 - .../pip/_vendor/pyparsing/testing.py | 331 - .../pip/_vendor/pyparsing/unicode.py | 352 - .../pip/_vendor/pyparsing/util.py | 235 - .../pip/_vendor/requests/__init__.py | 182 - .../__pycache__/__init__.cpython-38.pyc | Bin 4023 -> 0 bytes .../__pycache__/__version__.cpython-38.pyc | Bin 553 -> 0 bytes .../_internal_utils.cpython-38.pyc | Bin 1584 -> 0 bytes .../__pycache__/adapters.cpython-38.pyc | Bin 16982 -> 0 bytes .../requests/__pycache__/api.cpython-38.pyc | Bin 6693 -> 0 bytes .../requests/__pycache__/auth.cpython-38.pyc | Bin 8346 -> 0 bytes .../requests/__pycache__/certs.cpython-38.pyc | Bin 631 -> 0 bytes .../__pycache__/compat.cpython-38.pyc | Bin 1369 -> 0 bytes .../__pycache__/cookies.cpython-38.pyc | Bin 18822 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 6117 -> 0 bytes .../requests/__pycache__/help.cpython-38.pyc | Bin 2863 -> 0 bytes .../requests/__pycache__/hooks.cpython-38.pyc | Bin 990 -> 0 bytes .../__pycache__/models.cpython-38.pyc | Bin 24349 -> 0 bytes .../__pycache__/packages.cpython-38.pyc | Bin 500 -> 0 bytes .../__pycache__/sessions.cpython-38.pyc | Bin 19685 -> 0 bytes .../__pycache__/status_codes.cpython-38.pyc | Bin 4241 -> 0 bytes .../__pycache__/structures.cpython-38.pyc | Bin 4449 -> 0 bytes .../requests/__pycache__/utils.cpython-38.pyc | Bin 24168 -> 0 bytes .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/_internal_utils.py | 48 - .../pip/_vendor/requests/adapters.py | 584 - .../site-packages/pip/_vendor/requests/api.py | 157 - .../pip/_vendor/requests/auth.py | 315 - .../pip/_vendor/requests/certs.py | 17 - .../pip/_vendor/requests/compat.py | 67 - .../pip/_vendor/requests/cookies.py | 561 - .../pip/_vendor/requests/exceptions.py | 141 - .../pip/_vendor/requests/help.py | 131 - .../pip/_vendor/requests/hooks.py | 33 - .../pip/_vendor/requests/models.py | 1034 - .../pip/_vendor/requests/packages.py | 16 - .../pip/_vendor/requests/sessions.py | 831 - .../pip/_vendor/requests/status_codes.py | 128 - .../pip/_vendor/requests/structures.py | 99 - .../pip/_vendor/requests/utils.py | 1086 - .../pip/_vendor/resolvelib/__init__.py | 26 - .../__pycache__/__init__.cpython-38.pyc | Bin 638 -> 0 bytes .../__pycache__/providers.cpython-38.pyc | Bin 6703 -> 0 bytes .../__pycache__/reporters.cpython-38.pyc | Bin 2615 -> 0 bytes .../__pycache__/resolvers.cpython-38.pyc | Bin 15348 -> 0 bytes .../__pycache__/structs.cpython-38.pyc | Bin 7305 -> 0 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 199 -> 0 bytes .../collections_abc.cpython-38.pyc | Bin 375 -> 0 bytes .../resolvelib/compat/collections_abc.py | 6 - .../pip/_vendor/resolvelib/providers.py | 133 - .../pip/_vendor/resolvelib/reporters.py | 43 - .../pip/_vendor/resolvelib/resolvers.py | 482 - .../pip/_vendor/resolvelib/structs.py | 165 - .../pip/_vendor/rich/__init__.py | 176 - .../pip/_vendor/rich/__main__.py | 282 - .../rich/__pycache__/__init__.cpython-38.pyc | Bin 5858 -> 0 bytes .../rich/__pycache__/__main__.cpython-38.pyc | Bin 7264 -> 0 bytes .../__pycache__/_cell_widths.cpython-38.pyc | Bin 9986 -> 0 bytes .../__pycache__/_emoji_codes.cpython-38.pyc | Bin 132699 -> 0 bytes .../__pycache__/_emoji_replace.cpython-38.pyc | Bin 1188 -> 0 bytes .../__pycache__/_export_format.cpython-38.pyc | Bin 2309 -> 0 bytes .../__pycache__/_extension.cpython-38.pyc | Bin 493 -> 0 bytes .../rich/__pycache__/_inspect.cpython-38.pyc | Bin 8713 -> 0 bytes .../__pycache__/_log_render.cpython-38.pyc | Bin 2578 -> 0 bytes .../rich/__pycache__/_loop.cpython-38.pyc | Bin 1272 -> 0 bytes .../rich/__pycache__/_palettes.cpython-38.pyc | Bin 6221 -> 0 bytes .../rich/__pycache__/_pick.cpython-38.pyc | Bin 652 -> 0 bytes .../rich/__pycache__/_ratio.cpython-38.pyc | Bin 5168 -> 0 bytes .../rich/__pycache__/_spinners.cpython-38.pyc | Bin 12428 -> 0 bytes .../rich/__pycache__/_stack.cpython-38.pyc | Bin 841 -> 0 bytes .../rich/__pycache__/_timer.cpython-38.pyc | Bin 688 -> 0 bytes .../__pycache__/_win32_console.cpython-38.pyc | Bin 19264 -> 0 bytes .../rich/__pycache__/_windows.cpython-38.pyc | Bin 1777 -> 0 bytes .../_windows_renderer.cpython-38.pyc | Bin 2053 -> 0 bytes .../rich/__pycache__/_wrap.cpython-38.pyc | Bin 1529 -> 0 bytes .../rich/__pycache__/abc.cpython-38.pyc | Bin 1302 -> 0 bytes .../rich/__pycache__/align.cpython-38.pyc | Bin 7865 -> 0 bytes .../rich/__pycache__/ansi.cpython-38.pyc | Bin 5568 -> 0 bytes .../rich/__pycache__/bar.cpython-38.pyc | Bin 2934 -> 0 bytes .../rich/__pycache__/box.cpython-38.pyc | Bin 8497 -> 0 bytes .../rich/__pycache__/cells.cpython-38.pyc | Bin 4013 -> 0 bytes .../rich/__pycache__/color.cpython-38.pyc | Bin 15235 -> 0 bytes .../__pycache__/color_triplet.cpython-38.pyc | Bin 1423 -> 0 bytes .../rich/__pycache__/columns.cpython-38.pyc | Bin 6137 -> 0 bytes .../rich/__pycache__/console.cpython-38.pyc | Bin 80205 -> 0 bytes .../rich/__pycache__/constrain.cpython-38.pyc | Bin 1665 -> 0 bytes .../__pycache__/containers.cpython-38.pyc | Bin 6444 -> 0 bytes .../rich/__pycache__/control.cpython-38.pyc | Bin 8213 -> 0 bytes .../__pycache__/default_styles.cpython-38.pyc | Bin 5285 -> 0 bytes .../rich/__pycache__/diagnose.cpython-38.pyc | Bin 1215 -> 0 bytes .../rich/__pycache__/emoji.cpython-38.pyc | Bin 3212 -> 0 bytes .../rich/__pycache__/errors.cpython-38.pyc | Bin 1667 -> 0 bytes .../__pycache__/file_proxy.cpython-38.pyc | Bin 2225 -> 0 bytes .../rich/__pycache__/filesize.cpython-38.pyc | Bin 2610 -> 0 bytes .../__pycache__/highlighter.cpython-38.pyc | Bin 8066 -> 0 bytes .../rich/__pycache__/json.cpython-38.pyc | Bin 4677 -> 0 bytes .../rich/__pycache__/jupyter.cpython-38.pyc | Bin 4065 -> 0 bytes .../rich/__pycache__/layout.cpython-38.pyc | Bin 14665 -> 0 bytes .../rich/__pycache__/live.cpython-38.pyc | Bin 11026 -> 0 bytes .../__pycache__/live_render.cpython-38.pyc | Bin 3386 -> 0 bytes .../rich/__pycache__/logging.cpython-38.pyc | Bin 9748 -> 0 bytes .../rich/__pycache__/markup.cpython-38.pyc | Bin 5942 -> 0 bytes .../rich/__pycache__/measure.cpython-38.pyc | Bin 5007 -> 0 bytes .../rich/__pycache__/padding.cpython-38.pyc | Bin 4414 -> 0 bytes .../rich/__pycache__/pager.cpython-38.pyc | Bin 1431 -> 0 bytes .../rich/__pycache__/palette.cpython-38.pyc | Bin 3688 -> 0 bytes .../rich/__pycache__/panel.cpython-38.pyc | Bin 6433 -> 0 bytes .../rich/__pycache__/pretty.cpython-38.pyc | Bin 27374 -> 0 bytes .../rich/__pycache__/progress.cpython-38.pyc | Bin 53070 -> 0 bytes .../__pycache__/progress_bar.cpython-38.pyc | Bin 6835 -> 0 bytes .../rich/__pycache__/prompt.cpython-38.pyc | Bin 11371 -> 0 bytes .../rich/__pycache__/protocol.cpython-38.pyc | Bin 1337 -> 0 bytes .../rich/__pycache__/region.cpython-38.pyc | Bin 523 -> 0 bytes .../rich/__pycache__/repr.cpython-38.pyc | Bin 4112 -> 0 bytes .../rich/__pycache__/rule.cpython-38.pyc | Bin 4272 -> 0 bytes .../rich/__pycache__/scope.cpython-38.pyc | Bin 2971 -> 0 bytes .../rich/__pycache__/screen.cpython-38.pyc | Bin 1828 -> 0 bytes .../rich/__pycache__/segment.cpython-38.pyc | Bin 20539 -> 0 bytes .../rich/__pycache__/spinner.cpython-38.pyc | Bin 4345 -> 0 bytes .../rich/__pycache__/status.cpython-38.pyc | Bin 4561 -> 0 bytes .../rich/__pycache__/style.cpython-38.pyc | Bin 20873 -> 0 bytes .../rich/__pycache__/styled.cpython-38.pyc | Bin 1690 -> 0 bytes .../rich/__pycache__/syntax.cpython-38.pyc | Bin 25272 -> 0 bytes .../rich/__pycache__/table.cpython-38.pyc | Bin 29475 -> 0 bytes .../__pycache__/terminal_theme.cpython-38.pyc | Bin 3194 -> 0 bytes .../rich/__pycache__/text.cpython-38.pyc | Bin 39743 -> 0 bytes .../rich/__pycache__/theme.cpython-38.pyc | Bin 4682 -> 0 bytes .../rich/__pycache__/themes.cpython-38.pyc | Bin 291 -> 0 bytes .../rich/__pycache__/traceback.cpython-38.pyc | Bin 19462 -> 0 bytes .../rich/__pycache__/tree.cpython-38.pyc | Bin 7247 -> 0 bytes .../pip/_vendor/rich/_cell_widths.py | 451 - .../pip/_vendor/rich/_emoji_codes.py | 3610 --- .../pip/_vendor/rich/_emoji_replace.py | 32 - .../pip/_vendor/rich/_export_format.py | 78 - .../pip/_vendor/rich/_extension.py | 10 - .../pip/_vendor/rich/_inspect.py | 270 - .../pip/_vendor/rich/_log_render.py | 94 - .../site-packages/pip/_vendor/rich/_loop.py | 43 - .../pip/_vendor/rich/_palettes.py | 309 - .../site-packages/pip/_vendor/rich/_pick.py | 17 - .../site-packages/pip/_vendor/rich/_ratio.py | 160 - .../pip/_vendor/rich/_spinners.py | 482 - .../site-packages/pip/_vendor/rich/_stack.py | 16 - .../site-packages/pip/_vendor/rich/_timer.py | 19 - .../pip/_vendor/rich/_win32_console.py | 662 - .../pip/_vendor/rich/_windows.py | 72 - .../pip/_vendor/rich/_windows_renderer.py | 56 - .../site-packages/pip/_vendor/rich/_wrap.py | 56 - .../Lib/site-packages/pip/_vendor/rich/abc.py | 33 - .../site-packages/pip/_vendor/rich/align.py | 311 - .../site-packages/pip/_vendor/rich/ansi.py | 237 - .../Lib/site-packages/pip/_vendor/rich/bar.py | 94 - .../Lib/site-packages/pip/_vendor/rich/box.py | 517 - .../site-packages/pip/_vendor/rich/cells.py | 154 - .../site-packages/pip/_vendor/rich/color.py | 615 - .../pip/_vendor/rich/color_triplet.py | 38 - .../site-packages/pip/_vendor/rich/columns.py | 187 - .../site-packages/pip/_vendor/rich/console.py | 2572 -- .../pip/_vendor/rich/constrain.py | 37 - .../pip/_vendor/rich/containers.py | 167 - .../site-packages/pip/_vendor/rich/control.py | 225 - .../pip/_vendor/rich/default_styles.py | 188 - .../pip/_vendor/rich/diagnose.py | 37 - .../site-packages/pip/_vendor/rich/emoji.py | 96 - .../site-packages/pip/_vendor/rich/errors.py | 34 - .../pip/_vendor/rich/file_proxy.py | 54 - .../pip/_vendor/rich/filesize.py | 89 - .../pip/_vendor/rich/highlighter.py | 232 - .../site-packages/pip/_vendor/rich/json.py | 140 - .../site-packages/pip/_vendor/rich/jupyter.py | 101 - .../site-packages/pip/_vendor/rich/layout.py | 445 - .../site-packages/pip/_vendor/rich/live.py | 373 - .../pip/_vendor/rich/live_render.py | 113 - .../site-packages/pip/_vendor/rich/logging.py | 280 - .../site-packages/pip/_vendor/rich/markup.py | 246 - .../site-packages/pip/_vendor/rich/measure.py | 151 - .../site-packages/pip/_vendor/rich/padding.py | 141 - .../site-packages/pip/_vendor/rich/pager.py | 34 - .../site-packages/pip/_vendor/rich/palette.py | 100 - .../site-packages/pip/_vendor/rich/panel.py | 251 - .../site-packages/pip/_vendor/rich/pretty.py | 1010 - .../pip/_vendor/rich/progress.py | 1703 -- .../pip/_vendor/rich/progress_bar.py | 224 - .../site-packages/pip/_vendor/rich/prompt.py | 376 - .../pip/_vendor/rich/protocol.py | 42 - .../site-packages/pip/_vendor/rich/region.py | 10 - .../site-packages/pip/_vendor/rich/repr.py | 152 - .../site-packages/pip/_vendor/rich/rule.py | 134 - .../site-packages/pip/_vendor/rich/scope.py | 86 - .../site-packages/pip/_vendor/rich/screen.py | 54 - .../site-packages/pip/_vendor/rich/segment.py | 739 - .../site-packages/pip/_vendor/rich/spinner.py | 136 - .../site-packages/pip/_vendor/rich/status.py | 132 - .../site-packages/pip/_vendor/rich/style.py | 771 - .../site-packages/pip/_vendor/rich/styled.py | 42 - .../site-packages/pip/_vendor/rich/syntax.py | 934 - .../site-packages/pip/_vendor/rich/table.py | 996 - .../pip/_vendor/rich/terminal_theme.py | 153 - .../site-packages/pip/_vendor/rich/text.py | 1286 - .../site-packages/pip/_vendor/rich/theme.py | 112 - .../site-packages/pip/_vendor/rich/themes.py | 5 - .../pip/_vendor/rich/traceback.py | 679 - .../site-packages/pip/_vendor/rich/tree.py | 251 - .venv/Lib/site-packages/pip/_vendor/six.py | 998 - .../pip/_vendor/tenacity/__init__.py | 517 - .../__pycache__/__init__.cpython-38.pyc | Bin 16231 -> 0 bytes .../__pycache__/_asyncio.cpython-38.pyc | Bin 2582 -> 0 bytes .../__pycache__/_utils.cpython-38.pyc | Bin 1235 -> 0 bytes .../tenacity/__pycache__/after.cpython-38.pyc | Bin 1200 -> 0 bytes .../__pycache__/before.cpython-38.pyc | Bin 1092 -> 0 bytes .../__pycache__/before_sleep.cpython-38.pyc | Bin 1376 -> 0 bytes .../tenacity/__pycache__/nap.cpython-38.pyc | Bin 1190 -> 0 bytes .../tenacity/__pycache__/retry.cpython-38.pyc | Bin 8782 -> 0 bytes .../tenacity/__pycache__/stop.cpython-38.pyc | Bin 4250 -> 0 bytes .../__pycache__/tornadoweb.cpython-38.pyc | Bin 1736 -> 0 bytes .../tenacity/__pycache__/wait.cpython-38.pyc | Bin 7960 -> 0 bytes .../pip/_vendor/tenacity/_asyncio.py | 92 - .../pip/_vendor/tenacity/_utils.py | 68 - .../pip/_vendor/tenacity/after.py | 46 - .../pip/_vendor/tenacity/before.py | 41 - .../pip/_vendor/tenacity/before_sleep.py | 58 - .../site-packages/pip/_vendor/tenacity/nap.py | 43 - .../pip/_vendor/tenacity/retry.py | 213 - .../pip/_vendor/tenacity/stop.py | 96 - .../pip/_vendor/tenacity/tornadoweb.py | 59 - .../pip/_vendor/tenacity/wait.py | 191 - .../pip/_vendor/tomli/__init__.py | 11 - .../tomli/__pycache__/__init__.cpython-38.pyc | Bin 353 -> 0 bytes .../tomli/__pycache__/_parser.cpython-38.pyc | Bin 16665 -> 0 bytes .../tomli/__pycache__/_re.cpython-38.pyc | Bin 2836 -> 0 bytes .../tomli/__pycache__/_types.cpython-38.pyc | Bin 323 -> 0 bytes .../pip/_vendor/tomli/_parser.py | 691 - .../site-packages/pip/_vendor/tomli/_re.py | 107 - .../site-packages/pip/_vendor/tomli/_types.py | 10 - .../pip/_vendor/typing_extensions.py | 2069 -- .../pip/_vendor/urllib3/__init__.py | 85 - .../__pycache__/__init__.cpython-38.pyc | Bin 2187 -> 0 bytes .../__pycache__/_collections.cpython-38.pyc | Bin 10700 -> 0 bytes .../__pycache__/_version.cpython-38.pyc | Bin 212 -> 0 bytes .../__pycache__/connection.cpython-38.pyc | Bin 13689 -> 0 bytes .../__pycache__/connectionpool.cpython-38.pyc | Bin 25383 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 11644 -> 0 bytes .../urllib3/__pycache__/fields.cpython-38.pyc | Bin 8181 -> 0 bytes .../__pycache__/filepost.cpython-38.pyc | Bin 2768 -> 0 bytes .../__pycache__/poolmanager.cpython-38.pyc | Bin 15143 -> 0 bytes .../__pycache__/request.cpython-38.pyc | Bin 5624 -> 0 bytes .../__pycache__/response.cpython-38.pyc | Bin 20671 -> 0 bytes .../pip/_vendor/urllib3/_collections.py | 337 - .../pip/_vendor/urllib3/_version.py | 2 - .../pip/_vendor/urllib3/connection.py | 567 - .../pip/_vendor/urllib3/connectionpool.py | 1110 - .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 197 -> 0 bytes .../_appengine_environ.cpython-38.pyc | Bin 1421 -> 0 bytes .../__pycache__/appengine.cpython-38.pyc | Bin 8270 -> 0 bytes .../__pycache__/ntlmpool.cpython-38.pyc | Bin 3640 -> 0 bytes .../__pycache__/pyopenssl.cpython-38.pyc | Bin 15607 -> 0 bytes .../securetransport.cpython-38.pyc | Bin 21658 -> 0 bytes .../contrib/__pycache__/socks.cpython-38.pyc | Bin 5635 -> 0 bytes .../urllib3/contrib/_appengine_environ.py | 36 - .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 214 -> 0 bytes .../__pycache__/bindings.cpython-38.pyc | Bin 10732 -> 0 bytes .../__pycache__/low_level.cpython-38.pyc | Bin 9106 -> 0 bytes .../contrib/_securetransport/bindings.py | 519 - .../contrib/_securetransport/low_level.py | 397 - .../pip/_vendor/urllib3/contrib/appengine.py | 314 - .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 - .../pip/_vendor/urllib3/contrib/pyopenssl.py | 510 - .../urllib3/contrib/securetransport.py | 921 - .../pip/_vendor/urllib3/contrib/socks.py | 216 - .../pip/_vendor/urllib3/exceptions.py | 323 - .../pip/_vendor/urllib3/fields.py | 274 - .../pip/_vendor/urllib3/filepost.py | 98 - .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 198 -> 0 bytes .../packages/__pycache__/six.cpython-38.pyc | Bin 27593 -> 0 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 208 -> 0 bytes .../__pycache__/makefile.cpython-38.pyc | Bin 1312 -> 0 bytes .../urllib3/packages/backports/makefile.py | 51 - .../pip/_vendor/urllib3/packages/six.py | 1076 - .../pip/_vendor/urllib3/poolmanager.py | 537 - .../pip/_vendor/urllib3/request.py | 170 - .../pip/_vendor/urllib3/response.py | 818 - .../pip/_vendor/urllib3/util/__init__.py | 49 - .../util/__pycache__/__init__.cpython-38.pyc | Bin 1107 -> 0 bytes .../__pycache__/connection.cpython-38.pyc | Bin 3445 -> 0 bytes .../util/__pycache__/proxy.cpython-38.pyc | Bin 1351 -> 0 bytes .../util/__pycache__/queue.cpython-38.pyc | Bin 1062 -> 0 bytes .../util/__pycache__/request.cpython-38.pyc | Bin 3355 -> 0 bytes .../util/__pycache__/response.cpython-38.pyc | Bin 2355 -> 0 bytes .../util/__pycache__/retry.cpython-38.pyc | Bin 16270 -> 0 bytes .../util/__pycache__/ssl_.cpython-38.pyc | Bin 11394 -> 0 bytes .../ssl_match_hostname.cpython-38.pyc | Bin 3267 -> 0 bytes .../__pycache__/ssltransport.cpython-38.pyc | Bin 7441 -> 0 bytes .../util/__pycache__/timeout.cpython-38.pyc | Bin 8949 -> 0 bytes .../util/__pycache__/url.cpython-38.pyc | Bin 10789 -> 0 bytes .../util/__pycache__/wait.cpython-38.pyc | Bin 3109 -> 0 bytes .../pip/_vendor/urllib3/util/connection.py | 149 - .../pip/_vendor/urllib3/util/proxy.py | 57 - .../pip/_vendor/urllib3/util/queue.py | 22 - .../pip/_vendor/urllib3/util/request.py | 137 - .../pip/_vendor/urllib3/util/response.py | 107 - .../pip/_vendor/urllib3/util/retry.py | 620 - .../pip/_vendor/urllib3/util/ssl_.py | 495 - .../urllib3/util/ssl_match_hostname.py | 159 - .../pip/_vendor/urllib3/util/ssltransport.py | 221 - .../pip/_vendor/urllib3/util/timeout.py | 268 - .../pip/_vendor/urllib3/util/url.py | 435 - .../pip/_vendor/urllib3/util/wait.py | 152 - .../Lib/site-packages/pip/_vendor/vendor.txt | 23 - .../pip/_vendor/webencodings/__init__.py | 342 - .../__pycache__/__init__.cpython-38.pyc | Bin 9737 -> 0 bytes .../__pycache__/labels.cpython-38.pyc | Bin 3835 -> 0 bytes .../__pycache__/mklabels.cpython-38.pyc | Bin 1931 -> 0 bytes .../__pycache__/tests.cpython-38.pyc | Bin 5097 -> 0 bytes .../__pycache__/x_user_defined.cpython-38.pyc | Bin 2665 -> 0 bytes .../pip/_vendor/webencodings/labels.py | 231 - .../pip/_vendor/webencodings/mklabels.py | 59 - .../pip/_vendor/webencodings/tests.py | 153 - .../_vendor/webencodings/x_user_defined.py | 325 - .venv/Lib/site-packages/pip/py.typed | 4 - .../site-packages/pkg_resources/__init__.py | 3288 --- .../__pycache__/__init__.cpython-38.pyc | Bin 100424 -> 0 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 191 -> 0 bytes .../__pycache__/appdirs.cpython-38.pyc | Bin 20544 -> 0 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 201668 -> 0 bytes .../pkg_resources/_vendor/appdirs.py | 608 - .../_vendor/packaging/__about__.py | 27 - .../_vendor/packaging/__init__.py | 26 - .../__pycache__/__about__.cpython-38.pyc | Bin 733 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 579 -> 0 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 1151 -> 0 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 2905 -> 0 bytes .../__pycache__/_typing.cpython-38.pyc | Bin 1496 -> 0 bytes .../__pycache__/markers.cpython-38.pyc | Bin 9340 -> 0 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 4093 -> 0 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 20614 -> 0 bytes .../packaging/__pycache__/tags.cpython-38.pyc | Bin 17266 -> 0 bytes .../__pycache__/utils.cpython-38.pyc | Bin 1668 -> 0 bytes .../__pycache__/version.cpython-38.pyc | Bin 13343 -> 0 bytes .../_vendor/packaging/_compat.py | 38 - .../_vendor/packaging/_structures.py | 86 - .../_vendor/packaging/_typing.py | 48 - .../_vendor/packaging/markers.py | 328 - .../_vendor/packaging/requirements.py | 145 - .../_vendor/packaging/specifiers.py | 863 - .../pkg_resources/_vendor/packaging/tags.py | 751 - .../pkg_resources/_vendor/packaging/utils.py | 65 - .../_vendor/packaging/version.py | 535 - .../pkg_resources/_vendor/pyparsing.py | 5742 ---- .../pkg_resources/extern/__init__.py | 73 - .../__pycache__/__init__.cpython-38.pyc | Bin 2878 -> 0 bytes .../__pycache__/setup.cpython-38.pyc | Bin 319 -> 0 bytes .../data/my-test-package-source/setup.py | 6 - .../python_dateutil-2.8.2.dist-info/INSTALLER | 1 - .../python_dateutil-2.8.2.dist-info/LICENSE | 54 - .../python_dateutil-2.8.2.dist-info/METADATA | 204 - .../python_dateutil-2.8.2.dist-info/RECORD | 44 - .../python_dateutil-2.8.2.dist-info/WHEEL | 6 - .../top_level.txt | 1 - .../python_dateutil-2.8.2.dist-info/zip-safe | 1 - .../pytz-2022.2.1.dist-info/INSTALLER | 1 - .../pytz-2022.2.1.dist-info/LICENSE.txt | 19 - .../pytz-2022.2.1.dist-info/METADATA | 635 - .../pytz-2022.2.1.dist-info/RECORD | 620 - .../pytz-2022.2.1.dist-info/WHEEL | 6 - .../pytz-2022.2.1.dist-info/top_level.txt | 1 - .../pytz-2022.2.1.dist-info/zip-safe | 1 - .venv/Lib/site-packages/pytz/__init__.py | 1560 - .../pytz/__pycache__/__init__.cpython-38.pyc | Bin 29597 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 2164 -> 0 bytes .../pytz/__pycache__/lazy.cpython-38.pyc | Bin 5053 -> 0 bytes .../pytz/__pycache__/reference.cpython-38.pyc | Bin 3921 -> 0 bytes .../pytz/__pycache__/tzfile.cpython-38.pyc | Bin 3143 -> 0 bytes .../pytz/__pycache__/tzinfo.cpython-38.pyc | Bin 14916 -> 0 bytes .venv/Lib/site-packages/pytz/exceptions.py | 59 - .venv/Lib/site-packages/pytz/lazy.py | 172 - .venv/Lib/site-packages/pytz/reference.py | 140 - .venv/Lib/site-packages/pytz/tzfile.py | 133 - .venv/Lib/site-packages/pytz/tzinfo.py | 577 - .../pytz/zoneinfo/Africa/Abidjan | Bin 148 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Accra | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Addis_Ababa | Bin 265 -> 0 bytes .../pytz/zoneinfo/Africa/Algiers | Bin 735 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Asmara | Bin 265 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Asmera | Bin 265 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Bamako | Bin 148 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Bangui | Bin 235 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Banjul | Bin 148 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Bissau | Bin 194 -> 0 bytes .../pytz/zoneinfo/Africa/Blantyre | Bin 149 -> 0 bytes .../pytz/zoneinfo/Africa/Brazzaville | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/Bujumbura | Bin 149 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Cairo | Bin 1955 -> 0 bytes .../pytz/zoneinfo/Africa/Casablanca | Bin 2429 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Ceuta | Bin 2036 -> 0 bytes .../pytz/zoneinfo/Africa/Conakry | Bin 148 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Dakar | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Dar_es_Salaam | Bin 265 -> 0 bytes .../pytz/zoneinfo/Africa/Djibouti | Bin 265 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Douala | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/El_Aaiun | Bin 2295 -> 0 bytes .../pytz/zoneinfo/Africa/Freetown | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Gaborone | Bin 149 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Harare | Bin 149 -> 0 bytes .../pytz/zoneinfo/Africa/Johannesburg | Bin 246 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Juba | Bin 679 -> 0 bytes .../pytz/zoneinfo/Africa/Kampala | Bin 265 -> 0 bytes .../pytz/zoneinfo/Africa/Khartoum | Bin 679 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Kigali | Bin 149 -> 0 bytes .../pytz/zoneinfo/Africa/Kinshasa | Bin 235 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Lagos | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/Libreville | Bin 235 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Lome | Bin 148 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Luanda | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/Lubumbashi | Bin 149 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Lusaka | Bin 149 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Malabo | Bin 235 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Maputo | Bin 149 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Maseru | Bin 246 -> 0 bytes .../pytz/zoneinfo/Africa/Mbabane | Bin 246 -> 0 bytes .../pytz/zoneinfo/Africa/Mogadishu | Bin 265 -> 0 bytes .../pytz/zoneinfo/Africa/Monrovia | Bin 208 -> 0 bytes .../pytz/zoneinfo/Africa/Nairobi | Bin 265 -> 0 bytes .../pytz/zoneinfo/Africa/Ndjamena | Bin 199 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Niamey | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/Nouakchott | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Ouagadougou | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Porto-Novo | Bin 235 -> 0 bytes .../pytz/zoneinfo/Africa/Sao_Tome | Bin 254 -> 0 bytes .../pytz/zoneinfo/Africa/Timbuktu | Bin 148 -> 0 bytes .../pytz/zoneinfo/Africa/Tripoli | Bin 625 -> 0 bytes .../site-packages/pytz/zoneinfo/Africa/Tunis | Bin 689 -> 0 bytes .../pytz/zoneinfo/Africa/Windhoek | Bin 955 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Adak | Bin 2356 -> 0 bytes .../pytz/zoneinfo/America/Anchorage | Bin 2371 -> 0 bytes .../pytz/zoneinfo/America/Anguilla | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Antigua | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Araguaina | Bin 884 -> 0 bytes .../zoneinfo/America/Argentina/Buenos_Aires | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Catamarca | Bin 1076 -> 0 bytes .../zoneinfo/America/Argentina/ComodRivadavia | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Cordoba | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Jujuy | Bin 1048 -> 0 bytes .../pytz/zoneinfo/America/Argentina/La_Rioja | Bin 1090 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Mendoza | Bin 1076 -> 0 bytes .../zoneinfo/America/Argentina/Rio_Gallegos | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Salta | Bin 1048 -> 0 bytes .../pytz/zoneinfo/America/Argentina/San_Juan | Bin 1090 -> 0 bytes .../pytz/zoneinfo/America/Argentina/San_Luis | Bin 1102 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Tucuman | Bin 1104 -> 0 bytes .../pytz/zoneinfo/America/Argentina/Ushuaia | Bin 1076 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Aruba | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Asuncion | Bin 2044 -> 0 bytes .../pytz/zoneinfo/America/Atikokan | Bin 182 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Atka | Bin 2356 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Bahia | Bin 1024 -> 0 bytes .../pytz/zoneinfo/America/Bahia_Banderas | Bin 1546 -> 0 bytes .../pytz/zoneinfo/America/Barbados | Bin 436 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Belem | Bin 576 -> 0 bytes .../pytz/zoneinfo/America/Belize | Bin 1614 -> 0 bytes .../pytz/zoneinfo/America/Blanc-Sablon | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Boa_Vista | Bin 632 -> 0 bytes .../pytz/zoneinfo/America/Bogota | Bin 246 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Boise | Bin 2394 -> 0 bytes .../pytz/zoneinfo/America/Buenos_Aires | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Cambridge_Bay | Bin 2084 -> 0 bytes .../pytz/zoneinfo/America/Campo_Grande | Bin 1444 -> 0 bytes .../pytz/zoneinfo/America/Cancun | Bin 782 -> 0 bytes .../pytz/zoneinfo/America/Caracas | Bin 264 -> 0 bytes .../pytz/zoneinfo/America/Catamarca | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Cayenne | Bin 198 -> 0 bytes .../pytz/zoneinfo/America/Cayman | Bin 182 -> 0 bytes .../pytz/zoneinfo/America/Chicago | Bin 3576 -> 0 bytes .../pytz/zoneinfo/America/Chihuahua | Bin 1484 -> 0 bytes .../pytz/zoneinfo/America/Coral_Harbour | Bin 182 -> 0 bytes .../pytz/zoneinfo/America/Cordoba | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Costa_Rica | Bin 316 -> 0 bytes .../pytz/zoneinfo/America/Creston | Bin 328 -> 0 bytes .../pytz/zoneinfo/America/Cuiaba | Bin 1416 -> 0 bytes .../pytz/zoneinfo/America/Curacao | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Danmarkshavn | Bin 698 -> 0 bytes .../pytz/zoneinfo/America/Dawson | Bin 1614 -> 0 bytes .../pytz/zoneinfo/America/Dawson_Creek | Bin 1050 -> 0 bytes .../pytz/zoneinfo/America/Denver | Bin 2444 -> 0 bytes .../pytz/zoneinfo/America/Detroit | Bin 2230 -> 0 bytes .../pytz/zoneinfo/America/Dominica | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Edmonton | Bin 2332 -> 0 bytes .../pytz/zoneinfo/America/Eirunepe | Bin 656 -> 0 bytes .../pytz/zoneinfo/America/El_Salvador | Bin 224 -> 0 bytes .../pytz/zoneinfo/America/Ensenada | Bin 2342 -> 0 bytes .../pytz/zoneinfo/America/Fort_Nelson | Bin 2240 -> 0 bytes .../pytz/zoneinfo/America/Fort_Wayne | Bin 1666 -> 0 bytes .../pytz/zoneinfo/America/Fortaleza | Bin 716 -> 0 bytes .../pytz/zoneinfo/America/Glace_Bay | Bin 2192 -> 0 bytes .../pytz/zoneinfo/America/Godthab | Bin 1878 -> 0 bytes .../pytz/zoneinfo/America/Goose_Bay | Bin 3210 -> 0 bytes .../pytz/zoneinfo/America/Grand_Turk | Bin 1834 -> 0 bytes .../pytz/zoneinfo/America/Grenada | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Guadeloupe | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Guatemala | Bin 280 -> 0 bytes .../pytz/zoneinfo/America/Guayaquil | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Guyana | Bin 262 -> 0 bytes .../pytz/zoneinfo/America/Halifax | Bin 3424 -> 0 bytes .../pytz/zoneinfo/America/Havana | Bin 2416 -> 0 bytes .../pytz/zoneinfo/America/Hermosillo | Bin 416 -> 0 bytes .../zoneinfo/America/Indiana/Indianapolis | Bin 1666 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Knox | Bin 2428 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Marengo | Bin 1722 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Petersburg | Bin 1904 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Tell_City | Bin 1684 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Vevay | Bin 1414 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Vincennes | Bin 1694 -> 0 bytes .../pytz/zoneinfo/America/Indiana/Winamac | Bin 1778 -> 0 bytes .../pytz/zoneinfo/America/Indianapolis | Bin 1666 -> 0 bytes .../pytz/zoneinfo/America/Inuvik | Bin 1894 -> 0 bytes .../pytz/zoneinfo/America/Iqaluit | Bin 2032 -> 0 bytes .../pytz/zoneinfo/America/Jamaica | Bin 482 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Jujuy | Bin 1048 -> 0 bytes .../pytz/zoneinfo/America/Juneau | Bin 2353 -> 0 bytes .../pytz/zoneinfo/America/Kentucky/Louisville | Bin 2772 -> 0 bytes .../pytz/zoneinfo/America/Kentucky/Monticello | Bin 2352 -> 0 bytes .../pytz/zoneinfo/America/Knox_IN | Bin 2428 -> 0 bytes .../pytz/zoneinfo/America/Kralendijk | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/La_Paz | Bin 232 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Lima | Bin 406 -> 0 bytes .../pytz/zoneinfo/America/Los_Angeles | Bin 2836 -> 0 bytes .../pytz/zoneinfo/America/Louisville | Bin 2772 -> 0 bytes .../pytz/zoneinfo/America/Lower_Princes | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Maceio | Bin 744 -> 0 bytes .../pytz/zoneinfo/America/Managua | Bin 430 -> 0 bytes .../pytz/zoneinfo/America/Manaus | Bin 604 -> 0 bytes .../pytz/zoneinfo/America/Marigot | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Martinique | Bin 232 -> 0 bytes .../pytz/zoneinfo/America/Matamoros | Bin 1390 -> 0 bytes .../pytz/zoneinfo/America/Mazatlan | Bin 1526 -> 0 bytes .../pytz/zoneinfo/America/Mendoza | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Menominee | Bin 2274 -> 0 bytes .../pytz/zoneinfo/America/Merida | Bin 1422 -> 0 bytes .../pytz/zoneinfo/America/Metlakatla | Bin 1423 -> 0 bytes .../pytz/zoneinfo/America/Mexico_City | Bin 1584 -> 0 bytes .../pytz/zoneinfo/America/Miquelon | Bin 1666 -> 0 bytes .../pytz/zoneinfo/America/Moncton | Bin 3154 -> 0 bytes .../pytz/zoneinfo/America/Monterrey | Bin 1390 -> 0 bytes .../pytz/zoneinfo/America/Montevideo | Bin 1510 -> 0 bytes .../pytz/zoneinfo/America/Montreal | Bin 3494 -> 0 bytes .../pytz/zoneinfo/America/Montserrat | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Nassau | Bin 3494 -> 0 bytes .../pytz/zoneinfo/America/New_York | Bin 3552 -> 0 bytes .../pytz/zoneinfo/America/Nipigon | Bin 2122 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Nome | Bin 2367 -> 0 bytes .../pytz/zoneinfo/America/Noronha | Bin 716 -> 0 bytes .../pytz/zoneinfo/America/North_Dakota/Beulah | Bin 2380 -> 0 bytes .../pytz/zoneinfo/America/North_Dakota/Center | Bin 2380 -> 0 bytes .../zoneinfo/America/North_Dakota/New_Salem | Bin 2380 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Nuuk | Bin 1878 -> 0 bytes .../pytz/zoneinfo/America/Ojinaga | Bin 1484 -> 0 bytes .../pytz/zoneinfo/America/Panama | Bin 182 -> 0 bytes .../pytz/zoneinfo/America/Pangnirtung | Bin 2094 -> 0 bytes .../pytz/zoneinfo/America/Paramaribo | Bin 262 -> 0 bytes .../pytz/zoneinfo/America/Phoenix | Bin 328 -> 0 bytes .../pytz/zoneinfo/America/Port-au-Prince | Bin 1434 -> 0 bytes .../pytz/zoneinfo/America/Port_of_Spain | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Porto_Acre | Bin 628 -> 0 bytes .../pytz/zoneinfo/America/Porto_Velho | Bin 576 -> 0 bytes .../pytz/zoneinfo/America/Puerto_Rico | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Punta_Arenas | Bin 1916 -> 0 bytes .../pytz/zoneinfo/America/Rainy_River | Bin 2122 -> 0 bytes .../pytz/zoneinfo/America/Rankin_Inlet | Bin 1892 -> 0 bytes .../pytz/zoneinfo/America/Recife | Bin 716 -> 0 bytes .../pytz/zoneinfo/America/Regina | Bin 980 -> 0 bytes .../pytz/zoneinfo/America/Resolute | Bin 1892 -> 0 bytes .../pytz/zoneinfo/America/Rio_Branco | Bin 628 -> 0 bytes .../pytz/zoneinfo/America/Rosario | Bin 1076 -> 0 bytes .../pytz/zoneinfo/America/Santa_Isabel | Bin 2342 -> 0 bytes .../pytz/zoneinfo/America/Santarem | Bin 602 -> 0 bytes .../pytz/zoneinfo/America/Santiago | Bin 2529 -> 0 bytes .../pytz/zoneinfo/America/Santo_Domingo | Bin 458 -> 0 bytes .../pytz/zoneinfo/America/Sao_Paulo | Bin 1444 -> 0 bytes .../pytz/zoneinfo/America/Scoresbysund | Bin 1916 -> 0 bytes .../pytz/zoneinfo/America/Shiprock | Bin 2444 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Sitka | Bin 2329 -> 0 bytes .../pytz/zoneinfo/America/St_Barthelemy | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/St_Johns | Bin 3655 -> 0 bytes .../pytz/zoneinfo/America/St_Kitts | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/St_Lucia | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/St_Thomas | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/St_Vincent | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Swift_Current | Bin 560 -> 0 bytes .../pytz/zoneinfo/America/Tegucigalpa | Bin 252 -> 0 bytes .../site-packages/pytz/zoneinfo/America/Thule | Bin 1502 -> 0 bytes .../pytz/zoneinfo/America/Thunder_Bay | Bin 2202 -> 0 bytes .../pytz/zoneinfo/America/Tijuana | Bin 2342 -> 0 bytes .../pytz/zoneinfo/America/Toronto | Bin 3494 -> 0 bytes .../pytz/zoneinfo/America/Tortola | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Vancouver | Bin 2892 -> 0 bytes .../pytz/zoneinfo/America/Virgin | Bin 246 -> 0 bytes .../pytz/zoneinfo/America/Whitehorse | Bin 1614 -> 0 bytes .../pytz/zoneinfo/America/Winnipeg | Bin 2868 -> 0 bytes .../pytz/zoneinfo/America/Yakutat | Bin 2305 -> 0 bytes .../pytz/zoneinfo/America/Yellowknife | Bin 1966 -> 0 bytes .../pytz/zoneinfo/Antarctica/Casey | Bin 384 -> 0 bytes .../pytz/zoneinfo/Antarctica/Davis | Bin 297 -> 0 bytes .../pytz/zoneinfo/Antarctica/DumontDUrville | Bin 186 -> 0 bytes .../pytz/zoneinfo/Antarctica/Macquarie | Bin 2260 -> 0 bytes .../pytz/zoneinfo/Antarctica/Mawson | Bin 199 -> 0 bytes .../pytz/zoneinfo/Antarctica/McMurdo | Bin 2437 -> 0 bytes .../pytz/zoneinfo/Antarctica/Palmer | Bin 1418 -> 0 bytes .../pytz/zoneinfo/Antarctica/Rothera | Bin 164 -> 0 bytes .../pytz/zoneinfo/Antarctica/South_Pole | Bin 2437 -> 0 bytes .../pytz/zoneinfo/Antarctica/Syowa | Bin 165 -> 0 bytes .../pytz/zoneinfo/Antarctica/Troll | Bin 1162 -> 0 bytes .../pytz/zoneinfo/Antarctica/Vostok | Bin 165 -> 0 bytes .../pytz/zoneinfo/Arctic/Longyearbyen | Bin 2298 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Aden | Bin 165 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Almaty | Bin 997 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Amman | Bin 1853 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Anadyr | Bin 1188 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtau | Bin 983 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Aqtobe | Bin 1011 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Ashgabat | Bin 619 -> 0 bytes .../pytz/zoneinfo/Asia/Ashkhabad | Bin 619 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Atyrau | Bin 991 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Baghdad | Bin 983 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Bahrain | Bin 199 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Baku | Bin 1227 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Bangkok | Bin 199 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Barnaul | Bin 1221 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Beirut | Bin 2154 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Bishkek | Bin 983 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Brunei | Bin 483 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Calcutta | Bin 285 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Chita | Bin 1221 -> 0 bytes .../pytz/zoneinfo/Asia/Choibalsan | Bin 949 -> 0 bytes .../pytz/zoneinfo/Asia/Chongqing | Bin 561 -> 0 bytes .../pytz/zoneinfo/Asia/Chungking | Bin 561 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Colombo | Bin 372 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Dacca | Bin 337 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Damascus | Bin 2294 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Dhaka | Bin 337 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Dili | Bin 227 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Dubai | Bin 165 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Dushanbe | Bin 591 -> 0 bytes .../pytz/zoneinfo/Asia/Famagusta | Bin 2028 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Gaza | Bin 2422 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Harbin | Bin 561 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Hebron | Bin 2450 -> 0 bytes .../pytz/zoneinfo/Asia/Ho_Chi_Minh | Bin 351 -> 0 bytes .../pytz/zoneinfo/Asia/Hong_Kong | Bin 1233 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Hovd | Bin 891 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Irkutsk | Bin 1243 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Istanbul | Bin 1947 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Jakarta | Bin 383 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Jayapura | Bin 221 -> 0 bytes .../pytz/zoneinfo/Asia/Jerusalem | Bin 2388 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Kabul | Bin 208 -> 0 bytes .../pytz/zoneinfo/Asia/Kamchatka | Bin 1166 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Karachi | Bin 379 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Kashgar | Bin 165 -> 0 bytes .../pytz/zoneinfo/Asia/Kathmandu | Bin 212 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Katmandu | Bin 212 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Khandyga | Bin 1271 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Kolkata | Bin 285 -> 0 bytes .../pytz/zoneinfo/Asia/Krasnoyarsk | Bin 1207 -> 0 bytes .../pytz/zoneinfo/Asia/Kuala_Lumpur | Bin 383 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Kuching | Bin 483 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Kuwait | Bin 165 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Macao | Bin 1227 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Macau | Bin 1227 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Magadan | Bin 1222 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Makassar | Bin 254 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Manila | Bin 328 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Muscat | Bin 165 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Nicosia | Bin 2002 -> 0 bytes .../pytz/zoneinfo/Asia/Novokuznetsk | Bin 1165 -> 0 bytes .../pytz/zoneinfo/Asia/Novosibirsk | Bin 1221 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Omsk | Bin 1207 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Asia/Oral | Bin 1005 -> 0 bytes .../pytz/zoneinfo/Asia/Phnom_Penh | Bin 199 -> 0 bytes .../pytz/zoneinfo/Asia/Pontianak | Bin 353 -> 0 bytes .../pytz/zoneinfo/Asia/Pyongyang | Bin 237 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Qatar | Bin 199 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Qostanay | Bin 1011 -> 0 bytes .../pytz/zoneinfo/Asia/Qyzylorda | Bin 1025 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Rangoon | Bin 268 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Riyadh | Bin 165 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Saigon | Bin 351 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Sakhalin | Bin 1202 -> 0 bytes .../pytz/zoneinfo/Asia/Samarkand | Bin 577 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Seoul | Bin 617 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Shanghai | Bin 561 -> 0 bytes .../pytz/zoneinfo/Asia/Singapore | Bin 383 -> 0 bytes .../pytz/zoneinfo/Asia/Srednekolymsk | Bin 1208 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Taipei | Bin 761 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tashkent | Bin 591 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tbilisi | Bin 1035 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tehran | Bin 1262 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tel_Aviv | Bin 2388 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Thimbu | Bin 203 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Thimphu | Bin 203 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tokyo | Bin 309 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Tomsk | Bin 1221 -> 0 bytes .../pytz/zoneinfo/Asia/Ujung_Pandang | Bin 254 -> 0 bytes .../pytz/zoneinfo/Asia/Ulaanbaatar | Bin 891 -> 0 bytes .../pytz/zoneinfo/Asia/Ulan_Bator | Bin 891 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Urumqi | Bin 165 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Ust-Nera | Bin 1252 -> 0 bytes .../pytz/zoneinfo/Asia/Vientiane | Bin 199 -> 0 bytes .../pytz/zoneinfo/Asia/Vladivostok | Bin 1208 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Yakutsk | Bin 1207 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Yangon | Bin 268 -> 0 bytes .../pytz/zoneinfo/Asia/Yekaterinburg | Bin 1243 -> 0 bytes .../site-packages/pytz/zoneinfo/Asia/Yerevan | Bin 1151 -> 0 bytes .../pytz/zoneinfo/Atlantic/Azores | Bin 3512 -> 0 bytes .../pytz/zoneinfo/Atlantic/Bermuda | Bin 2396 -> 0 bytes .../pytz/zoneinfo/Atlantic/Canary | Bin 1897 -> 0 bytes .../pytz/zoneinfo/Atlantic/Cape_Verde | Bin 270 -> 0 bytes .../pytz/zoneinfo/Atlantic/Faeroe | Bin 1815 -> 0 bytes .../pytz/zoneinfo/Atlantic/Faroe | Bin 1815 -> 0 bytes .../pytz/zoneinfo/Atlantic/Jan_Mayen | Bin 2298 -> 0 bytes .../pytz/zoneinfo/Atlantic/Madeira | Bin 3503 -> 0 bytes .../pytz/zoneinfo/Atlantic/Reykjavik | Bin 148 -> 0 bytes .../pytz/zoneinfo/Atlantic/South_Georgia | Bin 164 -> 0 bytes .../pytz/zoneinfo/Atlantic/St_Helena | Bin 148 -> 0 bytes .../pytz/zoneinfo/Atlantic/Stanley | Bin 1214 -> 0 bytes .../site-packages/pytz/zoneinfo/Australia/ACT | Bin 2190 -> 0 bytes .../pytz/zoneinfo/Australia/Adelaide | Bin 2208 -> 0 bytes .../pytz/zoneinfo/Australia/Brisbane | Bin 419 -> 0 bytes .../pytz/zoneinfo/Australia/Broken_Hill | Bin 2229 -> 0 bytes .../pytz/zoneinfo/Australia/Canberra | Bin 2190 -> 0 bytes .../pytz/zoneinfo/Australia/Currie | Bin 2358 -> 0 bytes .../pytz/zoneinfo/Australia/Darwin | Bin 325 -> 0 bytes .../pytz/zoneinfo/Australia/Eucla | Bin 470 -> 0 bytes .../pytz/zoneinfo/Australia/Hobart | Bin 2358 -> 0 bytes .../site-packages/pytz/zoneinfo/Australia/LHI | Bin 1860 -> 0 bytes .../pytz/zoneinfo/Australia/Lindeman | Bin 475 -> 0 bytes .../pytz/zoneinfo/Australia/Lord_Howe | Bin 1860 -> 0 bytes .../pytz/zoneinfo/Australia/Melbourne | Bin 2190 -> 0 bytes .../site-packages/pytz/zoneinfo/Australia/NSW | Bin 2190 -> 0 bytes .../pytz/zoneinfo/Australia/North | Bin 325 -> 0 bytes .../pytz/zoneinfo/Australia/Perth | Bin 446 -> 0 bytes .../pytz/zoneinfo/Australia/Queensland | Bin 419 -> 0 bytes .../pytz/zoneinfo/Australia/South | Bin 2208 -> 0 bytes .../pytz/zoneinfo/Australia/Sydney | Bin 2190 -> 0 bytes .../pytz/zoneinfo/Australia/Tasmania | Bin 2358 -> 0 bytes .../pytz/zoneinfo/Australia/Victoria | Bin 2190 -> 0 bytes .../pytz/zoneinfo/Australia/West | Bin 446 -> 0 bytes .../pytz/zoneinfo/Australia/Yancowinna | Bin 2229 -> 0 bytes .../site-packages/pytz/zoneinfo/Brazil/Acre | Bin 628 -> 0 bytes .../pytz/zoneinfo/Brazil/DeNoronha | Bin 716 -> 0 bytes .../site-packages/pytz/zoneinfo/Brazil/East | Bin 1444 -> 0 bytes .../site-packages/pytz/zoneinfo/Brazil/West | Bin 604 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/CET | Bin 2094 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/CST6CDT | Bin 2310 -> 0 bytes .../pytz/zoneinfo/Canada/Atlantic | Bin 3424 -> 0 bytes .../pytz/zoneinfo/Canada/Central | Bin 2868 -> 0 bytes .../pytz/zoneinfo/Canada/Eastern | Bin 3494 -> 0 bytes .../pytz/zoneinfo/Canada/Mountain | Bin 2332 -> 0 bytes .../pytz/zoneinfo/Canada/Newfoundland | Bin 3655 -> 0 bytes .../pytz/zoneinfo/Canada/Pacific | Bin 2892 -> 0 bytes .../pytz/zoneinfo/Canada/Saskatchewan | Bin 980 -> 0 bytes .../site-packages/pytz/zoneinfo/Canada/Yukon | Bin 1614 -> 0 bytes .../pytz/zoneinfo/Chile/Continental | Bin 2529 -> 0 bytes .../pytz/zoneinfo/Chile/EasterIsland | Bin 2233 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Cuba | Bin 2416 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/EET | Bin 1908 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/EST | Bin 114 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/EST5EDT | Bin 2310 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Egypt | Bin 1955 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Eire | Bin 3492 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT | Bin 114 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+0 | Bin 114 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+1 | Bin 116 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+10 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+11 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT+12 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+2 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+3 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+4 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+5 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+6 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+7 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+8 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT+9 | Bin 116 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-0 | Bin 114 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-1 | Bin 117 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-10 | Bin 118 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-11 | Bin 118 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-12 | Bin 118 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-13 | Bin 118 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/GMT-14 | Bin 118 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-2 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-3 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-4 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-5 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-6 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-7 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-8 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT-9 | Bin 117 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/GMT0 | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/Greenwich | Bin 114 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Etc/UCT | Bin 114 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Etc/UTC | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/Etc/Universal | Bin 114 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Etc/Zulu | Bin 114 -> 0 bytes .../pytz/zoneinfo/Europe/Amsterdam | Bin 2933 -> 0 bytes .../pytz/zoneinfo/Europe/Andorra | Bin 1742 -> 0 bytes .../pytz/zoneinfo/Europe/Astrakhan | Bin 1165 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Athens | Bin 2262 -> 0 bytes .../pytz/zoneinfo/Europe/Belfast | Bin 3664 -> 0 bytes .../pytz/zoneinfo/Europe/Belgrade | Bin 1920 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Berlin | Bin 2298 -> 0 bytes .../pytz/zoneinfo/Europe/Bratislava | Bin 2301 -> 0 bytes .../pytz/zoneinfo/Europe/Brussels | Bin 2933 -> 0 bytes .../pytz/zoneinfo/Europe/Bucharest | Bin 2184 -> 0 bytes .../pytz/zoneinfo/Europe/Budapest | Bin 2368 -> 0 bytes .../pytz/zoneinfo/Europe/Busingen | Bin 1909 -> 0 bytes .../pytz/zoneinfo/Europe/Chisinau | Bin 2390 -> 0 bytes .../pytz/zoneinfo/Europe/Copenhagen | Bin 2298 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Dublin | Bin 3492 -> 0 bytes .../pytz/zoneinfo/Europe/Gibraltar | Bin 3068 -> 0 bytes .../pytz/zoneinfo/Europe/Guernsey | Bin 3664 -> 0 bytes .../pytz/zoneinfo/Europe/Helsinki | Bin 1900 -> 0 bytes .../pytz/zoneinfo/Europe/Isle_of_Man | Bin 3664 -> 0 bytes .../pytz/zoneinfo/Europe/Istanbul | Bin 1947 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Jersey | Bin 3664 -> 0 bytes .../pytz/zoneinfo/Europe/Kaliningrad | Bin 1493 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Kiev | Bin 2120 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Kirov | Bin 1153 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Kyiv | Bin 2120 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Lisbon | Bin 3497 -> 0 bytes .../pytz/zoneinfo/Europe/Ljubljana | Bin 1920 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/London | Bin 3664 -> 0 bytes .../pytz/zoneinfo/Europe/Luxembourg | Bin 2933 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Madrid | Bin 2614 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Malta | Bin 2620 -> 0 bytes .../pytz/zoneinfo/Europe/Mariehamn | Bin 1900 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Minsk | Bin 1321 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Monaco | Bin 2962 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Moscow | Bin 1535 -> 0 bytes .../pytz/zoneinfo/Europe/Nicosia | Bin 2002 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Oslo | Bin 2298 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Paris | Bin 2962 -> 0 bytes .../pytz/zoneinfo/Europe/Podgorica | Bin 1920 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Prague | Bin 2301 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Riga | Bin 2198 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Rome | Bin 2641 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Samara | Bin 1215 -> 0 bytes .../pytz/zoneinfo/Europe/San_Marino | Bin 2641 -> 0 bytes .../pytz/zoneinfo/Europe/Sarajevo | Bin 1920 -> 0 bytes .../pytz/zoneinfo/Europe/Saratov | Bin 1183 -> 0 bytes .../pytz/zoneinfo/Europe/Simferopol | Bin 1469 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Skopje | Bin 1920 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Sofia | Bin 2077 -> 0 bytes .../pytz/zoneinfo/Europe/Stockholm | Bin 2298 -> 0 bytes .../pytz/zoneinfo/Europe/Tallinn | Bin 2148 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Tirane | Bin 2084 -> 0 bytes .../pytz/zoneinfo/Europe/Tiraspol | Bin 2390 -> 0 bytes .../pytz/zoneinfo/Europe/Ulyanovsk | Bin 1267 -> 0 bytes .../pytz/zoneinfo/Europe/Uzhgorod | Bin 2066 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Vaduz | Bin 1909 -> 0 bytes .../pytz/zoneinfo/Europe/Vatican | Bin 2641 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Vienna | Bin 2200 -> 0 bytes .../pytz/zoneinfo/Europe/Vilnius | Bin 2162 -> 0 bytes .../pytz/zoneinfo/Europe/Volgograd | Bin 1165 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Warsaw | Bin 2654 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Zagreb | Bin 1920 -> 0 bytes .../pytz/zoneinfo/Europe/Zaporozhye | Bin 2138 -> 0 bytes .../site-packages/pytz/zoneinfo/Europe/Zurich | Bin 1909 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Factory | Bin 116 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/GB | Bin 3664 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/GB-Eire | Bin 3664 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/GMT | Bin 114 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/GMT+0 | Bin 114 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/GMT-0 | Bin 114 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/GMT0 | Bin 114 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Greenwich | Bin 114 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/HST | Bin 115 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Hongkong | Bin 1233 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Iceland | Bin 148 -> 0 bytes .../pytz/zoneinfo/Indian/Antananarivo | Bin 265 -> 0 bytes .../site-packages/pytz/zoneinfo/Indian/Chagos | Bin 199 -> 0 bytes .../pytz/zoneinfo/Indian/Christmas | Bin 199 -> 0 bytes .../site-packages/pytz/zoneinfo/Indian/Cocos | Bin 268 -> 0 bytes .../site-packages/pytz/zoneinfo/Indian/Comoro | Bin 265 -> 0 bytes .../pytz/zoneinfo/Indian/Kerguelen | Bin 199 -> 0 bytes .../site-packages/pytz/zoneinfo/Indian/Mahe | Bin 165 -> 0 bytes .../pytz/zoneinfo/Indian/Maldives | Bin 199 -> 0 bytes .../pytz/zoneinfo/Indian/Mauritius | Bin 241 -> 0 bytes .../pytz/zoneinfo/Indian/Mayotte | Bin 265 -> 0 bytes .../pytz/zoneinfo/Indian/Reunion | Bin 165 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Iran | Bin 1262 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Israel | Bin 2388 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Jamaica | Bin 482 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Japan | Bin 309 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Kwajalein | Bin 316 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Libya | Bin 625 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/MET | Bin 2094 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/MST | Bin 114 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/MST7MDT | Bin 2310 -> 0 bytes .../pytz/zoneinfo/Mexico/BajaNorte | Bin 2342 -> 0 bytes .../pytz/zoneinfo/Mexico/BajaSur | Bin 1526 -> 0 bytes .../pytz/zoneinfo/Mexico/General | Bin 1584 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/NZ | Bin 2437 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/NZ-CHAT | Bin 2068 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Navajo | Bin 2444 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/PRC | Bin 561 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/PST8PDT | Bin 2310 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Apia | Bin 612 -> 0 bytes .../pytz/zoneinfo/Pacific/Auckland | Bin 2437 -> 0 bytes .../pytz/zoneinfo/Pacific/Bougainville | Bin 268 -> 0 bytes .../pytz/zoneinfo/Pacific/Chatham | Bin 2068 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Chuuk | Bin 186 -> 0 bytes .../pytz/zoneinfo/Pacific/Easter | Bin 2233 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Efate | Bin 538 -> 0 bytes .../pytz/zoneinfo/Pacific/Enderbury | Bin 234 -> 0 bytes .../pytz/zoneinfo/Pacific/Fakaofo | Bin 200 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Fiji | Bin 1049 -> 0 bytes .../pytz/zoneinfo/Pacific/Funafuti | Bin 166 -> 0 bytes .../pytz/zoneinfo/Pacific/Galapagos | Bin 238 -> 0 bytes .../pytz/zoneinfo/Pacific/Gambier | Bin 164 -> 0 bytes .../pytz/zoneinfo/Pacific/Guadalcanal | Bin 166 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Guam | Bin 494 -> 0 bytes .../pytz/zoneinfo/Pacific/Honolulu | Bin 329 -> 0 bytes .../pytz/zoneinfo/Pacific/Johnston | Bin 329 -> 0 bytes .../pytz/zoneinfo/Pacific/Kanton | Bin 234 -> 0 bytes .../pytz/zoneinfo/Pacific/Kiritimati | Bin 238 -> 0 bytes .../pytz/zoneinfo/Pacific/Kosrae | Bin 351 -> 0 bytes .../pytz/zoneinfo/Pacific/Kwajalein | Bin 316 -> 0 bytes .../pytz/zoneinfo/Pacific/Majuro | Bin 166 -> 0 bytes .../pytz/zoneinfo/Pacific/Marquesas | Bin 173 -> 0 bytes .../pytz/zoneinfo/Pacific/Midway | Bin 175 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Nauru | Bin 252 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Niue | Bin 203 -> 0 bytes .../pytz/zoneinfo/Pacific/Norfolk | Bin 880 -> 0 bytes .../pytz/zoneinfo/Pacific/Noumea | Bin 304 -> 0 bytes .../pytz/zoneinfo/Pacific/Pago_Pago | Bin 175 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Palau | Bin 180 -> 0 bytes .../pytz/zoneinfo/Pacific/Pitcairn | Bin 202 -> 0 bytes .../pytz/zoneinfo/Pacific/Pohnpei | Bin 166 -> 0 bytes .../pytz/zoneinfo/Pacific/Ponape | Bin 166 -> 0 bytes .../pytz/zoneinfo/Pacific/Port_Moresby | Bin 186 -> 0 bytes .../pytz/zoneinfo/Pacific/Rarotonga | Bin 603 -> 0 bytes .../pytz/zoneinfo/Pacific/Saipan | Bin 494 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Samoa | Bin 175 -> 0 bytes .../pytz/zoneinfo/Pacific/Tahiti | Bin 165 -> 0 bytes .../pytz/zoneinfo/Pacific/Tarawa | Bin 166 -> 0 bytes .../pytz/zoneinfo/Pacific/Tongatapu | Bin 372 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Truk | Bin 186 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Wake | Bin 166 -> 0 bytes .../pytz/zoneinfo/Pacific/Wallis | Bin 166 -> 0 bytes .../site-packages/pytz/zoneinfo/Pacific/Yap | Bin 186 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Poland | Bin 2654 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Portugal | Bin 3497 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/ROC | Bin 761 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/ROK | Bin 617 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Singapore | Bin 383 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Turkey | Bin 1947 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/UCT | Bin 114 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/US/Alaska | Bin 2371 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Aleutian | Bin 2356 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Arizona | Bin 328 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Central | Bin 3576 -> 0 bytes .../pytz/zoneinfo/US/East-Indiana | Bin 1666 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Eastern | Bin 3552 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/US/Hawaii | Bin 329 -> 0 bytes .../pytz/zoneinfo/US/Indiana-Starke | Bin 2428 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Michigan | Bin 2230 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Mountain | Bin 2444 -> 0 bytes .../site-packages/pytz/zoneinfo/US/Pacific | Bin 2836 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/US/Samoa | Bin 175 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/UTC | Bin 114 -> 0 bytes .../Lib/site-packages/pytz/zoneinfo/Universal | Bin 114 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/W-SU | Bin 1535 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/WET | Bin 1905 -> 0 bytes .venv/Lib/site-packages/pytz/zoneinfo/Zulu | Bin 114 -> 0 bytes .../site-packages/pytz/zoneinfo/iso3166.tab | 274 - .../site-packages/pytz/zoneinfo/leapseconds | 82 - .../Lib/site-packages/pytz/zoneinfo/tzdata.zi | 4232 --- .../Lib/site-packages/pytz/zoneinfo/zone.tab | 454 - .../site-packages/pytz/zoneinfo/zone1970.tab | 353 - .../setuptools-56.0.0.dist-info/INSTALLER | 1 - .../setuptools-56.0.0.dist-info/LICENSE | 19 - .../setuptools-56.0.0.dist-info/METADATA | 114 - .../setuptools-56.0.0.dist-info/RECORD | 295 - .../setuptools-56.0.0.dist-info/REQUESTED | 0 .../setuptools-56.0.0.dist-info/WHEEL | 5 - .../dependency_links.txt | 2 - .../entry_points.txt | 60 - .../setuptools-56.0.0.dist-info/top_level.txt | 3 - .../Lib/site-packages/setuptools/__init__.py | 241 - .../__pycache__/__init__.cpython-38.pyc | Bin 8654 -> 0 bytes .../_deprecation_warning.cpython-38.pyc | Bin 550 -> 0 bytes .../__pycache__/_imp.cpython-38.pyc | Bin 2089 -> 0 bytes .../__pycache__/archive_util.cpython-38.pyc | Bin 5750 -> 0 bytes .../__pycache__/build_meta.cpython-38.pyc | Bin 8982 -> 0 bytes .../__pycache__/config.cpython-38.pyc | Bin 19796 -> 0 bytes .../__pycache__/dep_util.cpython-38.pyc | Bin 857 -> 0 bytes .../__pycache__/depends.cpython-38.pyc | Bin 5228 -> 0 bytes .../__pycache__/dist.cpython-38.pyc | Bin 33326 -> 0 bytes .../__pycache__/errors.cpython-38.pyc | Bin 850 -> 0 bytes .../__pycache__/extension.cpython-38.pyc | Bin 1940 -> 0 bytes .../__pycache__/glob.cpython-38.pyc | Bin 3704 -> 0 bytes .../__pycache__/installer.cpython-38.pyc | Bin 2785 -> 0 bytes .../__pycache__/launch.cpython-38.pyc | Bin 881 -> 0 bytes .../__pycache__/lib2to3_ex.cpython-38.pyc | Bin 2697 -> 0 bytes .../__pycache__/monkey.cpython-38.pyc | Bin 4619 -> 0 bytes .../__pycache__/msvc.cpython-38.pyc | Bin 43192 -> 0 bytes .../__pycache__/namespaces.cpython-38.pyc | Bin 3580 -> 0 bytes .../__pycache__/package_index.cpython-38.pyc | Bin 32988 -> 0 bytes .../__pycache__/py34compat.cpython-38.pyc | Bin 484 -> 0 bytes .../__pycache__/sandbox.cpython-38.pyc | Bin 15445 -> 0 bytes .../__pycache__/ssl_support.cpython-38.pyc | Bin 6872 -> 0 bytes .../__pycache__/unicode_utils.cpython-38.pyc | Bin 1120 -> 0 bytes .../__pycache__/version.cpython-38.pyc | Bin 326 -> 0 bytes .../__pycache__/wheel.cpython-38.pyc | Bin 7232 -> 0 bytes .../windows_support.cpython-38.pyc | Bin 1023 -> 0 bytes .../setuptools/_deprecation_warning.py | 7 - .../setuptools/_distutils/__init__.py | 15 - .../__pycache__/__init__.cpython-38.pyc | Bin 458 -> 0 bytes .../__pycache__/_msvccompiler.cpython-38.pyc | Bin 13851 -> 0 bytes .../__pycache__/archive_util.cpython-38.pyc | Bin 6599 -> 0 bytes .../__pycache__/bcppcompiler.cpython-38.pyc | Bin 6524 -> 0 bytes .../__pycache__/ccompiler.cpython-38.pyc | Bin 33348 -> 0 bytes .../_distutils/__pycache__/cmd.cpython-38.pyc | Bin 14008 -> 0 bytes .../__pycache__/config.cpython-38.pyc | Bin 3569 -> 0 bytes .../__pycache__/core.cpython-38.pyc | Bin 6674 -> 0 bytes .../cygwinccompiler.cpython-38.pyc | Bin 8549 -> 0 bytes .../__pycache__/debug.cpython-38.pyc | Bin 254 -> 0 bytes .../__pycache__/dep_util.cpython-38.pyc | Bin 2774 -> 0 bytes .../__pycache__/dir_util.cpython-38.pyc | Bin 5883 -> 0 bytes .../__pycache__/dist.cpython-38.pyc | Bin 34587 -> 0 bytes .../__pycache__/errors.cpython-38.pyc | Bin 5310 -> 0 bytes .../__pycache__/extension.cpython-38.pyc | Bin 6983 -> 0 bytes .../__pycache__/fancy_getopt.cpython-38.pyc | Bin 10716 -> 0 bytes .../__pycache__/file_util.cpython-38.pyc | Bin 5993 -> 0 bytes .../__pycache__/filelist.cpython-38.pyc | Bin 9927 -> 0 bytes .../_distutils/__pycache__/log.cpython-38.pyc | Bin 2375 -> 0 bytes .../__pycache__/msvc9compiler.cpython-38.pyc | Bin 17537 -> 0 bytes .../__pycache__/msvccompiler.cpython-38.pyc | Bin 14748 -> 0 bytes .../__pycache__/py35compat.cpython-38.pyc | Bin 630 -> 0 bytes .../__pycache__/py38compat.cpython-38.pyc | Bin 427 -> 0 bytes .../__pycache__/spawn.cpython-38.pyc | Bin 3434 -> 0 bytes .../__pycache__/sysconfig.cpython-38.pyc | Bin 12439 -> 0 bytes .../__pycache__/text_file.cpython-38.pyc | Bin 8499 -> 0 bytes .../__pycache__/unixccompiler.cpython-38.pyc | Bin 6678 -> 0 bytes .../__pycache__/util.cpython-38.pyc | Bin 15687 -> 0 bytes .../__pycache__/version.cpython-38.pyc | Bin 7421 -> 0 bytes .../versionpredicate.cpython-38.pyc | Bin 5195 -> 0 bytes .../setuptools/_distutils/_msvccompiler.py | 561 - .../setuptools/_distutils/archive_util.py | 256 - .../setuptools/_distutils/bcppcompiler.py | 393 - .../setuptools/_distutils/ccompiler.py | 1116 - .../setuptools/_distutils/cmd.py | 403 - .../setuptools/_distutils/command/__init__.py | 31 - .../__pycache__/__init__.cpython-38.pyc | Bin 603 -> 0 bytes .../command/__pycache__/bdist.cpython-38.pyc | Bin 3726 -> 0 bytes .../__pycache__/bdist_dumb.cpython-38.pyc | Bin 3652 -> 0 bytes .../__pycache__/bdist_msi.cpython-38.pyc | Bin 20033 -> 0 bytes .../__pycache__/bdist_rpm.cpython-38.pyc | Bin 12437 -> 0 bytes .../__pycache__/bdist_wininst.cpython-38.pyc | Bin 8527 -> 0 bytes .../command/__pycache__/build.cpython-38.pyc | Bin 3941 -> 0 bytes .../__pycache__/build_clib.cpython-38.pyc | Bin 4874 -> 0 bytes .../__pycache__/build_ext.cpython-38.pyc | Bin 16263 -> 0 bytes .../__pycache__/build_py.cpython-38.pyc | Bin 10540 -> 0 bytes .../__pycache__/build_scripts.cpython-38.pyc | Bin 4384 -> 0 bytes .../command/__pycache__/check.cpython-38.pyc | Bin 4979 -> 0 bytes .../command/__pycache__/clean.cpython-38.pyc | Bin 2160 -> 0 bytes .../command/__pycache__/config.cpython-38.pyc | Bin 10287 -> 0 bytes .../__pycache__/install.cpython-38.pyc | Bin 13948 -> 0 bytes .../__pycache__/install_data.cpython-38.pyc | Bin 2349 -> 0 bytes .../install_egg_info.cpython-38.pyc | Bin 3056 -> 0 bytes .../install_headers.cpython-38.pyc | Bin 1768 -> 0 bytes .../__pycache__/install_lib.cpython-38.pyc | Bin 5173 -> 0 bytes .../install_scripts.cpython-38.pyc | Bin 2201 -> 0 bytes .../__pycache__/py37compat.cpython-38.pyc | Bin 1030 -> 0 bytes .../__pycache__/register.cpython-38.pyc | Bin 8515 -> 0 bytes .../command/__pycache__/sdist.cpython-38.pyc | Bin 14576 -> 0 bytes .../command/__pycache__/upload.cpython-38.pyc | Bin 5229 -> 0 bytes .../setuptools/_distutils/command/bdist.py | 143 - .../_distutils/command/bdist_dumb.py | 123 - .../_distutils/command/bdist_msi.py | 749 - .../_distutils/command/bdist_rpm.py | 579 - .../_distutils/command/bdist_wininst.py | 377 - .../setuptools/_distutils/command/build.py | 157 - .../_distutils/command/build_clib.py | 209 - .../_distutils/command/build_ext.py | 755 - .../setuptools/_distutils/command/build_py.py | 416 - .../_distutils/command/build_scripts.py | 160 - .../setuptools/_distutils/command/check.py | 148 - .../setuptools/_distutils/command/clean.py | 76 - .../setuptools/_distutils/command/config.py | 344 - .../setuptools/_distutils/command/install.py | 677 - .../_distutils/command/install_data.py | 79 - .../_distutils/command/install_egg_info.py | 77 - .../_distutils/command/install_headers.py | 47 - .../_distutils/command/install_lib.py | 217 - .../_distutils/command/install_scripts.py | 60 - .../_distutils/command/py37compat.py | 30 - .../setuptools/_distutils/command/register.py | 304 - .../setuptools/_distutils/command/sdist.py | 494 - .../setuptools/_distutils/command/upload.py | 214 - .../setuptools/_distutils/config.py | 130 - .../setuptools/_distutils/core.py | 234 - .../setuptools/_distutils/cygwinccompiler.py | 403 - .../setuptools/_distutils/debug.py | 5 - .../setuptools/_distutils/dep_util.py | 92 - .../setuptools/_distutils/dir_util.py | 210 - .../setuptools/_distutils/dist.py | 1257 - .../setuptools/_distutils/errors.py | 97 - .../setuptools/_distutils/extension.py | 240 - .../setuptools/_distutils/fancy_getopt.py | 457 - .../setuptools/_distutils/file_util.py | 238 - .../setuptools/_distutils/filelist.py | 327 - .../setuptools/_distutils/log.py | 77 - .../setuptools/_distutils/msvc9compiler.py | 788 - .../setuptools/_distutils/msvccompiler.py | 643 - .../setuptools/_distutils/py35compat.py | 19 - .../setuptools/_distutils/py38compat.py | 7 - .../setuptools/_distutils/spawn.py | 125 - .../setuptools/_distutils/sysconfig.py | 573 - .../setuptools/_distutils/text_file.py | 286 - .../setuptools/_distutils/unixccompiler.py | 328 - .../setuptools/_distutils/util.py | 561 - .../setuptools/_distutils/version.py | 347 - .../setuptools/_distutils/versionpredicate.py | 166 - .venv/Lib/site-packages/setuptools/_imp.py | 82 - .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 188 -> 0 bytes .../__pycache__/ordered_set.cpython-38.pyc | Bin 16446 -> 0 bytes .../__pycache__/pyparsing.cpython-38.pyc | Bin 201665 -> 0 bytes .../setuptools/_vendor/ordered_set.py | 488 - .../setuptools/_vendor/packaging/__about__.py | 27 - .../setuptools/_vendor/packaging/__init__.py | 26 - .../__pycache__/__about__.cpython-38.pyc | Bin 730 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 576 -> 0 bytes .../__pycache__/_compat.cpython-38.pyc | Bin 1148 -> 0 bytes .../__pycache__/_structures.cpython-38.pyc | Bin 2902 -> 0 bytes .../__pycache__/_typing.cpython-38.pyc | Bin 1493 -> 0 bytes .../__pycache__/markers.cpython-38.pyc | Bin 9334 -> 0 bytes .../__pycache__/requirements.cpython-38.pyc | Bin 4087 -> 0 bytes .../__pycache__/specifiers.cpython-38.pyc | Bin 20611 -> 0 bytes .../packaging/__pycache__/tags.cpython-38.pyc | Bin 17263 -> 0 bytes .../__pycache__/utils.cpython-38.pyc | Bin 1665 -> 0 bytes .../__pycache__/version.cpython-38.pyc | Bin 13340 -> 0 bytes .../setuptools/_vendor/packaging/_compat.py | 38 - .../_vendor/packaging/_structures.py | 86 - .../setuptools/_vendor/packaging/_typing.py | 48 - .../setuptools/_vendor/packaging/markers.py | 328 - .../_vendor/packaging/requirements.py | 145 - .../_vendor/packaging/specifiers.py | 863 - .../setuptools/_vendor/packaging/tags.py | 751 - .../setuptools/_vendor/packaging/utils.py | 65 - .../setuptools/_vendor/packaging/version.py | 535 - .../setuptools/_vendor/pyparsing.py | 5742 ---- .../site-packages/setuptools/archive_util.py | 205 - .../site-packages/setuptools/build_meta.py | 281 - .venv/Lib/site-packages/setuptools/cli-32.exe | Bin 65536 -> 0 bytes .venv/Lib/site-packages/setuptools/cli-64.exe | Bin 74752 -> 0 bytes .venv/Lib/site-packages/setuptools/cli.exe | Bin 65536 -> 0 bytes .../setuptools/command/__init__.py | 17 - .../__pycache__/__init__.cpython-38.pyc | Bin 727 -> 0 bytes .../command/__pycache__/alias.cpython-38.pyc | Bin 2371 -> 0 bytes .../__pycache__/bdist_egg.cpython-38.pyc | Bin 13037 -> 0 bytes .../__pycache__/bdist_rpm.cpython-38.pyc | Bin 1357 -> 0 bytes .../__pycache__/build_clib.cpython-38.pyc | Bin 2468 -> 0 bytes .../__pycache__/build_ext.cpython-38.pyc | Bin 9805 -> 0 bytes .../__pycache__/build_py.cpython-38.pyc | Bin 8678 -> 0 bytes .../__pycache__/develop.cpython-38.pyc | Bin 6420 -> 0 bytes .../__pycache__/dist_info.cpython-38.pyc | Bin 1395 -> 0 bytes .../__pycache__/easy_install.cpython-38.pyc | Bin 63255 -> 0 bytes .../__pycache__/egg_info.cpython-38.pyc | Bin 21695 -> 0 bytes .../__pycache__/install.cpython-38.pyc | Bin 4050 -> 0 bytes .../install_egg_info.cpython-38.pyc | Bin 2437 -> 0 bytes .../__pycache__/install_lib.cpython-38.pyc | Bin 4164 -> 0 bytes .../install_scripts.cpython-38.pyc | Bin 2428 -> 0 bytes .../__pycache__/py36compat.cpython-38.pyc | Bin 4589 -> 0 bytes .../__pycache__/register.cpython-38.pyc | Bin 845 -> 0 bytes .../command/__pycache__/rotate.cpython-38.pyc | Bin 2514 -> 0 bytes .../__pycache__/saveopts.cpython-38.pyc | Bin 923 -> 0 bytes .../command/__pycache__/sdist.cpython-38.pyc | Bin 7583 -> 0 bytes .../command/__pycache__/setopt.cpython-38.pyc | Bin 4531 -> 0 bytes .../command/__pycache__/test.cpython-38.pyc | Bin 8336 -> 0 bytes .../command/__pycache__/upload.cpython-38.pyc | Bin 818 -> 0 bytes .../__pycache__/upload_docs.cpython-38.pyc | Bin 6125 -> 0 bytes .../site-packages/setuptools/command/alias.py | 78 - .../setuptools/command/bdist_egg.py | 456 - .../setuptools/command/bdist_rpm.py | 31 - .../setuptools/command/build_clib.py | 101 - .../setuptools/command/build_ext.py | 322 - .../setuptools/command/build_py.py | 270 - .../setuptools/command/develop.py | 216 - .../setuptools/command/dist_info.py | 36 - .../setuptools/command/easy_install.py | 2290 -- .../setuptools/command/egg_info.py | 727 - .../setuptools/command/install.py | 125 - .../setuptools/command/install_egg_info.py | 62 - .../setuptools/command/install_lib.py | 122 - .../setuptools/command/install_scripts.py | 69 - .../setuptools/command/launcher manifest.xml | 15 - .../setuptools/command/py36compat.py | 134 - .../setuptools/command/register.py | 18 - .../setuptools/command/rotate.py | 64 - .../setuptools/command/saveopts.py | 22 - .../site-packages/setuptools/command/sdist.py | 235 - .../setuptools/command/setopt.py | 148 - .../site-packages/setuptools/command/test.py | 274 - .../setuptools/command/upload.py | 17 - .../setuptools/command/upload_docs.py | 202 - .venv/Lib/site-packages/setuptools/config.py | 710 - .../Lib/site-packages/setuptools/dep_util.py | 25 - .venv/Lib/site-packages/setuptools/depends.py | 175 - .venv/Lib/site-packages/setuptools/dist.py | 1057 - .venv/Lib/site-packages/setuptools/errors.py | 16 - .../Lib/site-packages/setuptools/extension.py | 55 - .../setuptools/extern/__init__.py | 73 - .../__pycache__/__init__.cpython-38.pyc | Bin 2901 -> 0 bytes .venv/Lib/site-packages/setuptools/glob.py | 167 - .venv/Lib/site-packages/setuptools/gui-32.exe | Bin 65536 -> 0 bytes .venv/Lib/site-packages/setuptools/gui-64.exe | Bin 75264 -> 0 bytes .venv/Lib/site-packages/setuptools/gui.exe | Bin 65536 -> 0 bytes .../Lib/site-packages/setuptools/installer.py | 97 - .venv/Lib/site-packages/setuptools/launch.py | 36 - .../site-packages/setuptools/lib2to3_ex.py | 68 - .venv/Lib/site-packages/setuptools/monkey.py | 177 - .venv/Lib/site-packages/setuptools/msvc.py | 1826 -- .../site-packages/setuptools/namespaces.py | 107 - .../site-packages/setuptools/package_index.py | 1145 - .../site-packages/setuptools/py34compat.py | 13 - .venv/Lib/site-packages/setuptools/sandbox.py | 496 - .../setuptools/script (dev).tmpl | 6 - .../Lib/site-packages/setuptools/script.tmpl | 3 - .../site-packages/setuptools/ssl_support.py | 266 - .../site-packages/setuptools/unicode_utils.py | 42 - .venv/Lib/site-packages/setuptools/version.py | 6 - .venv/Lib/site-packages/setuptools/wheel.py | 213 - .../setuptools/windows_support.py | 29 - .../six-1.16.0.dist-info/INSTALLER | 1 - .../six-1.16.0.dist-info/LICENSE | 18 - .../six-1.16.0.dist-info/METADATA | 49 - .../site-packages/six-1.16.0.dist-info/RECORD | 8 - .../site-packages/six-1.16.0.dist-info/WHEEL | 6 - .../six-1.16.0.dist-info/top_level.txt | 1 - .venv/Lib/site-packages/six.py | 998 - .venv/Lib/site-packages/tatsu/__init__.py | 22 - .venv/Lib/site-packages/tatsu/__main__.py | 5 - .../tatsu/__pycache__/__init__.cpython-38.pyc | Bin 549 -> 0 bytes .../tatsu/__pycache__/__main__.cpython-38.pyc | Bin 284 -> 0 bytes .../tatsu/__pycache__/_config.cpython-38.pyc | Bin 245 -> 0 bytes .../tatsu/__pycache__/_version.cpython-38.pyc | Bin 196 -> 0 bytes .../tatsu/__pycache__/ast.cpython-38.pyc | Bin 4661 -> 0 bytes .../__pycache__/bootstrap.cpython-38.pyc | Bin 37846 -> 0 bytes .../__pycache__/buffering.cpython-38.pyc | Bin 12827 -> 0 bytes .../tatsu/__pycache__/color.cpython-38.pyc | Bin 1355 -> 0 bytes .../tatsu/__pycache__/contexts.cpython-38.pyc | Bin 28025 -> 0 bytes .../tatsu/__pycache__/diagrams.cpython-38.pyc | Bin 10610 -> 0 bytes .../__pycache__/exceptions.cpython-38.pyc | Bin 5715 -> 0 bytes .../tatsu/__pycache__/grammars.cpython-38.pyc | Bin 46226 -> 0 bytes .../tatsu/__pycache__/infos.cpython-38.pyc | Bin 8213 -> 0 bytes .../tatsu/__pycache__/leftrec.cpython-38.pyc | Bin 4632 -> 0 bytes .../tatsu/__pycache__/model.cpython-38.pyc | Bin 475 -> 0 bytes .../__pycache__/objectmodel.cpython-38.pyc | Bin 6677 -> 0 bytes .../tatsu/__pycache__/parser.cpython-38.pyc | Bin 1238 -> 0 bytes .../parser_semantics.cpython-38.pyc | Bin 5175 -> 0 bytes .../tatsu/__pycache__/parsing.cpython-38.pyc | Bin 1262 -> 0 bytes .../__pycache__/rendering.cpython-38.pyc | Bin 5100 -> 0 bytes .../__pycache__/semantics.cpython-38.pyc | Bin 3288 -> 0 bytes .../__pycache__/symtables.cpython-38.pyc | Bin 11091 -> 0 bytes .../tatsu/__pycache__/synth.cpython-38.pyc | Bin 938 -> 0 bytes .../__pycache__/tokenizing.cpython-38.pyc | Bin 3058 -> 0 bytes .../tatsu/__pycache__/tool.cpython-38.pyc | Bin 6777 -> 0 bytes .../tatsu/__pycache__/walkers.cpython-38.pyc | Bin 5636 -> 0 bytes .venv/Lib/site-packages/tatsu/_config.py | 3 - .venv/Lib/site-packages/tatsu/_version.py | 1 - .venv/Lib/site-packages/tatsu/ast.py | 137 - .venv/Lib/site-packages/tatsu/bootstrap.py | 1433 - .venv/Lib/site-packages/tatsu/buffering.py | 384 - .../site-packages/tatsu/codegen/__init__.py | 17 - .../__pycache__/__init__.cpython-38.pyc | Bin 699 -> 0 bytes .../codegen/__pycache__/cgbase.cpython-38.pyc | Bin 5274 -> 0 bytes .../__pycache__/objectmodel.cpython-38.pyc | Bin 7511 -> 0 bytes .../codegen/__pycache__/python.cpython-38.pyc | Bin 21171 -> 0 bytes .../Lib/site-packages/tatsu/codegen/cgbase.py | 152 - .../tatsu/codegen/objectmodel.py | 244 - .../Lib/site-packages/tatsu/codegen/python.py | 598 - .../tatsu/collections/__init__.py | 2 - .../__pycache__/__init__.cpython-38.pyc | Bin 265 -> 0 bytes .../__pycache__/orderedset.cpython-38.pyc | Bin 6204 -> 0 bytes .../__pycache__/tail.cpython-38.pyc | Bin 1815 -> 0 bytes .../tatsu/collections/orderedset.py | 128 - .../site-packages/tatsu/collections/tail.py | 37 - .venv/Lib/site-packages/tatsu/color.py | 54 - .venv/Lib/site-packages/tatsu/contexts.py | 956 - .venv/Lib/site-packages/tatsu/diagrams.py | 283 - .venv/Lib/site-packages/tatsu/exceptions.py | 149 - .venv/Lib/site-packages/tatsu/g2e/__init__.py | 55 - .venv/Lib/site-packages/tatsu/g2e/__main__.py | 6 - .../g2e/__pycache__/__init__.cpython-38.pyc | Bin 1496 -> 0 bytes .../g2e/__pycache__/__main__.cpython-38.pyc | Bin 297 -> 0 bytes .../g2e/__pycache__/semantics.cpython-38.pyc | Bin 7704 -> 0 bytes .venv/Lib/site-packages/tatsu/g2e/antlr.ebnf | 438 - .../Lib/site-packages/tatsu/g2e/semantics.py | 191 - .venv/Lib/site-packages/tatsu/grammars.py | 1126 - .venv/Lib/site-packages/tatsu/infos.py | 236 - .venv/Lib/site-packages/tatsu/leftrec.py | 189 - .../site-packages/tatsu/mixins/__init__.py | 0 .../__pycache__/__init__.cpython-38.pyc | Bin 182 -> 0 bytes .../mixins/__pycache__/indent.cpython-38.pyc | Bin 2531 -> 0 bytes .../Lib/site-packages/tatsu/mixins/indent.py | 61 - .venv/Lib/site-packages/tatsu/model.py | 8 - .venv/Lib/site-packages/tatsu/objectmodel.py | 205 - .venv/Lib/site-packages/tatsu/parser.py | 25 - .../site-packages/tatsu/parser_semantics.py | 133 - .venv/Lib/site-packages/tatsu/parsing.py | 32 - .venv/Lib/site-packages/tatsu/rendering.py | 138 - .venv/Lib/site-packages/tatsu/semantics.py | 98 - .venv/Lib/site-packages/tatsu/symtables.py | 296 - .venv/Lib/site-packages/tatsu/synth.py | 30 - .venv/Lib/site-packages/tatsu/tokenizing.py | 71 - .venv/Lib/site-packages/tatsu/tool.py | 273 - .../Lib/site-packages/tatsu/util/__init__.py | 1 - .../util/__pycache__/__init__.cpython-38.pyc | Bin 204 -> 0 bytes .../util/__pycache__/_common.cpython-38.pyc | Bin 15999 -> 0 bytes .../util/__pycache__/misc.cpython-38.pyc | Bin 2123 -> 0 bytes .../util/__pycache__/parproc.cpython-38.pyc | Bin 8924 -> 0 bytes .../util/__pycache__/testing.cpython-38.pyc | Bin 2107 -> 0 bytes .../unicode_characters.cpython-38.pyc | Bin 1289 -> 0 bytes .venv/Lib/site-packages/tatsu/util/_common.py | 496 - .venv/Lib/site-packages/tatsu/util/misc.py | 77 - .venv/Lib/site-packages/tatsu/util/parproc.py | 261 - .venv/Lib/site-packages/tatsu/util/testing.py | 93 - .../tatsu/util/unicode_characters.py | 54 - .venv/Lib/site-packages/tatsu/walkers.py | 153 - .venv/Lib/site-packages/test/__init__.py | 0 .venv/Lib/site-packages/test/__main__.py | 10 - .../test/__pycache__/__init__.cpython-38.pyc | Bin 174 -> 0 bytes .../test/__pycache__/__main__.cpython-38.pyc | Bin 341 -> 0 bytes .../test/__pycache__/ast_test.cpython-38.pyc | Bin 2218 -> 0 bytes .../__pycache__/buffering_test.cpython-38.pyc | Bin 3835 -> 0 bytes .../__pycache__/codegen_test.cpython-38.pyc | Bin 2146 -> 0 bytes .../__pycache__/diagram_test.cpython-38.pyc | Bin 1293 -> 0 bytes .../test/__pycache__/misc_test.cpython-38.pyc | Bin 748 -> 0 bytes .../__pycache__/model_test.cpython-38.pyc | Bin 1073 -> 0 bytes .../parser_equivalence_test.cpython-38.pyc | Bin 3693 -> 0 bytes .../__pycache__/parsing_test.cpython-38.pyc | Bin 4384 -> 0 bytes .../__pycache__/pickle_test.cpython-38.pyc | Bin 1318 -> 0 bytes .../__pycache__/walker_test.cpython-38.pyc | Bin 2196 -> 0 bytes .venv/Lib/site-packages/test/ast_test.py | 63 - .../Lib/site-packages/test/buffering_test.py | 115 - .venv/Lib/site-packages/test/codegen_test.py | 42 - .venv/Lib/site-packages/test/diagram_test.py | 36 - .../site-packages/test/grammar/__init__.py | 1 - .../__pycache__/__init__.cpython-38.pyc | Bin 182 -> 0 bytes .../__pycache__/alerts_test.cpython-38.pyc | Bin 600 -> 0 bytes .../__pycache__/constants_test.cpython-38.pyc | Bin 1305 -> 0 bytes .../__pycache__/defines_test.cpython-38.pyc | Bin 1774 -> 0 bytes .../__pycache__/directive_test.cpython-38.pyc | Bin 4845 -> 0 bytes .../__pycache__/error_test.cpython-38.pyc | Bin 974 -> 0 bytes .../firstfollow_test.cpython-38.pyc | Bin 2776 -> 0 bytes .../__pycache__/join_test.cpython-38.pyc | Bin 4501 -> 0 bytes .../__pycache__/keyword_test.cpython-38.pyc | Bin 4349 -> 0 bytes .../left_recursion_test.cpython-38.pyc | Bin 14775 -> 0 bytes .../__pycache__/lookahead_test.cpython-38.pyc | Bin 1034 -> 0 bytes .../__pycache__/parameter_test.cpython-38.pyc | Bin 6989 -> 0 bytes .../__pycache__/pattern_test.cpython-38.pyc | Bin 3495 -> 0 bytes .../__pycache__/pretty_test.cpython-38.pyc | Bin 2320 -> 0 bytes .../__pycache__/semantics_test.cpython-38.pyc | Bin 3322 -> 0 bytes .../__pycache__/stateful_test.cpython-38.pyc | Bin 3630 -> 0 bytes .../__pycache__/syntax_test.cpython-38.pyc | Bin 10142 -> 0 bytes .../site-packages/test/grammar/alerts_test.py | 12 - .../test/grammar/constants_test.py | 38 - .../test/grammar/defines_test.py | 84 - .../test/grammar/directive_test.py | 160 - .../site-packages/test/grammar/error_test.py | 26 - .../test/grammar/firstfollow_test.py | 106 - .../site-packages/test/grammar/join_test.py | 226 - .../test/grammar/keyword_test.py | 153 - .../test/grammar/left_recursion_test.py | 557 - .../test/grammar/lookahead_test.py | 33 - .../test/grammar/parameter_test.py | 208 - .../test/grammar/pattern_test.py | 131 - .../site-packages/test/grammar/pretty_test.py | 99 - .../test/grammar/semantics_test.py | 108 - .../test/grammar/stateful_test.py | 109 - .../site-packages/test/grammar/syntax_test.py | 342 - .venv/Lib/site-packages/test/misc_test.py | 13 - .venv/Lib/site-packages/test/model_test.py | 29 - .../test/parser_equivalence_test.py | 144 - .venv/Lib/site-packages/test/parsing_test.py | 128 - .venv/Lib/site-packages/test/pickle_test.py | 59 - .venv/Lib/site-packages/test/walker_test.py | 58 - .../test/zzz_bootstrap/__init__.py | 1 - .../__pycache__/__init__.cpython-38.pyc | Bin 188 -> 0 bytes .../__pycache__/bootstrap_test.cpython-38.pyc | Bin 5017 -> 0 bytes .../test/zzz_bootstrap/bootstrap_test.py | 192 - .../yarl-1.8.1.dist-info/INSTALLER | 1 - .../yarl-1.8.1.dist-info/LICENSE | 13 - .../yarl-1.8.1.dist-info/METADATA | 867 - .../site-packages/yarl-1.8.1.dist-info/RECORD | 19 - .../site-packages/yarl-1.8.1.dist-info/WHEEL | 5 - .../yarl-1.8.1.dist-info/top_level.txt | 1 - .venv/Lib/site-packages/yarl/__init__.py | 5 - .venv/Lib/site-packages/yarl/__init__.pyi | 118 - .../yarl/__pycache__/__init__.cpython-38.pyc | Bin 316 -> 0 bytes .../yarl/__pycache__/_quoting.cpython-38.pyc | Bin 510 -> 0 bytes .../__pycache__/_quoting_py.cpython-38.pyc | Bin 4317 -> 0 bytes .../yarl/__pycache__/_url.cpython-38.pyc | Bin 28102 -> 0 bytes .venv/Lib/site-packages/yarl/_quoting.py | 18 - .../yarl/_quoting_c.cp38-win_amd64.pyd | Bin 68608 -> 0 bytes .venv/Lib/site-packages/yarl/_quoting_c.pyi | 16 - .venv/Lib/site-packages/yarl/_quoting_c.pyx | 371 - .venv/Lib/site-packages/yarl/_quoting_py.py | 197 - .venv/Lib/site-packages/yarl/_url.py | 1159 - .venv/Lib/site-packages/yarl/py.typed | 1 - .venv/Scripts/Activate.ps1 | 398 - .venv/Scripts/activate | 76 - .venv/Scripts/activate.bat | 33 - .venv/Scripts/deactivate.bat | 21 - .venv/Scripts/g2e.exe | Bin 107903 -> 0 bytes .venv/Scripts/icalendar.exe | Bin 107907 -> 0 bytes .venv/Scripts/normalizer.exe | Bin 106403 -> 0 bytes .venv/Scripts/pip.exe | Bin 107916 -> 0 bytes .venv/Scripts/pip3.8.exe | Bin 107916 -> 0 bytes .venv/Scripts/pip3.exe | Bin 107916 -> 0 bytes .venv/Scripts/python.exe | Bin 537776 -> 0 bytes .venv/Scripts/pythonw.exe | Bin 536752 -> 0 bytes .venv/Scripts/tatsu.exe | Bin 107899 -> 0 bytes .venv/pyvenv.cfg | 3 - __pycache__/ics_reader.cpython-310.pyc | Bin 3968 -> 0 bytes cogs/setup.py | 26 - cogs/timetable.py | 48 - sche.py | 54 +- 2887 files changed, 44 insertions(+), 460102 deletions(-) delete mode 100644 .venv/Lib/site-packages/TatSu-5.8.3.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/TatSu-5.8.3.dist-info/LICENSE.txt delete mode 100644 .venv/Lib/site-packages/TatSu-5.8.3.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/TatSu-5.8.3.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/TatSu-5.8.3.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/TatSu-5.8.3.dist-info/entry_points.txt delete mode 100644 .venv/Lib/site-packages/TatSu-5.8.3.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/__pycache__/six.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/_distutils_hack/__init__.py delete mode 100644 .venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/_distutils_hack/override.py delete mode 100644 .venv/Lib/site-packages/aiohttp-3.8.1.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/aiohttp-3.8.1.dist-info/LICENSE.txt delete mode 100644 .venv/Lib/site-packages/aiohttp-3.8.1.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/aiohttp-3.8.1.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/aiohttp-3.8.1.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/aiohttp-3.8.1.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/_cparser.pxd.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/_find_header.pxd.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/_helpers.pyi.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/_helpers.pyx.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/_http_parser.pyx.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/_http_writer.pyx.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/_websocket.pyx.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/.hash/hdrs.py.hash delete mode 100644 .venv/Lib/site-packages/aiohttp/__init__.py delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/abc.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/base_protocol.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/client.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/client_exceptions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/client_proto.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/client_reqrep.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/client_ws.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/connector.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/cookiejar.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/formdata.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/hdrs.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/helpers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/http.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/http_exceptions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/http_parser.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/http_websocket.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/http_writer.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/locks.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/log.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/multipart.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/payload.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/payload_streamer.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/pytest_plugin.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/resolver.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/streams.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/tcp_helpers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/test_utils.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/tracing.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/typedefs.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_app.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_exceptions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_fileresponse.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_log.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_middlewares.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_protocol.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_request.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_response.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_routedef.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_runner.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_server.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_urldispatcher.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/web_ws.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/__pycache__/worker.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiohttp/_cparser.pxd delete mode 100644 .venv/Lib/site-packages/aiohttp/_find_header.c delete mode 100644 .venv/Lib/site-packages/aiohttp/_find_header.h delete mode 100644 .venv/Lib/site-packages/aiohttp/_find_header.pxd delete mode 100644 .venv/Lib/site-packages/aiohttp/_headers.pxi delete mode 100644 .venv/Lib/site-packages/aiohttp/_helpers.c delete mode 100644 .venv/Lib/site-packages/aiohttp/_helpers.cp38-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/aiohttp/_helpers.pyi delete mode 100644 .venv/Lib/site-packages/aiohttp/_helpers.pyx delete mode 100644 .venv/Lib/site-packages/aiohttp/_http_parser.c delete mode 100644 .venv/Lib/site-packages/aiohttp/_http_parser.cp38-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/aiohttp/_http_parser.pyx delete mode 100644 .venv/Lib/site-packages/aiohttp/_http_writer.c delete mode 100644 .venv/Lib/site-packages/aiohttp/_http_writer.cp38-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/aiohttp/_http_writer.pyx delete mode 100644 .venv/Lib/site-packages/aiohttp/_websocket.c delete mode 100644 .venv/Lib/site-packages/aiohttp/_websocket.cp38-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/aiohttp/_websocket.pyx delete mode 100644 .venv/Lib/site-packages/aiohttp/abc.py delete mode 100644 .venv/Lib/site-packages/aiohttp/base_protocol.py delete mode 100644 .venv/Lib/site-packages/aiohttp/client.py delete mode 100644 .venv/Lib/site-packages/aiohttp/client_exceptions.py delete mode 100644 .venv/Lib/site-packages/aiohttp/client_proto.py delete mode 100644 .venv/Lib/site-packages/aiohttp/client_reqrep.py delete mode 100644 .venv/Lib/site-packages/aiohttp/client_ws.py delete mode 100644 .venv/Lib/site-packages/aiohttp/connector.py delete mode 100644 .venv/Lib/site-packages/aiohttp/cookiejar.py delete mode 100644 .venv/Lib/site-packages/aiohttp/formdata.py delete mode 100644 .venv/Lib/site-packages/aiohttp/hdrs.py delete mode 100644 .venv/Lib/site-packages/aiohttp/helpers.py delete mode 100644 .venv/Lib/site-packages/aiohttp/http.py delete mode 100644 .venv/Lib/site-packages/aiohttp/http_exceptions.py delete mode 100644 .venv/Lib/site-packages/aiohttp/http_parser.py delete mode 100644 .venv/Lib/site-packages/aiohttp/http_websocket.py delete mode 100644 .venv/Lib/site-packages/aiohttp/http_writer.py delete mode 100644 .venv/Lib/site-packages/aiohttp/locks.py delete mode 100644 .venv/Lib/site-packages/aiohttp/log.py delete mode 100644 .venv/Lib/site-packages/aiohttp/multipart.py delete mode 100644 .venv/Lib/site-packages/aiohttp/payload.py delete mode 100644 .venv/Lib/site-packages/aiohttp/payload_streamer.py delete mode 100644 .venv/Lib/site-packages/aiohttp/py.typed delete mode 100644 .venv/Lib/site-packages/aiohttp/pytest_plugin.py delete mode 100644 .venv/Lib/site-packages/aiohttp/resolver.py delete mode 100644 .venv/Lib/site-packages/aiohttp/streams.py delete mode 100644 .venv/Lib/site-packages/aiohttp/tcp_helpers.py delete mode 100644 .venv/Lib/site-packages/aiohttp/test_utils.py delete mode 100644 .venv/Lib/site-packages/aiohttp/tracing.py delete mode 100644 .venv/Lib/site-packages/aiohttp/typedefs.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_app.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_exceptions.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_fileresponse.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_log.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_middlewares.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_protocol.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_request.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_response.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_routedef.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_runner.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_server.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_urldispatcher.py delete mode 100644 .venv/Lib/site-packages/aiohttp/web_ws.py delete mode 100644 .venv/Lib/site-packages/aiohttp/worker.py delete mode 100644 .venv/Lib/site-packages/aiosignal-1.2.0.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/aiosignal-1.2.0.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/aiosignal-1.2.0.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/aiosignal-1.2.0.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/aiosignal-1.2.0.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/aiosignal-1.2.0.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/aiosignal/__init__.py delete mode 100644 .venv/Lib/site-packages/aiosignal/__init__.pyi delete mode 100644 .venv/Lib/site-packages/aiosignal/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/aiosignal/py.typed delete mode 100644 .venv/Lib/site-packages/arrow-1.2.3.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/arrow-1.2.3.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/arrow-1.2.3.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/arrow-1.2.3.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/arrow-1.2.3.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/arrow-1.2.3.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/arrow/__init__.py delete mode 100644 .venv/Lib/site-packages/arrow/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/arrow/__pycache__/_version.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/arrow/__pycache__/api.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/arrow/__pycache__/arrow.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/arrow/__pycache__/constants.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/arrow/__pycache__/factory.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/arrow/__pycache__/formatter.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/arrow/__pycache__/locales.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/arrow/__pycache__/parser.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/arrow/__pycache__/util.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/arrow/_version.py delete mode 100644 .venv/Lib/site-packages/arrow/api.py delete mode 100644 .venv/Lib/site-packages/arrow/arrow.py delete mode 100644 .venv/Lib/site-packages/arrow/constants.py delete mode 100644 .venv/Lib/site-packages/arrow/factory.py delete mode 100644 .venv/Lib/site-packages/arrow/formatter.py delete mode 100644 .venv/Lib/site-packages/arrow/locales.py delete mode 100644 .venv/Lib/site-packages/arrow/parser.py delete mode 100644 .venv/Lib/site-packages/arrow/py.typed delete mode 100644 .venv/Lib/site-packages/arrow/util.py delete mode 100644 .venv/Lib/site-packages/async_timeout-4.0.2.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/async_timeout-4.0.2.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/async_timeout-4.0.2.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/async_timeout-4.0.2.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/async_timeout-4.0.2.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/async_timeout-4.0.2.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/async_timeout-4.0.2.dist-info/zip-safe delete mode 100644 .venv/Lib/site-packages/async_timeout/__init__.py delete mode 100644 .venv/Lib/site-packages/async_timeout/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/async_timeout/py.typed delete mode 100644 .venv/Lib/site-packages/attr/__init__.py delete mode 100644 .venv/Lib/site-packages/attr/__init__.pyi delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/_cmp.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/_compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/_config.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/_funcs.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/_make.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/_next_gen.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/_version_info.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/converters.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/exceptions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/filters.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/setters.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attr/__pycache__/validators.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attr/_cmp.py delete mode 100644 .venv/Lib/site-packages/attr/_cmp.pyi delete mode 100644 .venv/Lib/site-packages/attr/_compat.py delete mode 100644 .venv/Lib/site-packages/attr/_config.py delete mode 100644 .venv/Lib/site-packages/attr/_funcs.py delete mode 100644 .venv/Lib/site-packages/attr/_make.py delete mode 100644 .venv/Lib/site-packages/attr/_next_gen.py delete mode 100644 .venv/Lib/site-packages/attr/_version_info.py delete mode 100644 .venv/Lib/site-packages/attr/_version_info.pyi delete mode 100644 .venv/Lib/site-packages/attr/converters.py delete mode 100644 .venv/Lib/site-packages/attr/converters.pyi delete mode 100644 .venv/Lib/site-packages/attr/exceptions.py delete mode 100644 .venv/Lib/site-packages/attr/exceptions.pyi delete mode 100644 .venv/Lib/site-packages/attr/filters.py delete mode 100644 .venv/Lib/site-packages/attr/filters.pyi delete mode 100644 .venv/Lib/site-packages/attr/py.typed delete mode 100644 .venv/Lib/site-packages/attr/setters.py delete mode 100644 .venv/Lib/site-packages/attr/setters.pyi delete mode 100644 .venv/Lib/site-packages/attr/validators.py delete mode 100644 .venv/Lib/site-packages/attr/validators.pyi delete mode 100644 .venv/Lib/site-packages/attrs-22.1.0.dist-info/AUTHORS.rst delete mode 100644 .venv/Lib/site-packages/attrs-22.1.0.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/attrs-22.1.0.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/attrs-22.1.0.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/attrs-22.1.0.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/attrs-22.1.0.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/attrs-22.1.0.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/attrs/__init__.py delete mode 100644 .venv/Lib/site-packages/attrs/__init__.pyi delete mode 100644 .venv/Lib/site-packages/attrs/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attrs/__pycache__/converters.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attrs/__pycache__/exceptions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attrs/__pycache__/filters.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attrs/__pycache__/setters.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attrs/__pycache__/validators.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/attrs/converters.py delete mode 100644 .venv/Lib/site-packages/attrs/exceptions.py delete mode 100644 .venv/Lib/site-packages/attrs/filters.py delete mode 100644 .venv/Lib/site-packages/attrs/py.typed delete mode 100644 .venv/Lib/site-packages/attrs/setters.py delete mode 100644 .venv/Lib/site-packages/attrs/validators.py delete mode 100644 .venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/entry_points.txt delete mode 100644 .venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/charset_normalizer/__init__.py delete mode 100644 .venv/Lib/site-packages/charset_normalizer/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/charset_normalizer/__pycache__/api.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/charset_normalizer/__pycache__/cd.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/charset_normalizer/__pycache__/constant.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/charset_normalizer/__pycache__/legacy.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/charset_normalizer/__pycache__/md.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/charset_normalizer/__pycache__/models.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/charset_normalizer/__pycache__/utils.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/charset_normalizer/__pycache__/version.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/charset_normalizer/api.py delete mode 100644 .venv/Lib/site-packages/charset_normalizer/assets/__init__.py delete mode 100644 .venv/Lib/site-packages/charset_normalizer/assets/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/charset_normalizer/cd.py delete mode 100644 .venv/Lib/site-packages/charset_normalizer/cli/__init__.py delete mode 100644 .venv/Lib/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/charset_normalizer/cli/__pycache__/normalizer.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/charset_normalizer/cli/normalizer.py delete mode 100644 .venv/Lib/site-packages/charset_normalizer/constant.py delete mode 100644 .venv/Lib/site-packages/charset_normalizer/legacy.py delete mode 100644 .venv/Lib/site-packages/charset_normalizer/md.py delete mode 100644 .venv/Lib/site-packages/charset_normalizer/models.py delete mode 100644 .venv/Lib/site-packages/charset_normalizer/py.typed delete mode 100644 .venv/Lib/site-packages/charset_normalizer/utils.py delete mode 100644 .venv/Lib/site-packages/charset_normalizer/version.py delete mode 100644 .venv/Lib/site-packages/dateutil/__init__.py delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/_common.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/_version.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/easter.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/relativedelta.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/rrule.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/tzwin.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/utils.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/_common.py delete mode 100644 .venv/Lib/site-packages/dateutil/_version.py delete mode 100644 .venv/Lib/site-packages/dateutil/easter.py delete mode 100644 .venv/Lib/site-packages/dateutil/parser/__init__.py delete mode 100644 .venv/Lib/site-packages/dateutil/parser/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/parser/__pycache__/_parser.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/parser/__pycache__/isoparser.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/parser/_parser.py delete mode 100644 .venv/Lib/site-packages/dateutil/parser/isoparser.py delete mode 100644 .venv/Lib/site-packages/dateutil/relativedelta.py delete mode 100644 .venv/Lib/site-packages/dateutil/rrule.py delete mode 100644 .venv/Lib/site-packages/dateutil/tz/__init__.py delete mode 100644 .venv/Lib/site-packages/dateutil/tz/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/tz/__pycache__/_common.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/tz/__pycache__/_factories.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/tz/__pycache__/tz.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/tz/__pycache__/win.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/tz/_common.py delete mode 100644 .venv/Lib/site-packages/dateutil/tz/_factories.py delete mode 100644 .venv/Lib/site-packages/dateutil/tz/tz.py delete mode 100644 .venv/Lib/site-packages/dateutil/tz/win.py delete mode 100644 .venv/Lib/site-packages/dateutil/tzwin.py delete mode 100644 .venv/Lib/site-packages/dateutil/utils.py delete mode 100644 .venv/Lib/site-packages/dateutil/zoneinfo/__init__.py delete mode 100644 .venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz delete mode 100644 .venv/Lib/site-packages/dateutil/zoneinfo/rebuild.py delete mode 100644 .venv/Lib/site-packages/discord-2.0.0.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/discord-2.0.0.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/discord-2.0.0.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/discord-2.0.0.dist-info/REQUESTED delete mode 100644 .venv/Lib/site-packages/discord-2.0.0.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/discord-2.0.0.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/discord.py-2.0.1.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/discord.py-2.0.1.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/discord.py-2.0.1.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/discord.py-2.0.1.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/discord.py-2.0.1.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/discord.py-2.0.1.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/discord/__init__.py delete mode 100644 .venv/Lib/site-packages/discord/__main__.py delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/__main__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/abc.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/activity.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/appinfo.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/asset.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/audit_logs.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/automod.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/backoff.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/channel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/client.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/colour.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/components.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/context_managers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/embeds.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/emoji.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/enums.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/errors.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/file.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/flags.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/gateway.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/guild.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/http.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/integrations.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/interactions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/invite.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/member.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/mentions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/message.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/mixins.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/object.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/oggparse.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/opus.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/partial_emoji.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/permissions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/player.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/raw_models.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/reaction.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/role.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/scheduled_event.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/shard.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/stage_instance.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/state.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/sticker.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/team.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/template.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/threads.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/user.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/utils.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/voice_client.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/welcome_screen.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/__pycache__/widget.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/abc.py delete mode 100644 .venv/Lib/site-packages/discord/activity.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__init__.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/checks.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/commands.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/errors.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/models.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/namespace.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/transformers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/translator.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/__pycache__/tree.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/app_commands/checks.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/commands.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/errors.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/models.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/namespace.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/transformers.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/translator.py delete mode 100644 .venv/Lib/site-packages/discord/app_commands/tree.py delete mode 100644 .venv/Lib/site-packages/discord/appinfo.py delete mode 100644 .venv/Lib/site-packages/discord/asset.py delete mode 100644 .venv/Lib/site-packages/discord/audit_logs.py delete mode 100644 .venv/Lib/site-packages/discord/automod.py delete mode 100644 .venv/Lib/site-packages/discord/backoff.py delete mode 100644 .venv/Lib/site-packages/discord/bin/libopus-0.x64.dll delete mode 100644 .venv/Lib/site-packages/discord/bin/libopus-0.x86.dll delete mode 100644 .venv/Lib/site-packages/discord/channel.py delete mode 100644 .venv/Lib/site-packages/discord/client.py delete mode 100644 .venv/Lib/site-packages/discord/colour.py delete mode 100644 .venv/Lib/site-packages/discord/components.py delete mode 100644 .venv/Lib/site-packages/discord/context_managers.py delete mode 100644 .venv/Lib/site-packages/discord/embeds.py delete mode 100644 .venv/Lib/site-packages/discord/emoji.py delete mode 100644 .venv/Lib/site-packages/discord/enums.py delete mode 100644 .venv/Lib/site-packages/discord/errors.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__init__.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/_types.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/bot.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/cog.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/context.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/converter.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/cooldowns.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/core.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/errors.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/flags.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/help.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/hybrid.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/parameters.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/__pycache__/view.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/_types.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/bot.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/cog.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/context.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/converter.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/cooldowns.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/core.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/errors.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/flags.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/help.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/hybrid.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/parameters.py delete mode 100644 .venv/Lib/site-packages/discord/ext/commands/view.py delete mode 100644 .venv/Lib/site-packages/discord/ext/tasks/__init__.py delete mode 100644 .venv/Lib/site-packages/discord/ext/tasks/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/file.py delete mode 100644 .venv/Lib/site-packages/discord/flags.py delete mode 100644 .venv/Lib/site-packages/discord/gateway.py delete mode 100644 .venv/Lib/site-packages/discord/guild.py delete mode 100644 .venv/Lib/site-packages/discord/http.py delete mode 100644 .venv/Lib/site-packages/discord/integrations.py delete mode 100644 .venv/Lib/site-packages/discord/interactions.py delete mode 100644 .venv/Lib/site-packages/discord/invite.py delete mode 100644 .venv/Lib/site-packages/discord/member.py delete mode 100644 .venv/Lib/site-packages/discord/mentions.py delete mode 100644 .venv/Lib/site-packages/discord/message.py delete mode 100644 .venv/Lib/site-packages/discord/mixins.py delete mode 100644 .venv/Lib/site-packages/discord/object.py delete mode 100644 .venv/Lib/site-packages/discord/oggparse.py delete mode 100644 .venv/Lib/site-packages/discord/opus.py delete mode 100644 .venv/Lib/site-packages/discord/partial_emoji.py delete mode 100644 .venv/Lib/site-packages/discord/permissions.py delete mode 100644 .venv/Lib/site-packages/discord/player.py delete mode 100644 .venv/Lib/site-packages/discord/py.typed delete mode 100644 .venv/Lib/site-packages/discord/raw_models.py delete mode 100644 .venv/Lib/site-packages/discord/reaction.py delete mode 100644 .venv/Lib/site-packages/discord/role.py delete mode 100644 .venv/Lib/site-packages/discord/scheduled_event.py delete mode 100644 .venv/Lib/site-packages/discord/shard.py delete mode 100644 .venv/Lib/site-packages/discord/stage_instance.py delete mode 100644 .venv/Lib/site-packages/discord/state.py delete mode 100644 .venv/Lib/site-packages/discord/sticker.py delete mode 100644 .venv/Lib/site-packages/discord/team.py delete mode 100644 .venv/Lib/site-packages/discord/template.py delete mode 100644 .venv/Lib/site-packages/discord/threads.py delete mode 100644 .venv/Lib/site-packages/discord/types/__init__.py delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/activity.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/appinfo.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/audit_log.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/automod.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/channel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/command.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/components.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/embed.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/emoji.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/gateway.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/guild.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/integration.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/interactions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/invite.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/member.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/message.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/role.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/scheduled_event.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/snowflake.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/sticker.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/team.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/template.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/threads.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/user.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/voice.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/webhook.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/welcome_screen.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/__pycache__/widget.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/types/activity.py delete mode 100644 .venv/Lib/site-packages/discord/types/appinfo.py delete mode 100644 .venv/Lib/site-packages/discord/types/audit_log.py delete mode 100644 .venv/Lib/site-packages/discord/types/automod.py delete mode 100644 .venv/Lib/site-packages/discord/types/channel.py delete mode 100644 .venv/Lib/site-packages/discord/types/command.py delete mode 100644 .venv/Lib/site-packages/discord/types/components.py delete mode 100644 .venv/Lib/site-packages/discord/types/embed.py delete mode 100644 .venv/Lib/site-packages/discord/types/emoji.py delete mode 100644 .venv/Lib/site-packages/discord/types/gateway.py delete mode 100644 .venv/Lib/site-packages/discord/types/guild.py delete mode 100644 .venv/Lib/site-packages/discord/types/integration.py delete mode 100644 .venv/Lib/site-packages/discord/types/interactions.py delete mode 100644 .venv/Lib/site-packages/discord/types/invite.py delete mode 100644 .venv/Lib/site-packages/discord/types/member.py delete mode 100644 .venv/Lib/site-packages/discord/types/message.py delete mode 100644 .venv/Lib/site-packages/discord/types/role.py delete mode 100644 .venv/Lib/site-packages/discord/types/scheduled_event.py delete mode 100644 .venv/Lib/site-packages/discord/types/snowflake.py delete mode 100644 .venv/Lib/site-packages/discord/types/sticker.py delete mode 100644 .venv/Lib/site-packages/discord/types/team.py delete mode 100644 .venv/Lib/site-packages/discord/types/template.py delete mode 100644 .venv/Lib/site-packages/discord/types/threads.py delete mode 100644 .venv/Lib/site-packages/discord/types/user.py delete mode 100644 .venv/Lib/site-packages/discord/types/voice.py delete mode 100644 .venv/Lib/site-packages/discord/types/webhook.py delete mode 100644 .venv/Lib/site-packages/discord/types/welcome_screen.py delete mode 100644 .venv/Lib/site-packages/discord/types/widget.py delete mode 100644 .venv/Lib/site-packages/discord/ui/__init__.py delete mode 100644 .venv/Lib/site-packages/discord/ui/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ui/__pycache__/button.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ui/__pycache__/item.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ui/__pycache__/modal.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ui/__pycache__/select.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ui/__pycache__/text_input.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ui/__pycache__/view.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/ui/button.py delete mode 100644 .venv/Lib/site-packages/discord/ui/item.py delete mode 100644 .venv/Lib/site-packages/discord/ui/modal.py delete mode 100644 .venv/Lib/site-packages/discord/ui/select.py delete mode 100644 .venv/Lib/site-packages/discord/ui/text_input.py delete mode 100644 .venv/Lib/site-packages/discord/ui/view.py delete mode 100644 .venv/Lib/site-packages/discord/user.py delete mode 100644 .venv/Lib/site-packages/discord/utils.py delete mode 100644 .venv/Lib/site-packages/discord/voice_client.py delete mode 100644 .venv/Lib/site-packages/discord/webhook/__init__.py delete mode 100644 .venv/Lib/site-packages/discord/webhook/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/webhook/__pycache__/async_.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/webhook/__pycache__/sync.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord/webhook/async_.py delete mode 100644 .venv/Lib/site-packages/discord/webhook/sync.py delete mode 100644 .venv/Lib/site-packages/discord/welcome_screen.py delete mode 100644 .venv/Lib/site-packages/discord/widget.py delete mode 100644 .venv/Lib/site-packages/discord_py_slash_command-2.0.2.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/discord_py_slash_command-2.0.2.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/discord_py_slash_command-2.0.2.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/discord_py_slash_command-2.0.2.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/discord_py_slash_command-2.0.2.dist-info/REQUESTED delete mode 100644 .venv/Lib/site-packages/discord_py_slash_command-2.0.2.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/discord_py_slash_command-2.0.2.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/discord_slash/__init__.py delete mode 100644 .venv/Lib/site-packages/discord_slash/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord_slash/__pycache__/client.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord_slash/__pycache__/cog_ext.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord_slash/__pycache__/const.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord_slash/__pycache__/context.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord_slash/__pycache__/dpy_overrides.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord_slash/__pycache__/error.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord_slash/__pycache__/http.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord_slash/__pycache__/model.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord_slash/client.py delete mode 100644 .venv/Lib/site-packages/discord_slash/cog_ext.py delete mode 100644 .venv/Lib/site-packages/discord_slash/const.py delete mode 100644 .venv/Lib/site-packages/discord_slash/context.py delete mode 100644 .venv/Lib/site-packages/discord_slash/dpy_overrides.py delete mode 100644 .venv/Lib/site-packages/discord_slash/error.py delete mode 100644 .venv/Lib/site-packages/discord_slash/http.py delete mode 100644 .venv/Lib/site-packages/discord_slash/model.py delete mode 100644 .venv/Lib/site-packages/discord_slash/utils/__init__.py delete mode 100644 .venv/Lib/site-packages/discord_slash/utils/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord_slash/utils/__pycache__/manage_commands.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord_slash/utils/__pycache__/manage_components.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/discord_slash/utils/manage_commands.py delete mode 100644 .venv/Lib/site-packages/discord_slash/utils/manage_components.py delete mode 100644 .venv/Lib/site-packages/distutils-precedence.pth delete mode 100644 .venv/Lib/site-packages/frozenlist-1.3.1.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/frozenlist-1.3.1.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/frozenlist-1.3.1.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/frozenlist-1.3.1.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/frozenlist-1.3.1.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/frozenlist-1.3.1.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/frozenlist/__init__.py delete mode 100644 .venv/Lib/site-packages/frozenlist/__init__.pyi delete mode 100644 .venv/Lib/site-packages/frozenlist/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/frozenlist/_frozenlist.cp38-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/frozenlist/_frozenlist.pyx delete mode 100644 .venv/Lib/site-packages/frozenlist/py.typed delete mode 100644 .venv/Lib/site-packages/icalendar-4.1.0.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/icalendar-4.1.0.dist-info/LICENSE.rst delete mode 100644 .venv/Lib/site-packages/icalendar-4.1.0.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/icalendar-4.1.0.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/icalendar-4.1.0.dist-info/REQUESTED delete mode 100644 .venv/Lib/site-packages/icalendar-4.1.0.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/icalendar-4.1.0.dist-info/entry_points.txt delete mode 100644 .venv/Lib/site-packages/icalendar-4.1.0.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/icalendar/__init__.py delete mode 100644 .venv/Lib/site-packages/icalendar/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/__pycache__/cal.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/__pycache__/caselessdict.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/__pycache__/cli.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/__pycache__/compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/__pycache__/parser.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/__pycache__/parser_tools.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/__pycache__/prop.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/__pycache__/timezone_cache.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/__pycache__/tools.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/__pycache__/windows_to_olson.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/cal.py delete mode 100644 .venv/Lib/site-packages/icalendar/caselessdict.py delete mode 100644 .venv/Lib/site-packages/icalendar/cli.py delete mode 100644 .venv/Lib/site-packages/icalendar/compat.py delete mode 100644 .venv/Lib/site-packages/icalendar/parser.py delete mode 100644 .venv/Lib/site-packages/icalendar/parser_tools.py delete mode 100644 .venv/Lib/site-packages/icalendar/prop.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/__init__.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/tests/__pycache__/test_encoding.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/tests/__pycache__/test_fixed_issues.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/tests/__pycache__/test_icalendar.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/tests/__pycache__/test_multiple.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/tests/__pycache__/test_property_params.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/tests/__pycache__/test_recurrence.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/tests/__pycache__/test_time.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/tests/__pycache__/test_timezoned.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/tests/__pycache__/test_unit_cal.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/tests/__pycache__/test_unit_caselessdict.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/tests/__pycache__/test_unit_parser_tools.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/tests/__pycache__/test_unit_prop.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/tests/__pycache__/test_unit_tools.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/tests/america_new_york.ics delete mode 100644 .venv/Lib/site-packages/icalendar/tests/encoding.ics delete mode 100644 .venv/Lib/site-packages/icalendar/tests/hypothesis/__pycache__/test_fuzzing.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/icalendar/tests/hypothesis/test_fuzzing.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/issue_112_missing_tzinfo_on_exdate.ics delete mode 100644 .venv/Lib/site-packages/icalendar/tests/issue_53_parsing_failure.ics delete mode 100644 .venv/Lib/site-packages/icalendar/tests/multiple.ics delete mode 100644 .venv/Lib/site-packages/icalendar/tests/pacific_fiji.ics delete mode 100644 .venv/Lib/site-packages/icalendar/tests/recurrence.ics delete mode 100644 .venv/Lib/site-packages/icalendar/tests/test_encoding.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/test_fixed_issues.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/test_icalendar.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/test_multiple.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/test_property_params.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/test_recurrence.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/test_time.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/test_timezoned.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/test_unit_cal.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/test_unit_caselessdict.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/test_unit_parser_tools.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/test_unit_prop.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/test_unit_tools.py delete mode 100644 .venv/Lib/site-packages/icalendar/tests/time.ics delete mode 100644 .venv/Lib/site-packages/icalendar/tests/timezone_rdate.ics delete mode 100644 .venv/Lib/site-packages/icalendar/tests/timezone_same_start.ics delete mode 100644 .venv/Lib/site-packages/icalendar/tests/timezone_same_start_and_offset.ics delete mode 100644 .venv/Lib/site-packages/icalendar/tests/timezoned.ics delete mode 100644 .venv/Lib/site-packages/icalendar/tests/x_location.ics delete mode 100644 .venv/Lib/site-packages/icalendar/timezone_cache.py delete mode 100644 .venv/Lib/site-packages/icalendar/tools.py delete mode 100644 .venv/Lib/site-packages/icalendar/windows_to_olson.py delete mode 100644 .venv/Lib/site-packages/ics-0.7.2.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/ics-0.7.2.dist-info/LICENSE.rst delete mode 100644 .venv/Lib/site-packages/ics-0.7.2.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/ics-0.7.2.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/ics-0.7.2.dist-info/REQUESTED delete mode 100644 .venv/Lib/site-packages/ics-0.7.2.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/ics-0.7.2.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/ics/__init__.py delete mode 100644 .venv/Lib/site-packages/ics/__meta__.py delete mode 100644 .venv/Lib/site-packages/ics/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/__pycache__/__meta__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/__pycache__/attendee.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/__pycache__/component.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/__pycache__/event.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/__pycache__/icalendar.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/__pycache__/timeline.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/__pycache__/todo.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/__pycache__/tools.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/__pycache__/types.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/__pycache__/utils.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/alarm/__init__.py delete mode 100644 .venv/Lib/site-packages/ics/alarm/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/alarm/__pycache__/audio.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/alarm/__pycache__/base.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/alarm/__pycache__/custom.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/alarm/__pycache__/display.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/alarm/__pycache__/email.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/alarm/__pycache__/none.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/alarm/__pycache__/utils.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/alarm/audio.py delete mode 100644 .venv/Lib/site-packages/ics/alarm/base.py delete mode 100644 .venv/Lib/site-packages/ics/alarm/custom.py delete mode 100644 .venv/Lib/site-packages/ics/alarm/display.py delete mode 100644 .venv/Lib/site-packages/ics/alarm/email.py delete mode 100644 .venv/Lib/site-packages/ics/alarm/none.py delete mode 100644 .venv/Lib/site-packages/ics/alarm/utils.py delete mode 100644 .venv/Lib/site-packages/ics/attendee.py delete mode 100644 .venv/Lib/site-packages/ics/component.py delete mode 100644 .venv/Lib/site-packages/ics/event.py delete mode 100644 .venv/Lib/site-packages/ics/grammar/__init__.py delete mode 100644 .venv/Lib/site-packages/ics/grammar/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/grammar/__pycache__/contentline.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/grammar/__pycache__/parse.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/grammar/contentline.ebnf delete mode 100644 .venv/Lib/site-packages/ics/grammar/contentline.py delete mode 100644 .venv/Lib/site-packages/ics/grammar/parse.py delete mode 100644 .venv/Lib/site-packages/ics/icalendar.py delete mode 100644 .venv/Lib/site-packages/ics/parsers/__pycache__/alarm_parser.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/parsers/__pycache__/attendee_parser.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/parsers/__pycache__/event_parser.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/parsers/__pycache__/icalendar_parser.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/parsers/__pycache__/parser.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/parsers/__pycache__/todo_parser.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/parsers/alarm_parser.py delete mode 100644 .venv/Lib/site-packages/ics/parsers/attendee_parser.py delete mode 100644 .venv/Lib/site-packages/ics/parsers/event_parser.py delete mode 100644 .venv/Lib/site-packages/ics/parsers/icalendar_parser.py delete mode 100644 .venv/Lib/site-packages/ics/parsers/parser.py delete mode 100644 .venv/Lib/site-packages/ics/parsers/todo_parser.py delete mode 100644 .venv/Lib/site-packages/ics/serializers/__pycache__/alarm_serializer.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/serializers/__pycache__/attendee_serializer.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/serializers/__pycache__/event_serializer.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/serializers/__pycache__/icalendar_serializer.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/serializers/__pycache__/serializer.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/serializers/__pycache__/todo_serializer.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/ics/serializers/alarm_serializer.py delete mode 100644 .venv/Lib/site-packages/ics/serializers/attendee_serializer.py delete mode 100644 .venv/Lib/site-packages/ics/serializers/event_serializer.py delete mode 100644 .venv/Lib/site-packages/ics/serializers/icalendar_serializer.py delete mode 100644 .venv/Lib/site-packages/ics/serializers/serializer.py delete mode 100644 .venv/Lib/site-packages/ics/serializers/todo_serializer.py delete mode 100644 .venv/Lib/site-packages/ics/timeline.py delete mode 100644 .venv/Lib/site-packages/ics/todo.py delete mode 100644 .venv/Lib/site-packages/ics/tools.py delete mode 100644 .venv/Lib/site-packages/ics/types.py delete mode 100644 .venv/Lib/site-packages/ics/utils.py delete mode 100644 .venv/Lib/site-packages/idna-3.4.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/idna-3.4.dist-info/LICENSE.md delete mode 100644 .venv/Lib/site-packages/idna-3.4.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/idna-3.4.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/idna-3.4.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/idna/__init__.py delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/codec.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/core.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/idnadata.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/intranges.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/package_data.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/idna/__pycache__/uts46data.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/idna/codec.py delete mode 100644 .venv/Lib/site-packages/idna/compat.py delete mode 100644 .venv/Lib/site-packages/idna/core.py delete mode 100644 .venv/Lib/site-packages/idna/idnadata.py delete mode 100644 .venv/Lib/site-packages/idna/intranges.py delete mode 100644 .venv/Lib/site-packages/idna/package_data.py delete mode 100644 .venv/Lib/site-packages/idna/py.typed delete mode 100644 .venv/Lib/site-packages/idna/uts46data.py delete mode 100644 .venv/Lib/site-packages/multidict-6.0.2.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/multidict-6.0.2.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/multidict-6.0.2.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/multidict-6.0.2.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/multidict-6.0.2.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/multidict-6.0.2.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/multidict/__init__.py delete mode 100644 .venv/Lib/site-packages/multidict/__init__.pyi delete mode 100644 .venv/Lib/site-packages/multidict/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/multidict/__pycache__/_abc.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/multidict/__pycache__/_compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/multidict/__pycache__/_multidict_base.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/multidict/__pycache__/_multidict_py.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/multidict/_abc.py delete mode 100644 .venv/Lib/site-packages/multidict/_compat.py delete mode 100644 .venv/Lib/site-packages/multidict/_multidict.cp38-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/multidict/_multidict_base.py delete mode 100644 .venv/Lib/site-packages/multidict/_multidict_py.py delete mode 100644 .venv/Lib/site-packages/multidict/py.typed delete mode 100644 .venv/Lib/site-packages/pip-22.2.2.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/pip-22.2.2.dist-info/LICENSE.txt delete mode 100644 .venv/Lib/site-packages/pip-22.2.2.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/pip-22.2.2.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/pip-22.2.2.dist-info/REQUESTED delete mode 100644 .venv/Lib/site-packages/pip-22.2.2.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/pip-22.2.2.dist-info/entry_points.txt delete mode 100644 .venv/Lib/site-packages/pip-22.2.2.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/pip/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/__main__.py delete mode 100644 .venv/Lib/site-packages/pip/__pip-runner__.py delete mode 100644 .venv/Lib/site-packages/pip/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/__pycache__/__main__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/build_env.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cache.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/base_command.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/command_context.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/main.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/parser.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/progress_bars.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/req_command.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/spinners.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/cache.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/check.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/completion.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/configuration.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/debug.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/download.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/freeze.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/hash.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/help.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/index.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/inspect.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/install.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/list.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/search.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/show.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/commands/wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/configuration.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/base.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/installed.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/sdist.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/distributions/wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/exceptions.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/collector.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/package_finder.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/index/sources.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/_distutils.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/locations/base.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/main.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/_json.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/base.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/candidate.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/direct_url.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/format_control.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/index.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/installation_report.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/link.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/scheme.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/search_scope.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/selection_prefs.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/target_python.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/models/wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/auth.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/cache.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/download.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/session.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/utils.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/network/xmlrpc.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/metadata.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/check.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/freeze.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/legacy.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/install/wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/operations/prepare.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/pyproject.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/constructors.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/req_file.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/req_install.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/req_set.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/base.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/self_outdated_check.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/_log.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/compat.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/datetime.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/distutils_args.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/egg_link.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/encoding.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/entrypoints.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/filetypes.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/glibc.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/hashes.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/logging.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/misc.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/models.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/packaging.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/subprocess.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/unpacking.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/urls.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/virtualenv.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/utils/wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/git.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py delete mode 100644 .venv/Lib/site-packages/pip/_internal/wheel_builder.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem delete mode 100644 .venv/Lib/site-packages/pip/_vendor/certifi/core.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/enums.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/escprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/escsm.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/johabfreq.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/johabprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/metadata/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/utf1632prober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/chardet/version.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/ansi.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/initialise.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/win32.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/colorama/winterm.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/compat.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/database.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/index.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/resources.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/scripts.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/t32.exe delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/t64.exe delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/util.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/version.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/w32.exe delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/w64-arm.exe delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/w64.exe delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distro/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distro/__main__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/distro/distro.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/codec.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/compat.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/core.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/idnadata.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/intranges.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/package_data.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/idna/uts46data.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/ext.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__about__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/_manylinux.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/_musllinux.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/_structures.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/markers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/requirements.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/tags.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/utils.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/packaging/version.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/dirtools.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/meta.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/build.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/check.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/colorlog.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/compat.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/dirtools.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/envbuild.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/in_process/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/in_process/_in_process.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/meta.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pep517/wrappers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/android.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/api.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/version.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__main__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/cmdline.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/console.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/filter.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatter.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/bbcode.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/groff.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/html.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/img.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/irc.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/latex.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/other.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/rtf.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/svg.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/formatters/terminal256.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/lexer.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/modeline.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/plugin.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/regexopt.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/scanner.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/style.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/token.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/unistring.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pygments/util.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/actions.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/common.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/core.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/exceptions.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/helpers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/results.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/testing.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/unicode.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/pyparsing/util.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/__version__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/adapters.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/api.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/auth.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/certs.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/compat.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/cookies.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/exceptions.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/help.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/hooks.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/models.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/packages.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/sessions.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/status_codes.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/structures.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/requests/utils.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__main__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/json.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/region.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/text.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_cell_widths.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_export_format.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_extension.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_inspect.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_log_render.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_loop.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_palettes.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_pick.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_ratio.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_spinners.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_stack.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_timer.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_win32_console.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_windows.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_windows_renderer.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/_wrap.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/abc.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/align.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/ansi.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/bar.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/box.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/cells.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/color.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/color_triplet.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/columns.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/console.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/constrain.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/containers.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/control.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/default_styles.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/diagnose.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/emoji.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/errors.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/filesize.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/highlighter.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/json.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/jupyter.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/layout.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/live.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/live_render.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/logging.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/markup.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/measure.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/padding.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/pager.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/palette.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/panel.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/pretty.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/progress.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/prompt.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/protocol.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/region.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/repr.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/rule.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/scope.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/screen.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/segment.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/spinner.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/status.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/style.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/styled.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/syntax.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/table.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/terminal_theme.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/text.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/theme.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/themes.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/traceback.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/rich/tree.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/six.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/_asyncio.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/_utils.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/after.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/before.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/before_sleep.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/nap.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/retry.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/stop.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/tornadoweb.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tenacity/wait.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/_parser.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/_re.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/tomli/_types.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/typing_extensions.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/_version.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/connection.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/fields.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/request.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/response.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/vendor.txt delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/__init__.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/labels.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/tests.py delete mode 100644 .venv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py delete mode 100644 .venv/Lib/site-packages/pip/py.typed delete mode 100644 .venv/Lib/site-packages/pkg_resources/__init__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/__init__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/appdirs.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_typing.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/_typing.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/_vendor/pyparsing.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/extern/__init__.py delete mode 100644 .venv/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/tests/data/my-test-package-source/__pycache__/setup.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py delete mode 100644 .venv/Lib/site-packages/python_dateutil-2.8.2.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/python_dateutil-2.8.2.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/python_dateutil-2.8.2.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/python_dateutil-2.8.2.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/python_dateutil-2.8.2.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/python_dateutil-2.8.2.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/python_dateutil-2.8.2.dist-info/zip-safe delete mode 100644 .venv/Lib/site-packages/pytz-2022.2.1.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/pytz-2022.2.1.dist-info/LICENSE.txt delete mode 100644 .venv/Lib/site-packages/pytz-2022.2.1.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/pytz-2022.2.1.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/pytz-2022.2.1.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/pytz-2022.2.1.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/pytz-2022.2.1.dist-info/zip-safe delete mode 100644 .venv/Lib/site-packages/pytz/__init__.py delete mode 100644 .venv/Lib/site-packages/pytz/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pytz/__pycache__/exceptions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pytz/__pycache__/lazy.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pytz/__pycache__/reference.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pytz/__pycache__/tzfile.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pytz/__pycache__/tzinfo.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/pytz/exceptions.py delete mode 100644 .venv/Lib/site-packages/pytz/lazy.py delete mode 100644 .venv/Lib/site-packages/pytz/reference.py delete mode 100644 .venv/Lib/site-packages/pytz/tzfile.py delete mode 100644 .venv/Lib/site-packages/pytz/tzinfo.py delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Abidjan delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Accra delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Addis_Ababa delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Algiers delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Asmara delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Asmera delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Bamako delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Bangui delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Banjul delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Bissau delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Blantyre delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Brazzaville delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Bujumbura delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Cairo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Casablanca delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Ceuta delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Conakry delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Dakar delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Dar_es_Salaam delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Djibouti delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Douala delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/El_Aaiun delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Freetown delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Gaborone delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Harare delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Johannesburg delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Juba delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Kampala delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Khartoum delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Kigali delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Kinshasa delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Lagos delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Libreville delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Lome delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Luanda delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Lubumbashi delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Lusaka delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Malabo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Maputo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Maseru delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Mbabane delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Mogadishu delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Monrovia delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Nairobi delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Ndjamena delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Niamey delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Nouakchott delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Ouagadougou delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Porto-Novo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Sao_Tome delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Timbuktu delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Tripoli delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Tunis delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Africa/Windhoek delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Adak delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Anchorage delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Anguilla delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Antigua delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Araguaina delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Buenos_Aires delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Catamarca delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/ComodRivadavia delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Cordoba delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Jujuy delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/La_Rioja delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Mendoza delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Rio_Gallegos delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Salta delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/San_Juan delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/San_Luis delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Tucuman delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Argentina/Ushuaia delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Aruba delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Asuncion delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Atikokan delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Atka delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Bahia delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Bahia_Banderas delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Barbados delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Belem delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Belize delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Blanc-Sablon delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Boa_Vista delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Bogota delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Boise delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Buenos_Aires delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Cambridge_Bay delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Campo_Grande delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Cancun delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Caracas delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Catamarca delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Cayenne delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Cayman delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Chicago delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Chihuahua delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Coral_Harbour delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Cordoba delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Costa_Rica delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Creston delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Cuiaba delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Curacao delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Danmarkshavn delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Dawson delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Dawson_Creek delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Denver delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Detroit delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Dominica delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Edmonton delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Eirunepe delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/El_Salvador delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Ensenada delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Fort_Nelson delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Fort_Wayne delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Fortaleza delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Glace_Bay delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Godthab delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Goose_Bay delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Grand_Turk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Grenada delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Guadeloupe delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Guatemala delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Guayaquil delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Guyana delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Halifax delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Havana delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Hermosillo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Indianapolis delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Knox delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Marengo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Petersburg delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Tell_City delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Vevay delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Vincennes delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Indiana/Winamac delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Indianapolis delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Inuvik delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Iqaluit delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Jamaica delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Jujuy delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Juneau delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Kentucky/Louisville delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Kentucky/Monticello delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Knox_IN delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Kralendijk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/La_Paz delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Lima delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Los_Angeles delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Louisville delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Lower_Princes delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Maceio delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Managua delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Manaus delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Marigot delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Martinique delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Matamoros delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Mazatlan delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Mendoza delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Menominee delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Merida delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Metlakatla delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Mexico_City delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Miquelon delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Moncton delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Monterrey delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Montevideo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Montreal delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Montserrat delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Nassau delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/New_York delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Nipigon delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Nome delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Noronha delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/North_Dakota/Beulah delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/North_Dakota/Center delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/North_Dakota/New_Salem delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Nuuk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Ojinaga delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Panama delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Pangnirtung delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Paramaribo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Phoenix delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Port-au-Prince delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Port_of_Spain delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Porto_Acre delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Porto_Velho delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Puerto_Rico delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Punta_Arenas delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Rainy_River delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Rankin_Inlet delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Recife delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Regina delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Resolute delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Rio_Branco delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Rosario delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Santa_Isabel delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Santarem delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Santiago delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Santo_Domingo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Sao_Paulo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Scoresbysund delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Shiprock delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Sitka delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/St_Barthelemy delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/St_Johns delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/St_Kitts delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/St_Lucia delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/St_Thomas delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/St_Vincent delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Swift_Current delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Tegucigalpa delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Thule delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Thunder_Bay delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Tijuana delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Toronto delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Tortola delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Vancouver delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Virgin delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Whitehorse delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Winnipeg delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Yakutat delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/America/Yellowknife delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Casey delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Davis delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Antarctica/DumontDUrville delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Macquarie delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Mawson delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Antarctica/McMurdo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Palmer delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Rothera delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Antarctica/South_Pole delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Syowa delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Troll delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Antarctica/Vostok delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Arctic/Longyearbyen delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Aden delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Almaty delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Amman delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Anadyr delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Aqtau delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Aqtobe delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Ashgabat delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Ashkhabad delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Atyrau delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Baghdad delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Bahrain delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Baku delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Bangkok delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Barnaul delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Beirut delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Bishkek delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Brunei delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Calcutta delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Chita delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Choibalsan delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Chongqing delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Chungking delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Colombo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Dacca delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Damascus delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Dhaka delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Dili delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Dubai delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Dushanbe delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Famagusta delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Gaza delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Harbin delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Hebron delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Ho_Chi_Minh delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Hong_Kong delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Hovd delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Irkutsk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Istanbul delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Jakarta delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Jayapura delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Jerusalem delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Kabul delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Kamchatka delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Karachi delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Kashgar delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Kathmandu delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Katmandu delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Khandyga delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Kolkata delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Krasnoyarsk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Kuala_Lumpur delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Kuching delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Kuwait delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Macao delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Macau delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Magadan delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Makassar delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Manila delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Muscat delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Nicosia delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Novokuznetsk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Novosibirsk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Omsk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Oral delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Phnom_Penh delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Pontianak delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Pyongyang delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Qatar delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Qostanay delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Qyzylorda delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Rangoon delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Riyadh delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Saigon delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Sakhalin delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Samarkand delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Seoul delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Shanghai delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Singapore delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Srednekolymsk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Taipei delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Tashkent delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Tbilisi delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Tehran delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Tel_Aviv delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Thimbu delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Thimphu delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Tokyo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Tomsk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Ujung_Pandang delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Ulaanbaatar delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Ulan_Bator delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Urumqi delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Ust-Nera delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Vientiane delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Vladivostok delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Yakutsk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Yangon delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Yekaterinburg delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Asia/Yerevan delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Azores delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Bermuda delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Canary delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Cape_Verde delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Faeroe delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Faroe delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Jan_Mayen delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Madeira delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Reykjavik delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Atlantic/South_Georgia delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Atlantic/St_Helena delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Atlantic/Stanley delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/ACT delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Adelaide delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Brisbane delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Broken_Hill delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Canberra delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Currie delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Darwin delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Eucla delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Hobart delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/LHI delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Lindeman delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Lord_Howe delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Melbourne delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/NSW delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/North delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Perth delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Queensland delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/South delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Sydney delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Tasmania delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Victoria delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/West delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Australia/Yancowinna delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Brazil/Acre delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Brazil/DeNoronha delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Brazil/East delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Brazil/West delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/CET delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/CST6CDT delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Canada/Atlantic delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Canada/Central delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Canada/Eastern delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Canada/Mountain delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Canada/Newfoundland delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Canada/Pacific delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Canada/Saskatchewan delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Canada/Yukon delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Chile/Continental delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Chile/EasterIsland delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Cuba delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/EET delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/EST delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/EST5EDT delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Egypt delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Eire delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+0 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+1 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+10 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+11 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+12 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+2 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+3 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+4 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+5 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+6 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+7 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+8 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT+9 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-0 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-1 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-10 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-11 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-12 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-13 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-14 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-2 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-3 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-4 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-5 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-6 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-7 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-8 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT-9 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/GMT0 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/Greenwich delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/UCT delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/UTC delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/Universal delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Etc/Zulu delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Amsterdam delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Andorra delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Astrakhan delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Athens delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Belfast delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Belgrade delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Berlin delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Bratislava delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Brussels delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Bucharest delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Budapest delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Busingen delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Chisinau delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Copenhagen delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Dublin delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Gibraltar delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Guernsey delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Helsinki delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Isle_of_Man delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Istanbul delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Jersey delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Kaliningrad delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Kiev delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Kirov delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Kyiv delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Lisbon delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Ljubljana delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/London delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Luxembourg delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Madrid delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Malta delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Mariehamn delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Minsk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Monaco delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Moscow delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Nicosia delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Oslo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Paris delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Podgorica delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Prague delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Riga delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Rome delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Samara delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/San_Marino delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Sarajevo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Saratov delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Simferopol delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Skopje delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Sofia delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Stockholm delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Tallinn delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Tirane delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Tiraspol delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Ulyanovsk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Uzhgorod delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Vaduz delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Vatican delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Vienna delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Vilnius delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Volgograd delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Warsaw delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Zagreb delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Zaporozhye delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Europe/Zurich delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Factory delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/GB delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/GB-Eire delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/GMT delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/GMT+0 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/GMT-0 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/GMT0 delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Greenwich delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/HST delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Hongkong delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Iceland delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Indian/Antananarivo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Indian/Chagos delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Indian/Christmas delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Indian/Cocos delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Indian/Comoro delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Indian/Kerguelen delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Indian/Mahe delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Indian/Maldives delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Indian/Mauritius delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Indian/Mayotte delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Indian/Reunion delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Iran delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Israel delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Jamaica delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Japan delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Kwajalein delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Libya delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/MET delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/MST delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/MST7MDT delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Mexico/BajaNorte delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Mexico/BajaSur delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Mexico/General delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/NZ delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/NZ-CHAT delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Navajo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/PRC delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/PST8PDT delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Apia delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Auckland delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Bougainville delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Chatham delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Chuuk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Easter delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Efate delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Enderbury delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Fakaofo delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Fiji delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Funafuti delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Galapagos delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Gambier delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Guadalcanal delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Guam delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Honolulu delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Johnston delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Kanton delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Kiritimati delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Kosrae delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Kwajalein delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Majuro delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Marquesas delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Midway delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Nauru delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Niue delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Norfolk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Noumea delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Pago_Pago delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Palau delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Pitcairn delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Pohnpei delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Ponape delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Port_Moresby delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Rarotonga delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Saipan delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Samoa delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Tahiti delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Tarawa delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Tongatapu delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Truk delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Wake delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Wallis delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Pacific/Yap delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Poland delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Portugal delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/ROC delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/ROK delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Singapore delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Turkey delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/UCT delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/US/Alaska delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/US/Aleutian delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/US/Arizona delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/US/Central delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/US/East-Indiana delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/US/Eastern delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/US/Hawaii delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/US/Indiana-Starke delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/US/Michigan delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/US/Mountain delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/US/Pacific delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/US/Samoa delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/UTC delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Universal delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/W-SU delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/WET delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/Zulu delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/iso3166.tab delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/leapseconds delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/tzdata.zi delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/zone.tab delete mode 100644 .venv/Lib/site-packages/pytz/zoneinfo/zone1970.tab delete mode 100644 .venv/Lib/site-packages/setuptools-56.0.0.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/setuptools-56.0.0.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/setuptools-56.0.0.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/setuptools-56.0.0.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/setuptools-56.0.0.dist-info/REQUESTED delete mode 100644 .venv/Lib/site-packages/setuptools-56.0.0.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/setuptools-56.0.0.dist-info/dependency_links.txt delete mode 100644 .venv/Lib/site-packages/setuptools-56.0.0.dist-info/entry_points.txt delete mode 100644 .venv/Lib/site-packages/setuptools-56.0.0.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/setuptools/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/_imp.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/archive_util.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/build_meta.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/config.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/dep_util.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/depends.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/dist.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/errors.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/extension.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/glob.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/installer.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/launch.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/monkey.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/msvc.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/namespaces.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/package_index.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/py34compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/sandbox.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/ssl_support.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/version.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/wheel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/__pycache__/windows_support.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_deprecation_warning.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/config.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/core.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/debug.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/dist.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/errors.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/extension.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/log.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/py35compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/util.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/version.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/archive_util.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/bcppcompiler.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/ccompiler.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/cmd.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_msi.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_wininst.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/bdist.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/bdist_msi.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/bdist_wininst.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/build.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/build_py.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/check.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/clean.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/config.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/install.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/install_data.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/py37compat.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/register.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/sdist.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/command/upload.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/config.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/core.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/debug.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/dep_util.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/dir_util.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/dist.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/errors.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/extension.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/file_util.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/filelist.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/log.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/msvc9compiler.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/msvccompiler.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/py35compat.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/py38compat.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/spawn.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/sysconfig.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/text_file.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/util.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/version.py delete mode 100644 .venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py delete mode 100644 .venv/Lib/site-packages/setuptools/_imp.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/ordered_set.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_typing.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/_compat.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/_typing.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/packaging/version.py delete mode 100644 .venv/Lib/site-packages/setuptools/_vendor/pyparsing.py delete mode 100644 .venv/Lib/site-packages/setuptools/archive_util.py delete mode 100644 .venv/Lib/site-packages/setuptools/build_meta.py delete mode 100644 .venv/Lib/site-packages/setuptools/cli-32.exe delete mode 100644 .venv/Lib/site-packages/setuptools/cli-64.exe delete mode 100644 .venv/Lib/site-packages/setuptools/cli.exe delete mode 100644 .venv/Lib/site-packages/setuptools/command/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/alias.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/build_clib.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/build_ext.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/develop.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/dist_info.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/install.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/install_lib.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/install_scripts.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/py36compat.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/register.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/rotate.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/saveopts.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/sdist.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/upload.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/__pycache__/upload_docs.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/command/alias.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/bdist_egg.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/bdist_rpm.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/build_clib.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/build_ext.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/build_py.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/develop.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/dist_info.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/easy_install.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/egg_info.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/install.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/install_egg_info.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/install_lib.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/install_scripts.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/launcher manifest.xml delete mode 100644 .venv/Lib/site-packages/setuptools/command/py36compat.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/register.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/rotate.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/saveopts.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/sdist.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/setopt.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/test.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/upload.py delete mode 100644 .venv/Lib/site-packages/setuptools/command/upload_docs.py delete mode 100644 .venv/Lib/site-packages/setuptools/config.py delete mode 100644 .venv/Lib/site-packages/setuptools/dep_util.py delete mode 100644 .venv/Lib/site-packages/setuptools/depends.py delete mode 100644 .venv/Lib/site-packages/setuptools/dist.py delete mode 100644 .venv/Lib/site-packages/setuptools/errors.py delete mode 100644 .venv/Lib/site-packages/setuptools/extension.py delete mode 100644 .venv/Lib/site-packages/setuptools/extern/__init__.py delete mode 100644 .venv/Lib/site-packages/setuptools/extern/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/setuptools/glob.py delete mode 100644 .venv/Lib/site-packages/setuptools/gui-32.exe delete mode 100644 .venv/Lib/site-packages/setuptools/gui-64.exe delete mode 100644 .venv/Lib/site-packages/setuptools/gui.exe delete mode 100644 .venv/Lib/site-packages/setuptools/installer.py delete mode 100644 .venv/Lib/site-packages/setuptools/launch.py delete mode 100644 .venv/Lib/site-packages/setuptools/lib2to3_ex.py delete mode 100644 .venv/Lib/site-packages/setuptools/monkey.py delete mode 100644 .venv/Lib/site-packages/setuptools/msvc.py delete mode 100644 .venv/Lib/site-packages/setuptools/namespaces.py delete mode 100644 .venv/Lib/site-packages/setuptools/package_index.py delete mode 100644 .venv/Lib/site-packages/setuptools/py34compat.py delete mode 100644 .venv/Lib/site-packages/setuptools/sandbox.py delete mode 100644 .venv/Lib/site-packages/setuptools/script (dev).tmpl delete mode 100644 .venv/Lib/site-packages/setuptools/script.tmpl delete mode 100644 .venv/Lib/site-packages/setuptools/ssl_support.py delete mode 100644 .venv/Lib/site-packages/setuptools/unicode_utils.py delete mode 100644 .venv/Lib/site-packages/setuptools/version.py delete mode 100644 .venv/Lib/site-packages/setuptools/wheel.py delete mode 100644 .venv/Lib/site-packages/setuptools/windows_support.py delete mode 100644 .venv/Lib/site-packages/six-1.16.0.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/six-1.16.0.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/six-1.16.0.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/six-1.16.0.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/six-1.16.0.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/six-1.16.0.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/six.py delete mode 100644 .venv/Lib/site-packages/tatsu/__init__.py delete mode 100644 .venv/Lib/site-packages/tatsu/__main__.py delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/__main__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/_config.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/_version.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/ast.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/bootstrap.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/buffering.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/color.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/contexts.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/diagrams.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/exceptions.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/grammars.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/infos.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/leftrec.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/model.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/objectmodel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/parser.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/parser_semantics.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/parsing.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/rendering.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/semantics.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/symtables.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/synth.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/tokenizing.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/tool.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/__pycache__/walkers.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/_config.py delete mode 100644 .venv/Lib/site-packages/tatsu/_version.py delete mode 100644 .venv/Lib/site-packages/tatsu/ast.py delete mode 100644 .venv/Lib/site-packages/tatsu/bootstrap.py delete mode 100644 .venv/Lib/site-packages/tatsu/buffering.py delete mode 100644 .venv/Lib/site-packages/tatsu/codegen/__init__.py delete mode 100644 .venv/Lib/site-packages/tatsu/codegen/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/codegen/__pycache__/cgbase.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/codegen/__pycache__/objectmodel.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/codegen/__pycache__/python.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/codegen/cgbase.py delete mode 100644 .venv/Lib/site-packages/tatsu/codegen/objectmodel.py delete mode 100644 .venv/Lib/site-packages/tatsu/codegen/python.py delete mode 100644 .venv/Lib/site-packages/tatsu/collections/__init__.py delete mode 100644 .venv/Lib/site-packages/tatsu/collections/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/collections/__pycache__/orderedset.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/collections/__pycache__/tail.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/collections/orderedset.py delete mode 100644 .venv/Lib/site-packages/tatsu/collections/tail.py delete mode 100644 .venv/Lib/site-packages/tatsu/color.py delete mode 100644 .venv/Lib/site-packages/tatsu/contexts.py delete mode 100644 .venv/Lib/site-packages/tatsu/diagrams.py delete mode 100644 .venv/Lib/site-packages/tatsu/exceptions.py delete mode 100644 .venv/Lib/site-packages/tatsu/g2e/__init__.py delete mode 100644 .venv/Lib/site-packages/tatsu/g2e/__main__.py delete mode 100644 .venv/Lib/site-packages/tatsu/g2e/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/g2e/__pycache__/__main__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/g2e/__pycache__/semantics.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/g2e/antlr.ebnf delete mode 100644 .venv/Lib/site-packages/tatsu/g2e/semantics.py delete mode 100644 .venv/Lib/site-packages/tatsu/grammars.py delete mode 100644 .venv/Lib/site-packages/tatsu/infos.py delete mode 100644 .venv/Lib/site-packages/tatsu/leftrec.py delete mode 100644 .venv/Lib/site-packages/tatsu/mixins/__init__.py delete mode 100644 .venv/Lib/site-packages/tatsu/mixins/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/mixins/__pycache__/indent.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/mixins/indent.py delete mode 100644 .venv/Lib/site-packages/tatsu/model.py delete mode 100644 .venv/Lib/site-packages/tatsu/objectmodel.py delete mode 100644 .venv/Lib/site-packages/tatsu/parser.py delete mode 100644 .venv/Lib/site-packages/tatsu/parser_semantics.py delete mode 100644 .venv/Lib/site-packages/tatsu/parsing.py delete mode 100644 .venv/Lib/site-packages/tatsu/rendering.py delete mode 100644 .venv/Lib/site-packages/tatsu/semantics.py delete mode 100644 .venv/Lib/site-packages/tatsu/symtables.py delete mode 100644 .venv/Lib/site-packages/tatsu/synth.py delete mode 100644 .venv/Lib/site-packages/tatsu/tokenizing.py delete mode 100644 .venv/Lib/site-packages/tatsu/tool.py delete mode 100644 .venv/Lib/site-packages/tatsu/util/__init__.py delete mode 100644 .venv/Lib/site-packages/tatsu/util/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/util/__pycache__/_common.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/util/__pycache__/misc.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/util/__pycache__/parproc.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/util/__pycache__/testing.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/util/__pycache__/unicode_characters.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/tatsu/util/_common.py delete mode 100644 .venv/Lib/site-packages/tatsu/util/misc.py delete mode 100644 .venv/Lib/site-packages/tatsu/util/parproc.py delete mode 100644 .venv/Lib/site-packages/tatsu/util/testing.py delete mode 100644 .venv/Lib/site-packages/tatsu/util/unicode_characters.py delete mode 100644 .venv/Lib/site-packages/tatsu/walkers.py delete mode 100644 .venv/Lib/site-packages/test/__init__.py delete mode 100644 .venv/Lib/site-packages/test/__main__.py delete mode 100644 .venv/Lib/site-packages/test/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/__pycache__/__main__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/__pycache__/ast_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/__pycache__/buffering_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/__pycache__/codegen_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/__pycache__/diagram_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/__pycache__/misc_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/__pycache__/model_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/__pycache__/parser_equivalence_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/__pycache__/parsing_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/__pycache__/pickle_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/__pycache__/walker_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/ast_test.py delete mode 100644 .venv/Lib/site-packages/test/buffering_test.py delete mode 100644 .venv/Lib/site-packages/test/codegen_test.py delete mode 100644 .venv/Lib/site-packages/test/diagram_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/__init__.py delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/alerts_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/constants_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/defines_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/directive_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/error_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/firstfollow_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/join_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/keyword_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/left_recursion_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/lookahead_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/parameter_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/pattern_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/pretty_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/semantics_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/stateful_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/__pycache__/syntax_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/grammar/alerts_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/constants_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/defines_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/directive_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/error_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/firstfollow_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/join_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/keyword_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/left_recursion_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/lookahead_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/parameter_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/pattern_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/pretty_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/semantics_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/stateful_test.py delete mode 100644 .venv/Lib/site-packages/test/grammar/syntax_test.py delete mode 100644 .venv/Lib/site-packages/test/misc_test.py delete mode 100644 .venv/Lib/site-packages/test/model_test.py delete mode 100644 .venv/Lib/site-packages/test/parser_equivalence_test.py delete mode 100644 .venv/Lib/site-packages/test/parsing_test.py delete mode 100644 .venv/Lib/site-packages/test/pickle_test.py delete mode 100644 .venv/Lib/site-packages/test/walker_test.py delete mode 100644 .venv/Lib/site-packages/test/zzz_bootstrap/__init__.py delete mode 100644 .venv/Lib/site-packages/test/zzz_bootstrap/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/zzz_bootstrap/__pycache__/bootstrap_test.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/test/zzz_bootstrap/bootstrap_test.py delete mode 100644 .venv/Lib/site-packages/yarl-1.8.1.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/yarl-1.8.1.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/yarl-1.8.1.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/yarl-1.8.1.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/yarl-1.8.1.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/yarl-1.8.1.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/yarl/__init__.py delete mode 100644 .venv/Lib/site-packages/yarl/__init__.pyi delete mode 100644 .venv/Lib/site-packages/yarl/__pycache__/__init__.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/yarl/__pycache__/_quoting.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/yarl/__pycache__/_quoting_py.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/yarl/__pycache__/_url.cpython-38.pyc delete mode 100644 .venv/Lib/site-packages/yarl/_quoting.py delete mode 100644 .venv/Lib/site-packages/yarl/_quoting_c.cp38-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/yarl/_quoting_c.pyi delete mode 100644 .venv/Lib/site-packages/yarl/_quoting_c.pyx delete mode 100644 .venv/Lib/site-packages/yarl/_quoting_py.py delete mode 100644 .venv/Lib/site-packages/yarl/_url.py delete mode 100644 .venv/Lib/site-packages/yarl/py.typed delete mode 100644 .venv/Scripts/Activate.ps1 delete mode 100644 .venv/Scripts/activate delete mode 100644 .venv/Scripts/activate.bat delete mode 100644 .venv/Scripts/deactivate.bat delete mode 100644 .venv/Scripts/g2e.exe delete mode 100644 .venv/Scripts/icalendar.exe delete mode 100644 .venv/Scripts/normalizer.exe delete mode 100644 .venv/Scripts/pip.exe delete mode 100644 .venv/Scripts/pip3.8.exe delete mode 100644 .venv/Scripts/pip3.exe delete mode 100644 .venv/Scripts/python.exe delete mode 100644 .venv/Scripts/pythonw.exe delete mode 100644 .venv/Scripts/tatsu.exe delete mode 100644 .venv/pyvenv.cfg delete mode 100644 __pycache__/ics_reader.cpython-310.pyc delete mode 100644 cogs/setup.py delete mode 100644 cogs/timetable.py diff --git a/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/INSTALLER b/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/LICENSE.txt b/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/LICENSE.txt deleted file mode 100644 index 376a1d9..0000000 --- a/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/LICENSE.txt +++ /dev/null @@ -1,36 +0,0 @@ -TATSU - A PEG/Packrat parser generator for Python - -Copyright (C) 2017-2022 Juancarlo Añez -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - 3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - 4. Redistributions of any form whatsoever must retain the following - acknowledgment: 'This product includes software developed by - "Juancarlo Añez" (https://apalala.bitbucket.io).' - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/METADATA b/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/METADATA deleted file mode 100644 index dadc9ed..0000000 --- a/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/METADATA +++ /dev/null @@ -1,327 +0,0 @@ -Metadata-Version: 2.1 -Name: TatSu -Version: 5.8.3 -Summary: TatSu takes a grammar in a variation of EBNF as input, and outputs a memoizing PEG/Packrat parser in Python. -Home-page: https://github.com/neogeny/tatsu -Author: Juancarlo Añez -Author-email: apalala@gmail.com -Maintainer: Juancarlo Añez -Maintainer-email: apalala@gmail.com -License: BSD-3-Clause-Attribution -Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: BSD License -Classifier: Natural Language :: English -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: Science/Research -Classifier: Environment :: Console -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Topic :: Software Development :: Code Generators -Classifier: Topic :: Software Development :: Compilers -Classifier: Topic :: Software Development :: Interpreters -Classifier: Topic :: Text Processing :: General -Requires-Python: >=3.8 -License-File: LICENSE.txt -Provides-Extra: future-regex -Requires-Dist: regex ; extra == 'future-regex' - -.. |dragon| unicode:: 0x7ADC .. unicode dragon -.. |TatSu| replace:: |dragon| **TatSu** - -|license| |pyversions| |fury| |downloads| |actions| |docs| - - *At least for the people who send me mail about a new language that - they're designing, the general advice is: do it to learn about how - to write a compiler. Don't have any expectations that anyone will - use it, unless you hook up with some sort of organization in a - position to push it hard. It's a lottery, and some can buy a lot of - the tickets. There are plenty of beautiful languages (more beautiful - than C) that didn't catch on. But someone does win the lottery, and - doing a language at least teaches you something.* - - `Dennis Ritchie`_ (1941-2011) Creator of the C_ programming - language and of Unix_ - - -|TatSu| -======= - -|TatSu| is a tool that takes grammars in a variation of `EBNF`_ as input, and -outputs `memoizing`_ (`Packrat`_) `PEG`_ parsers in `Python`_. - -Why use a PEG_ parser? Because `regular languages`_ (those parsable with Python's ``re`` package) *"cannot count"*. Any language with nested structures or with balancing of demarcations requires more than regular expressions to be parsed. - -|TatSu| can compile a grammar stored in a string into a -``tatsu.grammars.Grammar`` object that can be used to parse any given -input, much like the `re`_ module does with regular expressions, or it can generate a Python_ module that implements the parser. - -|TatSu| supports `left-recursive`_ rules in PEG_ grammars using the -algorithm_ by *Laurent* and *Mens*. The generated AST_ has the expected left associativity. - -Starting with version 5.8.0 |TatSu| requires Python 3.10 or later. -While no code in |TatSu| yet depends on new language or standard library features, -the authors don't want to be constrained by Python version comaptibility consideration -when developing features that will be part future releases. -Therefore, to simplify version pinning for users of the library, -they decided to proactively bump the Python minimum required version to 3.10. - -|TatSu| releases in the 5.7 series closely track releases in the 5.8 series -while maintaining compatibility with Python 3.8 and later. -Bug fixes are back-ported from 5.8 releases. -Features are back-ported from the 5.8 releases -unless they depend on Python features not available on the supported Python versions. -Refer to the `CHANGELOG`_ for details. - -.. _algorithm: http://norswap.com/pubs/sle2016.pdf - -Installation ------------- - -.. code-block:: bash - - $ pip install TatSu - - -Using the Tool --------------- - -|TatSu| can be used as a library, much like `Python`_'s ``re``, by embedding grammars as strings and generating grammar models instead of generating Python_ code. - -- ``tatsu.compile(grammar, name=None, **kwargs)`` - - Compiles the grammar and generates a *model* that can subsequently be used for parsing input with. - -- ``tatsu.parse(grammar, input, **kwargs)`` - - Compiles the grammar and parses the given input producing an AST_ as result. The result is equivalent to calling:: - - model = compile(grammar) - ast = model.parse(input) - - Compiled grammars are cached for efficiency. - -- ``tatsu.to_python_sourcecode(grammar, name=None, filename=None, **kwargs)`` - - Compiles the grammar to the `Python`_ sourcecode that implements the parser. - -This is an example of how to use |TatSu| as a library: - -.. code-block:: python - - GRAMMAR = ''' - @@grammar::CALC - - - start = expression $ ; - - - expression - = - | expression '+' term - | expression '-' term - | term - ; - - - term - = - | term '*' factor - | term '/' factor - | factor - ; - - - factor - = - | '(' expression ')' - | number - ; - - - number = /\d+/ ; - ''' - - - if __name__ == '__main__': - import json - from tatsu import parse - from tatsu.util import asjson - - ast = parse(GRAMMAR, '3 + 5 * ( 10 - 20 )') - print(json.dumps(asjson(ast), indent=2)) -.. - -|TatSu| will use the first rule defined in the grammar as the *start* rule. - -This is the output: - -.. code-block:: console - - [ - "3", - "+", - [ - "5", - "*", - [ - "10", - "-", - "20" - ] - ] - ] - -Documentation -------------- - -For a detailed explanation of what |TatSu| is capable of, please see the -documentation_. - -.. _documentation: http://tatsu.readthedocs.io/ - - -Questions? ----------- - -Please use the `[tatsu]`_ tag on `StackOverflow`_ for general Q&A, and limit -Github issues to bugs, enhancement proposals, and feature requests. - -.. _[tatsu]: https://stackoverflow.com/tags/tatsu/info - - -Changes -------- - -See the `CHANGELOG`_ for details. - - -License -------- - -You may use |TatSu| under the terms of the `BSD`_-style license -described in the enclosed `LICENSE.txt`_ file. *If your project -requires different licensing* please `email`_. - - -.. _ANTLR: http://www.antlr.org/ -.. _AST: http://en.wikipedia.org/wiki/Abstract_syntax_tree -.. _Abstract Syntax Tree: http://en.wikipedia.org/wiki/Abstract_syntax_tree -.. _Algol W: http://en.wikipedia.org/wiki/Algol_W -.. _Algorithms + Data Structures = Programs: http://www.amazon.com/Algorithms-Structures-Prentice-Hall-Automatic-Computation/dp/0130224189/ -.. _BSD: http://en.wikipedia.org/wiki/BSD_licenses#2-clause_license_.28.22Simplified_BSD_License.22_or_.22FreeBSD_License.22.29 -.. _Basel Shishani: https://bitbucket.org/basel-shishani -.. _C: http://en.wikipedia.org/wiki/C_language -.. _CHANGELOG: https://github.com/neogeny/TatSu/releases -.. _CSAIL at MIT: http://www.csail.mit.edu/ -.. _Cyclomatic complexity: http://en.wikipedia.org/wiki/Cyclomatic_complexity -.. _David Röthlisberger: https://bitbucket.org/drothlis/ -.. _Dennis Ritchie: http://en.wikipedia.org/wiki/Dennis_Ritchie -.. _EBNF: http://en.wikipedia.org/wiki/Ebnf -.. _English: http://en.wikipedia.org/wiki/English_grammar -.. _Euler: http://en.wikipedia.org/wiki/Euler_programming_language -.. _Grako: https://bitbucket.org/neogeny/grako/ -.. _Jack: http://en.wikipedia.org/wiki/Javacc -.. _Japanese: http://en.wikipedia.org/wiki/Japanese_grammar -.. _KLOC: http://en.wikipedia.org/wiki/KLOC -.. _Kathryn Long: https://bitbucket.org/starkat -.. _Keywords: https://en.wikipedia.org/wiki/Reserved_word -.. _`left-recursive`: https://en.wikipedia.org/wiki/Left_recursion -.. _LL(1): http://en.wikipedia.org/wiki/LL(1) -.. _Marcus Brinkmann: http://blog.marcus-brinkmann.de/ -.. _MediaWiki: http://www.mediawiki.org/wiki/MediaWiki -.. _Modula-2: http://en.wikipedia.org/wiki/Modula-2 -.. _Modula: http://en.wikipedia.org/wiki/Modula -.. _Oberon-2: http://en.wikipedia.org/wiki/Oberon-2 -.. _Oberon: http://en.wikipedia.org/wiki/Oberon_(programming_language) -.. _PEG and Packrat parsing mailing list: https://lists.csail.mit.edu/mailman/listinfo/peg -.. _PEG.js: http://pegjs.majda.cz/ -.. _PEG: http://en.wikipedia.org/wiki/Parsing_expression_grammar -.. _PL/0: http://en.wikipedia.org/wiki/PL/0 -.. _Packrat: http://bford.info/packrat/ -.. _Pascal: http://en.wikipedia.org/wiki/Pascal_programming_language -.. _Paul Sargent: https://bitbucket.org/PaulS/ -.. _Perl: http://www.perl.org/ -.. _PyPy team: http://pypy.org/people.html -.. _PyPy: http://pypy.org/ -.. _Python Weekly: http://www.pythonweekly.com/ -.. _Python: http://python.org -.. _Reserved Words: https://en.wikipedia.org/wiki/Reserved_word -.. _Robert Speer: https://bitbucket.org/r_speer -.. _Ruby: http://www.ruby-lang.org/ -.. _Semantic Graph: http://en.wikipedia.org/wiki/Abstract_semantic_graph -.. _StackOverflow: http://stackoverflow.com/tags/tatsu/info -.. _Sublime Text: https://www.sublimetext.com -.. _TatSu Forum: https://groups.google.com/forum/?fromgroups#!forum/tatsu -.. _UCAB: http://www.ucab.edu.ve/ -.. _USB: http://www.usb.ve/ -.. _Unix: http://en.wikipedia.org/wiki/Unix -.. _VIM: http://www.vim.org/ -.. _WTK: http://en.wikipedia.org/wiki/Well-known_text -.. _Warth et al: http://www.vpri.org/pdf/tr2007002_packrat.pdf -.. _Well-known text: http://en.wikipedia.org/wiki/Well-known_text -.. _Wirth: http://en.wikipedia.org/wiki/Niklaus_Wirth -.. _`LICENSE.txt`: LICENSE.txt -.. _basel-shishani: https://bitbucket.org/basel-shishani -.. _blog post: http://dietbuddha.blogspot.com/2012/12/52python-encapsulating-exceptions-with.html -.. _colorama: https://pypi.python.org/pypi/colorama/ -.. _context managers: http://docs.python.org/2/library/contextlib.html -.. _declensions: http://en.wikipedia.org/wiki/Declension -.. _drothlis: https://bitbucket.org/drothlis -.. _email: mailto:apalala@gmail.com -.. _exceptions: http://www.jeffknupp.com/blog/2013/02/06/write-cleaner-python-use-exceptions/ -.. _franz\_g: https://bitbucket.org/franz_g -.. _gapag: https://bitbucket.org/gapag -.. _gegenschall: https://bitbucket.org/gegenschall -.. _gkimbar: https://bitbucket.org/gkimbar -.. _introduced: http://dl.acm.org/citation.cfm?id=964001.964011 -.. _jimon: https://bitbucket.org/jimon -.. _keyword: https://en.wikipedia.org/wiki/Reserved_word -.. _keywords: https://en.wikipedia.org/wiki/Reserved_word -.. _lambdafu: http://blog.marcus-brinkmann.de/ -.. _leewz: https://bitbucket.org/leewz -.. _linkdd: https://bitbucket.org/linkdd -.. _make a donation: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=P9PV7ZACB669J -.. _memoizing: http://en.wikipedia.org/wiki/Memoization -.. _nehz: https://bitbucket.org/nehz -.. _neumond: https://bitbucket.org/neumond -.. _parsewkt: https://github.com/cleder/parsewkt -.. _pauls: https://bitbucket.org/pauls -.. _pgebhard: https://bitbucket.org/pgebhard -.. _pygraphviz: https://pypi.python.org/pypi/pygraphviz -.. _r\_speer: https://bitbucket.org/r_speer -.. _raw string literal: https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals -.. _re: https://docs.python.org/3.7/library/re.html -.. _regular languages: https://en.wikipedia.org/wiki/Regular_language -.. _regex: https://pypi.python.org/pypi/regex -.. _siemer: https://bitbucket.org/siemer -.. _sjbrownBitbucket: https://bitbucket.org/sjbrownBitbucket -.. _smc.mw: https://github.com/lambdafu/smc.mw -.. _starkat: https://bitbucket.org/starkat -.. _tonico\_strasser: https://bitbucket.org/tonico_strasser -.. _vinay.sajip: https://bitbucket.org/vinay.sajip -.. _vmuriart: https://bitbucket.org/vmuriart - -.. |fury| image:: https://badge.fury.io/py/TatSu.svg - :target: https://badge.fury.io/py/TatSu -.. |license| image:: https://img.shields.io/badge/license-BSD-blue.svg - :target: https://raw.githubusercontent.com/neogeny/tatsu/master/LICENSE.txt -.. |pyversions| image:: https://img.shields.io/pypi/pyversions/tatsu.svg - :target: https://pypi.python.org/pypi/tatsu -.. |travis| image:: https://secure.travis-ci.org/neogeny/TatSu.svg - :target: http://travis-ci.org/neogeny/TatSu -.. |actions| image:: https://github.com/neogeny/TatSu/workflows/tests/badge.svg - :target: https://github.com/neogeny/TatSu/actions -.. |circleci| image:: https://circleci.com/gh/neogeny/TatSu.svg?style=shield - :target: https://circleci.com/gh/neogeny/TatSu -.. |landscape| image:: https://landscape.io/github/apalala/TatSu/master/landscape.png - :target: https://landscape.io/github/apalala/TatSu/master -.. |donate| image:: https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif - :target: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=2TW56SV6WNJV6 -.. |quantifiedcode| image:: https://www.quantifiedcode.com/api/v1/project/f60bbd94ae2d4bd5b2e04c241c9d47ff/badge.svg - :target: https://www.quantifiedcode.com/app/project/f60bbd94ae2d4bd5b2e04c241c9d47ff - :alt: Code issues -.. |docs| image:: https://readthedocs.org/projects/tatsu/badge/?version=stable - :target: http://tatsu.readthedocs.io/en/stable/ -.. |downloads| image:: https://img.shields.io/pypi/dm/TatSu.svg - :target: http://tatsu.readthedocs.io/en/stable/ diff --git a/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/RECORD b/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/RECORD deleted file mode 100644 index 3363e99..0000000 --- a/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/RECORD +++ /dev/null @@ -1,160 +0,0 @@ -../../Scripts/g2e.exe,sha256=UXNQeghEGTauoEU3Kg6guARxIuzQzteR_yMlueWE7ew,107903 -../../Scripts/tatsu.exe,sha256=xnv218Hag72aV7mRoCBFCTqlBholc7z6-WaI2cnvi_g,107899 -TatSu-5.8.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -TatSu-5.8.3.dist-info/LICENSE.txt,sha256=DwpeBhODt1UIjv1mSWkaFABPws9OPb26RkLQHhm0f8s,1770 -TatSu-5.8.3.dist-info/METADATA,sha256=zQjzCp7E-ICn_rjOMYlEe-QkXLEvBvBo93hi9cIX4io,13003 -TatSu-5.8.3.dist-info/RECORD,, -TatSu-5.8.3.dist-info/WHEEL,sha256=WzZ8cwjh8l0jtULNjYq1Hpr-WCqCRgPr--TX4P5I1Wo,110 -TatSu-5.8.3.dist-info/entry_points.txt,sha256=-wLm5mbjL8w73RvvuWvTVZqUNGnpVFQVLpEhzd7Sxus,58 -TatSu-5.8.3.dist-info/top_level.txt,sha256=WV9fOhQiVcph8aj6y-Ax-n2ZKvnwFkzYy-X1hewV2zY,11 -tatsu/__init__.py,sha256=ARTI4F_QHBRo3tiWmo9CJstyKiTYAerkB4vIlj8RycY,405 -tatsu/__main__.py,sha256=UovWsgLNmd13AJYw-JurZ8BNvaAZCng8cneUEp7H3g4,93 -tatsu/__pycache__/__init__.cpython-38.pyc,, -tatsu/__pycache__/__main__.cpython-38.pyc,, -tatsu/__pycache__/_config.cpython-38.pyc,, -tatsu/__pycache__/_version.cpython-38.pyc,, -tatsu/__pycache__/ast.cpython-38.pyc,, -tatsu/__pycache__/bootstrap.cpython-38.pyc,, -tatsu/__pycache__/buffering.cpython-38.pyc,, -tatsu/__pycache__/color.cpython-38.pyc,, -tatsu/__pycache__/contexts.cpython-38.pyc,, -tatsu/__pycache__/diagrams.cpython-38.pyc,, -tatsu/__pycache__/exceptions.cpython-38.pyc,, -tatsu/__pycache__/grammars.cpython-38.pyc,, -tatsu/__pycache__/infos.cpython-38.pyc,, -tatsu/__pycache__/leftrec.cpython-38.pyc,, -tatsu/__pycache__/model.cpython-38.pyc,, -tatsu/__pycache__/objectmodel.cpython-38.pyc,, -tatsu/__pycache__/parser.cpython-38.pyc,, -tatsu/__pycache__/parser_semantics.cpython-38.pyc,, -tatsu/__pycache__/parsing.cpython-38.pyc,, -tatsu/__pycache__/rendering.cpython-38.pyc,, -tatsu/__pycache__/semantics.cpython-38.pyc,, -tatsu/__pycache__/symtables.cpython-38.pyc,, -tatsu/__pycache__/synth.cpython-38.pyc,, -tatsu/__pycache__/tokenizing.cpython-38.pyc,, -tatsu/__pycache__/tool.cpython-38.pyc,, -tatsu/__pycache__/walkers.cpython-38.pyc,, -tatsu/_config.py,sha256=3xqZO0rNE4CqorUxQglpbCqiL3paDWcgpV5XehDKpDw,66 -tatsu/_version.py,sha256=UhDxQPykajmIu-a0zhzHNwz4uZ_X8XEnXc2qe4Z2T6o,22 -tatsu/ast.py,sha256=yf07pTpgqXDsAe2zm2dVzEtTfIHRNeLAYLn6YpBU9W8,3446 -tatsu/bootstrap.py,sha256=ukQ8kgwS9VZa4zmty7AFiBcP2gULx60o7TAuo_5lKUw,40093 -tatsu/buffering.py,sha256=Y07aSjHetOd1hYM7thxVOkUxGnxd37hHudbJh3u0DRk,11111 -tatsu/codegen/__init__.py,sha256=ETDSoqud24E7xZcb7z7TjY7SQxwvwt9L4BqrYspcMro,447 -tatsu/codegen/__pycache__/__init__.cpython-38.pyc,, -tatsu/codegen/__pycache__/cgbase.cpython-38.pyc,, -tatsu/codegen/__pycache__/objectmodel.cpython-38.pyc,, -tatsu/codegen/__pycache__/python.cpython-38.pyc,, -tatsu/codegen/cgbase.py,sha256=vB3qXcY_AzEz3-jz8KIdIQub_4dl9W5L0mTOfNS66bc,4392 -tatsu/codegen/objectmodel.py,sha256=RvaH1Bk43I96s36422oVKx8mZ5V8svIdWFHFVCpiQpw,6695 -tatsu/codegen/python.py,sha256=vjgqZrj-wSGuEOYTED3mOGvm-nbkYMYlCKQbULPcUVo,16073 -tatsu/collections/__init__.py,sha256=xrA2wUUgf-jNtm4CLw6HQ4uVU88AOCRNgiZuVg4lCWc,74 -tatsu/collections/__pycache__/__init__.cpython-38.pyc,, -tatsu/collections/__pycache__/orderedset.cpython-38.pyc,, -tatsu/collections/__pycache__/tail.cpython-38.pyc,, -tatsu/collections/orderedset.py,sha256=IVHRiqpJL6En6NtRvjdqPZNXaOyNBrznQBjzYUa-xKw,3919 -tatsu/collections/tail.py,sha256=A2mR1e6kjTdBhQWbIXu22GAj9ZrcSBx262zMvnjRXIM,958 -tatsu/color.py,sha256=fFYvhMSrejNruS-G8lWrtL4M9X5kMoztvMk6ihdp_fY,799 -tatsu/contexts.py,sha256=6Tu0DRz9lckyp1YmBTJYRO5M_N1WYD3bpwrXymTr9IY,26538 -tatsu/diagrams.py,sha256=GoXMXR_ByXhqBv9Q1hwtnoWTp3ywUOzSUPhCwrzOTwQ,7306 -tatsu/exceptions.py,sha256=lKKkZF0bLvRhYHQXcjGt9bDZ0MldskIwDK3nclZkOi8,3186 -tatsu/g2e/__init__.py,sha256=ilN9zQf3hOeQLSMm89Eyo2BO2G9Uvy6aBOV07QCVYB8,1305 -tatsu/g2e/__main__.py,sha256=dacWXTVRNvxNq7cX5aMqonYWFEg2s1L9INr9DN3BTO0,94 -tatsu/g2e/__pycache__/__init__.cpython-38.pyc,, -tatsu/g2e/__pycache__/__main__.cpython-38.pyc,, -tatsu/g2e/__pycache__/semantics.cpython-38.pyc,, -tatsu/g2e/antlr.ebnf,sha256=b-ipRPv1fpWrNXZaBBZb3s56PGCAipDmvGOYCEis_iI,5035 -tatsu/g2e/semantics.py,sha256=8gCZlNi8bQ6XXovriLXJwHhoQAr_mdtAdNZzVh9csUU,5199 -tatsu/grammars.py,sha256=-_cwRCkIt_tmJK1x7GegzHkm2Elej-HTUxMqr4ley28,29628 -tatsu/infos.py,sha256=v2pRSdzah6I4z5DhGM2metigO1qiRTSDxc38R8ykSts,5722 -tatsu/leftrec.py,sha256=JmJW7Xz7zg74hMHdxSmZQASCGV5OlUXbaQfNevXvJ8A,5410 -tatsu/mixins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -tatsu/mixins/__pycache__/__init__.cpython-38.pyc,, -tatsu/mixins/__pycache__/indent.cpython-38.pyc,, -tatsu/mixins/indent.py,sha256=onvz5xI-UDBId1Wz65MsGXwKGBcMSU-o5x-wwVYR22U,1638 -tatsu/model.py,sha256=x2UD5ZzbNe5kHUPQJVTqjRu2IaBIr_h0iSwaf6qTaNk,426 -tatsu/objectmodel.py,sha256=TiOutkOVACk2RdDcS0RTflHLvSpZsk1hmFC7Kgqq64E,5426 -tatsu/parser.py,sha256=pv8RySibLq0TgS1Tgq7g3LrtRKchhnoQ1GQGqrUgRv4,816 -tatsu/parser_semantics.py,sha256=FyY2A3Yb7XMpkjqXqhwMXDZnkt3Iw-I4pZ0Qt6GFVcY,3938 -tatsu/parsing.py,sha256=I7ouCVzDWSzNthc9xJA2T3x-HOuNNjBDXzmmpunnoKI,1032 -tatsu/rendering.py,sha256=FuZDCxDZsbNKCyiJeKyt0bxdkpFKW1SJVar0Eqx154c,3890 -tatsu/semantics.py,sha256=gXO59UI_4ercRe4-K1V-5u3_74mIE9Bc6uQpvybnjGs,3024 -tatsu/symtables.py,sha256=pk4FkynHlUW_Awpz_OeUKw8UrcbOmD2sdsdWTUgmGP0,8632 -tatsu/synth.py,sha256=6EOA4okurFGrhxQNktPZGTG2Aw6iwQujZ6DVUVC5AFA,671 -tatsu/tokenizing.py,sha256=VU0-CihPlrhyUvZGniuu2CCmpQmshxqENqG2MQsVq3A,1500 -tatsu/tool.py,sha256=8AY6VMRy0Nfyx9usFolZDjrhFgwLci7YgeZAwO0BYRM,8596 -tatsu/util/__init__.py,sha256=41CuQNtOWPHkq-JT-Pp07djNYziJXyY4pBtmMrpHJQ4,31 -tatsu/util/__pycache__/__init__.cpython-38.pyc,, -tatsu/util/__pycache__/_common.cpython-38.pyc,, -tatsu/util/__pycache__/misc.cpython-38.pyc,, -tatsu/util/__pycache__/parproc.cpython-38.pyc,, -tatsu/util/__pycache__/testing.cpython-38.pyc,, -tatsu/util/__pycache__/unicode_characters.cpython-38.pyc,, -tatsu/util/_common.py,sha256=80Pq57ZDx2e5AKOeVNGfDj0qip9S9DYPT5X9Hpia0Kk,12370 -tatsu/util/misc.py,sha256=93zTwz3rUqPeHrsiEvFWnj3WGe5wsADaIkBXC5ABFHw,2433 -tatsu/util/parproc.py,sha256=gzXokJ5rScGwXn-kyEgKbN97iT3Kwwc0nCascyhKTVw,8025 -tatsu/util/testing.py,sha256=QXnRQPdr4i_3F4uocVbIWa-9-nN5CGAL9MZ4rhToI_8,2319 -tatsu/util/unicode_characters.py,sha256=8_YoRY2Y5-FXq8Q3KRGTqAln5hpfPtSsDAzPG1zthyw,1184 -tatsu/walkers.py,sha256=jnLoxS9MrMLFYKvL5BHYeekK1BrPwFrsBcd4WkAkieo,4798 -test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -test/__main__.py,sha256=DsLm8-H6Ced413Se4HYtpoepdr_5vgbmT6_J7Yf796o,114 -test/__pycache__/__init__.cpython-38.pyc,, -test/__pycache__/__main__.cpython-38.pyc,, -test/__pycache__/ast_test.cpython-38.pyc,, -test/__pycache__/buffering_test.cpython-38.pyc,, -test/__pycache__/codegen_test.cpython-38.pyc,, -test/__pycache__/diagram_test.cpython-38.pyc,, -test/__pycache__/misc_test.cpython-38.pyc,, -test/__pycache__/model_test.cpython-38.pyc,, -test/__pycache__/parser_equivalence_test.cpython-38.pyc,, -test/__pycache__/parsing_test.cpython-38.pyc,, -test/__pycache__/pickle_test.cpython-38.pyc,, -test/__pycache__/walker_test.cpython-38.pyc,, -test/ast_test.py,sha256=UW7nPzj7O_iqMXzTyvDAzzOFGVGMaEGBq_iLdEm1zMI,1469 -test/buffering_test.py,sha256=OlGaVM1bn2-HKr-fBA69OceQ6PYnhOwhYMe7xK0bMFQ,3425 -test/codegen_test.py,sha256=uicMxexBV-gxkrYpeenAt8hqGM2OpQ0_-Qoiwcu7UaA,905 -test/diagram_test.py,sha256=VYARgg60eOhFo-Nkoa2sV6B5C1KZAY9DgUPvbSozB6Q,746 -test/grammar/__init__.py,sha256=iwhKnzeBJLKxpRVjvzwiRE63_zNpIBfaKLITauVph-0,24 -test/grammar/__pycache__/__init__.cpython-38.pyc,, -test/grammar/__pycache__/alerts_test.cpython-38.pyc,, -test/grammar/__pycache__/constants_test.cpython-38.pyc,, -test/grammar/__pycache__/defines_test.cpython-38.pyc,, -test/grammar/__pycache__/directive_test.cpython-38.pyc,, -test/grammar/__pycache__/error_test.cpython-38.pyc,, -test/grammar/__pycache__/firstfollow_test.cpython-38.pyc,, -test/grammar/__pycache__/join_test.cpython-38.pyc,, -test/grammar/__pycache__/keyword_test.cpython-38.pyc,, -test/grammar/__pycache__/left_recursion_test.cpython-38.pyc,, -test/grammar/__pycache__/lookahead_test.cpython-38.pyc,, -test/grammar/__pycache__/parameter_test.cpython-38.pyc,, -test/grammar/__pycache__/pattern_test.cpython-38.pyc,, -test/grammar/__pycache__/pretty_test.cpython-38.pyc,, -test/grammar/__pycache__/semantics_test.cpython-38.pyc,, -test/grammar/__pycache__/stateful_test.cpython-38.pyc,, -test/grammar/__pycache__/syntax_test.cpython-38.pyc,, -test/grammar/alerts_test.py,sha256=1zrtCIlR5mI1CM_f1mTpTKGWQd-c_IGkWqZBtdBR1Hc,319 -test/grammar/constants_test.py,sha256=DkG3YmKC8v97nrGUYWaOWpa3KxIN6hRJ87vAsWzVaMg,951 -test/grammar/defines_test.py,sha256=WLizoTV3Fx2EAy833CBUeH7hwfJ1kgjtiQxFSF63Er8,1706 -test/grammar/directive_test.py,sha256=eDO-rY3dCWPyEjNDl66TiIJSuMEsyH5o1Z07Xdh0uAw,4499 -test/grammar/error_test.py,sha256=1jtiyErDMJh8jgj5b0x1Ks0xRc7jDvFf1uROIDMig78,616 -test/grammar/firstfollow_test.py,sha256=0DzRWtcZg00hhkFg5vQhQ8AaJCBD-8tTPFtXLjmsNgI,2805 -test/grammar/join_test.py,sha256=7hqidL0b6mOn42_O61GJnjWMnaDFCwe0ImyqRp5B5To,5719 -test/grammar/keyword_test.py,sha256=YgO_sBD9zuJ8BkP0gcIxTWxGr6dC5Hi1zT2NonNTohw,3800 -test/grammar/left_recursion_test.py,sha256=zajJuZhG-oHAPR2D-UbQZzxhPqrd5e_OU6WNSysco98,15500 -test/grammar/lookahead_test.py,sha256=J25uO_D-YTxOZKpE18KEEziVF6PrPY6MJy3Nft4iMQI,762 -test/grammar/parameter_test.py,sha256=eEoncHe-L0wKmK5LiSwcu3LPXMo1Udwyn95WgzcAjhs,5931 -test/grammar/pattern_test.py,sha256=CbYJlfeasdy5mhCQBxXgGdK3T7KH6YzB2gh8mmna9qU,3090 -test/grammar/pretty_test.py,sha256=YA8liATTxOsybcgjpx4ujKA_meCvvJweiEYi8Lz3puU,1999 -test/grammar/semantics_test.py,sha256=9Bcq_f5istrKm5Asf6bt_l41nWI55fp0AxS-8fwo0MM,3118 -test/grammar/stateful_test.py,sha256=6qvTEO71nBY1MbqJq9A0Pzhrklt7oSoICeeqtFet0XE,3567 -test/grammar/syntax_test.py,sha256=4SDWZxzK2Otk__6vpBcX-Pl3nz_7mDenpkjjoiKPoWw,9912 -test/misc_test.py,sha256=TlXYFXhlCjS0gGm0n3RGnuTZ57Ci5hZU7_nJkQGWALk,440 -test/model_test.py,sha256=7xFIDGne2k6oXTTrm0W15yM4aXxAHhAMX4MUYb0uMI4,758 -test/parser_equivalence_test.py,sha256=Py2VNMlX3c887ddL8WRyWGmoxGFNWkCg2E5mrzPN6Jw,3638 -test/parsing_test.py,sha256=yMNslgjF_B28jJba-LriljFXfDlBMeIE-0WL3dfmbJE,4305 -test/pickle_test.py,sha256=lqJQ6oAXcyHvAijLP-s5vzVpYPWmMnVTgoheoAxNfIs,1478 -test/walker_test.py,sha256=vQ3qODQfb0EWWbGeCPlzoRT3sigJfCC14qYvyENfZ88,1840 -test/zzz_bootstrap/__init__.py,sha256=iwhKnzeBJLKxpRVjvzwiRE63_zNpIBfaKLITauVph-0,24 -test/zzz_bootstrap/__pycache__/__init__.cpython-38.pyc,, -test/zzz_bootstrap/__pycache__/bootstrap_test.cpython-38.pyc,, -test/zzz_bootstrap/bootstrap_test.py,sha256=ioV5_274Ijwh1LtdcaO9yU4ylSqBRjW0ymOQ-iV9zd8,6238 diff --git a/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/WHEEL b/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/WHEEL deleted file mode 100644 index b733a60..0000000 --- a/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/entry_points.txt b/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/entry_points.txt deleted file mode 100644 index 03db6d9..0000000 --- a/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[console_scripts] -g2e = tatsu.g2e:main -tatsu = tatsu:main diff --git a/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/top_level.txt b/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/top_level.txt deleted file mode 100644 index 041a112..0000000 --- a/.venv/Lib/site-packages/TatSu-5.8.3.dist-info/top_level.txt +++ /dev/null @@ -1,2 +0,0 @@ -tatsu -test diff --git a/.venv/Lib/site-packages/__pycache__/six.cpython-38.pyc b/.venv/Lib/site-packages/__pycache__/six.cpython-38.pyc deleted file mode 100644 index 0157cc214bae42065060ec0235fed96ce3356aaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27472 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 diff --git a/.venv/Lib/site-packages/_distutils_hack/__init__.py b/.venv/Lib/site-packages/_distutils_hack/__init__.py deleted file mode 100644 index 47ce249..0000000 --- a/.venv/Lib/site-packages/_distutils_hack/__init__.py +++ /dev/null @@ -1,128 +0,0 @@ -import sys -import os -import re -import importlib -import warnings - - -is_pypy = '__pypy__' in sys.builtin_module_names - - -warnings.filterwarnings('ignore', - '.+ distutils .+ deprecated', - DeprecationWarning) - - -def warn_distutils_present(): - if 'distutils' not in sys.modules: - return - if is_pypy and sys.version_info < (3, 7): - # PyPy for 3.6 unconditionally imports distutils, so bypass the warning - # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 - return - warnings.warn( - "Distutils was imported before Setuptools, but importing Setuptools " - "also replaces the `distutils` module in `sys.modules`. This may lead " - "to undesirable behaviors or errors. To avoid these issues, avoid " - "using distutils directly, ensure that setuptools is installed in the " - "traditional way (e.g. not an editable install), and/or make sure " - "that setuptools is always imported before distutils.") - - -def clear_distutils(): - if 'distutils' not in sys.modules: - return - warnings.warn("Setuptools is replacing distutils.") - mods = [name for name in sys.modules if re.match(r'distutils\b', name)] - for name in mods: - del sys.modules[name] - - -def enabled(): - """ - Allow selection of distutils by environment variable. - """ - which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'stdlib') - return which == 'local' - - -def ensure_local_distutils(): - clear_distutils() - distutils = importlib.import_module('setuptools._distutils') - distutils.__name__ = 'distutils' - sys.modules['distutils'] = distutils - - # sanity check that submodules load as expected - core = importlib.import_module('distutils.core') - assert '_distutils' in core.__file__, core.__file__ - - -def do_override(): - """ - Ensure that the local copy of distutils is preferred over stdlib. - - See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 - for more motivation. - """ - if enabled(): - warn_distutils_present() - ensure_local_distutils() - - -class DistutilsMetaFinder: - def find_spec(self, fullname, path, target=None): - if path is not None: - return - - method_name = 'spec_for_{fullname}'.format(**locals()) - method = getattr(self, method_name, lambda: None) - return method() - - def spec_for_distutils(self): - import importlib.abc - import importlib.util - - class DistutilsLoader(importlib.abc.Loader): - - def create_module(self, spec): - return importlib.import_module('setuptools._distutils') - - def exec_module(self, module): - pass - - return importlib.util.spec_from_loader('distutils', DistutilsLoader()) - - def spec_for_pip(self): - """ - Ensure stdlib distutils when running under pip. - See pypa/pip#8761 for rationale. - """ - if self.pip_imported_during_build(): - return - clear_distutils() - self.spec_for_distutils = lambda: None - - @staticmethod - def pip_imported_during_build(): - """ - Detect if pip is being imported in a build script. Ref #2355. - """ - import traceback - return any( - frame.f_globals['__file__'].endswith('setup.py') - for frame, line in traceback.walk_stack(None) - ) - - -DISTUTILS_FINDER = DistutilsMetaFinder() - - -def add_shim(): - sys.meta_path.insert(0, DISTUTILS_FINDER) - - -def remove_shim(): - try: - sys.meta_path.remove(DISTUTILS_FINDER) - except ValueError: - pass diff --git a/.venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 8fd8fdada00d40ed9f4c71ea16d064b09620993f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5124 zcmbtYOLyDG6&^eYL6k%*w&N!0YZ@nM*xHosyi-+qSWfEJq0`7tS{|h^$Qg=|K!TnD zrHGX_mCtFi>1p>}Sj%ktbFl3y>+Z5h`rQEul9J<|oPuWtn89G?n|r_e7~Wl4Dl=UF z99(R*D~$b{8q-$^jki(s-%$xBte7?OyVbBv+iuwA?lc^8cN?y-CEG6Tcnwdw59fp< zT7851mJz$M_F(-W7%VJ)XabFM%ViEU6u_P+EFTKyi8L|9;iRB}^QIVA+);J@c z5NGjjS)3E+aeqQs8?5@|S3t$;4L=C_`~CeO$h>H)mnb=WruIuNBApJ>DAt@Bvae(- zOr>biH`AAc#&r~3LnW+~ZCg8Ysv_71OKru`c7(md6gNHY!;)~0E$jyGt8P7;FV?Br zU(sA&&7lg9EXLLg1bd<8QMaEc0N_p821dRi(?LH?l2~8j%|SYPAN97T-taKi30JZo zhb^gj+L8QTvEDu2O~fFUJnHd#dSBP_roLC>cRG>g-Eg1BG88;b_@F1Gj#Svh@TTm9 zyHTPvPZXC*;R#6{JRzj zW6X3~v<1>y)yo`+CYu|{CYy`2AxpNnE0qSCAnLV~%-;)D51Z7POHW@iwFoVm>gzvU ze{=J$#^}w?U@K9Z>r(HeNq@5m=(5|7lZcA}Pw}WXYrC?yyLl^WZt5tNm-}IBC)|>H zGbkVh9rUdPST;(7pw{2dF3^fo1He=*d+9O&Xc#49R@ri`isPcTzg5&VLt+~p1&PyRC=b@u7vp`rYN^=o$jk|A}eu4ua9vlE7rLUR_*5TVur z%ZrO}cqkhv`bVg?u)?S3Y5s?B76;a`t=t3aANGA0reh5k3Yly+t9E89nU%U>+UiiF zb|rIrVOLJ{pq4OYR$h%^Rjs7kUwe+$p#?o=vqd(%*aF+tM3A-BIBCIv*6=X?rs^vC zLXnLs@_lLnRn=~|Ac$6Hsi)9#+|z#-no7I)<$r5<3_N4bK}n4J2!7_WS&k%95u6&kwn$W>;$$jnksX)WLmYd z(q1QObxv*@qi6|HCH%Az=2k5AL)>S!IYYj8@it{g%wnn8>M=+r>;o1!2P}2BOTu2w z-@t<&S^{L)_I5nImd?@Bk@XkQ1R^QbzkYJ!OllL2=De&Fys5R|NVD=}K-D*j$mVlr zOIu&cAA{ThWQY|+t00*0fcn}|jJ~Y$j)tL={BMw7tlDP9%%ycs3g|-a`vN1{352VV z!H6Cn3>U>ITZ*_kBR8}mrWtx1F?BYzjPz`(O^maL|1wIxG398pqAtmpmXjldT{Mpv zL&UrM(i_*Vz47|XSFW1L5XKOK;QqTw8tsN8ww#gms$-a9e3jYzl<>CbI|!V4ZMa*GD<;^ew2kRoCg*X5Lc9t9Js<0bGVnJCwwvg z0KTpnQpPsskiAJM(Ihs41*%)&_-- z*x#%}HwCp1knUi0cH|tE4oXLPQZPKH`?3{4KEa>cgE%I}9iG|^so(fYTApVA(yE`7 z(?nSQY8-Z(B3!Fu^nXy;aODx3skO1EfR>+jfBBcNe-D`8V>2&zjoBPrK$xZqangnF zX=nZzZ|3&Hw3B&hs4ym5=*qN{2xB~%mp7)s8hy?eYu^MsZBk44M%S*uM-G4dShS}i z2?>SttzSn4ugPNeMSi!wVDGcPvNk*^B<~C7bGB`7JJ5iICrZ%ZSdQ2+c~`_T67wn9 z)68^fj%v&#Gbd(!;DbvhR)R|<%;F8-dKCCV$zn{ZiOh@fw~`PXYmuKEUt^zn4jo2H zpRW(l#uVV+{l9>x=B-ytieqj>hS5rJ z?TbNhe-Ii|g!6xu;1aWPe6JKwMy_WHFuC^b;# zq9}hEUVE&F2;)?)SUAh4@gf)>+X69A*jCUSM6obghI$uM!%)dWr!W}BEf$KSIWQns zSqa_{(QU~87oM5@)831a#L=K6GG>QRRPLsrJeyK{O6!kES*79aLRsrFMM}w|HtB*A z`KBcGjQ2&yvk(VR?27A_iu!4deT&Q9r}Lp>J{x9DeG^_2=8cR-81Esb{|I3B8BB1OuPI zz^v3(h@F`mN4--C*!=32?8(piYAqoI1jV(zZ-;L`O1R&t$|=o{r$d~a$7!`Cn>eb$ zhI{*2c`uB20-R`DJJ9%VvD68TtLx~C2#2vvDB8FEZ-$q@7nZ73M+VDj_BW_{ld6}f zBC4r%RM{dxq)}@Wfoat#BoqF>fET|(G4aK>%D!Lm%eJMczlAb$k?3e9P3NESIVE+D z?a|*H2uj4k(cvkZ$Kqj-rw2H%BVo>#i!(>?-p%^@jgKA$D)U2u+@uqAKcmIS|1e9D zLpz0tglG``0uRIG91{>(7W;(t&bv5H?3C4W7MNwRKeC?v2a`dWFa+;!&Uln4WuB5< z$}vBrM)~6~9!QhgKN8l&lM$s+ zZya+d>(h#Ml2vfNNTn+NWH`G%`acRO^C$T~4|%Rk$H+W&evY1=r;1c&@EcJX7>`8n oujXNOjdZ2ydyp{yIc3MQY|H+}E&0p-yzl!9{$k~_=lJe_0T{6h)Bpeg diff --git a/.venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-38.pyc b/.venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-38.pyc deleted file mode 100644 index 36b6ef7af96777732b43dc4c02f4381a8ad12299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 236 zcmZ9Fy$S*`5QLMf#mN zMP)3d&aH7?%4Jm -Maintainer-email: team@aiohttp.org -License: Apache 2 -Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby -Project-URL: CI: GitHub Actions, https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI -Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiohttp -Project-URL: Docs: Changelog, https://docs.aiohttp.org/en/stable/changes.html -Project-URL: Docs: RTD, https://docs.aiohttp.org -Project-URL: GitHub: issues, https://github.com/aio-libs/aiohttp/issues -Project-URL: GitHub: repo, https://github.com/aio-libs/aiohttp -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Framework :: AsyncIO -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Operating System :: POSIX -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: Microsoft :: Windows -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Topic :: Internet :: WWW/HTTP -Requires-Python: >=3.6 -Description-Content-Type: text/x-rst -License-File: LICENSE.txt -Requires-Dist: attrs (>=17.3.0) -Requires-Dist: charset-normalizer (<3.0,>=2.0) -Requires-Dist: multidict (<7.0,>=4.5) -Requires-Dist: async-timeout (<5.0,>=4.0.0a3) -Requires-Dist: yarl (<2.0,>=1.0) -Requires-Dist: frozenlist (>=1.1.1) -Requires-Dist: aiosignal (>=1.1.2) -Requires-Dist: idna-ssl (>=1.0) ; python_version < "3.7" -Requires-Dist: asynctest (==0.13.0) ; python_version < "3.8" -Requires-Dist: typing-extensions (>=3.7.4) ; python_version < "3.8" -Provides-Extra: speedups -Requires-Dist: aiodns ; extra == 'speedups' -Requires-Dist: Brotli ; extra == 'speedups' -Requires-Dist: cchardet ; extra == 'speedups' - -================================== -Async http client/server framework -================================== - -.. image:: https://raw.githubusercontent.com/aio-libs/aiohttp/master/docs/aiohttp-plain.svg - :height: 64px - :width: 64px - :alt: aiohttp logo - -| - -.. image:: https://github.com/aio-libs/aiohttp/workflows/CI/badge.svg - :target: https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI - :alt: GitHub Actions status for master branch - -.. image:: https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg - :target: https://codecov.io/gh/aio-libs/aiohttp - :alt: codecov.io status for master branch - -.. image:: https://badge.fury.io/py/aiohttp.svg - :target: https://pypi.org/project/aiohttp - :alt: Latest PyPI package version - -.. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest - :target: https://docs.aiohttp.org/ - :alt: Latest Read The Docs - -.. image:: https://img.shields.io/discourse/status?server=https%3A%2F%2Faio-libs.discourse.group - :target: https://aio-libs.discourse.group - :alt: Discourse status - -.. image:: https://badges.gitter.im/Join%20Chat.svg - :target: https://gitter.im/aio-libs/Lobby - :alt: Chat on Gitter - - -Key Features -============ - -- Supports both client and server side of HTTP protocol. -- Supports both client and server Web-Sockets out-of-the-box and avoids - Callback Hell. -- Provides Web-server with middlewares and plugable routing. - - -Getting started -=============== - -Client ------- - -To get something from the web: - -.. code-block:: python - - import aiohttp - import asyncio - - async def main(): - - async with aiohttp.ClientSession() as session: - async with session.get('http://python.org') as response: - - print("Status:", response.status) - print("Content-type:", response.headers['content-type']) - - html = await response.text() - print("Body:", html[:15], "...") - - loop = asyncio.get_event_loop() - loop.run_until_complete(main()) - -This prints: - -.. code-block:: - - Status: 200 - Content-type: text/html; charset=utf-8 - Body: ... - -Coming from `requests `_ ? Read `why we need so many lines `_. - -Server ------- - -An example using a simple server: - -.. code-block:: python - - # examples/server_simple.py - from aiohttp import web - - async def handle(request): - name = request.match_info.get('name', "Anonymous") - text = "Hello, " + name - return web.Response(text=text) - - async def wshandle(request): - ws = web.WebSocketResponse() - await ws.prepare(request) - - async for msg in ws: - if msg.type == web.WSMsgType.text: - await ws.send_str("Hello, {}".format(msg.data)) - elif msg.type == web.WSMsgType.binary: - await ws.send_bytes(msg.data) - elif msg.type == web.WSMsgType.close: - break - - return ws - - - app = web.Application() - app.add_routes([web.get('/', handle), - web.get('/echo', wshandle), - web.get('/{name}', handle)]) - - if __name__ == '__main__': - web.run_app(app) - - -Documentation -============= - -https://aiohttp.readthedocs.io/ - - -Demos -===== - -https://github.com/aio-libs/aiohttp-demos - - -External links -============== - -* `Third party libraries - `_ -* `Built with aiohttp - `_ -* `Powered by aiohttp - `_ - -Feel free to make a Pull Request for adding your link to these pages! - - -Communication channels -====================== - -*aio-libs discourse group*: https://aio-libs.discourse.group - -*gitter chat* https://gitter.im/aio-libs/Lobby - -We support `Stack Overflow -`_. -Please add *aiohttp* tag to your question there. - -Requirements -============ - -- Python >= 3.6 -- async-timeout_ -- attrs_ -- charset-normalizer_ -- multidict_ -- yarl_ - -Optionally you may install the cChardet_ and aiodns_ libraries (highly -recommended for sake of speed). - -.. _charset-normalizer: https://pypi.org/project/charset-normalizer -.. _aiodns: https://pypi.python.org/pypi/aiodns -.. _attrs: https://github.com/python-attrs/attrs -.. _multidict: https://pypi.python.org/pypi/multidict -.. _yarl: https://pypi.python.org/pypi/yarl -.. _async-timeout: https://pypi.python.org/pypi/async_timeout -.. _cChardet: https://pypi.python.org/pypi/cchardet - -License -======= - -``aiohttp`` is offered under the Apache 2 license. - - -Keepsafe -======== - -The aiohttp community would like to thank Keepsafe -(https://www.getkeepsafe.com) for its support in the early days of -the project. - - -Source code -=========== - -The latest developer version is available in a GitHub repository: -https://github.com/aio-libs/aiohttp - -Benchmarks -========== - -If you are interested in efficiency, the AsyncIO community maintains a -list of benchmarks on the official wiki: -https://github.com/python/asyncio/wiki/Benchmarks - - diff --git a/.venv/Lib/site-packages/aiohttp-3.8.1.dist-info/RECORD b/.venv/Lib/site-packages/aiohttp-3.8.1.dist-info/RECORD deleted file mode 100644 index ef05bc1..0000000 --- a/.venv/Lib/site-packages/aiohttp-3.8.1.dist-info/RECORD +++ /dev/null @@ -1,123 +0,0 @@ -aiohttp-3.8.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -aiohttp-3.8.1.dist-info/LICENSE.txt,sha256=CbjEGhGLCTtscH6PL7yug73to6It6fLb8uojWPX1VSs,612 -aiohttp-3.8.1.dist-info/METADATA,sha256=leqF7e_6a-kaeZYF95OmGuHmBJSrszA1eeLyVjzT9t4,7322 -aiohttp-3.8.1.dist-info/RECORD,, -aiohttp-3.8.1.dist-info/WHEEL,sha256=P24hRDQapckAvHvgBBzlH5uw6rQ_oZQtKbG6drGrqOM,100 -aiohttp-3.8.1.dist-info/top_level.txt,sha256=iv-JIaacmTl-hSho3QmphcKnbRRYx1st47yjz_178Ro,8 -aiohttp/.hash/_cparser.pxd.hash,sha256=1tLMUc3IzMppOVKW99LKG1TD6szTXGSaCfHgiPOL9aA,108 -aiohttp/.hash/_find_header.pxd.hash,sha256=TxG5w4etbVd6sfm5JWbdf5PW6LnuXRQnlMoFBVGKN2E,112 -aiohttp/.hash/_helpers.pyi.hash,sha256=D1pTrCkUaJ3by1XeGH_nE-amt7XdjfRHcm9oRtoGhHQ,108 -aiohttp/.hash/_helpers.pyx.hash,sha256=MA4zlNd5xukP4VDAbnoId0Azv8HxCpwLWie2gSMPLsw,108 -aiohttp/.hash/_http_parser.pyx.hash,sha256=AVrrJ4SFdluXTl9VvGvjt7SkdGSf8PtkKTM8DeneYKk,112 -aiohttp/.hash/_http_writer.pyx.hash,sha256=oqW0CdYfKNwSX0PKREN8Qz_Mi4aaioGCIPbEvsaEgaM,112 -aiohttp/.hash/_websocket.pyx.hash,sha256=8AcsJ5Tb8lZ9_QVXor_1Xbtl5igK1iP5rtEZZ0iA2AE,110 -aiohttp/.hash/hdrs.py.hash,sha256=Vfr7WRlz3YbkgRFBfXksCI8mA7PXUMhs37jnv0kiqWQ,103 -aiohttp/__init__.py,sha256=G_kbDNtxPNUC9qfqDv2MTeuN3WLCRnuqbidkZ7tkVcY,7086 -aiohttp/__pycache__/__init__.cpython-38.pyc,, -aiohttp/__pycache__/abc.cpython-38.pyc,, -aiohttp/__pycache__/base_protocol.cpython-38.pyc,, -aiohttp/__pycache__/client.cpython-38.pyc,, -aiohttp/__pycache__/client_exceptions.cpython-38.pyc,, -aiohttp/__pycache__/client_proto.cpython-38.pyc,, -aiohttp/__pycache__/client_reqrep.cpython-38.pyc,, -aiohttp/__pycache__/client_ws.cpython-38.pyc,, -aiohttp/__pycache__/connector.cpython-38.pyc,, -aiohttp/__pycache__/cookiejar.cpython-38.pyc,, -aiohttp/__pycache__/formdata.cpython-38.pyc,, -aiohttp/__pycache__/hdrs.cpython-38.pyc,, -aiohttp/__pycache__/helpers.cpython-38.pyc,, -aiohttp/__pycache__/http.cpython-38.pyc,, -aiohttp/__pycache__/http_exceptions.cpython-38.pyc,, -aiohttp/__pycache__/http_parser.cpython-38.pyc,, -aiohttp/__pycache__/http_websocket.cpython-38.pyc,, -aiohttp/__pycache__/http_writer.cpython-38.pyc,, -aiohttp/__pycache__/locks.cpython-38.pyc,, -aiohttp/__pycache__/log.cpython-38.pyc,, -aiohttp/__pycache__/multipart.cpython-38.pyc,, -aiohttp/__pycache__/payload.cpython-38.pyc,, -aiohttp/__pycache__/payload_streamer.cpython-38.pyc,, -aiohttp/__pycache__/pytest_plugin.cpython-38.pyc,, -aiohttp/__pycache__/resolver.cpython-38.pyc,, -aiohttp/__pycache__/streams.cpython-38.pyc,, -aiohttp/__pycache__/tcp_helpers.cpython-38.pyc,, -aiohttp/__pycache__/test_utils.cpython-38.pyc,, -aiohttp/__pycache__/tracing.cpython-38.pyc,, -aiohttp/__pycache__/typedefs.cpython-38.pyc,, -aiohttp/__pycache__/web.cpython-38.pyc,, -aiohttp/__pycache__/web_app.cpython-38.pyc,, -aiohttp/__pycache__/web_exceptions.cpython-38.pyc,, -aiohttp/__pycache__/web_fileresponse.cpython-38.pyc,, -aiohttp/__pycache__/web_log.cpython-38.pyc,, -aiohttp/__pycache__/web_middlewares.cpython-38.pyc,, -aiohttp/__pycache__/web_protocol.cpython-38.pyc,, -aiohttp/__pycache__/web_request.cpython-38.pyc,, -aiohttp/__pycache__/web_response.cpython-38.pyc,, -aiohttp/__pycache__/web_routedef.cpython-38.pyc,, -aiohttp/__pycache__/web_runner.cpython-38.pyc,, -aiohttp/__pycache__/web_server.cpython-38.pyc,, -aiohttp/__pycache__/web_urldispatcher.cpython-38.pyc,, -aiohttp/__pycache__/web_ws.cpython-38.pyc,, -aiohttp/__pycache__/worker.cpython-38.pyc,, -aiohttp/_cparser.pxd,sha256=rEtEshtn54wSf_ZCJ0EBjRyVBkIOv_oh17BcaNOd6V8,5188 -aiohttp/_find_header.c,sha256=-d1A3pkkpirVX5CDQaTSSTjdjXekmOjt-bqYcEQWbXc,197440 -aiohttp/_find_header.h,sha256=HistyxY7K3xEJ53Y5xEfwrDVDkfcV0zQ9mkzMgzi_jo,184 -aiohttp/_find_header.pxd,sha256=BFUSmxhemBtblqxzjzH3x03FfxaWlTyuAIOz8YZ5_nM,70 -aiohttp/_headers.pxi,sha256=1MhCe6Un_KI1tpO85HnDfzVO94BhcirLanAOys5FIHA,2090 -aiohttp/_helpers.c,sha256=6o0WiV3O6QP3w7CeIXWnzaDAiXlKzFsede2S_72iXP8,212983 -aiohttp/_helpers.cp38-win_amd64.pyd,sha256=MM-zPJtJ6-1Oz7RrIn-TMr7sX0Rizj6wz7HL0xzKWgY,48640 -aiohttp/_helpers.pyi,sha256=2Hd5IC0Zf4YTEJ412suyyhsh1kVyVDv5g4stgyo2Ksc,208 -aiohttp/_helpers.pyx,sha256=tgl7fZh0QMT6cjf4jSJ8iaO6DdQD3GON2-SH4N5_ETg,1084 -aiohttp/_http_parser.c,sha256=mbsJXw0OQc-RGRss03ciJZCU6-32n_RVnMOgf8cAbVo,978189 -aiohttp/_http_parser.cp38-win_amd64.pyd,sha256=W2SEYsWP7iPpJXWQ52pOPa9hFL3Gp67-Sss2plPQHYA,245248 -aiohttp/_http_parser.pyx,sha256=DPA0SE8XjJwda86m1u3Fyr-WrjU1ngA0TQ0QM8nP9RI,27389 -aiohttp/_http_writer.c,sha256=AEz-QiTHIfIhi7PNrEHU4jXNYfQakG4MCxLmkZyPfrw,221272 -aiohttp/_http_writer.cp38-win_amd64.pyd,sha256=fDCDV1pcnFymz5WhVLukfcNCKFZipSDNa4Jo0ujnDMo,44544 -aiohttp/_http_writer.pyx,sha256=8CBLytO2rx1kdpWe9HYSznhLXdeZWyE-3xI7jaGasag,4738 -aiohttp/_websocket.c,sha256=AGp31tkjXHaLdSFcI_6Cl7wGWqKLmMdk0OwLE0AdJNg,138422 -aiohttp/_websocket.cp38-win_amd64.pyd,sha256=vea7GHAyMvLwA_79hT8UfxOCB8bkxkRmiOSslIARmYY,28672 -aiohttp/_websocket.pyx,sha256=o9J7yi9c2-jTBjE3dUkXxhDWKvRWJz5GZfyLsgJQa38,1617 -aiohttp/abc.py,sha256=ZAnm9bpefUtEZmyn8sq1MSPqYugcKeQpzyuAwKGFXuw,5720 -aiohttp/base_protocol.py,sha256=0v3CthN_KxvGbfM8_FxJ9BPTUqS9i12FwAmZwa2udU8,2787 -aiohttp/client.py,sha256=c6I3s4pJjewThnygoBc9S8J0OyKFi2iWUrpLuZUhn08,46228 -aiohttp/client_exceptions.py,sha256=_UcHK3XARTA97iKZVyV4pxcXIrZaNMXo2uP-i1_RbcI,9619 -aiohttp/client_proto.py,sha256=znDiFu6aO85uYH2RAQZYXoN2useLY9K_DssswchyYKQ,8447 -aiohttp/client_reqrep.py,sha256=TIHaRXXdl_8pqxizifwaM25pW2_JmkfTM92KS93MuPI,38019 -aiohttp/client_ws.py,sha256=R8hACPfspjbzGmBLMR4wd94-ZhHlMnrtxMT86SDYMWg,10840 -aiohttp/connector.py,sha256=5jfOr8HbliCAKsCeaDr_HBr1kMhvrmGX5Gtl70vl3MI,52303 -aiohttp/cookiejar.py,sha256=qougeR1yU3JYyjIdbdELuERxgyQaAuXtYWw7HnbXqiY,13983 -aiohttp/formdata.py,sha256=dAEgBnFO9xcbmyf8Dbl5pB38GF1JPOwS9sFoG7rBsDo,6294 -aiohttp/hdrs.py,sha256=ygDnAqYCot8NMQyjck2r9CzpTspAOXpHknNl-yxIybY,4838 -aiohttp/helpers.py,sha256=hWYfMH8hdLea0u67N12xOPE7seloFKyWm99UNMWhBvs,27118 -aiohttp/http.py,sha256=NKlSh1UEf-ZoYBYI0IoAUq0jy_-wKyJQ-aT0GjQCy7k,1896 -aiohttp/http_exceptions.py,sha256=rLwhCbFrOpQ_ntr3GnxaxD3oRnTTNM1utmDDBUbdVTU,2691 -aiohttp/http_parser.py,sha256=M36gf2QvuBhpflaADhYMIch-GfD6lqQxgsgQANnxgF8,33546 -aiohttp/http_websocket.py,sha256=xeG_CKBaRiCy_bntLl4My63styputcl1zpGY2wtOmHY,26060 -aiohttp/http_writer.py,sha256=SglEj4FTKratNnHijo9Zhy5ZdXSy_0nClm_WzA6UoZs,6176 -aiohttp/locks.py,sha256=fIuR6LrO3cyaSR7hwUzftTM-tnOhkVfm8NVyn8EwPis,1193 -aiohttp/log.py,sha256=zYUTvXsMQ9Sz1yNN8kXwd5Qxu49a1FzjZ_wQqriEc8M,333 -aiohttp/multipart.py,sha256=0m5kNFTUrOWs_fhKWEjhnZYirZhAakTLgrWy0SQbnH0,33400 -aiohttp/payload.py,sha256=vycRTUCM-57LyZ7hVrLffJfulBeT3rhO6A-YxYmUoDk,14165 -aiohttp/payload_streamer.py,sha256=6bbqsfgysHzfUTJIUlqad1wRklVuLmNHVtScv_mWhGY,2187 -aiohttp/py.typed,sha256=3VVwXUAWVEVX7sDwyYDnW5ZdBC9_Z9AJAFfLCleUW0k,8 -aiohttp/pytest_plugin.py,sha256=26CllzLUw-JGrwfXYIK-XGbDMCDwbIaomV7Sk4WZVG4,12163 -aiohttp/resolver.py,sha256=UWM-6HJkOLwkGveoesBnGv-pJePtpE7js6ujYi7XHoc,5252 -aiohttp/streams.py,sha256=jDR3ZtPlDjaL35Oe5HcLq0LvoYXIGEbSRUnqZKEfiNk,21500 -aiohttp/tcp_helpers.py,sha256=jPHZyIHbIAqyWS0QShT_ZgKLMiDW7s_124IPc4irTU8,1000 -aiohttp/test_utils.py,sha256=hLOEAJzOfM69LGMx74xrLutS_xZMI_6-AVkPDpWyNx4,21917 -aiohttp/tracing.py,sha256=RoYBPZQqvV2pIRbeaSUGe-cElR2FdQYBZOaMnPPRJXE,15777 -aiohttp/typedefs.py,sha256=E-iS7tNE3CrcMAjz5uiwr_Zlp4CKpCU99hzAKw08g14,1830 -aiohttp/web.py,sha256=hrZ6KRXbBLLQ1XThCoL-696TApjFiYDB6vXyOsv9lBc,18515 -aiohttp/web_app.py,sha256=pQwAAMSlu89p4Vt0DRG5_c4nvOzXHi3MBSlCCiQTH14,17825 -aiohttp/web_exceptions.py,sha256=ydzJJKwJWHOKzjzh0XtZNzZ5NCb0Me8DKmlKy2qvijw,10547 -aiohttp/web_fileresponse.py,sha256=tRRZyBNPL579Ac8Q2mSF7qjHIkV42z9VyVEkvQLOJlQ,11072 -aiohttp/web_log.py,sha256=3TaiQcu9N5teUfLn71__htAnhPgE90vneVM_YCk5Zlc,7773 -aiohttp/web_middlewares.py,sha256=qmHNhOdhTtJZjChDiBlF9M-SGxF3vz2koDnxMPrlNCA,4256 -aiohttp/web_protocol.py,sha256=YOCCQYDGXZ3XQ-931PDL_JEgIDyzyNMcHRlfXyzbMe0,23229 -aiohttp/web_request.py,sha256=T5N94hz58iBnFK8ugKI02t_mJ_KRosuII3ytrb07f6I,28762 -aiohttp/web_response.py,sha256=hCk7LNxI90k1XUKOLQDWF5hs0mlD15INxibeXbj_LXg,28392 -aiohttp/web_routedef.py,sha256=zz6VaH5Mm4lAnplxoCMEVDnh1BfTGJiAWLOHalMgtRA,6253 -aiohttp/web_runner.py,sha256=QEIbQwHXwQHoHVzKxJ1V5mcxcfLZv-h9kSzcqA6REk4,11570 -aiohttp/web_server.py,sha256=iKc9a4fQS14-3ivqzBiBp742m8vEexRZiSzeKTW7NCo,2120 -aiohttp/web_urldispatcher.py,sha256=ZlkWuhY_Nl6mO7x9Aqn3-5XRle1v1G58_ynmPtJXpI8,40767 -aiohttp/web_ws.py,sha256=YAEf_B2OXOCtZnvH2V2AM4E2FHVeIo7Gg_4t5wlx1R8,17746 -aiohttp/worker.py,sha256=isIbXTFiV-oNOeI6hxRGW2My6O3MW2ImqOqjNaP9auE,9048 diff --git a/.venv/Lib/site-packages/aiohttp-3.8.1.dist-info/WHEEL b/.venv/Lib/site-packages/aiohttp-3.8.1.dist-info/WHEEL deleted file mode 100644 index 2c375d8..0000000 --- a/.venv/Lib/site-packages/aiohttp-3.8.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.0) -Root-Is-Purelib: false -Tag: cp38-cp38-win_amd64 - diff --git a/.venv/Lib/site-packages/aiohttp-3.8.1.dist-info/top_level.txt b/.venv/Lib/site-packages/aiohttp-3.8.1.dist-info/top_level.txt deleted file mode 100644 index ee4ba4f..0000000 --- a/.venv/Lib/site-packages/aiohttp-3.8.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -aiohttp diff --git a/.venv/Lib/site-packages/aiohttp/.hash/_cparser.pxd.hash b/.venv/Lib/site-packages/aiohttp/.hash/_cparser.pxd.hash deleted file mode 100644 index cd588d0..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/_cparser.pxd.hash +++ /dev/null @@ -1 +0,0 @@ -ac4b44b21b67e78c127ff6422741018d1c9506420ebffa21d7b05c68d39de95f *D:/a/aiohttp/aiohttp/aiohttp/_cparser.pxd diff --git a/.venv/Lib/site-packages/aiohttp/.hash/_find_header.pxd.hash b/.venv/Lib/site-packages/aiohttp/.hash/_find_header.pxd.hash deleted file mode 100644 index 8af9f81..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/_find_header.pxd.hash +++ /dev/null @@ -1 +0,0 @@ -0455129b185e981b5b96ac738f31f7c74dc57f1696953cae0083b3f18679fe73 *D:/a/aiohttp/aiohttp/aiohttp/_find_header.pxd diff --git a/.venv/Lib/site-packages/aiohttp/.hash/_helpers.pyi.hash b/.venv/Lib/site-packages/aiohttp/.hash/_helpers.pyi.hash deleted file mode 100644 index 82a670d..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/_helpers.pyi.hash +++ /dev/null @@ -1 +0,0 @@ -d87779202d197f8613109e35dacbb2ca1b21d64572543bf9838b2d832a362ac7 *D:/a/aiohttp/aiohttp/aiohttp/_helpers.pyi diff --git a/.venv/Lib/site-packages/aiohttp/.hash/_helpers.pyx.hash b/.venv/Lib/site-packages/aiohttp/.hash/_helpers.pyx.hash deleted file mode 100644 index 251b846..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/_helpers.pyx.hash +++ /dev/null @@ -1 +0,0 @@ -b6097b7d987440c4fa7237f88d227c89a3ba0dd403dc638ddbe487e0de7f1138 *D:/a/aiohttp/aiohttp/aiohttp/_helpers.pyx diff --git a/.venv/Lib/site-packages/aiohttp/.hash/_http_parser.pyx.hash b/.venv/Lib/site-packages/aiohttp/.hash/_http_parser.pyx.hash deleted file mode 100644 index dec528a..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/_http_parser.pyx.hash +++ /dev/null @@ -1 +0,0 @@ -0cf034484f178c9c1d6bcea6d6edc5cabf96ae35359e00344d0d1033c9cff512 *D:/a/aiohttp/aiohttp/aiohttp/_http_parser.pyx diff --git a/.venv/Lib/site-packages/aiohttp/.hash/_http_writer.pyx.hash b/.venv/Lib/site-packages/aiohttp/.hash/_http_writer.pyx.hash deleted file mode 100644 index 11278aa..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/_http_writer.pyx.hash +++ /dev/null @@ -1 +0,0 @@ -f0204bcad3b6af1d6476959ef47612ce784b5dd7995b213edf123b8da19ab1a8 *D:/a/aiohttp/aiohttp/aiohttp/_http_writer.pyx diff --git a/.venv/Lib/site-packages/aiohttp/.hash/_websocket.pyx.hash b/.venv/Lib/site-packages/aiohttp/.hash/_websocket.pyx.hash deleted file mode 100644 index 1a3346e..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/_websocket.pyx.hash +++ /dev/null @@ -1 +0,0 @@ -a3d27bca2f5cdbe8d3063137754917c610d62af456273e4665fc8bb202506b7f *D:/a/aiohttp/aiohttp/aiohttp/_websocket.pyx diff --git a/.venv/Lib/site-packages/aiohttp/.hash/hdrs.py.hash b/.venv/Lib/site-packages/aiohttp/.hash/hdrs.py.hash deleted file mode 100644 index 7b005e7..0000000 --- a/.venv/Lib/site-packages/aiohttp/.hash/hdrs.py.hash +++ /dev/null @@ -1 +0,0 @@ -ca00e702a602a2df0d310ca3724dabf42ce94eca40397a47927365fb2c48c9b6 *D:/a/aiohttp/aiohttp/aiohttp/hdrs.py diff --git a/.venv/Lib/site-packages/aiohttp/__init__.py b/.venv/Lib/site-packages/aiohttp/__init__.py deleted file mode 100644 index 4bbcef2..0000000 --- a/.venv/Lib/site-packages/aiohttp/__init__.py +++ /dev/null @@ -1,216 +0,0 @@ -__version__ = "3.8.1" - -from typing import Tuple - -from . import hdrs as hdrs -from .client import ( - BaseConnector as BaseConnector, - ClientConnectionError as ClientConnectionError, - ClientConnectorCertificateError as ClientConnectorCertificateError, - ClientConnectorError as ClientConnectorError, - ClientConnectorSSLError as ClientConnectorSSLError, - ClientError as ClientError, - ClientHttpProxyError as ClientHttpProxyError, - ClientOSError as ClientOSError, - ClientPayloadError as ClientPayloadError, - ClientProxyConnectionError as ClientProxyConnectionError, - ClientRequest as ClientRequest, - ClientResponse as ClientResponse, - ClientResponseError as ClientResponseError, - ClientSession as ClientSession, - ClientSSLError as ClientSSLError, - ClientTimeout as ClientTimeout, - ClientWebSocketResponse as ClientWebSocketResponse, - ContentTypeError as ContentTypeError, - Fingerprint as Fingerprint, - InvalidURL as InvalidURL, - NamedPipeConnector as NamedPipeConnector, - RequestInfo as RequestInfo, - ServerConnectionError as ServerConnectionError, - ServerDisconnectedError as ServerDisconnectedError, - ServerFingerprintMismatch as ServerFingerprintMismatch, - ServerTimeoutError as ServerTimeoutError, - TCPConnector as TCPConnector, - TooManyRedirects as TooManyRedirects, - UnixConnector as UnixConnector, - WSServerHandshakeError as WSServerHandshakeError, - request as request, -) -from .cookiejar import CookieJar as CookieJar, DummyCookieJar as DummyCookieJar -from .formdata import FormData as FormData -from .helpers import BasicAuth, ChainMapProxy, ETag -from .http import ( - HttpVersion as HttpVersion, - HttpVersion10 as HttpVersion10, - HttpVersion11 as HttpVersion11, - WebSocketError as WebSocketError, - WSCloseCode as WSCloseCode, - WSMessage as WSMessage, - WSMsgType as WSMsgType, -) -from .multipart import ( - BadContentDispositionHeader as BadContentDispositionHeader, - BadContentDispositionParam as BadContentDispositionParam, - BodyPartReader as BodyPartReader, - MultipartReader as MultipartReader, - MultipartWriter as MultipartWriter, - content_disposition_filename as content_disposition_filename, - parse_content_disposition as parse_content_disposition, -) -from .payload import ( - PAYLOAD_REGISTRY as PAYLOAD_REGISTRY, - AsyncIterablePayload as AsyncIterablePayload, - BufferedReaderPayload as BufferedReaderPayload, - BytesIOPayload as BytesIOPayload, - BytesPayload as BytesPayload, - IOBasePayload as IOBasePayload, - JsonPayload as JsonPayload, - Payload as Payload, - StringIOPayload as StringIOPayload, - StringPayload as StringPayload, - TextIOPayload as TextIOPayload, - get_payload as get_payload, - payload_type as payload_type, -) -from .payload_streamer import streamer as streamer -from .resolver import ( - AsyncResolver as AsyncResolver, - DefaultResolver as DefaultResolver, - ThreadedResolver as ThreadedResolver, -) -from .streams import ( - EMPTY_PAYLOAD as EMPTY_PAYLOAD, - DataQueue as DataQueue, - EofStream as EofStream, - FlowControlDataQueue as FlowControlDataQueue, - StreamReader as StreamReader, -) -from .tracing import ( - TraceConfig as TraceConfig, - TraceConnectionCreateEndParams as TraceConnectionCreateEndParams, - TraceConnectionCreateStartParams as TraceConnectionCreateStartParams, - TraceConnectionQueuedEndParams as TraceConnectionQueuedEndParams, - TraceConnectionQueuedStartParams as TraceConnectionQueuedStartParams, - TraceConnectionReuseconnParams as TraceConnectionReuseconnParams, - TraceDnsCacheHitParams as TraceDnsCacheHitParams, - TraceDnsCacheMissParams as TraceDnsCacheMissParams, - TraceDnsResolveHostEndParams as TraceDnsResolveHostEndParams, - TraceDnsResolveHostStartParams as TraceDnsResolveHostStartParams, - TraceRequestChunkSentParams as TraceRequestChunkSentParams, - TraceRequestEndParams as TraceRequestEndParams, - TraceRequestExceptionParams as TraceRequestExceptionParams, - TraceRequestRedirectParams as TraceRequestRedirectParams, - TraceRequestStartParams as TraceRequestStartParams, - TraceResponseChunkReceivedParams as TraceResponseChunkReceivedParams, -) - -__all__: Tuple[str, ...] = ( - "hdrs", - # client - "BaseConnector", - "ClientConnectionError", - "ClientConnectorCertificateError", - "ClientConnectorError", - "ClientConnectorSSLError", - "ClientError", - "ClientHttpProxyError", - "ClientOSError", - "ClientPayloadError", - "ClientProxyConnectionError", - "ClientResponse", - "ClientRequest", - "ClientResponseError", - "ClientSSLError", - "ClientSession", - "ClientTimeout", - "ClientWebSocketResponse", - "ContentTypeError", - "Fingerprint", - "InvalidURL", - "RequestInfo", - "ServerConnectionError", - "ServerDisconnectedError", - "ServerFingerprintMismatch", - "ServerTimeoutError", - "TCPConnector", - "TooManyRedirects", - "UnixConnector", - "NamedPipeConnector", - "WSServerHandshakeError", - "request", - # cookiejar - "CookieJar", - "DummyCookieJar", - # formdata - "FormData", - # helpers - "BasicAuth", - "ChainMapProxy", - "ETag", - # http - "HttpVersion", - "HttpVersion10", - "HttpVersion11", - "WSMsgType", - "WSCloseCode", - "WSMessage", - "WebSocketError", - # multipart - "BadContentDispositionHeader", - "BadContentDispositionParam", - "BodyPartReader", - "MultipartReader", - "MultipartWriter", - "content_disposition_filename", - "parse_content_disposition", - # payload - "AsyncIterablePayload", - "BufferedReaderPayload", - "BytesIOPayload", - "BytesPayload", - "IOBasePayload", - "JsonPayload", - "PAYLOAD_REGISTRY", - "Payload", - "StringIOPayload", - "StringPayload", - "TextIOPayload", - "get_payload", - "payload_type", - # payload_streamer - "streamer", - # resolver - "AsyncResolver", - "DefaultResolver", - "ThreadedResolver", - # streams - "DataQueue", - "EMPTY_PAYLOAD", - "EofStream", - "FlowControlDataQueue", - "StreamReader", - # tracing - "TraceConfig", - "TraceConnectionCreateEndParams", - "TraceConnectionCreateStartParams", - "TraceConnectionQueuedEndParams", - "TraceConnectionQueuedStartParams", - "TraceConnectionReuseconnParams", - "TraceDnsCacheHitParams", - "TraceDnsCacheMissParams", - "TraceDnsResolveHostEndParams", - "TraceDnsResolveHostStartParams", - "TraceRequestChunkSentParams", - "TraceRequestEndParams", - "TraceRequestExceptionParams", - "TraceRequestRedirectParams", - "TraceRequestStartParams", - "TraceResponseChunkReceivedParams", -) - -try: - from .worker import GunicornUVLoopWebWorker, GunicornWebWorker - - __all__ += ("GunicornWebWorker", "GunicornUVLoopWebWorker") -except ImportError: # pragma: no cover - pass diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 170028e1b25fe932f82ab463d5438e39a067381d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3692 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/client_exceptions.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/client_exceptions.cpython-38.pyc deleted file mode 100644 index d0e505fbecb04502411d551feac509319ab0e172..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11292 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 MB(vWV;a~m#0#Q0NUjP6A diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/client_ws.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/client_ws.cpython-38.pyc deleted file mode 100644 index d5fcf79f9bb145bd299e5a07e67e41cc2bc3bd8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8992 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 U;Sexv#Emo}M^4Yj369182O_%;jsO4v diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/connector.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/connector.cpython-38.pyc deleted file mode 100644 index e6ac57ceadce33cdd530527099b0eb1850590b92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35167 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 NppU*gcCm2p{{~S7-+2H4 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/cookiejar.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/cookiejar.cpython-38.pyc deleted file mode 100644 index 6b39c0c11e23ddec20c84e0f8cc860155b9bca33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10653 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/formdata.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/formdata.cpython-38.pyc deleted file mode 100644 index b7e126e74ea1fd94a003bd78a5380f02d3ea1289..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4556 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 HZ_E5Yo5y^^ diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/hdrs.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/hdrs.cpython-38.pyc deleted file mode 100644 index 668633db2d22321fdfd8694726c9039be4bcb444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5298 zcmd7WXLH*|8V7JvY!X!|$t^BX;xsv-9Vc;$o~S zbmQNXk;uQea7PSb`zrnqj;11!TBI4VBh6@YpcS>F_>Hv&wqtfIN)~U$w-a_E8WGVq zlFh_c!oLhnqDIP2MI-GIE)8}|&6GVPQX+jUB8HoTmmkxe}gfL?@~mJh*2>n#>Irl zh)FRerZbLO)?j#`Q4iFcy*VR(Y=B-<(25oPzY&A^T-dw}gh*fC|N*&c%3 zr|e<2M_|X5J<9eN?1ZvewllDk${uHX0(MGSmhCL;er4y_o`lUPJJ0qM>;Yv@vpoZQ zP}v2xXJMz6J;(Mu>>*_@uw8^btn5X$ORz_jy~K7I_NcNeY*%5ADbv`l!Df}^*z&M5 z%5=6l*yGCP*$S{Hloi=thGms4u$5qEl`XQBVds=p*s8E6m0f2uVCR*YY!>V(Wi_@X z*wf0E*;ZiBC|hN-VHcFW!nOu`R@tj;ufd*E=CHjEdtOjtpn4QeT40!usLNPWBWL4UfJ7hpMVvVeUj}{u%fbe*gg$=S=ndUJ_}n=_BpoC z!%E7&!1hJhqOvcseHm6(_7%3T!YazX#`bksRoOS#z6rao>|1Q#h8fDf!}eX6sqA}f z--lVse!%uFtfuT;wjaWll>Lb9$FOB(KVkbRY(?46*xrM!DtnLZ=P+B@FW7zwdqvr= z*nSOLQ}!FS-@;y1_CDM1V6Q3rJ=-5(jwZYcXZ-W&sF zWcDAOBL&N<&J;wwDg0oj;kARX-VTGaAJDtBJR6lUQ-t`5yFuvB4tx*;e=vxECFb0A zy(Ob(Cs0oZf5F-R_-osU(wHqak)e z{N{3c)#{9O%h}v!-48@4$GYz13YuZ+R%g7oUvD?OrrX|-$kERx;aeMOw++# zwTw#1S=3e>>TTvgeXZ5<-pb~D(G=~_t+xU>bD*VGDpi)9oT2CSvQ^YdX6M8``{)e} zdE%b!=}GFwhqYZ4;ilINKBO%@y-MEf9KYvrE55tow&n4A9=2i>=Zode$pbC*TRUDL zvi(y&d7!Pnf{~#+{c}EbptT|1+!aBnnx8t*+|aMrbkkDp4<5bWzI)a3;L-cdyO(Xp z=yAsI?Cb6l=IkM$y)2B6LP`^~R>?4+}Y(({cs9KN@5j z!=)`6+%Vmnc+_f&h7krrHtzA++_3-4u zUFcm2PoB=P{$9(kw}W-zXVt|V>(|5zP&Vgu!%6@i=N+?H&S4!wt+Lk^ zz2>8+QLdErULVwN_a;-n-TONQtF^cH_dJE&weo?!(+fiEWVM!iQ^@p!u2&tcR9wO_ zOLfdM{U!~`VqT7xG)yafi3Vda-`m?i^WNTm&oW+e+gr$DdBGkm^+(TOsXuB)XsPVo zy8!PEERen1XWGf$qLS>cA9k|p*EhE7GFdgW`9-ZWS@peJds&)+v}|Hz3OQLdDl4lF zO+#8JF*fzi)a`n=XX@1LifX>fMEB+;_|DlWLtr=xU#1KlgHJa)!-fcb9C1B_4jZ~< z;81fG_Dq|ikzE!yOs}ye!Yr*-ctcH_dd^waubGwHf^IpqLg9UNXn)-$yvS+oIJCd= z5*BJ&4G!w6cpNka9Jjsh`AMph>DG6I8XrD= zC8Dzs=j}N4cH0YinG77qr+=OChbcxW#wjusQxu0Nj!+z~`w(vz9 ztkqp_GYogmZ8rVj?9QGXyo7hkZcAK_;t0V%5y|*qbYx&;ARQe;PDJneiw#5%{QYNo KWIFo)`S(AxHl%|9 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/helpers.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/helpers.cpython-38.pyc deleted file mode 100644 index 00ce99eb8862ca08cd49c70739f21261d42a7b0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26000 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/http_exceptions.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/http_exceptions.cpython-38.pyc deleted file mode 100644 index 2aae3e94699f9dfdfad40aaee07be6897bd2cd23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/http_parser.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/http_parser.cpython-38.pyc deleted file mode 100644 index bdfdcbbd350cb9dd0c6b05bcba57351dbf7df32d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17985 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/http_websocket.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/http_websocket.cpython-38.pyc deleted file mode 100644 index d63958ac5e9588c5118fdc336950a7bbbeb5f6ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15164 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�oR%bPl^=tol!w>cGc~v7 zrj%i7Zn063Z;=SOjP?V09h@qxbo%L9o)M6v$Qwko8!Qla3S=j~OG;Dso>qB+9$%w1 zr6~-uXjpL_DVYt6o`Rjv!qTZkZ?bh*IVEhn)2GQ$ugqz*9eWra%A{i>U_VOymbnN1 z%)wVzXlq`!CPtwzPi1$2-XfZC)dI=^zW`!hloCAZC2T{Z=Y^EgdJmhr;WVLWV}fJb zts25kZ?}*u&{B22ILVIJM5ia@D|0y zQan}V#qo_n?bm0NCNkWXk**XeKkj!zrJtLwIIC;QYyeJ|7DsctjMJQi|PTB&08i=VahfQ z`$yCnc>Y~=>Mpn+A%_%7*Ss@&S7uM>QITCZSS5l}j+=Y01_U9rtdwp>6u>u}v`%-g z4M!f#;MRGcC9u8>FgdD1 z<9eQDd102}rryK{4fm6<(-%79!pXO>n!OHK4bpIBjI+O|HB;ViusZ4JN86UG)QLjT zE@0f1gj0;djn{kvP~0+}8JCPa5heKI7Jw140-Oynvxe4|Nhu2U?zDC}s)bQ#*p!|( zL59ZX$Cu1U$Z7N3mIF1xnU68pCpgV7Or5Qm1M?$~44YPpON7}xqu7RG5B6@ge0EjD z;>(^q_a~Yn--2TdP6xfsmqSkTY$rkHk)CT#x(&>lJFp2I2ZesN^6rP2t$-VAH&ym} z62%$;5v6Wncpaep%ILTP%#7PU&Uf#k_P=uSKhgrpfeb+2Jd+8y#wk?{0-m&kK;B0= z_aG5~|8vrJMjR93j$mUPg5Z5f}yCO3Qy13r=h zLYh=k!cCJR0mG#9RZ311sS^o_d`4u62z}jovW!}t>E2}G@yw*V z?O@A$fjq_@oMWDYN8r|1PP_sqs(KtLtjyS5Q{7cv_0`|J>~`A(pV=qbZA8dleshn6 zz(0j$z62tPqy-r^Z#tx~4~k$C4#P<_j3)6grsO*!Lm6EY8T}p%6G>0VApRTflH)<> z!e`~&#Ruwgs$BZKws}>GB17r@2XHh#UjU;B`WXh24nq}P#4?cK+dxJ#zK+0tPqkFK z3piu~r!ARY$HOhvmRoPBY|CxX*#;TzI*cB*MQ_Dm-X9_Ve_-m0Hv>-~Re$AB6(%Q8>7bRQ+qfcj*u0>%cV1d1c zTZqTxle$n$DwCg;d*0pgAaGGpRkcgBvQu4V!M#)?k82;6`4q^KE(wSF0;M)sg*V7W zHeMy3Ye{lKZt3wLbusr=BMul{Yn?L}`;@qZD@?E3&Z?qN8P?gjST=R%S0cAc8$@PQ z@meR~_?GBCy#6`a|7!HofOK>|J*)KSK$)?v>d|RsnS$u5oXIJ(z?#t>_?V53^3#z4 zgP+wR8;dh#Mk24yt*t-DRGYne?o!V4GPj&Rz&KMNgeLH7)5T*C_&iLx@hd zK>z>K_6Vd++Lq*ku7VpvA%Q1Eqn|;jalUjHhzpIfgFrvTgAb5k#0_~Lxg8*QZg2n) z;bLb4Iy6EXOceFj4-V=UtUq9xAAtZGvVwA6_%hzmH^@h;cu8+4C5zsY{s1_?CvSpR zV9?l-!Gp=shtH9CR9Y9*}V7TUN8F2btn_fVLKx>lvcj+<07 z zz)udyFCB=Ut|->#viT?li~hbSGgUAcS+;ITn3i=2nU~#F>oHh*7wyMz_5@Z_Ex@?g z-GFdy2S%ogZCHwl;@q`4pHy;MAm8Eqaw>|oq{X?cGS2ljn061Jof@k}X1(Pj7-Nm? zrm;a>_gi7q;oTR)caO&SHO8$G-aW{^)qI!5Ai#+;*qAAe(tffN^|~6*2QBYc_keea ho!9UkYHVUsy<4xh$*@bmZescd3u4ekN>lnM{1+NOigo}1 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/log.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/log.cpython-38.pyc deleted file mode 100644 index 5494b2169194f5019feca321832aaf53cbc0f406..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457 zcmYk3OHRWu5Qd#c+cXd!H;BZl3&I{Dgaiu~1qq>UB1nmZ#j6{tdczydv~OJxxq&U)o1VAZFt%gaF5?a#3=^HbPYZK0X1}s-~a#s diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/multipart.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/multipart.cpython-38.pyc deleted file mode 100644 index 6020f28b4bf968dfdaf2ccbfd8d6422ddb15917a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26342 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 AX8-^I diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/payload_streamer.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/payload_streamer.cpython-38.pyc deleted file mode 100644 index 59652f1f941aa2dbb406a20ca2753e9adb937913..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3242 zcmbtXTW{P%6!v|+&TeikB`pPwD3Em(HlhfG0)a#+DxfMLrBx+sh2wZ;6E|Ml%*-aF z+P75d1ERm6LhWOI2mivaJoPVtkT_?&o84Uc#H{9c?&r*RzH=sd*lc%6QxJ)?t(gwTr}&U`ymE??Wpi{X!k6HgtL3Bi$rrD=VHy2w97gd{4@v zEhJ}Ak8vD~#8DO#%DQT0C|Cw6T8BK5j4xGV8LVC1%roY%;0`E+l}zv1|;CU}RfaTU~LRq{%)baxW1TIzuGX)dUj)Jkc(4AzO=x*~;=V zes+?qo%7vgoLF3%xW>qo@fTgNI-zh3)#~D2f0uO1b32+5j{w+FC>ZLm=%(2S6FQ;CnOvv_--F~B|YyogoU>0+oidl9hLQU z#5USVS?O*>X{uV*-6WQ!{Qx+`UhA;j*UPKxJHVDGmRpK5j}$L_qpS_7TQ-V{!=XGX z7;JDyV3W$+S-zqH(qS68kMCt4wR$tC!pJ%Z(VHvhfs2fnl zO%PIhsSos5`albffdSGSm>?~xZD}Vuf@tGyMOi-$Q{IGqd>X|J2-GfE+C4XXqVcz2 z_V1rJRyq#_3*j{x&(~)94zw9^OraHRT$^jQ6LPJxCSjW zI0hPqVHOr~(_VIjwu}GyZ9KY9@xkGX?dnK@}??E+@DmvoRzy zkR5(CptCuovs=-bPr(5|VWUFuQitG0Hc;6O5E2|gb!p)7zneNZ2T6;r@U6`!pRJ9! zK@xaNSixBwNk*4QAChAA0PM1i@kr)ekR%flQuS-Z3j*2`5-69l1C|1-T?nHr$snRE zY?bqOhsQy>d{j*-qrrCNY!wz`Y!$4C{HJI-!m8<(Zs6}<$9^(5GPFJ7C9vo;s48Y+ zVj2~6E~5S;RDtUxauZ^AU>utx9vaG9l~rbC)%eJBrXdx+#KVRZoHS_2y*kGf!QVyk z9*Qx|6r~i+@Mdr36}tBhRDoMv{idrNet}PTyER;f3MctQ4M>0{wIBgnR0k*9<<+fW zepcykn4CBH0_=QqETe}8+Do9ztBdh_qL)s15T$*_kzx}8q9WE-*VM5fT?=a$XN?h$4{a=W_rm?ak?5FLl^!CXI#z+*+cW6(J;ASs&9^~q#t zl(y)@!=%!VZ&ftB4ZFwm2Egl(2GdB0FdXMbwc{S@8FKR48GBD7<^TAae}tA?;%1I6 z`e8!(m9xqf34HgwcU26G6D%H5HivhM8Rq#3IxV4Yl^A?zeT&LeTo?-`#}WTZSqnp& z$FOT2*S-&;bl?SsJXB?MbVU`1ND7tiOEcPuRempP!zYs0aT5QHzysBDQ>6xsN5wIv pZ^E=wMwaeZ)g$vYrXPV}Wi7Zm#IDiMXAR4oo|$es`n>Jv{{d2z&T0Sv diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/pytest_plugin.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/pytest_plugin.cpython-38.pyc deleted file mode 100644 index 520d42cf9ea4301ebd8aad148ede83ac7ff9d06b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9886 zcmcIqTXWn-c18mj%!R`tMNzUSYh_sXk;$=qi+2^RZCSEnZ*6Etl5beqV{jTnf}FvO z8yHd?50j0lL{xTdWwRA;s^U0gUQ&9*UUTlX2B^mC!7g6hc${$5p&JPWV7Uynp4h{?9Vi& zoBN!7s9QYSm}%~J_BUsp+2#S~K=Yt;u=$AdNb`_$s5$4%H4i(FGObIyu*MPR$lF?Q z$ke>=tQEw+Fpd6k<{Wuf3-ou=Sx23tL$m&)KkKNP<(b}ux6j*O*XOil=4HJDa~jp1 z$9RtCZ)uLr3w#2GZ)w}iIWAizJ|$ZxJhpn0PxF1UbxO9*@%?=E7Q@`r z`~W|Q9nSDa_#yn3`5Zrt-?MU$NBI%C>IvEU4nHbe^Ro3Aw`J?FY(378$<~5w9p@)x zt0G$``6=0YQnpU>GqQC~w#xjhY&}ISPg{N3%X^P;##!B%)A$pg>wKOs+%iGwGje`~ zKPl%w%h@%p{M45u8jEEX=PtR8hP%}8%Gubs7;MJ*iyN*VQICM6Xt8PsEc~-HoAUf$EnUz86HXtS8fojaI8&t+j&4yBWn(p%-=9 z)d+K|G!V~3o-253BN*zN=mee6Tmw6ci(i!%7F@rz5=HHWx*LM*5WMoLk?43=x@Scvu!+vlra@2G zOPe+ax0V`yux#Tn!nJEFUTrNb8?og|*2P)w)!j}bip>?T(e4htL7p}v-w<2vO=@<} z58koiM=N&N_G*6Juh}$u-d3~b?an&2=k2Jq=C|yYuyOrgJvt!X3+U<>Xwm}rmO9Jb zBdW{x)^QzjH(L(a%@+5{%*nf)x1>nmvaPl&LQmYI&Hs~=rDf8$NG!y7A|<(9Z{ z*$daAR{O?ME3&<2yV3G(-T`Nt?eIng`>)^lp}%w^^doPf?bg=ZWiPyuu=UCIro8EP zqqFP>mG)*lo%HnIe}b-(3XPdeSO5OovL0R+Hs*~;1c|$mJmC^5bpLm>i0uFz#4Klb zSTGyuyT*>T$HWP)qiu5I8bI@o&P~iV*RtZ(o@S!PGtUEQt0q?Ix3$~swq7>~3UB4M zSdaCzD&Q58lk2Wt^CG*`#s$&w?7Dw5>Ikn=DA@SB*l4si(!LOvW-obmttDEW$Pc`* zVqb+|_1lAqeqg)7(2Z5(Zr86Y##!Ng*ujhLG4VJt08jtVL@k5oF+AZqiXQM}PTSIV zOff_C@8hUFeO1FTPehCx+w5c3(|2{Q@3A}DjvtGAd;K&AM89if< zF>OcNHFwxzL0&~A3XE$+3wfZHu- z*NSJKrunDSDJ0zB7HPi?ekk=*3rOkeqSdths4~I7Daa&^lG4&5xs9i z*-b6dVVO=So1^RvQGJgsLU(7Nh1E_F`3=An1l)_fIA5*00d%}tjc2Yw`sI0E0}4n; zl!|f>7^*PL0C>tSLAMa+>pqay?|On0Nkp3l!JcL%*8OfG{|QT~5)LaD8m*e!2w$jd z2)Et##Gs?URoRM*$)dn*dSRS@mB?lwA}Q-pf;SBjH(zc_`WY{sT5 zmc!Uu+n`^0W8w*n+%sa6;NL0wVO83LD$e9ghLP~w)kOTn8QMr5F`E$jI(ot*C^VLX z{#uy=Y4CkBQ_xMLpqH!yE9u>n-|EoijChJ(Kt55Nl|=Zhc)uU^btN@WaSqf=E|hhr zkenRAE1stH1Y+VG6_V81hrRrJ7!D7i&@z^u(=AreEyL7J26~yPPut@6FgAiTWP1o{ zF5wA_C}Gmk z=$=HWx3%ZAKhmyh?GDO@*?b}8^Fv6dt=3~tt3X+t^+#&t&!jK-gZR*ya*FS zzP{pzFxWoX^3=q_gl+f)dy9ws6 z;R)&9mciEd4ii&XVeP;|lWVIw0sbfKXZnYxl*!{CZB*)h0}|2nw$7sg*ToB3vI-0d z!Ne`Rk!=74bMW>&*!#`6G|I);0%x0U1fNl_oD<*2%g5!maG?R_5_rCFhX^De&C+#N z__{k^1-jCmR1@x{uHXRU28+9gKH5t8V<(sR(bjz7qb)%i7i%#KV^#nb=F+=}OQ5^9 zlI|YH#e{mvU-1$xGr)n^Ty6Q}_vQyvb+Ivil0)A_?jK{L@GuH3Ut$)+>Atoy7dTU%xN@5TjRWbXDme)yYCjEg|^qX`B*k+!XEp@&)#+zWYmI*smNQO?ObclVv;{_9JcGB1XHmeP zfn+ziENT8DorVNM(`T8uj^7b& zrvnpX=%@$MM?5c@_@1Q@kYmqD0K9|%H3GL}ydX(MP?p}dl<$8n)nNRe) zl`Z48R%gni#q9iQK?1YcGj=D?F4nc4`6*b-v;p)EYCH$V60YRCFGI(MSV$N*;<};( z5t9oiuWq|`K=9G9Q})?#bs80E8RN;eXd!ZH2`Ly-h!({n4m`q+6#S%zM^@V>@S7&^ z1KE&^!jH^PSNYW zu60lKZ;;kiCFOl*ZLsWmc~X2AO9lBAL&78Jpcq=bC8>b*mmnd<+$mNQ*ToMYlF!jn z>8cUN!x?&)I!L3ONol(vx{6C>>dTRDES)&%KDA5(sJt}2$cj)icxZa@ zYu(7f+kxlvwPl{t#e0}F!gfOOEFP(P|Bea=NXbB=M9wqnY*k-1wqW!lb2Z~LNS(#C zwY+#XvR1P_MCBJCf3oLFl#@N?1%kN@?A29nZ82X%n89}QJiEs(Yws;?nLTs2z;k=7 zsBL9XpWyjDM!h{90n9)2GU9`%$O}C)nuOGr_TX65^@AusW`X|U2at7hPU{&xyaz39 zb&4}NbDCxj*6@i>3;-=ofjmI0QWSM5h@0Y3oHVvn%pGTB%nkWzG`a_pcw7y=I4_4@ z{EE$g#a`^{_KV$9Zw6}tVX#Et(~PMHPe2)Oha)v?LQEdlSVu#91LF7SKVC zd|Y^o!UJU)-=K-+nztD`6G#96!!V`m#g+^q!m@?Lp%=L%_fCcm6gpG#Fjd7U-wU05 zzbdZMb~%a^eBtqNBn0bZA^<2#Arx{fklyfLu_h$F(cpKRdI7SS>p$d;mmsYL8Cg(f zpadIhW$;Ux0^noez6h{(#9R<^_TAD~(ddzpH6nQGDwK^9AL;H1NR=+mLdFcjPaq|k z5TGh@NG6%&A>^Z|-|U{eirkfuP)GRY1~rcWj-uE>o~0t;>pF~z#DVw#BD|^`R<^IL zE^i-5i}N%lUG2CuIt{De#|&jq$@fN*MlB@eALFis&0nHFETPa~NDJT_#WDpZ$7Y2iUKrF(EjBDM-sS~Y_i^kh`euGK>r4gO@IPq}S&_aJN#be4=Tc*Vwe z1)UNnux+^@=rsu!fP4>fA>Q{!0{?v}jwcnH5@n2!zU>EaYr+R6CQ8tvS4d`-0&ipJ z72-ppK^GKFiH9-mO$_`Oo^Tq424PD@k3>$;=m;26_}BMCX3`cO-W5OS%-YPmrqGS_9(JxMzqf=!{KrbmN(HQ`nNk zF9wS2f5_J3vO%Q&3Xcp~>6kLd_G>F6XkQxQabyyAh^T(BE6AhH;C*R`N$nAq8|WZ1j^hbmLb0sf zL43pY&(lN|e4Sebasx;PF_OUuOFWz+QeYZfMSWXJuXG7>-S@93l&7>@O?bE^+qJI) zj8wK-IxeKx^Y*e2yd}2=8JWc6PT7s*DB{917?`)uo>jS&vUH{waf#+g+L{+lToxR#_cB|BmLvfBl92DSHiu=~WyE87y6aRu2Gl&sY>c##*V-WkZnI z#zpc0B4m+dM&6?2QNYWlW1uGflxE|*62L=ExToCoIIEhWx)$j*=*zABbQd{H*MJ^} zp#vix&A(&O0C#38zdJpk~YmY(cGX?i70AUR^R@f{#j zYqUTXi3cK#+xQuxE|(^=@Xaaln}KiLzG|uS4CqUzW2cj}p&^+jc4*hT{jL9;YV!1@ z(SuIVTV!Bjnfk0{=`*JID@-1dPR#jsfKW+wcN`ED)#F$oZW39WRD6V@%;c+wG)PiB zA?4IGYeM&?fO`G%ST@0A?gw&(b}NDA3VVt_BAi z2q|(ccd+XJs6XN-M2#fm(|(OaL<;%^B8eD8Ust*(eiJ#V&WOLH#XqA$?mEztnFp88 z)Ba04+0Js~^UTn9mC}&8 zvdECZT;XHoEizYZ7s2|FxypCHc$j{Xxl$im`^q(@M>Y8w_F)Dpy~1RM0+4Yf8=ExX z{`f@t7(J=>s3vAG6KAW)_#mDT6|hSDf(kN1VuYo*0Qn`CWb^Owg#U(u%woj0by1Nu zo!Gdohm{^oVI9Wt3z)-C*%re8Eh8wxdp{rHTOGxIYCcx3_gMP}7-vzYN2~=?VOANL z)h#o!dS<`RkbRlpoLp;Q?PnMttVzeGBU~Y}D2N|boY~9l<_D$>#;wrHNKZJU9KczM z%I$Ea)oF10n1v6e(WW#&-MKVC#1xfui#FRHVnR`#hzow0h86NFzL)?@#3YKibP?%0 zL5TzvyOHe|Q&gS;1!=Y*jEW6J%8Ioosc(RTe@D$xZ$Z7}b)w)9Mzw;O(SJ>G7saUX zvwt;nMEVZ97#jf-lKyXnh~MZts8|1XG^AILqoML0)DAx;;veuG_OPnVu9Tls(OV%& zJU9F$6_iY++0<4LR@|kU`d=pKg;#ZkHv$x&fZO){7`@8JJF5E3JqpfVj5`i~O$ z-v%mLBwON4q(kr&7x!BmRVnDvEgGwI=!G zN_Rd$k285uz5J5Y24SO5e(`g%NlI=g@-8K(Pd+*g5_mFiE7N8&51|x^0!JCzD7THg zFdF;49cOdsY$RWN@$mbE06{mAnZYFmOJrj5)@#K@ygGrr!Cn)Pu{JM0` GWd8&Dzqwxk diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/resolver.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/resolver.cpython-38.pyc deleted file mode 100644 index 9c4668c910eb23b551d0d6413843d1d6e3660e20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4011 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/test_utils.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/test_utils.cpython-38.pyc deleted file mode 100644 index f4ea876d2703c5725a45b1f562e4f1fbeaa9e910..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21513 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/typedefs.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/typedefs.cpython-38.pyc deleted file mode 100644 index 6a13d4873ef05cc929549fae726e91d76611cb59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1512 zcmZWo+fo}x5Z$|0cL4&M#9(Y3jGS1Goy$Wil?s;RK+LTKN>#>ksTOSm3p+cTnH5-k zL4GAal8>0zJn@nb$U~f-5g3x})SkYc?%C6AKJJD=rg{@SNv`o zMred)Y>`4wR!hOwbLIKw* ztg2X8(2Qp~dq(S@BX>dBVKFQzhW0)OA6ftNWA7K3`y5_`MP2<1$c1Ixi5FI`m|yBz zRbAz)(A+Z`wM#YN?S?PQ`#-EO=57J&s#xlQl9z}~J$eHK>*uaaeMJxIbBoBG$Y z|IOe})YmBZ>!;Q?{hq+i{o~OQ>(~PD41C}iTO=A`a3pO03n1!(M-qE|CX|F6vKDw`igA?-&AY0c+V`^1#`}-d!Ff8 mj`pfZ&6-9_FRNmzwP@DOk~L>qX8pZmTPSh;ZM}EAY3m<2te;T; diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web.cpython-38.pyc deleted file mode 100644 index 90032f5f2c5fc08c68d32ce048b0318baf4f0745..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9975 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_app.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_app.cpython-38.pyc deleted file mode 100644 index 5666fcb5fa945141214e6c66ce4c71c04c54f510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15346 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_exceptions.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_exceptions.cpython-38.pyc deleted file mode 100644 index 4b565de7abf048ebaec449d6bf9b76ffa5e5b94c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12033 zcmbW7NpRd&ddC~x=!L5&YPTe-wOMXkq9jYQtkt9_YOzU5Ba*V+rqc%b9!ZGZ4e9|c zi8Lokja)TzNK%t!vWztusb-RjQb{F;98#4-4s*$V$t8u#EtLZgIixBxUZyh6|Nqbn zB$9AovhX#2z=!vL8{Yfg>z?T9YESU*-u~$mg+$^%G=xkV=lwX`FH(twNC=~xDDpE| zHY&+tvXUyMDrV8Fq>JfFrkJT@i&=yBQ{`Nxt=NWhQ>4r7m5yRZrL)+nIaBVcbQimE zo-J;;nh-hB_HjbA$!^*6&@67mm3GmAD;;vs+$p-iU79z6yTu0Z2F;tnJz^tx zqudPtE#O|U3A{=3R`6!A1-wP`Ht<%l4ZKbBcJOww1H41?4)6WfZ6ZCe0^I|V}uiORR4c;gAgZFEG5qv-#1RvDA2mF#a1U{rW4}Mt`zy+P& zUhpg8Rq(6&{yy+waRhus^L}ujI0`Ttei{6RI0HVTxd1*Z&VkQqeg%A9TmWCt{3`gOcoY1l=ELBAF#sOWd<1++ z41xzW_kk~qA@Gpqqu?vzD)_4AW8iDzI{3QgDv-vGZW-UGj<`3$%y-Uq+0`7C%+ zd;tDH^EvP@i4wS^`8@bTVSz2p7r;|u8a%D}B3K9smYUxL&xl#@tZuJ<@SL#0w(LiH z4S?^6dGNgEOW?AofGe5@!Byda9nF`)3*s*LuI3@I5-!-)dYi+XdfP z@NB1QmHpJ1^a_Tbnz%K*V&K6-((fF099LeGmXONzb7P*mp>P{sxm(g*aH_5>obkJ^ zjgQ|PdN3_@N`9M0r5xpN;OQ+XY$d0u;&=1HSZ#V*y6#M^>}SX~=KT(S4k~GRQuv*O z0r)JC_K-%M>Ojq#bCm5_o_$YVug*BCf>Wfa}VYisZ_RL3yq?wQ4l$wTa#!g zU9O3$6;#6#a4$=PfS$Z+5##X z9cBdG%^F`^kp7FIv~F3|S&1@^p&0IrtqZ9eXz0NL`lc>iJqtQ(Beom#TG?!XZGq5& za@c#BLXg3r+XN3^mJ70qdY@hlT4!QmR^jDo7F%aFTj(M|3KeZNk@ zTX@BmW#KmKL>CdA;vQ;`IYPq^%UP>@OIj}8&fon5|b89m*_B7vwF%Rz!nqI#gNM+~&UU7k(?PXhxO7Fg-=GX3_(;WN4 ze>p%u4tEkpCW?kg6qCXzrbM!6ic~R;sHgFtew3COncb0q&B373ERTm^yzQo^^@zJMgKRZ_+K{FWP&@R3?

POo_v6}2Co1I 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 Z8Q2Wi#Fenu&S%K%>3ohGz6aL2{(nmA>yiKf diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_fileresponse.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_fileresponse.cpython-38.pyc deleted file mode 100644 index 85759613ce6d19dcfead7d4fd5cc85465f0fd8d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6056 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 Y&j+Of+`5cs&MClkEu&!0n2YBB0rS)JkN^Mx diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_log.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_log.cpython-38.pyc deleted file mode 100644 index 6ee55d6d0fa7373e29d8f290d795dca183213f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7145 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 BHJ|_h diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_middlewares.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_middlewares.cpython-38.pyc deleted file mode 100644 index 96e3315d46639f3a61ac19e7309095faedf83821..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3901 zcmZ`+TW=h<6&}uIcePrrWmy-?cHC(Uv{=-Ub7_IV2+|m`T^nr_S5}&Kpma1Ea;357 zvL?AwB&>jxj;raH< zsi~$#&(5{@c-pf5X*y$79qrFh)W1=2i?h@U=xwJgvjaPG0w;3=H}e87s|B^J9@Lq| z9qy)$Y$BL2Z7*$Rlfh)x3RnrJOr;xeB*^7uSocvcIp@Qdg#LeeFE8Is=N?4i}U z@(LcXRywtEYVCIq?u5(t?kxZE{>m@PiCeo-qNB}Jl#S&mO-;*N>-X@%UEAx4vQG7H zBKe9zLWh<0dr{6)Av<Ob26+Dq5*5yP<-#;&Q1WjKRPx?Y>G}{lg z6j8P+RIkVt4NgAXQ(9!JMPCcZYi0?D=-o()axpI;H%<0M*o*XbcsfMuZuNR;5=S~I z^3n_M_Vc*olyzBcRl2mItVyB!GLLOCefYR|J1GA^QJ^6lVqAC)l`x0h+s0zA{}psN!~4j_O{l&P<#`M9$C_HI1_RST8HTJ|if*-h54 z=oI-7dUV}98)0Nfm!fJ7@Vdx(sM1Jnmn|tWz;M``%7ok+c7!V1atPQk#$?s; zLc=_?Uu{?jM(QT2L#wDAIxXwK9k^;K60L0 z&)IYPxzly&a(UKz$_~7N2M2i3A0YB>6zf9n`Q1YLJz4O6oa9@6El@$1`Y|yM3k$W<}(ew=ilPo$2OH;uvE(^Nol5Wn6HbG=%uk$ zw~Ib*h-!{dKH?J+dTA63?r-k-fctRoHRv^_b`^nGpnO#nIlU9@caxmsTV;T;>;zqA z%eatqjih@^K8Y(N7t&9ja2`jGhAWJ6Q=_o zcFqVe6GrPk>WptUT>O@8%}C{```wZ2;G8O2{M`gPMcniw&cAcZfn##0M&%A{HYsgd{C}A!Q*egh9%gtrImaY77BJTBRmV+_=l%-4?mg zAQyrQZnPp0tD-Msf#dVJ07h_<#(ifXN@q{-AA;Tpii-@eq}jM`;mwgphlflKj{3U5 zHHxf}0$Qhryy>u!A=l5EnDudj@a4wcC{6{C{| zxGRe)4;W#mUKpwR#`Q&RqQkpB1bEg@b%Lx-xKbkS>tyFNV3V9SFmlbUk>m(;6SZ_J z>|a}s@*H`?MA%6{jY6zCwU>@bPGx<&O8?cxIG$UHZP9i9H@X<#$Gxv9yCS1%=c)Zy zCg0t%4s5#pAGwcf@+Q5HJY^8BBf)8Q;Ds+pMqT zGx^=2BflHp7ne540TVctGq7)4Uw?eyn0fU|KlCOC)&N#lECSZm4y-{70v>9SS@UTK3*IjX;Dm_^w@epD1IRobpsq~jV%YZE$DsEaE5 zSMxpaH@O$I4g7|gRj8nGa>>1PtHkL;LX|U33MG~zDP5Ot0zUEuTIzjNmOaf})?_oR zX}cg0E}Lc3tc^0m8tfuUo6Xo%&tl%Rz5nA;-aE?#mp(}ggtPi|iFW9CW&762b#;es zD?XuD5aH8Jw))a=OZfpUGnSC*#vF-%8de9zuo>%G6GX^n zSFf7y@;nXNa)D<54;P|n@lYHTMPx%;6;0rbNJ1B}z#T&m*nn8OyCUDktTz}e$sihK zqU=L7fGF#j9Rk&Vxx&C@PZ9MMh}X}oUt6oz-@&%%{adhF$Ym=~(ZJ`N5;~0gNVvHU zffjr>6qL~Ll2vAm4zltFMk?NAx7q%W!fx`-h$M~)I&(DcTaRMsr&A|?1mP8CF8)8k zPiTMQU>394MOXe5t9j~&c_j=$ml6)k|$&v`0B$rECBI$|>8kmK=(^Uo(L7Uj` zh=VIh&Xtoiags)cX~v)^XjNaT|1Snk!Fl=w>dzB}-~nlt(gb5Y43TKUFsRc6xYj^J z&Ok6?QOnZZEQ-{Gpz#g<8GJta_fuhsOdF%VqjM-5pJZT(srZ!0wIUESm~XcbLM{5) euIHj|IG0+}-mGWCQTYAK1x)EzWA^LTz5fD6g&wj1 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_protocol.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_protocol.cpython-38.pyc deleted file mode 100644 index f1c6d13f8b6ff88e9a077f7c46d5e461c9468c48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15876 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_response.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_response.cpython-38.pyc deleted file mode 100644 index bbd32491d999a6f5d3ea03412aead375332a9727..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21255 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 CrU%vl diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_routedef.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_routedef.cpython-38.pyc deleted file mode 100644 index 308c45a84e4fafb4fb2a454afd74ea220a69fa06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7771 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 G#(x31;oqbH diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_runner.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_runner.cpython-38.pyc deleted file mode 100644 index 7b2dba0dc018908a11f2fad39f00aff030af8ea7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11739 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 diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/web_urldispatcher.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/web_urldispatcher.cpython-38.pyc deleted file mode 100644 index 85379edb522b7b3a2af6c04a6a2b037be29499ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42216 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 b;UV&gJUmU96Q_F#2gR^R8x}WA?@RnIpx;@E diff --git a/.venv/Lib/site-packages/aiohttp/__pycache__/worker.cpython-38.pyc b/.venv/Lib/site-packages/aiohttp/__pycache__/worker.cpython-38.pyc deleted file mode 100644 index fbad1c55fc405b7f0081c2b1c900f8af7c6b9ce1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7053 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 -#ifndef offsetof - #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) -#endif -#if !defined(WIN32) && !defined(MS_WINDOWS) - #ifndef __stdcall - #define __stdcall - #endif - #ifndef __cdecl - #define __cdecl - #endif - #ifndef __fastcall - #define __fastcall - #endif -#endif -#ifndef DL_IMPORT - #define DL_IMPORT(t) t -#endif -#ifndef DL_EXPORT - #define DL_EXPORT(t) t -#endif -#define __PYX_COMMA , -#ifndef HAVE_LONG_LONG - #if PY_VERSION_HEX >= 0x02070000 - #define HAVE_LONG_LONG - #endif -#endif -#ifndef PY_LONG_LONG - #define PY_LONG_LONG LONG_LONG -#endif -#ifndef Py_HUGE_VAL - #define Py_HUGE_VAL HUGE_VAL -#endif -#ifdef PYPY_VERSION - #define CYTHON_COMPILING_IN_PYPY 1 - #define CYTHON_COMPILING_IN_PYSTON 0 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #undef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 0 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #if PY_VERSION_HEX < 0x03050000 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #undef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #undef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 1 - #undef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 0 - #undef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 0 - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 -#elif defined(PYSTON_VERSION) - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_PYSTON 1 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 -#else - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_PYSTON 0 - #define CYTHON_COMPILING_IN_CPYTHON 1 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #if PY_VERSION_HEX < 0x02070000 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) - #define CYTHON_USE_PYTYPE_LOOKUP 1 - #endif - #if PY_MAJOR_VERSION < 3 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #if PY_VERSION_HEX < 0x02070000 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #elif !defined(CYTHON_USE_PYLONG_INTERNALS) - #define CYTHON_USE_PYLONG_INTERNALS 1 - #endif - #ifndef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 1 - #endif - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #if PY_VERSION_HEX < 0x030300F0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #elif !defined(CYTHON_USE_UNICODE_WRITER) - #define CYTHON_USE_UNICODE_WRITER 1 - #endif - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #ifndef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 1 - #endif - #ifndef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 1 - #endif - #ifndef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) - #endif - #ifndef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) - #endif - #ifndef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) - #endif - #ifndef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) - #endif -#endif -#if !defined(CYTHON_FAST_PYCCALL) -#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) -#endif -#if CYTHON_USE_PYLONG_INTERNALS - #include "longintrepr.h" - #undef SHIFT - #undef BASE - #undef MASK - #ifdef SIZEOF_VOID_P - enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; - #endif -#endif -#ifndef __has_attribute - #define __has_attribute(x) 0 -#endif -#ifndef __has_cpp_attribute - #define __has_cpp_attribute(x) 0 -#endif -#ifndef CYTHON_RESTRICT - #if defined(__GNUC__) - #define CYTHON_RESTRICT __restrict__ - #elif defined(_MSC_VER) && _MSC_VER >= 1400 - #define CYTHON_RESTRICT __restrict - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_RESTRICT restrict - #else - #define CYTHON_RESTRICT - #endif -#endif -#ifndef CYTHON_UNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -#endif -#ifndef CYTHON_MAYBE_UNUSED_VAR -# if defined(__cplusplus) - template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } -# else -# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) -# endif -#endif -#ifndef CYTHON_NCP_UNUSED -# if CYTHON_COMPILING_IN_CPYTHON -# define CYTHON_NCP_UNUSED -# else -# define CYTHON_NCP_UNUSED CYTHON_UNUSED -# endif -#endif -#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) -#ifdef _MSC_VER - #ifndef _MSC_STDINT_H_ - #if _MSC_VER < 1300 - typedef unsigned char uint8_t; - typedef unsigned int uint32_t; - #else - typedef unsigned __int8 uint8_t; - typedef unsigned __int32 uint32_t; - #endif - #endif -#else - #include -#endif -#ifndef CYTHON_FALLTHROUGH - #if defined(__cplusplus) && __cplusplus >= 201103L - #if __has_cpp_attribute(fallthrough) - #define CYTHON_FALLTHROUGH [[fallthrough]] - #elif __has_cpp_attribute(clang::fallthrough) - #define CYTHON_FALLTHROUGH [[clang::fallthrough]] - #elif __has_cpp_attribute(gnu::fallthrough) - #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] - #endif - #endif - #ifndef CYTHON_FALLTHROUGH - #if __has_attribute(fallthrough) - #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) - #else - #define CYTHON_FALLTHROUGH - #endif - #endif - #if defined(__clang__ ) && defined(__apple_build_version__) - #if __apple_build_version__ < 7000000 - #undef CYTHON_FALLTHROUGH - #define CYTHON_FALLTHROUGH - #endif - #endif -#endif - -#ifndef CYTHON_INLINE - #if defined(__clang__) - #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) - #elif defined(__GNUC__) - #define CYTHON_INLINE __inline__ - #elif defined(_MSC_VER) - #define CYTHON_INLINE __inline - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_INLINE inline - #else - #define CYTHON_INLINE - #endif -#endif - -#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) - #define Py_OptimizeFlag 0 -#endif -#define __PYX_BUILD_PY_SSIZE_T "n" -#define CYTHON_FORMAT_SSIZE_T "z" -#if PY_MAJOR_VERSION < 3 - #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) - #define __Pyx_DefaultClassType PyClass_Type -#else - #define __Pyx_BUILTIN_MODULE_NAME "builtins" -#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#else - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#endif - #define __Pyx_DefaultClassType PyType_Type -#endif -#ifndef Py_TPFLAGS_CHECKTYPES - #define Py_TPFLAGS_CHECKTYPES 0 -#endif -#ifndef Py_TPFLAGS_HAVE_INDEX - #define Py_TPFLAGS_HAVE_INDEX 0 -#endif -#ifndef Py_TPFLAGS_HAVE_NEWBUFFER - #define Py_TPFLAGS_HAVE_NEWBUFFER 0 -#endif -#ifndef Py_TPFLAGS_HAVE_FINALIZE - #define Py_TPFLAGS_HAVE_FINALIZE 0 -#endif -#ifndef METH_STACKLESS - #define METH_STACKLESS 0 -#endif -#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) - #ifndef METH_FASTCALL - #define METH_FASTCALL 0x80 - #endif - typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); - typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, - Py_ssize_t nargs, PyObject *kwnames); -#else - #define __Pyx_PyCFunctionFast _PyCFunctionFast - #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords -#endif -#if CYTHON_FAST_PYCCALL -#define __Pyx_PyFastCFunction_Check(func)\ - ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) -#else -#define __Pyx_PyFastCFunction_Check(func) 0 -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) - #define PyObject_Malloc(s) PyMem_Malloc(s) - #define PyObject_Free(p) PyMem_Free(p) - #define PyObject_Realloc(p) PyMem_Realloc(p) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 - #define PyMem_RawMalloc(n) PyMem_Malloc(n) - #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) - #define PyMem_RawFree(p) PyMem_Free(p) -#endif -#if CYTHON_COMPILING_IN_PYSTON - #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) -#else - #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) -#endif -#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#elif PY_VERSION_HEX >= 0x03060000 - #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() -#elif PY_VERSION_HEX >= 0x03000000 - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#else - #define __Pyx_PyThreadState_Current _PyThreadState_Current -#endif -#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) -#include "pythread.h" -#define Py_tss_NEEDS_INIT 0 -typedef int Py_tss_t; -static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { - *key = PyThread_create_key(); - return 0; -} -static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { - Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); - *key = Py_tss_NEEDS_INIT; - return key; -} -static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { - PyObject_Free(key); -} -static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { - return *key != Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { - PyThread_delete_key(*key); - *key = Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { - return PyThread_set_key_value(*key, value); -} -static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { - return PyThread_get_key_value(*key); -} -#endif -#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) -#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) -#else -#define __Pyx_PyDict_NewPresized(n) PyDict_New() -#endif -#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION - #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) -#else - #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS -#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) -#else -#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) -#endif -#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) - #define CYTHON_PEP393_ENABLED 1 - #if defined(PyUnicode_IS_READY) - #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ - 0 : _PyUnicode_Ready((PyObject *)(op))) - #else - #define __Pyx_PyUnicode_READY(op) (0) - #endif - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) - #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) - #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) - #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) - #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) - #else - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) - #endif - #else - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) - #endif -#else - #define CYTHON_PEP393_ENABLED 0 - #define PyUnicode_1BYTE_KIND 1 - #define PyUnicode_2BYTE_KIND 2 - #define PyUnicode_4BYTE_KIND 4 - #define __Pyx_PyUnicode_READY(op) (0) - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) - #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) - #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) - #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) -#endif -#if CYTHON_COMPILING_IN_PYPY - #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) -#else - #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ - PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) - #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) - #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) - #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) -#endif -#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) -#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) -#else - #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) -#endif -#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) - #define PyObject_ASCII(o) PyObject_Repr(o) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBaseString_Type PyUnicode_Type - #define PyStringObject PyUnicodeObject - #define PyString_Type PyUnicode_Type - #define PyString_Check PyUnicode_Check - #define PyString_CheckExact PyUnicode_CheckExact -#ifndef PyObject_Unicode - #define PyObject_Unicode PyObject_Str -#endif -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) - #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) -#else - #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) - #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) -#endif -#ifndef PySet_CheckExact - #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) -#endif -#if PY_VERSION_HEX >= 0x030900A4 - #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) -#else - #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) -#endif -#if CYTHON_ASSUME_SAFE_MACROS - #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) -#else - #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyIntObject PyLongObject - #define PyInt_Type PyLong_Type - #define PyInt_Check(op) PyLong_Check(op) - #define PyInt_CheckExact(op) PyLong_CheckExact(op) - #define PyInt_FromString PyLong_FromString - #define PyInt_FromUnicode PyLong_FromUnicode - #define PyInt_FromLong PyLong_FromLong - #define PyInt_FromSize_t PyLong_FromSize_t - #define PyInt_FromSsize_t PyLong_FromSsize_t - #define PyInt_AsLong PyLong_AsLong - #define PyInt_AS_LONG PyLong_AS_LONG - #define PyInt_AsSsize_t PyLong_AsSsize_t - #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask - #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask - #define PyNumber_Int PyNumber_Long -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBoolObject PyLongObject -#endif -#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY - #ifndef PyUnicode_InternFromString - #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) - #endif -#endif -#if PY_VERSION_HEX < 0x030200A4 - typedef long Py_hash_t; - #define __Pyx_PyInt_FromHash_t PyInt_FromLong - #define __Pyx_PyInt_AsHash_t PyInt_AsLong -#else - #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t - #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) -#else - #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) -#endif -#if CYTHON_USE_ASYNC_SLOTS - #if PY_VERSION_HEX >= 0x030500B1 - #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods - #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) - #else - #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) - #endif -#else - #define __Pyx_PyType_AsAsync(obj) NULL -#endif -#ifndef __Pyx_PyAsyncMethodsStruct - typedef struct { - unaryfunc am_await; - unaryfunc am_aiter; - unaryfunc am_anext; - } __Pyx_PyAsyncMethodsStruct; -#endif - -#if defined(WIN32) || defined(MS_WINDOWS) - #define _USE_MATH_DEFINES -#endif -#include -#ifdef NAN -#define __PYX_NAN() ((float) NAN) -#else -static CYTHON_INLINE float __PYX_NAN() { - float value; - memset(&value, 0xFF, sizeof(value)); - return value; -} -#endif -#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) -#define __Pyx_truncl trunc -#else -#define __Pyx_truncl truncl -#endif - -#define __PYX_MARK_ERR_POS(f_index, lineno) \ - { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } -#define __PYX_ERR(f_index, lineno, Ln_error) \ - { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } - -#ifndef __PYX_EXTERN_C - #ifdef __cplusplus - #define __PYX_EXTERN_C extern "C" - #else - #define __PYX_EXTERN_C extern - #endif -#endif - -#define __PYX_HAVE__aiohttp___helpers -#define __PYX_HAVE_API__aiohttp___helpers -/* Early includes */ -#ifdef _OPENMP -#include -#endif /* _OPENMP */ - -#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) -#define CYTHON_WITHOUT_ASSERTIONS -#endif - -typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; - const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; - -#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) -#define __PYX_DEFAULT_STRING_ENCODING "" -#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString -#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#define __Pyx_uchar_cast(c) ((unsigned char)c) -#define __Pyx_long_cast(x) ((long)x) -#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ - (sizeof(type) < sizeof(Py_ssize_t)) ||\ - (sizeof(type) > sizeof(Py_ssize_t) &&\ - likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX) &&\ - (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ - v == (type)PY_SSIZE_T_MIN))) ||\ - (sizeof(type) == sizeof(Py_ssize_t) &&\ - (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX))) ) -static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { - return (size_t) i < (size_t) limit; -} -#if defined (__cplusplus) && __cplusplus >= 201103L - #include - #define __Pyx_sst_abs(value) std::abs(value) -#elif SIZEOF_INT >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) abs(value) -#elif SIZEOF_LONG >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) labs(value) -#elif defined (_MSC_VER) - #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) -#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define __Pyx_sst_abs(value) llabs(value) -#elif defined (__GNUC__) - #define __Pyx_sst_abs(value) __builtin_llabs(value) -#else - #define __Pyx_sst_abs(value) ((value<0) ? -value : value) -#endif -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); -#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) -#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) -#define __Pyx_PyBytes_FromString PyBytes_FromString -#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); -#if PY_MAJOR_VERSION < 3 - #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#else - #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize -#endif -#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) -#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) -#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) -#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) -#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { - const Py_UNICODE *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) -#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode -#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode -#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) -#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); -#define __Pyx_PySequence_Tuple(obj)\ - (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); -#if CYTHON_ASSUME_SAFE_MACROS -#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) -#else -#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) -#endif -#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) -#if PY_MAJOR_VERSION >= 3 -#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) -#else -#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) -#endif -#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII -static int __Pyx_sys_getdefaultencoding_not_ascii; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - PyObject* ascii_chars_u = NULL; - PyObject* ascii_chars_b = NULL; - const char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - if (strcmp(default_encoding_c, "ascii") == 0) { - __Pyx_sys_getdefaultencoding_not_ascii = 0; - } else { - char ascii_chars[128]; - int c; - for (c = 0; c < 128; c++) { - ascii_chars[c] = c; - } - __Pyx_sys_getdefaultencoding_not_ascii = 1; - ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); - if (!ascii_chars_u) goto bad; - ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); - if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { - PyErr_Format( - PyExc_ValueError, - "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", - default_encoding_c); - goto bad; - } - Py_DECREF(ascii_chars_u); - Py_DECREF(ascii_chars_b); - } - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - Py_XDECREF(ascii_chars_u); - Py_XDECREF(ascii_chars_b); - return -1; -} -#endif -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) -#else -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -static char* __PYX_DEFAULT_STRING_ENCODING; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); - if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; - strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - return -1; -} -#endif -#endif - - -/* Test for GCC > 2.95 */ -#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) - #define likely(x) __builtin_expect(!!(x), 1) - #define unlikely(x) __builtin_expect(!!(x), 0) -#else /* !__GNUC__ or GCC < 2.95 */ - #define likely(x) (x) - #define unlikely(x) (x) -#endif /* __GNUC__ */ -static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } - -static PyObject *__pyx_m = NULL; -static PyObject *__pyx_d; -static PyObject *__pyx_b; -static PyObject *__pyx_cython_runtime = NULL; -static PyObject *__pyx_empty_tuple; -static PyObject *__pyx_empty_bytes; -static PyObject *__pyx_empty_unicode; -static int __pyx_lineno; -static int __pyx_clineno = 0; -static const char * __pyx_cfilenm= __FILE__; -static const char *__pyx_filename; - - -static const char *__pyx_f[] = { - "aiohttp\\_helpers.pyx", - "stringsource", -}; - -/*--- Type declarations ---*/ -struct __pyx_obj_7aiohttp_8_helpers_reify; - -/* "aiohttp/_helpers.pyx":1 - * cdef class reify: # <<<<<<<<<<<<<< - * """Use as a class method decorator. It operates almost exactly like - * the Python `@property` decorator, but it puts the result of the - */ -struct __pyx_obj_7aiohttp_8_helpers_reify { - PyObject_HEAD - PyObject *wrapped; - PyObject *name; -}; - - -/* --- Runtime support code (head) --- */ -/* Refnanny.proto */ -#ifndef CYTHON_REFNANNY - #define CYTHON_REFNANNY 0 -#endif -#if CYTHON_REFNANNY - typedef struct { - void (*INCREF)(void*, PyObject*, int); - void (*DECREF)(void*, PyObject*, int); - void (*GOTREF)(void*, PyObject*, int); - void (*GIVEREF)(void*, PyObject*, int); - void* (*SetupContext)(const char*, int, const char*); - void (*FinishContext)(void**); - } __Pyx_RefNannyAPIStruct; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); - #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; -#ifdef WITH_THREAD - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - if (acquire_gil) {\ - PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ - PyGILState_Release(__pyx_gilstate_save);\ - } else {\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ - } -#else - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) -#endif - #define __Pyx_RefNannyFinishContext()\ - __Pyx_RefNanny->FinishContext(&__pyx_refnanny) - #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) - #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) - #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) - #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) -#else - #define __Pyx_RefNannyDeclarations - #define __Pyx_RefNannySetupContext(name, acquire_gil) - #define __Pyx_RefNannyFinishContext() - #define __Pyx_INCREF(r) Py_INCREF(r) - #define __Pyx_DECREF(r) Py_DECREF(r) - #define __Pyx_GOTREF(r) - #define __Pyx_GIVEREF(r) - #define __Pyx_XINCREF(r) Py_XINCREF(r) - #define __Pyx_XDECREF(r) Py_XDECREF(r) - #define __Pyx_XGOTREF(r) - #define __Pyx_XGIVEREF(r) -#endif -#define __Pyx_XDECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_XDECREF(tmp);\ - } while (0) -#define __Pyx_DECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_DECREF(tmp);\ - } while (0) -#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) -#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) - -/* PyObjectGetAttrStr.proto */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) -#endif - -/* GetBuiltinName.proto */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name); - -/* RaiseDoubleKeywords.proto */ -static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); - -/* ParseKeywords.proto */ -static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ - PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ - const char* function_name); - -/* RaiseArgTupleInvalid.proto */ -static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, - Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); - -/* GetItemInt.proto */ -#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ - (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ - __Pyx_GetItemInt_Generic(o, to_py_func(i)))) -#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ - (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, - int wraparound, int boundscheck); -#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ - (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, - int wraparound, int boundscheck); -static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, - int is_list, int wraparound, int boundscheck); - -/* ObjectGetItem.proto */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key); -#else -#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) -#endif - -/* GetTopmostException.proto */ -#if CYTHON_USE_EXC_INFO_STACK -static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); -#endif - -/* PyThreadStateGet.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; -#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; -#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type -#else -#define __Pyx_PyThreadState_declare -#define __Pyx_PyThreadState_assign -#define __Pyx_PyErr_Occurred() PyErr_Occurred() -#endif - -/* SaveResetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -#else -#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) -#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) -#endif - -/* PyErrExceptionMatches.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) -static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); -#else -#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) -#endif - -/* GetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); -#endif - -/* PyCFunctionFastCall.proto */ -#if CYTHON_FAST_PYCCALL -static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); -#else -#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) -#endif - -/* PyFunctionFastCall.proto */ -#if CYTHON_FAST_PYCALL -#define __Pyx_PyFunction_FastCall(func, args, nargs)\ - __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) -#if 1 || PY_VERSION_HEX < 0x030600B1 -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); -#else -#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) -#endif -#define __Pyx_BUILD_ASSERT_EXPR(cond)\ - (sizeof(char [1 - 2*!(cond)]) - 1) -#ifndef Py_MEMBER_SIZE -#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) -#endif - static size_t __pyx_pyframe_localsplus_offset = 0; - #include "frameobject.h" - #define __Pxy_PyFrame_Initialize_Offsets()\ - ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ - (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) - #define __Pyx_PyFrame_GetLocalsplus(frame)\ - (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) -#endif - -/* PyObjectCall.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); -#else -#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) -#endif - -/* PyObjectCall2Args.proto */ -static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); - -/* PyObjectCallMethO.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); -#endif - -/* PyObjectCallOneArg.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); - -/* PyErrFetchRestore.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) -#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) -#else -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#endif -#else -#define __Pyx_PyErr_Clear() PyErr_Clear() -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) -#endif - -/* RaiseException.proto */ -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); - -/* GetAttr.proto */ -static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); - -/* GetAttr3.proto */ -static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); - -/* PyDictVersioning.proto */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) -#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ - (version_var) = __PYX_GET_DICT_VERSION(dict);\ - (cache_var) = (value); -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ - (VAR) = __pyx_dict_cached_value;\ - } else {\ - (VAR) = __pyx_dict_cached_value = (LOOKUP);\ - __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ - }\ -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); -#else -#define __PYX_GET_DICT_VERSION(dict) (0) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); -#endif - -/* GetModuleGlobalName.proto */ -#if CYTHON_USE_DICT_VERSIONS -#define __Pyx_GetModuleGlobalName(var, name) {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ - (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ - __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} -#define __Pyx_GetModuleGlobalNameUncached(var, name) {\ - PY_UINT64_T __pyx_dict_version;\ - PyObject *__pyx_dict_cached_value;\ - (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); -#else -#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) -#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); -#endif - -/* Import.proto */ -static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); - -/* ImportFrom.proto */ -static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); - -/* HasAttr.proto */ -static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); - -/* PyObject_GenericGetAttrNoDict.proto */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr -#endif - -/* PyObject_GenericGetAttr.proto */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr -#endif - -/* PyObjectGetAttrStrNoError.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); - -/* SetupReduce.proto */ -static int __Pyx_setup_reduce(PyObject* type_obj); - -/* CLineInTraceback.proto */ -#ifdef CYTHON_CLINE_IN_TRACEBACK -#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) -#else -static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); -#endif - -/* CodeObjectCache.proto */ -typedef struct { - PyCodeObject* code_object; - int code_line; -} __Pyx_CodeObjectCacheEntry; -struct __Pyx_CodeObjectCache { - int count; - int max_count; - __Pyx_CodeObjectCacheEntry* entries; -}; -static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); -static PyCodeObject *__pyx_find_code_object(int code_line); -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); - -/* AddTraceback.proto */ -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename); - -/* GCCDiagnostics.proto */ -#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) -#define __Pyx_HAS_GCC_DIAGNOSTIC -#endif - -/* CIntFromPy.proto */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); - -/* CIntFromPy.proto */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); - -/* FastTypeChecks.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); -#else -#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) -#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) -#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) -#endif -#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) - -/* CheckBinaryVersion.proto */ -static int __Pyx_check_binary_version(void); - -/* InitStrings.proto */ -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); - - -/* Module declarations from 'aiohttp._helpers' */ -static PyTypeObject *__pyx_ptype_7aiohttp_8_helpers_reify = 0; -static PyObject *__pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(struct __pyx_obj_7aiohttp_8_helpers_reify *, PyObject *); /*proto*/ -#define __Pyx_MODULE_NAME "aiohttp._helpers" -extern int __pyx_module_is_main_aiohttp___helpers; -int __pyx_module_is_main_aiohttp___helpers = 0; - -/* Implementation of 'aiohttp._helpers' */ -static PyObject *__pyx_builtin_KeyError; -static PyObject *__pyx_builtin_AttributeError; -static const char __pyx_k_doc[] = "__doc__"; -static const char __pyx_k_new[] = "__new__"; -static const char __pyx_k_dict[] = "__dict__"; -static const char __pyx_k_main[] = "__main__"; -static const char __pyx_k_name[] = "__name__"; -static const char __pyx_k_test[] = "__test__"; -static const char __pyx_k_cache[] = "_cache"; -static const char __pyx_k_reify[] = "reify"; -static const char __pyx_k_import[] = "__import__"; -static const char __pyx_k_pickle[] = "pickle"; -static const char __pyx_k_reduce[] = "__reduce__"; -static const char __pyx_k_update[] = "update"; -static const char __pyx_k_wrapped[] = "wrapped"; -static const char __pyx_k_KeyError[] = "KeyError"; -static const char __pyx_k_getstate[] = "__getstate__"; -static const char __pyx_k_pyx_type[] = "__pyx_type"; -static const char __pyx_k_setstate[] = "__setstate__"; -static const char __pyx_k_pyx_state[] = "__pyx_state"; -static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; -static const char __pyx_k_pyx_result[] = "__pyx_result"; -static const char __pyx_k_PickleError[] = "PickleError"; -static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; -static const char __pyx_k_stringsource[] = "stringsource"; -static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; -static const char __pyx_k_AttributeError[] = "AttributeError"; -static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; -static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; -static const char __pyx_k_aiohttp__helpers[] = "aiohttp._helpers"; -static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; -static const char __pyx_k_pyx_unpickle_reify[] = "__pyx_unpickle_reify"; -static const char __pyx_k_reified_property_is_read_only[] = "reified property is read-only"; -static const char __pyx_k_Incompatible_checksums_s_vs_0x77[] = "Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))"; -static PyObject *__pyx_n_s_AttributeError; -static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0x77; -static PyObject *__pyx_n_s_KeyError; -static PyObject *__pyx_n_s_PickleError; -static PyObject *__pyx_n_s_aiohttp__helpers; -static PyObject *__pyx_n_s_cache; -static PyObject *__pyx_n_s_cline_in_traceback; -static PyObject *__pyx_n_s_dict; -static PyObject *__pyx_n_s_doc; -static PyObject *__pyx_n_s_getstate; -static PyObject *__pyx_n_s_import; -static PyObject *__pyx_n_s_main; -static PyObject *__pyx_n_s_name; -static PyObject *__pyx_n_s_new; -static PyObject *__pyx_n_s_pickle; -static PyObject *__pyx_n_s_pyx_PickleError; -static PyObject *__pyx_n_s_pyx_checksum; -static PyObject *__pyx_n_s_pyx_result; -static PyObject *__pyx_n_s_pyx_state; -static PyObject *__pyx_n_s_pyx_type; -static PyObject *__pyx_n_s_pyx_unpickle_reify; -static PyObject *__pyx_n_s_reduce; -static PyObject *__pyx_n_s_reduce_cython; -static PyObject *__pyx_n_s_reduce_ex; -static PyObject *__pyx_kp_u_reified_property_is_read_only; -static PyObject *__pyx_n_s_reify; -static PyObject *__pyx_n_s_setstate; -static PyObject *__pyx_n_s_setstate_cython; -static PyObject *__pyx_kp_s_stringsource; -static PyObject *__pyx_n_s_test; -static PyObject *__pyx_n_s_update; -static PyObject *__pyx_n_s_wrapped; -static int __pyx_pf_7aiohttp_8_helpers_5reify___init__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_wrapped); /* proto */ -static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_7__doc_____get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_2__get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_owner); /* proto */ -static int __pyx_pf_7aiohttp_8_helpers_5reify_4__set__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_value); /* proto */ -static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_6__reduce_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self); /* proto */ -static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_8__setstate_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ -static PyObject *__pyx_pf_7aiohttp_8_helpers___pyx_unpickle_reify(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ -static PyObject *__pyx_tp_new_7aiohttp_8_helpers_reify(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ -static PyObject *__pyx_int_124832655; -static PyObject *__pyx_tuple_; -static PyObject *__pyx_tuple__2; -static PyObject *__pyx_codeobj__3; -/* Late includes */ - -/* "aiohttp/_helpers.pyx":13 - * cdef object name - * - * def __init__(self, wrapped): # <<<<<<<<<<<<<< - * self.wrapped = wrapped - * self.name = wrapped.__name__ - */ - -/* Python wrapper */ -static int __pyx_pw_7aiohttp_8_helpers_5reify_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_pw_7aiohttp_8_helpers_5reify_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_wrapped = 0; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_wrapped,0}; - PyObject* values[1] = {0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_wrapped)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 13, __pyx_L3_error) - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - } - __pyx_v_wrapped = values[0]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 13, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("aiohttp._helpers.reify.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify___init__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), __pyx_v_wrapped); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7aiohttp_8_helpers_5reify___init__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_wrapped) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__init__", 0); - - /* "aiohttp/_helpers.pyx":14 - * - * def __init__(self, wrapped): - * self.wrapped = wrapped # <<<<<<<<<<<<<< - * self.name = wrapped.__name__ - * - */ - __Pyx_INCREF(__pyx_v_wrapped); - __Pyx_GIVEREF(__pyx_v_wrapped); - __Pyx_GOTREF(__pyx_v_self->wrapped); - __Pyx_DECREF(__pyx_v_self->wrapped); - __pyx_v_self->wrapped = __pyx_v_wrapped; - - /* "aiohttp/_helpers.pyx":15 - * def __init__(self, wrapped): - * self.wrapped = wrapped - * self.name = wrapped.__name__ # <<<<<<<<<<<<<< - * - * @property - */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_wrapped, __pyx_n_s_name); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v_self->name); - __Pyx_DECREF(__pyx_v_self->name); - __pyx_v_self->name = __pyx_t_1; - __pyx_t_1 = 0; - - /* "aiohttp/_helpers.pyx":13 - * cdef object name - * - * def __init__(self, wrapped): # <<<<<<<<<<<<<< - * self.wrapped = wrapped - * self.name = wrapped.__name__ - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._helpers.reify.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_helpers.pyx":18 - * - * @property - * def __doc__(self): # <<<<<<<<<<<<<< - * return self.wrapped.__doc__ - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__doc___1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__doc___1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_7__doc_____get__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_7__doc_____get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__get__", 0); - - /* "aiohttp/_helpers.pyx":19 - * @property - * def __doc__(self): - * return self.wrapped.__doc__ # <<<<<<<<<<<<<< - * - * def __get__(self, inst, owner): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->wrapped, __pyx_n_s_doc); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "aiohttp/_helpers.pyx":18 - * - * @property - * def __doc__(self): # <<<<<<<<<<<<<< - * return self.wrapped.__doc__ - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._helpers.reify.__doc__.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_helpers.pyx":21 - * return self.wrapped.__doc__ - * - * def __get__(self, inst, owner): # <<<<<<<<<<<<<< - * try: - * try: - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_3__get__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_owner); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_3__get__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_owner) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_2__get__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), ((PyObject *)__pyx_v_inst), ((PyObject *)__pyx_v_owner)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_2__get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_owner) { - PyObject *__pyx_v_val = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - int __pyx_t_9; - PyObject *__pyx_t_10 = NULL; - PyObject *__pyx_t_11 = NULL; - PyObject *__pyx_t_12 = NULL; - PyObject *__pyx_t_13 = NULL; - int __pyx_t_14; - int __pyx_t_15; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__get__", 0); - - /* "aiohttp/_helpers.pyx":22 - * - * def __get__(self, inst, owner): - * try: # <<<<<<<<<<<<<< - * try: - * return inst._cache[self.name] - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - /*try:*/ { - - /* "aiohttp/_helpers.pyx":23 - * def __get__(self, inst, owner): - * try: - * try: # <<<<<<<<<<<<<< - * return inst._cache[self.name] - * except KeyError: - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6); - __Pyx_XGOTREF(__pyx_t_4); - __Pyx_XGOTREF(__pyx_t_5); - __Pyx_XGOTREF(__pyx_t_6); - /*try:*/ { - - /* "aiohttp/_helpers.pyx":24 - * try: - * try: - * return inst._cache[self.name] # <<<<<<<<<<<<<< - * except KeyError: - * val = self.wrapped(inst) - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_inst, __pyx_n_s_cache); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 24, __pyx_L9_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_8 = __Pyx_PyObject_GetItem(__pyx_t_7, __pyx_v_self->name); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 24, __pyx_L9_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_r = __pyx_t_8; - __pyx_t_8 = 0; - goto __pyx_L13_try_return; - - /* "aiohttp/_helpers.pyx":23 - * def __get__(self, inst, owner): - * try: - * try: # <<<<<<<<<<<<<< - * return inst._cache[self.name] - * except KeyError: - */ - } - __pyx_L9_error:; - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - - /* "aiohttp/_helpers.pyx":25 - * try: - * return inst._cache[self.name] - * except KeyError: # <<<<<<<<<<<<<< - * val = self.wrapped(inst) - * inst._cache[self.name] = val - */ - __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_KeyError); - if (__pyx_t_9) { - __Pyx_AddTraceback("aiohttp._helpers.reify.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_8, &__pyx_t_7, &__pyx_t_10) < 0) __PYX_ERR(0, 25, __pyx_L11_except_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_GOTREF(__pyx_t_7); - __Pyx_GOTREF(__pyx_t_10); - - /* "aiohttp/_helpers.pyx":26 - * return inst._cache[self.name] - * except KeyError: - * val = self.wrapped(inst) # <<<<<<<<<<<<<< - * inst._cache[self.name] = val - * return val - */ - __Pyx_INCREF(__pyx_v_self->wrapped); - __pyx_t_12 = __pyx_v_self->wrapped; __pyx_t_13 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_12))) { - __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_12); - if (likely(__pyx_t_13)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12); - __Pyx_INCREF(__pyx_t_13); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_12, function); - } - } - __pyx_t_11 = (__pyx_t_13) ? __Pyx_PyObject_Call2Args(__pyx_t_12, __pyx_t_13, __pyx_v_inst) : __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_v_inst); - __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; - if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 26, __pyx_L11_except_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; - __pyx_v_val = __pyx_t_11; - __pyx_t_11 = 0; - - /* "aiohttp/_helpers.pyx":27 - * except KeyError: - * val = self.wrapped(inst) - * inst._cache[self.name] = val # <<<<<<<<<<<<<< - * return val - * except AttributeError: - */ - __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_v_inst, __pyx_n_s_cache); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 27, __pyx_L11_except_error) - __Pyx_GOTREF(__pyx_t_11); - if (unlikely(PyObject_SetItem(__pyx_t_11, __pyx_v_self->name, __pyx_v_val) < 0)) __PYX_ERR(0, 27, __pyx_L11_except_error) - __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - - /* "aiohttp/_helpers.pyx":28 - * val = self.wrapped(inst) - * inst._cache[self.name] = val - * return val # <<<<<<<<<<<<<< - * except AttributeError: - * if inst is None: - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_val); - __pyx_r = __pyx_v_val; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - goto __pyx_L12_except_return; - } - goto __pyx_L11_except_error; - __pyx_L11_except_error:; - - /* "aiohttp/_helpers.pyx":23 - * def __get__(self, inst, owner): - * try: - * try: # <<<<<<<<<<<<<< - * return inst._cache[self.name] - * except KeyError: - */ - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_XGIVEREF(__pyx_t_5); - __Pyx_XGIVEREF(__pyx_t_6); - __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); - goto __pyx_L3_error; - __pyx_L13_try_return:; - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_XGIVEREF(__pyx_t_5); - __Pyx_XGIVEREF(__pyx_t_6); - __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); - goto __pyx_L7_try_return; - __pyx_L12_except_return:; - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_XGIVEREF(__pyx_t_5); - __Pyx_XGIVEREF(__pyx_t_6); - __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); - goto __pyx_L7_try_return; - } - - /* "aiohttp/_helpers.pyx":22 - * - * def __get__(self, inst, owner): - * try: # <<<<<<<<<<<<<< - * try: - * return inst._cache[self.name] - */ - } - __pyx_L3_error:; - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; - __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; - __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - - /* "aiohttp/_helpers.pyx":29 - * inst._cache[self.name] = val - * return val - * except AttributeError: # <<<<<<<<<<<<<< - * if inst is None: - * return self - */ - __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_AttributeError); - if (__pyx_t_9) { - __Pyx_AddTraceback("aiohttp._helpers.reify.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_7, &__pyx_t_8) < 0) __PYX_ERR(0, 29, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_GOTREF(__pyx_t_7); - __Pyx_GOTREF(__pyx_t_8); - - /* "aiohttp/_helpers.pyx":30 - * return val - * except AttributeError: - * if inst is None: # <<<<<<<<<<<<<< - * return self - * raise - */ - __pyx_t_14 = (__pyx_v_inst == Py_None); - __pyx_t_15 = (__pyx_t_14 != 0); - if (__pyx_t_15) { - - /* "aiohttp/_helpers.pyx":31 - * except AttributeError: - * if inst is None: - * return self # <<<<<<<<<<<<<< - * raise - * - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject *)__pyx_v_self)); - __pyx_r = ((PyObject *)__pyx_v_self); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - goto __pyx_L6_except_return; - - /* "aiohttp/_helpers.pyx":30 - * return val - * except AttributeError: - * if inst is None: # <<<<<<<<<<<<<< - * return self - * raise - */ - } - - /* "aiohttp/_helpers.pyx":32 - * if inst is None: - * return self - * raise # <<<<<<<<<<<<<< - * - * def __set__(self, inst, value): - */ - __Pyx_GIVEREF(__pyx_t_10); - __Pyx_GIVEREF(__pyx_t_7); - __Pyx_XGIVEREF(__pyx_t_8); - __Pyx_ErrRestoreWithState(__pyx_t_10, __pyx_t_7, __pyx_t_8); - __pyx_t_10 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; - __PYX_ERR(0, 32, __pyx_L5_except_error) - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "aiohttp/_helpers.pyx":22 - * - * def __get__(self, inst, owner): - * try: # <<<<<<<<<<<<<< - * try: - * return inst._cache[self.name] - */ - __Pyx_XGIVEREF(__pyx_t_1); - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); - goto __pyx_L1_error; - __pyx_L7_try_return:; - __Pyx_XGIVEREF(__pyx_t_1); - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); - goto __pyx_L0; - __pyx_L6_except_return:; - __Pyx_XGIVEREF(__pyx_t_1); - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); - goto __pyx_L0; - } - - /* "aiohttp/_helpers.pyx":21 - * return self.wrapped.__doc__ - * - * def __get__(self, inst, owner): # <<<<<<<<<<<<<< - * try: - * try: - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_XDECREF(__pyx_t_11); - __Pyx_XDECREF(__pyx_t_12); - __Pyx_XDECREF(__pyx_t_13); - __Pyx_AddTraceback("aiohttp._helpers.reify.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_val); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_helpers.pyx":34 - * raise - * - * def __set__(self, inst, value): # <<<<<<<<<<<<<< - * raise AttributeError("reified property is read-only") - */ - -/* Python wrapper */ -static int __pyx_pw_7aiohttp_8_helpers_5reify_5__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_value); /*proto*/ -static int __pyx_pw_7aiohttp_8_helpers_5reify_5__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_value) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_4__set__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), ((PyObject *)__pyx_v_inst), ((PyObject *)__pyx_v_value)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7aiohttp_8_helpers_5reify_4__set__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_value) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__set__", 0); - - /* "aiohttp/_helpers.pyx":35 - * - * def __set__(self, inst, value): - * raise AttributeError("reified property is read-only") # <<<<<<<<<<<<<< - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_AttributeError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(0, 35, __pyx_L1_error) - - /* "aiohttp/_helpers.pyx":34 - * raise - * - * def __set__(self, inst, value): # <<<<<<<<<<<<<< - * raise AttributeError("reified property is read-only") - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._helpers.reify.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * cdef tuple state - * cdef object _dict - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_6__reduce_cython__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_6__reduce_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self) { - PyObject *__pyx_v_state = 0; - PyObject *__pyx_v__dict = 0; - int __pyx_v_use_setstate; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - int __pyx_t_3; - PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); - - /* "(tree fragment)":5 - * cdef object _dict - * cdef bint use_setstate - * state = (self.name, self.wrapped) # <<<<<<<<<<<<<< - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: - */ - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_v_self->name); - __Pyx_GIVEREF(__pyx_v_self->name); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name); - __Pyx_INCREF(__pyx_v_self->wrapped); - __Pyx_GIVEREF(__pyx_v_self->wrapped); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->wrapped); - __pyx_v_state = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "(tree fragment)":6 - * cdef bint use_setstate - * state = (self.name, self.wrapped) - * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< - * if _dict is not None: - * state += (_dict,) - */ - __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v__dict = __pyx_t_1; - __pyx_t_1 = 0; - - /* "(tree fragment)":7 - * state = (self.name, self.wrapped) - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: # <<<<<<<<<<<<<< - * state += (_dict,) - * use_setstate = True - */ - __pyx_t_2 = (__pyx_v__dict != Py_None); - __pyx_t_3 = (__pyx_t_2 != 0); - if (__pyx_t_3) { - - /* "(tree fragment)":8 - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: - * state += (_dict,) # <<<<<<<<<<<<<< - * use_setstate = True - * else: - */ - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_v__dict); - __Pyx_GIVEREF(__pyx_v__dict); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict); - __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_4)); - __pyx_t_4 = 0; - - /* "(tree fragment)":9 - * if _dict is not None: - * state += (_dict,) - * use_setstate = True # <<<<<<<<<<<<<< - * else: - * use_setstate = self.name is not None or self.wrapped is not None - */ - __pyx_v_use_setstate = 1; - - /* "(tree fragment)":7 - * state = (self.name, self.wrapped) - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: # <<<<<<<<<<<<<< - * state += (_dict,) - * use_setstate = True - */ - goto __pyx_L3; - } - - /* "(tree fragment)":11 - * use_setstate = True - * else: - * use_setstate = self.name is not None or self.wrapped is not None # <<<<<<<<<<<<<< - * if use_setstate: - * return __pyx_unpickle_reify, (type(self), 0x770cb8f, None), state - */ - /*else*/ { - __pyx_t_2 = (__pyx_v_self->name != Py_None); - __pyx_t_5 = (__pyx_t_2 != 0); - if (!__pyx_t_5) { - } else { - __pyx_t_3 = __pyx_t_5; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_5 = (__pyx_v_self->wrapped != Py_None); - __pyx_t_2 = (__pyx_t_5 != 0); - __pyx_t_3 = __pyx_t_2; - __pyx_L4_bool_binop_done:; - __pyx_v_use_setstate = __pyx_t_3; - } - __pyx_L3:; - - /* "(tree fragment)":12 - * else: - * use_setstate = self.name is not None or self.wrapped is not None - * if use_setstate: # <<<<<<<<<<<<<< - * return __pyx_unpickle_reify, (type(self), 0x770cb8f, None), state - * else: - */ - __pyx_t_3 = (__pyx_v_use_setstate != 0); - if (__pyx_t_3) { - - /* "(tree fragment)":13 - * use_setstate = self.name is not None or self.wrapped is not None - * if use_setstate: - * return __pyx_unpickle_reify, (type(self), 0x770cb8f, None), state # <<<<<<<<<<<<<< - * else: - * return __pyx_unpickle_reify, (type(self), 0x770cb8f, state) - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_reify); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_INCREF(__pyx_int_124832655); - __Pyx_GIVEREF(__pyx_int_124832655); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_124832655); - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None); - __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1); - __Pyx_INCREF(__pyx_v_state); - __Pyx_GIVEREF(__pyx_v_state); - PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_v_state); - __pyx_t_4 = 0; - __pyx_t_1 = 0; - __pyx_r = __pyx_t_6; - __pyx_t_6 = 0; - goto __pyx_L0; - - /* "(tree fragment)":12 - * else: - * use_setstate = self.name is not None or self.wrapped is not None - * if use_setstate: # <<<<<<<<<<<<<< - * return __pyx_unpickle_reify, (type(self), 0x770cb8f, None), state - * else: - */ - } - - /* "(tree fragment)":15 - * return __pyx_unpickle_reify, (type(self), 0x770cb8f, None), state - * else: - * return __pyx_unpickle_reify, (type(self), 0x770cb8f, state) # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * __pyx_unpickle_reify__set_state(self, __pyx_state) - */ - /*else*/ { - __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_pyx_unpickle_reify); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_INCREF(__pyx_int_124832655); - __Pyx_GIVEREF(__pyx_int_124832655); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_124832655); - __Pyx_INCREF(__pyx_v_state); - __Pyx_GIVEREF(__pyx_v_state); - PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state); - __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); - __pyx_t_6 = 0; - __pyx_t_1 = 0; - __pyx_r = __pyx_t_4; - __pyx_t_4 = 0; - goto __pyx_L0; - } - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * cdef tuple state - * cdef object _dict - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("aiohttp._helpers.reify.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_state); - __Pyx_XDECREF(__pyx_v__dict); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":16 - * else: - * return __pyx_unpickle_reify, (type(self), 0x770cb8f, state) - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * __pyx_unpickle_reify__set_state(self, __pyx_state) - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_8__setstate_cython__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_8__setstate_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); - - /* "(tree fragment)":17 - * return __pyx_unpickle_reify, (type(self), 0x770cb8f, state) - * def __setstate_cython__(self, __pyx_state): - * __pyx_unpickle_reify__set_state(self, __pyx_state) # <<<<<<<<<<<<<< - */ - if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error) - __pyx_t_1 = __pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "(tree fragment)":16 - * else: - * return __pyx_unpickle_reify, (type(self), 0x770cb8f, state) - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * __pyx_unpickle_reify__set_state(self, __pyx_state) - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._helpers.reify.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_8_helpers_1__pyx_unpickle_reify(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_7aiohttp_8_helpers_1__pyx_unpickle_reify = {"__pyx_unpickle_reify", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_8_helpers_1__pyx_unpickle_reify, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_7aiohttp_8_helpers_1__pyx_unpickle_reify(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v___pyx_type = 0; - long __pyx_v___pyx_checksum; - PyObject *__pyx_v___pyx_state = 0; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__pyx_unpickle_reify (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; - PyObject* values[3] = {0,0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_reify", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_reify", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_reify") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - } - __pyx_v___pyx_type = values[0]; - __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) - __pyx_v___pyx_state = values[2]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_reify", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("aiohttp._helpers.__pyx_unpickle_reify", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7aiohttp_8_helpers___pyx_unpickle_reify(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_8_helpers___pyx_unpickle_reify(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_v___pyx_PickleError = 0; - PyObject *__pyx_v___pyx_result = 0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - int __pyx_t_6; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__pyx_unpickle_reify", 0); - - /* "(tree fragment)":4 - * cdef object __pyx_PickleError - * cdef object __pyx_result - * if __pyx_checksum != 0x770cb8f: # <<<<<<<<<<<<<< - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) - */ - __pyx_t_1 = ((__pyx_v___pyx_checksum != 0x770cb8f) != 0); - if (__pyx_t_1) { - - /* "(tree fragment)":5 - * cdef object __pyx_result - * if __pyx_checksum != 0x770cb8f: - * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< - * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) - * __pyx_result = reify.__new__(__pyx_type) - */ - __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_n_s_PickleError); - __Pyx_GIVEREF(__pyx_n_s_PickleError); - PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); - __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_t_2); - __pyx_v___pyx_PickleError = __pyx_t_2; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "(tree fragment)":6 - * if __pyx_checksum != 0x770cb8f: - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) # <<<<<<<<<<<<<< - * __pyx_result = reify.__new__(__pyx_type) - * if __pyx_state is not None: - */ - __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0x77, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_INCREF(__pyx_v___pyx_PickleError); - __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_5)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_5); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 6, __pyx_L1_error) - - /* "(tree fragment)":4 - * cdef object __pyx_PickleError - * cdef object __pyx_result - * if __pyx_checksum != 0x770cb8f: # <<<<<<<<<<<<<< - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) - */ - } - - /* "(tree fragment)":7 - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) - * __pyx_result = reify.__new__(__pyx_type) # <<<<<<<<<<<<<< - * if __pyx_state is not None: - * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) - */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7aiohttp_8_helpers_reify), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_4)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_v___pyx_result = __pyx_t_3; - __pyx_t_3 = 0; - - /* "(tree fragment)":8 - * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) - * __pyx_result = reify.__new__(__pyx_type) - * if __pyx_state is not None: # <<<<<<<<<<<<<< - * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) - * return __pyx_result - */ - __pyx_t_1 = (__pyx_v___pyx_state != Py_None); - __pyx_t_6 = (__pyx_t_1 != 0); - if (__pyx_t_6) { - - /* "(tree fragment)":9 - * __pyx_result = reify.__new__(__pyx_type) - * if __pyx_state is not None: - * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< - * return __pyx_result - * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): - */ - if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 9, __pyx_L1_error) - __pyx_t_3 = __pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 9, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "(tree fragment)":8 - * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) - * __pyx_result = reify.__new__(__pyx_type) - * if __pyx_state is not None: # <<<<<<<<<<<<<< - * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) - * return __pyx_result - */ - } - - /* "(tree fragment)":10 - * if __pyx_state is not None: - * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) - * return __pyx_result # <<<<<<<<<<<<<< - * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): - * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v___pyx_result); - __pyx_r = __pyx_v___pyx_result; - goto __pyx_L0; - - /* "(tree fragment)":1 - * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("aiohttp._helpers.__pyx_unpickle_reify", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v___pyx_PickleError); - __Pyx_XDECREF(__pyx_v___pyx_result); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":11 - * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) - * return __pyx_result - * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< - * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] - * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): - */ - -static PyObject *__pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - Py_ssize_t __pyx_t_3; - int __pyx_t_4; - int __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__pyx_unpickle_reify__set_state", 0); - - /* "(tree fragment)":12 - * return __pyx_result - * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): - * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] # <<<<<<<<<<<<<< - * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): - * __pyx_result.__dict__.update(__pyx_state[2]) - */ - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->name); - __Pyx_DECREF(__pyx_v___pyx_result->name); - __pyx_v___pyx_result->name = __pyx_t_1; - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->wrapped); - __Pyx_DECREF(__pyx_v___pyx_result->wrapped); - __pyx_v___pyx_result->wrapped = __pyx_t_1; - __pyx_t_1 = 0; - - /* "(tree fragment)":13 - * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): - * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] - * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< - * __pyx_result.__dict__.update(__pyx_state[2]) - */ - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); - __PYX_ERR(1, 13, __pyx_L1_error) - } - __pyx_t_3 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) - __pyx_t_4 = ((__pyx_t_3 > 2) != 0); - if (__pyx_t_4) { - } else { - __pyx_t_2 = __pyx_t_4; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) - __pyx_t_5 = (__pyx_t_4 != 0); - __pyx_t_2 = __pyx_t_5; - __pyx_L4_bool_binop_done:; - if (__pyx_t_2) { - - /* "(tree fragment)":14 - * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] - * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): - * __pyx_result.__dict__.update(__pyx_state[2]) # <<<<<<<<<<<<<< - */ - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 14, __pyx_L1_error) - } - __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_8 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { - __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); - if (likely(__pyx_t_8)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); - __Pyx_INCREF(__pyx_t_8); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_7, function); - } - } - __pyx_t_1 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_8, __pyx_t_6) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "(tree fragment)":13 - * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): - * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] - * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< - * __pyx_result.__dict__.update(__pyx_state[2]) - */ - } - - /* "(tree fragment)":11 - * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) - * return __pyx_result - * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< - * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] - * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("aiohttp._helpers.__pyx_unpickle_reify__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_tp_new_7aiohttp_8_helpers_reify(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { - struct __pyx_obj_7aiohttp_8_helpers_reify *p; - PyObject *o; - if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { - o = (*t->tp_alloc)(t, 0); - } else { - o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); - } - if (unlikely(!o)) return 0; - p = ((struct __pyx_obj_7aiohttp_8_helpers_reify *)o); - p->wrapped = Py_None; Py_INCREF(Py_None); - p->name = Py_None; Py_INCREF(Py_None); - return o; -} - -static void __pyx_tp_dealloc_7aiohttp_8_helpers_reify(PyObject *o) { - struct __pyx_obj_7aiohttp_8_helpers_reify *p = (struct __pyx_obj_7aiohttp_8_helpers_reify *)o; - #if CYTHON_USE_TP_FINALIZE - if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { - if (PyObject_CallFinalizerFromDealloc(o)) return; - } - #endif - PyObject_GC_UnTrack(o); - Py_CLEAR(p->wrapped); - Py_CLEAR(p->name); - (*Py_TYPE(o)->tp_free)(o); -} - -static int __pyx_tp_traverse_7aiohttp_8_helpers_reify(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_obj_7aiohttp_8_helpers_reify *p = (struct __pyx_obj_7aiohttp_8_helpers_reify *)o; - if (p->wrapped) { - e = (*v)(p->wrapped, a); if (e) return e; - } - if (p->name) { - e = (*v)(p->name, a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear_7aiohttp_8_helpers_reify(PyObject *o) { - PyObject* tmp; - struct __pyx_obj_7aiohttp_8_helpers_reify *p = (struct __pyx_obj_7aiohttp_8_helpers_reify *)o; - tmp = ((PyObject*)p->wrapped); - p->wrapped = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->name); - p->name = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - return 0; -} - -static PyObject *__pyx_tp_descr_get_7aiohttp_8_helpers_reify(PyObject *o, PyObject *i, PyObject *c) { - PyObject *r = 0; - if (!i) i = Py_None; - if (!c) c = Py_None; - r = __pyx_pw_7aiohttp_8_helpers_5reify_3__get__(o, i, c); - return r; -} - -static int __pyx_tp_descr_set_7aiohttp_8_helpers_reify(PyObject *o, PyObject *i, PyObject *v) { - if (v) { - return __pyx_pw_7aiohttp_8_helpers_5reify_5__set__(o, i, v); - } - else { - PyErr_SetString(PyExc_NotImplementedError, "__delete__"); - return -1; - } -} - -static PyObject *__pyx_getprop_7aiohttp_8_helpers_5reify___doc__(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_8_helpers_5reify_7__doc___1__get__(o); -} - -static PyMethodDef __pyx_methods_7aiohttp_8_helpers_reify[] = { - {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_8_helpers_5reify_7__reduce_cython__, METH_NOARGS, 0}, - {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_8_helpers_5reify_9__setstate_cython__, METH_O, 0}, - {0, 0, 0, 0} -}; - -static struct PyGetSetDef __pyx_getsets_7aiohttp_8_helpers_reify[] = { - {(char *)"__doc__", __pyx_getprop_7aiohttp_8_helpers_5reify___doc__, 0, (char *)0, 0}, - {0, 0, 0, 0, 0} -}; - -static PyTypeObject __pyx_type_7aiohttp_8_helpers_reify = { - PyVarObject_HEAD_INIT(0, 0) - "aiohttp._helpers.reify", /*tp_name*/ - sizeof(struct __pyx_obj_7aiohttp_8_helpers_reify), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7aiohttp_8_helpers_reify, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - "Use as a class method decorator. It operates almost exactly like\n the Python `@property` decorator, but it puts the result of the\n method it decorates into the instance dict after the first call,\n effectively replacing the function it decorates with an instance\n variable. It is, in Python parlance, a data descriptor.\n\n ", /*tp_doc*/ - __pyx_tp_traverse_7aiohttp_8_helpers_reify, /*tp_traverse*/ - __pyx_tp_clear_7aiohttp_8_helpers_reify, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - __pyx_methods_7aiohttp_8_helpers_reify, /*tp_methods*/ - 0, /*tp_members*/ - __pyx_getsets_7aiohttp_8_helpers_reify, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - __pyx_tp_descr_get_7aiohttp_8_helpers_reify, /*tp_descr_get*/ - __pyx_tp_descr_set_7aiohttp_8_helpers_reify, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - __pyx_pw_7aiohttp_8_helpers_5reify_1__init__, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7aiohttp_8_helpers_reify, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - 0, /*tp_finalize*/ - #endif - #if PY_VERSION_HEX >= 0x030800b1 - 0, /*tp_vectorcall*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 - 0, /*tp_print*/ - #endif -}; - -static PyMethodDef __pyx_methods[] = { - {0, 0, 0, 0} -}; - -#if PY_MAJOR_VERSION >= 3 -#if CYTHON_PEP489_MULTI_PHASE_INIT -static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ -static int __pyx_pymod_exec__helpers(PyObject* module); /*proto*/ -static PyModuleDef_Slot __pyx_moduledef_slots[] = { - {Py_mod_create, (void*)__pyx_pymod_create}, - {Py_mod_exec, (void*)__pyx_pymod_exec__helpers}, - {0, NULL} -}; -#endif - -static struct PyModuleDef __pyx_moduledef = { - PyModuleDef_HEAD_INIT, - "_helpers", - 0, /* m_doc */ - #if CYTHON_PEP489_MULTI_PHASE_INIT - 0, /* m_size */ - #else - -1, /* m_size */ - #endif - __pyx_methods /* m_methods */, - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_moduledef_slots, /* m_slots */ - #else - NULL, /* m_reload */ - #endif - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ -}; -#endif -#ifndef CYTHON_SMALL_CODE -#if defined(__clang__) - #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) - #define CYTHON_SMALL_CODE __attribute__((cold)) -#else - #define CYTHON_SMALL_CODE -#endif -#endif - -static __Pyx_StringTabEntry __pyx_string_tab[] = { - {&__pyx_n_s_AttributeError, __pyx_k_AttributeError, sizeof(__pyx_k_AttributeError), 0, 0, 1, 1}, - {&__pyx_kp_s_Incompatible_checksums_s_vs_0x77, __pyx_k_Incompatible_checksums_s_vs_0x77, sizeof(__pyx_k_Incompatible_checksums_s_vs_0x77), 0, 0, 1, 0}, - {&__pyx_n_s_KeyError, __pyx_k_KeyError, sizeof(__pyx_k_KeyError), 0, 0, 1, 1}, - {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, - {&__pyx_n_s_aiohttp__helpers, __pyx_k_aiohttp__helpers, sizeof(__pyx_k_aiohttp__helpers), 0, 0, 1, 1}, - {&__pyx_n_s_cache, __pyx_k_cache, sizeof(__pyx_k_cache), 0, 0, 1, 1}, - {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, - {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, - {&__pyx_n_s_doc, __pyx_k_doc, sizeof(__pyx_k_doc), 0, 0, 1, 1}, - {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, - {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, - {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, - {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, - {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, - {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_unpickle_reify, __pyx_k_pyx_unpickle_reify, sizeof(__pyx_k_pyx_unpickle_reify), 0, 0, 1, 1}, - {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, - {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, - {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, - {&__pyx_kp_u_reified_property_is_read_only, __pyx_k_reified_property_is_read_only, sizeof(__pyx_k_reified_property_is_read_only), 0, 1, 0, 0}, - {&__pyx_n_s_reify, __pyx_k_reify, sizeof(__pyx_k_reify), 0, 0, 1, 1}, - {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, - {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, - {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, - {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, - {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, - {&__pyx_n_s_wrapped, __pyx_k_wrapped, sizeof(__pyx_k_wrapped), 0, 0, 1, 1}, - {0, 0, 0, 0, 0, 0, 0} -}; -static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_KeyError = __Pyx_GetBuiltinName(__pyx_n_s_KeyError); if (!__pyx_builtin_KeyError) __PYX_ERR(0, 25, __pyx_L1_error) - __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) __PYX_ERR(0, 29, __pyx_L1_error) - return 0; - __pyx_L1_error:; - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - - /* "aiohttp/_helpers.pyx":35 - * - * def __set__(self, inst, value): - * raise AttributeError("reified property is read-only") # <<<<<<<<<<<<<< - */ - __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_reified_property_is_read_only); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 35, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple_); - __Pyx_GIVEREF(__pyx_tuple_); - - /* "(tree fragment)":1 - * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - __pyx_tuple__2 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__2); - __Pyx_GIVEREF(__pyx_tuple__2); - __pyx_codeobj__3 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__2, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_reify, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__3)) __PYX_ERR(1, 1, __pyx_L1_error) - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_RefNannyFinishContext(); - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { - if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); - __pyx_int_124832655 = PyInt_FromLong(124832655L); if (unlikely(!__pyx_int_124832655)) __PYX_ERR(0, 1, __pyx_L1_error) - return 0; - __pyx_L1_error:; - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ - -static int __Pyx_modinit_global_init_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); - /*--- Global init code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_variable_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); - /*--- Variable export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); - /*--- Function export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_type_init_code(void) { - __Pyx_RefNannyDeclarations - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); - /*--- Type init code ---*/ - if (PyType_Ready(&__pyx_type_7aiohttp_8_helpers_reify) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #if PY_VERSION_HEX < 0x030800B1 - __pyx_type_7aiohttp_8_helpers_reify.tp_print = 0; - #endif - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_8_helpers_reify.tp_dictoffset && __pyx_type_7aiohttp_8_helpers_reify.tp_getattro == PyObject_GenericGetAttr)) { - __pyx_type_7aiohttp_8_helpers_reify.tp_getattro = __Pyx_PyObject_GenericGetAttr; - } - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_reify, (PyObject *)&__pyx_type_7aiohttp_8_helpers_reify) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_8_helpers_reify) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_ptype_7aiohttp_8_helpers_reify = &__pyx_type_7aiohttp_8_helpers_reify; - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_RefNannyFinishContext(); - return -1; -} - -static int __Pyx_modinit_type_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); - /*--- Type import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_variable_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); - /*--- Variable import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); - /*--- Function import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - - -#ifndef CYTHON_NO_PYINIT_EXPORT -#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC -#elif PY_MAJOR_VERSION < 3 -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" void -#else -#define __Pyx_PyMODINIT_FUNC void -#endif -#else -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * -#else -#define __Pyx_PyMODINIT_FUNC PyObject * -#endif -#endif - - -#if PY_MAJOR_VERSION < 3 -__Pyx_PyMODINIT_FUNC init_helpers(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC init_helpers(void) -#else -__Pyx_PyMODINIT_FUNC PyInit__helpers(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC PyInit__helpers(void) -#if CYTHON_PEP489_MULTI_PHASE_INIT -{ - return PyModuleDef_Init(&__pyx_moduledef); -} -static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { - #if PY_VERSION_HEX >= 0x030700A1 - static PY_INT64_T main_interpreter_id = -1; - PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); - if (main_interpreter_id == -1) { - main_interpreter_id = current_id; - return (unlikely(current_id == -1)) ? -1 : 0; - } else if (unlikely(main_interpreter_id != current_id)) - #else - static PyInterpreterState *main_interpreter = NULL; - PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; - if (!main_interpreter) { - main_interpreter = current_interpreter; - } else if (unlikely(main_interpreter != current_interpreter)) - #endif - { - PyErr_SetString( - PyExc_ImportError, - "Interpreter change detected - this module can only be loaded into one interpreter per process."); - return -1; - } - return 0; -} -static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { - PyObject *value = PyObject_GetAttrString(spec, from_name); - int result = 0; - if (likely(value)) { - if (allow_none || value != Py_None) { - result = PyDict_SetItemString(moddict, to_name, value); - } - Py_DECREF(value); - } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Clear(); - } else { - result = -1; - } - return result; -} -static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { - PyObject *module = NULL, *moddict, *modname; - if (__Pyx_check_single_interpreter()) - return NULL; - if (__pyx_m) - return __Pyx_NewRef(__pyx_m); - modname = PyObject_GetAttrString(spec, "name"); - if (unlikely(!modname)) goto bad; - module = PyModule_NewObject(modname); - Py_DECREF(modname); - if (unlikely(!module)) goto bad; - moddict = PyModule_GetDict(module); - if (unlikely(!moddict)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; - return module; -bad: - Py_XDECREF(module); - return NULL; -} - - -static CYTHON_SMALL_CODE int __pyx_pymod_exec__helpers(PyObject *__pyx_pyinit_module) -#endif -#endif -{ - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannyDeclarations - #if CYTHON_PEP489_MULTI_PHASE_INIT - if (__pyx_m) { - if (__pyx_m == __pyx_pyinit_module) return 0; - PyErr_SetString(PyExc_RuntimeError, "Module '_helpers' has already been imported. Re-initialisation is not supported."); - return -1; - } - #elif PY_MAJOR_VERSION >= 3 - if (__pyx_m) return __Pyx_NewRef(__pyx_m); - #endif - #if CYTHON_REFNANNY -__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); -if (!__Pyx_RefNanny) { - PyErr_Clear(); - __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); - if (!__Pyx_RefNanny) - Py_FatalError("failed to import 'refnanny' module"); -} -#endif - __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__helpers(void)", 0); - if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #ifdef __Pxy_PyFrame_Initialize_Offsets - __Pxy_PyFrame_Initialize_Offsets(); - #endif - __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) - #ifdef __Pyx_CyFunction_USED - if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_FusedFunction_USED - if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Coroutine_USED - if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Generator_USED - if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_AsyncGen_USED - if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_StopAsyncIteration_USED - if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - /*--- Library function declarations ---*/ - /*--- Threads initialization code ---*/ - #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS - PyEval_InitThreads(); - #endif - /*--- Module creation code ---*/ - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_m = __pyx_pyinit_module; - Py_INCREF(__pyx_m); - #else - #if PY_MAJOR_VERSION < 3 - __pyx_m = Py_InitModule4("_helpers", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); - #else - __pyx_m = PyModule_Create(&__pyx_moduledef); - #endif - if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_d); - __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_b); - __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_cython_runtime); - if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); - /*--- Initialize various global constants etc. ---*/ - if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) - if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - if (__pyx_module_is_main_aiohttp___helpers) { - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - } - #if PY_MAJOR_VERSION >= 3 - { - PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) - if (!PyDict_GetItemString(modules, "aiohttp._helpers")) { - if (unlikely(PyDict_SetItemString(modules, "aiohttp._helpers", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) - } - } - #endif - /*--- Builtin init code ---*/ - if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - /*--- Constants init code ---*/ - if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - /*--- Global type/function init code ---*/ - (void)__Pyx_modinit_global_init_code(); - (void)__Pyx_modinit_variable_export_code(); - (void)__Pyx_modinit_function_export_code(); - if (unlikely(__Pyx_modinit_type_init_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) - (void)__Pyx_modinit_type_import_code(); - (void)__Pyx_modinit_variable_import_code(); - (void)__Pyx_modinit_function_import_code(); - /*--- Execution code ---*/ - #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) - if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - - /* "(tree fragment)":1 - * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7aiohttp_8_helpers_1__pyx_unpickle_reify, NULL, __pyx_n_s_aiohttp__helpers); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_reify, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_helpers.pyx":1 - * cdef class reify: # <<<<<<<<<<<<<< - * """Use as a class method decorator. It operates almost exactly like - * the Python `@property` decorator, but it puts the result of the - */ - __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /*--- Wrapped vars code ---*/ - - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - if (__pyx_m) { - if (__pyx_d) { - __Pyx_AddTraceback("init aiohttp._helpers", __pyx_clineno, __pyx_lineno, __pyx_filename); - } - Py_CLEAR(__pyx_m); - } else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ImportError, "init aiohttp._helpers"); - } - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - #if CYTHON_PEP489_MULTI_PHASE_INIT - return (__pyx_m != NULL) ? 0 : -1; - #elif PY_MAJOR_VERSION >= 3 - return __pyx_m; - #else - return; - #endif -} - -/* --- Runtime support code --- */ -/* Refnanny */ -#if CYTHON_REFNANNY -static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { - PyObject *m = NULL, *p = NULL; - void *r = NULL; - m = PyImport_ImportModule(modname); - if (!m) goto end; - p = PyObject_GetAttrString(m, "RefNannyAPI"); - if (!p) goto end; - r = PyLong_AsVoidPtr(p); -end: - Py_XDECREF(p); - Py_XDECREF(m); - return (__Pyx_RefNannyAPIStruct *)r; -} -#endif - -/* PyObjectGetAttrStr */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { - PyTypeObject* tp = Py_TYPE(obj); - if (likely(tp->tp_getattro)) - return tp->tp_getattro(obj, attr_name); -#if PY_MAJOR_VERSION < 3 - if (likely(tp->tp_getattr)) - return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); -#endif - return PyObject_GetAttr(obj, attr_name); -} -#endif - -/* GetBuiltinName */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name) { - PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); - if (unlikely(!result)) { - PyErr_Format(PyExc_NameError, -#if PY_MAJOR_VERSION >= 3 - "name '%U' is not defined", name); -#else - "name '%.200s' is not defined", PyString_AS_STRING(name)); -#endif - } - return result; -} - -/* RaiseDoubleKeywords */ -static void __Pyx_RaiseDoubleKeywordsError( - const char* func_name, - PyObject* kw_name) -{ - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION >= 3 - "%s() got multiple values for keyword argument '%U'", func_name, kw_name); - #else - "%s() got multiple values for keyword argument '%s'", func_name, - PyString_AsString(kw_name)); - #endif -} - -/* ParseKeywords */ -static int __Pyx_ParseOptionalKeywords( - PyObject *kwds, - PyObject **argnames[], - PyObject *kwds2, - PyObject *values[], - Py_ssize_t num_pos_args, - const char* function_name) -{ - PyObject *key = 0, *value = 0; - Py_ssize_t pos = 0; - PyObject*** name; - PyObject*** first_kw_arg = argnames + num_pos_args; - while (PyDict_Next(kwds, &pos, &key, &value)) { - name = first_kw_arg; - while (*name && (**name != key)) name++; - if (*name) { - values[name-argnames] = value; - continue; - } - name = first_kw_arg; - #if PY_MAJOR_VERSION < 3 - if (likely(PyString_Check(key))) { - while (*name) { - if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) - && _PyString_Eq(**name, key)) { - values[name-argnames] = value; - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - if ((**argname == key) || ( - (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) - && _PyString_Eq(**argname, key))) { - goto arg_passed_twice; - } - argname++; - } - } - } else - #endif - if (likely(PyUnicode_Check(key))) { - while (*name) { - int cmp = (**name == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : - #endif - PyUnicode_Compare(**name, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) { - values[name-argnames] = value; - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - int cmp = (**argname == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : - #endif - PyUnicode_Compare(**argname, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) goto arg_passed_twice; - argname++; - } - } - } else - goto invalid_keyword_type; - if (kwds2) { - if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; - } else { - goto invalid_keyword; - } - } - return 0; -arg_passed_twice: - __Pyx_RaiseDoubleKeywordsError(function_name, key); - goto bad; -invalid_keyword_type: - PyErr_Format(PyExc_TypeError, - "%.200s() keywords must be strings", function_name); - goto bad; -invalid_keyword: - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION < 3 - "%.200s() got an unexpected keyword argument '%.200s'", - function_name, PyString_AsString(key)); - #else - "%s() got an unexpected keyword argument '%U'", - function_name, key); - #endif -bad: - return -1; -} - -/* RaiseArgTupleInvalid */ -static void __Pyx_RaiseArgtupleInvalid( - const char* func_name, - int exact, - Py_ssize_t num_min, - Py_ssize_t num_max, - Py_ssize_t num_found) -{ - Py_ssize_t num_expected; - const char *more_or_less; - if (num_found < num_min) { - num_expected = num_min; - more_or_less = "at least"; - } else { - num_expected = num_max; - more_or_less = "at most"; - } - if (exact) { - more_or_less = "exactly"; - } - PyErr_Format(PyExc_TypeError, - "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", - func_name, more_or_less, num_expected, - (num_expected == 1) ? "" : "s", num_found); -} - -/* GetItemInt */ -static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { - PyObject *r; - if (!j) return NULL; - r = PyObject_GetItem(o, j); - Py_DECREF(j); - return r; -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, - CYTHON_NCP_UNUSED int wraparound, - CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - Py_ssize_t wrapped_i = i; - if (wraparound & unlikely(i < 0)) { - wrapped_i += PyList_GET_SIZE(o); - } - if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { - PyObject *r = PyList_GET_ITEM(o, wrapped_i); - Py_INCREF(r); - return r; - } - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -#else - return PySequence_GetItem(o, i); -#endif -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, - CYTHON_NCP_UNUSED int wraparound, - CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - Py_ssize_t wrapped_i = i; - if (wraparound & unlikely(i < 0)) { - wrapped_i += PyTuple_GET_SIZE(o); - } - if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { - PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); - Py_INCREF(r); - return r; - } - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -#else - return PySequence_GetItem(o, i); -#endif -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, - CYTHON_NCP_UNUSED int wraparound, - CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS - if (is_list || PyList_CheckExact(o)) { - Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); - if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { - PyObject *r = PyList_GET_ITEM(o, n); - Py_INCREF(r); - return r; - } - } - else if (PyTuple_CheckExact(o)) { - Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); - if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { - PyObject *r = PyTuple_GET_ITEM(o, n); - Py_INCREF(r); - return r; - } - } else { - PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; - if (likely(m && m->sq_item)) { - if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { - Py_ssize_t l = m->sq_length(o); - if (likely(l >= 0)) { - i += l; - } else { - if (!PyErr_ExceptionMatches(PyExc_OverflowError)) - return NULL; - PyErr_Clear(); - } - } - return m->sq_item(o, i); - } - } -#else - if (is_list || PySequence_Check(o)) { - return PySequence_GetItem(o, i); - } -#endif - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -} - -/* ObjectGetItem */ -#if CYTHON_USE_TYPE_SLOTS -static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject* index) { - PyObject *runerr; - Py_ssize_t key_value; - PySequenceMethods *m = Py_TYPE(obj)->tp_as_sequence; - if (unlikely(!(m && m->sq_item))) { - PyErr_Format(PyExc_TypeError, "'%.200s' object is not subscriptable", Py_TYPE(obj)->tp_name); - return NULL; - } - key_value = __Pyx_PyIndex_AsSsize_t(index); - if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { - return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); - } - if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { - PyErr_Clear(); - PyErr_Format(PyExc_IndexError, "cannot fit '%.200s' into an index-sized integer", Py_TYPE(index)->tp_name); - } - return NULL; -} -static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key) { - PyMappingMethods *m = Py_TYPE(obj)->tp_as_mapping; - if (likely(m && m->mp_subscript)) { - return m->mp_subscript(obj, key); - } - return __Pyx_PyObject_GetIndex(obj, key); -} -#endif - -/* GetTopmostException */ -#if CYTHON_USE_EXC_INFO_STACK -static _PyErr_StackItem * -__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) -{ - _PyErr_StackItem *exc_info = tstate->exc_info; - while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && - exc_info->previous_item != NULL) - { - exc_info = exc_info->previous_item; - } - return exc_info; -} -#endif - -/* SaveResetException */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); - *type = exc_info->exc_type; - *value = exc_info->exc_value; - *tb = exc_info->exc_traceback; - #else - *type = tstate->exc_type; - *value = tstate->exc_value; - *tb = tstate->exc_traceback; - #endif - Py_XINCREF(*type); - Py_XINCREF(*value); - Py_XINCREF(*tb); -} -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = type; - exc_info->exc_value = value; - exc_info->exc_traceback = tb; - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = type; - tstate->exc_value = value; - tstate->exc_traceback = tb; - #endif - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -} -#endif - -/* PyErrExceptionMatches */ -#if CYTHON_FAST_THREAD_STATE -static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(tuple); -#if PY_MAJOR_VERSION >= 3 - for (i=0; icurexc_type; - if (exc_type == err) return 1; - if (unlikely(!exc_type)) return 0; - if (unlikely(PyTuple_Check(err))) - return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); - return __Pyx_PyErr_GivenExceptionMatches(exc_type, err); -} -#endif - -/* GetException */ -#if CYTHON_FAST_THREAD_STATE -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) -#endif -{ - PyObject *local_type, *local_value, *local_tb; -#if CYTHON_FAST_THREAD_STATE - PyObject *tmp_type, *tmp_value, *tmp_tb; - local_type = tstate->curexc_type; - local_value = tstate->curexc_value; - local_tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -#else - PyErr_Fetch(&local_type, &local_value, &local_tb); -#endif - PyErr_NormalizeException(&local_type, &local_value, &local_tb); -#if CYTHON_FAST_THREAD_STATE - if (unlikely(tstate->curexc_type)) -#else - if (unlikely(PyErr_Occurred())) -#endif - goto bad; - #if PY_MAJOR_VERSION >= 3 - if (local_tb) { - if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) - goto bad; - } - #endif - Py_XINCREF(local_tb); - Py_XINCREF(local_type); - Py_XINCREF(local_value); - *type = local_type; - *value = local_value; - *tb = local_tb; -#if CYTHON_FAST_THREAD_STATE - #if CYTHON_USE_EXC_INFO_STACK - { - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = local_type; - exc_info->exc_value = local_value; - exc_info->exc_traceback = local_tb; - } - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = local_type; - tstate->exc_value = local_value; - tstate->exc_traceback = local_tb; - #endif - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -#else - PyErr_SetExcInfo(local_type, local_value, local_tb); -#endif - return 0; -bad: - *type = 0; - *value = 0; - *tb = 0; - Py_XDECREF(local_type); - Py_XDECREF(local_value); - Py_XDECREF(local_tb); - return -1; -} - -/* PyCFunctionFastCall */ -#if CYTHON_FAST_PYCCALL -static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { - PyCFunctionObject *func = (PyCFunctionObject*)func_obj; - PyCFunction meth = PyCFunction_GET_FUNCTION(func); - PyObject *self = PyCFunction_GET_SELF(func); - int flags = PyCFunction_GET_FLAGS(func); - assert(PyCFunction_Check(func)); - assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); - assert(nargs >= 0); - assert(nargs == 0 || args != NULL); - /* _PyCFunction_FastCallDict() must not be called with an exception set, - because it may clear it (directly or indirectly) and so the - caller loses its exception */ - assert(!PyErr_Occurred()); - if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { - return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); - } else { - return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); - } -} -#endif - -/* PyFunctionFastCall */ -#if CYTHON_FAST_PYCALL -static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, - PyObject *globals) { - PyFrameObject *f; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject **fastlocals; - Py_ssize_t i; - PyObject *result; - assert(globals != NULL); - /* XXX Perhaps we should create a specialized - PyFrame_New() that doesn't take locals, but does - take builtins without sanity checking them. - */ - assert(tstate != NULL); - f = PyFrame_New(tstate, co, globals, NULL); - if (f == NULL) { - return NULL; - } - fastlocals = __Pyx_PyFrame_GetLocalsplus(f); - for (i = 0; i < na; i++) { - Py_INCREF(*args); - fastlocals[i] = *args++; - } - result = PyEval_EvalFrameEx(f,0); - ++tstate->recursion_depth; - Py_DECREF(f); - --tstate->recursion_depth; - return result; -} -#if 1 || PY_VERSION_HEX < 0x030600B1 -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *globals = PyFunction_GET_GLOBALS(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - PyObject *closure; -#if PY_MAJOR_VERSION >= 3 - PyObject *kwdefs; -#endif - PyObject *kwtuple, **k; - PyObject **d; - Py_ssize_t nd; - Py_ssize_t nk; - PyObject *result; - assert(kwargs == NULL || PyDict_Check(kwargs)); - nk = kwargs ? PyDict_Size(kwargs) : 0; - if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { - return NULL; - } - if ( -#if PY_MAJOR_VERSION >= 3 - co->co_kwonlyargcount == 0 && -#endif - likely(kwargs == NULL || nk == 0) && - co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { - if (argdefs == NULL && co->co_argcount == nargs) { - result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); - goto done; - } - else if (nargs == 0 && argdefs != NULL - && co->co_argcount == Py_SIZE(argdefs)) { - /* function called with no arguments, but all parameters have - a default value: use default values as arguments .*/ - args = &PyTuple_GET_ITEM(argdefs, 0); - result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); - goto done; - } - } - if (kwargs != NULL) { - Py_ssize_t pos, i; - kwtuple = PyTuple_New(2 * nk); - if (kwtuple == NULL) { - result = NULL; - goto done; - } - k = &PyTuple_GET_ITEM(kwtuple, 0); - pos = i = 0; - while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { - Py_INCREF(k[i]); - Py_INCREF(k[i+1]); - i += 2; - } - nk = i / 2; - } - else { - kwtuple = NULL; - k = NULL; - } - closure = PyFunction_GET_CLOSURE(func); -#if PY_MAJOR_VERSION >= 3 - kwdefs = PyFunction_GET_KW_DEFAULTS(func); -#endif - if (argdefs != NULL) { - d = &PyTuple_GET_ITEM(argdefs, 0); - nd = Py_SIZE(argdefs); - } - else { - d = NULL; - nd = 0; - } -#if PY_MAJOR_VERSION >= 3 - result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, kwdefs, closure); -#else - result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, closure); -#endif - Py_XDECREF(kwtuple); -done: - Py_LeaveRecursiveCall(); - return result; -} -#endif -#endif - -/* PyObjectCall */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { - PyObject *result; - ternaryfunc call = Py_TYPE(func)->tp_call; - if (unlikely(!call)) - return PyObject_Call(func, arg, kw); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = (*call)(func, arg, kw); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* PyObjectCall2Args */ -static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) { - PyObject *args, *result = NULL; - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(function)) { - PyObject *args[2] = {arg1, arg2}; - return __Pyx_PyFunction_FastCall(function, args, 2); - } - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(function)) { - PyObject *args[2] = {arg1, arg2}; - return __Pyx_PyCFunction_FastCall(function, args, 2); - } - #endif - args = PyTuple_New(2); - if (unlikely(!args)) goto done; - Py_INCREF(arg1); - PyTuple_SET_ITEM(args, 0, arg1); - Py_INCREF(arg2); - PyTuple_SET_ITEM(args, 1, arg2); - Py_INCREF(function); - result = __Pyx_PyObject_Call(function, args, NULL); - Py_DECREF(args); - Py_DECREF(function); -done: - return result; -} - -/* PyObjectCallMethO */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { - PyObject *self, *result; - PyCFunction cfunc; - cfunc = PyCFunction_GET_FUNCTION(func); - self = PyCFunction_GET_SELF(func); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = cfunc(self, arg); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* PyObjectCallOneArg */ -#if CYTHON_COMPILING_IN_CPYTHON -static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *result; - PyObject *args = PyTuple_New(1); - if (unlikely(!args)) return NULL; - Py_INCREF(arg); - PyTuple_SET_ITEM(args, 0, arg); - result = __Pyx_PyObject_Call(func, args, NULL); - Py_DECREF(args); - return result; -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { -#if CYTHON_FAST_PYCALL - if (PyFunction_Check(func)) { - return __Pyx_PyFunction_FastCall(func, &arg, 1); - } -#endif - if (likely(PyCFunction_Check(func))) { - if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { - return __Pyx_PyObject_CallMethO(func, arg); -#if CYTHON_FAST_PYCCALL - } else if (__Pyx_PyFastCFunction_Check(func)) { - return __Pyx_PyCFunction_FastCall(func, &arg, 1); -#endif - } - } - return __Pyx__PyObject_CallOneArg(func, arg); -} -#else -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *result; - PyObject *args = PyTuple_Pack(1, arg); - if (unlikely(!args)) return NULL; - result = __Pyx_PyObject_Call(func, args, NULL); - Py_DECREF(args); - return result; -} -#endif - -/* PyErrFetchRestore */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - tmp_type = tstate->curexc_type; - tmp_value = tstate->curexc_value; - tmp_tb = tstate->curexc_traceback; - tstate->curexc_type = type; - tstate->curexc_value = value; - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -} -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - *type = tstate->curexc_type; - *value = tstate->curexc_value; - *tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -} -#endif - -/* RaiseException */ -#if PY_MAJOR_VERSION < 3 -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, - CYTHON_UNUSED PyObject *cause) { - __Pyx_PyThreadState_declare - Py_XINCREF(type); - if (!value || value == Py_None) - value = NULL; - else - Py_INCREF(value); - if (!tb || tb == Py_None) - tb = NULL; - else { - Py_INCREF(tb); - if (!PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto raise_error; - } - } - if (PyType_Check(type)) { -#if CYTHON_COMPILING_IN_PYPY - if (!value) { - Py_INCREF(Py_None); - value = Py_None; - } -#endif - PyErr_NormalizeException(&type, &value, &tb); - } else { - if (value) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto raise_error; - } - value = type; - type = (PyObject*) Py_TYPE(type); - Py_INCREF(type); - if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto raise_error; - } - } - __Pyx_PyThreadState_assign - __Pyx_ErrRestore(type, value, tb); - return; -raise_error: - Py_XDECREF(value); - Py_XDECREF(type); - Py_XDECREF(tb); - return; -} -#else -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { - PyObject* owned_instance = NULL; - if (tb == Py_None) { - tb = 0; - } else if (tb && !PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto bad; - } - if (value == Py_None) - value = 0; - if (PyExceptionInstance_Check(type)) { - if (value) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto bad; - } - value = type; - type = (PyObject*) Py_TYPE(value); - } else if (PyExceptionClass_Check(type)) { - PyObject *instance_class = NULL; - if (value && PyExceptionInstance_Check(value)) { - instance_class = (PyObject*) Py_TYPE(value); - if (instance_class != type) { - int is_subclass = PyObject_IsSubclass(instance_class, type); - if (!is_subclass) { - instance_class = NULL; - } else if (unlikely(is_subclass == -1)) { - goto bad; - } else { - type = instance_class; - } - } - } - if (!instance_class) { - PyObject *args; - if (!value) - args = PyTuple_New(0); - else if (PyTuple_Check(value)) { - Py_INCREF(value); - args = value; - } else - args = PyTuple_Pack(1, value); - if (!args) - goto bad; - owned_instance = PyObject_Call(type, args, NULL); - Py_DECREF(args); - if (!owned_instance) - goto bad; - value = owned_instance; - if (!PyExceptionInstance_Check(value)) { - PyErr_Format(PyExc_TypeError, - "calling %R should have returned an instance of " - "BaseException, not %R", - type, Py_TYPE(value)); - goto bad; - } - } - } else { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto bad; - } - if (cause) { - PyObject *fixed_cause; - if (cause == Py_None) { - fixed_cause = NULL; - } else if (PyExceptionClass_Check(cause)) { - fixed_cause = PyObject_CallObject(cause, NULL); - if (fixed_cause == NULL) - goto bad; - } else if (PyExceptionInstance_Check(cause)) { - fixed_cause = cause; - Py_INCREF(fixed_cause); - } else { - PyErr_SetString(PyExc_TypeError, - "exception causes must derive from " - "BaseException"); - goto bad; - } - PyException_SetCause(value, fixed_cause); - } - PyErr_SetObject(type, value); - if (tb) { -#if CYTHON_COMPILING_IN_PYPY - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); - Py_INCREF(tb); - PyErr_Restore(tmp_type, tmp_value, tb); - Py_XDECREF(tmp_tb); -#else - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject* tmp_tb = tstate->curexc_traceback; - if (tb != tmp_tb) { - Py_INCREF(tb); - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_tb); - } -#endif - } -bad: - Py_XDECREF(owned_instance); - return; -} -#endif - -/* GetAttr */ -static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { -#if CYTHON_USE_TYPE_SLOTS -#if PY_MAJOR_VERSION >= 3 - if (likely(PyUnicode_Check(n))) -#else - if (likely(PyString_Check(n))) -#endif - return __Pyx_PyObject_GetAttrStr(o, n); -#endif - return PyObject_GetAttr(o, n); -} - -/* GetAttr3 */ -static PyObject *__Pyx_GetAttr3Default(PyObject *d) { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) - return NULL; - __Pyx_PyErr_Clear(); - Py_INCREF(d); - return d; -} -static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { - PyObject *r = __Pyx_GetAttr(o, n); - return (likely(r)) ? r : __Pyx_GetAttr3Default(d); -} - -/* PyDictVersioning */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { - PyObject **dictptr = NULL; - Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; - if (offset) { -#if CYTHON_COMPILING_IN_CPYTHON - dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); -#else - dictptr = _PyObject_GetDictPtr(obj); -#endif - } - return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; -} -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) - return 0; - return obj_dict_version == __Pyx_get_object_dict_version(obj); -} -#endif - -/* GetModuleGlobalName */ -#if CYTHON_USE_DICT_VERSIONS -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) -#else -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) -#endif -{ - PyObject *result; -#if !CYTHON_AVOID_BORROWED_REFS -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 - result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } else if (unlikely(PyErr_Occurred())) { - return NULL; - } -#else - result = PyDict_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } -#endif -#else - result = PyObject_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } - PyErr_Clear(); -#endif - return __Pyx_GetBuiltinName(name); -} - -/* Import */ -static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { - PyObject *empty_list = 0; - PyObject *module = 0; - PyObject *global_dict = 0; - PyObject *empty_dict = 0; - PyObject *list; - #if PY_MAJOR_VERSION < 3 - PyObject *py_import; - py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); - if (!py_import) - goto bad; - #endif - if (from_list) - list = from_list; - else { - empty_list = PyList_New(0); - if (!empty_list) - goto bad; - list = empty_list; - } - global_dict = PyModule_GetDict(__pyx_m); - if (!global_dict) - goto bad; - empty_dict = PyDict_New(); - if (!empty_dict) - goto bad; - { - #if PY_MAJOR_VERSION >= 3 - if (level == -1) { - if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { - module = PyImport_ImportModuleLevelObject( - name, global_dict, empty_dict, list, 1); - if (!module) { - if (!PyErr_ExceptionMatches(PyExc_ImportError)) - goto bad; - PyErr_Clear(); - } - } - level = 0; - } - #endif - if (!module) { - #if PY_MAJOR_VERSION < 3 - PyObject *py_level = PyInt_FromLong(level); - if (!py_level) - goto bad; - module = PyObject_CallFunctionObjArgs(py_import, - name, global_dict, empty_dict, list, py_level, (PyObject *)NULL); - Py_DECREF(py_level); - #else - module = PyImport_ImportModuleLevelObject( - name, global_dict, empty_dict, list, level); - #endif - } - } -bad: - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(py_import); - #endif - Py_XDECREF(empty_list); - Py_XDECREF(empty_dict); - return module; -} - -/* ImportFrom */ -static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { - PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); - if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Format(PyExc_ImportError, - #if PY_MAJOR_VERSION < 3 - "cannot import name %.230s", PyString_AS_STRING(name)); - #else - "cannot import name %S", name); - #endif - } - return value; -} - -/* HasAttr */ -static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { - PyObject *r; - if (unlikely(!__Pyx_PyBaseString_Check(n))) { - PyErr_SetString(PyExc_TypeError, - "hasattr(): attribute name must be string"); - return -1; - } - r = __Pyx_GetAttr(o, n); - if (unlikely(!r)) { - PyErr_Clear(); - return 0; - } else { - Py_DECREF(r); - return 1; - } -} - -/* PyObject_GenericGetAttrNoDict */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { - PyErr_Format(PyExc_AttributeError, -#if PY_MAJOR_VERSION >= 3 - "'%.50s' object has no attribute '%U'", - tp->tp_name, attr_name); -#else - "'%.50s' object has no attribute '%.400s'", - tp->tp_name, PyString_AS_STRING(attr_name)); -#endif - return NULL; -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { - PyObject *descr; - PyTypeObject *tp = Py_TYPE(obj); - if (unlikely(!PyString_Check(attr_name))) { - return PyObject_GenericGetAttr(obj, attr_name); - } - assert(!tp->tp_dictoffset); - descr = _PyType_Lookup(tp, attr_name); - if (unlikely(!descr)) { - return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); - } - Py_INCREF(descr); - #if PY_MAJOR_VERSION < 3 - if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) - #endif - { - descrgetfunc f = Py_TYPE(descr)->tp_descr_get; - if (unlikely(f)) { - PyObject *res = f(descr, obj, (PyObject *)tp); - Py_DECREF(descr); - return res; - } - } - return descr; -} -#endif - -/* PyObject_GenericGetAttr */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { - if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { - return PyObject_GenericGetAttr(obj, attr_name); - } - return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); -} -#endif - -/* PyObjectGetAttrStrNoError */ -static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) - __Pyx_PyErr_Clear(); -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { - PyObject *result; -#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 - PyTypeObject* tp = Py_TYPE(obj); - if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { - return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); - } -#endif - result = __Pyx_PyObject_GetAttrStr(obj, attr_name); - if (unlikely(!result)) { - __Pyx_PyObject_GetAttrStr_ClearAttributeError(); - } - return result; -} - -/* SetupReduce */ -static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { - int ret; - PyObject *name_attr; - name_attr = __Pyx_PyObject_GetAttrStr(meth, __pyx_n_s_name); - if (likely(name_attr)) { - ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); - } else { - ret = -1; - } - if (unlikely(ret < 0)) { - PyErr_Clear(); - ret = 0; - } - Py_XDECREF(name_attr); - return ret; -} -static int __Pyx_setup_reduce(PyObject* type_obj) { - int ret = 0; - PyObject *object_reduce = NULL; - PyObject *object_reduce_ex = NULL; - PyObject *reduce = NULL; - PyObject *reduce_ex = NULL; - PyObject *reduce_cython = NULL; - PyObject *setstate = NULL; - PyObject *setstate_cython = NULL; -#if CYTHON_USE_PYTYPE_LOOKUP - if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; -#else - if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; -#endif -#if CYTHON_USE_PYTYPE_LOOKUP - object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; -#else - object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; -#endif - reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; - if (reduce_ex == object_reduce_ex) { -#if CYTHON_USE_PYTYPE_LOOKUP - object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; -#else - object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; -#endif - reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; - if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { - reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); - if (likely(reduce_cython)) { - ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - } else if (reduce == object_reduce || PyErr_Occurred()) { - goto __PYX_BAD; - } - setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate); - if (!setstate) PyErr_Clear(); - if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { - setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); - if (likely(setstate_cython)) { - ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - } else if (!setstate || PyErr_Occurred()) { - goto __PYX_BAD; - } - } - PyType_Modified((PyTypeObject*)type_obj); - } - } - goto __PYX_GOOD; -__PYX_BAD: - if (!PyErr_Occurred()) - PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name); - ret = -1; -__PYX_GOOD: -#if !CYTHON_USE_PYTYPE_LOOKUP - Py_XDECREF(object_reduce); - Py_XDECREF(object_reduce_ex); -#endif - Py_XDECREF(reduce); - Py_XDECREF(reduce_ex); - Py_XDECREF(reduce_cython); - Py_XDECREF(setstate); - Py_XDECREF(setstate_cython); - return ret; -} - -/* CLineInTraceback */ -#ifndef CYTHON_CLINE_IN_TRACEBACK -static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { - PyObject *use_cline; - PyObject *ptype, *pvalue, *ptraceback; -#if CYTHON_COMPILING_IN_CPYTHON - PyObject **cython_runtime_dict; -#endif - if (unlikely(!__pyx_cython_runtime)) { - return c_line; - } - __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); -#if CYTHON_COMPILING_IN_CPYTHON - cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); - if (likely(cython_runtime_dict)) { - __PYX_PY_DICT_LOOKUP_IF_MODIFIED( - use_cline, *cython_runtime_dict, - __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) - } else -#endif - { - PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); - if (use_cline_obj) { - use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; - Py_DECREF(use_cline_obj); - } else { - PyErr_Clear(); - use_cline = NULL; - } - } - if (!use_cline) { - c_line = 0; - PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); - } - else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { - c_line = 0; - } - __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); - return c_line; -} -#endif - -/* CodeObjectCache */ -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { - int start = 0, mid = 0, end = count - 1; - if (end >= 0 && code_line > entries[end].code_line) { - return count; - } - while (start < end) { - mid = start + (end - start) / 2; - if (code_line < entries[mid].code_line) { - end = mid; - } else if (code_line > entries[mid].code_line) { - start = mid + 1; - } else { - return mid; - } - } - if (code_line <= entries[mid].code_line) { - return mid; - } else { - return mid + 1; - } -} -static PyCodeObject *__pyx_find_code_object(int code_line) { - PyCodeObject* code_object; - int pos; - if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { - return NULL; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { - return NULL; - } - code_object = __pyx_code_cache.entries[pos].code_object; - Py_INCREF(code_object); - return code_object; -} -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { - int pos, i; - __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; - if (unlikely(!code_line)) { - return; - } - if (unlikely(!entries)) { - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); - if (likely(entries)) { - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = 64; - __pyx_code_cache.count = 1; - entries[0].code_line = code_line; - entries[0].code_object = code_object; - Py_INCREF(code_object); - } - return; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { - PyCodeObject* tmp = entries[pos].code_object; - entries[pos].code_object = code_object; - Py_DECREF(tmp); - return; - } - if (__pyx_code_cache.count == __pyx_code_cache.max_count) { - int new_max = __pyx_code_cache.max_count + 64; - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( - __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); - if (unlikely(!entries)) { - return; - } - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = new_max; - } - for (i=__pyx_code_cache.count; i>pos; i--) { - entries[i] = entries[i-1]; - } - entries[pos].code_line = code_line; - entries[pos].code_object = code_object; - __pyx_code_cache.count++; - Py_INCREF(code_object); -} - -/* AddTraceback */ -#include "compile.h" -#include "frameobject.h" -#include "traceback.h" -static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( - const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyObject *py_srcfile = 0; - PyObject *py_funcname = 0; - #if PY_MAJOR_VERSION < 3 - py_srcfile = PyString_FromString(filename); - #else - py_srcfile = PyUnicode_FromString(filename); - #endif - if (!py_srcfile) goto bad; - if (c_line) { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - #else - py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - #endif - } - else { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromString(funcname); - #else - py_funcname = PyUnicode_FromString(funcname); - #endif - } - if (!py_funcname) goto bad; - py_code = __Pyx_PyCode_New( - 0, - 0, - 0, - 0, - 0, - __pyx_empty_bytes, /*PyObject *code,*/ - __pyx_empty_tuple, /*PyObject *consts,*/ - __pyx_empty_tuple, /*PyObject *names,*/ - __pyx_empty_tuple, /*PyObject *varnames,*/ - __pyx_empty_tuple, /*PyObject *freevars,*/ - __pyx_empty_tuple, /*PyObject *cellvars,*/ - py_srcfile, /*PyObject *filename,*/ - py_funcname, /*PyObject *name,*/ - py_line, - __pyx_empty_bytes /*PyObject *lnotab*/ - ); - Py_DECREF(py_srcfile); - Py_DECREF(py_funcname); - return py_code; -bad: - Py_XDECREF(py_srcfile); - Py_XDECREF(py_funcname); - return NULL; -} -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyFrameObject *py_frame = 0; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - if (c_line) { - c_line = __Pyx_CLineForTraceback(tstate, c_line); - } - py_code = __pyx_find_code_object(c_line ? -c_line : py_line); - if (!py_code) { - py_code = __Pyx_CreateCodeObjectForTraceback( - funcname, c_line, py_line, filename); - if (!py_code) goto bad; - __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); - } - py_frame = PyFrame_New( - tstate, /*PyThreadState *tstate,*/ - py_code, /*PyCodeObject *code,*/ - __pyx_d, /*PyObject *globals,*/ - 0 /*PyObject *locals*/ - ); - if (!py_frame) goto bad; - __Pyx_PyFrame_SetLineNumber(py_frame, py_line); - PyTraceBack_Here(py_frame); -bad: - Py_XDECREF(py_code); - Py_XDECREF(py_frame); -} - -/* CIntFromPyVerify */ -#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) -#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) -#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ - {\ - func_type value = func_value;\ - if (sizeof(target_type) < sizeof(func_type)) {\ - if (unlikely(value != (func_type) (target_type) value)) {\ - func_type zero = 0;\ - if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ - return (target_type) -1;\ - if (is_unsigned && unlikely(value < zero))\ - goto raise_neg_overflow;\ - else\ - goto raise_overflow;\ - }\ - }\ - return (target_type) value;\ - } - -/* CIntFromPy */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const long neg_one = (long) -1, const_zero = (long) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(long) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (long) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (long) 0; - case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) - case 2: - if (8 * sizeof(long) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { - return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(long) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { - return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(long) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { - return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (long) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(long) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (long) 0; - case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) - case -2: - if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(long) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(long) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(long) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - } -#endif - if (sizeof(long) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - long val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (long) -1; - } - } else { - long val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (long) -1; - val = __Pyx_PyInt_As_long(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to long"); - return (long) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to long"); - return (long) -1; -} - -/* CIntToPy */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const long neg_one = (long) -1, const_zero = (long) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(long) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(long) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(long) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(long), - little, !is_unsigned); - } -} - -/* CIntFromPy */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const int neg_one = (int) -1, const_zero = (int) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(int) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (int) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { - return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { - return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { - return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (int) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(int) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) - case -2: - if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - } -#endif - if (sizeof(int) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - int val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (int) -1; - } - } else { - int val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (int) -1; - val = __Pyx_PyInt_As_int(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to int"); - return (int) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to int"); - return (int) -1; -} - -/* FastTypeChecks */ -#if CYTHON_COMPILING_IN_CPYTHON -static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { - while (a) { - a = a->tp_base; - if (a == b) - return 1; - } - return b == &PyBaseObject_Type; -} -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { - PyObject *mro; - if (a == b) return 1; - mro = a->tp_mro; - if (likely(mro)) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(mro); - for (i = 0; i < n; i++) { - if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) - return 1; - } - return 0; - } - return __Pyx_InBases(a, b); -} -#if PY_MAJOR_VERSION == 2 -static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { - PyObject *exception, *value, *tb; - int res; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ErrFetch(&exception, &value, &tb); - res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - if (!res) { - res = PyObject_IsSubclass(err, exc_type2); - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - } - __Pyx_ErrRestore(exception, value, tb); - return res; -} -#else -static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { - int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; - if (!res) { - res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); - } - return res; -} -#endif -static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { - Py_ssize_t i, n; - assert(PyExceptionClass_Check(exc_type)); - n = PyTuple_GET_SIZE(tuple); -#if PY_MAJOR_VERSION >= 3 - for (i=0; ip) { - #if PY_MAJOR_VERSION < 3 - if (t->is_unicode) { - *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); - } else if (t->intern) { - *t->p = PyString_InternFromString(t->s); - } else { - *t->p = PyString_FromStringAndSize(t->s, t->n - 1); - } - #else - if (t->is_unicode | t->is_str) { - if (t->intern) { - *t->p = PyUnicode_InternFromString(t->s); - } else if (t->encoding) { - *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); - } else { - *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); - } - } else { - *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); - } - #endif - if (!*t->p) - return -1; - if (PyObject_Hash(*t->p) == -1) - return -1; - ++t; - } - return 0; -} - -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { - return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); -} -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { - Py_ssize_t ignore; - return __Pyx_PyObject_AsStringAndSize(o, &ignore); -} -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -#if !CYTHON_PEP393_ENABLED -static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - char* defenc_c; - PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); - if (!defenc) return NULL; - defenc_c = PyBytes_AS_STRING(defenc); -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - { - char* end = defenc_c + PyBytes_GET_SIZE(defenc); - char* c; - for (c = defenc_c; c < end; c++) { - if ((unsigned char) (*c) >= 128) { - PyUnicode_AsASCIIString(o); - return NULL; - } - } - } -#endif - *length = PyBytes_GET_SIZE(defenc); - return defenc_c; -} -#else -static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - if (likely(PyUnicode_IS_ASCII(o))) { - *length = PyUnicode_GET_LENGTH(o); - return PyUnicode_AsUTF8(o); - } else { - PyUnicode_AsASCIIString(o); - return NULL; - } -#else - return PyUnicode_AsUTF8AndSize(o, length); -#endif -} -#endif -#endif -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT - if ( -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - __Pyx_sys_getdefaultencoding_not_ascii && -#endif - PyUnicode_Check(o)) { - return __Pyx_PyUnicode_AsStringAndSize(o, length); - } else -#endif -#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) - if (PyByteArray_Check(o)) { - *length = PyByteArray_GET_SIZE(o); - return PyByteArray_AS_STRING(o); - } else -#endif - { - char* result; - int r = PyBytes_AsStringAndSize(o, &result, length); - if (unlikely(r < 0)) { - return NULL; - } else { - return result; - } - } -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { - int is_true = x == Py_True; - if (is_true | (x == Py_False) | (x == Py_None)) return is_true; - else return PyObject_IsTrue(x); -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { - int retval; - if (unlikely(!x)) return -1; - retval = __Pyx_PyObject_IsTrue(x); - Py_DECREF(x); - return retval; -} -static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { -#if PY_MAJOR_VERSION >= 3 - if (PyLong_Check(result)) { - if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, - "__int__ returned non-int (type %.200s). " - "The ability to return an instance of a strict subclass of int " - "is deprecated, and may be removed in a future version of Python.", - Py_TYPE(result)->tp_name)) { - Py_DECREF(result); - return NULL; - } - return result; - } -#endif - PyErr_Format(PyExc_TypeError, - "__%.4s__ returned non-%.4s (type %.200s)", - type_name, type_name, Py_TYPE(result)->tp_name); - Py_DECREF(result); - return NULL; -} -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { -#if CYTHON_USE_TYPE_SLOTS - PyNumberMethods *m; -#endif - const char *name = NULL; - PyObject *res = NULL; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x) || PyLong_Check(x))) -#else - if (likely(PyLong_Check(x))) -#endif - return __Pyx_NewRef(x); -#if CYTHON_USE_TYPE_SLOTS - m = Py_TYPE(x)->tp_as_number; - #if PY_MAJOR_VERSION < 3 - if (m && m->nb_int) { - name = "int"; - res = m->nb_int(x); - } - else if (m && m->nb_long) { - name = "long"; - res = m->nb_long(x); - } - #else - if (likely(m && m->nb_int)) { - name = "int"; - res = m->nb_int(x); - } - #endif -#else - if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { - res = PyNumber_Int(x); - } -#endif - if (likely(res)) { -#if PY_MAJOR_VERSION < 3 - if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { -#else - if (unlikely(!PyLong_CheckExact(res))) { -#endif - return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); - } - } - else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, - "an integer is required"); - } - return res; -} -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { - Py_ssize_t ival; - PyObject *x; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_CheckExact(b))) { - if (sizeof(Py_ssize_t) >= sizeof(long)) - return PyInt_AS_LONG(b); - else - return PyInt_AsSsize_t(b); - } -#endif - if (likely(PyLong_CheckExact(b))) { - #if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)b)->ob_digit; - const Py_ssize_t size = Py_SIZE(b); - if (likely(__Pyx_sst_abs(size) <= 1)) { - ival = likely(size) ? digits[0] : 0; - if (size == -1) ival = -ival; - return ival; - } else { - switch (size) { - case 2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - } - } - #endif - return PyLong_AsSsize_t(b); - } - x = PyNumber_Index(b); - if (!x) return -1; - ival = PyInt_AsSsize_t(x); - Py_DECREF(x); - return ival; -} -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { - return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); -} -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { - return PyInt_FromSize_t(ival); -} - - -#endif /* Py_PYTHON_H */ diff --git a/.venv/Lib/site-packages/aiohttp/_helpers.cp38-win_amd64.pyd b/.venv/Lib/site-packages/aiohttp/_helpers.cp38-win_amd64.pyd deleted file mode 100644 index 1710e42ea750b47d6d4c0e5faf590acec4f758ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48640 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 diff --git a/.venv/Lib/site-packages/aiohttp/_helpers.pyi b/.venv/Lib/site-packages/aiohttp/_helpers.pyi deleted file mode 100644 index 1e35893..0000000 --- a/.venv/Lib/site-packages/aiohttp/_helpers.pyi +++ /dev/null @@ -1,6 +0,0 @@ -from typing import Any - -class reify: - def __init__(self, wrapped: Any) -> None: ... - def __get__(self, inst: Any, owner: Any) -> Any: ... - def __set__(self, inst: Any, value: Any) -> None: ... diff --git a/.venv/Lib/site-packages/aiohttp/_helpers.pyx b/.venv/Lib/site-packages/aiohttp/_helpers.pyx deleted file mode 100644 index 665f367..0000000 --- a/.venv/Lib/site-packages/aiohttp/_helpers.pyx +++ /dev/null @@ -1,35 +0,0 @@ -cdef class reify: - """Use as a class method decorator. It operates almost exactly like - the Python `@property` decorator, but it puts the result of the - method it decorates into the instance dict after the first call, - effectively replacing the function it decorates with an instance - variable. It is, in Python parlance, a data descriptor. - - """ - - cdef object wrapped - cdef object name - - def __init__(self, wrapped): - self.wrapped = wrapped - self.name = wrapped.__name__ - - @property - def __doc__(self): - return self.wrapped.__doc__ - - def __get__(self, inst, owner): - try: - try: - return inst._cache[self.name] - except KeyError: - val = self.wrapped(inst) - inst._cache[self.name] = val - return val - except AttributeError: - if inst is None: - return self - raise - - def __set__(self, inst, value): - raise AttributeError("reified property is read-only") diff --git a/.venv/Lib/site-packages/aiohttp/_http_parser.c b/.venv/Lib/site-packages/aiohttp/_http_parser.c deleted file mode 100644 index 640de7b..0000000 --- a/.venv/Lib/site-packages/aiohttp/_http_parser.c +++ /dev/null @@ -1,23880 +0,0 @@ -/* Generated by Cython 0.29.24 */ - -#ifndef PY_SSIZE_T_CLEAN -#define PY_SSIZE_T_CLEAN -#endif /* PY_SSIZE_T_CLEAN */ -#include "Python.h" -#ifndef Py_PYTHON_H - #error Python headers needed to compile C extensions, please install development version of Python. -#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) - #error Cython requires Python 2.6+ or Python 3.3+. -#else -#define CYTHON_ABI "0_29_24" -#define CYTHON_HEX_VERSION 0x001D18F0 -#define CYTHON_FUTURE_DIVISION 1 -#include -#ifndef offsetof - #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) -#endif -#if !defined(WIN32) && !defined(MS_WINDOWS) - #ifndef __stdcall - #define __stdcall - #endif - #ifndef __cdecl - #define __cdecl - #endif - #ifndef __fastcall - #define __fastcall - #endif -#endif -#ifndef DL_IMPORT - #define DL_IMPORT(t) t -#endif -#ifndef DL_EXPORT - #define DL_EXPORT(t) t -#endif -#define __PYX_COMMA , -#ifndef HAVE_LONG_LONG - #if PY_VERSION_HEX >= 0x02070000 - #define HAVE_LONG_LONG - #endif -#endif -#ifndef PY_LONG_LONG - #define PY_LONG_LONG LONG_LONG -#endif -#ifndef Py_HUGE_VAL - #define Py_HUGE_VAL HUGE_VAL -#endif -#ifdef PYPY_VERSION - #define CYTHON_COMPILING_IN_PYPY 1 - #define CYTHON_COMPILING_IN_PYSTON 0 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #undef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 0 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #if PY_VERSION_HEX < 0x03050000 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #undef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #undef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 1 - #undef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 0 - #undef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 0 - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 -#elif defined(PYSTON_VERSION) - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_PYSTON 1 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 -#else - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_PYSTON 0 - #define CYTHON_COMPILING_IN_CPYTHON 1 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #if PY_VERSION_HEX < 0x02070000 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) - #define CYTHON_USE_PYTYPE_LOOKUP 1 - #endif - #if PY_MAJOR_VERSION < 3 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #if PY_VERSION_HEX < 0x02070000 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #elif !defined(CYTHON_USE_PYLONG_INTERNALS) - #define CYTHON_USE_PYLONG_INTERNALS 1 - #endif - #ifndef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 1 - #endif - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #if PY_VERSION_HEX < 0x030300F0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #elif !defined(CYTHON_USE_UNICODE_WRITER) - #define CYTHON_USE_UNICODE_WRITER 1 - #endif - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #ifndef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 1 - #endif - #ifndef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 1 - #endif - #ifndef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) - #endif - #ifndef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) - #endif - #ifndef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) - #endif - #ifndef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) - #endif -#endif -#if !defined(CYTHON_FAST_PYCCALL) -#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) -#endif -#if CYTHON_USE_PYLONG_INTERNALS - #include "longintrepr.h" - #undef SHIFT - #undef BASE - #undef MASK - #ifdef SIZEOF_VOID_P - enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; - #endif -#endif -#ifndef __has_attribute - #define __has_attribute(x) 0 -#endif -#ifndef __has_cpp_attribute - #define __has_cpp_attribute(x) 0 -#endif -#ifndef CYTHON_RESTRICT - #if defined(__GNUC__) - #define CYTHON_RESTRICT __restrict__ - #elif defined(_MSC_VER) && _MSC_VER >= 1400 - #define CYTHON_RESTRICT __restrict - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_RESTRICT restrict - #else - #define CYTHON_RESTRICT - #endif -#endif -#ifndef CYTHON_UNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -#endif -#ifndef CYTHON_MAYBE_UNUSED_VAR -# if defined(__cplusplus) - template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } -# else -# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) -# endif -#endif -#ifndef CYTHON_NCP_UNUSED -# if CYTHON_COMPILING_IN_CPYTHON -# define CYTHON_NCP_UNUSED -# else -# define CYTHON_NCP_UNUSED CYTHON_UNUSED -# endif -#endif -#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) -#ifdef _MSC_VER - #ifndef _MSC_STDINT_H_ - #if _MSC_VER < 1300 - typedef unsigned char uint8_t; - typedef unsigned int uint32_t; - #else - typedef unsigned __int8 uint8_t; - typedef unsigned __int32 uint32_t; - #endif - #endif -#else - #include -#endif -#ifndef CYTHON_FALLTHROUGH - #if defined(__cplusplus) && __cplusplus >= 201103L - #if __has_cpp_attribute(fallthrough) - #define CYTHON_FALLTHROUGH [[fallthrough]] - #elif __has_cpp_attribute(clang::fallthrough) - #define CYTHON_FALLTHROUGH [[clang::fallthrough]] - #elif __has_cpp_attribute(gnu::fallthrough) - #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] - #endif - #endif - #ifndef CYTHON_FALLTHROUGH - #if __has_attribute(fallthrough) - #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) - #else - #define CYTHON_FALLTHROUGH - #endif - #endif - #if defined(__clang__ ) && defined(__apple_build_version__) - #if __apple_build_version__ < 7000000 - #undef CYTHON_FALLTHROUGH - #define CYTHON_FALLTHROUGH - #endif - #endif -#endif - -#ifndef CYTHON_INLINE - #if defined(__clang__) - #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) - #elif defined(__GNUC__) - #define CYTHON_INLINE __inline__ - #elif defined(_MSC_VER) - #define CYTHON_INLINE __inline - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_INLINE inline - #else - #define CYTHON_INLINE - #endif -#endif - -#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) - #define Py_OptimizeFlag 0 -#endif -#define __PYX_BUILD_PY_SSIZE_T "n" -#define CYTHON_FORMAT_SSIZE_T "z" -#if PY_MAJOR_VERSION < 3 - #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) - #define __Pyx_DefaultClassType PyClass_Type -#else - #define __Pyx_BUILTIN_MODULE_NAME "builtins" -#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#else - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#endif - #define __Pyx_DefaultClassType PyType_Type -#endif -#ifndef Py_TPFLAGS_CHECKTYPES - #define Py_TPFLAGS_CHECKTYPES 0 -#endif -#ifndef Py_TPFLAGS_HAVE_INDEX - #define Py_TPFLAGS_HAVE_INDEX 0 -#endif -#ifndef Py_TPFLAGS_HAVE_NEWBUFFER - #define Py_TPFLAGS_HAVE_NEWBUFFER 0 -#endif -#ifndef Py_TPFLAGS_HAVE_FINALIZE - #define Py_TPFLAGS_HAVE_FINALIZE 0 -#endif -#ifndef METH_STACKLESS - #define METH_STACKLESS 0 -#endif -#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) - #ifndef METH_FASTCALL - #define METH_FASTCALL 0x80 - #endif - typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); - typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, - Py_ssize_t nargs, PyObject *kwnames); -#else - #define __Pyx_PyCFunctionFast _PyCFunctionFast - #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords -#endif -#if CYTHON_FAST_PYCCALL -#define __Pyx_PyFastCFunction_Check(func)\ - ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) -#else -#define __Pyx_PyFastCFunction_Check(func) 0 -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) - #define PyObject_Malloc(s) PyMem_Malloc(s) - #define PyObject_Free(p) PyMem_Free(p) - #define PyObject_Realloc(p) PyMem_Realloc(p) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 - #define PyMem_RawMalloc(n) PyMem_Malloc(n) - #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) - #define PyMem_RawFree(p) PyMem_Free(p) -#endif -#if CYTHON_COMPILING_IN_PYSTON - #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) -#else - #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) -#endif -#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#elif PY_VERSION_HEX >= 0x03060000 - #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() -#elif PY_VERSION_HEX >= 0x03000000 - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#else - #define __Pyx_PyThreadState_Current _PyThreadState_Current -#endif -#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) -#include "pythread.h" -#define Py_tss_NEEDS_INIT 0 -typedef int Py_tss_t; -static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { - *key = PyThread_create_key(); - return 0; -} -static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { - Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); - *key = Py_tss_NEEDS_INIT; - return key; -} -static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { - PyObject_Free(key); -} -static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { - return *key != Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { - PyThread_delete_key(*key); - *key = Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { - return PyThread_set_key_value(*key, value); -} -static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { - return PyThread_get_key_value(*key); -} -#endif -#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) -#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) -#else -#define __Pyx_PyDict_NewPresized(n) PyDict_New() -#endif -#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION - #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) -#else - #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS -#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) -#else -#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) -#endif -#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) - #define CYTHON_PEP393_ENABLED 1 - #if defined(PyUnicode_IS_READY) - #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ - 0 : _PyUnicode_Ready((PyObject *)(op))) - #else - #define __Pyx_PyUnicode_READY(op) (0) - #endif - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) - #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) - #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) - #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) - #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) - #else - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) - #endif - #else - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) - #endif -#else - #define CYTHON_PEP393_ENABLED 0 - #define PyUnicode_1BYTE_KIND 1 - #define PyUnicode_2BYTE_KIND 2 - #define PyUnicode_4BYTE_KIND 4 - #define __Pyx_PyUnicode_READY(op) (0) - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) - #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) - #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) - #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) -#endif -#if CYTHON_COMPILING_IN_PYPY - #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) -#else - #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ - PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) - #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) - #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) - #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) -#endif -#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) -#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) -#else - #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) -#endif -#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) - #define PyObject_ASCII(o) PyObject_Repr(o) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBaseString_Type PyUnicode_Type - #define PyStringObject PyUnicodeObject - #define PyString_Type PyUnicode_Type - #define PyString_Check PyUnicode_Check - #define PyString_CheckExact PyUnicode_CheckExact -#ifndef PyObject_Unicode - #define PyObject_Unicode PyObject_Str -#endif -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) - #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) -#else - #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) - #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) -#endif -#ifndef PySet_CheckExact - #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) -#endif -#if PY_VERSION_HEX >= 0x030900A4 - #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) -#else - #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) -#endif -#if CYTHON_ASSUME_SAFE_MACROS - #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) -#else - #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyIntObject PyLongObject - #define PyInt_Type PyLong_Type - #define PyInt_Check(op) PyLong_Check(op) - #define PyInt_CheckExact(op) PyLong_CheckExact(op) - #define PyInt_FromString PyLong_FromString - #define PyInt_FromUnicode PyLong_FromUnicode - #define PyInt_FromLong PyLong_FromLong - #define PyInt_FromSize_t PyLong_FromSize_t - #define PyInt_FromSsize_t PyLong_FromSsize_t - #define PyInt_AsLong PyLong_AsLong - #define PyInt_AS_LONG PyLong_AS_LONG - #define PyInt_AsSsize_t PyLong_AsSsize_t - #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask - #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask - #define PyNumber_Int PyNumber_Long -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBoolObject PyLongObject -#endif -#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY - #ifndef PyUnicode_InternFromString - #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) - #endif -#endif -#if PY_VERSION_HEX < 0x030200A4 - typedef long Py_hash_t; - #define __Pyx_PyInt_FromHash_t PyInt_FromLong - #define __Pyx_PyInt_AsHash_t PyInt_AsLong -#else - #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t - #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) -#else - #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) -#endif -#if CYTHON_USE_ASYNC_SLOTS - #if PY_VERSION_HEX >= 0x030500B1 - #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods - #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) - #else - #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) - #endif -#else - #define __Pyx_PyType_AsAsync(obj) NULL -#endif -#ifndef __Pyx_PyAsyncMethodsStruct - typedef struct { - unaryfunc am_await; - unaryfunc am_aiter; - unaryfunc am_anext; - } __Pyx_PyAsyncMethodsStruct; -#endif - -#if defined(WIN32) || defined(MS_WINDOWS) - #define _USE_MATH_DEFINES -#endif -#include -#ifdef NAN -#define __PYX_NAN() ((float) NAN) -#else -static CYTHON_INLINE float __PYX_NAN() { - float value; - memset(&value, 0xFF, sizeof(value)); - return value; -} -#endif -#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) -#define __Pyx_truncl trunc -#else -#define __Pyx_truncl truncl -#endif - -#define __PYX_MARK_ERR_POS(f_index, lineno) \ - { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } -#define __PYX_ERR(f_index, lineno, Ln_error) \ - { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } - -#ifndef __PYX_EXTERN_C - #ifdef __cplusplus - #define __PYX_EXTERN_C extern "C" - #else - #define __PYX_EXTERN_C extern - #endif -#endif - -#define __PYX_HAVE__aiohttp___http_parser -#define __PYX_HAVE_API__aiohttp___http_parser -/* Early includes */ -#include -#include -#include "pythread.h" -#include -#include -#include "../vendor/llhttp/build/llhttp.h" -#include "_find_header.h" -#ifdef _OPENMP -#include -#endif /* _OPENMP */ - -#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) -#define CYTHON_WITHOUT_ASSERTIONS -#endif - -typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; - const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; - -#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) -#define __PYX_DEFAULT_STRING_ENCODING "" -#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString -#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#define __Pyx_uchar_cast(c) ((unsigned char)c) -#define __Pyx_long_cast(x) ((long)x) -#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ - (sizeof(type) < sizeof(Py_ssize_t)) ||\ - (sizeof(type) > sizeof(Py_ssize_t) &&\ - likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX) &&\ - (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ - v == (type)PY_SSIZE_T_MIN))) ||\ - (sizeof(type) == sizeof(Py_ssize_t) &&\ - (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX))) ) -static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { - return (size_t) i < (size_t) limit; -} -#if defined (__cplusplus) && __cplusplus >= 201103L - #include - #define __Pyx_sst_abs(value) std::abs(value) -#elif SIZEOF_INT >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) abs(value) -#elif SIZEOF_LONG >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) labs(value) -#elif defined (_MSC_VER) - #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) -#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define __Pyx_sst_abs(value) llabs(value) -#elif defined (__GNUC__) - #define __Pyx_sst_abs(value) __builtin_llabs(value) -#else - #define __Pyx_sst_abs(value) ((value<0) ? -value : value) -#endif -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); -#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) -#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) -#define __Pyx_PyBytes_FromString PyBytes_FromString -#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); -#if PY_MAJOR_VERSION < 3 - #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#else - #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize -#endif -#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) -#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) -#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) -#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) -#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { - const Py_UNICODE *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) -#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode -#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode -#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) -#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); -#define __Pyx_PySequence_Tuple(obj)\ - (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); -#if CYTHON_ASSUME_SAFE_MACROS -#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) -#else -#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) -#endif -#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) -#if PY_MAJOR_VERSION >= 3 -#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) -#else -#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) -#endif -#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII -static int __Pyx_sys_getdefaultencoding_not_ascii; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - PyObject* ascii_chars_u = NULL; - PyObject* ascii_chars_b = NULL; - const char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - if (strcmp(default_encoding_c, "ascii") == 0) { - __Pyx_sys_getdefaultencoding_not_ascii = 0; - } else { - char ascii_chars[128]; - int c; - for (c = 0; c < 128; c++) { - ascii_chars[c] = c; - } - __Pyx_sys_getdefaultencoding_not_ascii = 1; - ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); - if (!ascii_chars_u) goto bad; - ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); - if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { - PyErr_Format( - PyExc_ValueError, - "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", - default_encoding_c); - goto bad; - } - Py_DECREF(ascii_chars_u); - Py_DECREF(ascii_chars_b); - } - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - Py_XDECREF(ascii_chars_u); - Py_XDECREF(ascii_chars_b); - return -1; -} -#endif -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) -#else -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -static char* __PYX_DEFAULT_STRING_ENCODING; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); - if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; - strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - return -1; -} -#endif -#endif - - -/* Test for GCC > 2.95 */ -#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) - #define likely(x) __builtin_expect(!!(x), 1) - #define unlikely(x) __builtin_expect(!!(x), 0) -#else /* !__GNUC__ or GCC < 2.95 */ - #define likely(x) (x) - #define unlikely(x) (x) -#endif /* __GNUC__ */ -static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } - -static PyObject *__pyx_m = NULL; -static PyObject *__pyx_d; -static PyObject *__pyx_b; -static PyObject *__pyx_cython_runtime = NULL; -static PyObject *__pyx_empty_tuple; -static PyObject *__pyx_empty_bytes; -static PyObject *__pyx_empty_unicode; -static int __pyx_lineno; -static int __pyx_clineno = 0; -static const char * __pyx_cfilenm= __FILE__; -static const char *__pyx_filename; - - -static const char *__pyx_f[] = { - "aiohttp\\_http_parser.pyx", - "stringsource", - "type.pxd", - "bool.pxd", - "complex.pxd", - "aiohttp\\_headers.pxi", -}; - -/*--- Type declarations ---*/ -struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage; -struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage; -struct __pyx_obj_7aiohttp_12_http_parser_HttpParser; -struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser; -struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser; -struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__; -struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr; -struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__; -struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr; -struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init; - -/* "aiohttp/_http_parser.pyx":328 - * - * cdef _init( - * self, cparser.llhttp_type mode, # <<<<<<<<<<<<<< - * object protocol, object loop, int limit, - * object timer=None, - */ -struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init { - int __pyx_n; - PyObject *timer; - size_t max_line_size; - size_t max_headers; - size_t max_field_size; - PyObject *payload_exception; - int response_with_body; - int read_until_eof; - int auto_decompress; -}; - -/* "aiohttp/_http_parser.pyx":110 - * - * @cython.freelist(DEFAULT_FREELIST_SIZE) - * cdef class RawRequestMessage: # <<<<<<<<<<<<<< - * cdef readonly str method - * cdef readonly str path - */ -struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage { - PyObject_HEAD - PyObject *method; - PyObject *path; - PyObject *version; - PyObject *headers; - PyObject *raw_headers; - PyObject *should_close; - PyObject *compression; - PyObject *upgrade; - PyObject *chunked; - PyObject *url; -}; - - -/* "aiohttp/_http_parser.pyx":210 - * - * @cython.freelist(DEFAULT_FREELIST_SIZE) - * cdef class RawResponseMessage: # <<<<<<<<<<<<<< - * cdef readonly object version # HttpVersion - * cdef readonly int code - */ -struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage { - PyObject_HEAD - PyObject *version; - int code; - PyObject *reason; - PyObject *headers; - PyObject *raw_headers; - PyObject *should_close; - PyObject *compression; - PyObject *upgrade; - PyObject *chunked; -}; - - -/* "aiohttp/_http_parser.pyx":272 - * - * @cython.internal - * cdef class HttpParser: # <<<<<<<<<<<<<< - * - * cdef: - */ -struct __pyx_obj_7aiohttp_12_http_parser_HttpParser { - PyObject_HEAD - struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *__pyx_vtab; - llhttp_t *_cparser; - llhttp_settings_t *_csettings; - PyObject *_raw_name; - PyObject *_raw_value; - int _has_value; - PyObject *_protocol; - PyObject *_loop; - PyObject *_timer; - size_t _max_line_size; - size_t _max_field_size; - size_t _max_headers; - int _response_with_body; - int _read_until_eof; - int _started; - PyObject *_url; - PyObject *_buf; - PyObject *_path; - PyObject *_reason; - PyObject *_headers; - PyObject *_raw_headers; - int _upgraded; - PyObject *_messages; - PyObject *_payload; - int _payload_error; - PyObject *_payload_exception; - PyObject *_last_error; - int _auto_decompress; - int _limit; - PyObject *_content_encoding; - Py_buffer py_buf; -}; - - -/* "aiohttp/_http_parser.pyx":568 - * - * - * cdef class HttpRequestParser(HttpParser): # <<<<<<<<<<<<<< - * - * def __init__( - */ -struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser { - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser __pyx_base; -}; - - -/* "aiohttp/_http_parser.pyx":621 - * - * - * cdef class HttpResponseParser(HttpParser): # <<<<<<<<<<<<<< - * - * def __init__( - */ -struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser { - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser __pyx_base; -}; - - -/* "aiohttp/_http_parser.pyx":135 - * self.url = url - * - * def __repr__(self): # <<<<<<<<<<<<<< - * info = [] - * info.append(("method", self.method)) - */ -struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ { - PyObject_HEAD - PyObject *__pyx_v_info; -}; - - -/* "aiohttp/_http_parser.pyx":147 - * info.append(("chunked", self.chunked)) - * info.append(("url", self.url)) - * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< - * return '' - * - */ -struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr { - PyObject_HEAD - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *__pyx_outer_scope; - PyObject *__pyx_v_name; - PyObject *__pyx_v_val; -}; - - -/* "aiohttp/_http_parser.pyx":233 - * self.chunked = chunked - * - * def __repr__(self): # <<<<<<<<<<<<<< - * info = [] - * info.append(("version", self.version)) - */ -struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ { - PyObject_HEAD - PyObject *__pyx_v_info; -}; - - -/* "aiohttp/_http_parser.pyx":244 - * info.append(("upgrade", self.upgrade)) - * info.append(("chunked", self.chunked)) - * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< - * return '' - * - */ -struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr { - PyObject_HEAD - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *__pyx_outer_scope; - PyObject *__pyx_v_name; - PyObject *__pyx_v_val; -}; - - - -/* "aiohttp/_http_parser.pyx":272 - * - * @cython.internal - * cdef class HttpParser: # <<<<<<<<<<<<<< - * - * cdef: - */ - -struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser { - PyObject *(*_init)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, enum llhttp_type, PyObject *, PyObject *, int, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args); - PyObject *(*_process_header)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); - PyObject *(*_on_header_field)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t); - PyObject *(*_on_header_value)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t); - PyObject *(*_on_headers_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); - PyObject *(*_on_message_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); - PyObject *(*_on_chunk_header)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); - PyObject *(*_on_chunk_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); - PyObject *(*_on_status_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); - PyObject *(*http_version)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); -}; -static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *__pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; -static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); - - -/* "aiohttp/_http_parser.pyx":568 - * - * - * cdef class HttpRequestParser(HttpParser): # <<<<<<<<<<<<<< - * - * def __init__( - */ - -struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser { - struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser __pyx_base; -}; -static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser *__pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser; - - -/* "aiohttp/_http_parser.pyx":621 - * - * - * cdef class HttpResponseParser(HttpParser): # <<<<<<<<<<<<<< - * - * def __init__( - */ - -struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser { - struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser __pyx_base; -}; -static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser *__pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser; - -/* --- Runtime support code (head) --- */ -/* Refnanny.proto */ -#ifndef CYTHON_REFNANNY - #define CYTHON_REFNANNY 0 -#endif -#if CYTHON_REFNANNY - typedef struct { - void (*INCREF)(void*, PyObject*, int); - void (*DECREF)(void*, PyObject*, int); - void (*GOTREF)(void*, PyObject*, int); - void (*GIVEREF)(void*, PyObject*, int); - void* (*SetupContext)(const char*, int, const char*); - void (*FinishContext)(void**); - } __Pyx_RefNannyAPIStruct; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); - #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; -#ifdef WITH_THREAD - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - if (acquire_gil) {\ - PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ - PyGILState_Release(__pyx_gilstate_save);\ - } else {\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ - } -#else - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) -#endif - #define __Pyx_RefNannyFinishContext()\ - __Pyx_RefNanny->FinishContext(&__pyx_refnanny) - #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) - #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) - #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) - #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) -#else - #define __Pyx_RefNannyDeclarations - #define __Pyx_RefNannySetupContext(name, acquire_gil) - #define __Pyx_RefNannyFinishContext() - #define __Pyx_INCREF(r) Py_INCREF(r) - #define __Pyx_DECREF(r) Py_DECREF(r) - #define __Pyx_GOTREF(r) - #define __Pyx_GIVEREF(r) - #define __Pyx_XINCREF(r) Py_XINCREF(r) - #define __Pyx_XDECREF(r) Py_XDECREF(r) - #define __Pyx_XGOTREF(r) - #define __Pyx_XGIVEREF(r) -#endif -#define __Pyx_XDECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_XDECREF(tmp);\ - } while (0) -#define __Pyx_DECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_DECREF(tmp);\ - } while (0) -#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) -#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) - -/* PyObjectGetAttrStr.proto */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) -#endif - -/* GetBuiltinName.proto */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name); - -/* GetItemInt.proto */ -#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ - (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ - __Pyx_GetItemInt_Generic(o, to_py_func(i)))) -#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ - (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, - int wraparound, int boundscheck); -#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ - (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, - int wraparound, int boundscheck); -static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, - int is_list, int wraparound, int boundscheck); - -/* decode_c_string_utf16.proto */ -static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, const char *errors) { - int byteorder = 0; - return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); -} -static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16LE(const char *s, Py_ssize_t size, const char *errors) { - int byteorder = -1; - return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); -} -static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16BE(const char *s, Py_ssize_t size, const char *errors) { - int byteorder = 1; - return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); -} - -/* decode_c_bytes.proto */ -static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes( - const char* cstring, Py_ssize_t length, Py_ssize_t start, Py_ssize_t stop, - const char* encoding, const char* errors, - PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)); - -/* decode_bytes.proto */ -static CYTHON_INLINE PyObject* __Pyx_decode_bytes( - PyObject* string, Py_ssize_t start, Py_ssize_t stop, - const char* encoding, const char* errors, - PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { - return __Pyx_decode_c_bytes( - PyBytes_AS_STRING(string), PyBytes_GET_SIZE(string), - start, stop, encoding, errors, decode_func); -} - -/* RaiseArgTupleInvalid.proto */ -static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, - Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); - -/* RaiseDoubleKeywords.proto */ -static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); - -/* ParseKeywords.proto */ -static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ - PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ - const char* function_name); - -/* None.proto */ -static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname); - -/* RaiseTooManyValuesToUnpack.proto */ -static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); - -/* RaiseNeedMoreValuesToUnpack.proto */ -static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); - -/* IterFinish.proto */ -static CYTHON_INLINE int __Pyx_IterFinish(void); - -/* UnpackItemEndCheck.proto */ -static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); - -/* ListCompAppend.proto */ -#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS -static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { - PyListObject* L = (PyListObject*) list; - Py_ssize_t len = Py_SIZE(list); - if (likely(L->allocated > len)) { - Py_INCREF(x); - PyList_SET_ITEM(list, len, x); - __Pyx_SET_SIZE(list, len + 1); - return 0; - } - return PyList_Append(list, x); -} -#else -#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) -#endif - -/* ListAppend.proto */ -#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS -static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { - PyListObject* L = (PyListObject*) list; - Py_ssize_t len = Py_SIZE(list); - if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { - Py_INCREF(x); - PyList_SET_ITEM(list, len, x); - __Pyx_SET_SIZE(list, len + 1); - return 0; - } - return PyList_Append(list, x); -} -#else -#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) -#endif - -/* KeywordStringCheck.proto */ -static int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed); - -/* ExtTypeTest.proto */ -static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); - -/* PyDictContains.proto */ -static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObject* dict, int eq) { - int result = PyDict_Contains(dict, item); - return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); -} - -/* DictGetItem.proto */ -#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY -static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); -#define __Pyx_PyObject_Dict_GetItem(obj, name)\ - (likely(PyDict_CheckExact(obj)) ?\ - __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) -#else -#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) -#define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) -#endif - -/* PyErrExceptionMatches.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) -static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); -#else -#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) -#endif - -/* PyThreadStateGet.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; -#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; -#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type -#else -#define __Pyx_PyThreadState_declare -#define __Pyx_PyThreadState_assign -#define __Pyx_PyErr_Occurred() PyErr_Occurred() -#endif - -/* PyErrFetchRestore.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) -#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) -#else -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#endif -#else -#define __Pyx_PyErr_Clear() PyErr_Clear() -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) -#endif - -/* GetAttr.proto */ -static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); - -/* GetAttr3.proto */ -static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); - -/* PyDictVersioning.proto */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) -#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ - (version_var) = __PYX_GET_DICT_VERSION(dict);\ - (cache_var) = (value); -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ - (VAR) = __pyx_dict_cached_value;\ - } else {\ - (VAR) = __pyx_dict_cached_value = (LOOKUP);\ - __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ - }\ -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); -#else -#define __PYX_GET_DICT_VERSION(dict) (0) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); -#endif - -/* GetModuleGlobalName.proto */ -#if CYTHON_USE_DICT_VERSIONS -#define __Pyx_GetModuleGlobalName(var, name) {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ - (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ - __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} -#define __Pyx_GetModuleGlobalNameUncached(var, name) {\ - PY_UINT64_T __pyx_dict_version;\ - PyObject *__pyx_dict_cached_value;\ - (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); -#else -#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) -#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); -#endif - -/* PyFunctionFastCall.proto */ -#if CYTHON_FAST_PYCALL -#define __Pyx_PyFunction_FastCall(func, args, nargs)\ - __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) -#if 1 || PY_VERSION_HEX < 0x030600B1 -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); -#else -#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) -#endif -#define __Pyx_BUILD_ASSERT_EXPR(cond)\ - (sizeof(char [1 - 2*!(cond)]) - 1) -#ifndef Py_MEMBER_SIZE -#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) -#endif - static size_t __pyx_pyframe_localsplus_offset = 0; - #include "frameobject.h" - #define __Pxy_PyFrame_Initialize_Offsets()\ - ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ - (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) - #define __Pyx_PyFrame_GetLocalsplus(frame)\ - (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) -#endif - -/* PyObjectCall.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); -#else -#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) -#endif - -/* PyObjectCallMethO.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); -#endif - -/* PyObjectCallNoArg.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); -#else -#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL) -#endif - -/* PyCFunctionFastCall.proto */ -#if CYTHON_FAST_PYCCALL -static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); -#else -#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) -#endif - -/* PyObjectCallOneArg.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); - -/* PyObjectCall2Args.proto */ -static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); - -/* PySequenceContains.proto */ -static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { - int result = PySequence_Contains(seq, item); - return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); -} - -/* RaiseException.proto */ -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); - -/* IncludeStringH.proto */ -#include - -/* BytesEquals.proto */ -static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); - -/* UnicodeEquals.proto */ -static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); - -/* SliceObject.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice( - PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, - PyObject** py_start, PyObject** py_stop, PyObject** py_slice, - int has_cstart, int has_cstop, int wraparound); - -/* decode_bytearray.proto */ -static CYTHON_INLINE PyObject* __Pyx_decode_bytearray( - PyObject* string, Py_ssize_t start, Py_ssize_t stop, - const char* encoding, const char* errors, - PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { - return __Pyx_decode_c_bytes( - PyByteArray_AS_STRING(string), PyByteArray_GET_SIZE(string), - start, stop, encoding, errors, decode_func); -} - -/* PyUnicode_Substring.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( - PyObject* text, Py_ssize_t start, Py_ssize_t stop); - -/* GetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); -#endif - -/* SwapException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#else -static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); -#endif - -/* GetTopmostException.proto */ -#if CYTHON_USE_EXC_INFO_STACK -static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); -#endif - -/* SaveResetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -#else -#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) -#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) -#endif - -/* Import.proto */ -static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); - -/* ImportFrom.proto */ -static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); - -/* HasAttr.proto */ -static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); - -/* PyObject_GenericGetAttrNoDict.proto */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr -#endif - -/* PyObject_GenericGetAttr.proto */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr -#endif - -/* PyObjectGetAttrStrNoError.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); - -/* SetupReduce.proto */ -static int __Pyx_setup_reduce(PyObject* type_obj); - -/* SetVTable.proto */ -static int __Pyx_SetVtable(PyObject *dict, void *vtable); - -/* TypeImport.proto */ -#ifndef __PYX_HAVE_RT_ImportType_proto -#define __PYX_HAVE_RT_ImportType_proto -enum __Pyx_ImportType_CheckSize { - __Pyx_ImportType_CheckSize_Error = 0, - __Pyx_ImportType_CheckSize_Warn = 1, - __Pyx_ImportType_CheckSize_Ignore = 2 -}; -static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); -#endif - -/* decode_c_string.proto */ -static CYTHON_INLINE PyObject* __Pyx_decode_c_string( - const char* cstring, Py_ssize_t start, Py_ssize_t stop, - const char* encoding, const char* errors, - PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)); - -/* CLineInTraceback.proto */ -#ifdef CYTHON_CLINE_IN_TRACEBACK -#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) -#else -static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); -#endif - -/* CodeObjectCache.proto */ -typedef struct { - PyCodeObject* code_object; - int code_line; -} __Pyx_CodeObjectCacheEntry; -struct __Pyx_CodeObjectCache { - int count; - int max_count; - __Pyx_CodeObjectCacheEntry* entries; -}; -static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); -static PyCodeObject *__pyx_find_code_object(int code_line); -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); - -/* AddTraceback.proto */ -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename); - -/* GCCDiagnostics.proto */ -#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) -#define __Pyx_HAS_GCC_DIAGNOSTIC -#endif - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); - -/* CIntFromPy.proto */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); - -/* CIntFromPy.proto */ -static CYTHON_INLINE enum llhttp_method __Pyx_PyInt_As_enum__llhttp_method(PyObject *); - -/* CIntFromPy.proto */ -static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *); - -/* CIntFromPy.proto */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint8_t(uint8_t value); - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); - -/* FastTypeChecks.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); -#else -#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) -#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) -#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) -#endif -#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) - -/* FetchCommonType.proto */ -static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); - -/* PyObjectGetMethod.proto */ -static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); - -/* PyObjectCallMethod1.proto */ -static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg); - -/* CoroutineBase.proto */ -typedef PyObject *(*__pyx_coroutine_body_t)(PyObject *, PyThreadState *, PyObject *); -#if CYTHON_USE_EXC_INFO_STACK -#define __Pyx_ExcInfoStruct _PyErr_StackItem -#else -typedef struct { - PyObject *exc_type; - PyObject *exc_value; - PyObject *exc_traceback; -} __Pyx_ExcInfoStruct; -#endif -typedef struct { - PyObject_HEAD - __pyx_coroutine_body_t body; - PyObject *closure; - __Pyx_ExcInfoStruct gi_exc_state; - PyObject *gi_weakreflist; - PyObject *classobj; - PyObject *yieldfrom; - PyObject *gi_name; - PyObject *gi_qualname; - PyObject *gi_modulename; - PyObject *gi_code; - PyObject *gi_frame; - int resume_label; - char is_running; -} __pyx_CoroutineObject; -static __pyx_CoroutineObject *__Pyx__Coroutine_New( - PyTypeObject *type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, - PyObject *name, PyObject *qualname, PyObject *module_name); -static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( - __pyx_CoroutineObject *gen, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, - PyObject *name, PyObject *qualname, PyObject *module_name); -static CYTHON_INLINE void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *self); -static int __Pyx_Coroutine_clear(PyObject *self); -static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value); -static PyObject *__Pyx_Coroutine_Close(PyObject *self); -static PyObject *__Pyx_Coroutine_Throw(PyObject *gen, PyObject *args); -#if CYTHON_USE_EXC_INFO_STACK -#define __Pyx_Coroutine_SwapException(self) -#define __Pyx_Coroutine_ResetAndClearException(self) __Pyx_Coroutine_ExceptionClear(&(self)->gi_exc_state) -#else -#define __Pyx_Coroutine_SwapException(self) {\ - __Pyx_ExceptionSwap(&(self)->gi_exc_state.exc_type, &(self)->gi_exc_state.exc_value, &(self)->gi_exc_state.exc_traceback);\ - __Pyx_Coroutine_ResetFrameBackpointer(&(self)->gi_exc_state);\ - } -#define __Pyx_Coroutine_ResetAndClearException(self) {\ - __Pyx_ExceptionReset((self)->gi_exc_state.exc_type, (self)->gi_exc_state.exc_value, (self)->gi_exc_state.exc_traceback);\ - (self)->gi_exc_state.exc_type = (self)->gi_exc_state.exc_value = (self)->gi_exc_state.exc_traceback = NULL;\ - } -#endif -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyGen_FetchStopIterationValue(pvalue)\ - __Pyx_PyGen__FetchStopIterationValue(__pyx_tstate, pvalue) -#else -#define __Pyx_PyGen_FetchStopIterationValue(pvalue)\ - __Pyx_PyGen__FetchStopIterationValue(__Pyx_PyThreadState_Current, pvalue) -#endif -static int __Pyx_PyGen__FetchStopIterationValue(PyThreadState *tstate, PyObject **pvalue); -static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state); - -/* PatchModuleWithCoroutine.proto */ -static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code); - -/* PatchGeneratorABC.proto */ -static int __Pyx_patch_abc(void); - -/* Generator.proto */ -#define __Pyx_Generator_USED -static PyTypeObject *__pyx_GeneratorType = 0; -#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType) -#define __Pyx_Generator_New(body, code, closure, name, qualname, module_name)\ - __Pyx__Coroutine_New(__pyx_GeneratorType, body, code, closure, name, qualname, module_name) -static PyObject *__Pyx_Generator_Next(PyObject *self); -static int __pyx_Generator_init(void); - -/* CheckBinaryVersion.proto */ -static int __Pyx_check_binary_version(void); - -/* InitStrings.proto */ -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); - -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__init(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, enum llhttp_type __pyx_v_mode, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args); /* proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__process_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_field(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length); /* proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_value(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length); /* proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_headers_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_message_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_status_complete(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ -static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_parser_17HttpRequestParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self); /* proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_parser_18HttpResponseParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self); /* proto*/ - -/* Module declarations from 'cpython.version' */ - -/* Module declarations from '__builtin__' */ - -/* Module declarations from 'cpython.type' */ -static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; - -/* Module declarations from 'libc.string' */ - -/* Module declarations from 'libc.stdio' */ - -/* Module declarations from 'cpython.object' */ - -/* Module declarations from 'cpython.ref' */ - -/* Module declarations from 'cpython.exc' */ - -/* Module declarations from 'cpython.module' */ - -/* Module declarations from 'cpython.mem' */ - -/* Module declarations from 'cpython.tuple' */ - -/* Module declarations from 'cpython.list' */ - -/* Module declarations from 'cpython.sequence' */ - -/* Module declarations from 'cpython.mapping' */ - -/* Module declarations from 'cpython.iterator' */ - -/* Module declarations from 'cpython.number' */ - -/* Module declarations from 'cpython.int' */ - -/* Module declarations from '__builtin__' */ - -/* Module declarations from 'cpython.bool' */ -static PyTypeObject *__pyx_ptype_7cpython_4bool_bool = 0; - -/* Module declarations from 'cpython.long' */ - -/* Module declarations from 'cpython.float' */ - -/* Module declarations from '__builtin__' */ - -/* Module declarations from 'cpython.complex' */ -static PyTypeObject *__pyx_ptype_7cpython_7complex_complex = 0; - -/* Module declarations from 'cpython.string' */ - -/* Module declarations from 'cpython.unicode' */ - -/* Module declarations from 'cpython.dict' */ - -/* Module declarations from 'cpython.instance' */ - -/* Module declarations from 'cpython.function' */ - -/* Module declarations from 'cpython.method' */ - -/* Module declarations from 'cpython.weakref' */ - -/* Module declarations from 'cpython.getargs' */ - -/* Module declarations from 'cpython.pythread' */ - -/* Module declarations from 'cpython.pystate' */ - -/* Module declarations from 'cpython.cobject' */ - -/* Module declarations from 'cpython.oldbuffer' */ - -/* Module declarations from 'cpython.set' */ - -/* Module declarations from 'cpython.buffer' */ - -/* Module declarations from 'cpython.bytes' */ - -/* Module declarations from 'cpython.pycapsule' */ - -/* Module declarations from 'cpython' */ - -/* Module declarations from 'libc.limits' */ - -/* Module declarations from 'cython' */ - -/* Module declarations from 'aiohttp' */ - -/* Module declarations from 'libc.stdint' */ - -/* Module declarations from 'aiohttp._cparser' */ - -/* Module declarations from 'aiohttp._find_header' */ - -/* Module declarations from 'aiohttp._http_parser' */ -static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage = 0; -static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage = 0; -static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser_HttpParser = 0; -static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser = 0; -static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser = 0; -static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct____repr__ = 0; -static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = 0; -static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ = 0; -static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr = 0; -static PyObject *__pyx_v_7aiohttp_12_http_parser_headers = 0; -static PyObject *__pyx_v_7aiohttp_12_http_parser_URL = 0; -static PyObject *__pyx_v_7aiohttp_12_http_parser_URL_build = 0; -static PyObject *__pyx_v_7aiohttp_12_http_parser_CIMultiDict = 0; -static PyObject *__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy = 0; -static PyObject *__pyx_v_7aiohttp_12_http_parser_HttpVersion = 0; -static PyObject *__pyx_v_7aiohttp_12_http_parser_HttpVersion10 = 0; -static PyObject *__pyx_v_7aiohttp_12_http_parser_HttpVersion11 = 0; -static PyObject *__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1 = 0; -static PyObject *__pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING = 0; -static PyObject *__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD = 0; -static PyObject *__pyx_v_7aiohttp_12_http_parser_StreamReader = 0; -static PyObject *__pyx_v_7aiohttp_12_http_parser_DeflateBuffer = 0; -static PyObject *__pyx_v_7aiohttp_12_http_parser__http_method = 0; -static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_extend(PyObject *, char const *, size_t); /*proto*/ -static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_http_method_str(int); /*proto*/ -static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_find_header(PyObject *); /*proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_parser__new_request_message(PyObject *, PyObject *, PyObject *, PyObject *, PyObject *, int, PyObject *, int, int, PyObject *); /*proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_parser__new_response_message(PyObject *, int, PyObject *, PyObject *, PyObject *, int, PyObject *, int, int); /*proto*/ -static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_begin(llhttp_t *); /*proto*/ -static int __pyx_f_7aiohttp_12_http_parser_cb_on_url(llhttp_t *, char const *, size_t); /*proto*/ -static int __pyx_f_7aiohttp_12_http_parser_cb_on_status(llhttp_t *, char const *, size_t); /*proto*/ -static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_field(llhttp_t *, char const *, size_t); /*proto*/ -static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_value(llhttp_t *, char const *, size_t); /*proto*/ -static int __pyx_f_7aiohttp_12_http_parser_cb_on_headers_complete(llhttp_t *); /*proto*/ -static int __pyx_f_7aiohttp_12_http_parser_cb_on_body(llhttp_t *, char const *, size_t); /*proto*/ -static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_complete(llhttp_t *); /*proto*/ -static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_header(llhttp_t *); /*proto*/ -static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_complete(llhttp_t *); /*proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_parser_parser_error_from_errno(llhttp_t *); /*proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *, PyObject *); /*proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *, PyObject *); /*proto*/ -#define __Pyx_MODULE_NAME "aiohttp._http_parser" -extern int __pyx_module_is_main_aiohttp___http_parser; -int __pyx_module_is_main_aiohttp___http_parser = 0; - -/* Implementation of 'aiohttp._http_parser' */ -static PyObject *__pyx_builtin_range; -static PyObject *__pyx_builtin_MemoryError; -static PyObject *__pyx_builtin_TypeError; -static PyObject *__pyx_builtin_BaseException; -static const char __pyx_k_[] = "="; -static const char __pyx_k_i[] = "i"; -static const char __pyx_k_TE[] = "TE"; -static const char __pyx_k__2[] = ", "; -static const char __pyx_k__3[] = ")>"; -static const char __pyx_k__4[] = ""; -static const char __pyx_k__7[] = "?"; -static const char __pyx_k__8[] = "#"; -static const char __pyx_k_br[] = "br"; -static const char __pyx_k_AGE[] = "AGE"; -static const char __pyx_k_URI[] = "URI"; -static const char __pyx_k_URL[] = "URL"; -static const char __pyx_k_VIA[] = "VIA"; -static const char __pyx_k_add[] = "add"; -static const char __pyx_k_all[] = "__all__"; -static const char __pyx_k_new[] = "__new__"; -static const char __pyx_k_url[] = "url"; -static const char __pyx_k_DATE[] = "DATE"; -static const char __pyx_k_ETAG[] = "ETAG"; -static const char __pyx_k_FROM[] = "FROM"; -static const char __pyx_k_HOST[] = "HOST"; -static const char __pyx_k_LINK[] = "LINK"; -static const char __pyx_k_VARY[] = "VARY"; -static const char __pyx_k_args[] = "args"; -static const char __pyx_k_code[] = "code"; -static const char __pyx_k_dict[] = "__dict__"; -static const char __pyx_k_gzip[] = "gzip"; -static const char __pyx_k_hdrs[] = "hdrs"; -static const char __pyx_k_loop[] = "loop"; -static const char __pyx_k_main[] = "__main__"; -static const char __pyx_k_name[] = "__name__"; -static const char __pyx_k_path[] = "path"; -static const char __pyx_k_send[] = "send"; -static const char __pyx_k_test[] = "__test__"; -static const char __pyx_k_yarl[] = "yarl"; -static const char __pyx_k_ALLOW[] = "ALLOW"; -static const char __pyx_k_RANGE[] = "RANGE"; -static const char __pyx_k_URL_2[] = "_URL"; -static const char __pyx_k_build[] = "build"; -static const char __pyx_k_close[] = "close"; -static const char __pyx_k_limit[] = "limit"; -static const char __pyx_k_lower[] = "lower"; -static const char __pyx_k_range[] = "range"; -static const char __pyx_k_throw[] = "throw"; -static const char __pyx_k_timer[] = "timer"; -static const char __pyx_k_ACCEPT[] = "ACCEPT"; -static const char __pyx_k_COOKIE[] = "COOKIE"; -static const char __pyx_k_DIGEST[] = "DIGEST"; -static const char __pyx_k_EXPECT[] = "EXPECT"; -static const char __pyx_k_ORIGIN[] = "ORIGIN"; -static const char __pyx_k_PRAGMA[] = "PRAGMA"; -static const char __pyx_k_SERVER[] = "SERVER"; -static const char __pyx_k_import[] = "__import__"; -static const char __pyx_k_method[] = "method"; -static const char __pyx_k_pickle[] = "pickle"; -static const char __pyx_k_reason[] = "reason"; -static const char __pyx_k_reduce[] = "__reduce__"; -static const char __pyx_k_update[] = "update"; -static const char __pyx_k_EXPIRES[] = "EXPIRES"; -static const char __pyx_k_REFERER[] = "REFERER"; -static const char __pyx_k_TRAILER[] = "TRAILER"; -static const char __pyx_k_UPGRADE[] = "UPGRADE"; -static const char __pyx_k_WARNING[] = "WARNING"; -static const char __pyx_k_aiohttp[] = "aiohttp"; -static const char __pyx_k_chunked[] = "chunked"; -static const char __pyx_k_deflate[] = "deflate"; -static const char __pyx_k_encoded[] = "encoded"; -static const char __pyx_k_genexpr[] = "genexpr"; -static const char __pyx_k_headers[] = "headers"; -static const char __pyx_k_streams[] = "streams"; -static const char __pyx_k_unknown[] = ""; -static const char __pyx_k_upgrade[] = "upgrade"; -static const char __pyx_k_version[] = "version"; -static const char __pyx_k_IF_MATCH[] = "IF_MATCH"; -static const char __pyx_k_IF_RANGE[] = "IF_RANGE"; -static const char __pyx_k_LOCATION[] = "LOCATION"; -static const char __pyx_k_feed_eof[] = "feed_eof"; -static const char __pyx_k_fragment[] = "fragment"; -static const char __pyx_k_getstate[] = "__getstate__"; -static const char __pyx_k_protocol[] = "protocol"; -static const char __pyx_k_pyx_type[] = "__pyx_type"; -static const char __pyx_k_setstate[] = "__setstate__"; -static const char __pyx_k_FORWARDED[] = "FORWARDED"; -static const char __pyx_k_TypeError[] = "TypeError"; -static const char __pyx_k_feed_data[] = "feed_data"; -static const char __pyx_k_multidict[] = "multidict"; -static const char __pyx_k_pyx_state[] = "__pyx_state"; -static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; -static const char __pyx_k_CONNECTION[] = "CONNECTION"; -static const char __pyx_k_KEEP_ALIVE[] = "KEEP_ALIVE"; -static const char __pyx_k_SET_COOKIE[] = "SET_COOKIE"; -static const char __pyx_k_USER_AGENT[] = "USER_AGENT"; -static const char __pyx_k_pyx_result[] = "__pyx_result"; -static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; -static const char __pyx_k_CIMultiDict[] = "CIMultiDict"; -static const char __pyx_k_CONTENT_MD5[] = "CONTENT_MD5"; -static const char __pyx_k_DESTINATION[] = "DESTINATION"; -static const char __pyx_k_HttpVersion[] = "HttpVersion"; -static const char __pyx_k_LineTooLong[] = "LineTooLong"; -static const char __pyx_k_MemoryError[] = "MemoryError"; -static const char __pyx_k_PickleError[] = "PickleError"; -static const char __pyx_k_RETRY_AFTER[] = "RETRY_AFTER"; -static const char __pyx_k_WANT_DIGEST[] = "WANT_DIGEST"; -static const char __pyx_k_compression[] = "compression"; -static const char __pyx_k_http_parser[] = "http_parser"; -static const char __pyx_k_http_writer[] = "http_writer"; -static const char __pyx_k_max_headers[] = "max_headers"; -static const char __pyx_k_raw_headers[] = "raw_headers"; -static const char __pyx_k_CONTENT_TYPE[] = "CONTENT_TYPE"; -static const char __pyx_k_MAX_FORWARDS[] = "MAX_FORWARDS"; -static const char __pyx_k_StreamReader[] = "StreamReader"; -static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; -static const char __pyx_k_query_string[] = "query_string"; -static const char __pyx_k_should_close[] = "should_close"; -static const char __pyx_k_stringsource[] = "stringsource"; -static const char __pyx_k_ACCEPT_RANGES[] = "ACCEPT_RANGES"; -static const char __pyx_k_AUTHORIZATION[] = "AUTHORIZATION"; -static const char __pyx_k_BadStatusLine[] = "BadStatusLine"; -static const char __pyx_k_BaseException[] = "BaseException"; -static const char __pyx_k_CACHE_CONTROL[] = "CACHE_CONTROL"; -static const char __pyx_k_CIMultiDict_2[] = "_CIMultiDict"; -static const char __pyx_k_CONTENT_RANGE[] = "CONTENT_RANGE"; -static const char __pyx_k_DeflateBuffer[] = "DeflateBuffer"; -static const char __pyx_k_EMPTY_PAYLOAD[] = "EMPTY_PAYLOAD"; -static const char __pyx_k_HttpVersion10[] = "HttpVersion10"; -static const char __pyx_k_HttpVersion11[] = "HttpVersion11"; -static const char __pyx_k_HttpVersion_2[] = "_HttpVersion"; -static const char __pyx_k_IF_NONE_MATCH[] = "IF_NONE_MATCH"; -static const char __pyx_k_InvalidHeader[] = "InvalidHeader"; -static const char __pyx_k_LAST_EVENT_ID[] = "LAST_EVENT_ID"; -static const char __pyx_k_LAST_MODIFIED[] = "LAST_MODIFIED"; -static const char __pyx_k_max_line_size[] = "max_line_size"; -static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; -static const char __pyx_k_set_exception[] = "set_exception"; -static const char __pyx_k_ACCEPT_CHARSET[] = "ACCEPT_CHARSET"; -static const char __pyx_k_BadHttpMessage[] = "BadHttpMessage"; -static const char __pyx_k_CONTENT_LENGTH[] = "CONTENT_LENGTH"; -static const char __pyx_k_StreamReader_2[] = "_StreamReader"; -static const char __pyx_k_max_field_size[] = "max_field_size"; -static const char __pyx_k_read_until_eof[] = "read_until_eof"; -static const char __pyx_k_ACCEPT_ENCODING[] = "ACCEPT_ENCODING"; -static const char __pyx_k_ACCEPT_LANGUAGE[] = "ACCEPT_LANGUAGE"; -static const char __pyx_k_DeflateBuffer_2[] = "_DeflateBuffer"; -static const char __pyx_k_EMPTY_PAYLOAD_2[] = "_EMPTY_PAYLOAD"; -static const char __pyx_k_HttpVersion10_2[] = "_HttpVersion10"; -static const char __pyx_k_HttpVersion11_2[] = "_HttpVersion11"; -static const char __pyx_k_InvalidURLError[] = "InvalidURLError"; -static const char __pyx_k_X_FORWARDED_FOR[] = "X_FORWARDED_FOR"; -static const char __pyx_k_auto_decompress[] = "auto_decompress"; -static const char __pyx_k_http_exceptions[] = "http_exceptions"; -static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; -static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; -static const char __pyx_k_CIMultiDictProxy[] = "CIMultiDictProxy"; -static const char __pyx_k_CONTENT_ENCODING[] = "CONTENT_ENCODING"; -static const char __pyx_k_CONTENT_LANGUAGE[] = "CONTENT_LANGUAGE"; -static const char __pyx_k_CONTENT_LOCATION[] = "CONTENT_LOCATION"; -static const char __pyx_k_WWW_AUTHENTICATE[] = "WWW_AUTHENTICATE"; -static const char __pyx_k_X_FORWARDED_HOST[] = "X_FORWARDED_HOST"; -static const char __pyx_k_HttpRequestParser[] = "HttpRequestParser"; -static const char __pyx_k_IF_MODIFIED_SINCE[] = "IF_MODIFIED_SINCE"; -static const char __pyx_k_RawRequestMessage[] = "_http_method[i] - */ - -static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_http_method_str(int __pyx_v_i) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("http_method_str", 0); - - /* "aiohttp/_http_parser.pyx":93 - * - * cdef inline str http_method_str(int i): - * if i < METHODS_COUNT: # <<<<<<<<<<<<<< - * return _http_method[i] - * else: - */ - __pyx_t_1 = ((__pyx_v_i < 46) != 0); - if (__pyx_t_1) { - - /* "aiohttp/_http_parser.pyx":94 - * cdef inline str http_method_str(int i): - * if i < METHODS_COUNT: - * return _http_method[i] # <<<<<<<<<<<<<< - * else: - * return "" - */ - __Pyx_XDECREF(__pyx_r); - if (unlikely(__pyx_v_7aiohttp_12_http_parser__http_method == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(0, 94, __pyx_L1_error) - } - __pyx_t_2 = __Pyx_GetItemInt_List(__pyx_v_7aiohttp_12_http_parser__http_method, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 1, 1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 94, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(((PyObject*)__pyx_t_2)); - __pyx_r = ((PyObject*)__pyx_t_2); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":93 - * - * cdef inline str http_method_str(int i): - * if i < METHODS_COUNT: # <<<<<<<<<<<<<< - * return _http_method[i] - * else: - */ - } - - /* "aiohttp/_http_parser.pyx":96 - * return _http_method[i] - * else: - * return "" # <<<<<<<<<<<<<< - * - * cdef inline object find_header(bytes raw_header): - */ - /*else*/ { - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_kp_u_unknown); - __pyx_r = __pyx_kp_u_unknown; - goto __pyx_L0; - } - - /* "aiohttp/_http_parser.pyx":92 - * - * - * cdef inline str http_method_str(int i): # <<<<<<<<<<<<<< - * if i < METHODS_COUNT: - * return _http_method[i] - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("aiohttp._http_parser.http_method_str", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":98 - * return "" - * - * cdef inline object find_header(bytes raw_header): # <<<<<<<<<<<<<< - * cdef Py_ssize_t size - * cdef char *buf - */ - -static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_find_header(PyObject *__pyx_v_raw_header) { - Py_ssize_t __pyx_v_size; - char *__pyx_v_buf; - int __pyx_v_idx; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("find_header", 0); - - /* "aiohttp/_http_parser.pyx":102 - * cdef char *buf - * cdef int idx - * PyBytes_AsStringAndSize(raw_header, &buf, &size) # <<<<<<<<<<<<<< - * idx = _find_header.find_header(buf, size) - * if idx == -1: - */ - __pyx_t_1 = PyBytes_AsStringAndSize(__pyx_v_raw_header, (&__pyx_v_buf), (&__pyx_v_size)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 102, __pyx_L1_error) - - /* "aiohttp/_http_parser.pyx":103 - * cdef int idx - * PyBytes_AsStringAndSize(raw_header, &buf, &size) - * idx = _find_header.find_header(buf, size) # <<<<<<<<<<<<<< - * if idx == -1: - * return raw_header.decode('utf-8', 'surrogateescape') - */ - __pyx_v_idx = find_header(__pyx_v_buf, __pyx_v_size); - - /* "aiohttp/_http_parser.pyx":104 - * PyBytes_AsStringAndSize(raw_header, &buf, &size) - * idx = _find_header.find_header(buf, size) - * if idx == -1: # <<<<<<<<<<<<<< - * return raw_header.decode('utf-8', 'surrogateescape') - * return headers[idx] - */ - __pyx_t_2 = ((__pyx_v_idx == -1L) != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_parser.pyx":105 - * idx = _find_header.find_header(buf, size) - * if idx == -1: - * return raw_header.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< - * return headers[idx] - * - */ - __Pyx_XDECREF(__pyx_r); - if (unlikely(__pyx_v_raw_header == Py_None)) { - PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode"); - __PYX_ERR(0, 105, __pyx_L1_error) - } - __pyx_t_3 = __Pyx_decode_bytes(__pyx_v_raw_header, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 105, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_r = __pyx_t_3; - __pyx_t_3 = 0; - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":104 - * PyBytes_AsStringAndSize(raw_header, &buf, &size) - * idx = _find_header.find_header(buf, size) - * if idx == -1: # <<<<<<<<<<<<<< - * return raw_header.decode('utf-8', 'surrogateescape') - * return headers[idx] - */ - } - - /* "aiohttp/_http_parser.pyx":106 - * if idx == -1: - * return raw_header.decode('utf-8', 'surrogateescape') - * return headers[idx] # <<<<<<<<<<<<<< - * - * - */ - __Pyx_XDECREF(__pyx_r); - if (unlikely(__pyx_v_7aiohttp_12_http_parser_headers == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(0, 106, __pyx_L1_error) - } - __pyx_t_3 = __Pyx_GetItemInt_Tuple(__pyx_v_7aiohttp_12_http_parser_headers, __pyx_v_idx, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 106, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_r = __pyx_t_3; - __pyx_t_3 = 0; - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":98 - * return "" - * - * cdef inline object find_header(bytes raw_header): # <<<<<<<<<<<<<< - * cdef Py_ssize_t size - * cdef char *buf - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("aiohttp._http_parser.find_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":122 - * cdef readonly object url # yarl.URL - * - * def __init__(self, method, path, version, headers, raw_headers, # <<<<<<<<<<<<<< - * should_close, compression, upgrade, chunked, url): - * self.method = method - */ - -/* Python wrapper */ -static int __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_method = 0; - PyObject *__pyx_v_path = 0; - PyObject *__pyx_v_version = 0; - PyObject *__pyx_v_headers = 0; - PyObject *__pyx_v_raw_headers = 0; - PyObject *__pyx_v_should_close = 0; - PyObject *__pyx_v_compression = 0; - PyObject *__pyx_v_upgrade = 0; - PyObject *__pyx_v_chunked = 0; - PyObject *__pyx_v_url = 0; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_method,&__pyx_n_s_path,&__pyx_n_s_version,&__pyx_n_s_headers,&__pyx_n_s_raw_headers,&__pyx_n_s_should_close,&__pyx_n_s_compression,&__pyx_n_s_upgrade,&__pyx_n_s_chunked,&__pyx_n_s_url,0}; - PyObject* values[10] = {0,0,0,0,0,0,0,0,0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); - CYTHON_FALLTHROUGH; - case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); - CYTHON_FALLTHROUGH; - case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); - CYTHON_FALLTHROUGH; - case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); - CYTHON_FALLTHROUGH; - case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); - CYTHON_FALLTHROUGH; - case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - CYTHON_FALLTHROUGH; - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_method)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_path)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 1); __PYX_ERR(0, 122, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_version)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 2); __PYX_ERR(0, 122, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 3: - if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_headers)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 3); __PYX_ERR(0, 122, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 4: - if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_raw_headers)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 4); __PYX_ERR(0, 122, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 5: - if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_should_close)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 5); __PYX_ERR(0, 122, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 6: - if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_compression)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 6); __PYX_ERR(0, 122, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 7: - if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_upgrade)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 7); __PYX_ERR(0, 122, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 8: - if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_chunked)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 8); __PYX_ERR(0, 122, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 9: - if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_url)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 9); __PYX_ERR(0, 122, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 122, __pyx_L3_error) - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 10) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - values[5] = PyTuple_GET_ITEM(__pyx_args, 5); - values[6] = PyTuple_GET_ITEM(__pyx_args, 6); - values[7] = PyTuple_GET_ITEM(__pyx_args, 7); - values[8] = PyTuple_GET_ITEM(__pyx_args, 8); - values[9] = PyTuple_GET_ITEM(__pyx_args, 9); - } - __pyx_v_method = values[0]; - __pyx_v_path = values[1]; - __pyx_v_version = values[2]; - __pyx_v_headers = values[3]; - __pyx_v_raw_headers = values[4]; - __pyx_v_should_close = values[5]; - __pyx_v_compression = values[6]; - __pyx_v_upgrade = values[7]; - __pyx_v_chunked = values[8]; - __pyx_v_url = values[9]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 122, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage___init__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self), __pyx_v_method, __pyx_v_path, __pyx_v_version, __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_compression, __pyx_v_upgrade, __pyx_v_chunked, __pyx_v_url); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage___init__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self, PyObject *__pyx_v_method, PyObject *__pyx_v_path, PyObject *__pyx_v_version, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, PyObject *__pyx_v_should_close, PyObject *__pyx_v_compression, PyObject *__pyx_v_upgrade, PyObject *__pyx_v_chunked, PyObject *__pyx_v_url) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__init__", 0); - - /* "aiohttp/_http_parser.pyx":124 - * def __init__(self, method, path, version, headers, raw_headers, - * should_close, compression, upgrade, chunked, url): - * self.method = method # <<<<<<<<<<<<<< - * self.path = path - * self.version = version - */ - if (!(likely(PyUnicode_CheckExact(__pyx_v_method))||((__pyx_v_method) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_method)->tp_name), 0))) __PYX_ERR(0, 124, __pyx_L1_error) - __pyx_t_1 = __pyx_v_method; - __Pyx_INCREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v_self->method); - __Pyx_DECREF(__pyx_v_self->method); - __pyx_v_self->method = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":125 - * should_close, compression, upgrade, chunked, url): - * self.method = method - * self.path = path # <<<<<<<<<<<<<< - * self.version = version - * self.headers = headers - */ - if (!(likely(PyUnicode_CheckExact(__pyx_v_path))||((__pyx_v_path) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_path)->tp_name), 0))) __PYX_ERR(0, 125, __pyx_L1_error) - __pyx_t_1 = __pyx_v_path; - __Pyx_INCREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v_self->path); - __Pyx_DECREF(__pyx_v_self->path); - __pyx_v_self->path = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":126 - * self.method = method - * self.path = path - * self.version = version # <<<<<<<<<<<<<< - * self.headers = headers - * self.raw_headers = raw_headers - */ - __Pyx_INCREF(__pyx_v_version); - __Pyx_GIVEREF(__pyx_v_version); - __Pyx_GOTREF(__pyx_v_self->version); - __Pyx_DECREF(__pyx_v_self->version); - __pyx_v_self->version = __pyx_v_version; - - /* "aiohttp/_http_parser.pyx":127 - * self.path = path - * self.version = version - * self.headers = headers # <<<<<<<<<<<<<< - * self.raw_headers = raw_headers - * self.should_close = should_close - */ - __Pyx_INCREF(__pyx_v_headers); - __Pyx_GIVEREF(__pyx_v_headers); - __Pyx_GOTREF(__pyx_v_self->headers); - __Pyx_DECREF(__pyx_v_self->headers); - __pyx_v_self->headers = __pyx_v_headers; - - /* "aiohttp/_http_parser.pyx":128 - * self.version = version - * self.headers = headers - * self.raw_headers = raw_headers # <<<<<<<<<<<<<< - * self.should_close = should_close - * self.compression = compression - */ - __Pyx_INCREF(__pyx_v_raw_headers); - __Pyx_GIVEREF(__pyx_v_raw_headers); - __Pyx_GOTREF(__pyx_v_self->raw_headers); - __Pyx_DECREF(__pyx_v_self->raw_headers); - __pyx_v_self->raw_headers = __pyx_v_raw_headers; - - /* "aiohttp/_http_parser.pyx":129 - * self.headers = headers - * self.raw_headers = raw_headers - * self.should_close = should_close # <<<<<<<<<<<<<< - * self.compression = compression - * self.upgrade = upgrade - */ - __Pyx_INCREF(__pyx_v_should_close); - __Pyx_GIVEREF(__pyx_v_should_close); - __Pyx_GOTREF(__pyx_v_self->should_close); - __Pyx_DECREF(__pyx_v_self->should_close); - __pyx_v_self->should_close = __pyx_v_should_close; - - /* "aiohttp/_http_parser.pyx":130 - * self.raw_headers = raw_headers - * self.should_close = should_close - * self.compression = compression # <<<<<<<<<<<<<< - * self.upgrade = upgrade - * self.chunked = chunked - */ - __Pyx_INCREF(__pyx_v_compression); - __Pyx_GIVEREF(__pyx_v_compression); - __Pyx_GOTREF(__pyx_v_self->compression); - __Pyx_DECREF(__pyx_v_self->compression); - __pyx_v_self->compression = __pyx_v_compression; - - /* "aiohttp/_http_parser.pyx":131 - * self.should_close = should_close - * self.compression = compression - * self.upgrade = upgrade # <<<<<<<<<<<<<< - * self.chunked = chunked - * self.url = url - */ - __Pyx_INCREF(__pyx_v_upgrade); - __Pyx_GIVEREF(__pyx_v_upgrade); - __Pyx_GOTREF(__pyx_v_self->upgrade); - __Pyx_DECREF(__pyx_v_self->upgrade); - __pyx_v_self->upgrade = __pyx_v_upgrade; - - /* "aiohttp/_http_parser.pyx":132 - * self.compression = compression - * self.upgrade = upgrade - * self.chunked = chunked # <<<<<<<<<<<<<< - * self.url = url - * - */ - __Pyx_INCREF(__pyx_v_chunked); - __Pyx_GIVEREF(__pyx_v_chunked); - __Pyx_GOTREF(__pyx_v_self->chunked); - __Pyx_DECREF(__pyx_v_self->chunked); - __pyx_v_self->chunked = __pyx_v_chunked; - - /* "aiohttp/_http_parser.pyx":133 - * self.upgrade = upgrade - * self.chunked = chunked - * self.url = url # <<<<<<<<<<<<<< - * - * def __repr__(self): - */ - __Pyx_INCREF(__pyx_v_url); - __Pyx_GIVEREF(__pyx_v_url); - __Pyx_GOTREF(__pyx_v_self->url); - __Pyx_DECREF(__pyx_v_self->url); - __pyx_v_self->url = __pyx_v_url; - - /* "aiohttp/_http_parser.pyx":122 - * cdef readonly object url # yarl.URL - * - * def __init__(self, method, path, version, headers, raw_headers, # <<<<<<<<<<<<<< - * should_close, compression, upgrade, chunked, url): - * self.method = method - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":135 - * self.url = url - * - * def __repr__(self): # <<<<<<<<<<<<<< - * info = [] - * info.append(("method", self.method)) - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_2__repr__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} -static PyObject *__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */ - -/* "aiohttp/_http_parser.pyx":147 - * info.append(("chunked", self.chunked)) - * info.append(("url", self.url)) - * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< - * return '' - * - */ - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___genexpr(PyObject *__pyx_self) { - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *__pyx_cur_scope; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("genexpr", 0); - __pyx_cur_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, __pyx_empty_tuple, NULL); - if (unlikely(!__pyx_cur_scope)) { - __pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)Py_None); - __Pyx_INCREF(Py_None); - __PYX_ERR(0, 147, __pyx_L1_error) - } else { - __Pyx_GOTREF(__pyx_cur_scope); - } - __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *) __pyx_self; - __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope)); - __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope); - { - __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator, NULL, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_repr___locals_genexpr, __pyx_n_s_aiohttp__http_parser); if (unlikely(!gen)) __PYX_ERR(0, 147, __pyx_L1_error) - __Pyx_DECREF(__pyx_cur_scope); - __Pyx_RefNannyFinishContext(); - return (PyObject *) gen; - } - - /* function exit code */ - __pyx_L1_error:; - __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__repr__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_DECREF(((PyObject *)__pyx_cur_scope)); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */ -{ - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *__pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)__pyx_generator->closure); - PyObject *__pyx_r = NULL; - PyObject *__pyx_t_1 = NULL; - Py_ssize_t __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *(*__pyx_t_7)(PyObject *); - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("genexpr", 0); - switch (__pyx_generator->resume_label) { - case 0: goto __pyx_L3_first_run; - default: /* CPython raises the right error here */ - __Pyx_RefNannyFinishContext(); - return NULL; - } - __pyx_L3_first_run:; - if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 147, __pyx_L1_error) - __pyx_r = PyList_New(0); if (unlikely(!__pyx_r)) __PYX_ERR(0, 147, __pyx_L1_error) - __Pyx_GOTREF(__pyx_r); - if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_info)) { __Pyx_RaiseClosureNameError("info"); __PYX_ERR(0, 147, __pyx_L1_error) } - if (unlikely(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_info == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); - __PYX_ERR(0, 147, __pyx_L1_error) - } - __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_info; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; - for (;;) { - if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 147, __pyx_L1_error) - #else - __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 147, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - #endif - if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) { - PyObject* sequence = __pyx_t_3; - Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); - if (unlikely(size != 2)) { - if (size > 2) __Pyx_RaiseTooManyValuesError(2); - else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(0, 147, __pyx_L1_error) - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - if (likely(PyTuple_CheckExact(sequence))) { - __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); - } else { - __pyx_t_4 = PyList_GET_ITEM(sequence, 0); - __pyx_t_5 = PyList_GET_ITEM(sequence, 1); - } - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(__pyx_t_5); - #else - __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 147, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 147, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } else { - Py_ssize_t index = -1; - __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 147, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext; - index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L6_unpacking_failed; - __Pyx_GOTREF(__pyx_t_4); - index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L6_unpacking_failed; - __Pyx_GOTREF(__pyx_t_5); - if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 147, __pyx_L1_error) - __pyx_t_7 = NULL; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - goto __pyx_L7_unpacking_done; - __pyx_L6_unpacking_failed:; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_7 = NULL; - if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); - __PYX_ERR(0, 147, __pyx_L1_error) - __pyx_L7_unpacking_done:; - } - __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_name); - __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_name, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_4); - __pyx_t_4 = 0; - __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_val); - __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_val, __pyx_t_5); - __Pyx_GIVEREF(__pyx_t_5); - __pyx_t_5 = 0; - __pyx_t_3 = PyNumber_Add(__pyx_cur_scope->__pyx_v_name, __pyx_kp_u_); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 147, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_5 = PyObject_Repr(__pyx_cur_scope->__pyx_v_val); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 147, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_4 = PyNumber_Add(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 147, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(__Pyx_ListComp_Append(__pyx_r, (PyObject*)__pyx_t_4))) __PYX_ERR(0, 147, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope); - - /* function exit code */ - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_r); __pyx_r = 0; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - #if !CYTHON_USE_EXC_INFO_STACK - __Pyx_Coroutine_ResetAndClearException(__pyx_generator); - #endif - __pyx_generator->resume_label = -1; - __Pyx_Coroutine_clear((PyObject*)__pyx_generator); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":135 - * self.url = url - * - * def __repr__(self): # <<<<<<<<<<<<<< - * info = [] - * info.append(("method", self.method)) - */ - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_2__repr__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *__pyx_cur_scope; - PyObject *__pyx_v_sinfo = NULL; - PyObject *__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator = 0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__repr__", 0); - __pyx_cur_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct____repr__(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct____repr__, __pyx_empty_tuple, NULL); - if (unlikely(!__pyx_cur_scope)) { - __pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)Py_None); - __Pyx_INCREF(Py_None); - __PYX_ERR(0, 135, __pyx_L1_error) - } else { - __Pyx_GOTREF(__pyx_cur_scope); - } - - /* "aiohttp/_http_parser.pyx":136 - * - * def __repr__(self): - * info = [] # <<<<<<<<<<<<<< - * info.append(("method", self.method)) - * info.append(("path", self.path)) - */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 136, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_cur_scope->__pyx_v_info = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":137 - * def __repr__(self): - * info = [] - * info.append(("method", self.method)) # <<<<<<<<<<<<<< - * info.append(("path", self.path)) - * info.append(("version", self.version)) - */ - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 137, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_u_method); - __Pyx_GIVEREF(__pyx_n_u_method); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_method); - __Pyx_INCREF(__pyx_v_self->method); - __Pyx_GIVEREF(__pyx_v_self->method); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->method); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 137, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":138 - * info = [] - * info.append(("method", self.method)) - * info.append(("path", self.path)) # <<<<<<<<<<<<<< - * info.append(("version", self.version)) - * info.append(("headers", self.headers)) - */ - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 138, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_u_path); - __Pyx_GIVEREF(__pyx_n_u_path); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_path); - __Pyx_INCREF(__pyx_v_self->path); - __Pyx_GIVEREF(__pyx_v_self->path); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->path); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 138, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":139 - * info.append(("method", self.method)) - * info.append(("path", self.path)) - * info.append(("version", self.version)) # <<<<<<<<<<<<<< - * info.append(("headers", self.headers)) - * info.append(("raw_headers", self.raw_headers)) - */ - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_u_version); - __Pyx_GIVEREF(__pyx_n_u_version); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_version); - __Pyx_INCREF(__pyx_v_self->version); - __Pyx_GIVEREF(__pyx_v_self->version); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->version); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 139, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":140 - * info.append(("path", self.path)) - * info.append(("version", self.version)) - * info.append(("headers", self.headers)) # <<<<<<<<<<<<<< - * info.append(("raw_headers", self.raw_headers)) - * info.append(("should_close", self.should_close)) - */ - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 140, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_u_headers); - __Pyx_GIVEREF(__pyx_n_u_headers); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_headers); - __Pyx_INCREF(__pyx_v_self->headers); - __Pyx_GIVEREF(__pyx_v_self->headers); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->headers); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 140, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":141 - * info.append(("version", self.version)) - * info.append(("headers", self.headers)) - * info.append(("raw_headers", self.raw_headers)) # <<<<<<<<<<<<<< - * info.append(("should_close", self.should_close)) - * info.append(("compression", self.compression)) - */ - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 141, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_u_raw_headers); - __Pyx_GIVEREF(__pyx_n_u_raw_headers); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_raw_headers); - __Pyx_INCREF(__pyx_v_self->raw_headers); - __Pyx_GIVEREF(__pyx_v_self->raw_headers); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->raw_headers); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 141, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":142 - * info.append(("headers", self.headers)) - * info.append(("raw_headers", self.raw_headers)) - * info.append(("should_close", self.should_close)) # <<<<<<<<<<<<<< - * info.append(("compression", self.compression)) - * info.append(("upgrade", self.upgrade)) - */ - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 142, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_u_should_close); - __Pyx_GIVEREF(__pyx_n_u_should_close); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_should_close); - __Pyx_INCREF(__pyx_v_self->should_close); - __Pyx_GIVEREF(__pyx_v_self->should_close); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->should_close); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 142, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":143 - * info.append(("raw_headers", self.raw_headers)) - * info.append(("should_close", self.should_close)) - * info.append(("compression", self.compression)) # <<<<<<<<<<<<<< - * info.append(("upgrade", self.upgrade)) - * info.append(("chunked", self.chunked)) - */ - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 143, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_u_compression); - __Pyx_GIVEREF(__pyx_n_u_compression); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_compression); - __Pyx_INCREF(__pyx_v_self->compression); - __Pyx_GIVEREF(__pyx_v_self->compression); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->compression); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 143, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":144 - * info.append(("should_close", self.should_close)) - * info.append(("compression", self.compression)) - * info.append(("upgrade", self.upgrade)) # <<<<<<<<<<<<<< - * info.append(("chunked", self.chunked)) - * info.append(("url", self.url)) - */ - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 144, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_u_upgrade); - __Pyx_GIVEREF(__pyx_n_u_upgrade); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_upgrade); - __Pyx_INCREF(__pyx_v_self->upgrade); - __Pyx_GIVEREF(__pyx_v_self->upgrade); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->upgrade); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 144, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":145 - * info.append(("compression", self.compression)) - * info.append(("upgrade", self.upgrade)) - * info.append(("chunked", self.chunked)) # <<<<<<<<<<<<<< - * info.append(("url", self.url)) - * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) - */ - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 145, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_u_chunked); - __Pyx_GIVEREF(__pyx_n_u_chunked); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_chunked); - __Pyx_INCREF(__pyx_v_self->chunked); - __Pyx_GIVEREF(__pyx_v_self->chunked); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->chunked); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 145, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":146 - * info.append(("upgrade", self.upgrade)) - * info.append(("chunked", self.chunked)) - * info.append(("url", self.url)) # <<<<<<<<<<<<<< - * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) - * return '' - */ - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_u_url); - __Pyx_GIVEREF(__pyx_n_u_url); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_url); - __Pyx_INCREF(__pyx_v_self->url); - __Pyx_GIVEREF(__pyx_v_self->url); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->url); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 146, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":147 - * info.append(("chunked", self.chunked)) - * info.append(("url", self.url)) - * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< - * return '' - * - */ - __pyx_t_1 = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 147, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_Generator_Next(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 147, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyUnicode_Join(__pyx_kp_u__2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 147, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_v_sinfo = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":148 - * info.append(("url", self.url)) - * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) - * return '' # <<<<<<<<<<<<<< - * - * def _replace(self, **dct): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyUnicode_ConcatSafe(__pyx_kp_u_RawRequestMessage, __pyx_v_sinfo); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 148, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_PyUnicode_Concat(__pyx_t_1, __pyx_kp_u__3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 148, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_r = __pyx_t_3; - __pyx_t_3 = 0; - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":135 - * self.url = url - * - * def __repr__(self): # <<<<<<<<<<<<<< - * info = [] - * info.append(("method", self.method)) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_sinfo); - __Pyx_XDECREF(__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator); - __Pyx_DECREF(((PyObject *)__pyx_cur_scope)); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":150 - * return '' - * - * def _replace(self, **dct): # <<<<<<<<<<<<<< - * cdef RawRequestMessage ret - * ret = _new_request_message(self.method, - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_5_replace(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_5_replace(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_dct = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("_replace (wrapper)", 0); - if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) { - __Pyx_RaiseArgtupleInvalid("_replace", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return NULL;} - if (__pyx_kwds && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_replace", 1))) return NULL; - __pyx_v_dct = (__pyx_kwds) ? PyDict_Copy(__pyx_kwds) : PyDict_New(); if (unlikely(!__pyx_v_dct)) return NULL; - __Pyx_GOTREF(__pyx_v_dct); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4_replace(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self), __pyx_v_dct); - - /* function exit code */ - __Pyx_XDECREF(__pyx_v_dct); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4_replace(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self, PyObject *__pyx_v_dct) { - struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_ret = 0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - int __pyx_t_6; - PyObject *__pyx_t_7 = NULL; - int __pyx_t_8; - int __pyx_t_9; - PyObject *__pyx_t_10 = NULL; - PyObject *__pyx_t_11 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_replace", 0); - - /* "aiohttp/_http_parser.pyx":152 - * def _replace(self, **dct): - * cdef RawRequestMessage ret - * ret = _new_request_message(self.method, # <<<<<<<<<<<<<< - * self.path, - * self.version, - */ - __pyx_t_1 = __pyx_v_self->method; - __Pyx_INCREF(__pyx_t_1); - - /* "aiohttp/_http_parser.pyx":153 - * cdef RawRequestMessage ret - * ret = _new_request_message(self.method, - * self.path, # <<<<<<<<<<<<<< - * self.version, - * self.headers, - */ - __pyx_t_2 = __pyx_v_self->path; - __Pyx_INCREF(__pyx_t_2); - - /* "aiohttp/_http_parser.pyx":154 - * ret = _new_request_message(self.method, - * self.path, - * self.version, # <<<<<<<<<<<<<< - * self.headers, - * self.raw_headers, - */ - __pyx_t_3 = __pyx_v_self->version; - __Pyx_INCREF(__pyx_t_3); - - /* "aiohttp/_http_parser.pyx":155 - * self.path, - * self.version, - * self.headers, # <<<<<<<<<<<<<< - * self.raw_headers, - * self.should_close, - */ - __pyx_t_4 = __pyx_v_self->headers; - __Pyx_INCREF(__pyx_t_4); - - /* "aiohttp/_http_parser.pyx":156 - * self.version, - * self.headers, - * self.raw_headers, # <<<<<<<<<<<<<< - * self.should_close, - * self.compression, - */ - __pyx_t_5 = __pyx_v_self->raw_headers; - __Pyx_INCREF(__pyx_t_5); - - /* "aiohttp/_http_parser.pyx":157 - * self.headers, - * self.raw_headers, - * self.should_close, # <<<<<<<<<<<<<< - * self.compression, - * self.upgrade, - */ - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_self->should_close); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 157, __pyx_L1_error) - - /* "aiohttp/_http_parser.pyx":158 - * self.raw_headers, - * self.should_close, - * self.compression, # <<<<<<<<<<<<<< - * self.upgrade, - * self.chunked, - */ - __pyx_t_7 = __pyx_v_self->compression; - __Pyx_INCREF(__pyx_t_7); - - /* "aiohttp/_http_parser.pyx":159 - * self.should_close, - * self.compression, - * self.upgrade, # <<<<<<<<<<<<<< - * self.chunked, - * self.url) - */ - __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_v_self->upgrade); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 159, __pyx_L1_error) - - /* "aiohttp/_http_parser.pyx":160 - * self.compression, - * self.upgrade, - * self.chunked, # <<<<<<<<<<<<<< - * self.url) - * if "method" in dct: - */ - __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_v_self->chunked); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 160, __pyx_L1_error) - - /* "aiohttp/_http_parser.pyx":161 - * self.upgrade, - * self.chunked, - * self.url) # <<<<<<<<<<<<<< - * if "method" in dct: - * ret.method = dct["method"] - */ - __pyx_t_10 = __pyx_v_self->url; - __Pyx_INCREF(__pyx_t_10); - - /* "aiohttp/_http_parser.pyx":152 - * def _replace(self, **dct): - * cdef RawRequestMessage ret - * ret = _new_request_message(self.method, # <<<<<<<<<<<<<< - * self.path, - * self.version, - */ - __pyx_t_11 = __pyx_f_7aiohttp_12_http_parser__new_request_message(((PyObject*)__pyx_t_1), ((PyObject*)__pyx_t_2), __pyx_t_3, __pyx_t_4, __pyx_t_5, __pyx_t_6, __pyx_t_7, __pyx_t_8, __pyx_t_9, __pyx_t_10); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 152, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - if (!(likely(((__pyx_t_11) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_11, __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage))))) __PYX_ERR(0, 152, __pyx_L1_error) - __pyx_v_ret = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_t_11); - __pyx_t_11 = 0; - - /* "aiohttp/_http_parser.pyx":162 - * self.chunked, - * self.url) - * if "method" in dct: # <<<<<<<<<<<<<< - * ret.method = dct["method"] - * if "path" in dct: - */ - __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_method, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 162, __pyx_L1_error) - __pyx_t_8 = (__pyx_t_9 != 0); - if (__pyx_t_8) { - - /* "aiohttp/_http_parser.pyx":163 - * self.url) - * if "method" in dct: - * ret.method = dct["method"] # <<<<<<<<<<<<<< - * if "path" in dct: - * ret.path = dct["path"] - */ - __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_method); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 163, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - if (!(likely(PyUnicode_CheckExact(__pyx_t_11))||((__pyx_t_11) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_11)->tp_name), 0))) __PYX_ERR(0, 163, __pyx_L1_error) - __Pyx_GIVEREF(__pyx_t_11); - __Pyx_GOTREF(__pyx_v_ret->method); - __Pyx_DECREF(__pyx_v_ret->method); - __pyx_v_ret->method = ((PyObject*)__pyx_t_11); - __pyx_t_11 = 0; - - /* "aiohttp/_http_parser.pyx":162 - * self.chunked, - * self.url) - * if "method" in dct: # <<<<<<<<<<<<<< - * ret.method = dct["method"] - * if "path" in dct: - */ - } - - /* "aiohttp/_http_parser.pyx":164 - * if "method" in dct: - * ret.method = dct["method"] - * if "path" in dct: # <<<<<<<<<<<<<< - * ret.path = dct["path"] - * if "version" in dct: - */ - __pyx_t_8 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_path, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 164, __pyx_L1_error) - __pyx_t_9 = (__pyx_t_8 != 0); - if (__pyx_t_9) { - - /* "aiohttp/_http_parser.pyx":165 - * ret.method = dct["method"] - * if "path" in dct: - * ret.path = dct["path"] # <<<<<<<<<<<<<< - * if "version" in dct: - * ret.version = dct["version"] - */ - __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_path); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 165, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - if (!(likely(PyUnicode_CheckExact(__pyx_t_11))||((__pyx_t_11) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_11)->tp_name), 0))) __PYX_ERR(0, 165, __pyx_L1_error) - __Pyx_GIVEREF(__pyx_t_11); - __Pyx_GOTREF(__pyx_v_ret->path); - __Pyx_DECREF(__pyx_v_ret->path); - __pyx_v_ret->path = ((PyObject*)__pyx_t_11); - __pyx_t_11 = 0; - - /* "aiohttp/_http_parser.pyx":164 - * if "method" in dct: - * ret.method = dct["method"] - * if "path" in dct: # <<<<<<<<<<<<<< - * ret.path = dct["path"] - * if "version" in dct: - */ - } - - /* "aiohttp/_http_parser.pyx":166 - * if "path" in dct: - * ret.path = dct["path"] - * if "version" in dct: # <<<<<<<<<<<<<< - * ret.version = dct["version"] - * if "headers" in dct: - */ - __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_version, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 166, __pyx_L1_error) - __pyx_t_8 = (__pyx_t_9 != 0); - if (__pyx_t_8) { - - /* "aiohttp/_http_parser.pyx":167 - * ret.path = dct["path"] - * if "version" in dct: - * ret.version = dct["version"] # <<<<<<<<<<<<<< - * if "headers" in dct: - * ret.headers = dct["headers"] - */ - __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_version); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 167, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_GIVEREF(__pyx_t_11); - __Pyx_GOTREF(__pyx_v_ret->version); - __Pyx_DECREF(__pyx_v_ret->version); - __pyx_v_ret->version = __pyx_t_11; - __pyx_t_11 = 0; - - /* "aiohttp/_http_parser.pyx":166 - * if "path" in dct: - * ret.path = dct["path"] - * if "version" in dct: # <<<<<<<<<<<<<< - * ret.version = dct["version"] - * if "headers" in dct: - */ - } - - /* "aiohttp/_http_parser.pyx":168 - * if "version" in dct: - * ret.version = dct["version"] - * if "headers" in dct: # <<<<<<<<<<<<<< - * ret.headers = dct["headers"] - * if "raw_headers" in dct: - */ - __pyx_t_8 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_headers, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 168, __pyx_L1_error) - __pyx_t_9 = (__pyx_t_8 != 0); - if (__pyx_t_9) { - - /* "aiohttp/_http_parser.pyx":169 - * ret.version = dct["version"] - * if "headers" in dct: - * ret.headers = dct["headers"] # <<<<<<<<<<<<<< - * if "raw_headers" in dct: - * ret.raw_headers = dct["raw_headers"] - */ - __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_headers); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 169, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_GIVEREF(__pyx_t_11); - __Pyx_GOTREF(__pyx_v_ret->headers); - __Pyx_DECREF(__pyx_v_ret->headers); - __pyx_v_ret->headers = __pyx_t_11; - __pyx_t_11 = 0; - - /* "aiohttp/_http_parser.pyx":168 - * if "version" in dct: - * ret.version = dct["version"] - * if "headers" in dct: # <<<<<<<<<<<<<< - * ret.headers = dct["headers"] - * if "raw_headers" in dct: - */ - } - - /* "aiohttp/_http_parser.pyx":170 - * if "headers" in dct: - * ret.headers = dct["headers"] - * if "raw_headers" in dct: # <<<<<<<<<<<<<< - * ret.raw_headers = dct["raw_headers"] - * if "should_close" in dct: - */ - __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_raw_headers, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 170, __pyx_L1_error) - __pyx_t_8 = (__pyx_t_9 != 0); - if (__pyx_t_8) { - - /* "aiohttp/_http_parser.pyx":171 - * ret.headers = dct["headers"] - * if "raw_headers" in dct: - * ret.raw_headers = dct["raw_headers"] # <<<<<<<<<<<<<< - * if "should_close" in dct: - * ret.should_close = dct["should_close"] - */ - __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_raw_headers); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 171, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_GIVEREF(__pyx_t_11); - __Pyx_GOTREF(__pyx_v_ret->raw_headers); - __Pyx_DECREF(__pyx_v_ret->raw_headers); - __pyx_v_ret->raw_headers = __pyx_t_11; - __pyx_t_11 = 0; - - /* "aiohttp/_http_parser.pyx":170 - * if "headers" in dct: - * ret.headers = dct["headers"] - * if "raw_headers" in dct: # <<<<<<<<<<<<<< - * ret.raw_headers = dct["raw_headers"] - * if "should_close" in dct: - */ - } - - /* "aiohttp/_http_parser.pyx":172 - * if "raw_headers" in dct: - * ret.raw_headers = dct["raw_headers"] - * if "should_close" in dct: # <<<<<<<<<<<<<< - * ret.should_close = dct["should_close"] - * if "compression" in dct: - */ - __pyx_t_8 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_should_close, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 172, __pyx_L1_error) - __pyx_t_9 = (__pyx_t_8 != 0); - if (__pyx_t_9) { - - /* "aiohttp/_http_parser.pyx":173 - * ret.raw_headers = dct["raw_headers"] - * if "should_close" in dct: - * ret.should_close = dct["should_close"] # <<<<<<<<<<<<<< - * if "compression" in dct: - * ret.compression = dct["compression"] - */ - __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_should_close); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 173, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_GIVEREF(__pyx_t_11); - __Pyx_GOTREF(__pyx_v_ret->should_close); - __Pyx_DECREF(__pyx_v_ret->should_close); - __pyx_v_ret->should_close = __pyx_t_11; - __pyx_t_11 = 0; - - /* "aiohttp/_http_parser.pyx":172 - * if "raw_headers" in dct: - * ret.raw_headers = dct["raw_headers"] - * if "should_close" in dct: # <<<<<<<<<<<<<< - * ret.should_close = dct["should_close"] - * if "compression" in dct: - */ - } - - /* "aiohttp/_http_parser.pyx":174 - * if "should_close" in dct: - * ret.should_close = dct["should_close"] - * if "compression" in dct: # <<<<<<<<<<<<<< - * ret.compression = dct["compression"] - * if "upgrade" in dct: - */ - __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_compression, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 174, __pyx_L1_error) - __pyx_t_8 = (__pyx_t_9 != 0); - if (__pyx_t_8) { - - /* "aiohttp/_http_parser.pyx":175 - * ret.should_close = dct["should_close"] - * if "compression" in dct: - * ret.compression = dct["compression"] # <<<<<<<<<<<<<< - * if "upgrade" in dct: - * ret.upgrade = dct["upgrade"] - */ - __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_compression); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 175, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_GIVEREF(__pyx_t_11); - __Pyx_GOTREF(__pyx_v_ret->compression); - __Pyx_DECREF(__pyx_v_ret->compression); - __pyx_v_ret->compression = __pyx_t_11; - __pyx_t_11 = 0; - - /* "aiohttp/_http_parser.pyx":174 - * if "should_close" in dct: - * ret.should_close = dct["should_close"] - * if "compression" in dct: # <<<<<<<<<<<<<< - * ret.compression = dct["compression"] - * if "upgrade" in dct: - */ - } - - /* "aiohttp/_http_parser.pyx":176 - * if "compression" in dct: - * ret.compression = dct["compression"] - * if "upgrade" in dct: # <<<<<<<<<<<<<< - * ret.upgrade = dct["upgrade"] - * if "chunked" in dct: - */ - __pyx_t_8 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_upgrade, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 176, __pyx_L1_error) - __pyx_t_9 = (__pyx_t_8 != 0); - if (__pyx_t_9) { - - /* "aiohttp/_http_parser.pyx":177 - * ret.compression = dct["compression"] - * if "upgrade" in dct: - * ret.upgrade = dct["upgrade"] # <<<<<<<<<<<<<< - * if "chunked" in dct: - * ret.chunked = dct["chunked"] - */ - __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_upgrade); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 177, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_GIVEREF(__pyx_t_11); - __Pyx_GOTREF(__pyx_v_ret->upgrade); - __Pyx_DECREF(__pyx_v_ret->upgrade); - __pyx_v_ret->upgrade = __pyx_t_11; - __pyx_t_11 = 0; - - /* "aiohttp/_http_parser.pyx":176 - * if "compression" in dct: - * ret.compression = dct["compression"] - * if "upgrade" in dct: # <<<<<<<<<<<<<< - * ret.upgrade = dct["upgrade"] - * if "chunked" in dct: - */ - } - - /* "aiohttp/_http_parser.pyx":178 - * if "upgrade" in dct: - * ret.upgrade = dct["upgrade"] - * if "chunked" in dct: # <<<<<<<<<<<<<< - * ret.chunked = dct["chunked"] - * if "url" in dct: - */ - __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_chunked, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 178, __pyx_L1_error) - __pyx_t_8 = (__pyx_t_9 != 0); - if (__pyx_t_8) { - - /* "aiohttp/_http_parser.pyx":179 - * ret.upgrade = dct["upgrade"] - * if "chunked" in dct: - * ret.chunked = dct["chunked"] # <<<<<<<<<<<<<< - * if "url" in dct: - * ret.url = dct["url"] - */ - __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_chunked); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 179, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_GIVEREF(__pyx_t_11); - __Pyx_GOTREF(__pyx_v_ret->chunked); - __Pyx_DECREF(__pyx_v_ret->chunked); - __pyx_v_ret->chunked = __pyx_t_11; - __pyx_t_11 = 0; - - /* "aiohttp/_http_parser.pyx":178 - * if "upgrade" in dct: - * ret.upgrade = dct["upgrade"] - * if "chunked" in dct: # <<<<<<<<<<<<<< - * ret.chunked = dct["chunked"] - * if "url" in dct: - */ - } - - /* "aiohttp/_http_parser.pyx":180 - * if "chunked" in dct: - * ret.chunked = dct["chunked"] - * if "url" in dct: # <<<<<<<<<<<<<< - * ret.url = dct["url"] - * return ret - */ - __pyx_t_8 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_url, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 180, __pyx_L1_error) - __pyx_t_9 = (__pyx_t_8 != 0); - if (__pyx_t_9) { - - /* "aiohttp/_http_parser.pyx":181 - * ret.chunked = dct["chunked"] - * if "url" in dct: - * ret.url = dct["url"] # <<<<<<<<<<<<<< - * return ret - * - */ - __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_url); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 181, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_GIVEREF(__pyx_t_11); - __Pyx_GOTREF(__pyx_v_ret->url); - __Pyx_DECREF(__pyx_v_ret->url); - __pyx_v_ret->url = __pyx_t_11; - __pyx_t_11 = 0; - - /* "aiohttp/_http_parser.pyx":180 - * if "chunked" in dct: - * ret.chunked = dct["chunked"] - * if "url" in dct: # <<<<<<<<<<<<<< - * ret.url = dct["url"] - * return ret - */ - } - - /* "aiohttp/_http_parser.pyx":182 - * if "url" in dct: - * ret.url = dct["url"] - * return ret # <<<<<<<<<<<<<< - * - * cdef _new_request_message(str method, - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject *)__pyx_v_ret)); - __pyx_r = ((PyObject *)__pyx_v_ret); - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":150 - * return '' - * - * def _replace(self, **dct): # <<<<<<<<<<<<<< - * cdef RawRequestMessage ret - * ret = _new_request_message(self.method, - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_XDECREF(__pyx_t_11); - __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage._replace", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_ret); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":111 - * @cython.freelist(DEFAULT_FREELIST_SIZE) - * cdef class RawRequestMessage: - * cdef readonly str method # <<<<<<<<<<<<<< - * cdef readonly str path - * cdef readonly object version # HttpVersion - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_6method_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_6method_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6method___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6method___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->method); - __pyx_r = __pyx_v_self->method; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":112 - * cdef class RawRequestMessage: - * cdef readonly str method - * cdef readonly str path # <<<<<<<<<<<<<< - * cdef readonly object version # HttpVersion - * cdef readonly object headers # CIMultiDict - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_4path_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_4path_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4path___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4path___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->path); - __pyx_r = __pyx_v_self->path; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":113 - * cdef readonly str method - * cdef readonly str path - * cdef readonly object version # HttpVersion # <<<<<<<<<<<<<< - * cdef readonly object headers # CIMultiDict - * cdef readonly object raw_headers # tuple - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7version_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7version_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7version___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7version___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->version); - __pyx_r = __pyx_v_self->version; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":114 - * cdef readonly str path - * cdef readonly object version # HttpVersion - * cdef readonly object headers # CIMultiDict # <<<<<<<<<<<<<< - * cdef readonly object raw_headers # tuple - * cdef readonly object should_close - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7headers_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7headers_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->headers); - __pyx_r = __pyx_v_self->headers; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":115 - * cdef readonly object version # HttpVersion - * cdef readonly object headers # CIMultiDict - * cdef readonly object raw_headers # tuple # <<<<<<<<<<<<<< - * cdef readonly object should_close - * cdef readonly object compression - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->raw_headers); - __pyx_r = __pyx_v_self->raw_headers; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":116 - * cdef readonly object headers # CIMultiDict - * cdef readonly object raw_headers # tuple - * cdef readonly object should_close # <<<<<<<<<<<<<< - * cdef readonly object compression - * cdef readonly object upgrade - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_12should_close_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_12should_close_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_12should_close___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_12should_close___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->should_close); - __pyx_r = __pyx_v_self->should_close; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":117 - * cdef readonly object raw_headers # tuple - * cdef readonly object should_close - * cdef readonly object compression # <<<<<<<<<<<<<< - * cdef readonly object upgrade - * cdef readonly object chunked - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11compression_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11compression_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11compression___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11compression___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->compression); - __pyx_r = __pyx_v_self->compression; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":118 - * cdef readonly object should_close - * cdef readonly object compression - * cdef readonly object upgrade # <<<<<<<<<<<<<< - * cdef readonly object chunked - * cdef readonly object url # yarl.URL - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->upgrade); - __pyx_r = __pyx_v_self->upgrade; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":119 - * cdef readonly object compression - * cdef readonly object upgrade - * cdef readonly object chunked # <<<<<<<<<<<<<< - * cdef readonly object url # yarl.URL - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7chunked_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7chunked_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7chunked___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7chunked___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->chunked); - __pyx_r = __pyx_v_self->chunked; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":120 - * cdef readonly object upgrade - * cdef readonly object chunked - * cdef readonly object url # yarl.URL # <<<<<<<<<<<<<< - * - * def __init__(self, method, path, version, headers, raw_headers, - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3url_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3url_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_3url___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_3url___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->url); - __pyx_r = __pyx_v_self->url; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * cdef tuple state - * cdef object _dict - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6__reduce_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { - PyObject *__pyx_v_state = 0; - PyObject *__pyx_v__dict = 0; - int __pyx_v_use_setstate; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - int __pyx_t_3; - PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); - - /* "(tree fragment)":5 - * cdef object _dict - * cdef bint use_setstate - * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) # <<<<<<<<<<<<<< - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: - */ - __pyx_t_1 = PyTuple_New(10); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_v_self->chunked); - __Pyx_GIVEREF(__pyx_v_self->chunked); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->chunked); - __Pyx_INCREF(__pyx_v_self->compression); - __Pyx_GIVEREF(__pyx_v_self->compression); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->compression); - __Pyx_INCREF(__pyx_v_self->headers); - __Pyx_GIVEREF(__pyx_v_self->headers); - PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_self->headers); - __Pyx_INCREF(__pyx_v_self->method); - __Pyx_GIVEREF(__pyx_v_self->method); - PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_self->method); - __Pyx_INCREF(__pyx_v_self->path); - __Pyx_GIVEREF(__pyx_v_self->path); - PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_v_self->path); - __Pyx_INCREF(__pyx_v_self->raw_headers); - __Pyx_GIVEREF(__pyx_v_self->raw_headers); - PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_v_self->raw_headers); - __Pyx_INCREF(__pyx_v_self->should_close); - __Pyx_GIVEREF(__pyx_v_self->should_close); - PyTuple_SET_ITEM(__pyx_t_1, 6, __pyx_v_self->should_close); - __Pyx_INCREF(__pyx_v_self->upgrade); - __Pyx_GIVEREF(__pyx_v_self->upgrade); - PyTuple_SET_ITEM(__pyx_t_1, 7, __pyx_v_self->upgrade); - __Pyx_INCREF(__pyx_v_self->url); - __Pyx_GIVEREF(__pyx_v_self->url); - PyTuple_SET_ITEM(__pyx_t_1, 8, __pyx_v_self->url); - __Pyx_INCREF(__pyx_v_self->version); - __Pyx_GIVEREF(__pyx_v_self->version); - PyTuple_SET_ITEM(__pyx_t_1, 9, __pyx_v_self->version); - __pyx_v_state = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "(tree fragment)":6 - * cdef bint use_setstate - * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) - * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< - * if _dict is not None: - * state += (_dict,) - */ - __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v__dict = __pyx_t_1; - __pyx_t_1 = 0; - - /* "(tree fragment)":7 - * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: # <<<<<<<<<<<<<< - * state += (_dict,) - * use_setstate = True - */ - __pyx_t_2 = (__pyx_v__dict != Py_None); - __pyx_t_3 = (__pyx_t_2 != 0); - if (__pyx_t_3) { - - /* "(tree fragment)":8 - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: - * state += (_dict,) # <<<<<<<<<<<<<< - * use_setstate = True - * else: - */ - __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_v__dict); - __Pyx_GIVEREF(__pyx_v__dict); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict); - __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_4)); - __pyx_t_4 = 0; - - /* "(tree fragment)":9 - * if _dict is not None: - * state += (_dict,) - * use_setstate = True # <<<<<<<<<<<<<< - * else: - * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None - */ - __pyx_v_use_setstate = 1; - - /* "(tree fragment)":7 - * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: # <<<<<<<<<<<<<< - * state += (_dict,) - * use_setstate = True - */ - goto __pyx_L3; - } - - /* "(tree fragment)":11 - * use_setstate = True - * else: - * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None # <<<<<<<<<<<<<< - * if use_setstate: - * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, None), state - */ - /*else*/ { - __pyx_t_2 = (__pyx_v_self->chunked != Py_None); - __pyx_t_5 = (__pyx_t_2 != 0); - if (!__pyx_t_5) { - } else { - __pyx_t_3 = __pyx_t_5; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_5 = (__pyx_v_self->compression != Py_None); - __pyx_t_2 = (__pyx_t_5 != 0); - if (!__pyx_t_2) { - } else { - __pyx_t_3 = __pyx_t_2; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_2 = (__pyx_v_self->headers != Py_None); - __pyx_t_5 = (__pyx_t_2 != 0); - if (!__pyx_t_5) { - } else { - __pyx_t_3 = __pyx_t_5; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_5 = (__pyx_v_self->method != ((PyObject*)Py_None)); - __pyx_t_2 = (__pyx_t_5 != 0); - if (!__pyx_t_2) { - } else { - __pyx_t_3 = __pyx_t_2; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_2 = (__pyx_v_self->path != ((PyObject*)Py_None)); - __pyx_t_5 = (__pyx_t_2 != 0); - if (!__pyx_t_5) { - } else { - __pyx_t_3 = __pyx_t_5; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_5 = (__pyx_v_self->raw_headers != Py_None); - __pyx_t_2 = (__pyx_t_5 != 0); - if (!__pyx_t_2) { - } else { - __pyx_t_3 = __pyx_t_2; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_2 = (__pyx_v_self->should_close != Py_None); - __pyx_t_5 = (__pyx_t_2 != 0); - if (!__pyx_t_5) { - } else { - __pyx_t_3 = __pyx_t_5; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_5 = (__pyx_v_self->upgrade != Py_None); - __pyx_t_2 = (__pyx_t_5 != 0); - if (!__pyx_t_2) { - } else { - __pyx_t_3 = __pyx_t_2; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_2 = (__pyx_v_self->url != Py_None); - __pyx_t_5 = (__pyx_t_2 != 0); - if (!__pyx_t_5) { - } else { - __pyx_t_3 = __pyx_t_5; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_5 = (__pyx_v_self->version != Py_None); - __pyx_t_2 = (__pyx_t_5 != 0); - __pyx_t_3 = __pyx_t_2; - __pyx_L4_bool_binop_done:; - __pyx_v_use_setstate = __pyx_t_3; - } - __pyx_L3:; - - /* "(tree fragment)":12 - * else: - * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None - * if use_setstate: # <<<<<<<<<<<<<< - * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, None), state - * else: - */ - __pyx_t_3 = (__pyx_v_use_setstate != 0); - if (__pyx_t_3) { - - /* "(tree fragment)":13 - * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None - * if use_setstate: - * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, None), state # <<<<<<<<<<<<<< - * else: - * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, state) - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_RawRequestMessage); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_INCREF(__pyx_int_21004882); - __Pyx_GIVEREF(__pyx_int_21004882); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_21004882); - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None); - __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1); - __Pyx_INCREF(__pyx_v_state); - __Pyx_GIVEREF(__pyx_v_state); - PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_v_state); - __pyx_t_4 = 0; - __pyx_t_1 = 0; - __pyx_r = __pyx_t_6; - __pyx_t_6 = 0; - goto __pyx_L0; - - /* "(tree fragment)":12 - * else: - * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None - * if use_setstate: # <<<<<<<<<<<<<< - * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, None), state - * else: - */ - } - - /* "(tree fragment)":15 - * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, None), state - * else: - * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, state) # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) - */ - /*else*/ { - __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_pyx_unpickle_RawRequestMessage); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_INCREF(__pyx_int_21004882); - __Pyx_GIVEREF(__pyx_int_21004882); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_21004882); - __Pyx_INCREF(__pyx_v_state); - __Pyx_GIVEREF(__pyx_v_state); - PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state); - __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); - __pyx_t_6 = 0; - __pyx_t_1 = 0; - __pyx_r = __pyx_t_4; - __pyx_t_4 = 0; - goto __pyx_L0; - } - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * cdef tuple state - * cdef object _dict - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_state); - __Pyx_XDECREF(__pyx_v__dict); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":16 - * else: - * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, state) - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__setstate_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); - - /* "(tree fragment)":17 - * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, state) - * def __setstate_cython__(self, __pyx_state): - * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) # <<<<<<<<<<<<<< - */ - if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error) - __pyx_t_1 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "(tree fragment)":16 - * else: - * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, state) - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":184 - * return ret - * - * cdef _new_request_message(str method, # <<<<<<<<<<<<<< - * str path, - * object version, - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser__new_request_message(PyObject *__pyx_v_method, PyObject *__pyx_v_path, PyObject *__pyx_v_version, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, int __pyx_v_should_close, PyObject *__pyx_v_compression, int __pyx_v_upgrade, int __pyx_v_chunked, PyObject *__pyx_v_url) { - struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_ret = 0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_new_request_message", 0); - - /* "aiohttp/_http_parser.pyx":195 - * object url): - * cdef RawRequestMessage ret - * ret = RawRequestMessage.__new__(RawRequestMessage) # <<<<<<<<<<<<<< - * ret.method = method - * ret.path = path - */ - __pyx_t_1 = ((PyObject *)__pyx_tp_new_7aiohttp_12_http_parser_RawRequestMessage(((PyTypeObject *)__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage), __pyx_empty_tuple, NULL)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 195, __pyx_L1_error) - __Pyx_GOTREF(((PyObject *)__pyx_t_1)); - __pyx_v_ret = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":196 - * cdef RawRequestMessage ret - * ret = RawRequestMessage.__new__(RawRequestMessage) - * ret.method = method # <<<<<<<<<<<<<< - * ret.path = path - * ret.version = version - */ - __Pyx_INCREF(__pyx_v_method); - __Pyx_GIVEREF(__pyx_v_method); - __Pyx_GOTREF(__pyx_v_ret->method); - __Pyx_DECREF(__pyx_v_ret->method); - __pyx_v_ret->method = __pyx_v_method; - - /* "aiohttp/_http_parser.pyx":197 - * ret = RawRequestMessage.__new__(RawRequestMessage) - * ret.method = method - * ret.path = path # <<<<<<<<<<<<<< - * ret.version = version - * ret.headers = headers - */ - __Pyx_INCREF(__pyx_v_path); - __Pyx_GIVEREF(__pyx_v_path); - __Pyx_GOTREF(__pyx_v_ret->path); - __Pyx_DECREF(__pyx_v_ret->path); - __pyx_v_ret->path = __pyx_v_path; - - /* "aiohttp/_http_parser.pyx":198 - * ret.method = method - * ret.path = path - * ret.version = version # <<<<<<<<<<<<<< - * ret.headers = headers - * ret.raw_headers = raw_headers - */ - __Pyx_INCREF(__pyx_v_version); - __Pyx_GIVEREF(__pyx_v_version); - __Pyx_GOTREF(__pyx_v_ret->version); - __Pyx_DECREF(__pyx_v_ret->version); - __pyx_v_ret->version = __pyx_v_version; - - /* "aiohttp/_http_parser.pyx":199 - * ret.path = path - * ret.version = version - * ret.headers = headers # <<<<<<<<<<<<<< - * ret.raw_headers = raw_headers - * ret.should_close = should_close - */ - __Pyx_INCREF(__pyx_v_headers); - __Pyx_GIVEREF(__pyx_v_headers); - __Pyx_GOTREF(__pyx_v_ret->headers); - __Pyx_DECREF(__pyx_v_ret->headers); - __pyx_v_ret->headers = __pyx_v_headers; - - /* "aiohttp/_http_parser.pyx":200 - * ret.version = version - * ret.headers = headers - * ret.raw_headers = raw_headers # <<<<<<<<<<<<<< - * ret.should_close = should_close - * ret.compression = compression - */ - __Pyx_INCREF(__pyx_v_raw_headers); - __Pyx_GIVEREF(__pyx_v_raw_headers); - __Pyx_GOTREF(__pyx_v_ret->raw_headers); - __Pyx_DECREF(__pyx_v_ret->raw_headers); - __pyx_v_ret->raw_headers = __pyx_v_raw_headers; - - /* "aiohttp/_http_parser.pyx":201 - * ret.headers = headers - * ret.raw_headers = raw_headers - * ret.should_close = should_close # <<<<<<<<<<<<<< - * ret.compression = compression - * ret.upgrade = upgrade - */ - __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_should_close); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 201, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v_ret->should_close); - __Pyx_DECREF(__pyx_v_ret->should_close); - __pyx_v_ret->should_close = __pyx_t_1; - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":202 - * ret.raw_headers = raw_headers - * ret.should_close = should_close - * ret.compression = compression # <<<<<<<<<<<<<< - * ret.upgrade = upgrade - * ret.chunked = chunked - */ - __Pyx_INCREF(__pyx_v_compression); - __Pyx_GIVEREF(__pyx_v_compression); - __Pyx_GOTREF(__pyx_v_ret->compression); - __Pyx_DECREF(__pyx_v_ret->compression); - __pyx_v_ret->compression = __pyx_v_compression; - - /* "aiohttp/_http_parser.pyx":203 - * ret.should_close = should_close - * ret.compression = compression - * ret.upgrade = upgrade # <<<<<<<<<<<<<< - * ret.chunked = chunked - * ret.url = url - */ - __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_upgrade); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 203, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v_ret->upgrade); - __Pyx_DECREF(__pyx_v_ret->upgrade); - __pyx_v_ret->upgrade = __pyx_t_1; - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":204 - * ret.compression = compression - * ret.upgrade = upgrade - * ret.chunked = chunked # <<<<<<<<<<<<<< - * ret.url = url - * return ret - */ - __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_chunked); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 204, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v_ret->chunked); - __Pyx_DECREF(__pyx_v_ret->chunked); - __pyx_v_ret->chunked = __pyx_t_1; - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":205 - * ret.upgrade = upgrade - * ret.chunked = chunked - * ret.url = url # <<<<<<<<<<<<<< - * return ret - * - */ - __Pyx_INCREF(__pyx_v_url); - __Pyx_GIVEREF(__pyx_v_url); - __Pyx_GOTREF(__pyx_v_ret->url); - __Pyx_DECREF(__pyx_v_ret->url); - __pyx_v_ret->url = __pyx_v_url; - - /* "aiohttp/_http_parser.pyx":206 - * ret.chunked = chunked - * ret.url = url - * return ret # <<<<<<<<<<<<<< - * - * - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject *)__pyx_v_ret)); - __pyx_r = ((PyObject *)__pyx_v_ret); - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":184 - * return ret - * - * cdef _new_request_message(str method, # <<<<<<<<<<<<<< - * str path, - * object version, - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser._new_request_message", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_ret); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":221 - * cdef readonly object chunked - * - * def __init__(self, version, code, reason, headers, raw_headers, # <<<<<<<<<<<<<< - * should_close, compression, upgrade, chunked): - * self.version = version - */ - -/* Python wrapper */ -static int __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_version = 0; - PyObject *__pyx_v_code = 0; - PyObject *__pyx_v_reason = 0; - PyObject *__pyx_v_headers = 0; - PyObject *__pyx_v_raw_headers = 0; - PyObject *__pyx_v_should_close = 0; - PyObject *__pyx_v_compression = 0; - PyObject *__pyx_v_upgrade = 0; - PyObject *__pyx_v_chunked = 0; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_version,&__pyx_n_s_code,&__pyx_n_s_reason,&__pyx_n_s_headers,&__pyx_n_s_raw_headers,&__pyx_n_s_should_close,&__pyx_n_s_compression,&__pyx_n_s_upgrade,&__pyx_n_s_chunked,0}; - PyObject* values[9] = {0,0,0,0,0,0,0,0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); - CYTHON_FALLTHROUGH; - case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); - CYTHON_FALLTHROUGH; - case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); - CYTHON_FALLTHROUGH; - case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); - CYTHON_FALLTHROUGH; - case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - CYTHON_FALLTHROUGH; - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_version)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_code)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 1); __PYX_ERR(0, 221, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_reason)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 2); __PYX_ERR(0, 221, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 3: - if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_headers)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 3); __PYX_ERR(0, 221, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 4: - if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_raw_headers)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 4); __PYX_ERR(0, 221, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 5: - if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_should_close)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 5); __PYX_ERR(0, 221, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 6: - if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_compression)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 6); __PYX_ERR(0, 221, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 7: - if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_upgrade)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 7); __PYX_ERR(0, 221, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 8: - if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_chunked)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 8); __PYX_ERR(0, 221, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 221, __pyx_L3_error) - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 9) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - values[5] = PyTuple_GET_ITEM(__pyx_args, 5); - values[6] = PyTuple_GET_ITEM(__pyx_args, 6); - values[7] = PyTuple_GET_ITEM(__pyx_args, 7); - values[8] = PyTuple_GET_ITEM(__pyx_args, 8); - } - __pyx_v_version = values[0]; - __pyx_v_code = values[1]; - __pyx_v_reason = values[2]; - __pyx_v_headers = values[3]; - __pyx_v_raw_headers = values[4]; - __pyx_v_should_close = values[5]; - __pyx_v_compression = values[6]; - __pyx_v_upgrade = values[7]; - __pyx_v_chunked = values[8]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 221, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage___init__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self), __pyx_v_version, __pyx_v_code, __pyx_v_reason, __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_compression, __pyx_v_upgrade, __pyx_v_chunked); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage___init__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self, PyObject *__pyx_v_version, PyObject *__pyx_v_code, PyObject *__pyx_v_reason, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, PyObject *__pyx_v_should_close, PyObject *__pyx_v_compression, PyObject *__pyx_v_upgrade, PyObject *__pyx_v_chunked) { - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__init__", 0); - - /* "aiohttp/_http_parser.pyx":223 - * def __init__(self, version, code, reason, headers, raw_headers, - * should_close, compression, upgrade, chunked): - * self.version = version # <<<<<<<<<<<<<< - * self.code = code - * self.reason = reason - */ - __Pyx_INCREF(__pyx_v_version); - __Pyx_GIVEREF(__pyx_v_version); - __Pyx_GOTREF(__pyx_v_self->version); - __Pyx_DECREF(__pyx_v_self->version); - __pyx_v_self->version = __pyx_v_version; - - /* "aiohttp/_http_parser.pyx":224 - * should_close, compression, upgrade, chunked): - * self.version = version - * self.code = code # <<<<<<<<<<<<<< - * self.reason = reason - * self.headers = headers - */ - __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_code); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 224, __pyx_L1_error) - __pyx_v_self->code = __pyx_t_1; - - /* "aiohttp/_http_parser.pyx":225 - * self.version = version - * self.code = code - * self.reason = reason # <<<<<<<<<<<<<< - * self.headers = headers - * self.raw_headers = raw_headers - */ - if (!(likely(PyUnicode_CheckExact(__pyx_v_reason))||((__pyx_v_reason) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_reason)->tp_name), 0))) __PYX_ERR(0, 225, __pyx_L1_error) - __pyx_t_2 = __pyx_v_reason; - __Pyx_INCREF(__pyx_t_2); - __Pyx_GIVEREF(__pyx_t_2); - __Pyx_GOTREF(__pyx_v_self->reason); - __Pyx_DECREF(__pyx_v_self->reason); - __pyx_v_self->reason = ((PyObject*)__pyx_t_2); - __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":226 - * self.code = code - * self.reason = reason - * self.headers = headers # <<<<<<<<<<<<<< - * self.raw_headers = raw_headers - * self.should_close = should_close - */ - __Pyx_INCREF(__pyx_v_headers); - __Pyx_GIVEREF(__pyx_v_headers); - __Pyx_GOTREF(__pyx_v_self->headers); - __Pyx_DECREF(__pyx_v_self->headers); - __pyx_v_self->headers = __pyx_v_headers; - - /* "aiohttp/_http_parser.pyx":227 - * self.reason = reason - * self.headers = headers - * self.raw_headers = raw_headers # <<<<<<<<<<<<<< - * self.should_close = should_close - * self.compression = compression - */ - __Pyx_INCREF(__pyx_v_raw_headers); - __Pyx_GIVEREF(__pyx_v_raw_headers); - __Pyx_GOTREF(__pyx_v_self->raw_headers); - __Pyx_DECREF(__pyx_v_self->raw_headers); - __pyx_v_self->raw_headers = __pyx_v_raw_headers; - - /* "aiohttp/_http_parser.pyx":228 - * self.headers = headers - * self.raw_headers = raw_headers - * self.should_close = should_close # <<<<<<<<<<<<<< - * self.compression = compression - * self.upgrade = upgrade - */ - __Pyx_INCREF(__pyx_v_should_close); - __Pyx_GIVEREF(__pyx_v_should_close); - __Pyx_GOTREF(__pyx_v_self->should_close); - __Pyx_DECREF(__pyx_v_self->should_close); - __pyx_v_self->should_close = __pyx_v_should_close; - - /* "aiohttp/_http_parser.pyx":229 - * self.raw_headers = raw_headers - * self.should_close = should_close - * self.compression = compression # <<<<<<<<<<<<<< - * self.upgrade = upgrade - * self.chunked = chunked - */ - __Pyx_INCREF(__pyx_v_compression); - __Pyx_GIVEREF(__pyx_v_compression); - __Pyx_GOTREF(__pyx_v_self->compression); - __Pyx_DECREF(__pyx_v_self->compression); - __pyx_v_self->compression = __pyx_v_compression; - - /* "aiohttp/_http_parser.pyx":230 - * self.should_close = should_close - * self.compression = compression - * self.upgrade = upgrade # <<<<<<<<<<<<<< - * self.chunked = chunked - * - */ - __Pyx_INCREF(__pyx_v_upgrade); - __Pyx_GIVEREF(__pyx_v_upgrade); - __Pyx_GOTREF(__pyx_v_self->upgrade); - __Pyx_DECREF(__pyx_v_self->upgrade); - __pyx_v_self->upgrade = __pyx_v_upgrade; - - /* "aiohttp/_http_parser.pyx":231 - * self.compression = compression - * self.upgrade = upgrade - * self.chunked = chunked # <<<<<<<<<<<<<< - * - * def __repr__(self): - */ - __Pyx_INCREF(__pyx_v_chunked); - __Pyx_GIVEREF(__pyx_v_chunked); - __Pyx_GOTREF(__pyx_v_self->chunked); - __Pyx_DECREF(__pyx_v_self->chunked); - __pyx_v_self->chunked = __pyx_v_chunked; - - /* "aiohttp/_http_parser.pyx":221 - * cdef readonly object chunked - * - * def __init__(self, version, code, reason, headers, raw_headers, # <<<<<<<<<<<<<< - * should_close, compression, upgrade, chunked): - * self.version = version - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":233 - * self.chunked = chunked - * - * def __repr__(self): # <<<<<<<<<<<<<< - * info = [] - * info.append(("version", self.version)) - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_2__repr__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} -static PyObject *__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */ - -/* "aiohttp/_http_parser.pyx":244 - * info.append(("upgrade", self.upgrade)) - * info.append(("chunked", self.chunked)) - * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< - * return '' - * - */ - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___genexpr(PyObject *__pyx_self) { - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *__pyx_cur_scope; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("genexpr", 0); - __pyx_cur_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr, __pyx_empty_tuple, NULL); - if (unlikely(!__pyx_cur_scope)) { - __pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)Py_None); - __Pyx_INCREF(Py_None); - __PYX_ERR(0, 244, __pyx_L1_error) - } else { - __Pyx_GOTREF(__pyx_cur_scope); - } - __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *) __pyx_self; - __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope)); - __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope); - { - __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1, NULL, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_repr___locals_genexpr, __pyx_n_s_aiohttp__http_parser); if (unlikely(!gen)) __PYX_ERR(0, 244, __pyx_L1_error) - __Pyx_DECREF(__pyx_cur_scope); - __Pyx_RefNannyFinishContext(); - return (PyObject *) gen; - } - - /* function exit code */ - __pyx_L1_error:; - __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__repr__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_DECREF(((PyObject *)__pyx_cur_scope)); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */ -{ - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *__pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)__pyx_generator->closure); - PyObject *__pyx_r = NULL; - PyObject *__pyx_t_1 = NULL; - Py_ssize_t __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *(*__pyx_t_7)(PyObject *); - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("genexpr", 0); - switch (__pyx_generator->resume_label) { - case 0: goto __pyx_L3_first_run; - default: /* CPython raises the right error here */ - __Pyx_RefNannyFinishContext(); - return NULL; - } - __pyx_L3_first_run:; - if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 244, __pyx_L1_error) - __pyx_r = PyList_New(0); if (unlikely(!__pyx_r)) __PYX_ERR(0, 244, __pyx_L1_error) - __Pyx_GOTREF(__pyx_r); - if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_info)) { __Pyx_RaiseClosureNameError("info"); __PYX_ERR(0, 244, __pyx_L1_error) } - if (unlikely(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_info == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); - __PYX_ERR(0, 244, __pyx_L1_error) - } - __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_info; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; - for (;;) { - if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 244, __pyx_L1_error) - #else - __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - #endif - if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) { - PyObject* sequence = __pyx_t_3; - Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); - if (unlikely(size != 2)) { - if (size > 2) __Pyx_RaiseTooManyValuesError(2); - else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(0, 244, __pyx_L1_error) - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - if (likely(PyTuple_CheckExact(sequence))) { - __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); - } else { - __pyx_t_4 = PyList_GET_ITEM(sequence, 0); - __pyx_t_5 = PyList_GET_ITEM(sequence, 1); - } - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(__pyx_t_5); - #else - __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 244, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 244, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } else { - Py_ssize_t index = -1; - __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 244, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext; - index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L6_unpacking_failed; - __Pyx_GOTREF(__pyx_t_4); - index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L6_unpacking_failed; - __Pyx_GOTREF(__pyx_t_5); - if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 244, __pyx_L1_error) - __pyx_t_7 = NULL; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - goto __pyx_L7_unpacking_done; - __pyx_L6_unpacking_failed:; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_7 = NULL; - if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); - __PYX_ERR(0, 244, __pyx_L1_error) - __pyx_L7_unpacking_done:; - } - __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_name); - __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_name, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_4); - __pyx_t_4 = 0; - __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_val); - __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_val, __pyx_t_5); - __Pyx_GIVEREF(__pyx_t_5); - __pyx_t_5 = 0; - __pyx_t_3 = PyNumber_Add(__pyx_cur_scope->__pyx_v_name, __pyx_kp_u_); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_5 = PyObject_Repr(__pyx_cur_scope->__pyx_v_val); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 244, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_4 = PyNumber_Add(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 244, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(__Pyx_ListComp_Append(__pyx_r, (PyObject*)__pyx_t_4))) __PYX_ERR(0, 244, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope); - - /* function exit code */ - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_r); __pyx_r = 0; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - #if !CYTHON_USE_EXC_INFO_STACK - __Pyx_Coroutine_ResetAndClearException(__pyx_generator); - #endif - __pyx_generator->resume_label = -1; - __Pyx_Coroutine_clear((PyObject*)__pyx_generator); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":233 - * self.chunked = chunked - * - * def __repr__(self): # <<<<<<<<<<<<<< - * info = [] - * info.append(("version", self.version)) - */ - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_2__repr__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *__pyx_cur_scope; - PyObject *__pyx_v_sinfo = NULL; - PyObject *__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1 = 0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__repr__", 0); - __pyx_cur_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__, __pyx_empty_tuple, NULL); - if (unlikely(!__pyx_cur_scope)) { - __pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)Py_None); - __Pyx_INCREF(Py_None); - __PYX_ERR(0, 233, __pyx_L1_error) - } else { - __Pyx_GOTREF(__pyx_cur_scope); - } - - /* "aiohttp/_http_parser.pyx":234 - * - * def __repr__(self): - * info = [] # <<<<<<<<<<<<<< - * info.append(("version", self.version)) - * info.append(("code", self.code)) - */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 234, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_cur_scope->__pyx_v_info = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":235 - * def __repr__(self): - * info = [] - * info.append(("version", self.version)) # <<<<<<<<<<<<<< - * info.append(("code", self.code)) - * info.append(("reason", self.reason)) - */ - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 235, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_u_version); - __Pyx_GIVEREF(__pyx_n_u_version); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_version); - __Pyx_INCREF(__pyx_v_self->version); - __Pyx_GIVEREF(__pyx_v_self->version); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->version); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 235, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":236 - * info = [] - * info.append(("version", self.version)) - * info.append(("code", self.code)) # <<<<<<<<<<<<<< - * info.append(("reason", self.reason)) - * info.append(("headers", self.headers)) - */ - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 236, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 236, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_n_u_code); - __Pyx_GIVEREF(__pyx_n_u_code); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_code); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); - __pyx_t_1 = 0; - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 236, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":237 - * info.append(("version", self.version)) - * info.append(("code", self.code)) - * info.append(("reason", self.reason)) # <<<<<<<<<<<<<< - * info.append(("headers", self.headers)) - * info.append(("raw_headers", self.raw_headers)) - */ - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 237, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_n_u_reason); - __Pyx_GIVEREF(__pyx_n_u_reason); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_reason); - __Pyx_INCREF(__pyx_v_self->reason); - __Pyx_GIVEREF(__pyx_v_self->reason); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->reason); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 237, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":238 - * info.append(("code", self.code)) - * info.append(("reason", self.reason)) - * info.append(("headers", self.headers)) # <<<<<<<<<<<<<< - * info.append(("raw_headers", self.raw_headers)) - * info.append(("should_close", self.should_close)) - */ - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 238, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_n_u_headers); - __Pyx_GIVEREF(__pyx_n_u_headers); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_headers); - __Pyx_INCREF(__pyx_v_self->headers); - __Pyx_GIVEREF(__pyx_v_self->headers); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->headers); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 238, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":239 - * info.append(("reason", self.reason)) - * info.append(("headers", self.headers)) - * info.append(("raw_headers", self.raw_headers)) # <<<<<<<<<<<<<< - * info.append(("should_close", self.should_close)) - * info.append(("compression", self.compression)) - */ - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 239, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_n_u_raw_headers); - __Pyx_GIVEREF(__pyx_n_u_raw_headers); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_raw_headers); - __Pyx_INCREF(__pyx_v_self->raw_headers); - __Pyx_GIVEREF(__pyx_v_self->raw_headers); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->raw_headers); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 239, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":240 - * info.append(("headers", self.headers)) - * info.append(("raw_headers", self.raw_headers)) - * info.append(("should_close", self.should_close)) # <<<<<<<<<<<<<< - * info.append(("compression", self.compression)) - * info.append(("upgrade", self.upgrade)) - */ - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 240, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_n_u_should_close); - __Pyx_GIVEREF(__pyx_n_u_should_close); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_should_close); - __Pyx_INCREF(__pyx_v_self->should_close); - __Pyx_GIVEREF(__pyx_v_self->should_close); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->should_close); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 240, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":241 - * info.append(("raw_headers", self.raw_headers)) - * info.append(("should_close", self.should_close)) - * info.append(("compression", self.compression)) # <<<<<<<<<<<<<< - * info.append(("upgrade", self.upgrade)) - * info.append(("chunked", self.chunked)) - */ - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 241, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_n_u_compression); - __Pyx_GIVEREF(__pyx_n_u_compression); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_compression); - __Pyx_INCREF(__pyx_v_self->compression); - __Pyx_GIVEREF(__pyx_v_self->compression); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->compression); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 241, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":242 - * info.append(("should_close", self.should_close)) - * info.append(("compression", self.compression)) - * info.append(("upgrade", self.upgrade)) # <<<<<<<<<<<<<< - * info.append(("chunked", self.chunked)) - * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) - */ - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 242, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_n_u_upgrade); - __Pyx_GIVEREF(__pyx_n_u_upgrade); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_upgrade); - __Pyx_INCREF(__pyx_v_self->upgrade); - __Pyx_GIVEREF(__pyx_v_self->upgrade); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->upgrade); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 242, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":243 - * info.append(("compression", self.compression)) - * info.append(("upgrade", self.upgrade)) - * info.append(("chunked", self.chunked)) # <<<<<<<<<<<<<< - * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) - * return '' - */ - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 243, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_n_u_chunked); - __Pyx_GIVEREF(__pyx_n_u_chunked); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_chunked); - __Pyx_INCREF(__pyx_v_self->chunked); - __Pyx_GIVEREF(__pyx_v_self->chunked); - PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->chunked); - __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 243, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":244 - * info.append(("upgrade", self.upgrade)) - * info.append(("chunked", self.chunked)) - * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< - * return '' - * - */ - __pyx_t_3 = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_1 = __Pyx_Generator_Next(__pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 244, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = PyUnicode_Join(__pyx_kp_u__2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_sinfo = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":245 - * info.append(("chunked", self.chunked)) - * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) - * return '' # <<<<<<<<<<<<<< - * - * - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = __Pyx_PyUnicode_ConcatSafe(__pyx_kp_u_RawResponseMessage, __pyx_v_sinfo); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 245, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_1 = __Pyx_PyUnicode_Concat(__pyx_t_3, __pyx_kp_u__3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 245, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":233 - * self.chunked = chunked - * - * def __repr__(self): # <<<<<<<<<<<<<< - * info = [] - * info.append(("version", self.version)) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_sinfo); - __Pyx_XDECREF(__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1); - __Pyx_DECREF(((PyObject *)__pyx_cur_scope)); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":211 - * @cython.freelist(DEFAULT_FREELIST_SIZE) - * cdef class RawResponseMessage: - * cdef readonly object version # HttpVersion # <<<<<<<<<<<<<< - * cdef readonly int code - * cdef readonly str reason - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7version_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7version_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7version___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7version___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->version); - __pyx_r = __pyx_v_self->version; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":212 - * cdef class RawResponseMessage: - * cdef readonly object version # HttpVersion - * cdef readonly int code # <<<<<<<<<<<<<< - * cdef readonly str reason - * cdef readonly object headers # CIMultiDict - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_4code_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_4code_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4code___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4code___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 212, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.code.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":213 - * cdef readonly object version # HttpVersion - * cdef readonly int code - * cdef readonly str reason # <<<<<<<<<<<<<< - * cdef readonly object headers # CIMultiDict - * cdef readonly object raw_headers # tuple - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_6reason_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_6reason_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6reason___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6reason___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->reason); - __pyx_r = __pyx_v_self->reason; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":214 - * cdef readonly int code - * cdef readonly str reason - * cdef readonly object headers # CIMultiDict # <<<<<<<<<<<<<< - * cdef readonly object raw_headers # tuple - * cdef readonly object should_close - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7headers_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7headers_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->headers); - __pyx_r = __pyx_v_self->headers; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":215 - * cdef readonly str reason - * cdef readonly object headers # CIMultiDict - * cdef readonly object raw_headers # tuple # <<<<<<<<<<<<<< - * cdef readonly object should_close - * cdef readonly object compression - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->raw_headers); - __pyx_r = __pyx_v_self->raw_headers; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":216 - * cdef readonly object headers # CIMultiDict - * cdef readonly object raw_headers # tuple - * cdef readonly object should_close # <<<<<<<<<<<<<< - * cdef readonly object compression - * cdef readonly object upgrade - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_12should_close_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_12should_close_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_12should_close___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_12should_close___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->should_close); - __pyx_r = __pyx_v_self->should_close; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":217 - * cdef readonly object raw_headers # tuple - * cdef readonly object should_close - * cdef readonly object compression # <<<<<<<<<<<<<< - * cdef readonly object upgrade - * cdef readonly object chunked - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11compression_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11compression_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11compression___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11compression___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->compression); - __pyx_r = __pyx_v_self->compression; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":218 - * cdef readonly object should_close - * cdef readonly object compression - * cdef readonly object upgrade # <<<<<<<<<<<<<< - * cdef readonly object chunked - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->upgrade); - __pyx_r = __pyx_v_self->upgrade; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":219 - * cdef readonly object compression - * cdef readonly object upgrade - * cdef readonly object chunked # <<<<<<<<<<<<<< - * - * def __init__(self, version, code, reason, headers, raw_headers, - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7chunked_1__get__(PyObject *__pyx_v_self); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7chunked_1__get__(PyObject *__pyx_v_self) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7chunked___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7chunked___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__get__", 0); - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_self->chunked); - __pyx_r = __pyx_v_self->chunked; - goto __pyx_L0; - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * cdef tuple state - * cdef object _dict - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4__reduce_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { - PyObject *__pyx_v_state = 0; - PyObject *__pyx_v__dict = 0; - int __pyx_v_use_setstate; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - int __pyx_t_3; - int __pyx_t_4; - int __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); - - /* "(tree fragment)":5 - * cdef object _dict - * cdef bint use_setstate - * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) # <<<<<<<<<<<<<< - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: - */ - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->code); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyTuple_New(9); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_v_self->chunked); - __Pyx_GIVEREF(__pyx_v_self->chunked); - PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->chunked); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1); - __Pyx_INCREF(__pyx_v_self->compression); - __Pyx_GIVEREF(__pyx_v_self->compression); - PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_self->compression); - __Pyx_INCREF(__pyx_v_self->headers); - __Pyx_GIVEREF(__pyx_v_self->headers); - PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_self->headers); - __Pyx_INCREF(__pyx_v_self->raw_headers); - __Pyx_GIVEREF(__pyx_v_self->raw_headers); - PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_v_self->raw_headers); - __Pyx_INCREF(__pyx_v_self->reason); - __Pyx_GIVEREF(__pyx_v_self->reason); - PyTuple_SET_ITEM(__pyx_t_2, 5, __pyx_v_self->reason); - __Pyx_INCREF(__pyx_v_self->should_close); - __Pyx_GIVEREF(__pyx_v_self->should_close); - PyTuple_SET_ITEM(__pyx_t_2, 6, __pyx_v_self->should_close); - __Pyx_INCREF(__pyx_v_self->upgrade); - __Pyx_GIVEREF(__pyx_v_self->upgrade); - PyTuple_SET_ITEM(__pyx_t_2, 7, __pyx_v_self->upgrade); - __Pyx_INCREF(__pyx_v_self->version); - __Pyx_GIVEREF(__pyx_v_self->version); - PyTuple_SET_ITEM(__pyx_t_2, 8, __pyx_v_self->version); - __pyx_t_1 = 0; - __pyx_v_state = ((PyObject*)__pyx_t_2); - __pyx_t_2 = 0; - - /* "(tree fragment)":6 - * cdef bint use_setstate - * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) - * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< - * if _dict is not None: - * state += (_dict,) - */ - __pyx_t_2 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_v__dict = __pyx_t_2; - __pyx_t_2 = 0; - - /* "(tree fragment)":7 - * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: # <<<<<<<<<<<<<< - * state += (_dict,) - * use_setstate = True - */ - __pyx_t_3 = (__pyx_v__dict != Py_None); - __pyx_t_4 = (__pyx_t_3 != 0); - if (__pyx_t_4) { - - /* "(tree fragment)":8 - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: - * state += (_dict,) # <<<<<<<<<<<<<< - * use_setstate = True - * else: - */ - __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_v__dict); - __Pyx_GIVEREF(__pyx_v__dict); - PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v__dict); - __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_1)); - __pyx_t_1 = 0; - - /* "(tree fragment)":9 - * if _dict is not None: - * state += (_dict,) - * use_setstate = True # <<<<<<<<<<<<<< - * else: - * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None - */ - __pyx_v_use_setstate = 1; - - /* "(tree fragment)":7 - * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) - * _dict = getattr(self, '__dict__', None) - * if _dict is not None: # <<<<<<<<<<<<<< - * state += (_dict,) - * use_setstate = True - */ - goto __pyx_L3; - } - - /* "(tree fragment)":11 - * use_setstate = True - * else: - * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None # <<<<<<<<<<<<<< - * if use_setstate: - * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, None), state - */ - /*else*/ { - __pyx_t_3 = (__pyx_v_self->chunked != Py_None); - __pyx_t_5 = (__pyx_t_3 != 0); - if (!__pyx_t_5) { - } else { - __pyx_t_4 = __pyx_t_5; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_5 = (__pyx_v_self->compression != Py_None); - __pyx_t_3 = (__pyx_t_5 != 0); - if (!__pyx_t_3) { - } else { - __pyx_t_4 = __pyx_t_3; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_3 = (__pyx_v_self->headers != Py_None); - __pyx_t_5 = (__pyx_t_3 != 0); - if (!__pyx_t_5) { - } else { - __pyx_t_4 = __pyx_t_5; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_5 = (__pyx_v_self->raw_headers != Py_None); - __pyx_t_3 = (__pyx_t_5 != 0); - if (!__pyx_t_3) { - } else { - __pyx_t_4 = __pyx_t_3; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_3 = (__pyx_v_self->reason != ((PyObject*)Py_None)); - __pyx_t_5 = (__pyx_t_3 != 0); - if (!__pyx_t_5) { - } else { - __pyx_t_4 = __pyx_t_5; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_5 = (__pyx_v_self->should_close != Py_None); - __pyx_t_3 = (__pyx_t_5 != 0); - if (!__pyx_t_3) { - } else { - __pyx_t_4 = __pyx_t_3; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_3 = (__pyx_v_self->upgrade != Py_None); - __pyx_t_5 = (__pyx_t_3 != 0); - if (!__pyx_t_5) { - } else { - __pyx_t_4 = __pyx_t_5; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_5 = (__pyx_v_self->version != Py_None); - __pyx_t_3 = (__pyx_t_5 != 0); - __pyx_t_4 = __pyx_t_3; - __pyx_L4_bool_binop_done:; - __pyx_v_use_setstate = __pyx_t_4; - } - __pyx_L3:; - - /* "(tree fragment)":12 - * else: - * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None - * if use_setstate: # <<<<<<<<<<<<<< - * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, None), state - * else: - */ - __pyx_t_4 = (__pyx_v_use_setstate != 0); - if (__pyx_t_4) { - - /* "(tree fragment)":13 - * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None - * if use_setstate: - * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, None), state # <<<<<<<<<<<<<< - * else: - * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, state) - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pyx_unpickle_RawResponseMessag); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_INCREF(__pyx_int_209127132); - __Pyx_GIVEREF(__pyx_int_209127132); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_209127132); - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - PyTuple_SET_ITEM(__pyx_t_2, 2, Py_None); - __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GIVEREF(__pyx_t_1); - PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_2); - __Pyx_INCREF(__pyx_v_state); - __Pyx_GIVEREF(__pyx_v_state); - PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_v_state); - __pyx_t_1 = 0; - __pyx_t_2 = 0; - __pyx_r = __pyx_t_6; - __pyx_t_6 = 0; - goto __pyx_L0; - - /* "(tree fragment)":12 - * else: - * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None - * if use_setstate: # <<<<<<<<<<<<<< - * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, None), state - * else: - */ - } - - /* "(tree fragment)":15 - * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, None), state - * else: - * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, state) # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) - */ - /*else*/ { - __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_pyx_unpickle_RawResponseMessag); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); - __Pyx_INCREF(__pyx_int_209127132); - __Pyx_GIVEREF(__pyx_int_209127132); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_209127132); - __Pyx_INCREF(__pyx_v_state); - __Pyx_GIVEREF(__pyx_v_state); - PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_state); - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_6); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2); - __pyx_t_6 = 0; - __pyx_t_2 = 0; - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - } - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * cdef tuple state - * cdef object _dict - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_state); - __Pyx_XDECREF(__pyx_v__dict); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":16 - * else: - * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, state) - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6__setstate_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); - - /* "(tree fragment)":17 - * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, state) - * def __setstate_cython__(self, __pyx_state): - * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) # <<<<<<<<<<<<<< - */ - if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error) - __pyx_t_1 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "(tree fragment)":16 - * else: - * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, state) - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":248 - * - * - * cdef _new_response_message(object version, # <<<<<<<<<<<<<< - * int code, - * str reason, - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser__new_response_message(PyObject *__pyx_v_version, int __pyx_v_code, PyObject *__pyx_v_reason, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, int __pyx_v_should_close, PyObject *__pyx_v_compression, int __pyx_v_upgrade, int __pyx_v_chunked) { - struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_ret = 0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_new_response_message", 0); - - /* "aiohttp/_http_parser.pyx":258 - * bint chunked): - * cdef RawResponseMessage ret - * ret = RawResponseMessage.__new__(RawResponseMessage) # <<<<<<<<<<<<<< - * ret.version = version - * ret.code = code - */ - __pyx_t_1 = ((PyObject *)__pyx_tp_new_7aiohttp_12_http_parser_RawResponseMessage(((PyTypeObject *)__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage), __pyx_empty_tuple, NULL)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 258, __pyx_L1_error) - __Pyx_GOTREF(((PyObject *)__pyx_t_1)); - __pyx_v_ret = ((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":259 - * cdef RawResponseMessage ret - * ret = RawResponseMessage.__new__(RawResponseMessage) - * ret.version = version # <<<<<<<<<<<<<< - * ret.code = code - * ret.reason = reason - */ - __Pyx_INCREF(__pyx_v_version); - __Pyx_GIVEREF(__pyx_v_version); - __Pyx_GOTREF(__pyx_v_ret->version); - __Pyx_DECREF(__pyx_v_ret->version); - __pyx_v_ret->version = __pyx_v_version; - - /* "aiohttp/_http_parser.pyx":260 - * ret = RawResponseMessage.__new__(RawResponseMessage) - * ret.version = version - * ret.code = code # <<<<<<<<<<<<<< - * ret.reason = reason - * ret.headers = headers - */ - __pyx_v_ret->code = __pyx_v_code; - - /* "aiohttp/_http_parser.pyx":261 - * ret.version = version - * ret.code = code - * ret.reason = reason # <<<<<<<<<<<<<< - * ret.headers = headers - * ret.raw_headers = raw_headers - */ - __Pyx_INCREF(__pyx_v_reason); - __Pyx_GIVEREF(__pyx_v_reason); - __Pyx_GOTREF(__pyx_v_ret->reason); - __Pyx_DECREF(__pyx_v_ret->reason); - __pyx_v_ret->reason = __pyx_v_reason; - - /* "aiohttp/_http_parser.pyx":262 - * ret.code = code - * ret.reason = reason - * ret.headers = headers # <<<<<<<<<<<<<< - * ret.raw_headers = raw_headers - * ret.should_close = should_close - */ - __Pyx_INCREF(__pyx_v_headers); - __Pyx_GIVEREF(__pyx_v_headers); - __Pyx_GOTREF(__pyx_v_ret->headers); - __Pyx_DECREF(__pyx_v_ret->headers); - __pyx_v_ret->headers = __pyx_v_headers; - - /* "aiohttp/_http_parser.pyx":263 - * ret.reason = reason - * ret.headers = headers - * ret.raw_headers = raw_headers # <<<<<<<<<<<<<< - * ret.should_close = should_close - * ret.compression = compression - */ - __Pyx_INCREF(__pyx_v_raw_headers); - __Pyx_GIVEREF(__pyx_v_raw_headers); - __Pyx_GOTREF(__pyx_v_ret->raw_headers); - __Pyx_DECREF(__pyx_v_ret->raw_headers); - __pyx_v_ret->raw_headers = __pyx_v_raw_headers; - - /* "aiohttp/_http_parser.pyx":264 - * ret.headers = headers - * ret.raw_headers = raw_headers - * ret.should_close = should_close # <<<<<<<<<<<<<< - * ret.compression = compression - * ret.upgrade = upgrade - */ - __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_should_close); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 264, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v_ret->should_close); - __Pyx_DECREF(__pyx_v_ret->should_close); - __pyx_v_ret->should_close = __pyx_t_1; - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":265 - * ret.raw_headers = raw_headers - * ret.should_close = should_close - * ret.compression = compression # <<<<<<<<<<<<<< - * ret.upgrade = upgrade - * ret.chunked = chunked - */ - __Pyx_INCREF(__pyx_v_compression); - __Pyx_GIVEREF(__pyx_v_compression); - __Pyx_GOTREF(__pyx_v_ret->compression); - __Pyx_DECREF(__pyx_v_ret->compression); - __pyx_v_ret->compression = __pyx_v_compression; - - /* "aiohttp/_http_parser.pyx":266 - * ret.should_close = should_close - * ret.compression = compression - * ret.upgrade = upgrade # <<<<<<<<<<<<<< - * ret.chunked = chunked - * return ret - */ - __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_upgrade); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 266, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v_ret->upgrade); - __Pyx_DECREF(__pyx_v_ret->upgrade); - __pyx_v_ret->upgrade = __pyx_t_1; - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":267 - * ret.compression = compression - * ret.upgrade = upgrade - * ret.chunked = chunked # <<<<<<<<<<<<<< - * return ret - * - */ - __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_chunked); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 267, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v_ret->chunked); - __Pyx_DECREF(__pyx_v_ret->chunked); - __pyx_v_ret->chunked = __pyx_t_1; - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":268 - * ret.upgrade = upgrade - * ret.chunked = chunked - * return ret # <<<<<<<<<<<<<< - * - * - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject *)__pyx_v_ret)); - __pyx_r = ((PyObject *)__pyx_v_ret); - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":248 - * - * - * cdef _new_response_message(object version, # <<<<<<<<<<<<<< - * int code, - * str reason, - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser._new_response_message", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_ret); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":312 - * Py_buffer py_buf - * - * def __cinit__(self): # <<<<<<<<<<<<<< - * self._cparser = \ - * PyMem_Malloc(sizeof(cparser.llhttp_t)) - */ - -/* Python wrapper */ -static int __pyx_pw_7aiohttp_12_http_parser_10HttpParser_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_pw_7aiohttp_12_http_parser_10HttpParser_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); - if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) { - __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;} - if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1; - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser___cinit__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7aiohttp_12_http_parser_10HttpParser___cinit__(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__cinit__", 0); - - /* "aiohttp/_http_parser.pyx":313 - * - * def __cinit__(self): - * self._cparser = \ # <<<<<<<<<<<<<< - * PyMem_Malloc(sizeof(cparser.llhttp_t)) - * if self._cparser is NULL: - */ - __pyx_v_self->_cparser = ((llhttp_t *)PyMem_Malloc((sizeof(llhttp_t)))); - - /* "aiohttp/_http_parser.pyx":315 - * self._cparser = \ - * PyMem_Malloc(sizeof(cparser.llhttp_t)) - * if self._cparser is NULL: # <<<<<<<<<<<<<< - * raise MemoryError() - * - */ - __pyx_t_1 = ((__pyx_v_self->_cparser == NULL) != 0); - if (unlikely(__pyx_t_1)) { - - /* "aiohttp/_http_parser.pyx":316 - * PyMem_Malloc(sizeof(cparser.llhttp_t)) - * if self._cparser is NULL: - * raise MemoryError() # <<<<<<<<<<<<<< - * - * self._csettings = \ - */ - PyErr_NoMemory(); __PYX_ERR(0, 316, __pyx_L1_error) - - /* "aiohttp/_http_parser.pyx":315 - * self._cparser = \ - * PyMem_Malloc(sizeof(cparser.llhttp_t)) - * if self._cparser is NULL: # <<<<<<<<<<<<<< - * raise MemoryError() - * - */ - } - - /* "aiohttp/_http_parser.pyx":318 - * raise MemoryError() - * - * self._csettings = \ # <<<<<<<<<<<<<< - * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) - * if self._csettings is NULL: - */ - __pyx_v_self->_csettings = ((llhttp_settings_t *)PyMem_Malloc((sizeof(llhttp_settings_t)))); - - /* "aiohttp/_http_parser.pyx":320 - * self._csettings = \ - * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) - * if self._csettings is NULL: # <<<<<<<<<<<<<< - * raise MemoryError() - * - */ - __pyx_t_1 = ((__pyx_v_self->_csettings == NULL) != 0); - if (unlikely(__pyx_t_1)) { - - /* "aiohttp/_http_parser.pyx":321 - * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) - * if self._csettings is NULL: - * raise MemoryError() # <<<<<<<<<<<<<< - * - * def __dealloc__(self): - */ - PyErr_NoMemory(); __PYX_ERR(0, 321, __pyx_L1_error) - - /* "aiohttp/_http_parser.pyx":320 - * self._csettings = \ - * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) - * if self._csettings is NULL: # <<<<<<<<<<<<<< - * raise MemoryError() - * - */ - } - - /* "aiohttp/_http_parser.pyx":312 - * Py_buffer py_buf - * - * def __cinit__(self): # <<<<<<<<<<<<<< - * self._cparser = \ - * PyMem_Malloc(sizeof(cparser.llhttp_t)) - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":323 - * raise MemoryError() - * - * def __dealloc__(self): # <<<<<<<<<<<<<< - * PyMem_Free(self._cparser) - * PyMem_Free(self._csettings) - */ - -/* Python wrapper */ -static void __pyx_pw_7aiohttp_12_http_parser_10HttpParser_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ -static void __pyx_pw_7aiohttp_12_http_parser_10HttpParser_3__dealloc__(PyObject *__pyx_v_self) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); - __pyx_pf_7aiohttp_12_http_parser_10HttpParser_2__dealloc__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -static void __pyx_pf_7aiohttp_12_http_parser_10HttpParser_2__dealloc__(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__dealloc__", 0); - - /* "aiohttp/_http_parser.pyx":324 - * - * def __dealloc__(self): - * PyMem_Free(self._cparser) # <<<<<<<<<<<<<< - * PyMem_Free(self._csettings) - * - */ - PyMem_Free(__pyx_v_self->_cparser); - - /* "aiohttp/_http_parser.pyx":325 - * def __dealloc__(self): - * PyMem_Free(self._cparser) - * PyMem_Free(self._csettings) # <<<<<<<<<<<<<< - * - * cdef _init( - */ - PyMem_Free(__pyx_v_self->_csettings); - - /* "aiohttp/_http_parser.pyx":323 - * raise MemoryError() - * - * def __dealloc__(self): # <<<<<<<<<<<<<< - * PyMem_Free(self._cparser) - * PyMem_Free(self._csettings) - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "aiohttp/_http_parser.pyx":327 - * PyMem_Free(self._csettings) - * - * cdef _init( # <<<<<<<<<<<<<< - * self, cparser.llhttp_type mode, - * object protocol, object loop, int limit, - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__init(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, enum llhttp_type __pyx_v_mode, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args) { - - /* "aiohttp/_http_parser.pyx":330 - * self, cparser.llhttp_type mode, - * object protocol, object loop, int limit, - * object timer=None, # <<<<<<<<<<<<<< - * size_t max_line_size=8190, size_t max_headers=32768, - * size_t max_field_size=8190, payload_exception=None, - */ - PyObject *__pyx_v_timer = ((PyObject *)Py_None); - size_t __pyx_v_max_line_size = ((size_t)0x1FFE); - size_t __pyx_v_max_headers = ((size_t)0x8000); - size_t __pyx_v_max_field_size = ((size_t)0x1FFE); - - /* "aiohttp/_http_parser.pyx":332 - * object timer=None, - * size_t max_line_size=8190, size_t max_headers=32768, - * size_t max_field_size=8190, payload_exception=None, # <<<<<<<<<<<<<< - * bint response_with_body=True, bint read_until_eof=False, - * bint auto_decompress=True, - */ - PyObject *__pyx_v_payload_exception = ((PyObject *)Py_None); - - /* "aiohttp/_http_parser.pyx":333 - * size_t max_line_size=8190, size_t max_headers=32768, - * size_t max_field_size=8190, payload_exception=None, - * bint response_with_body=True, bint read_until_eof=False, # <<<<<<<<<<<<<< - * bint auto_decompress=True, - * ): - */ - int __pyx_v_response_with_body = ((int)1); - int __pyx_v_read_until_eof = ((int)0); - - /* "aiohttp/_http_parser.pyx":334 - * size_t max_field_size=8190, payload_exception=None, - * bint response_with_body=True, bint read_until_eof=False, - * bint auto_decompress=True, # <<<<<<<<<<<<<< - * ): - * cparser.llhttp_settings_init(self._csettings) - */ - int __pyx_v_auto_decompress = ((int)1); - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_init", 0); - if (__pyx_optional_args) { - if (__pyx_optional_args->__pyx_n > 0) { - __pyx_v_timer = __pyx_optional_args->timer; - if (__pyx_optional_args->__pyx_n > 1) { - __pyx_v_max_line_size = __pyx_optional_args->max_line_size; - if (__pyx_optional_args->__pyx_n > 2) { - __pyx_v_max_headers = __pyx_optional_args->max_headers; - if (__pyx_optional_args->__pyx_n > 3) { - __pyx_v_max_field_size = __pyx_optional_args->max_field_size; - if (__pyx_optional_args->__pyx_n > 4) { - __pyx_v_payload_exception = __pyx_optional_args->payload_exception; - if (__pyx_optional_args->__pyx_n > 5) { - __pyx_v_response_with_body = __pyx_optional_args->response_with_body; - if (__pyx_optional_args->__pyx_n > 6) { - __pyx_v_read_until_eof = __pyx_optional_args->read_until_eof; - if (__pyx_optional_args->__pyx_n > 7) { - __pyx_v_auto_decompress = __pyx_optional_args->auto_decompress; - } - } - } - } - } - } - } - } - } - - /* "aiohttp/_http_parser.pyx":336 - * bint auto_decompress=True, - * ): - * cparser.llhttp_settings_init(self._csettings) # <<<<<<<<<<<<<< - * cparser.llhttp_init(self._cparser, mode, self._csettings) - * self._cparser.data = self - */ - llhttp_settings_init(__pyx_v_self->_csettings); - - /* "aiohttp/_http_parser.pyx":337 - * ): - * cparser.llhttp_settings_init(self._csettings) - * cparser.llhttp_init(self._cparser, mode, self._csettings) # <<<<<<<<<<<<<< - * self._cparser.data = self - * self._cparser.content_length = 0 - */ - llhttp_init(__pyx_v_self->_cparser, __pyx_v_mode, __pyx_v_self->_csettings); - - /* "aiohttp/_http_parser.pyx":338 - * cparser.llhttp_settings_init(self._csettings) - * cparser.llhttp_init(self._cparser, mode, self._csettings) - * self._cparser.data = self # <<<<<<<<<<<<<< - * self._cparser.content_length = 0 - * - */ - __pyx_v_self->_cparser->data = ((void *)__pyx_v_self); - - /* "aiohttp/_http_parser.pyx":339 - * cparser.llhttp_init(self._cparser, mode, self._csettings) - * self._cparser.data = self - * self._cparser.content_length = 0 # <<<<<<<<<<<<<< - * - * self._protocol = protocol - */ - __pyx_v_self->_cparser->content_length = 0; - - /* "aiohttp/_http_parser.pyx":341 - * self._cparser.content_length = 0 - * - * self._protocol = protocol # <<<<<<<<<<<<<< - * self._loop = loop - * self._timer = timer - */ - __Pyx_INCREF(__pyx_v_protocol); - __Pyx_GIVEREF(__pyx_v_protocol); - __Pyx_GOTREF(__pyx_v_self->_protocol); - __Pyx_DECREF(__pyx_v_self->_protocol); - __pyx_v_self->_protocol = __pyx_v_protocol; - - /* "aiohttp/_http_parser.pyx":342 - * - * self._protocol = protocol - * self._loop = loop # <<<<<<<<<<<<<< - * self._timer = timer - * - */ - __Pyx_INCREF(__pyx_v_loop); - __Pyx_GIVEREF(__pyx_v_loop); - __Pyx_GOTREF(__pyx_v_self->_loop); - __Pyx_DECREF(__pyx_v_self->_loop); - __pyx_v_self->_loop = __pyx_v_loop; - - /* "aiohttp/_http_parser.pyx":343 - * self._protocol = protocol - * self._loop = loop - * self._timer = timer # <<<<<<<<<<<<<< - * - * self._buf = bytearray() - */ - __Pyx_INCREF(__pyx_v_timer); - __Pyx_GIVEREF(__pyx_v_timer); - __Pyx_GOTREF(__pyx_v_self->_timer); - __Pyx_DECREF(__pyx_v_self->_timer); - __pyx_v_self->_timer = __pyx_v_timer; - - /* "aiohttp/_http_parser.pyx":345 - * self._timer = timer - * - * self._buf = bytearray() # <<<<<<<<<<<<<< - * self._payload = None - * self._payload_error = 0 - */ - __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)(&PyByteArray_Type))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 345, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v_self->_buf); - __Pyx_DECREF(__pyx_v_self->_buf); - __pyx_v_self->_buf = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":346 - * - * self._buf = bytearray() - * self._payload = None # <<<<<<<<<<<<<< - * self._payload_error = 0 - * self._payload_exception = payload_exception - */ - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - __Pyx_GOTREF(__pyx_v_self->_payload); - __Pyx_DECREF(__pyx_v_self->_payload); - __pyx_v_self->_payload = Py_None; - - /* "aiohttp/_http_parser.pyx":347 - * self._buf = bytearray() - * self._payload = None - * self._payload_error = 0 # <<<<<<<<<<<<<< - * self._payload_exception = payload_exception - * self._messages = [] - */ - __pyx_v_self->_payload_error = 0; - - /* "aiohttp/_http_parser.pyx":348 - * self._payload = None - * self._payload_error = 0 - * self._payload_exception = payload_exception # <<<<<<<<<<<<<< - * self._messages = [] - * - */ - __Pyx_INCREF(__pyx_v_payload_exception); - __Pyx_GIVEREF(__pyx_v_payload_exception); - __Pyx_GOTREF(__pyx_v_self->_payload_exception); - __Pyx_DECREF(__pyx_v_self->_payload_exception); - __pyx_v_self->_payload_exception = __pyx_v_payload_exception; - - /* "aiohttp/_http_parser.pyx":349 - * self._payload_error = 0 - * self._payload_exception = payload_exception - * self._messages = [] # <<<<<<<<<<<<<< - * - * self._raw_name = bytearray() - */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 349, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v_self->_messages); - __Pyx_DECREF(__pyx_v_self->_messages); - __pyx_v_self->_messages = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":351 - * self._messages = [] - * - * self._raw_name = bytearray() # <<<<<<<<<<<<<< - * self._raw_value = bytearray() - * self._has_value = False - */ - __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)(&PyByteArray_Type))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 351, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v_self->_raw_name); - __Pyx_DECREF(__pyx_v_self->_raw_name); - __pyx_v_self->_raw_name = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":352 - * - * self._raw_name = bytearray() - * self._raw_value = bytearray() # <<<<<<<<<<<<<< - * self._has_value = False - * - */ - __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)(&PyByteArray_Type))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 352, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v_self->_raw_value); - __Pyx_DECREF(__pyx_v_self->_raw_value); - __pyx_v_self->_raw_value = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":353 - * self._raw_name = bytearray() - * self._raw_value = bytearray() - * self._has_value = False # <<<<<<<<<<<<<< - * - * self._max_line_size = max_line_size - */ - __pyx_v_self->_has_value = 0; - - /* "aiohttp/_http_parser.pyx":355 - * self._has_value = False - * - * self._max_line_size = max_line_size # <<<<<<<<<<<<<< - * self._max_headers = max_headers - * self._max_field_size = max_field_size - */ - __pyx_v_self->_max_line_size = __pyx_v_max_line_size; - - /* "aiohttp/_http_parser.pyx":356 - * - * self._max_line_size = max_line_size - * self._max_headers = max_headers # <<<<<<<<<<<<<< - * self._max_field_size = max_field_size - * self._response_with_body = response_with_body - */ - __pyx_v_self->_max_headers = __pyx_v_max_headers; - - /* "aiohttp/_http_parser.pyx":357 - * self._max_line_size = max_line_size - * self._max_headers = max_headers - * self._max_field_size = max_field_size # <<<<<<<<<<<<<< - * self._response_with_body = response_with_body - * self._read_until_eof = read_until_eof - */ - __pyx_v_self->_max_field_size = __pyx_v_max_field_size; - - /* "aiohttp/_http_parser.pyx":358 - * self._max_headers = max_headers - * self._max_field_size = max_field_size - * self._response_with_body = response_with_body # <<<<<<<<<<<<<< - * self._read_until_eof = read_until_eof - * self._upgraded = False - */ - __pyx_v_self->_response_with_body = __pyx_v_response_with_body; - - /* "aiohttp/_http_parser.pyx":359 - * self._max_field_size = max_field_size - * self._response_with_body = response_with_body - * self._read_until_eof = read_until_eof # <<<<<<<<<<<<<< - * self._upgraded = False - * self._auto_decompress = auto_decompress - */ - __pyx_v_self->_read_until_eof = __pyx_v_read_until_eof; - - /* "aiohttp/_http_parser.pyx":360 - * self._response_with_body = response_with_body - * self._read_until_eof = read_until_eof - * self._upgraded = False # <<<<<<<<<<<<<< - * self._auto_decompress = auto_decompress - * self._content_encoding = None - */ - __pyx_v_self->_upgraded = 0; - - /* "aiohttp/_http_parser.pyx":361 - * self._read_until_eof = read_until_eof - * self._upgraded = False - * self._auto_decompress = auto_decompress # <<<<<<<<<<<<<< - * self._content_encoding = None - * - */ - __pyx_v_self->_auto_decompress = __pyx_v_auto_decompress; - - /* "aiohttp/_http_parser.pyx":362 - * self._upgraded = False - * self._auto_decompress = auto_decompress - * self._content_encoding = None # <<<<<<<<<<<<<< - * - * self._csettings.on_url = cb_on_url - */ - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - __Pyx_GOTREF(__pyx_v_self->_content_encoding); - __Pyx_DECREF(__pyx_v_self->_content_encoding); - __pyx_v_self->_content_encoding = ((PyObject*)Py_None); - - /* "aiohttp/_http_parser.pyx":364 - * self._content_encoding = None - * - * self._csettings.on_url = cb_on_url # <<<<<<<<<<<<<< - * self._csettings.on_status = cb_on_status - * self._csettings.on_header_field = cb_on_header_field - */ - __pyx_v_self->_csettings->on_url = __pyx_f_7aiohttp_12_http_parser_cb_on_url; - - /* "aiohttp/_http_parser.pyx":365 - * - * self._csettings.on_url = cb_on_url - * self._csettings.on_status = cb_on_status # <<<<<<<<<<<<<< - * self._csettings.on_header_field = cb_on_header_field - * self._csettings.on_header_value = cb_on_header_value - */ - __pyx_v_self->_csettings->on_status = __pyx_f_7aiohttp_12_http_parser_cb_on_status; - - /* "aiohttp/_http_parser.pyx":366 - * self._csettings.on_url = cb_on_url - * self._csettings.on_status = cb_on_status - * self._csettings.on_header_field = cb_on_header_field # <<<<<<<<<<<<<< - * self._csettings.on_header_value = cb_on_header_value - * self._csettings.on_headers_complete = cb_on_headers_complete - */ - __pyx_v_self->_csettings->on_header_field = __pyx_f_7aiohttp_12_http_parser_cb_on_header_field; - - /* "aiohttp/_http_parser.pyx":367 - * self._csettings.on_status = cb_on_status - * self._csettings.on_header_field = cb_on_header_field - * self._csettings.on_header_value = cb_on_header_value # <<<<<<<<<<<<<< - * self._csettings.on_headers_complete = cb_on_headers_complete - * self._csettings.on_body = cb_on_body - */ - __pyx_v_self->_csettings->on_header_value = __pyx_f_7aiohttp_12_http_parser_cb_on_header_value; - - /* "aiohttp/_http_parser.pyx":368 - * self._csettings.on_header_field = cb_on_header_field - * self._csettings.on_header_value = cb_on_header_value - * self._csettings.on_headers_complete = cb_on_headers_complete # <<<<<<<<<<<<<< - * self._csettings.on_body = cb_on_body - * self._csettings.on_message_begin = cb_on_message_begin - */ - __pyx_v_self->_csettings->on_headers_complete = __pyx_f_7aiohttp_12_http_parser_cb_on_headers_complete; - - /* "aiohttp/_http_parser.pyx":369 - * self._csettings.on_header_value = cb_on_header_value - * self._csettings.on_headers_complete = cb_on_headers_complete - * self._csettings.on_body = cb_on_body # <<<<<<<<<<<<<< - * self._csettings.on_message_begin = cb_on_message_begin - * self._csettings.on_message_complete = cb_on_message_complete - */ - __pyx_v_self->_csettings->on_body = __pyx_f_7aiohttp_12_http_parser_cb_on_body; - - /* "aiohttp/_http_parser.pyx":370 - * self._csettings.on_headers_complete = cb_on_headers_complete - * self._csettings.on_body = cb_on_body - * self._csettings.on_message_begin = cb_on_message_begin # <<<<<<<<<<<<<< - * self._csettings.on_message_complete = cb_on_message_complete - * self._csettings.on_chunk_header = cb_on_chunk_header - */ - __pyx_v_self->_csettings->on_message_begin = __pyx_f_7aiohttp_12_http_parser_cb_on_message_begin; - - /* "aiohttp/_http_parser.pyx":371 - * self._csettings.on_body = cb_on_body - * self._csettings.on_message_begin = cb_on_message_begin - * self._csettings.on_message_complete = cb_on_message_complete # <<<<<<<<<<<<<< - * self._csettings.on_chunk_header = cb_on_chunk_header - * self._csettings.on_chunk_complete = cb_on_chunk_complete - */ - __pyx_v_self->_csettings->on_message_complete = __pyx_f_7aiohttp_12_http_parser_cb_on_message_complete; - - /* "aiohttp/_http_parser.pyx":372 - * self._csettings.on_message_begin = cb_on_message_begin - * self._csettings.on_message_complete = cb_on_message_complete - * self._csettings.on_chunk_header = cb_on_chunk_header # <<<<<<<<<<<<<< - * self._csettings.on_chunk_complete = cb_on_chunk_complete - * - */ - __pyx_v_self->_csettings->on_chunk_header = __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_header; - - /* "aiohttp/_http_parser.pyx":373 - * self._csettings.on_message_complete = cb_on_message_complete - * self._csettings.on_chunk_header = cb_on_chunk_header - * self._csettings.on_chunk_complete = cb_on_chunk_complete # <<<<<<<<<<<<<< - * - * self._last_error = None - */ - __pyx_v_self->_csettings->on_chunk_complete = __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_complete; - - /* "aiohttp/_http_parser.pyx":375 - * self._csettings.on_chunk_complete = cb_on_chunk_complete - * - * self._last_error = None # <<<<<<<<<<<<<< - * self._limit = limit - * - */ - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - __Pyx_GOTREF(__pyx_v_self->_last_error); - __Pyx_DECREF(__pyx_v_self->_last_error); - __pyx_v_self->_last_error = Py_None; - - /* "aiohttp/_http_parser.pyx":376 - * - * self._last_error = None - * self._limit = limit # <<<<<<<<<<<<<< - * - * cdef _process_header(self): - */ - __pyx_v_self->_limit = __pyx_v_limit; - - /* "aiohttp/_http_parser.pyx":327 - * PyMem_Free(self._csettings) - * - * cdef _init( # <<<<<<<<<<<<<< - * self, cparser.llhttp_type mode, - * object protocol, object loop, int limit, - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._init", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":378 - * self._limit = limit - * - * cdef _process_header(self): # <<<<<<<<<<<<<< - * if self._raw_name: - * raw_name = bytes(self._raw_name) - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__process_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { - PyObject *__pyx_v_raw_name = NULL; - PyObject *__pyx_v_raw_value = NULL; - PyObject *__pyx_v_name = NULL; - PyObject *__pyx_v_value = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - int __pyx_t_7; - int __pyx_t_8; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_process_header", 0); - - /* "aiohttp/_http_parser.pyx":379 - * - * cdef _process_header(self): - * if self._raw_name: # <<<<<<<<<<<<<< - * raw_name = bytes(self._raw_name) - * raw_value = bytes(self._raw_value) - */ - __pyx_t_1 = (__pyx_v_self->_raw_name != Py_None)&&(PyByteArray_GET_SIZE(__pyx_v_self->_raw_name) != 0); - if (__pyx_t_1) { - - /* "aiohttp/_http_parser.pyx":380 - * cdef _process_header(self): - * if self._raw_name: - * raw_name = bytes(self._raw_name) # <<<<<<<<<<<<<< - * raw_value = bytes(self._raw_value) - * - */ - __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyBytes_Type)), __pyx_v_self->_raw_name); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 380, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_v_raw_name = ((PyObject*)__pyx_t_2); - __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":381 - * if self._raw_name: - * raw_name = bytes(self._raw_name) - * raw_value = bytes(self._raw_value) # <<<<<<<<<<<<<< - * - * name = find_header(raw_name) - */ - __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyBytes_Type)), __pyx_v_self->_raw_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 381, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_v_raw_value = ((PyObject*)__pyx_t_2); - __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":383 - * raw_value = bytes(self._raw_value) - * - * name = find_header(raw_name) # <<<<<<<<<<<<<< - * value = raw_value.decode('utf-8', 'surrogateescape') - * - */ - __pyx_t_2 = __pyx_f_7aiohttp_12_http_parser_find_header(__pyx_v_raw_name); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 383, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_v_name = __pyx_t_2; - __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":384 - * - * name = find_header(raw_name) - * value = raw_value.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< - * - * self._headers.add(name, value) - */ - __pyx_t_2 = __Pyx_decode_bytes(__pyx_v_raw_value, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 384, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_v_value = __pyx_t_2; - __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":386 - * value = raw_value.decode('utf-8', 'surrogateescape') - * - * self._headers.add(name, value) # <<<<<<<<<<<<<< - * - * if name is CONTENT_ENCODING: - */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_headers, __pyx_n_s_add); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 386, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = NULL; - __pyx_t_5 = 0; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); - if (likely(__pyx_t_4)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_3, function); - __pyx_t_5 = 1; - } - } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_v_name, __pyx_v_value}; - __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 386, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GOTREF(__pyx_t_2); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { - PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_v_name, __pyx_v_value}; - __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 386, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GOTREF(__pyx_t_2); - } else - #endif - { - __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 386, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - if (__pyx_t_4) { - __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; - } - __Pyx_INCREF(__pyx_v_name); - __Pyx_GIVEREF(__pyx_v_name); - PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_name); - __Pyx_INCREF(__pyx_v_value); - __Pyx_GIVEREF(__pyx_v_value); - PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_value); - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 386, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":388 - * self._headers.add(name, value) - * - * if name is CONTENT_ENCODING: # <<<<<<<<<<<<<< - * self._content_encoding = value - * - */ - __pyx_t_1 = (__pyx_v_name == __pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING); - __pyx_t_7 = (__pyx_t_1 != 0); - if (__pyx_t_7) { - - /* "aiohttp/_http_parser.pyx":389 - * - * if name is CONTENT_ENCODING: - * self._content_encoding = value # <<<<<<<<<<<<<< - * - * PyByteArray_Resize(self._raw_name, 0) - */ - if (!(likely(PyUnicode_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(0, 389, __pyx_L1_error) - __pyx_t_2 = __pyx_v_value; - __Pyx_INCREF(__pyx_t_2); - __Pyx_GIVEREF(__pyx_t_2); - __Pyx_GOTREF(__pyx_v_self->_content_encoding); - __Pyx_DECREF(__pyx_v_self->_content_encoding); - __pyx_v_self->_content_encoding = ((PyObject*)__pyx_t_2); - __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":388 - * self._headers.add(name, value) - * - * if name is CONTENT_ENCODING: # <<<<<<<<<<<<<< - * self._content_encoding = value - * - */ - } - - /* "aiohttp/_http_parser.pyx":391 - * self._content_encoding = value - * - * PyByteArray_Resize(self._raw_name, 0) # <<<<<<<<<<<<<< - * PyByteArray_Resize(self._raw_value, 0) - * self._has_value = False - */ - __pyx_t_2 = __pyx_v_self->_raw_name; - __Pyx_INCREF(__pyx_t_2); - __pyx_t_5 = PyByteArray_Resize(__pyx_t_2, 0); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 391, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":392 - * - * PyByteArray_Resize(self._raw_name, 0) - * PyByteArray_Resize(self._raw_value, 0) # <<<<<<<<<<<<<< - * self._has_value = False - * self._raw_headers.append((raw_name, raw_value)) - */ - __pyx_t_2 = __pyx_v_self->_raw_value; - __Pyx_INCREF(__pyx_t_2); - __pyx_t_5 = PyByteArray_Resize(__pyx_t_2, 0); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 392, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":393 - * PyByteArray_Resize(self._raw_name, 0) - * PyByteArray_Resize(self._raw_value, 0) - * self._has_value = False # <<<<<<<<<<<<<< - * self._raw_headers.append((raw_name, raw_value)) - * - */ - __pyx_v_self->_has_value = 0; - - /* "aiohttp/_http_parser.pyx":394 - * PyByteArray_Resize(self._raw_value, 0) - * self._has_value = False - * self._raw_headers.append((raw_name, raw_value)) # <<<<<<<<<<<<<< - * - * cdef _on_header_field(self, char* at, size_t length): - */ - if (unlikely(__pyx_v_self->_raw_headers == Py_None)) { - PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append"); - __PYX_ERR(0, 394, __pyx_L1_error) - } - __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 394, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_v_raw_name); - __Pyx_GIVEREF(__pyx_v_raw_name); - PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_raw_name); - __Pyx_INCREF(__pyx_v_raw_value); - __Pyx_GIVEREF(__pyx_v_raw_value); - PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_raw_value); - __pyx_t_8 = __Pyx_PyList_Append(__pyx_v_self->_raw_headers, __pyx_t_2); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 394, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":379 - * - * cdef _process_header(self): - * if self._raw_name: # <<<<<<<<<<<<<< - * raw_name = bytes(self._raw_name) - * raw_value = bytes(self._raw_value) - */ - } - - /* "aiohttp/_http_parser.pyx":378 - * self._limit = limit - * - * cdef _process_header(self): # <<<<<<<<<<<<<< - * if self._raw_name: - * raw_name = bytes(self._raw_name) - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._process_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_raw_name); - __Pyx_XDECREF(__pyx_v_raw_value); - __Pyx_XDECREF(__pyx_v_name); - __Pyx_XDECREF(__pyx_v_value); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":396 - * self._raw_headers.append((raw_name, raw_value)) - * - * cdef _on_header_field(self, char* at, size_t length): # <<<<<<<<<<<<<< - * cdef Py_ssize_t size - * cdef char *buf - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_field(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length) { - Py_ssize_t __pyx_v_size; - char *__pyx_v_buf; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - Py_ssize_t __pyx_t_3; - int __pyx_t_4; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_on_header_field", 0); - - /* "aiohttp/_http_parser.pyx":399 - * cdef Py_ssize_t size - * cdef char *buf - * if self._has_value: # <<<<<<<<<<<<<< - * self._process_header() - * - */ - __pyx_t_1 = (__pyx_v_self->_has_value != 0); - if (__pyx_t_1) { - - /* "aiohttp/_http_parser.pyx":400 - * cdef char *buf - * if self._has_value: - * self._process_header() # <<<<<<<<<<<<<< - * - * size = PyByteArray_Size(self._raw_name) - */ - __pyx_t_2 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self->__pyx_vtab)->_process_header(__pyx_v_self); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 400, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":399 - * cdef Py_ssize_t size - * cdef char *buf - * if self._has_value: # <<<<<<<<<<<<<< - * self._process_header() - * - */ - } - - /* "aiohttp/_http_parser.pyx":402 - * self._process_header() - * - * size = PyByteArray_Size(self._raw_name) # <<<<<<<<<<<<<< - * PyByteArray_Resize(self._raw_name, size + length) - * buf = PyByteArray_AsString(self._raw_name) - */ - __pyx_t_2 = __pyx_v_self->_raw_name; - __Pyx_INCREF(__pyx_t_2); - __pyx_t_3 = PyByteArray_Size(__pyx_t_2); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1L))) __PYX_ERR(0, 402, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_v_size = __pyx_t_3; - - /* "aiohttp/_http_parser.pyx":403 - * - * size = PyByteArray_Size(self._raw_name) - * PyByteArray_Resize(self._raw_name, size + length) # <<<<<<<<<<<<<< - * buf = PyByteArray_AsString(self._raw_name) - * memcpy(buf + size, at, length) - */ - __pyx_t_2 = __pyx_v_self->_raw_name; - __Pyx_INCREF(__pyx_t_2); - __pyx_t_4 = PyByteArray_Resize(__pyx_t_2, (__pyx_v_size + __pyx_v_length)); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(0, 403, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":404 - * size = PyByteArray_Size(self._raw_name) - * PyByteArray_Resize(self._raw_name, size + length) - * buf = PyByteArray_AsString(self._raw_name) # <<<<<<<<<<<<<< - * memcpy(buf + size, at, length) - * - */ - __pyx_t_2 = __pyx_v_self->_raw_name; - __Pyx_INCREF(__pyx_t_2); - __pyx_v_buf = PyByteArray_AsString(__pyx_t_2); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":405 - * PyByteArray_Resize(self._raw_name, size + length) - * buf = PyByteArray_AsString(self._raw_name) - * memcpy(buf + size, at, length) # <<<<<<<<<<<<<< - * - * cdef _on_header_value(self, char* at, size_t length): - */ - (void)(memcpy((__pyx_v_buf + __pyx_v_size), __pyx_v_at, __pyx_v_length)); - - /* "aiohttp/_http_parser.pyx":396 - * self._raw_headers.append((raw_name, raw_value)) - * - * cdef _on_header_field(self, char* at, size_t length): # <<<<<<<<<<<<<< - * cdef Py_ssize_t size - * cdef char *buf - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_header_field", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":407 - * memcpy(buf + size, at, length) - * - * cdef _on_header_value(self, char* at, size_t length): # <<<<<<<<<<<<<< - * cdef Py_ssize_t size - * cdef char *buf - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_value(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length) { - Py_ssize_t __pyx_v_size; - char *__pyx_v_buf; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - Py_ssize_t __pyx_t_2; - int __pyx_t_3; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_on_header_value", 0); - - /* "aiohttp/_http_parser.pyx":411 - * cdef char *buf - * - * size = PyByteArray_Size(self._raw_value) # <<<<<<<<<<<<<< - * PyByteArray_Resize(self._raw_value, size + length) - * buf = PyByteArray_AsString(self._raw_value) - */ - __pyx_t_1 = __pyx_v_self->_raw_value; - __Pyx_INCREF(__pyx_t_1); - __pyx_t_2 = PyByteArray_Size(__pyx_t_1); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1L))) __PYX_ERR(0, 411, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_size = __pyx_t_2; - - /* "aiohttp/_http_parser.pyx":412 - * - * size = PyByteArray_Size(self._raw_value) - * PyByteArray_Resize(self._raw_value, size + length) # <<<<<<<<<<<<<< - * buf = PyByteArray_AsString(self._raw_value) - * memcpy(buf + size, at, length) - */ - __pyx_t_1 = __pyx_v_self->_raw_value; - __Pyx_INCREF(__pyx_t_1); - __pyx_t_3 = PyByteArray_Resize(__pyx_t_1, (__pyx_v_size + __pyx_v_length)); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 412, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":413 - * size = PyByteArray_Size(self._raw_value) - * PyByteArray_Resize(self._raw_value, size + length) - * buf = PyByteArray_AsString(self._raw_value) # <<<<<<<<<<<<<< - * memcpy(buf + size, at, length) - * self._has_value = True - */ - __pyx_t_1 = __pyx_v_self->_raw_value; - __Pyx_INCREF(__pyx_t_1); - __pyx_v_buf = PyByteArray_AsString(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":414 - * PyByteArray_Resize(self._raw_value, size + length) - * buf = PyByteArray_AsString(self._raw_value) - * memcpy(buf + size, at, length) # <<<<<<<<<<<<<< - * self._has_value = True - * - */ - (void)(memcpy((__pyx_v_buf + __pyx_v_size), __pyx_v_at, __pyx_v_length)); - - /* "aiohttp/_http_parser.pyx":415 - * buf = PyByteArray_AsString(self._raw_value) - * memcpy(buf + size, at, length) - * self._has_value = True # <<<<<<<<<<<<<< - * - * cdef _on_headers_complete(self): - */ - __pyx_v_self->_has_value = 1; - - /* "aiohttp/_http_parser.pyx":407 - * memcpy(buf + size, at, length) - * - * cdef _on_header_value(self, char* at, size_t length): # <<<<<<<<<<<<<< - * cdef Py_ssize_t size - * cdef char *buf - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_header_value", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":417 - * self._has_value = True - * - * cdef _on_headers_complete(self): # <<<<<<<<<<<<<< - * self._process_header() - * - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_headers_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { - PyObject *__pyx_v_method = NULL; - int __pyx_v_should_close; - uint8_t __pyx_v_upgrade; - int __pyx_v_chunked; - PyObject *__pyx_v_raw_headers = NULL; - PyObject *__pyx_v_headers = NULL; - PyObject *__pyx_v_encoding = NULL; - PyObject *__pyx_v_enc = NULL; - PyObject *__pyx_v_msg = NULL; - PyObject *__pyx_v_payload = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - uint8_t __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; - int __pyx_t_6; - PyObject *__pyx_t_7 = NULL; - int __pyx_t_8; - int __pyx_t_9; - int __pyx_t_10; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_on_headers_complete", 0); - - /* "aiohttp/_http_parser.pyx":418 - * - * cdef _on_headers_complete(self): - * self._process_header() # <<<<<<<<<<<<<< - * - * method = http_method_str(self._cparser.method) - */ - __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self->__pyx_vtab)->_process_header(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 418, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":420 - * self._process_header() - * - * method = http_method_str(self._cparser.method) # <<<<<<<<<<<<<< - * should_close = not cparser.llhttp_should_keep_alive(self._cparser) - * upgrade = self._cparser.upgrade - */ - __pyx_t_1 = __pyx_f_7aiohttp_12_http_parser_http_method_str(__pyx_v_self->_cparser->method); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 420, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_method = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":421 - * - * method = http_method_str(self._cparser.method) - * should_close = not cparser.llhttp_should_keep_alive(self._cparser) # <<<<<<<<<<<<<< - * upgrade = self._cparser.upgrade - * chunked = self._cparser.flags & cparser.F_CHUNKED - */ - __pyx_v_should_close = (!(llhttp_should_keep_alive(__pyx_v_self->_cparser) != 0)); - - /* "aiohttp/_http_parser.pyx":422 - * method = http_method_str(self._cparser.method) - * should_close = not cparser.llhttp_should_keep_alive(self._cparser) - * upgrade = self._cparser.upgrade # <<<<<<<<<<<<<< - * chunked = self._cparser.flags & cparser.F_CHUNKED - * - */ - __pyx_t_2 = __pyx_v_self->_cparser->upgrade; - __pyx_v_upgrade = __pyx_t_2; - - /* "aiohttp/_http_parser.pyx":423 - * should_close = not cparser.llhttp_should_keep_alive(self._cparser) - * upgrade = self._cparser.upgrade - * chunked = self._cparser.flags & cparser.F_CHUNKED # <<<<<<<<<<<<<< - * - * raw_headers = tuple(self._raw_headers) - */ - __pyx_v_chunked = (__pyx_v_self->_cparser->flags & F_CHUNKED); - - /* "aiohttp/_http_parser.pyx":425 - * chunked = self._cparser.flags & cparser.F_CHUNKED - * - * raw_headers = tuple(self._raw_headers) # <<<<<<<<<<<<<< - * headers = CIMultiDictProxy(self._headers) - * - */ - if (unlikely(__pyx_v_self->_raw_headers == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); - __PYX_ERR(0, 425, __pyx_L1_error) - } - __pyx_t_1 = PyList_AsTuple(__pyx_v_self->_raw_headers); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 425, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_raw_headers = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":426 - * - * raw_headers = tuple(self._raw_headers) - * headers = CIMultiDictProxy(self._headers) # <<<<<<<<<<<<<< - * - * if upgrade or self._cparser.method == 5: # cparser.CONNECT: - */ - __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy); - __pyx_t_3 = __pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy; __pyx_t_4 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); - if (likely(__pyx_t_4)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_3, function); - } - } - __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_v_self->_headers) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_self->_headers); - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 426, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_v_headers = __pyx_t_1; - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":428 - * headers = CIMultiDictProxy(self._headers) - * - * if upgrade or self._cparser.method == 5: # cparser.CONNECT: # <<<<<<<<<<<<<< - * self._upgraded = True - * - */ - __pyx_t_6 = (__pyx_v_upgrade != 0); - if (!__pyx_t_6) { - } else { - __pyx_t_5 = __pyx_t_6; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_6 = ((__pyx_v_self->_cparser->method == 5) != 0); - __pyx_t_5 = __pyx_t_6; - __pyx_L4_bool_binop_done:; - if (__pyx_t_5) { - - /* "aiohttp/_http_parser.pyx":429 - * - * if upgrade or self._cparser.method == 5: # cparser.CONNECT: - * self._upgraded = True # <<<<<<<<<<<<<< - * - * # do not support old websocket spec - */ - __pyx_v_self->_upgraded = 1; - - /* "aiohttp/_http_parser.pyx":428 - * headers = CIMultiDictProxy(self._headers) - * - * if upgrade or self._cparser.method == 5: # cparser.CONNECT: # <<<<<<<<<<<<<< - * self._upgraded = True - * - */ - } - - /* "aiohttp/_http_parser.pyx":432 - * - * # do not support old websocket spec - * if SEC_WEBSOCKET_KEY1 in headers: # <<<<<<<<<<<<<< - * raise InvalidHeader(SEC_WEBSOCKET_KEY1) - * - */ - __pyx_t_5 = (__Pyx_PySequence_ContainsTF(__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1, __pyx_v_headers, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 432, __pyx_L1_error) - __pyx_t_6 = (__pyx_t_5 != 0); - if (unlikely(__pyx_t_6)) { - - /* "aiohttp/_http_parser.pyx":433 - * # do not support old websocket spec - * if SEC_WEBSOCKET_KEY1 in headers: - * raise InvalidHeader(SEC_WEBSOCKET_KEY1) # <<<<<<<<<<<<<< - * - * encoding = None - */ - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_InvalidHeader); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 433, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); - if (likely(__pyx_t_4)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_3, function); - } - } - __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1); - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 433, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(0, 433, __pyx_L1_error) - - /* "aiohttp/_http_parser.pyx":432 - * - * # do not support old websocket spec - * if SEC_WEBSOCKET_KEY1 in headers: # <<<<<<<<<<<<<< - * raise InvalidHeader(SEC_WEBSOCKET_KEY1) - * - */ - } - - /* "aiohttp/_http_parser.pyx":435 - * raise InvalidHeader(SEC_WEBSOCKET_KEY1) - * - * encoding = None # <<<<<<<<<<<<<< - * enc = self._content_encoding - * if enc is not None: - */ - __Pyx_INCREF(Py_None); - __pyx_v_encoding = Py_None; - - /* "aiohttp/_http_parser.pyx":436 - * - * encoding = None - * enc = self._content_encoding # <<<<<<<<<<<<<< - * if enc is not None: - * self._content_encoding = None - */ - __pyx_t_1 = __pyx_v_self->_content_encoding; - __Pyx_INCREF(__pyx_t_1); - __pyx_v_enc = __pyx_t_1; - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":437 - * encoding = None - * enc = self._content_encoding - * if enc is not None: # <<<<<<<<<<<<<< - * self._content_encoding = None - * enc = enc.lower() - */ - __pyx_t_6 = (__pyx_v_enc != Py_None); - __pyx_t_5 = (__pyx_t_6 != 0); - if (__pyx_t_5) { - - /* "aiohttp/_http_parser.pyx":438 - * enc = self._content_encoding - * if enc is not None: - * self._content_encoding = None # <<<<<<<<<<<<<< - * enc = enc.lower() - * if enc in ('gzip', 'deflate', 'br'): - */ - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - __Pyx_GOTREF(__pyx_v_self->_content_encoding); - __Pyx_DECREF(__pyx_v_self->_content_encoding); - __pyx_v_self->_content_encoding = ((PyObject*)Py_None); - - /* "aiohttp/_http_parser.pyx":439 - * if enc is not None: - * self._content_encoding = None - * enc = enc.lower() # <<<<<<<<<<<<<< - * if enc in ('gzip', 'deflate', 'br'): - * encoding = enc - */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_enc, __pyx_n_s_lower); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 439, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); - if (likely(__pyx_t_4)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_3, function); - } - } - __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4) : __Pyx_PyObject_CallNoArg(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 439, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF_SET(__pyx_v_enc, __pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":440 - * self._content_encoding = None - * enc = enc.lower() - * if enc in ('gzip', 'deflate', 'br'): # <<<<<<<<<<<<<< - * encoding = enc - * - */ - __Pyx_INCREF(__pyx_v_enc); - __pyx_t_1 = __pyx_v_enc; - __pyx_t_6 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_n_u_gzip, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 440, __pyx_L1_error) - if (!__pyx_t_6) { - } else { - __pyx_t_5 = __pyx_t_6; - goto __pyx_L9_bool_binop_done; - } - __pyx_t_6 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_n_u_deflate, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 440, __pyx_L1_error) - if (!__pyx_t_6) { - } else { - __pyx_t_5 = __pyx_t_6; - goto __pyx_L9_bool_binop_done; - } - __pyx_t_6 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_n_u_br, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 440, __pyx_L1_error) - __pyx_t_5 = __pyx_t_6; - __pyx_L9_bool_binop_done:; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_6 = (__pyx_t_5 != 0); - if (__pyx_t_6) { - - /* "aiohttp/_http_parser.pyx":441 - * enc = enc.lower() - * if enc in ('gzip', 'deflate', 'br'): - * encoding = enc # <<<<<<<<<<<<<< - * - * if self._cparser.type == cparser.HTTP_REQUEST: - */ - __Pyx_INCREF(__pyx_v_enc); - __Pyx_DECREF_SET(__pyx_v_encoding, __pyx_v_enc); - - /* "aiohttp/_http_parser.pyx":440 - * self._content_encoding = None - * enc = enc.lower() - * if enc in ('gzip', 'deflate', 'br'): # <<<<<<<<<<<<<< - * encoding = enc - * - */ - } - - /* "aiohttp/_http_parser.pyx":437 - * encoding = None - * enc = self._content_encoding - * if enc is not None: # <<<<<<<<<<<<<< - * self._content_encoding = None - * enc = enc.lower() - */ - } - - /* "aiohttp/_http_parser.pyx":443 - * encoding = enc - * - * if self._cparser.type == cparser.HTTP_REQUEST: # <<<<<<<<<<<<<< - * msg = _new_request_message( - * method, self._path, - */ - __pyx_t_6 = ((__pyx_v_self->_cparser->type == HTTP_REQUEST) != 0); - if (__pyx_t_6) { - - /* "aiohttp/_http_parser.pyx":445 - * if self._cparser.type == cparser.HTTP_REQUEST: - * msg = _new_request_message( - * method, self._path, # <<<<<<<<<<<<<< - * self.http_version(), headers, raw_headers, - * should_close, encoding, upgrade, chunked, self._url) - */ - __pyx_t_1 = __pyx_v_self->_path; - __Pyx_INCREF(__pyx_t_1); - - /* "aiohttp/_http_parser.pyx":446 - * msg = _new_request_message( - * method, self._path, - * self.http_version(), headers, raw_headers, # <<<<<<<<<<<<<< - * should_close, encoding, upgrade, chunked, self._url) - * else: - */ - __pyx_t_3 = __pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(__pyx_v_self); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 446, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - - /* "aiohttp/_http_parser.pyx":447 - * method, self._path, - * self.http_version(), headers, raw_headers, - * should_close, encoding, upgrade, chunked, self._url) # <<<<<<<<<<<<<< - * else: - * msg = _new_response_message( - */ - __pyx_t_4 = __pyx_v_self->_url; - __Pyx_INCREF(__pyx_t_4); - - /* "aiohttp/_http_parser.pyx":444 - * - * if self._cparser.type == cparser.HTTP_REQUEST: - * msg = _new_request_message( # <<<<<<<<<<<<<< - * method, self._path, - * self.http_version(), headers, raw_headers, - */ - __pyx_t_7 = __pyx_f_7aiohttp_12_http_parser__new_request_message(__pyx_v_method, ((PyObject*)__pyx_t_1), __pyx_t_3, __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_encoding, __pyx_v_upgrade, __pyx_v_chunked, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 444, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_v_msg = __pyx_t_7; - __pyx_t_7 = 0; - - /* "aiohttp/_http_parser.pyx":443 - * encoding = enc - * - * if self._cparser.type == cparser.HTTP_REQUEST: # <<<<<<<<<<<<<< - * msg = _new_request_message( - * method, self._path, - */ - goto __pyx_L12; - } - - /* "aiohttp/_http_parser.pyx":449 - * should_close, encoding, upgrade, chunked, self._url) - * else: - * msg = _new_response_message( # <<<<<<<<<<<<<< - * self.http_version(), self._cparser.status_code, self._reason, - * headers, raw_headers, should_close, encoding, - */ - /*else*/ { - - /* "aiohttp/_http_parser.pyx":450 - * else: - * msg = _new_response_message( - * self.http_version(), self._cparser.status_code, self._reason, # <<<<<<<<<<<<<< - * headers, raw_headers, should_close, encoding, - * upgrade, chunked) - */ - __pyx_t_7 = __pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(__pyx_v_self); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 450, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_4 = __pyx_v_self->_reason; - __Pyx_INCREF(__pyx_t_4); - - /* "aiohttp/_http_parser.pyx":449 - * should_close, encoding, upgrade, chunked, self._url) - * else: - * msg = _new_response_message( # <<<<<<<<<<<<<< - * self.http_version(), self._cparser.status_code, self._reason, - * headers, raw_headers, should_close, encoding, - */ - __pyx_t_3 = __pyx_f_7aiohttp_12_http_parser__new_response_message(__pyx_t_7, __pyx_v_self->_cparser->status_code, ((PyObject*)__pyx_t_4), __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_encoding, __pyx_v_upgrade, __pyx_v_chunked); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 449, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_v_msg = __pyx_t_3; - __pyx_t_3 = 0; - } - __pyx_L12:; - - /* "aiohttp/_http_parser.pyx":455 - * - * if ( - * ULLONG_MAX > self._cparser.content_length > 0 or chunked or # <<<<<<<<<<<<<< - * self._cparser.method == 5 or # CONNECT: 5 - * (self._cparser.status_code >= 199 and - */ - __pyx_t_5 = (ULLONG_MAX > __pyx_v_self->_cparser->content_length); - if (__pyx_t_5) { - __pyx_t_5 = (__pyx_v_self->_cparser->content_length > 0); - } - __pyx_t_8 = (__pyx_t_5 != 0); - if (!__pyx_t_8) { - } else { - __pyx_t_6 = __pyx_t_8; - goto __pyx_L14_bool_binop_done; - } - __pyx_t_8 = (__pyx_v_chunked != 0); - if (!__pyx_t_8) { - } else { - __pyx_t_6 = __pyx_t_8; - goto __pyx_L14_bool_binop_done; - } - - /* "aiohttp/_http_parser.pyx":456 - * if ( - * ULLONG_MAX > self._cparser.content_length > 0 or chunked or - * self._cparser.method == 5 or # CONNECT: 5 # <<<<<<<<<<<<<< - * (self._cparser.status_code >= 199 and - * self._cparser.content_length == 0 and - */ - __pyx_t_8 = ((__pyx_v_self->_cparser->method == 5) != 0); - if (!__pyx_t_8) { - } else { - __pyx_t_6 = __pyx_t_8; - goto __pyx_L14_bool_binop_done; - } - - /* "aiohttp/_http_parser.pyx":457 - * ULLONG_MAX > self._cparser.content_length > 0 or chunked or - * self._cparser.method == 5 or # CONNECT: 5 - * (self._cparser.status_code >= 199 and # <<<<<<<<<<<<<< - * self._cparser.content_length == 0 and - * self._read_until_eof) - */ - __pyx_t_8 = ((__pyx_v_self->_cparser->status_code >= 0xC7) != 0); - if (__pyx_t_8) { - } else { - __pyx_t_6 = __pyx_t_8; - goto __pyx_L14_bool_binop_done; - } - - /* "aiohttp/_http_parser.pyx":458 - * self._cparser.method == 5 or # CONNECT: 5 - * (self._cparser.status_code >= 199 and - * self._cparser.content_length == 0 and # <<<<<<<<<<<<<< - * self._read_until_eof) - * ): - */ - __pyx_t_8 = ((__pyx_v_self->_cparser->content_length == 0) != 0); - if (__pyx_t_8) { - } else { - __pyx_t_6 = __pyx_t_8; - goto __pyx_L14_bool_binop_done; - } - - /* "aiohttp/_http_parser.pyx":459 - * (self._cparser.status_code >= 199 and - * self._cparser.content_length == 0 and - * self._read_until_eof) # <<<<<<<<<<<<<< - * ): - * payload = StreamReader( - */ - __pyx_t_8 = (__pyx_v_self->_read_until_eof != 0); - __pyx_t_6 = __pyx_t_8; - __pyx_L14_bool_binop_done:; - - /* "aiohttp/_http_parser.pyx":454 - * upgrade, chunked) - * - * if ( # <<<<<<<<<<<<<< - * ULLONG_MAX > self._cparser.content_length > 0 or chunked or - * self._cparser.method == 5 or # CONNECT: 5 - */ - if (__pyx_t_6) { - - /* "aiohttp/_http_parser.pyx":461 - * self._read_until_eof) - * ): - * payload = StreamReader( # <<<<<<<<<<<<<< - * self._protocol, timer=self._timer, loop=self._loop, - * limit=self._limit) - */ - __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 461, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_INCREF(__pyx_v_self->_protocol); - __Pyx_GIVEREF(__pyx_v_self->_protocol); - PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->_protocol); - - /* "aiohttp/_http_parser.pyx":462 - * ): - * payload = StreamReader( - * self._protocol, timer=self._timer, loop=self._loop, # <<<<<<<<<<<<<< - * limit=self._limit) - * else: - */ - __pyx_t_4 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 462, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_timer, __pyx_v_self->_timer) < 0) __PYX_ERR(0, 462, __pyx_L1_error) - if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_loop, __pyx_v_self->_loop) < 0) __PYX_ERR(0, 462, __pyx_L1_error) - - /* "aiohttp/_http_parser.pyx":463 - * payload = StreamReader( - * self._protocol, timer=self._timer, loop=self._loop, - * limit=self._limit) # <<<<<<<<<<<<<< - * else: - * payload = EMPTY_PAYLOAD - */ - __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_self->_limit); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 463, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_limit, __pyx_t_7) < 0) __PYX_ERR(0, 462, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - - /* "aiohttp/_http_parser.pyx":461 - * self._read_until_eof) - * ): - * payload = StreamReader( # <<<<<<<<<<<<<< - * self._protocol, timer=self._timer, loop=self._loop, - * limit=self._limit) - */ - __pyx_t_7 = __Pyx_PyObject_Call(__pyx_v_7aiohttp_12_http_parser_StreamReader, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 461, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_v_payload = __pyx_t_7; - __pyx_t_7 = 0; - - /* "aiohttp/_http_parser.pyx":454 - * upgrade, chunked) - * - * if ( # <<<<<<<<<<<<<< - * ULLONG_MAX > self._cparser.content_length > 0 or chunked or - * self._cparser.method == 5 or # CONNECT: 5 - */ - goto __pyx_L13; - } - - /* "aiohttp/_http_parser.pyx":465 - * limit=self._limit) - * else: - * payload = EMPTY_PAYLOAD # <<<<<<<<<<<<<< - * - * self._payload = payload - */ - /*else*/ { - __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); - __pyx_v_payload = __pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD; - } - __pyx_L13:; - - /* "aiohttp/_http_parser.pyx":467 - * payload = EMPTY_PAYLOAD - * - * self._payload = payload # <<<<<<<<<<<<<< - * if encoding is not None and self._auto_decompress: - * self._payload = DeflateBuffer(payload, encoding) - */ - __Pyx_INCREF(__pyx_v_payload); - __Pyx_GIVEREF(__pyx_v_payload); - __Pyx_GOTREF(__pyx_v_self->_payload); - __Pyx_DECREF(__pyx_v_self->_payload); - __pyx_v_self->_payload = __pyx_v_payload; - - /* "aiohttp/_http_parser.pyx":468 - * - * self._payload = payload - * if encoding is not None and self._auto_decompress: # <<<<<<<<<<<<<< - * self._payload = DeflateBuffer(payload, encoding) - * - */ - __pyx_t_8 = (__pyx_v_encoding != Py_None); - __pyx_t_5 = (__pyx_t_8 != 0); - if (__pyx_t_5) { - } else { - __pyx_t_6 = __pyx_t_5; - goto __pyx_L21_bool_binop_done; - } - __pyx_t_5 = (__pyx_v_self->_auto_decompress != 0); - __pyx_t_6 = __pyx_t_5; - __pyx_L21_bool_binop_done:; - if (__pyx_t_6) { - - /* "aiohttp/_http_parser.pyx":469 - * self._payload = payload - * if encoding is not None and self._auto_decompress: - * self._payload = DeflateBuffer(payload, encoding) # <<<<<<<<<<<<<< - * - * if not self._response_with_body: - */ - __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_DeflateBuffer); - __pyx_t_4 = __pyx_v_7aiohttp_12_http_parser_DeflateBuffer; __pyx_t_3 = NULL; - __pyx_t_9 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { - __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); - if (likely(__pyx_t_3)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_4, function); - __pyx_t_9 = 1; - } - } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_4)) { - PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_payload, __pyx_v_encoding}; - __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_9, 2+__pyx_t_9); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 469, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GOTREF(__pyx_t_7); - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { - PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_payload, __pyx_v_encoding}; - __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_9, 2+__pyx_t_9); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 469, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_GOTREF(__pyx_t_7); - } else - #endif - { - __pyx_t_1 = PyTuple_New(2+__pyx_t_9); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 469, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (__pyx_t_3) { - __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3); __pyx_t_3 = NULL; - } - __Pyx_INCREF(__pyx_v_payload); - __Pyx_GIVEREF(__pyx_v_payload); - PyTuple_SET_ITEM(__pyx_t_1, 0+__pyx_t_9, __pyx_v_payload); - __Pyx_INCREF(__pyx_v_encoding); - __Pyx_GIVEREF(__pyx_v_encoding); - PyTuple_SET_ITEM(__pyx_t_1, 1+__pyx_t_9, __pyx_v_encoding); - __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_1, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 469, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - } - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_GIVEREF(__pyx_t_7); - __Pyx_GOTREF(__pyx_v_self->_payload); - __Pyx_DECREF(__pyx_v_self->_payload); - __pyx_v_self->_payload = __pyx_t_7; - __pyx_t_7 = 0; - - /* "aiohttp/_http_parser.pyx":468 - * - * self._payload = payload - * if encoding is not None and self._auto_decompress: # <<<<<<<<<<<<<< - * self._payload = DeflateBuffer(payload, encoding) - * - */ - } - - /* "aiohttp/_http_parser.pyx":471 - * self._payload = DeflateBuffer(payload, encoding) - * - * if not self._response_with_body: # <<<<<<<<<<<<<< - * payload = EMPTY_PAYLOAD - * - */ - __pyx_t_6 = ((!(__pyx_v_self->_response_with_body != 0)) != 0); - if (__pyx_t_6) { - - /* "aiohttp/_http_parser.pyx":472 - * - * if not self._response_with_body: - * payload = EMPTY_PAYLOAD # <<<<<<<<<<<<<< - * - * self._messages.append((msg, payload)) - */ - __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); - __Pyx_DECREF_SET(__pyx_v_payload, __pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); - - /* "aiohttp/_http_parser.pyx":471 - * self._payload = DeflateBuffer(payload, encoding) - * - * if not self._response_with_body: # <<<<<<<<<<<<<< - * payload = EMPTY_PAYLOAD - * - */ - } - - /* "aiohttp/_http_parser.pyx":474 - * payload = EMPTY_PAYLOAD - * - * self._messages.append((msg, payload)) # <<<<<<<<<<<<<< - * - * cdef _on_message_complete(self): - */ - if (unlikely(__pyx_v_self->_messages == Py_None)) { - PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append"); - __PYX_ERR(0, 474, __pyx_L1_error) - } - __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 474, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_INCREF(__pyx_v_msg); - __Pyx_GIVEREF(__pyx_v_msg); - PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_msg); - __Pyx_INCREF(__pyx_v_payload); - __Pyx_GIVEREF(__pyx_v_payload); - PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_v_payload); - __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_self->_messages, __pyx_t_7); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(0, 474, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - - /* "aiohttp/_http_parser.pyx":417 - * self._has_value = True - * - * cdef _on_headers_complete(self): # <<<<<<<<<<<<<< - * self._process_header() - * - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_headers_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_method); - __Pyx_XDECREF(__pyx_v_raw_headers); - __Pyx_XDECREF(__pyx_v_headers); - __Pyx_XDECREF(__pyx_v_encoding); - __Pyx_XDECREF(__pyx_v_enc); - __Pyx_XDECREF(__pyx_v_msg); - __Pyx_XDECREF(__pyx_v_payload); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":476 - * self._messages.append((msg, payload)) - * - * cdef _on_message_complete(self): # <<<<<<<<<<<<<< - * self._payload.feed_eof() - * self._payload = None - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_message_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_on_message_complete", 0); - - /* "aiohttp/_http_parser.pyx":477 - * - * cdef _on_message_complete(self): - * self._payload.feed_eof() # <<<<<<<<<<<<<< - * self._payload = None - * - */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_feed_eof); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 477, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_3)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 477, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":478 - * cdef _on_message_complete(self): - * self._payload.feed_eof() - * self._payload = None # <<<<<<<<<<<<<< - * - * cdef _on_chunk_header(self): - */ - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - __Pyx_GOTREF(__pyx_v_self->_payload); - __Pyx_DECREF(__pyx_v_self->_payload); - __pyx_v_self->_payload = Py_None; - - /* "aiohttp/_http_parser.pyx":476 - * self._messages.append((msg, payload)) - * - * cdef _on_message_complete(self): # <<<<<<<<<<<<<< - * self._payload.feed_eof() - * self._payload = None - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_message_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":480 - * self._payload = None - * - * cdef _on_chunk_header(self): # <<<<<<<<<<<<<< - * self._payload.begin_http_chunk_receiving() - * - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_on_chunk_header", 0); - - /* "aiohttp/_http_parser.pyx":481 - * - * cdef _on_chunk_header(self): - * self._payload.begin_http_chunk_receiving() # <<<<<<<<<<<<<< - * - * cdef _on_chunk_complete(self): - */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_begin_http_chunk_receiving); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 481, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_3)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 481, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":480 - * self._payload = None - * - * cdef _on_chunk_header(self): # <<<<<<<<<<<<<< - * self._payload.begin_http_chunk_receiving() - * - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_chunk_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":483 - * self._payload.begin_http_chunk_receiving() - * - * cdef _on_chunk_complete(self): # <<<<<<<<<<<<<< - * self._payload.end_http_chunk_receiving() - * - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_on_chunk_complete", 0); - - /* "aiohttp/_http_parser.pyx":484 - * - * cdef _on_chunk_complete(self): - * self._payload.end_http_chunk_receiving() # <<<<<<<<<<<<<< - * - * cdef object _on_status_complete(self): - */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_end_http_chunk_receiving); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 484, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_3)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 484, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":483 - * self._payload.begin_http_chunk_receiving() - * - * cdef _on_chunk_complete(self): # <<<<<<<<<<<<<< - * self._payload.end_http_chunk_receiving() - * - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_chunk_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":486 - * self._payload.end_http_chunk_receiving() - * - * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< - * pass - * - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_status_complete(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("_on_status_complete", 0); - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":489 - * pass - * - * cdef inline http_version(self): # <<<<<<<<<<<<<< - * cdef cparser.llhttp_t* parser = self._cparser - * - */ - -static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { - llhttp_t *__pyx_v_parser; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - llhttp_t *__pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - int __pyx_t_8; - PyObject *__pyx_t_9 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("http_version", 0); - - /* "aiohttp/_http_parser.pyx":490 - * - * cdef inline http_version(self): - * cdef cparser.llhttp_t* parser = self._cparser # <<<<<<<<<<<<<< - * - * if parser.http_major == 1: - */ - __pyx_t_1 = __pyx_v_self->_cparser; - __pyx_v_parser = __pyx_t_1; - - /* "aiohttp/_http_parser.pyx":492 - * cdef cparser.llhttp_t* parser = self._cparser - * - * if parser.http_major == 1: # <<<<<<<<<<<<<< - * if parser.http_minor == 0: - * return HttpVersion10 - */ - __pyx_t_2 = ((__pyx_v_parser->http_major == 1) != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_parser.pyx":493 - * - * if parser.http_major == 1: - * if parser.http_minor == 0: # <<<<<<<<<<<<<< - * return HttpVersion10 - * elif parser.http_minor == 1: - */ - switch (__pyx_v_parser->http_minor) { - case 0: - - /* "aiohttp/_http_parser.pyx":494 - * if parser.http_major == 1: - * if parser.http_minor == 0: - * return HttpVersion10 # <<<<<<<<<<<<<< - * elif parser.http_minor == 1: - * return HttpVersion11 - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion10); - __pyx_r = __pyx_v_7aiohttp_12_http_parser_HttpVersion10; - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":493 - * - * if parser.http_major == 1: - * if parser.http_minor == 0: # <<<<<<<<<<<<<< - * return HttpVersion10 - * elif parser.http_minor == 1: - */ - break; - case 1: - - /* "aiohttp/_http_parser.pyx":496 - * return HttpVersion10 - * elif parser.http_minor == 1: - * return HttpVersion11 # <<<<<<<<<<<<<< - * - * return HttpVersion(parser.http_major, parser.http_minor) - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion11); - __pyx_r = __pyx_v_7aiohttp_12_http_parser_HttpVersion11; - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":495 - * if parser.http_minor == 0: - * return HttpVersion10 - * elif parser.http_minor == 1: # <<<<<<<<<<<<<< - * return HttpVersion11 - * - */ - break; - default: break; - } - - /* "aiohttp/_http_parser.pyx":492 - * cdef cparser.llhttp_t* parser = self._cparser - * - * if parser.http_major == 1: # <<<<<<<<<<<<<< - * if parser.http_minor == 0: - * return HttpVersion10 - */ - } - - /* "aiohttp/_http_parser.pyx":498 - * return HttpVersion11 - * - * return HttpVersion(parser.http_major, parser.http_minor) # <<<<<<<<<<<<<< - * - * ### Public API ### - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_4 = __Pyx_PyInt_From_uint8_t(__pyx_v_parser->http_major); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 498, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_PyInt_From_uint8_t(__pyx_v_parser->http_minor); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 498, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion); - __pyx_t_6 = __pyx_v_7aiohttp_12_http_parser_HttpVersion; __pyx_t_7 = NULL; - __pyx_t_8 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) { - __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); - if (likely(__pyx_t_7)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); - __Pyx_INCREF(__pyx_t_7); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_6, function); - __pyx_t_8 = 1; - } - } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_6)) { - PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_4, __pyx_t_5}; - __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 498, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { - PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_4, __pyx_t_5}; - __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 498, __pyx_L1_error) - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } else - #endif - { - __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 498, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - if (__pyx_t_7) { - __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL; - } - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_5); - PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_t_5); - __pyx_t_4 = 0; - __pyx_t_5 = 0; - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_9, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 498, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_r = __pyx_t_3; - __pyx_t_3 = 0; - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":489 - * pass - * - * cdef inline http_version(self): # <<<<<<<<<<<<<< - * cdef cparser.llhttp_t* parser = self._cparser - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.http_version", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":502 - * ### Public API ### - * - * def feed_eof(self): # <<<<<<<<<<<<<< - * cdef bytes desc - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_5feed_eof(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_5feed_eof(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("feed_eof (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_4feed_eof(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_4feed_eof(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { - PyObject *__pyx_v_desc = 0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("feed_eof", 0); - - /* "aiohttp/_http_parser.pyx":505 - * cdef bytes desc - * - * if self._payload is not None: # <<<<<<<<<<<<<< - * if self._cparser.flags & cparser.F_CHUNKED: - * raise TransferEncodingError( - */ - __pyx_t_1 = (__pyx_v_self->_payload != Py_None); - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_parser.pyx":506 - * - * if self._payload is not None: - * if self._cparser.flags & cparser.F_CHUNKED: # <<<<<<<<<<<<<< - * raise TransferEncodingError( - * "Not enough data for satisfy transfer length header.") - */ - __pyx_t_2 = ((__pyx_v_self->_cparser->flags & F_CHUNKED) != 0); - if (unlikely(__pyx_t_2)) { - - /* "aiohttp/_http_parser.pyx":507 - * if self._payload is not None: - * if self._cparser.flags & cparser.F_CHUNKED: - * raise TransferEncodingError( # <<<<<<<<<<<<<< - * "Not enough data for satisfy transfer length header.") - * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: - */ - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_TransferEncodingError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 507, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); - if (likely(__pyx_t_5)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); - __Pyx_INCREF(__pyx_t_5); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_4, function); - } - } - __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_kp_u_Not_enough_data_for_satisfy_tran) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_kp_u_Not_enough_data_for_satisfy_tran); - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 507, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(0, 507, __pyx_L1_error) - - /* "aiohttp/_http_parser.pyx":506 - * - * if self._payload is not None: - * if self._cparser.flags & cparser.F_CHUNKED: # <<<<<<<<<<<<<< - * raise TransferEncodingError( - * "Not enough data for satisfy transfer length header.") - */ - } - - /* "aiohttp/_http_parser.pyx":509 - * raise TransferEncodingError( - * "Not enough data for satisfy transfer length header.") - * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: # <<<<<<<<<<<<<< - * raise ContentLengthError( - * "Not enough data for satisfy content length header.") - */ - __pyx_t_2 = ((__pyx_v_self->_cparser->flags & F_CONTENT_LENGTH) != 0); - if (unlikely(__pyx_t_2)) { - - /* "aiohttp/_http_parser.pyx":510 - * "Not enough data for satisfy transfer length header.") - * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: - * raise ContentLengthError( # <<<<<<<<<<<<<< - * "Not enough data for satisfy content length header.") - * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: - */ - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_ContentLengthError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 510, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); - if (likely(__pyx_t_5)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); - __Pyx_INCREF(__pyx_t_5); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_4, function); - } - } - __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_kp_u_Not_enough_data_for_satisfy_cont) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_kp_u_Not_enough_data_for_satisfy_cont); - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 510, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(0, 510, __pyx_L1_error) - - /* "aiohttp/_http_parser.pyx":509 - * raise TransferEncodingError( - * "Not enough data for satisfy transfer length header.") - * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: # <<<<<<<<<<<<<< - * raise ContentLengthError( - * "Not enough data for satisfy content length header.") - */ - } - - /* "aiohttp/_http_parser.pyx":512 - * raise ContentLengthError( - * "Not enough data for satisfy content length header.") - * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: # <<<<<<<<<<<<<< - * desc = cparser.llhttp_get_error_reason(self._cparser) - * raise PayloadEncodingError(desc.decode('latin-1')) - */ - __pyx_t_2 = ((llhttp_get_errno(__pyx_v_self->_cparser) != HPE_OK) != 0); - if (unlikely(__pyx_t_2)) { - - /* "aiohttp/_http_parser.pyx":513 - * "Not enough data for satisfy content length header.") - * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: - * desc = cparser.llhttp_get_error_reason(self._cparser) # <<<<<<<<<<<<<< - * raise PayloadEncodingError(desc.decode('latin-1')) - * else: - */ - __pyx_t_3 = __Pyx_PyBytes_FromString(llhttp_get_error_reason(__pyx_v_self->_cparser)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 513, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_v_desc = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":514 - * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: - * desc = cparser.llhttp_get_error_reason(self._cparser) - * raise PayloadEncodingError(desc.decode('latin-1')) # <<<<<<<<<<<<<< - * else: - * self._payload.feed_eof() - */ - __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_PayloadEncodingError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 514, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_decode_bytes(__pyx_v_desc, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeLatin1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 514, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { - __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4); - if (likely(__pyx_t_6)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); - __Pyx_INCREF(__pyx_t_6); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_4, function); - } - } - __pyx_t_3 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_6, __pyx_t_5) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 514, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(0, 514, __pyx_L1_error) - - /* "aiohttp/_http_parser.pyx":512 - * raise ContentLengthError( - * "Not enough data for satisfy content length header.") - * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: # <<<<<<<<<<<<<< - * desc = cparser.llhttp_get_error_reason(self._cparser) - * raise PayloadEncodingError(desc.decode('latin-1')) - */ - } - - /* "aiohttp/_http_parser.pyx":516 - * raise PayloadEncodingError(desc.decode('latin-1')) - * else: - * self._payload.feed_eof() # <<<<<<<<<<<<<< - * elif self._started: - * self._on_headers_complete() - */ - /*else*/ { - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_feed_eof); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 516, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); - if (likely(__pyx_t_5)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); - __Pyx_INCREF(__pyx_t_5); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_4, function); - } - } - __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5) : __Pyx_PyObject_CallNoArg(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 516, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } - - /* "aiohttp/_http_parser.pyx":505 - * cdef bytes desc - * - * if self._payload is not None: # <<<<<<<<<<<<<< - * if self._cparser.flags & cparser.F_CHUNKED: - * raise TransferEncodingError( - */ - goto __pyx_L3; - } - - /* "aiohttp/_http_parser.pyx":517 - * else: - * self._payload.feed_eof() - * elif self._started: # <<<<<<<<<<<<<< - * self._on_headers_complete() - * if self._messages: - */ - __pyx_t_2 = (__pyx_v_self->_started != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_parser.pyx":518 - * self._payload.feed_eof() - * elif self._started: - * self._on_headers_complete() # <<<<<<<<<<<<<< - * if self._messages: - * return self._messages[-1][0] - */ - __pyx_t_3 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self->__pyx_vtab)->_on_headers_complete(__pyx_v_self); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 518, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":519 - * elif self._started: - * self._on_headers_complete() - * if self._messages: # <<<<<<<<<<<<<< - * return self._messages[-1][0] - * - */ - __pyx_t_2 = (__pyx_v_self->_messages != Py_None)&&(PyList_GET_SIZE(__pyx_v_self->_messages) != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_parser.pyx":520 - * self._on_headers_complete() - * if self._messages: - * return self._messages[-1][0] # <<<<<<<<<<<<<< - * - * def feed_data(self, data): - */ - __Pyx_XDECREF(__pyx_r); - if (unlikely(__pyx_v_self->_messages == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(0, 520, __pyx_L1_error) - } - __pyx_t_3 = __Pyx_GetItemInt_List(__pyx_v_self->_messages, -1L, long, 1, __Pyx_PyInt_From_long, 1, 1, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 520, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 520, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_r = __pyx_t_4; - __pyx_t_4 = 0; - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":519 - * elif self._started: - * self._on_headers_complete() - * if self._messages: # <<<<<<<<<<<<<< - * return self._messages[-1][0] - * - */ - } - - /* "aiohttp/_http_parser.pyx":517 - * else: - * self._payload.feed_eof() - * elif self._started: # <<<<<<<<<<<<<< - * self._on_headers_complete() - * if self._messages: - */ - } - __pyx_L3:; - - /* "aiohttp/_http_parser.pyx":502 - * ### Public API ### - * - * def feed_eof(self): # <<<<<<<<<<<<<< - * cdef bytes desc - * - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.feed_eof", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_desc); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":522 - * return self._messages[-1][0] - * - * def feed_data(self, data): # <<<<<<<<<<<<<< - * cdef: - * size_t data_len - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_7feed_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_7feed_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("feed_data (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_6feed_data(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), ((PyObject *)__pyx_v_data)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_6feed_data(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, PyObject *__pyx_v_data) { - size_t __pyx_v_data_len; - size_t __pyx_v_nb; - llhttp_errno_t __pyx_v_errno; - PyObject *__pyx_v_ex = NULL; - PyObject *__pyx_v_messages = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("feed_data", 0); - - /* "aiohttp/_http_parser.pyx":528 - * cdef cparser.llhttp_errno_t errno - * - * PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE) # <<<<<<<<<<<<<< - * data_len = self.py_buf.len - * - */ - __pyx_t_1 = PyObject_GetBuffer(__pyx_v_data, (&__pyx_v_self->py_buf), PyBUF_SIMPLE); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 528, __pyx_L1_error) - - /* "aiohttp/_http_parser.pyx":529 - * - * PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE) - * data_len = self.py_buf.len # <<<<<<<<<<<<<< - * - * errno = cparser.llhttp_execute( - */ - __pyx_v_data_len = ((size_t)__pyx_v_self->py_buf.len); - - /* "aiohttp/_http_parser.pyx":531 - * data_len = self.py_buf.len - * - * errno = cparser.llhttp_execute( # <<<<<<<<<<<<<< - * self._cparser, - * self.py_buf.buf, - */ - __pyx_v_errno = llhttp_execute(__pyx_v_self->_cparser, ((char *)__pyx_v_self->py_buf.buf), __pyx_v_data_len); - - /* "aiohttp/_http_parser.pyx":536 - * data_len) - * - * if errno is cparser.HPE_PAUSED_UPGRADE: # <<<<<<<<<<<<<< - * cparser.llhttp_resume_after_upgrade(self._cparser) - * - */ - __pyx_t_2 = ((__pyx_v_errno == HPE_PAUSED_UPGRADE) != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_parser.pyx":537 - * - * if errno is cparser.HPE_PAUSED_UPGRADE: - * cparser.llhttp_resume_after_upgrade(self._cparser) # <<<<<<<<<<<<<< - * - * nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf - */ - llhttp_resume_after_upgrade(__pyx_v_self->_cparser); - - /* "aiohttp/_http_parser.pyx":539 - * cparser.llhttp_resume_after_upgrade(self._cparser) - * - * nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf # <<<<<<<<<<<<<< - * - * PyBuffer_Release(&self.py_buf) - */ - __pyx_v_nb = (llhttp_get_error_pos(__pyx_v_self->_cparser) - ((char *)__pyx_v_self->py_buf.buf)); - - /* "aiohttp/_http_parser.pyx":536 - * data_len) - * - * if errno is cparser.HPE_PAUSED_UPGRADE: # <<<<<<<<<<<<<< - * cparser.llhttp_resume_after_upgrade(self._cparser) - * - */ - } - - /* "aiohttp/_http_parser.pyx":541 - * nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf - * - * PyBuffer_Release(&self.py_buf) # <<<<<<<<<<<<<< - * - * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): - */ - PyBuffer_Release((&__pyx_v_self->py_buf)); - - /* "aiohttp/_http_parser.pyx":543 - * PyBuffer_Release(&self.py_buf) - * - * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): # <<<<<<<<<<<<<< - * if self._payload_error == 0: - * if self._last_error is not None: - */ - switch (__pyx_v_errno) { - case HPE_OK: - case HPE_PAUSED_UPGRADE: - __pyx_t_2 = 0; - break; - default: - __pyx_t_2 = 1; - break; - } - __pyx_t_3 = (__pyx_t_2 != 0); - if (__pyx_t_3) { - - /* "aiohttp/_http_parser.pyx":544 - * - * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): - * if self._payload_error == 0: # <<<<<<<<<<<<<< - * if self._last_error is not None: - * ex = self._last_error - */ - __pyx_t_3 = ((__pyx_v_self->_payload_error == 0) != 0); - if (__pyx_t_3) { - - /* "aiohttp/_http_parser.pyx":545 - * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): - * if self._payload_error == 0: - * if self._last_error is not None: # <<<<<<<<<<<<<< - * ex = self._last_error - * self._last_error = None - */ - __pyx_t_3 = (__pyx_v_self->_last_error != Py_None); - __pyx_t_2 = (__pyx_t_3 != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_parser.pyx":546 - * if self._payload_error == 0: - * if self._last_error is not None: - * ex = self._last_error # <<<<<<<<<<<<<< - * self._last_error = None - * else: - */ - __pyx_t_4 = __pyx_v_self->_last_error; - __Pyx_INCREF(__pyx_t_4); - __pyx_v_ex = __pyx_t_4; - __pyx_t_4 = 0; - - /* "aiohttp/_http_parser.pyx":547 - * if self._last_error is not None: - * ex = self._last_error - * self._last_error = None # <<<<<<<<<<<<<< - * else: - * ex = parser_error_from_errno(self._cparser) - */ - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - __Pyx_GOTREF(__pyx_v_self->_last_error); - __Pyx_DECREF(__pyx_v_self->_last_error); - __pyx_v_self->_last_error = Py_None; - - /* "aiohttp/_http_parser.pyx":545 - * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): - * if self._payload_error == 0: - * if self._last_error is not None: # <<<<<<<<<<<<<< - * ex = self._last_error - * self._last_error = None - */ - goto __pyx_L6; - } - - /* "aiohttp/_http_parser.pyx":549 - * self._last_error = None - * else: - * ex = parser_error_from_errno(self._cparser) # <<<<<<<<<<<<<< - * self._payload = None - * raise ex - */ - /*else*/ { - __pyx_t_4 = __pyx_f_7aiohttp_12_http_parser_parser_error_from_errno(__pyx_v_self->_cparser); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 549, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_v_ex = __pyx_t_4; - __pyx_t_4 = 0; - } - __pyx_L6:; - - /* "aiohttp/_http_parser.pyx":550 - * else: - * ex = parser_error_from_errno(self._cparser) - * self._payload = None # <<<<<<<<<<<<<< - * raise ex - * - */ - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - __Pyx_GOTREF(__pyx_v_self->_payload); - __Pyx_DECREF(__pyx_v_self->_payload); - __pyx_v_self->_payload = Py_None; - - /* "aiohttp/_http_parser.pyx":551 - * ex = parser_error_from_errno(self._cparser) - * self._payload = None - * raise ex # <<<<<<<<<<<<<< - * - * if self._messages: - */ - __Pyx_Raise(__pyx_v_ex, 0, 0, 0); - __PYX_ERR(0, 551, __pyx_L1_error) - - /* "aiohttp/_http_parser.pyx":544 - * - * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): - * if self._payload_error == 0: # <<<<<<<<<<<<<< - * if self._last_error is not None: - * ex = self._last_error - */ - } - - /* "aiohttp/_http_parser.pyx":543 - * PyBuffer_Release(&self.py_buf) - * - * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): # <<<<<<<<<<<<<< - * if self._payload_error == 0: - * if self._last_error is not None: - */ - } - - /* "aiohttp/_http_parser.pyx":553 - * raise ex - * - * if self._messages: # <<<<<<<<<<<<<< - * messages = self._messages - * self._messages = [] - */ - __pyx_t_2 = (__pyx_v_self->_messages != Py_None)&&(PyList_GET_SIZE(__pyx_v_self->_messages) != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_parser.pyx":554 - * - * if self._messages: - * messages = self._messages # <<<<<<<<<<<<<< - * self._messages = [] - * else: - */ - __pyx_t_4 = __pyx_v_self->_messages; - __Pyx_INCREF(__pyx_t_4); - __pyx_v_messages = __pyx_t_4; - __pyx_t_4 = 0; - - /* "aiohttp/_http_parser.pyx":555 - * if self._messages: - * messages = self._messages - * self._messages = [] # <<<<<<<<<<<<<< - * else: - * messages = () - */ - __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 555, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_GIVEREF(__pyx_t_4); - __Pyx_GOTREF(__pyx_v_self->_messages); - __Pyx_DECREF(__pyx_v_self->_messages); - __pyx_v_self->_messages = ((PyObject*)__pyx_t_4); - __pyx_t_4 = 0; - - /* "aiohttp/_http_parser.pyx":553 - * raise ex - * - * if self._messages: # <<<<<<<<<<<<<< - * messages = self._messages - * self._messages = [] - */ - goto __pyx_L7; - } - - /* "aiohttp/_http_parser.pyx":557 - * self._messages = [] - * else: - * messages = () # <<<<<<<<<<<<<< - * - * if self._upgraded: - */ - /*else*/ { - __Pyx_INCREF(__pyx_empty_tuple); - __pyx_v_messages = __pyx_empty_tuple; - } - __pyx_L7:; - - /* "aiohttp/_http_parser.pyx":559 - * messages = () - * - * if self._upgraded: # <<<<<<<<<<<<<< - * return messages, True, data[nb:] - * else: - */ - __pyx_t_2 = (__pyx_v_self->_upgraded != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_parser.pyx":560 - * - * if self._upgraded: - * return messages, True, data[nb:] # <<<<<<<<<<<<<< - * else: - * return messages, False, b'' - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_4 = __Pyx_PyObject_GetSlice(__pyx_v_data, __pyx_v_nb, 0, NULL, NULL, NULL, 1, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 560, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 560, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_INCREF(__pyx_v_messages); - __Pyx_GIVEREF(__pyx_v_messages); - PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_messages); - __Pyx_INCREF(Py_True); - __Pyx_GIVEREF(Py_True); - PyTuple_SET_ITEM(__pyx_t_5, 1, Py_True); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_4); - __pyx_t_4 = 0; - __pyx_r = __pyx_t_5; - __pyx_t_5 = 0; - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":559 - * messages = () - * - * if self._upgraded: # <<<<<<<<<<<<<< - * return messages, True, data[nb:] - * else: - */ - } - - /* "aiohttp/_http_parser.pyx":562 - * return messages, True, data[nb:] - * else: - * return messages, False, b'' # <<<<<<<<<<<<<< - * - * def set_upgraded(self, val): - */ - /*else*/ { - __Pyx_XDECREF(__pyx_r); - __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 562, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_INCREF(__pyx_v_messages); - __Pyx_GIVEREF(__pyx_v_messages); - PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_messages); - __Pyx_INCREF(Py_False); - __Pyx_GIVEREF(Py_False); - PyTuple_SET_ITEM(__pyx_t_5, 1, Py_False); - __Pyx_INCREF(__pyx_kp_b__4); - __Pyx_GIVEREF(__pyx_kp_b__4); - PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_kp_b__4); - __pyx_r = __pyx_t_5; - __pyx_t_5 = 0; - goto __pyx_L0; - } - - /* "aiohttp/_http_parser.pyx":522 - * return self._messages[-1][0] - * - * def feed_data(self, data): # <<<<<<<<<<<<<< - * cdef: - * size_t data_len - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.feed_data", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_ex); - __Pyx_XDECREF(__pyx_v_messages); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":564 - * return messages, False, b'' - * - * def set_upgraded(self, val): # <<<<<<<<<<<<<< - * self._upgraded = val - * - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_9set_upgraded(PyObject *__pyx_v_self, PyObject *__pyx_v_val); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_9set_upgraded(PyObject *__pyx_v_self, PyObject *__pyx_v_val) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("set_upgraded (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_8set_upgraded(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), ((PyObject *)__pyx_v_val)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_8set_upgraded(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, PyObject *__pyx_v_val) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("set_upgraded", 0); - - /* "aiohttp/_http_parser.pyx":565 - * - * def set_upgraded(self, val): - * self._upgraded = val # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_val); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 565, __pyx_L1_error) - __pyx_v_self->_upgraded = __pyx_t_1; - - /* "aiohttp/_http_parser.pyx":564 - * return messages, False, b'' - * - * def set_upgraded(self, val): # <<<<<<<<<<<<<< - * self._upgraded = val - * - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.set_upgraded", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_11__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_11__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_10__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_10__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); - - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(1, 2, __pyx_L1_error) - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_13__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_13__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_12__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_12__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); - - /* "(tree fragment)":4 - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(1, 4, __pyx_L1_error) - - /* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":570 - * cdef class HttpRequestParser(HttpParser): - * - * def __init__( # <<<<<<<<<<<<<< - * self, protocol, loop, int limit, timer=None, - * size_t max_line_size=8190, size_t max_headers=32768, - */ - -/* Python wrapper */ -static int __pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_protocol = 0; - PyObject *__pyx_v_loop = 0; - int __pyx_v_limit; - PyObject *__pyx_v_timer = 0; - size_t __pyx_v_max_line_size; - size_t __pyx_v_max_headers; - size_t __pyx_v_max_field_size; - PyObject *__pyx_v_payload_exception = 0; - int __pyx_v_response_with_body; - int __pyx_v_read_until_eof; - int __pyx_v_auto_decompress; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_protocol,&__pyx_n_s_loop,&__pyx_n_s_limit,&__pyx_n_s_timer,&__pyx_n_s_max_line_size,&__pyx_n_s_max_headers,&__pyx_n_s_max_field_size,&__pyx_n_s_payload_exception,&__pyx_n_s_response_with_body,&__pyx_n_s_read_until_eof,&__pyx_n_s_auto_decompress,0}; - PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0}; - - /* "aiohttp/_http_parser.pyx":571 - * - * def __init__( - * self, protocol, loop, int limit, timer=None, # <<<<<<<<<<<<<< - * size_t max_line_size=8190, size_t max_headers=32768, - * size_t max_field_size=8190, payload_exception=None, - */ - values[3] = ((PyObject *)Py_None); - - /* "aiohttp/_http_parser.pyx":573 - * self, protocol, loop, int limit, timer=None, - * size_t max_line_size=8190, size_t max_headers=32768, - * size_t max_field_size=8190, payload_exception=None, # <<<<<<<<<<<<<< - * bint response_with_body=True, bint read_until_eof=False, - * bint auto_decompress=True, - */ - values[7] = ((PyObject *)Py_None); - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); - CYTHON_FALLTHROUGH; - case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); - CYTHON_FALLTHROUGH; - case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); - CYTHON_FALLTHROUGH; - case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); - CYTHON_FALLTHROUGH; - case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); - CYTHON_FALLTHROUGH; - case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); - CYTHON_FALLTHROUGH; - case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - CYTHON_FALLTHROUGH; - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_protocol)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loop)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 1); __PYX_ERR(0, 570, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_limit)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 2); __PYX_ERR(0, 570, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 3: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_timer); - if (value) { values[3] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 4: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_line_size); - if (value) { values[4] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 5: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_headers); - if (value) { values[5] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 6: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_field_size); - if (value) { values[6] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 7: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_payload_exception); - if (value) { values[7] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 8: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_response_with_body); - if (value) { values[8] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 9: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_read_until_eof); - if (value) { values[9] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 10: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_auto_decompress); - if (value) { values[10] = value; kw_args--; } - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 570, __pyx_L3_error) - } - } else { - switch (PyTuple_GET_SIZE(__pyx_args)) { - case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); - CYTHON_FALLTHROUGH; - case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); - CYTHON_FALLTHROUGH; - case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); - CYTHON_FALLTHROUGH; - case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); - CYTHON_FALLTHROUGH; - case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); - CYTHON_FALLTHROUGH; - case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); - CYTHON_FALLTHROUGH; - case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - CYTHON_FALLTHROUGH; - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - break; - default: goto __pyx_L5_argtuple_error; - } - } - __pyx_v_protocol = values[0]; - __pyx_v_loop = values[1]; - __pyx_v_limit = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_limit == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 571, __pyx_L3_error) - __pyx_v_timer = values[3]; - if (values[4]) { - __pyx_v_max_line_size = __Pyx_PyInt_As_size_t(values[4]); if (unlikely((__pyx_v_max_line_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 572, __pyx_L3_error) - } else { - __pyx_v_max_line_size = ((size_t)0x1FFE); - } - if (values[5]) { - __pyx_v_max_headers = __Pyx_PyInt_As_size_t(values[5]); if (unlikely((__pyx_v_max_headers == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 572, __pyx_L3_error) - } else { - __pyx_v_max_headers = ((size_t)0x8000); - } - if (values[6]) { - __pyx_v_max_field_size = __Pyx_PyInt_As_size_t(values[6]); if (unlikely((__pyx_v_max_field_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 573, __pyx_L3_error) - } else { - __pyx_v_max_field_size = ((size_t)0x1FFE); - } - __pyx_v_payload_exception = values[7]; - if (values[8]) { - __pyx_v_response_with_body = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_response_with_body == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 574, __pyx_L3_error) - } else { - - /* "aiohttp/_http_parser.pyx":574 - * size_t max_line_size=8190, size_t max_headers=32768, - * size_t max_field_size=8190, payload_exception=None, - * bint response_with_body=True, bint read_until_eof=False, # <<<<<<<<<<<<<< - * bint auto_decompress=True, - * ): - */ - __pyx_v_response_with_body = ((int)1); - } - if (values[9]) { - __pyx_v_read_until_eof = __Pyx_PyObject_IsTrue(values[9]); if (unlikely((__pyx_v_read_until_eof == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 574, __pyx_L3_error) - } else { - __pyx_v_read_until_eof = ((int)0); - } - if (values[10]) { - __pyx_v_auto_decompress = __Pyx_PyObject_IsTrue(values[10]); if (unlikely((__pyx_v_auto_decompress == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 575, __pyx_L3_error) - } else { - - /* "aiohttp/_http_parser.pyx":575 - * size_t max_field_size=8190, payload_exception=None, - * bint response_with_body=True, bint read_until_eof=False, - * bint auto_decompress=True, # <<<<<<<<<<<<<< - * ): - * self._init(cparser.HTTP_REQUEST, protocol, loop, limit, timer, - */ - __pyx_v_auto_decompress = ((int)1); - } - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 570, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser___init__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self), __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, __pyx_v_timer, __pyx_v_max_line_size, __pyx_v_max_headers, __pyx_v_max_field_size, __pyx_v_payload_exception, __pyx_v_response_with_body, __pyx_v_read_until_eof, __pyx_v_auto_decompress); - - /* "aiohttp/_http_parser.pyx":570 - * cdef class HttpRequestParser(HttpParser): - * - * def __init__( # <<<<<<<<<<<<<< - * self, protocol, loop, int limit, timer=None, - * size_t max_line_size=8190, size_t max_headers=32768, - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser___init__(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, PyObject *__pyx_v_timer, size_t __pyx_v_max_line_size, size_t __pyx_v_max_headers, size_t __pyx_v_max_field_size, PyObject *__pyx_v_payload_exception, int __pyx_v_response_with_body, int __pyx_v_read_until_eof, int __pyx_v_auto_decompress) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init __pyx_t_2; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__init__", 0); - - /* "aiohttp/_http_parser.pyx":577 - * bint auto_decompress=True, - * ): - * self._init(cparser.HTTP_REQUEST, protocol, loop, limit, timer, # <<<<<<<<<<<<<< - * max_line_size, max_headers, max_field_size, - * payload_exception, response_with_body, read_until_eof, - */ - __pyx_t_2.__pyx_n = 8; - __pyx_t_2.timer = __pyx_v_timer; - __pyx_t_2.max_line_size = __pyx_v_max_line_size; - __pyx_t_2.max_headers = __pyx_v_max_headers; - __pyx_t_2.max_field_size = __pyx_v_max_field_size; - __pyx_t_2.payload_exception = __pyx_v_payload_exception; - __pyx_t_2.response_with_body = __pyx_v_response_with_body; - __pyx_t_2.read_until_eof = __pyx_v_read_until_eof; - __pyx_t_2.auto_decompress = __pyx_v_auto_decompress; - __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base._init(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), HTTP_REQUEST, __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, &__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 577, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":570 - * cdef class HttpRequestParser(HttpParser): - * - * def __init__( # <<<<<<<<<<<<<< - * self, protocol, loop, int limit, timer=None, - * size_t max_line_size=8190, size_t max_headers=32768, - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":582 - * auto_decompress) - * - * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< - * cdef int idx1, idx2 - * if not self._buf: - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser_17HttpRequestParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self) { - int __pyx_v_idx1; - int __pyx_v_idx2; - CYTHON_UNUSED Py_ssize_t __pyx_v_idx3; - PyObject *__pyx_v_query = NULL; - PyObject *__pyx_v_path = NULL; - PyObject *__pyx_v_fragment = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - Py_ssize_t __pyx_t_4; - Py_ssize_t __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - int __pyx_t_8; - int __pyx_t_9; - char const *__pyx_t_10; - PyObject *__pyx_t_11 = NULL; - PyObject *__pyx_t_12 = NULL; - PyObject *__pyx_t_13 = NULL; - PyObject *__pyx_t_14 = NULL; - PyObject *__pyx_t_15 = NULL; - PyObject *__pyx_t_16 = NULL; - int __pyx_t_17; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_on_status_complete", 0); - - /* "aiohttp/_http_parser.pyx":584 - * cdef object _on_status_complete(self): - * cdef int idx1, idx2 - * if not self._buf: # <<<<<<<<<<<<<< - * return - * self._path = self._buf.decode('utf-8', 'surrogateescape') - */ - __pyx_t_1 = (__pyx_v_self->__pyx_base._buf != Py_None)&&(PyByteArray_GET_SIZE(__pyx_v_self->__pyx_base._buf) != 0); - __pyx_t_2 = ((!__pyx_t_1) != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_parser.pyx":585 - * cdef int idx1, idx2 - * if not self._buf: - * return # <<<<<<<<<<<<<< - * self._path = self._buf.decode('utf-8', 'surrogateescape') - * try: - */ - __Pyx_XDECREF(__pyx_r); - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":584 - * cdef object _on_status_complete(self): - * cdef int idx1, idx2 - * if not self._buf: # <<<<<<<<<<<<<< - * return - * self._path = self._buf.decode('utf-8', 'surrogateescape') - */ - } - - /* "aiohttp/_http_parser.pyx":586 - * if not self._buf: - * return - * self._path = self._buf.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< - * try: - * idx3 = len(self._path) - */ - if (unlikely(__pyx_v_self->__pyx_base._buf == Py_None)) { - PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode"); - __PYX_ERR(0, 586, __pyx_L1_error) - } - __pyx_t_3 = __Pyx_decode_bytearray(__pyx_v_self->__pyx_base._buf, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 586, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __Pyx_GOTREF(__pyx_v_self->__pyx_base._path); - __Pyx_DECREF(__pyx_v_self->__pyx_base._path); - __pyx_v_self->__pyx_base._path = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":587 - * return - * self._path = self._buf.decode('utf-8', 'surrogateescape') - * try: # <<<<<<<<<<<<<< - * idx3 = len(self._path) - * idx1 = self._path.find("?") - */ - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":588 - * self._path = self._buf.decode('utf-8', 'surrogateescape') - * try: - * idx3 = len(self._path) # <<<<<<<<<<<<<< - * idx1 = self._path.find("?") - * if idx1 == -1: - */ - __pyx_t_3 = __pyx_v_self->__pyx_base._path; - __Pyx_INCREF(__pyx_t_3); - if (unlikely(__pyx_t_3 == Py_None)) { - PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); - __PYX_ERR(0, 588, __pyx_L5_error) - } - __pyx_t_4 = __Pyx_PyUnicode_GET_LENGTH(__pyx_t_3); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(0, 588, __pyx_L5_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_v_idx3 = __pyx_t_4; - - /* "aiohttp/_http_parser.pyx":589 - * try: - * idx3 = len(self._path) - * idx1 = self._path.find("?") # <<<<<<<<<<<<<< - * if idx1 == -1: - * query = "" - */ - if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { - PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "find"); - __PYX_ERR(0, 589, __pyx_L5_error) - } - __pyx_t_4 = PyUnicode_Find(__pyx_v_self->__pyx_base._path, __pyx_kp_u__7, 0, PY_SSIZE_T_MAX, 1); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-2))) __PYX_ERR(0, 589, __pyx_L5_error) - __pyx_v_idx1 = __pyx_t_4; - - /* "aiohttp/_http_parser.pyx":590 - * idx3 = len(self._path) - * idx1 = self._path.find("?") - * if idx1 == -1: # <<<<<<<<<<<<<< - * query = "" - * idx2 = self._path.find("#") - */ - __pyx_t_2 = ((__pyx_v_idx1 == -1L) != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_parser.pyx":591 - * idx1 = self._path.find("?") - * if idx1 == -1: - * query = "" # <<<<<<<<<<<<<< - * idx2 = self._path.find("#") - * if idx2 == -1: - */ - __Pyx_INCREF(__pyx_kp_u__4); - __pyx_v_query = __pyx_kp_u__4; - - /* "aiohttp/_http_parser.pyx":592 - * if idx1 == -1: - * query = "" - * idx2 = self._path.find("#") # <<<<<<<<<<<<<< - * if idx2 == -1: - * path = self._path - */ - if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { - PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "find"); - __PYX_ERR(0, 592, __pyx_L5_error) - } - __pyx_t_4 = PyUnicode_Find(__pyx_v_self->__pyx_base._path, __pyx_kp_u__8, 0, PY_SSIZE_T_MAX, 1); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-2))) __PYX_ERR(0, 592, __pyx_L5_error) - __pyx_v_idx2 = __pyx_t_4; - - /* "aiohttp/_http_parser.pyx":593 - * query = "" - * idx2 = self._path.find("#") - * if idx2 == -1: # <<<<<<<<<<<<<< - * path = self._path - * fragment = "" - */ - __pyx_t_2 = ((__pyx_v_idx2 == -1L) != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_parser.pyx":594 - * idx2 = self._path.find("#") - * if idx2 == -1: - * path = self._path # <<<<<<<<<<<<<< - * fragment = "" - * else: - */ - __pyx_t_3 = __pyx_v_self->__pyx_base._path; - __Pyx_INCREF(__pyx_t_3); - __pyx_v_path = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":595 - * if idx2 == -1: - * path = self._path - * fragment = "" # <<<<<<<<<<<<<< - * else: - * path = self._path[0: idx2] - */ - __Pyx_INCREF(__pyx_kp_u__4); - __pyx_v_fragment = __pyx_kp_u__4; - - /* "aiohttp/_http_parser.pyx":593 - * query = "" - * idx2 = self._path.find("#") - * if idx2 == -1: # <<<<<<<<<<<<<< - * path = self._path - * fragment = "" - */ - goto __pyx_L8; - } - - /* "aiohttp/_http_parser.pyx":597 - * fragment = "" - * else: - * path = self._path[0: idx2] # <<<<<<<<<<<<<< - * fragment = self._path[idx2+1:] - * - */ - /*else*/ { - if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(0, 597, __pyx_L5_error) - } - __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, 0, __pyx_v_idx2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 597, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_v_path = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":598 - * else: - * path = self._path[0: idx2] - * fragment = self._path[idx2+1:] # <<<<<<<<<<<<<< - * - * else: - */ - if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(0, 598, __pyx_L5_error) - } - __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, (__pyx_v_idx2 + 1), PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 598, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_v_fragment = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - } - __pyx_L8:; - - /* "aiohttp/_http_parser.pyx":590 - * idx3 = len(self._path) - * idx1 = self._path.find("?") - * if idx1 == -1: # <<<<<<<<<<<<<< - * query = "" - * idx2 = self._path.find("#") - */ - goto __pyx_L7; - } - - /* "aiohttp/_http_parser.pyx":601 - * - * else: - * path = self._path[0:idx1] # <<<<<<<<<<<<<< - * idx1 += 1 - * idx2 = self._path.find("#", idx1+1) - */ - /*else*/ { - if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(0, 601, __pyx_L5_error) - } - __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, 0, __pyx_v_idx1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 601, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_v_path = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":602 - * else: - * path = self._path[0:idx1] - * idx1 += 1 # <<<<<<<<<<<<<< - * idx2 = self._path.find("#", idx1+1) - * if idx2 == -1: - */ - __pyx_v_idx1 = (__pyx_v_idx1 + 1); - - /* "aiohttp/_http_parser.pyx":603 - * path = self._path[0:idx1] - * idx1 += 1 - * idx2 = self._path.find("#", idx1+1) # <<<<<<<<<<<<<< - * if idx2 == -1: - * query = self._path[idx1:] - */ - if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { - PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "find"); - __PYX_ERR(0, 603, __pyx_L5_error) - } - __pyx_t_3 = __Pyx_PyInt_From_long((__pyx_v_idx1 + 1)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 603, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 603, __pyx_L5_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_5 = PyUnicode_Find(__pyx_v_self->__pyx_base._path, __pyx_kp_u__8, __pyx_t_4, PY_SSIZE_T_MAX, 1); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-2))) __PYX_ERR(0, 603, __pyx_L5_error) - __pyx_v_idx2 = __pyx_t_5; - - /* "aiohttp/_http_parser.pyx":604 - * idx1 += 1 - * idx2 = self._path.find("#", idx1+1) - * if idx2 == -1: # <<<<<<<<<<<<<< - * query = self._path[idx1:] - * fragment = "" - */ - __pyx_t_2 = ((__pyx_v_idx2 == -1L) != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_parser.pyx":605 - * idx2 = self._path.find("#", idx1+1) - * if idx2 == -1: - * query = self._path[idx1:] # <<<<<<<<<<<<<< - * fragment = "" - * else: - */ - if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(0, 605, __pyx_L5_error) - } - __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, __pyx_v_idx1, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 605, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_v_query = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":606 - * if idx2 == -1: - * query = self._path[idx1:] - * fragment = "" # <<<<<<<<<<<<<< - * else: - * query = self._path[idx1: idx2] - */ - __Pyx_INCREF(__pyx_kp_u__4); - __pyx_v_fragment = __pyx_kp_u__4; - - /* "aiohttp/_http_parser.pyx":604 - * idx1 += 1 - * idx2 = self._path.find("#", idx1+1) - * if idx2 == -1: # <<<<<<<<<<<<<< - * query = self._path[idx1:] - * fragment = "" - */ - goto __pyx_L9; - } - - /* "aiohttp/_http_parser.pyx":608 - * fragment = "" - * else: - * query = self._path[idx1: idx2] # <<<<<<<<<<<<<< - * fragment = self._path[idx2+1:] - * - */ - /*else*/ { - if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(0, 608, __pyx_L5_error) - } - __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, __pyx_v_idx1, __pyx_v_idx2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 608, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_v_query = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - - /* "aiohttp/_http_parser.pyx":609 - * else: - * query = self._path[idx1: idx2] - * fragment = self._path[idx2+1:] # <<<<<<<<<<<<<< - * - * self._url = URL.build( - */ - if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(0, 609, __pyx_L5_error) - } - __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, (__pyx_v_idx2 + 1), PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 609, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_v_fragment = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - } - __pyx_L9:; - } - __pyx_L7:; - - /* "aiohttp/_http_parser.pyx":611 - * fragment = self._path[idx2+1:] - * - * self._url = URL.build( # <<<<<<<<<<<<<< - * path=path, - * query_string=query, - */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_7aiohttp_12_http_parser_URL, __pyx_n_s_build); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 611, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_3); - - /* "aiohttp/_http_parser.pyx":612 - * - * self._url = URL.build( - * path=path, # <<<<<<<<<<<<<< - * query_string=query, - * fragment=fragment, - */ - __pyx_t_6 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 612, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_6); - if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_path, __pyx_v_path) < 0) __PYX_ERR(0, 612, __pyx_L5_error) - - /* "aiohttp/_http_parser.pyx":613 - * self._url = URL.build( - * path=path, - * query_string=query, # <<<<<<<<<<<<<< - * fragment=fragment, - * encoded=True, - */ - if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_query_string, __pyx_v_query) < 0) __PYX_ERR(0, 612, __pyx_L5_error) - - /* "aiohttp/_http_parser.pyx":614 - * path=path, - * query_string=query, - * fragment=fragment, # <<<<<<<<<<<<<< - * encoded=True, - * ) - */ - if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_fragment, __pyx_v_fragment) < 0) __PYX_ERR(0, 612, __pyx_L5_error) - - /* "aiohttp/_http_parser.pyx":615 - * query_string=query, - * fragment=fragment, - * encoded=True, # <<<<<<<<<<<<<< - * ) - * finally: - */ - if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_encoded, Py_True) < 0) __PYX_ERR(0, 612, __pyx_L5_error) - - /* "aiohttp/_http_parser.pyx":611 - * fragment = self._path[idx2+1:] - * - * self._url = URL.build( # <<<<<<<<<<<<<< - * path=path, - * query_string=query, - */ - __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_empty_tuple, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 611, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_GIVEREF(__pyx_t_7); - __Pyx_GOTREF(__pyx_v_self->__pyx_base._url); - __Pyx_DECREF(__pyx_v_self->__pyx_base._url); - __pyx_v_self->__pyx_base._url = __pyx_t_7; - __pyx_t_7 = 0; - } - - /* "aiohttp/_http_parser.pyx":618 - * ) - * finally: - * PyByteArray_Resize(self._buf, 0) # <<<<<<<<<<<<<< - * - * - */ - /*finally:*/ { - /*normal exit:*/{ - __pyx_t_7 = __pyx_v_self->__pyx_base._buf; - __Pyx_INCREF(__pyx_t_7); - __pyx_t_8 = PyByteArray_Resize(__pyx_t_7, 0); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 618, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - goto __pyx_L6; - } - __pyx_L5_error:; - /*exception exit:*/{ - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_14, &__pyx_t_15, &__pyx_t_16); - if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_11, &__pyx_t_12, &__pyx_t_13) < 0)) __Pyx_ErrFetch(&__pyx_t_11, &__pyx_t_12, &__pyx_t_13); - __Pyx_XGOTREF(__pyx_t_11); - __Pyx_XGOTREF(__pyx_t_12); - __Pyx_XGOTREF(__pyx_t_13); - __Pyx_XGOTREF(__pyx_t_14); - __Pyx_XGOTREF(__pyx_t_15); - __Pyx_XGOTREF(__pyx_t_16); - __pyx_t_8 = __pyx_lineno; __pyx_t_9 = __pyx_clineno; __pyx_t_10 = __pyx_filename; - { - __pyx_t_7 = __pyx_v_self->__pyx_base._buf; - __Pyx_INCREF(__pyx_t_7); - __pyx_t_17 = PyByteArray_Resize(__pyx_t_7, 0); if (unlikely(__pyx_t_17 == ((int)-1))) __PYX_ERR(0, 618, __pyx_L11_error) - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - } - if (PY_MAJOR_VERSION >= 3) { - __Pyx_XGIVEREF(__pyx_t_14); - __Pyx_XGIVEREF(__pyx_t_15); - __Pyx_XGIVEREF(__pyx_t_16); - __Pyx_ExceptionReset(__pyx_t_14, __pyx_t_15, __pyx_t_16); - } - __Pyx_XGIVEREF(__pyx_t_11); - __Pyx_XGIVEREF(__pyx_t_12); - __Pyx_XGIVEREF(__pyx_t_13); - __Pyx_ErrRestore(__pyx_t_11, __pyx_t_12, __pyx_t_13); - __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; - __pyx_lineno = __pyx_t_8; __pyx_clineno = __pyx_t_9; __pyx_filename = __pyx_t_10; - goto __pyx_L1_error; - __pyx_L11_error:; - if (PY_MAJOR_VERSION >= 3) { - __Pyx_XGIVEREF(__pyx_t_14); - __Pyx_XGIVEREF(__pyx_t_15); - __Pyx_XGIVEREF(__pyx_t_16); - __Pyx_ExceptionReset(__pyx_t_14, __pyx_t_15, __pyx_t_16); - } - __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; - __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; - __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; - __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; - goto __pyx_L1_error; - } - __pyx_L6:; - } - - /* "aiohttp/_http_parser.pyx":582 - * auto_decompress) - * - * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< - * cdef int idx1, idx2 - * if not self._buf: - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser._on_status_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_query); - __Pyx_XDECREF(__pyx_v_path); - __Pyx_XDECREF(__pyx_v_fragment); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_2__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); - - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(1, 2, __pyx_L1_error) - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_4__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); - - /* "(tree fragment)":4 - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(1, 4, __pyx_L1_error) - - /* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":623 - * cdef class HttpResponseParser(HttpParser): - * - * def __init__( # <<<<<<<<<<<<<< - * self, protocol, loop, int limit, timer=None, - * size_t max_line_size=8190, size_t max_headers=32768, - */ - -/* Python wrapper */ -static int __pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static int __pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_protocol = 0; - PyObject *__pyx_v_loop = 0; - int __pyx_v_limit; - PyObject *__pyx_v_timer = 0; - size_t __pyx_v_max_line_size; - size_t __pyx_v_max_headers; - size_t __pyx_v_max_field_size; - PyObject *__pyx_v_payload_exception = 0; - int __pyx_v_response_with_body; - int __pyx_v_read_until_eof; - int __pyx_v_auto_decompress; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_protocol,&__pyx_n_s_loop,&__pyx_n_s_limit,&__pyx_n_s_timer,&__pyx_n_s_max_line_size,&__pyx_n_s_max_headers,&__pyx_n_s_max_field_size,&__pyx_n_s_payload_exception,&__pyx_n_s_response_with_body,&__pyx_n_s_read_until_eof,&__pyx_n_s_auto_decompress,0}; - PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0}; - - /* "aiohttp/_http_parser.pyx":624 - * - * def __init__( - * self, protocol, loop, int limit, timer=None, # <<<<<<<<<<<<<< - * size_t max_line_size=8190, size_t max_headers=32768, - * size_t max_field_size=8190, payload_exception=None, - */ - values[3] = ((PyObject *)Py_None); - - /* "aiohttp/_http_parser.pyx":626 - * self, protocol, loop, int limit, timer=None, - * size_t max_line_size=8190, size_t max_headers=32768, - * size_t max_field_size=8190, payload_exception=None, # <<<<<<<<<<<<<< - * bint response_with_body=True, bint read_until_eof=False, - * bint auto_decompress=True - */ - values[7] = ((PyObject *)Py_None); - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); - CYTHON_FALLTHROUGH; - case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); - CYTHON_FALLTHROUGH; - case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); - CYTHON_FALLTHROUGH; - case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); - CYTHON_FALLTHROUGH; - case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); - CYTHON_FALLTHROUGH; - case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); - CYTHON_FALLTHROUGH; - case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - CYTHON_FALLTHROUGH; - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_protocol)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loop)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 1); __PYX_ERR(0, 623, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_limit)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 2); __PYX_ERR(0, 623, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 3: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_timer); - if (value) { values[3] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 4: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_line_size); - if (value) { values[4] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 5: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_headers); - if (value) { values[5] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 6: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_field_size); - if (value) { values[6] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 7: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_payload_exception); - if (value) { values[7] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 8: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_response_with_body); - if (value) { values[8] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 9: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_read_until_eof); - if (value) { values[9] = value; kw_args--; } - } - CYTHON_FALLTHROUGH; - case 10: - if (kw_args > 0) { - PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_auto_decompress); - if (value) { values[10] = value; kw_args--; } - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 623, __pyx_L3_error) - } - } else { - switch (PyTuple_GET_SIZE(__pyx_args)) { - case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); - CYTHON_FALLTHROUGH; - case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); - CYTHON_FALLTHROUGH; - case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); - CYTHON_FALLTHROUGH; - case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); - CYTHON_FALLTHROUGH; - case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); - CYTHON_FALLTHROUGH; - case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); - CYTHON_FALLTHROUGH; - case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); - CYTHON_FALLTHROUGH; - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - break; - default: goto __pyx_L5_argtuple_error; - } - } - __pyx_v_protocol = values[0]; - __pyx_v_loop = values[1]; - __pyx_v_limit = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_limit == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 624, __pyx_L3_error) - __pyx_v_timer = values[3]; - if (values[4]) { - __pyx_v_max_line_size = __Pyx_PyInt_As_size_t(values[4]); if (unlikely((__pyx_v_max_line_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 625, __pyx_L3_error) - } else { - __pyx_v_max_line_size = ((size_t)0x1FFE); - } - if (values[5]) { - __pyx_v_max_headers = __Pyx_PyInt_As_size_t(values[5]); if (unlikely((__pyx_v_max_headers == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 625, __pyx_L3_error) - } else { - __pyx_v_max_headers = ((size_t)0x8000); - } - if (values[6]) { - __pyx_v_max_field_size = __Pyx_PyInt_As_size_t(values[6]); if (unlikely((__pyx_v_max_field_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 626, __pyx_L3_error) - } else { - __pyx_v_max_field_size = ((size_t)0x1FFE); - } - __pyx_v_payload_exception = values[7]; - if (values[8]) { - __pyx_v_response_with_body = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_response_with_body == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 627, __pyx_L3_error) - } else { - - /* "aiohttp/_http_parser.pyx":627 - * size_t max_line_size=8190, size_t max_headers=32768, - * size_t max_field_size=8190, payload_exception=None, - * bint response_with_body=True, bint read_until_eof=False, # <<<<<<<<<<<<<< - * bint auto_decompress=True - * ): - */ - __pyx_v_response_with_body = ((int)1); - } - if (values[9]) { - __pyx_v_read_until_eof = __Pyx_PyObject_IsTrue(values[9]); if (unlikely((__pyx_v_read_until_eof == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 627, __pyx_L3_error) - } else { - __pyx_v_read_until_eof = ((int)0); - } - if (values[10]) { - __pyx_v_auto_decompress = __Pyx_PyObject_IsTrue(values[10]); if (unlikely((__pyx_v_auto_decompress == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 628, __pyx_L3_error) - } else { - - /* "aiohttp/_http_parser.pyx":628 - * size_t max_field_size=8190, payload_exception=None, - * bint response_with_body=True, bint read_until_eof=False, - * bint auto_decompress=True # <<<<<<<<<<<<<< - * ): - * self._init(cparser.HTTP_RESPONSE, protocol, loop, limit, timer, - */ - __pyx_v_auto_decompress = ((int)1); - } - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 623, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return -1; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser___init__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self), __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, __pyx_v_timer, __pyx_v_max_line_size, __pyx_v_max_headers, __pyx_v_max_field_size, __pyx_v_payload_exception, __pyx_v_response_with_body, __pyx_v_read_until_eof, __pyx_v_auto_decompress); - - /* "aiohttp/_http_parser.pyx":623 - * cdef class HttpResponseParser(HttpParser): - * - * def __init__( # <<<<<<<<<<<<<< - * self, protocol, loop, int limit, timer=None, - * size_t max_line_size=8190, size_t max_headers=32768, - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static int __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser___init__(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, PyObject *__pyx_v_timer, size_t __pyx_v_max_line_size, size_t __pyx_v_max_headers, size_t __pyx_v_max_field_size, PyObject *__pyx_v_payload_exception, int __pyx_v_response_with_body, int __pyx_v_read_until_eof, int __pyx_v_auto_decompress) { - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init __pyx_t_2; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__init__", 0); - - /* "aiohttp/_http_parser.pyx":630 - * bint auto_decompress=True - * ): - * self._init(cparser.HTTP_RESPONSE, protocol, loop, limit, timer, # <<<<<<<<<<<<<< - * max_line_size, max_headers, max_field_size, - * payload_exception, response_with_body, read_until_eof, - */ - __pyx_t_2.__pyx_n = 8; - __pyx_t_2.timer = __pyx_v_timer; - __pyx_t_2.max_line_size = __pyx_v_max_line_size; - __pyx_t_2.max_headers = __pyx_v_max_headers; - __pyx_t_2.max_field_size = __pyx_v_max_field_size; - __pyx_t_2.payload_exception = __pyx_v_payload_exception; - __pyx_t_2.response_with_body = __pyx_v_response_with_body; - __pyx_t_2.read_until_eof = __pyx_v_read_until_eof; - __pyx_t_2.auto_decompress = __pyx_v_auto_decompress; - __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base._init(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), HTTP_RESPONSE, __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, &__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 630, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":623 - * cdef class HttpResponseParser(HttpParser): - * - * def __init__( # <<<<<<<<<<<<<< - * self, protocol, loop, int limit, timer=None, - * size_t max_line_size=8190, size_t max_headers=32768, - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":635 - * auto_decompress) - * - * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< - * if self._buf: - * self._reason = self._buf.decode('utf-8', 'surrogateescape') - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser_18HttpResponseParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_t_3; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_on_status_complete", 0); - - /* "aiohttp/_http_parser.pyx":636 - * - * cdef object _on_status_complete(self): - * if self._buf: # <<<<<<<<<<<<<< - * self._reason = self._buf.decode('utf-8', 'surrogateescape') - * PyByteArray_Resize(self._buf, 0) - */ - __pyx_t_1 = (__pyx_v_self->__pyx_base._buf != Py_None)&&(PyByteArray_GET_SIZE(__pyx_v_self->__pyx_base._buf) != 0); - if (__pyx_t_1) { - - /* "aiohttp/_http_parser.pyx":637 - * cdef object _on_status_complete(self): - * if self._buf: - * self._reason = self._buf.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< - * PyByteArray_Resize(self._buf, 0) - * else: - */ - if (unlikely(__pyx_v_self->__pyx_base._buf == Py_None)) { - PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode"); - __PYX_ERR(0, 637, __pyx_L1_error) - } - __pyx_t_2 = __Pyx_decode_bytearray(__pyx_v_self->__pyx_base._buf, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 637, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_GIVEREF(__pyx_t_2); - __Pyx_GOTREF(__pyx_v_self->__pyx_base._reason); - __Pyx_DECREF(__pyx_v_self->__pyx_base._reason); - __pyx_v_self->__pyx_base._reason = ((PyObject*)__pyx_t_2); - __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":638 - * if self._buf: - * self._reason = self._buf.decode('utf-8', 'surrogateescape') - * PyByteArray_Resize(self._buf, 0) # <<<<<<<<<<<<<< - * else: - * self._reason = self._reason or '' - */ - __pyx_t_2 = __pyx_v_self->__pyx_base._buf; - __Pyx_INCREF(__pyx_t_2); - __pyx_t_3 = PyByteArray_Resize(__pyx_t_2, 0); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 638, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":636 - * - * cdef object _on_status_complete(self): - * if self._buf: # <<<<<<<<<<<<<< - * self._reason = self._buf.decode('utf-8', 'surrogateescape') - * PyByteArray_Resize(self._buf, 0) - */ - goto __pyx_L3; - } - - /* "aiohttp/_http_parser.pyx":640 - * PyByteArray_Resize(self._buf, 0) - * else: - * self._reason = self._reason or '' # <<<<<<<<<<<<<< - * - * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: - */ - /*else*/ { - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->__pyx_base._reason); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 640, __pyx_L1_error) - if (!__pyx_t_1) { - } else { - __Pyx_INCREF(__pyx_v_self->__pyx_base._reason); - __pyx_t_2 = __pyx_v_self->__pyx_base._reason; - goto __pyx_L4_bool_binop_done; - } - __Pyx_INCREF(__pyx_kp_u__4); - __pyx_t_2 = __pyx_kp_u__4; - __pyx_L4_bool_binop_done:; - __Pyx_GIVEREF(__pyx_t_2); - __Pyx_GOTREF(__pyx_v_self->__pyx_base._reason); - __Pyx_DECREF(__pyx_v_self->__pyx_base._reason); - __pyx_v_self->__pyx_base._reason = ((PyObject*)__pyx_t_2); - __pyx_t_2 = 0; - } - __pyx_L3:; - - /* "aiohttp/_http_parser.pyx":635 - * auto_decompress) - * - * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< - * if self._buf: - * self._reason = self._buf.decode('utf-8', 'surrogateescape') - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser._on_status_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_2__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__reduce_cython__", 0); - - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(1, 2, __pyx_L1_error) - - /* "(tree fragment)":1 - * def __reduce_cython__(self): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_4__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__setstate_cython__", 0); - - /* "(tree fragment)":4 - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(1, 4, __pyx_L1_error) - - /* "(tree fragment)":3 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":642 - * self._reason = self._reason or '' - * - * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< - * cdef HttpParser pyparser = parser.data - * - */ - -static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_begin(llhttp_t *__pyx_v_parser) { - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("cb_on_message_begin", 0); - - /* "aiohttp/_http_parser.pyx":643 - * - * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< - * - * pyparser._started = True - */ - __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); - __Pyx_INCREF(__pyx_t_1); - __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":645 - * cdef HttpParser pyparser = parser.data - * - * pyparser._started = True # <<<<<<<<<<<<<< - * pyparser._headers = CIMultiDict() - * pyparser._raw_headers = [] - */ - __pyx_v_pyparser->_started = 1; - - /* "aiohttp/_http_parser.pyx":646 - * - * pyparser._started = True - * pyparser._headers = CIMultiDict() # <<<<<<<<<<<<<< - * pyparser._raw_headers = [] - * PyByteArray_Resize(pyparser._buf, 0) - */ - __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDict); - __pyx_t_2 = __pyx_v_7aiohttp_12_http_parser_CIMultiDict; __pyx_t_3 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_3)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 646, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v_pyparser->_headers); - __Pyx_DECREF(__pyx_v_pyparser->_headers); - __pyx_v_pyparser->_headers = __pyx_t_1; - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":647 - * pyparser._started = True - * pyparser._headers = CIMultiDict() - * pyparser._raw_headers = [] # <<<<<<<<<<<<<< - * PyByteArray_Resize(pyparser._buf, 0) - * pyparser._path = None - */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 647, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v_pyparser->_raw_headers); - __Pyx_DECREF(__pyx_v_pyparser->_raw_headers); - __pyx_v_pyparser->_raw_headers = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":648 - * pyparser._headers = CIMultiDict() - * pyparser._raw_headers = [] - * PyByteArray_Resize(pyparser._buf, 0) # <<<<<<<<<<<<<< - * pyparser._path = None - * pyparser._reason = None - */ - __pyx_t_1 = __pyx_v_pyparser->_buf; - __Pyx_INCREF(__pyx_t_1); - __pyx_t_4 = PyByteArray_Resize(__pyx_t_1, 0); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(0, 648, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":649 - * pyparser._raw_headers = [] - * PyByteArray_Resize(pyparser._buf, 0) - * pyparser._path = None # <<<<<<<<<<<<<< - * pyparser._reason = None - * return 0 - */ - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - __Pyx_GOTREF(__pyx_v_pyparser->_path); - __Pyx_DECREF(__pyx_v_pyparser->_path); - __pyx_v_pyparser->_path = ((PyObject*)Py_None); - - /* "aiohttp/_http_parser.pyx":650 - * PyByteArray_Resize(pyparser._buf, 0) - * pyparser._path = None - * pyparser._reason = None # <<<<<<<<<<<<<< - * return 0 - * - */ - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - __Pyx_GOTREF(__pyx_v_pyparser->_reason); - __Pyx_DECREF(__pyx_v_pyparser->_reason); - __pyx_v_pyparser->_reason = ((PyObject*)Py_None); - - /* "aiohttp/_http_parser.pyx":651 - * pyparser._path = None - * pyparser._reason = None - * return 0 # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = 0; - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":642 - * self._reason = self._reason or '' - * - * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< - * cdef HttpParser pyparser = parser.data - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_message_begin", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":654 - * - * - * cdef int cb_on_url(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data - */ - -static int __pyx_f_7aiohttp_12_http_parser_cb_on_url(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; - PyObject *__pyx_v_ex = NULL; - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - int __pyx_t_10; - PyObject *__pyx_t_11 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("cb_on_url", 0); - - /* "aiohttp/_http_parser.pyx":656 - * cdef int cb_on_url(cparser.llhttp_t* parser, - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< - * try: - * if length > pyparser._max_line_size: - */ - __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); - __Pyx_INCREF(__pyx_t_1); - __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":657 - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data - * try: # <<<<<<<<<<<<<< - * if length > pyparser._max_line_size: - * raise LineTooLong( - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_4); - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":658 - * cdef HttpParser pyparser = parser.data - * try: - * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< - * raise LineTooLong( - * 'Status line is too long', pyparser._max_line_size, length) - */ - __pyx_t_5 = ((__pyx_v_length > __pyx_v_pyparser->_max_line_size) != 0); - if (unlikely(__pyx_t_5)) { - - /* "aiohttp/_http_parser.pyx":659 - * try: - * if length > pyparser._max_line_size: - * raise LineTooLong( # <<<<<<<<<<<<<< - * 'Status line is too long', pyparser._max_line_size, length) - * extend(pyparser._buf, at, length) - */ - __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 659, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_6); - - /* "aiohttp/_http_parser.pyx":660 - * if length > pyparser._max_line_size: - * raise LineTooLong( - * 'Status line is too long', pyparser._max_line_size, length) # <<<<<<<<<<<<<< - * extend(pyparser._buf, at, length) - * except BaseException as ex: - */ - __pyx_t_7 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_line_size); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 660, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_length); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 660, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_9 = NULL; - __pyx_t_10 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) { - __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_6); - if (likely(__pyx_t_9)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); - __Pyx_INCREF(__pyx_t_9); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_6, function); - __pyx_t_10 = 1; - } - } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_6)) { - PyObject *__pyx_temp[4] = {__pyx_t_9, __pyx_kp_u_Status_line_is_too_long, __pyx_t_7, __pyx_t_8}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_10, 3+__pyx_t_10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 659, __pyx_L3_error) - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { - PyObject *__pyx_temp[4] = {__pyx_t_9, __pyx_kp_u_Status_line_is_too_long, __pyx_t_7, __pyx_t_8}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_10, 3+__pyx_t_10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 659, __pyx_L3_error) - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - } else - #endif - { - __pyx_t_11 = PyTuple_New(3+__pyx_t_10); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 659, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_11); - if (__pyx_t_9) { - __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_9); __pyx_t_9 = NULL; - } - __Pyx_INCREF(__pyx_kp_u_Status_line_is_too_long); - __Pyx_GIVEREF(__pyx_kp_u_Status_line_is_too_long); - PyTuple_SET_ITEM(__pyx_t_11, 0+__pyx_t_10, __pyx_kp_u_Status_line_is_too_long); - __Pyx_GIVEREF(__pyx_t_7); - PyTuple_SET_ITEM(__pyx_t_11, 1+__pyx_t_10, __pyx_t_7); - __Pyx_GIVEREF(__pyx_t_8); - PyTuple_SET_ITEM(__pyx_t_11, 2+__pyx_t_10, __pyx_t_8); - __pyx_t_7 = 0; - __pyx_t_8 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 659, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - } - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(0, 659, __pyx_L3_error) - - /* "aiohttp/_http_parser.pyx":658 - * cdef HttpParser pyparser = parser.data - * try: - * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< - * raise LineTooLong( - * 'Status line is too long', pyparser._max_line_size, length) - */ - } - - /* "aiohttp/_http_parser.pyx":661 - * raise LineTooLong( - * 'Status line is too long', pyparser._max_line_size, length) - * extend(pyparser._buf, at, length) # <<<<<<<<<<<<<< - * except BaseException as ex: - * pyparser._last_error = ex - */ - __pyx_t_1 = __pyx_v_pyparser->_buf; - __Pyx_INCREF(__pyx_t_1); - __pyx_t_6 = __pyx_f_7aiohttp_12_http_parser_extend(__pyx_t_1, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 661, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - - /* "aiohttp/_http_parser.pyx":657 - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data - * try: # <<<<<<<<<<<<<< - * if length > pyparser._max_line_size: - * raise LineTooLong( - */ - } - - /* "aiohttp/_http_parser.pyx":666 - * return -1 - * else: - * return 0 # <<<<<<<<<<<<<< - * - * - */ - /*else:*/ { - __pyx_r = 0; - goto __pyx_L6_except_return; - } - __pyx_L3_error:; - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - - /* "aiohttp/_http_parser.pyx":662 - * 'Status line is too long', pyparser._max_line_size, length) - * extend(pyparser._buf, at, length) - * except BaseException as ex: # <<<<<<<<<<<<<< - * pyparser._last_error = ex - * return -1 - */ - __pyx_t_10 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); - if (__pyx_t_10) { - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_url", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_11) < 0) __PYX_ERR(0, 662, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_t_11); - __Pyx_INCREF(__pyx_t_1); - __pyx_v_ex = __pyx_t_1; - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":663 - * extend(pyparser._buf, at, length) - * except BaseException as ex: - * pyparser._last_error = ex # <<<<<<<<<<<<<< - * return -1 - * else: - */ - __Pyx_INCREF(__pyx_v_ex); - __Pyx_GIVEREF(__pyx_v_ex); - __Pyx_GOTREF(__pyx_v_pyparser->_last_error); - __Pyx_DECREF(__pyx_v_pyparser->_last_error); - __pyx_v_pyparser->_last_error = __pyx_v_ex; - - /* "aiohttp/_http_parser.pyx":664 - * except BaseException as ex: - * pyparser._last_error = ex - * return -1 # <<<<<<<<<<<<<< - * else: - * return 0 - */ - __pyx_r = -1; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - goto __pyx_L14_return; - } - - /* "aiohttp/_http_parser.pyx":662 - * 'Status line is too long', pyparser._max_line_size, length) - * extend(pyparser._buf, at, length) - * except BaseException as ex: # <<<<<<<<<<<<<< - * pyparser._last_error = ex - * return -1 - */ - /*finally:*/ { - __pyx_L14_return: { - __pyx_t_10 = __pyx_r; - __Pyx_DECREF(__pyx_v_ex); - __pyx_v_ex = NULL; - __pyx_r = __pyx_t_10; - goto __pyx_L6_except_return; - } - } - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "aiohttp/_http_parser.pyx":657 - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data - * try: # <<<<<<<<<<<<<< - * if length > pyparser._max_line_size: - * raise LineTooLong( - */ - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L1_error; - __pyx_L6_except_return:; - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L0; - } - - /* "aiohttp/_http_parser.pyx":654 - * - * - * cdef int cb_on_url(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_XDECREF(__pyx_t_11); - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_url", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); - __Pyx_XDECREF(__pyx_v_ex); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":669 - * - * - * cdef int cb_on_status(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data - */ - -static int __pyx_f_7aiohttp_12_http_parser_cb_on_status(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; - PyObject *__pyx_v_ex = NULL; - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - int __pyx_t_10; - PyObject *__pyx_t_11 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("cb_on_status", 0); - - /* "aiohttp/_http_parser.pyx":671 - * cdef int cb_on_status(cparser.llhttp_t* parser, - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< - * cdef str reason - * try: - */ - __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); - __Pyx_INCREF(__pyx_t_1); - __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":673 - * cdef HttpParser pyparser = parser.data - * cdef str reason - * try: # <<<<<<<<<<<<<< - * if length > pyparser._max_line_size: - * raise LineTooLong( - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_4); - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":674 - * cdef str reason - * try: - * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< - * raise LineTooLong( - * 'Status line is too long', pyparser._max_line_size, length) - */ - __pyx_t_5 = ((__pyx_v_length > __pyx_v_pyparser->_max_line_size) != 0); - if (unlikely(__pyx_t_5)) { - - /* "aiohttp/_http_parser.pyx":675 - * try: - * if length > pyparser._max_line_size: - * raise LineTooLong( # <<<<<<<<<<<<<< - * 'Status line is too long', pyparser._max_line_size, length) - * extend(pyparser._buf, at, length) - */ - __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 675, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_6); - - /* "aiohttp/_http_parser.pyx":676 - * if length > pyparser._max_line_size: - * raise LineTooLong( - * 'Status line is too long', pyparser._max_line_size, length) # <<<<<<<<<<<<<< - * extend(pyparser._buf, at, length) - * except BaseException as ex: - */ - __pyx_t_7 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_line_size); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 676, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_length); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 676, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_9 = NULL; - __pyx_t_10 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) { - __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_6); - if (likely(__pyx_t_9)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); - __Pyx_INCREF(__pyx_t_9); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_6, function); - __pyx_t_10 = 1; - } - } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_6)) { - PyObject *__pyx_temp[4] = {__pyx_t_9, __pyx_kp_u_Status_line_is_too_long, __pyx_t_7, __pyx_t_8}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_10, 3+__pyx_t_10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 675, __pyx_L3_error) - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { - PyObject *__pyx_temp[4] = {__pyx_t_9, __pyx_kp_u_Status_line_is_too_long, __pyx_t_7, __pyx_t_8}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_10, 3+__pyx_t_10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 675, __pyx_L3_error) - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - } else - #endif - { - __pyx_t_11 = PyTuple_New(3+__pyx_t_10); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 675, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_11); - if (__pyx_t_9) { - __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_9); __pyx_t_9 = NULL; - } - __Pyx_INCREF(__pyx_kp_u_Status_line_is_too_long); - __Pyx_GIVEREF(__pyx_kp_u_Status_line_is_too_long); - PyTuple_SET_ITEM(__pyx_t_11, 0+__pyx_t_10, __pyx_kp_u_Status_line_is_too_long); - __Pyx_GIVEREF(__pyx_t_7); - PyTuple_SET_ITEM(__pyx_t_11, 1+__pyx_t_10, __pyx_t_7); - __Pyx_GIVEREF(__pyx_t_8); - PyTuple_SET_ITEM(__pyx_t_11, 2+__pyx_t_10, __pyx_t_8); - __pyx_t_7 = 0; - __pyx_t_8 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 675, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - } - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(0, 675, __pyx_L3_error) - - /* "aiohttp/_http_parser.pyx":674 - * cdef str reason - * try: - * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< - * raise LineTooLong( - * 'Status line is too long', pyparser._max_line_size, length) - */ - } - - /* "aiohttp/_http_parser.pyx":677 - * raise LineTooLong( - * 'Status line is too long', pyparser._max_line_size, length) - * extend(pyparser._buf, at, length) # <<<<<<<<<<<<<< - * except BaseException as ex: - * pyparser._last_error = ex - */ - __pyx_t_1 = __pyx_v_pyparser->_buf; - __Pyx_INCREF(__pyx_t_1); - __pyx_t_6 = __pyx_f_7aiohttp_12_http_parser_extend(__pyx_t_1, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 677, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - - /* "aiohttp/_http_parser.pyx":673 - * cdef HttpParser pyparser = parser.data - * cdef str reason - * try: # <<<<<<<<<<<<<< - * if length > pyparser._max_line_size: - * raise LineTooLong( - */ - } - - /* "aiohttp/_http_parser.pyx":682 - * return -1 - * else: - * return 0 # <<<<<<<<<<<<<< - * - * - */ - /*else:*/ { - __pyx_r = 0; - goto __pyx_L6_except_return; - } - __pyx_L3_error:; - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - - /* "aiohttp/_http_parser.pyx":678 - * 'Status line is too long', pyparser._max_line_size, length) - * extend(pyparser._buf, at, length) - * except BaseException as ex: # <<<<<<<<<<<<<< - * pyparser._last_error = ex - * return -1 - */ - __pyx_t_10 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); - if (__pyx_t_10) { - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_status", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_11) < 0) __PYX_ERR(0, 678, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_t_11); - __Pyx_INCREF(__pyx_t_1); - __pyx_v_ex = __pyx_t_1; - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":679 - * extend(pyparser._buf, at, length) - * except BaseException as ex: - * pyparser._last_error = ex # <<<<<<<<<<<<<< - * return -1 - * else: - */ - __Pyx_INCREF(__pyx_v_ex); - __Pyx_GIVEREF(__pyx_v_ex); - __Pyx_GOTREF(__pyx_v_pyparser->_last_error); - __Pyx_DECREF(__pyx_v_pyparser->_last_error); - __pyx_v_pyparser->_last_error = __pyx_v_ex; - - /* "aiohttp/_http_parser.pyx":680 - * except BaseException as ex: - * pyparser._last_error = ex - * return -1 # <<<<<<<<<<<<<< - * else: - * return 0 - */ - __pyx_r = -1; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - goto __pyx_L14_return; - } - - /* "aiohttp/_http_parser.pyx":678 - * 'Status line is too long', pyparser._max_line_size, length) - * extend(pyparser._buf, at, length) - * except BaseException as ex: # <<<<<<<<<<<<<< - * pyparser._last_error = ex - * return -1 - */ - /*finally:*/ { - __pyx_L14_return: { - __pyx_t_10 = __pyx_r; - __Pyx_DECREF(__pyx_v_ex); - __pyx_v_ex = NULL; - __pyx_r = __pyx_t_10; - goto __pyx_L6_except_return; - } - } - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "aiohttp/_http_parser.pyx":673 - * cdef HttpParser pyparser = parser.data - * cdef str reason - * try: # <<<<<<<<<<<<<< - * if length > pyparser._max_line_size: - * raise LineTooLong( - */ - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L1_error; - __pyx_L6_except_return:; - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L0; - } - - /* "aiohttp/_http_parser.pyx":669 - * - * - * cdef int cb_on_status(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_XDECREF(__pyx_t_11); - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_status", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); - __Pyx_XDECREF(__pyx_v_ex); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":685 - * - * - * cdef int cb_on_header_field(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data - */ - -static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_field(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; - Py_ssize_t __pyx_v_size; - PyObject *__pyx_v_ex = NULL; - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - Py_ssize_t __pyx_t_5; - int __pyx_t_6; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - PyObject *__pyx_t_10 = NULL; - int __pyx_t_11; - PyObject *__pyx_t_12 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("cb_on_header_field", 0); - - /* "aiohttp/_http_parser.pyx":687 - * cdef int cb_on_header_field(cparser.llhttp_t* parser, - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< - * cdef Py_ssize_t size - * try: - */ - __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); - __Pyx_INCREF(__pyx_t_1); - __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":689 - * cdef HttpParser pyparser = parser.data - * cdef Py_ssize_t size - * try: # <<<<<<<<<<<<<< - * pyparser._on_status_complete() - * size = len(pyparser._raw_name) + length - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_4); - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":690 - * cdef Py_ssize_t size - * try: - * pyparser._on_status_complete() # <<<<<<<<<<<<<< - * size = len(pyparser._raw_name) + length - * if size > pyparser._max_field_size: - */ - __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_status_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 690, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":691 - * try: - * pyparser._on_status_complete() - * size = len(pyparser._raw_name) + length # <<<<<<<<<<<<<< - * if size > pyparser._max_field_size: - * raise LineTooLong( - */ - __pyx_t_1 = __pyx_v_pyparser->_raw_name; - __Pyx_INCREF(__pyx_t_1); - if (unlikely(__pyx_t_1 == Py_None)) { - PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); - __PYX_ERR(0, 691, __pyx_L3_error) - } - __pyx_t_5 = PyByteArray_GET_SIZE(__pyx_t_1); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 691, __pyx_L3_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_size = (__pyx_t_5 + __pyx_v_length); - - /* "aiohttp/_http_parser.pyx":692 - * pyparser._on_status_complete() - * size = len(pyparser._raw_name) + length - * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< - * raise LineTooLong( - * 'Header name is too long', pyparser._max_field_size, size) - */ - __pyx_t_6 = ((__pyx_v_size > __pyx_v_pyparser->_max_field_size) != 0); - if (unlikely(__pyx_t_6)) { - - /* "aiohttp/_http_parser.pyx":693 - * size = len(pyparser._raw_name) + length - * if size > pyparser._max_field_size: - * raise LineTooLong( # <<<<<<<<<<<<<< - * 'Header name is too long', pyparser._max_field_size, size) - * pyparser._on_header_field(at, length) - */ - __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 693, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_7); - - /* "aiohttp/_http_parser.pyx":694 - * if size > pyparser._max_field_size: - * raise LineTooLong( - * 'Header name is too long', pyparser._max_field_size, size) # <<<<<<<<<<<<<< - * pyparser._on_header_field(at, length) - * except BaseException as ex: - */ - __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_field_size); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 694, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_9 = PyInt_FromSsize_t(__pyx_v_size); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 694, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_10 = NULL; - __pyx_t_11 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) { - __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_7); - if (likely(__pyx_t_10)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); - __Pyx_INCREF(__pyx_t_10); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_7, function); - __pyx_t_11 = 1; - } - } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_7)) { - PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_kp_u_Header_name_is_too_long, __pyx_t_8, __pyx_t_9}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_11, 3+__pyx_t_11); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 693, __pyx_L3_error) - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { - PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_kp_u_Header_name_is_too_long, __pyx_t_8, __pyx_t_9}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_11, 3+__pyx_t_11); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 693, __pyx_L3_error) - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } else - #endif - { - __pyx_t_12 = PyTuple_New(3+__pyx_t_11); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 693, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_12); - if (__pyx_t_10) { - __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_10); __pyx_t_10 = NULL; - } - __Pyx_INCREF(__pyx_kp_u_Header_name_is_too_long); - __Pyx_GIVEREF(__pyx_kp_u_Header_name_is_too_long); - PyTuple_SET_ITEM(__pyx_t_12, 0+__pyx_t_11, __pyx_kp_u_Header_name_is_too_long); - __Pyx_GIVEREF(__pyx_t_8); - PyTuple_SET_ITEM(__pyx_t_12, 1+__pyx_t_11, __pyx_t_8); - __Pyx_GIVEREF(__pyx_t_9); - PyTuple_SET_ITEM(__pyx_t_12, 2+__pyx_t_11, __pyx_t_9); - __pyx_t_8 = 0; - __pyx_t_9 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 693, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; - } - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(0, 693, __pyx_L3_error) - - /* "aiohttp/_http_parser.pyx":692 - * pyparser._on_status_complete() - * size = len(pyparser._raw_name) + length - * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< - * raise LineTooLong( - * 'Header name is too long', pyparser._max_field_size, size) - */ - } - - /* "aiohttp/_http_parser.pyx":695 - * raise LineTooLong( - * 'Header name is too long', pyparser._max_field_size, size) - * pyparser._on_header_field(at, length) # <<<<<<<<<<<<<< - * except BaseException as ex: - * pyparser._last_error = ex - */ - __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_header_field(__pyx_v_pyparser, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 695, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":689 - * cdef HttpParser pyparser = parser.data - * cdef Py_ssize_t size - * try: # <<<<<<<<<<<<<< - * pyparser._on_status_complete() - * size = len(pyparser._raw_name) + length - */ - } - - /* "aiohttp/_http_parser.pyx":700 - * return -1 - * else: - * return 0 # <<<<<<<<<<<<<< - * - * - */ - /*else:*/ { - __pyx_r = 0; - goto __pyx_L6_except_return; - } - __pyx_L3_error:; - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - - /* "aiohttp/_http_parser.pyx":696 - * 'Header name is too long', pyparser._max_field_size, size) - * pyparser._on_header_field(at, length) - * except BaseException as ex: # <<<<<<<<<<<<<< - * pyparser._last_error = ex - * return -1 - */ - __pyx_t_11 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); - if (__pyx_t_11) { - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_field", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_7, &__pyx_t_12) < 0) __PYX_ERR(0, 696, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_t_7); - __Pyx_GOTREF(__pyx_t_12); - __Pyx_INCREF(__pyx_t_7); - __pyx_v_ex = __pyx_t_7; - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":697 - * pyparser._on_header_field(at, length) - * except BaseException as ex: - * pyparser._last_error = ex # <<<<<<<<<<<<<< - * return -1 - * else: - */ - __Pyx_INCREF(__pyx_v_ex); - __Pyx_GIVEREF(__pyx_v_ex); - __Pyx_GOTREF(__pyx_v_pyparser->_last_error); - __Pyx_DECREF(__pyx_v_pyparser->_last_error); - __pyx_v_pyparser->_last_error = __pyx_v_ex; - - /* "aiohttp/_http_parser.pyx":698 - * except BaseException as ex: - * pyparser._last_error = ex - * return -1 # <<<<<<<<<<<<<< - * else: - * return 0 - */ - __pyx_r = -1; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; - goto __pyx_L14_return; - } - - /* "aiohttp/_http_parser.pyx":696 - * 'Header name is too long', pyparser._max_field_size, size) - * pyparser._on_header_field(at, length) - * except BaseException as ex: # <<<<<<<<<<<<<< - * pyparser._last_error = ex - * return -1 - */ - /*finally:*/ { - __pyx_L14_return: { - __pyx_t_11 = __pyx_r; - __Pyx_DECREF(__pyx_v_ex); - __pyx_v_ex = NULL; - __pyx_r = __pyx_t_11; - goto __pyx_L6_except_return; - } - } - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "aiohttp/_http_parser.pyx":689 - * cdef HttpParser pyparser = parser.data - * cdef Py_ssize_t size - * try: # <<<<<<<<<<<<<< - * pyparser._on_status_complete() - * size = len(pyparser._raw_name) + length - */ - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L1_error; - __pyx_L6_except_return:; - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L0; - } - - /* "aiohttp/_http_parser.pyx":685 - * - * - * cdef int cb_on_header_field(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_XDECREF(__pyx_t_12); - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_field", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); - __Pyx_XDECREF(__pyx_v_ex); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":703 - * - * - * cdef int cb_on_header_value(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data - */ - -static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_value(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; - Py_ssize_t __pyx_v_size; - PyObject *__pyx_v_ex = NULL; - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - Py_ssize_t __pyx_t_5; - int __pyx_t_6; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - PyObject *__pyx_t_10 = NULL; - int __pyx_t_11; - PyObject *__pyx_t_12 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("cb_on_header_value", 0); - - /* "aiohttp/_http_parser.pyx":705 - * cdef int cb_on_header_value(cparser.llhttp_t* parser, - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< - * cdef Py_ssize_t size - * try: - */ - __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); - __Pyx_INCREF(__pyx_t_1); - __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":707 - * cdef HttpParser pyparser = parser.data - * cdef Py_ssize_t size - * try: # <<<<<<<<<<<<<< - * size = len(pyparser._raw_value) + length - * if size > pyparser._max_field_size: - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_4); - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":708 - * cdef Py_ssize_t size - * try: - * size = len(pyparser._raw_value) + length # <<<<<<<<<<<<<< - * if size > pyparser._max_field_size: - * raise LineTooLong( - */ - __pyx_t_1 = __pyx_v_pyparser->_raw_value; - __Pyx_INCREF(__pyx_t_1); - if (unlikely(__pyx_t_1 == Py_None)) { - PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); - __PYX_ERR(0, 708, __pyx_L3_error) - } - __pyx_t_5 = PyByteArray_GET_SIZE(__pyx_t_1); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 708, __pyx_L3_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_size = (__pyx_t_5 + __pyx_v_length); - - /* "aiohttp/_http_parser.pyx":709 - * try: - * size = len(pyparser._raw_value) + length - * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< - * raise LineTooLong( - * 'Header value is too long', pyparser._max_field_size, size) - */ - __pyx_t_6 = ((__pyx_v_size > __pyx_v_pyparser->_max_field_size) != 0); - if (unlikely(__pyx_t_6)) { - - /* "aiohttp/_http_parser.pyx":710 - * size = len(pyparser._raw_value) + length - * if size > pyparser._max_field_size: - * raise LineTooLong( # <<<<<<<<<<<<<< - * 'Header value is too long', pyparser._max_field_size, size) - * pyparser._on_header_value(at, length) - */ - __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 710, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_7); - - /* "aiohttp/_http_parser.pyx":711 - * if size > pyparser._max_field_size: - * raise LineTooLong( - * 'Header value is too long', pyparser._max_field_size, size) # <<<<<<<<<<<<<< - * pyparser._on_header_value(at, length) - * except BaseException as ex: - */ - __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_field_size); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 711, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_9 = PyInt_FromSsize_t(__pyx_v_size); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 711, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_10 = NULL; - __pyx_t_11 = 0; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) { - __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_7); - if (likely(__pyx_t_10)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); - __Pyx_INCREF(__pyx_t_10); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_7, function); - __pyx_t_11 = 1; - } - } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_7)) { - PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_kp_u_Header_value_is_too_long, __pyx_t_8, __pyx_t_9}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_11, 3+__pyx_t_11); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 710, __pyx_L3_error) - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { - PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_kp_u_Header_value_is_too_long, __pyx_t_8, __pyx_t_9}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_11, 3+__pyx_t_11); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 710, __pyx_L3_error) - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } else - #endif - { - __pyx_t_12 = PyTuple_New(3+__pyx_t_11); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 710, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_12); - if (__pyx_t_10) { - __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_10); __pyx_t_10 = NULL; - } - __Pyx_INCREF(__pyx_kp_u_Header_value_is_too_long); - __Pyx_GIVEREF(__pyx_kp_u_Header_value_is_too_long); - PyTuple_SET_ITEM(__pyx_t_12, 0+__pyx_t_11, __pyx_kp_u_Header_value_is_too_long); - __Pyx_GIVEREF(__pyx_t_8); - PyTuple_SET_ITEM(__pyx_t_12, 1+__pyx_t_11, __pyx_t_8); - __Pyx_GIVEREF(__pyx_t_9); - PyTuple_SET_ITEM(__pyx_t_12, 2+__pyx_t_11, __pyx_t_9); - __pyx_t_8 = 0; - __pyx_t_9 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 710, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; - } - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(0, 710, __pyx_L3_error) - - /* "aiohttp/_http_parser.pyx":709 - * try: - * size = len(pyparser._raw_value) + length - * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< - * raise LineTooLong( - * 'Header value is too long', pyparser._max_field_size, size) - */ - } - - /* "aiohttp/_http_parser.pyx":712 - * raise LineTooLong( - * 'Header value is too long', pyparser._max_field_size, size) - * pyparser._on_header_value(at, length) # <<<<<<<<<<<<<< - * except BaseException as ex: - * pyparser._last_error = ex - */ - __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_header_value(__pyx_v_pyparser, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 712, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":707 - * cdef HttpParser pyparser = parser.data - * cdef Py_ssize_t size - * try: # <<<<<<<<<<<<<< - * size = len(pyparser._raw_value) + length - * if size > pyparser._max_field_size: - */ - } - - /* "aiohttp/_http_parser.pyx":717 - * return -1 - * else: - * return 0 # <<<<<<<<<<<<<< - * - * - */ - /*else:*/ { - __pyx_r = 0; - goto __pyx_L6_except_return; - } - __pyx_L3_error:; - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; - __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - - /* "aiohttp/_http_parser.pyx":713 - * 'Header value is too long', pyparser._max_field_size, size) - * pyparser._on_header_value(at, length) - * except BaseException as ex: # <<<<<<<<<<<<<< - * pyparser._last_error = ex - * return -1 - */ - __pyx_t_11 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); - if (__pyx_t_11) { - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_value", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_7, &__pyx_t_12) < 0) __PYX_ERR(0, 713, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_t_7); - __Pyx_GOTREF(__pyx_t_12); - __Pyx_INCREF(__pyx_t_7); - __pyx_v_ex = __pyx_t_7; - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":714 - * pyparser._on_header_value(at, length) - * except BaseException as ex: - * pyparser._last_error = ex # <<<<<<<<<<<<<< - * return -1 - * else: - */ - __Pyx_INCREF(__pyx_v_ex); - __Pyx_GIVEREF(__pyx_v_ex); - __Pyx_GOTREF(__pyx_v_pyparser->_last_error); - __Pyx_DECREF(__pyx_v_pyparser->_last_error); - __pyx_v_pyparser->_last_error = __pyx_v_ex; - - /* "aiohttp/_http_parser.pyx":715 - * except BaseException as ex: - * pyparser._last_error = ex - * return -1 # <<<<<<<<<<<<<< - * else: - * return 0 - */ - __pyx_r = -1; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; - goto __pyx_L14_return; - } - - /* "aiohttp/_http_parser.pyx":713 - * 'Header value is too long', pyparser._max_field_size, size) - * pyparser._on_header_value(at, length) - * except BaseException as ex: # <<<<<<<<<<<<<< - * pyparser._last_error = ex - * return -1 - */ - /*finally:*/ { - __pyx_L14_return: { - __pyx_t_11 = __pyx_r; - __Pyx_DECREF(__pyx_v_ex); - __pyx_v_ex = NULL; - __pyx_r = __pyx_t_11; - goto __pyx_L6_except_return; - } - } - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "aiohttp/_http_parser.pyx":707 - * cdef HttpParser pyparser = parser.data - * cdef Py_ssize_t size - * try: # <<<<<<<<<<<<<< - * size = len(pyparser._raw_value) + length - * if size > pyparser._max_field_size: - */ - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L1_error; - __pyx_L6_except_return:; - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L0; - } - - /* "aiohttp/_http_parser.pyx":703 - * - * - * cdef int cb_on_header_value(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_XDECREF(__pyx_t_12); - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_value", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); - __Pyx_XDECREF(__pyx_v_ex); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":720 - * - * - * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< - * cdef HttpParser pyparser = parser.data - * try: - */ - -static int __pyx_f_7aiohttp_12_http_parser_cb_on_headers_complete(llhttp_t *__pyx_v_parser) { - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; - PyObject *__pyx_v_exc = NULL; - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; - int __pyx_t_6; - int __pyx_t_7; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("cb_on_headers_complete", 0); - - /* "aiohttp/_http_parser.pyx":721 - * - * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< - * try: - * pyparser._on_status_complete() - */ - __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); - __Pyx_INCREF(__pyx_t_1); - __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":722 - * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data - * try: # <<<<<<<<<<<<<< - * pyparser._on_status_complete() - * pyparser._on_headers_complete() - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_4); - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":723 - * cdef HttpParser pyparser = parser.data - * try: - * pyparser._on_status_complete() # <<<<<<<<<<<<<< - * pyparser._on_headers_complete() - * except BaseException as exc: - */ - __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_status_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 723, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":724 - * try: - * pyparser._on_status_complete() - * pyparser._on_headers_complete() # <<<<<<<<<<<<<< - * except BaseException as exc: - * pyparser._last_error = exc - */ - __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_headers_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 724, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":722 - * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data - * try: # <<<<<<<<<<<<<< - * pyparser._on_status_complete() - * pyparser._on_headers_complete() - */ - } - - /* "aiohttp/_http_parser.pyx":729 - * return -1 - * else: - * if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT # <<<<<<<<<<<<<< - * return 2 - * else: - */ - /*else:*/ { - __pyx_t_6 = (__pyx_v_pyparser->_cparser->upgrade != 0); - if (!__pyx_t_6) { - } else { - __pyx_t_5 = __pyx_t_6; - goto __pyx_L10_bool_binop_done; - } - __pyx_t_6 = ((__pyx_v_pyparser->_cparser->method == 5) != 0); - __pyx_t_5 = __pyx_t_6; - __pyx_L10_bool_binop_done:; - if (__pyx_t_5) { - - /* "aiohttp/_http_parser.pyx":730 - * else: - * if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT - * return 2 # <<<<<<<<<<<<<< - * else: - * return 0 - */ - __pyx_r = 2; - goto __pyx_L6_except_return; - - /* "aiohttp/_http_parser.pyx":729 - * return -1 - * else: - * if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT # <<<<<<<<<<<<<< - * return 2 - * else: - */ - } - - /* "aiohttp/_http_parser.pyx":732 - * return 2 - * else: - * return 0 # <<<<<<<<<<<<<< - * - * - */ - /*else*/ { - __pyx_r = 0; - goto __pyx_L6_except_return; - } - } - __pyx_L3_error:; - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":725 - * pyparser._on_status_complete() - * pyparser._on_headers_complete() - * except BaseException as exc: # <<<<<<<<<<<<<< - * pyparser._last_error = exc - * return -1 - */ - __pyx_t_7 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); - if (__pyx_t_7) { - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_headers_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_8, &__pyx_t_9) < 0) __PYX_ERR(0, 725, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_t_8); - __Pyx_GOTREF(__pyx_t_9); - __Pyx_INCREF(__pyx_t_8); - __pyx_v_exc = __pyx_t_8; - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":726 - * pyparser._on_headers_complete() - * except BaseException as exc: - * pyparser._last_error = exc # <<<<<<<<<<<<<< - * return -1 - * else: - */ - __Pyx_INCREF(__pyx_v_exc); - __Pyx_GIVEREF(__pyx_v_exc); - __Pyx_GOTREF(__pyx_v_pyparser->_last_error); - __Pyx_DECREF(__pyx_v_pyparser->_last_error); - __pyx_v_pyparser->_last_error = __pyx_v_exc; - - /* "aiohttp/_http_parser.pyx":727 - * except BaseException as exc: - * pyparser._last_error = exc - * return -1 # <<<<<<<<<<<<<< - * else: - * if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT - */ - __pyx_r = -1; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - goto __pyx_L16_return; - } - - /* "aiohttp/_http_parser.pyx":725 - * pyparser._on_status_complete() - * pyparser._on_headers_complete() - * except BaseException as exc: # <<<<<<<<<<<<<< - * pyparser._last_error = exc - * return -1 - */ - /*finally:*/ { - __pyx_L16_return: { - __pyx_t_7 = __pyx_r; - __Pyx_DECREF(__pyx_v_exc); - __pyx_v_exc = NULL; - __pyx_r = __pyx_t_7; - goto __pyx_L6_except_return; - } - } - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "aiohttp/_http_parser.pyx":722 - * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data - * try: # <<<<<<<<<<<<<< - * pyparser._on_status_complete() - * pyparser._on_headers_complete() - */ - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L1_error; - __pyx_L6_except_return:; - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L0; - } - - /* "aiohttp/_http_parser.pyx":720 - * - * - * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< - * cdef HttpParser pyparser = parser.data - * try: - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_headers_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); - __Pyx_XDECREF(__pyx_v_exc); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":735 - * - * - * cdef int cb_on_body(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data - */ - -static int __pyx_f_7aiohttp_12_http_parser_cb_on_body(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; - PyObject *__pyx_v_body = 0; - PyObject *__pyx_v_exc = NULL; - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - int __pyx_t_8; - PyObject *__pyx_t_9 = NULL; - int __pyx_t_10; - int __pyx_t_11; - PyObject *__pyx_t_12 = NULL; - PyObject *__pyx_t_13 = NULL; - PyObject *__pyx_t_14 = NULL; - PyObject *__pyx_t_15 = NULL; - int __pyx_t_16; - char const *__pyx_t_17; - PyObject *__pyx_t_18 = NULL; - PyObject *__pyx_t_19 = NULL; - PyObject *__pyx_t_20 = NULL; - PyObject *__pyx_t_21 = NULL; - PyObject *__pyx_t_22 = NULL; - PyObject *__pyx_t_23 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("cb_on_body", 0); - - /* "aiohttp/_http_parser.pyx":737 - * cdef int cb_on_body(cparser.llhttp_t* parser, - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< - * cdef bytes body = at[:length] - * try: - */ - __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); - __Pyx_INCREF(__pyx_t_1); - __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":738 - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data - * cdef bytes body = at[:length] # <<<<<<<<<<<<<< - * try: - * pyparser._payload.feed_data(body, length) - */ - __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_at + 0, __pyx_v_length - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 738, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_body = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":739 - * cdef HttpParser pyparser = parser.data - * cdef bytes body = at[:length] - * try: # <<<<<<<<<<<<<< - * pyparser._payload.feed_data(body, length) - * except BaseException as exc: - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_4); - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":740 - * cdef bytes body = at[:length] - * try: - * pyparser._payload.feed_data(body, length) # <<<<<<<<<<<<<< - * except BaseException as exc: - * if pyparser._payload_exception is not None: - */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_pyparser->_payload, __pyx_n_s_feed_data); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 740, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = __Pyx_PyInt_FromSize_t(__pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 740, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = NULL; - __pyx_t_8 = 0; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { - __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); - if (likely(__pyx_t_7)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); - __Pyx_INCREF(__pyx_t_7); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_5, function); - __pyx_t_8 = 1; - } - } - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_v_body, __pyx_t_6}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 740, __pyx_L3_error) - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } else - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_v_body, __pyx_t_6}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 740, __pyx_L3_error) - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } else - #endif - { - __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 740, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_9); - if (__pyx_t_7) { - __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL; - } - __Pyx_INCREF(__pyx_v_body); - __Pyx_GIVEREF(__pyx_v_body); - PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, __pyx_v_body); - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_t_6); - __pyx_t_6 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 740, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - } - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":739 - * cdef HttpParser pyparser = parser.data - * cdef bytes body = at[:length] - * try: # <<<<<<<<<<<<<< - * pyparser._payload.feed_data(body, length) - * except BaseException as exc: - */ - } - - /* "aiohttp/_http_parser.pyx":749 - * return -1 - * else: - * return 0 # <<<<<<<<<<<<<< - * - * - */ - /*else:*/ { - __pyx_r = 0; - goto __pyx_L6_except_return; - } - __pyx_L3_error:; - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - - /* "aiohttp/_http_parser.pyx":741 - * try: - * pyparser._payload.feed_data(body, length) - * except BaseException as exc: # <<<<<<<<<<<<<< - * if pyparser._payload_exception is not None: - * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) - */ - __pyx_t_8 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); - if (__pyx_t_8) { - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_body", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_5, &__pyx_t_9) < 0) __PYX_ERR(0, 741, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GOTREF(__pyx_t_9); - __Pyx_INCREF(__pyx_t_5); - __pyx_v_exc = __pyx_t_5; - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":742 - * pyparser._payload.feed_data(body, length) - * except BaseException as exc: - * if pyparser._payload_exception is not None: # <<<<<<<<<<<<<< - * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) - * else: - */ - __pyx_t_10 = (__pyx_v_pyparser->_payload_exception != Py_None); - __pyx_t_11 = (__pyx_t_10 != 0); - if (__pyx_t_11) { - - /* "aiohttp/_http_parser.pyx":743 - * except BaseException as exc: - * if pyparser._payload_exception is not None: - * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) # <<<<<<<<<<<<<< - * else: - * pyparser._payload.set_exception(exc) - */ - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_pyparser->_payload, __pyx_n_s_set_exception); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 743, __pyx_L14_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_13 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_exc); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 743, __pyx_L14_error) - __Pyx_GOTREF(__pyx_t_13); - __Pyx_INCREF(__pyx_v_pyparser->_payload_exception); - __pyx_t_14 = __pyx_v_pyparser->_payload_exception; __pyx_t_15 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_14))) { - __pyx_t_15 = PyMethod_GET_SELF(__pyx_t_14); - if (likely(__pyx_t_15)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_14); - __Pyx_INCREF(__pyx_t_15); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_14, function); - } - } - __pyx_t_12 = (__pyx_t_15) ? __Pyx_PyObject_Call2Args(__pyx_t_14, __pyx_t_15, __pyx_t_13) : __Pyx_PyObject_CallOneArg(__pyx_t_14, __pyx_t_13); - __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; - __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; - if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 743, __pyx_L14_error) - __Pyx_GOTREF(__pyx_t_12); - __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; - __pyx_t_14 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { - __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_7); - if (likely(__pyx_t_14)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); - __Pyx_INCREF(__pyx_t_14); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_7, function); - } - } - __pyx_t_6 = (__pyx_t_14) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_14, __pyx_t_12) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_12); - __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; - __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; - if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 743, __pyx_L14_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - - /* "aiohttp/_http_parser.pyx":742 - * pyparser._payload.feed_data(body, length) - * except BaseException as exc: - * if pyparser._payload_exception is not None: # <<<<<<<<<<<<<< - * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) - * else: - */ - goto __pyx_L16; - } - - /* "aiohttp/_http_parser.pyx":745 - * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) - * else: - * pyparser._payload.set_exception(exc) # <<<<<<<<<<<<<< - * pyparser._payload_error = 1 - * return -1 - */ - /*else*/ { - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_pyparser->_payload, __pyx_n_s_set_exception); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 745, __pyx_L14_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_12 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { - __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_7); - if (likely(__pyx_t_12)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); - __Pyx_INCREF(__pyx_t_12); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_7, function); - } - } - __pyx_t_6 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_12, __pyx_v_exc) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_v_exc); - __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; - if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 745, __pyx_L14_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } - __pyx_L16:; - - /* "aiohttp/_http_parser.pyx":746 - * else: - * pyparser._payload.set_exception(exc) - * pyparser._payload_error = 1 # <<<<<<<<<<<<<< - * return -1 - * else: - */ - __pyx_v_pyparser->_payload_error = 1; - - /* "aiohttp/_http_parser.pyx":747 - * pyparser._payload.set_exception(exc) - * pyparser._payload_error = 1 - * return -1 # <<<<<<<<<<<<<< - * else: - * return 0 - */ - __pyx_r = -1; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - goto __pyx_L13_return; - } - - /* "aiohttp/_http_parser.pyx":741 - * try: - * pyparser._payload.feed_data(body, length) - * except BaseException as exc: # <<<<<<<<<<<<<< - * if pyparser._payload_exception is not None: - * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) - */ - /*finally:*/ { - __pyx_L14_error:; - /*exception exit:*/{ - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0; __pyx_t_23 = 0; - __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; - __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; - __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; - __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_21, &__pyx_t_22, &__pyx_t_23); - if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_18, &__pyx_t_19, &__pyx_t_20) < 0)) __Pyx_ErrFetch(&__pyx_t_18, &__pyx_t_19, &__pyx_t_20); - __Pyx_XGOTREF(__pyx_t_18); - __Pyx_XGOTREF(__pyx_t_19); - __Pyx_XGOTREF(__pyx_t_20); - __Pyx_XGOTREF(__pyx_t_21); - __Pyx_XGOTREF(__pyx_t_22); - __Pyx_XGOTREF(__pyx_t_23); - __pyx_t_8 = __pyx_lineno; __pyx_t_16 = __pyx_clineno; __pyx_t_17 = __pyx_filename; - { - __Pyx_DECREF(__pyx_v_exc); - __pyx_v_exc = NULL; - } - if (PY_MAJOR_VERSION >= 3) { - __Pyx_XGIVEREF(__pyx_t_21); - __Pyx_XGIVEREF(__pyx_t_22); - __Pyx_XGIVEREF(__pyx_t_23); - __Pyx_ExceptionReset(__pyx_t_21, __pyx_t_22, __pyx_t_23); - } - __Pyx_XGIVEREF(__pyx_t_18); - __Pyx_XGIVEREF(__pyx_t_19); - __Pyx_XGIVEREF(__pyx_t_20); - __Pyx_ErrRestore(__pyx_t_18, __pyx_t_19, __pyx_t_20); - __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0; __pyx_t_23 = 0; - __pyx_lineno = __pyx_t_8; __pyx_clineno = __pyx_t_16; __pyx_filename = __pyx_t_17; - goto __pyx_L5_except_error; - } - __pyx_L13_return: { - __pyx_t_16 = __pyx_r; - __Pyx_DECREF(__pyx_v_exc); - __pyx_v_exc = NULL; - __pyx_r = __pyx_t_16; - goto __pyx_L6_except_return; - } - } - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "aiohttp/_http_parser.pyx":739 - * cdef HttpParser pyparser = parser.data - * cdef bytes body = at[:length] - * try: # <<<<<<<<<<<<<< - * pyparser._payload.feed_data(body, length) - * except BaseException as exc: - */ - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L1_error; - __pyx_L6_except_return:; - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L0; - } - - /* "aiohttp/_http_parser.pyx":735 - * - * - * cdef int cb_on_body(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< - * const char *at, size_t length) except -1: - * cdef HttpParser pyparser = parser.data - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_XDECREF(__pyx_t_12); - __Pyx_XDECREF(__pyx_t_13); - __Pyx_XDECREF(__pyx_t_14); - __Pyx_XDECREF(__pyx_t_15); - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_body", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); - __Pyx_XDECREF(__pyx_v_body); - __Pyx_XDECREF(__pyx_v_exc); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":752 - * - * - * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< - * cdef HttpParser pyparser = parser.data - * try: - */ - -static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_complete(llhttp_t *__pyx_v_parser) { - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; - PyObject *__pyx_v_exc = NULL; - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("cb_on_message_complete", 0); - - /* "aiohttp/_http_parser.pyx":753 - * - * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< - * try: - * pyparser._started = False - */ - __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); - __Pyx_INCREF(__pyx_t_1); - __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":754 - * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data - * try: # <<<<<<<<<<<<<< - * pyparser._started = False - * pyparser._on_message_complete() - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_4); - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":755 - * cdef HttpParser pyparser = parser.data - * try: - * pyparser._started = False # <<<<<<<<<<<<<< - * pyparser._on_message_complete() - * except BaseException as exc: - */ - __pyx_v_pyparser->_started = 0; - - /* "aiohttp/_http_parser.pyx":756 - * try: - * pyparser._started = False - * pyparser._on_message_complete() # <<<<<<<<<<<<<< - * except BaseException as exc: - * pyparser._last_error = exc - */ - __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_message_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 756, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":754 - * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data - * try: # <<<<<<<<<<<<<< - * pyparser._started = False - * pyparser._on_message_complete() - */ - } - - /* "aiohttp/_http_parser.pyx":761 - * return -1 - * else: - * return 0 # <<<<<<<<<<<<<< - * - * - */ - /*else:*/ { - __pyx_r = 0; - goto __pyx_L6_except_return; - } - __pyx_L3_error:; - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":757 - * pyparser._started = False - * pyparser._on_message_complete() - * except BaseException as exc: # <<<<<<<<<<<<<< - * pyparser._last_error = exc - * return -1 - */ - __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); - if (__pyx_t_5) { - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_message_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 757, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GOTREF(__pyx_t_7); - __Pyx_INCREF(__pyx_t_6); - __pyx_v_exc = __pyx_t_6; - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":758 - * pyparser._on_message_complete() - * except BaseException as exc: - * pyparser._last_error = exc # <<<<<<<<<<<<<< - * return -1 - * else: - */ - __Pyx_INCREF(__pyx_v_exc); - __Pyx_GIVEREF(__pyx_v_exc); - __Pyx_GOTREF(__pyx_v_pyparser->_last_error); - __Pyx_DECREF(__pyx_v_pyparser->_last_error); - __pyx_v_pyparser->_last_error = __pyx_v_exc; - - /* "aiohttp/_http_parser.pyx":759 - * except BaseException as exc: - * pyparser._last_error = exc - * return -1 # <<<<<<<<<<<<<< - * else: - * return 0 - */ - __pyx_r = -1; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - goto __pyx_L13_return; - } - - /* "aiohttp/_http_parser.pyx":757 - * pyparser._started = False - * pyparser._on_message_complete() - * except BaseException as exc: # <<<<<<<<<<<<<< - * pyparser._last_error = exc - * return -1 - */ - /*finally:*/ { - __pyx_L13_return: { - __pyx_t_5 = __pyx_r; - __Pyx_DECREF(__pyx_v_exc); - __pyx_v_exc = NULL; - __pyx_r = __pyx_t_5; - goto __pyx_L6_except_return; - } - } - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "aiohttp/_http_parser.pyx":754 - * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data - * try: # <<<<<<<<<<<<<< - * pyparser._started = False - * pyparser._on_message_complete() - */ - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L1_error; - __pyx_L6_except_return:; - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L0; - } - - /* "aiohttp/_http_parser.pyx":752 - * - * - * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< - * cdef HttpParser pyparser = parser.data - * try: - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_message_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); - __Pyx_XDECREF(__pyx_v_exc); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":764 - * - * - * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< - * cdef HttpParser pyparser = parser.data - * try: - */ - -static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_header(llhttp_t *__pyx_v_parser) { - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; - PyObject *__pyx_v_exc = NULL; - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("cb_on_chunk_header", 0); - - /* "aiohttp/_http_parser.pyx":765 - * - * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< - * try: - * pyparser._on_chunk_header() - */ - __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); - __Pyx_INCREF(__pyx_t_1); - __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":766 - * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data - * try: # <<<<<<<<<<<<<< - * pyparser._on_chunk_header() - * except BaseException as exc: - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_4); - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":767 - * cdef HttpParser pyparser = parser.data - * try: - * pyparser._on_chunk_header() # <<<<<<<<<<<<<< - * except BaseException as exc: - * pyparser._last_error = exc - */ - __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_chunk_header(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 767, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":766 - * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data - * try: # <<<<<<<<<<<<<< - * pyparser._on_chunk_header() - * except BaseException as exc: - */ - } - - /* "aiohttp/_http_parser.pyx":772 - * return -1 - * else: - * return 0 # <<<<<<<<<<<<<< - * - * - */ - /*else:*/ { - __pyx_r = 0; - goto __pyx_L6_except_return; - } - __pyx_L3_error:; - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":768 - * try: - * pyparser._on_chunk_header() - * except BaseException as exc: # <<<<<<<<<<<<<< - * pyparser._last_error = exc - * return -1 - */ - __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); - if (__pyx_t_5) { - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 768, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GOTREF(__pyx_t_7); - __Pyx_INCREF(__pyx_t_6); - __pyx_v_exc = __pyx_t_6; - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":769 - * pyparser._on_chunk_header() - * except BaseException as exc: - * pyparser._last_error = exc # <<<<<<<<<<<<<< - * return -1 - * else: - */ - __Pyx_INCREF(__pyx_v_exc); - __Pyx_GIVEREF(__pyx_v_exc); - __Pyx_GOTREF(__pyx_v_pyparser->_last_error); - __Pyx_DECREF(__pyx_v_pyparser->_last_error); - __pyx_v_pyparser->_last_error = __pyx_v_exc; - - /* "aiohttp/_http_parser.pyx":770 - * except BaseException as exc: - * pyparser._last_error = exc - * return -1 # <<<<<<<<<<<<<< - * else: - * return 0 - */ - __pyx_r = -1; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - goto __pyx_L13_return; - } - - /* "aiohttp/_http_parser.pyx":768 - * try: - * pyparser._on_chunk_header() - * except BaseException as exc: # <<<<<<<<<<<<<< - * pyparser._last_error = exc - * return -1 - */ - /*finally:*/ { - __pyx_L13_return: { - __pyx_t_5 = __pyx_r; - __Pyx_DECREF(__pyx_v_exc); - __pyx_v_exc = NULL; - __pyx_r = __pyx_t_5; - goto __pyx_L6_except_return; - } - } - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "aiohttp/_http_parser.pyx":766 - * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data - * try: # <<<<<<<<<<<<<< - * pyparser._on_chunk_header() - * except BaseException as exc: - */ - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L1_error; - __pyx_L6_except_return:; - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L0; - } - - /* "aiohttp/_http_parser.pyx":764 - * - * - * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< - * cdef HttpParser pyparser = parser.data - * try: - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); - __Pyx_XDECREF(__pyx_v_exc); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":775 - * - * - * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< - * cdef HttpParser pyparser = parser.data - * try: - */ - -static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_complete(llhttp_t *__pyx_v_parser) { - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; - PyObject *__pyx_v_exc = NULL; - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("cb_on_chunk_complete", 0); - - /* "aiohttp/_http_parser.pyx":776 - * - * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< - * try: - * pyparser._on_chunk_complete() - */ - __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); - __Pyx_INCREF(__pyx_t_1); - __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":777 - * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data - * try: # <<<<<<<<<<<<<< - * pyparser._on_chunk_complete() - * except BaseException as exc: - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_4); - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":778 - * cdef HttpParser pyparser = parser.data - * try: - * pyparser._on_chunk_complete() # <<<<<<<<<<<<<< - * except BaseException as exc: - * pyparser._last_error = exc - */ - __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_chunk_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 778, __pyx_L3_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":777 - * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data - * try: # <<<<<<<<<<<<<< - * pyparser._on_chunk_complete() - * except BaseException as exc: - */ - } - - /* "aiohttp/_http_parser.pyx":783 - * return -1 - * else: - * return 0 # <<<<<<<<<<<<<< - * - * - */ - /*else:*/ { - __pyx_r = 0; - goto __pyx_L6_except_return; - } - __pyx_L3_error:; - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":779 - * try: - * pyparser._on_chunk_complete() - * except BaseException as exc: # <<<<<<<<<<<<<< - * pyparser._last_error = exc - * return -1 - */ - __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); - if (__pyx_t_5) { - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 779, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GOTREF(__pyx_t_7); - __Pyx_INCREF(__pyx_t_6); - __pyx_v_exc = __pyx_t_6; - /*try:*/ { - - /* "aiohttp/_http_parser.pyx":780 - * pyparser._on_chunk_complete() - * except BaseException as exc: - * pyparser._last_error = exc # <<<<<<<<<<<<<< - * return -1 - * else: - */ - __Pyx_INCREF(__pyx_v_exc); - __Pyx_GIVEREF(__pyx_v_exc); - __Pyx_GOTREF(__pyx_v_pyparser->_last_error); - __Pyx_DECREF(__pyx_v_pyparser->_last_error); - __pyx_v_pyparser->_last_error = __pyx_v_exc; - - /* "aiohttp/_http_parser.pyx":781 - * except BaseException as exc: - * pyparser._last_error = exc - * return -1 # <<<<<<<<<<<<<< - * else: - * return 0 - */ - __pyx_r = -1; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - goto __pyx_L13_return; - } - - /* "aiohttp/_http_parser.pyx":779 - * try: - * pyparser._on_chunk_complete() - * except BaseException as exc: # <<<<<<<<<<<<<< - * pyparser._last_error = exc - * return -1 - */ - /*finally:*/ { - __pyx_L13_return: { - __pyx_t_5 = __pyx_r; - __Pyx_DECREF(__pyx_v_exc); - __pyx_v_exc = NULL; - __pyx_r = __pyx_t_5; - goto __pyx_L6_except_return; - } - } - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - - /* "aiohttp/_http_parser.pyx":777 - * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: - * cdef HttpParser pyparser = parser.data - * try: # <<<<<<<<<<<<<< - * pyparser._on_chunk_complete() - * except BaseException as exc: - */ - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L1_error; - __pyx_L6_except_return:; - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_XGIVEREF(__pyx_t_4); - __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); - goto __pyx_L0; - } - - /* "aiohttp/_http_parser.pyx":775 - * - * - * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< - * cdef HttpParser pyparser = parser.data - * try: - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); - __Pyx_XDECREF(__pyx_v_exc); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_parser.pyx":786 - * - * - * cdef parser_error_from_errno(cparser.llhttp_t* parser): # <<<<<<<<<<<<<< - * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) - * cdef bytes desc = cparser.llhttp_get_error_reason(parser) - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser_parser_error_from_errno(llhttp_t *__pyx_v_parser) { - llhttp_errno_t __pyx_v_errno; - PyObject *__pyx_v_desc = 0; - PyObject *__pyx_v_cls = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("parser_error_from_errno", 0); - - /* "aiohttp/_http_parser.pyx":787 - * - * cdef parser_error_from_errno(cparser.llhttp_t* parser): - * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) # <<<<<<<<<<<<<< - * cdef bytes desc = cparser.llhttp_get_error_reason(parser) - * - */ - __pyx_v_errno = llhttp_get_errno(__pyx_v_parser); - - /* "aiohttp/_http_parser.pyx":788 - * cdef parser_error_from_errno(cparser.llhttp_t* parser): - * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) - * cdef bytes desc = cparser.llhttp_get_error_reason(parser) # <<<<<<<<<<<<<< - * - * if errno in (cparser.HPE_CB_MESSAGE_BEGIN, - */ - __pyx_t_1 = __Pyx_PyBytes_FromString(llhttp_get_error_reason(__pyx_v_parser)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 788, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_desc = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":790 - * cdef bytes desc = cparser.llhttp_get_error_reason(parser) - * - * if errno in (cparser.HPE_CB_MESSAGE_BEGIN, # <<<<<<<<<<<<<< - * cparser.HPE_CB_HEADERS_COMPLETE, - * cparser.HPE_CB_MESSAGE_COMPLETE, - */ - switch (__pyx_v_errno) { - case HPE_CB_MESSAGE_BEGIN: - case HPE_CB_HEADERS_COMPLETE: - - /* "aiohttp/_http_parser.pyx":791 - * - * if errno in (cparser.HPE_CB_MESSAGE_BEGIN, - * cparser.HPE_CB_HEADERS_COMPLETE, # <<<<<<<<<<<<<< - * cparser.HPE_CB_MESSAGE_COMPLETE, - * cparser.HPE_CB_CHUNK_HEADER, - */ - case HPE_CB_MESSAGE_COMPLETE: - - /* "aiohttp/_http_parser.pyx":792 - * if errno in (cparser.HPE_CB_MESSAGE_BEGIN, - * cparser.HPE_CB_HEADERS_COMPLETE, - * cparser.HPE_CB_MESSAGE_COMPLETE, # <<<<<<<<<<<<<< - * cparser.HPE_CB_CHUNK_HEADER, - * cparser.HPE_CB_CHUNK_COMPLETE, - */ - case HPE_CB_CHUNK_HEADER: - - /* "aiohttp/_http_parser.pyx":793 - * cparser.HPE_CB_HEADERS_COMPLETE, - * cparser.HPE_CB_MESSAGE_COMPLETE, - * cparser.HPE_CB_CHUNK_HEADER, # <<<<<<<<<<<<<< - * cparser.HPE_CB_CHUNK_COMPLETE, - * cparser.HPE_INVALID_CONSTANT, - */ - case HPE_CB_CHUNK_COMPLETE: - - /* "aiohttp/_http_parser.pyx":794 - * cparser.HPE_CB_MESSAGE_COMPLETE, - * cparser.HPE_CB_CHUNK_HEADER, - * cparser.HPE_CB_CHUNK_COMPLETE, # <<<<<<<<<<<<<< - * cparser.HPE_INVALID_CONSTANT, - * cparser.HPE_INVALID_HEADER_TOKEN, - */ - case HPE_INVALID_CONSTANT: - - /* "aiohttp/_http_parser.pyx":795 - * cparser.HPE_CB_CHUNK_HEADER, - * cparser.HPE_CB_CHUNK_COMPLETE, - * cparser.HPE_INVALID_CONSTANT, # <<<<<<<<<<<<<< - * cparser.HPE_INVALID_HEADER_TOKEN, - * cparser.HPE_INVALID_CONTENT_LENGTH, - */ - case HPE_INVALID_HEADER_TOKEN: - - /* "aiohttp/_http_parser.pyx":796 - * cparser.HPE_CB_CHUNK_COMPLETE, - * cparser.HPE_INVALID_CONSTANT, - * cparser.HPE_INVALID_HEADER_TOKEN, # <<<<<<<<<<<<<< - * cparser.HPE_INVALID_CONTENT_LENGTH, - * cparser.HPE_INVALID_CHUNK_SIZE, - */ - case HPE_INVALID_CONTENT_LENGTH: - - /* "aiohttp/_http_parser.pyx":797 - * cparser.HPE_INVALID_CONSTANT, - * cparser.HPE_INVALID_HEADER_TOKEN, - * cparser.HPE_INVALID_CONTENT_LENGTH, # <<<<<<<<<<<<<< - * cparser.HPE_INVALID_CHUNK_SIZE, - * cparser.HPE_INVALID_EOF_STATE, - */ - case HPE_INVALID_CHUNK_SIZE: - - /* "aiohttp/_http_parser.pyx":798 - * cparser.HPE_INVALID_HEADER_TOKEN, - * cparser.HPE_INVALID_CONTENT_LENGTH, - * cparser.HPE_INVALID_CHUNK_SIZE, # <<<<<<<<<<<<<< - * cparser.HPE_INVALID_EOF_STATE, - * cparser.HPE_INVALID_TRANSFER_ENCODING): - */ - case HPE_INVALID_EOF_STATE: - - /* "aiohttp/_http_parser.pyx":799 - * cparser.HPE_INVALID_CONTENT_LENGTH, - * cparser.HPE_INVALID_CHUNK_SIZE, - * cparser.HPE_INVALID_EOF_STATE, # <<<<<<<<<<<<<< - * cparser.HPE_INVALID_TRANSFER_ENCODING): - * cls = BadHttpMessage - */ - case HPE_INVALID_TRANSFER_ENCODING: - - /* "aiohttp/_http_parser.pyx":801 - * cparser.HPE_INVALID_EOF_STATE, - * cparser.HPE_INVALID_TRANSFER_ENCODING): - * cls = BadHttpMessage # <<<<<<<<<<<<<< - * - * elif errno == cparser.HPE_INVALID_STATUS: - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadHttpMessage); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 801, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_cls = __pyx_t_1; - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":790 - * cdef bytes desc = cparser.llhttp_get_error_reason(parser) - * - * if errno in (cparser.HPE_CB_MESSAGE_BEGIN, # <<<<<<<<<<<<<< - * cparser.HPE_CB_HEADERS_COMPLETE, - * cparser.HPE_CB_MESSAGE_COMPLETE, - */ - break; - case HPE_INVALID_STATUS: - - /* "aiohttp/_http_parser.pyx":804 - * - * elif errno == cparser.HPE_INVALID_STATUS: - * cls = BadStatusLine # <<<<<<<<<<<<<< - * - * elif errno == cparser.HPE_INVALID_METHOD: - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadStatusLine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 804, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_cls = __pyx_t_1; - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":803 - * cls = BadHttpMessage - * - * elif errno == cparser.HPE_INVALID_STATUS: # <<<<<<<<<<<<<< - * cls = BadStatusLine - * - */ - break; - case HPE_INVALID_METHOD: - - /* "aiohttp/_http_parser.pyx":807 - * - * elif errno == cparser.HPE_INVALID_METHOD: - * cls = BadStatusLine # <<<<<<<<<<<<<< - * - * elif errno == cparser.HPE_INVALID_VERSION: - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadStatusLine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 807, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_cls = __pyx_t_1; - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":806 - * cls = BadStatusLine - * - * elif errno == cparser.HPE_INVALID_METHOD: # <<<<<<<<<<<<<< - * cls = BadStatusLine - * - */ - break; - case HPE_INVALID_VERSION: - - /* "aiohttp/_http_parser.pyx":810 - * - * elif errno == cparser.HPE_INVALID_VERSION: - * cls = BadStatusLine # <<<<<<<<<<<<<< - * - * elif errno == cparser.HPE_INVALID_URL: - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadStatusLine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 810, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_cls = __pyx_t_1; - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":809 - * cls = BadStatusLine - * - * elif errno == cparser.HPE_INVALID_VERSION: # <<<<<<<<<<<<<< - * cls = BadStatusLine - * - */ - break; - case HPE_INVALID_URL: - - /* "aiohttp/_http_parser.pyx":813 - * - * elif errno == cparser.HPE_INVALID_URL: - * cls = InvalidURLError # <<<<<<<<<<<<<< - * - * else: - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_InvalidURLError); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 813, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_cls = __pyx_t_1; - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":812 - * cls = BadStatusLine - * - * elif errno == cparser.HPE_INVALID_URL: # <<<<<<<<<<<<<< - * cls = InvalidURLError - * - */ - break; - default: - - /* "aiohttp/_http_parser.pyx":816 - * - * else: - * cls = BadHttpMessage # <<<<<<<<<<<<<< - * - * return cls(desc.decode('latin-1')) - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadHttpMessage); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 816, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_v_cls = __pyx_t_1; - __pyx_t_1 = 0; - break; - } - - /* "aiohttp/_http_parser.pyx":818 - * cls = BadHttpMessage - * - * return cls(desc.decode('latin-1')) # <<<<<<<<<<<<<< - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __Pyx_decode_bytes(__pyx_v_desc, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeLatin1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 818, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_v_cls); - __pyx_t_3 = __pyx_v_cls; __pyx_t_4 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); - if (likely(__pyx_t_4)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_3, function); - } - } - __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 818, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "aiohttp/_http_parser.pyx":786 - * - * - * cdef parser_error_from_errno(cparser.llhttp_t* parser): # <<<<<<<<<<<<<< - * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) - * cdef bytes desc = cparser.llhttp_get_error_reason(parser) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("aiohttp._http_parser.parser_error_from_errno", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_desc); - __Pyx_XDECREF(__pyx_v_cls); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage = {"__pyx_unpickle_RawRequestMessage", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v___pyx_type = 0; - long __pyx_v___pyx_checksum; - PyObject *__pyx_v___pyx_state = 0; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__pyx_unpickle_RawRequestMessage (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; - PyObject* values[3] = {0,0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawRequestMessage", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawRequestMessage", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_RawRequestMessage") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - } - __pyx_v___pyx_type = values[0]; - __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) - __pyx_v___pyx_state = values[2]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawRequestMessage", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawRequestMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_v___pyx_PickleError = 0; - PyObject *__pyx_v___pyx_result = 0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - int __pyx_t_6; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__pyx_unpickle_RawRequestMessage", 0); - - /* "(tree fragment)":4 - * cdef object __pyx_PickleError - * cdef object __pyx_result - * if __pyx_checksum != 0x1408252: # <<<<<<<<<<<<<< - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) - */ - __pyx_t_1 = ((__pyx_v___pyx_checksum != 0x1408252) != 0); - if (__pyx_t_1) { - - /* "(tree fragment)":5 - * cdef object __pyx_result - * if __pyx_checksum != 0x1408252: - * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< - * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) - * __pyx_result = RawRequestMessage.__new__(__pyx_type) - */ - __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_n_s_PickleError); - __Pyx_GIVEREF(__pyx_n_s_PickleError); - PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); - __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_t_2); - __pyx_v___pyx_PickleError = __pyx_t_2; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "(tree fragment)":6 - * if __pyx_checksum != 0x1408252: - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) # <<<<<<<<<<<<<< - * __pyx_result = RawRequestMessage.__new__(__pyx_type) - * if __pyx_state is not None: - */ - __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0x14, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_INCREF(__pyx_v___pyx_PickleError); - __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_5)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_5); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 6, __pyx_L1_error) - - /* "(tree fragment)":4 - * cdef object __pyx_PickleError - * cdef object __pyx_result - * if __pyx_checksum != 0x1408252: # <<<<<<<<<<<<<< - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) - */ - } - - /* "(tree fragment)":7 - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) - * __pyx_result = RawRequestMessage.__new__(__pyx_type) # <<<<<<<<<<<<<< - * if __pyx_state is not None: - * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) - */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_4)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_v___pyx_result = __pyx_t_3; - __pyx_t_3 = 0; - - /* "(tree fragment)":8 - * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) - * __pyx_result = RawRequestMessage.__new__(__pyx_type) - * if __pyx_state is not None: # <<<<<<<<<<<<<< - * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) - * return __pyx_result - */ - __pyx_t_1 = (__pyx_v___pyx_state != Py_None); - __pyx_t_6 = (__pyx_t_1 != 0); - if (__pyx_t_6) { - - /* "(tree fragment)":9 - * __pyx_result = RawRequestMessage.__new__(__pyx_type) - * if __pyx_state is not None: - * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< - * return __pyx_result - * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): - */ - if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 9, __pyx_L1_error) - __pyx_t_3 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 9, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "(tree fragment)":8 - * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) - * __pyx_result = RawRequestMessage.__new__(__pyx_type) - * if __pyx_state is not None: # <<<<<<<<<<<<<< - * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) - * return __pyx_result - */ - } - - /* "(tree fragment)":10 - * if __pyx_state is not None: - * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) - * return __pyx_result # <<<<<<<<<<<<<< - * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): - * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v___pyx_result); - __pyx_r = __pyx_v___pyx_result; - goto __pyx_L0; - - /* "(tree fragment)":1 - * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawRequestMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v___pyx_PickleError); - __Pyx_XDECREF(__pyx_v___pyx_result); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":11 - * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) - * return __pyx_result - * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< - * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] - * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - Py_ssize_t __pyx_t_3; - int __pyx_t_4; - int __pyx_t_5; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__pyx_unpickle_RawRequestMessage__set_state", 0); - - /* "(tree fragment)":12 - * return __pyx_result - * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): - * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] # <<<<<<<<<<<<<< - * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): - * __pyx_result.__dict__.update(__pyx_state[10]) - */ - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->chunked); - __Pyx_DECREF(__pyx_v___pyx_result->chunked); - __pyx_v___pyx_result->chunked = __pyx_t_1; - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->compression); - __Pyx_DECREF(__pyx_v___pyx_result->compression); - __pyx_v___pyx_result->compression = __pyx_t_1; - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->headers); - __Pyx_DECREF(__pyx_v___pyx_result->headers); - __pyx_v___pyx_result->headers = __pyx_t_1; - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->method); - __Pyx_DECREF(__pyx_v___pyx_result->method); - __pyx_v___pyx_result->method = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->path); - __Pyx_DECREF(__pyx_v___pyx_result->path); - __pyx_v___pyx_result->path = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->raw_headers); - __Pyx_DECREF(__pyx_v___pyx_result->raw_headers); - __pyx_v___pyx_result->raw_headers = __pyx_t_1; - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 6, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->should_close); - __Pyx_DECREF(__pyx_v___pyx_result->should_close); - __pyx_v___pyx_result->should_close = __pyx_t_1; - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 7, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->upgrade); - __Pyx_DECREF(__pyx_v___pyx_result->upgrade); - __pyx_v___pyx_result->upgrade = __pyx_t_1; - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 8, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->url); - __Pyx_DECREF(__pyx_v___pyx_result->url); - __pyx_v___pyx_result->url = __pyx_t_1; - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 9, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->version); - __Pyx_DECREF(__pyx_v___pyx_result->version); - __pyx_v___pyx_result->version = __pyx_t_1; - __pyx_t_1 = 0; - - /* "(tree fragment)":13 - * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): - * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] - * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< - * __pyx_result.__dict__.update(__pyx_state[10]) - */ - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); - __PYX_ERR(1, 13, __pyx_L1_error) - } - __pyx_t_3 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) - __pyx_t_4 = ((__pyx_t_3 > 10) != 0); - if (__pyx_t_4) { - } else { - __pyx_t_2 = __pyx_t_4; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) - __pyx_t_5 = (__pyx_t_4 != 0); - __pyx_t_2 = __pyx_t_5; - __pyx_L4_bool_binop_done:; - if (__pyx_t_2) { - - /* "(tree fragment)":14 - * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] - * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): - * __pyx_result.__dict__.update(__pyx_state[10]) # <<<<<<<<<<<<<< - */ - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 14, __pyx_L1_error) - } - __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 10, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_8 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { - __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); - if (likely(__pyx_t_8)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); - __Pyx_INCREF(__pyx_t_8); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_7, function); - } - } - __pyx_t_1 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_8, __pyx_t_6) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); - __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "(tree fragment)":13 - * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): - * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] - * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< - * __pyx_result.__dict__.update(__pyx_state[10]) - */ - } - - /* "(tree fragment)":11 - * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) - * return __pyx_result - * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< - * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] - * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawRequestMessage__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":1 - * def __pyx_unpickle_RawResponseMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage = {"__pyx_unpickle_RawResponseMessage", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v___pyx_type = 0; - long __pyx_v___pyx_checksum; - PyObject *__pyx_v___pyx_state = 0; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__pyx_unpickle_RawResponseMessage (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; - PyObject* values[3] = {0,0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawResponseMessage", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawResponseMessage", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_RawResponseMessage") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - values[2] = PyTuple_GET_ITEM(__pyx_args, 2); - } - __pyx_v___pyx_type = values[0]; - __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) - __pyx_v___pyx_state = values[2]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawResponseMessage", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawResponseMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7aiohttp_12_http_parser_2__pyx_unpickle_RawResponseMessage(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_parser_2__pyx_unpickle_RawResponseMessage(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_v___pyx_PickleError = 0; - PyObject *__pyx_v___pyx_result = 0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - int __pyx_t_6; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__pyx_unpickle_RawResponseMessage", 0); - - /* "(tree fragment)":4 - * cdef object __pyx_PickleError - * cdef object __pyx_result - * if __pyx_checksum != 0xc7706dc: # <<<<<<<<<<<<<< - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) - */ - __pyx_t_1 = ((__pyx_v___pyx_checksum != 0xc7706dc) != 0); - if (__pyx_t_1) { - - /* "(tree fragment)":5 - * cdef object __pyx_result - * if __pyx_checksum != 0xc7706dc: - * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) - * __pyx_result = RawResponseMessage.__new__(__pyx_type) - */ - __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_n_s_PickleError); - __Pyx_GIVEREF(__pyx_n_s_PickleError); - PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); - __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_t_2); - __pyx_v___pyx_PickleError = __pyx_t_2; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "(tree fragment)":6 - * if __pyx_checksum != 0xc7706dc: - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) # <<<<<<<<<<<<<< - * __pyx_result = RawResponseMessage.__new__(__pyx_type) - * if __pyx_state is not None: - */ - __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0xc7, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_INCREF(__pyx_v___pyx_PickleError); - __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_5)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_5); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 6, __pyx_L1_error) - - /* "(tree fragment)":4 - * cdef object __pyx_PickleError - * cdef object __pyx_result - * if __pyx_checksum != 0xc7706dc: # <<<<<<<<<<<<<< - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) - */ - } - - /* "(tree fragment)":7 - * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) - * __pyx_result = RawResponseMessage.__new__(__pyx_type) # <<<<<<<<<<<<<< - * if __pyx_state is not None: - * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) - */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_4)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - } - } - __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_v___pyx_result = __pyx_t_3; - __pyx_t_3 = 0; - - /* "(tree fragment)":8 - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) - * __pyx_result = RawResponseMessage.__new__(__pyx_type) - * if __pyx_state is not None: # <<<<<<<<<<<<<< - * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) - * return __pyx_result - */ - __pyx_t_1 = (__pyx_v___pyx_state != Py_None); - __pyx_t_6 = (__pyx_t_1 != 0); - if (__pyx_t_6) { - - /* "(tree fragment)":9 - * __pyx_result = RawResponseMessage.__new__(__pyx_type) - * if __pyx_state is not None: - * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< - * return __pyx_result - * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): - */ - if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 9, __pyx_L1_error) - __pyx_t_3 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 9, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - - /* "(tree fragment)":8 - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) - * __pyx_result = RawResponseMessage.__new__(__pyx_type) - * if __pyx_state is not None: # <<<<<<<<<<<<<< - * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) - * return __pyx_result - */ - } - - /* "(tree fragment)":10 - * if __pyx_state is not None: - * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) - * return __pyx_result # <<<<<<<<<<<<<< - * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): - * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v___pyx_result); - __pyx_r = __pyx_v___pyx_result; - goto __pyx_L0; - - /* "(tree fragment)":1 - * def __pyx_unpickle_RawResponseMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawResponseMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v___pyx_PickleError); - __Pyx_XDECREF(__pyx_v___pyx_result); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "(tree fragment)":11 - * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) - * return __pyx_result - * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< - * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] - * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): - */ - -static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_t_2; - int __pyx_t_3; - Py_ssize_t __pyx_t_4; - int __pyx_t_5; - int __pyx_t_6; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__pyx_unpickle_RawResponseMessage__set_state", 0); - - /* "(tree fragment)":12 - * return __pyx_result - * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): - * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] # <<<<<<<<<<<<<< - * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): - * __pyx_result.__dict__.update(__pyx_state[9]) - */ - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->chunked); - __Pyx_DECREF(__pyx_v___pyx_result->chunked); - __pyx_v___pyx_result->chunked = __pyx_t_1; - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v___pyx_result->code = __pyx_t_2; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->compression); - __Pyx_DECREF(__pyx_v___pyx_result->compression); - __pyx_v___pyx_result->compression = __pyx_t_1; - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->headers); - __Pyx_DECREF(__pyx_v___pyx_result->headers); - __pyx_v___pyx_result->headers = __pyx_t_1; - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->raw_headers); - __Pyx_DECREF(__pyx_v___pyx_result->raw_headers); - __pyx_v___pyx_result->raw_headers = __pyx_t_1; - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->reason); - __Pyx_DECREF(__pyx_v___pyx_result->reason); - __pyx_v___pyx_result->reason = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 6, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->should_close); - __Pyx_DECREF(__pyx_v___pyx_result->should_close); - __pyx_v___pyx_result->should_close = __pyx_t_1; - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 7, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->upgrade); - __Pyx_DECREF(__pyx_v___pyx_result->upgrade); - __pyx_v___pyx_result->upgrade = __pyx_t_1; - __pyx_t_1 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 12, __pyx_L1_error) - } - __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 8, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __Pyx_GOTREF(__pyx_v___pyx_result->version); - __Pyx_DECREF(__pyx_v___pyx_result->version); - __pyx_v___pyx_result->version = __pyx_t_1; - __pyx_t_1 = 0; - - /* "(tree fragment)":13 - * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): - * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] - * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< - * __pyx_result.__dict__.update(__pyx_state[9]) - */ - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); - __PYX_ERR(1, 13, __pyx_L1_error) - } - __pyx_t_4 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) - __pyx_t_5 = ((__pyx_t_4 > 9) != 0); - if (__pyx_t_5) { - } else { - __pyx_t_3 = __pyx_t_5; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_5 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) - __pyx_t_6 = (__pyx_t_5 != 0); - __pyx_t_3 = __pyx_t_6; - __pyx_L4_bool_binop_done:; - if (__pyx_t_3) { - - /* "(tree fragment)":14 - * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] - * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): - * __pyx_result.__dict__.update(__pyx_state[9]) # <<<<<<<<<<<<<< - */ - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_update); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - if (unlikely(__pyx_v___pyx_state == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 14, __pyx_L1_error) - } - __pyx_t_7 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 9, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_9 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_8))) { - __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_8); - if (likely(__pyx_t_9)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); - __Pyx_INCREF(__pyx_t_9); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_8, function); - } - } - __pyx_t_1 = (__pyx_t_9) ? __Pyx_PyObject_Call2Args(__pyx_t_8, __pyx_t_9, __pyx_t_7) : __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_7); - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "(tree fragment)":13 - * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): - * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] - * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< - * __pyx_result.__dict__.update(__pyx_state[9]) - */ - } - - /* "(tree fragment)":11 - * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) - * return __pyx_result - * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< - * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] - * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawResponseMessage__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_freelist_7aiohttp_12_http_parser_RawRequestMessage[250]; -static int __pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage = 0; - -static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_RawRequestMessage(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { - struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p; - PyObject *o; - if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage)) & ((t->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0))) { - o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser_RawRequestMessage[--__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage]; - memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage)); - (void) PyObject_INIT(o, t); - PyObject_GC_Track(o); - } else { - if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { - o = (*t->tp_alloc)(t, 0); - } else { - o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); - } - if (unlikely(!o)) return 0; - } - p = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o); - p->method = ((PyObject*)Py_None); Py_INCREF(Py_None); - p->path = ((PyObject*)Py_None); Py_INCREF(Py_None); - p->version = Py_None; Py_INCREF(Py_None); - p->headers = Py_None; Py_INCREF(Py_None); - p->raw_headers = Py_None; Py_INCREF(Py_None); - p->should_close = Py_None; Py_INCREF(Py_None); - p->compression = Py_None; Py_INCREF(Py_None); - p->upgrade = Py_None; Py_INCREF(Py_None); - p->chunked = Py_None; Py_INCREF(Py_None); - p->url = Py_None; Py_INCREF(Py_None); - return o; -} - -static void __pyx_tp_dealloc_7aiohttp_12_http_parser_RawRequestMessage(PyObject *o) { - struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o; - #if CYTHON_USE_TP_FINALIZE - if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { - if (PyObject_CallFinalizerFromDealloc(o)) return; - } - #endif - PyObject_GC_UnTrack(o); - Py_CLEAR(p->method); - Py_CLEAR(p->path); - Py_CLEAR(p->version); - Py_CLEAR(p->headers); - Py_CLEAR(p->raw_headers); - Py_CLEAR(p->should_close); - Py_CLEAR(p->compression); - Py_CLEAR(p->upgrade); - Py_CLEAR(p->chunked); - Py_CLEAR(p->url); - if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage < 250) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage)) & ((Py_TYPE(o)->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0))) { - __pyx_freelist_7aiohttp_12_http_parser_RawRequestMessage[__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage++] = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o); - } else { - (*Py_TYPE(o)->tp_free)(o); - } -} - -static int __pyx_tp_traverse_7aiohttp_12_http_parser_RawRequestMessage(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o; - if (p->version) { - e = (*v)(p->version, a); if (e) return e; - } - if (p->headers) { - e = (*v)(p->headers, a); if (e) return e; - } - if (p->raw_headers) { - e = (*v)(p->raw_headers, a); if (e) return e; - } - if (p->should_close) { - e = (*v)(p->should_close, a); if (e) return e; - } - if (p->compression) { - e = (*v)(p->compression, a); if (e) return e; - } - if (p->upgrade) { - e = (*v)(p->upgrade, a); if (e) return e; - } - if (p->chunked) { - e = (*v)(p->chunked, a); if (e) return e; - } - if (p->url) { - e = (*v)(p->url, a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear_7aiohttp_12_http_parser_RawRequestMessage(PyObject *o) { - PyObject* tmp; - struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o; - tmp = ((PyObject*)p->version); - p->version = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->headers); - p->headers = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->raw_headers); - p->raw_headers = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->should_close); - p->should_close = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->compression); - p->compression = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->upgrade); - p->upgrade = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->chunked); - p->chunked = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->url); - p->url = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - return 0; -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_method(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_6method_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_path(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_4path_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_version(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7version_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_headers(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7headers_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_raw_headers(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_should_close(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_12should_close_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_compression(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11compression_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_upgrade(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_chunked(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7chunked_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_url(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3url_1__get__(o); -} - -static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_RawRequestMessage[] = { - {"_replace", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_5_replace, METH_VARARGS|METH_KEYWORDS, 0}, - {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7__reduce_cython__, METH_NOARGS, 0}, - {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_9__setstate_cython__, METH_O, 0}, - {0, 0, 0, 0} -}; - -static struct PyGetSetDef __pyx_getsets_7aiohttp_12_http_parser_RawRequestMessage[] = { - {(char *)"method", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_method, 0, (char *)0, 0}, - {(char *)"path", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_path, 0, (char *)0, 0}, - {(char *)"version", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_version, 0, (char *)0, 0}, - {(char *)"headers", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_headers, 0, (char *)0, 0}, - {(char *)"raw_headers", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_raw_headers, 0, (char *)0, 0}, - {(char *)"should_close", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_should_close, 0, (char *)0, 0}, - {(char *)"compression", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_compression, 0, (char *)0, 0}, - {(char *)"upgrade", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_upgrade, 0, (char *)0, 0}, - {(char *)"chunked", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_chunked, 0, (char *)0, 0}, - {(char *)"url", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_url, 0, (char *)0, 0}, - {0, 0, 0, 0, 0} -}; - -static PyTypeObject __pyx_type_7aiohttp_12_http_parser_RawRequestMessage = { - PyVarObject_HEAD_INIT(0, 0) - "aiohttp._http_parser.RawRequestMessage", /*tp_name*/ - sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7aiohttp_12_http_parser_RawRequestMessage, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - 0, /*tp_doc*/ - __pyx_tp_traverse_7aiohttp_12_http_parser_RawRequestMessage, /*tp_traverse*/ - __pyx_tp_clear_7aiohttp_12_http_parser_RawRequestMessage, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - __pyx_methods_7aiohttp_12_http_parser_RawRequestMessage, /*tp_methods*/ - 0, /*tp_members*/ - __pyx_getsets_7aiohttp_12_http_parser_RawRequestMessage, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_1__init__, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7aiohttp_12_http_parser_RawRequestMessage, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - 0, /*tp_finalize*/ - #endif - #if PY_VERSION_HEX >= 0x030800b1 - 0, /*tp_vectorcall*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 - 0, /*tp_print*/ - #endif -}; - -static struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_freelist_7aiohttp_12_http_parser_RawResponseMessage[250]; -static int __pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage = 0; - -static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_RawResponseMessage(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { - struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p; - PyObject *o; - if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage)) & ((t->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0))) { - o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser_RawResponseMessage[--__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage]; - memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage)); - (void) PyObject_INIT(o, t); - PyObject_GC_Track(o); - } else { - if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { - o = (*t->tp_alloc)(t, 0); - } else { - o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); - } - if (unlikely(!o)) return 0; - } - p = ((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o); - p->version = Py_None; Py_INCREF(Py_None); - p->reason = ((PyObject*)Py_None); Py_INCREF(Py_None); - p->headers = Py_None; Py_INCREF(Py_None); - p->raw_headers = Py_None; Py_INCREF(Py_None); - p->should_close = Py_None; Py_INCREF(Py_None); - p->compression = Py_None; Py_INCREF(Py_None); - p->upgrade = Py_None; Py_INCREF(Py_None); - p->chunked = Py_None; Py_INCREF(Py_None); - return o; -} - -static void __pyx_tp_dealloc_7aiohttp_12_http_parser_RawResponseMessage(PyObject *o) { - struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o; - #if CYTHON_USE_TP_FINALIZE - if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { - if (PyObject_CallFinalizerFromDealloc(o)) return; - } - #endif - PyObject_GC_UnTrack(o); - Py_CLEAR(p->version); - Py_CLEAR(p->reason); - Py_CLEAR(p->headers); - Py_CLEAR(p->raw_headers); - Py_CLEAR(p->should_close); - Py_CLEAR(p->compression); - Py_CLEAR(p->upgrade); - Py_CLEAR(p->chunked); - if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage < 250) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage)) & ((Py_TYPE(o)->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0))) { - __pyx_freelist_7aiohttp_12_http_parser_RawResponseMessage[__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage++] = ((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o); - } else { - (*Py_TYPE(o)->tp_free)(o); - } -} - -static int __pyx_tp_traverse_7aiohttp_12_http_parser_RawResponseMessage(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o; - if (p->version) { - e = (*v)(p->version, a); if (e) return e; - } - if (p->headers) { - e = (*v)(p->headers, a); if (e) return e; - } - if (p->raw_headers) { - e = (*v)(p->raw_headers, a); if (e) return e; - } - if (p->should_close) { - e = (*v)(p->should_close, a); if (e) return e; - } - if (p->compression) { - e = (*v)(p->compression, a); if (e) return e; - } - if (p->upgrade) { - e = (*v)(p->upgrade, a); if (e) return e; - } - if (p->chunked) { - e = (*v)(p->chunked, a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear_7aiohttp_12_http_parser_RawResponseMessage(PyObject *o) { - PyObject* tmp; - struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o; - tmp = ((PyObject*)p->version); - p->version = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->headers); - p->headers = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->raw_headers); - p->raw_headers = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->should_close); - p->should_close = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->compression); - p->compression = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->upgrade); - p->upgrade = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->chunked); - p->chunked = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - return 0; -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_version(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7version_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_code(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_4code_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_reason(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_6reason_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_headers(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7headers_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_raw_headers(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_should_close(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_12should_close_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_compression(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11compression_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_upgrade(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade_1__get__(o); -} - -static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_chunked(PyObject *o, CYTHON_UNUSED void *x) { - return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7chunked_1__get__(o); -} - -static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_RawResponseMessage[] = { - {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_5__reduce_cython__, METH_NOARGS, 0}, - {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7__setstate_cython__, METH_O, 0}, - {0, 0, 0, 0} -}; - -static struct PyGetSetDef __pyx_getsets_7aiohttp_12_http_parser_RawResponseMessage[] = { - {(char *)"version", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_version, 0, (char *)0, 0}, - {(char *)"code", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_code, 0, (char *)0, 0}, - {(char *)"reason", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_reason, 0, (char *)0, 0}, - {(char *)"headers", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_headers, 0, (char *)0, 0}, - {(char *)"raw_headers", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_raw_headers, 0, (char *)0, 0}, - {(char *)"should_close", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_should_close, 0, (char *)0, 0}, - {(char *)"compression", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_compression, 0, (char *)0, 0}, - {(char *)"upgrade", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_upgrade, 0, (char *)0, 0}, - {(char *)"chunked", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_chunked, 0, (char *)0, 0}, - {0, 0, 0, 0, 0} -}; - -static PyTypeObject __pyx_type_7aiohttp_12_http_parser_RawResponseMessage = { - PyVarObject_HEAD_INIT(0, 0) - "aiohttp._http_parser.RawResponseMessage", /*tp_name*/ - sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7aiohttp_12_http_parser_RawResponseMessage, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - 0, /*tp_doc*/ - __pyx_tp_traverse_7aiohttp_12_http_parser_RawResponseMessage, /*tp_traverse*/ - __pyx_tp_clear_7aiohttp_12_http_parser_RawResponseMessage, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - __pyx_methods_7aiohttp_12_http_parser_RawResponseMessage, /*tp_methods*/ - 0, /*tp_members*/ - __pyx_getsets_7aiohttp_12_http_parser_RawResponseMessage, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_1__init__, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7aiohttp_12_http_parser_RawResponseMessage, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - 0, /*tp_finalize*/ - #endif - #if PY_VERSION_HEX >= 0x030800b1 - 0, /*tp_vectorcall*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 - 0, /*tp_print*/ - #endif -}; -static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser __pyx_vtable_7aiohttp_12_http_parser_HttpParser; - -static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_HttpParser(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p; - PyObject *o; - if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { - o = (*t->tp_alloc)(t, 0); - } else { - o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); - } - if (unlikely(!o)) return 0; - p = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o); - p->__pyx_vtab = __pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; - p->_raw_name = ((PyObject*)Py_None); Py_INCREF(Py_None); - p->_raw_value = ((PyObject*)Py_None); Py_INCREF(Py_None); - p->_protocol = Py_None; Py_INCREF(Py_None); - p->_loop = Py_None; Py_INCREF(Py_None); - p->_timer = Py_None; Py_INCREF(Py_None); - p->_url = Py_None; Py_INCREF(Py_None); - p->_buf = ((PyObject*)Py_None); Py_INCREF(Py_None); - p->_path = ((PyObject*)Py_None); Py_INCREF(Py_None); - p->_reason = ((PyObject*)Py_None); Py_INCREF(Py_None); - p->_headers = Py_None; Py_INCREF(Py_None); - p->_raw_headers = ((PyObject*)Py_None); Py_INCREF(Py_None); - p->_messages = ((PyObject*)Py_None); Py_INCREF(Py_None); - p->_payload = Py_None; Py_INCREF(Py_None); - p->_payload_exception = Py_None; Py_INCREF(Py_None); - p->_last_error = Py_None; Py_INCREF(Py_None); - p->_content_encoding = ((PyObject*)Py_None); Py_INCREF(Py_None); - p->py_buf.obj = NULL; - if (unlikely(__pyx_pw_7aiohttp_12_http_parser_10HttpParser_1__cinit__(o, __pyx_empty_tuple, NULL) < 0)) goto bad; - return o; - bad: - Py_DECREF(o); o = 0; - return NULL; -} - -static void __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser(PyObject *o) { - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p = (struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o; - #if CYTHON_USE_TP_FINALIZE - if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { - if (PyObject_CallFinalizerFromDealloc(o)) return; - } - #endif - PyObject_GC_UnTrack(o); - { - PyObject *etype, *eval, *etb; - PyErr_Fetch(&etype, &eval, &etb); - __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); - __pyx_pw_7aiohttp_12_http_parser_10HttpParser_3__dealloc__(o); - __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); - PyErr_Restore(etype, eval, etb); - } - Py_CLEAR(p->_raw_name); - Py_CLEAR(p->_raw_value); - Py_CLEAR(p->_protocol); - Py_CLEAR(p->_loop); - Py_CLEAR(p->_timer); - Py_CLEAR(p->_url); - Py_CLEAR(p->_buf); - Py_CLEAR(p->_path); - Py_CLEAR(p->_reason); - Py_CLEAR(p->_headers); - Py_CLEAR(p->_raw_headers); - Py_CLEAR(p->_messages); - Py_CLEAR(p->_payload); - Py_CLEAR(p->_payload_exception); - Py_CLEAR(p->_last_error); - Py_CLEAR(p->_content_encoding); - (*Py_TYPE(o)->tp_free)(o); -} - -static int __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p = (struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o; - if (p->_protocol) { - e = (*v)(p->_protocol, a); if (e) return e; - } - if (p->_loop) { - e = (*v)(p->_loop, a); if (e) return e; - } - if (p->_timer) { - e = (*v)(p->_timer, a); if (e) return e; - } - if (p->_url) { - e = (*v)(p->_url, a); if (e) return e; - } - if (p->_headers) { - e = (*v)(p->_headers, a); if (e) return e; - } - if (p->_raw_headers) { - e = (*v)(p->_raw_headers, a); if (e) return e; - } - if (p->_messages) { - e = (*v)(p->_messages, a); if (e) return e; - } - if (p->_payload) { - e = (*v)(p->_payload, a); if (e) return e; - } - if (p->_payload_exception) { - e = (*v)(p->_payload_exception, a); if (e) return e; - } - if (p->_last_error) { - e = (*v)(p->_last_error, a); if (e) return e; - } - if (p->py_buf.obj) { - e = (*v)(p->py_buf.obj, a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser(PyObject *o) { - PyObject* tmp; - struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p = (struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o; - tmp = ((PyObject*)p->_protocol); - p->_protocol = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->_loop); - p->_loop = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->_timer); - p->_timer = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->_url); - p->_url = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->_headers); - p->_headers = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->_raw_headers); - p->_raw_headers = ((PyObject*)Py_None); Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->_messages); - p->_messages = ((PyObject*)Py_None); Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->_payload); - p->_payload = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->_payload_exception); - p->_payload_exception = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - tmp = ((PyObject*)p->_last_error); - p->_last_error = Py_None; Py_INCREF(Py_None); - Py_XDECREF(tmp); - Py_CLEAR(p->py_buf.obj); - return 0; -} - -static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_HttpParser[] = { - {"feed_eof", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_5feed_eof, METH_NOARGS, 0}, - {"feed_data", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_7feed_data, METH_O, 0}, - {"set_upgraded", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_9set_upgraded, METH_O, 0}, - {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_11__reduce_cython__, METH_NOARGS, 0}, - {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_13__setstate_cython__, METH_O, 0}, - {0, 0, 0, 0} -}; - -static PyTypeObject __pyx_type_7aiohttp_12_http_parser_HttpParser = { - PyVarObject_HEAD_INIT(0, 0) - "aiohttp._http_parser.HttpParser", /*tp_name*/ - sizeof(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - 0, /*tp_doc*/ - __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser, /*tp_traverse*/ - __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - __pyx_methods_7aiohttp_12_http_parser_HttpParser, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7aiohttp_12_http_parser_HttpParser, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - 0, /*tp_finalize*/ - #endif - #if PY_VERSION_HEX >= 0x030800b1 - 0, /*tp_vectorcall*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 - 0, /*tp_print*/ - #endif -}; -static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser __pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser; - -static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_HttpRequestParser(PyTypeObject *t, PyObject *a, PyObject *k) { - struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *p; - PyObject *o = __pyx_tp_new_7aiohttp_12_http_parser_HttpParser(t, a, k); - if (unlikely(!o)) return 0; - p = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)o); - p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser*)__pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser; - return o; -} - -static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_HttpRequestParser[] = { - {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_3__reduce_cython__, METH_NOARGS, 0}, - {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_5__setstate_cython__, METH_O, 0}, - {0, 0, 0, 0} -}; - -static PyTypeObject __pyx_type_7aiohttp_12_http_parser_HttpRequestParser = { - PyVarObject_HEAD_INIT(0, 0) - "aiohttp._http_parser.HttpRequestParser", /*tp_name*/ - sizeof(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - 0, /*tp_doc*/ - __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser, /*tp_traverse*/ - __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - __pyx_methods_7aiohttp_12_http_parser_HttpRequestParser, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - __pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_1__init__, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7aiohttp_12_http_parser_HttpRequestParser, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - 0, /*tp_finalize*/ - #endif - #if PY_VERSION_HEX >= 0x030800b1 - 0, /*tp_vectorcall*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 - 0, /*tp_print*/ - #endif -}; -static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser __pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser; - -static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_HttpResponseParser(PyTypeObject *t, PyObject *a, PyObject *k) { - struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *p; - PyObject *o = __pyx_tp_new_7aiohttp_12_http_parser_HttpParser(t, a, k); - if (unlikely(!o)) return 0; - p = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)o); - p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser*)__pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser; - return o; -} - -static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_HttpResponseParser[] = { - {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_3__reduce_cython__, METH_NOARGS, 0}, - {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_5__setstate_cython__, METH_O, 0}, - {0, 0, 0, 0} -}; - -static PyTypeObject __pyx_type_7aiohttp_12_http_parser_HttpResponseParser = { - PyVarObject_HEAD_INIT(0, 0) - "aiohttp._http_parser.HttpResponseParser", /*tp_name*/ - sizeof(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - 0, /*tp_doc*/ - __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser, /*tp_traverse*/ - __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - __pyx_methods_7aiohttp_12_http_parser_HttpResponseParser, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - __pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_1__init__, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7aiohttp_12_http_parser_HttpResponseParser, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - 0, /*tp_finalize*/ - #endif - #if PY_VERSION_HEX >= 0x030800b1 - 0, /*tp_vectorcall*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 - 0, /*tp_print*/ - #endif -}; - -static struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct____repr__[8]; -static int __pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct____repr__ = 0; - -static PyObject *__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct____repr__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { - PyObject *o; - if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct____repr__ > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__)))) { - o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct____repr__[--__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct____repr__]; - memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__)); - (void) PyObject_INIT(o, t); - PyObject_GC_Track(o); - } else { - o = (*t->tp_alloc)(t, 0); - if (unlikely(!o)) return 0; - } - return o; -} - -static void __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct____repr__(PyObject *o) { - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)o; - PyObject_GC_UnTrack(o); - Py_CLEAR(p->__pyx_v_info); - if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct____repr__ < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__)))) { - __pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct____repr__[__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct____repr__++] = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)o); - } else { - (*Py_TYPE(o)->tp_free)(o); - } -} - -static int __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct____repr__(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)o; - if (p->__pyx_v_info) { - e = (*v)(p->__pyx_v_info, a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear_7aiohttp_12_http_parser___pyx_scope_struct____repr__(PyObject *o) { - PyObject* tmp; - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)o; - tmp = ((PyObject*)p->__pyx_v_info); - p->__pyx_v_info = ((PyObject*)Py_None); Py_INCREF(Py_None); - Py_XDECREF(tmp); - return 0; -} - -static PyTypeObject __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__ = { - PyVarObject_HEAD_INIT(0, 0) - "aiohttp._http_parser.__pyx_scope_struct____repr__", /*tp_name*/ - sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct____repr__, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - 0, /*tp_doc*/ - __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct____repr__, /*tp_traverse*/ - __pyx_tp_clear_7aiohttp_12_http_parser___pyx_scope_struct____repr__, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - 0, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct____repr__, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - 0, /*tp_finalize*/ - #endif - #if PY_VERSION_HEX >= 0x030800b1 - 0, /*tp_vectorcall*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 - 0, /*tp_print*/ - #endif -}; - -static struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr[8]; -static int __pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = 0; - -static PyObject *__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { - PyObject *o; - if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr)))) { - o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr[--__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr]; - memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr)); - (void) PyObject_INIT(o, t); - PyObject_GC_Track(o); - } else { - o = (*t->tp_alloc)(t, 0); - if (unlikely(!o)) return 0; - } - return o; -} - -static void __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(PyObject *o) { - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)o; - PyObject_GC_UnTrack(o); - Py_CLEAR(p->__pyx_outer_scope); - Py_CLEAR(p->__pyx_v_name); - Py_CLEAR(p->__pyx_v_val); - if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr)))) { - __pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr[__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr++] = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)o); - } else { - (*Py_TYPE(o)->tp_free)(o); - } -} - -static int __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)o; - if (p->__pyx_outer_scope) { - e = (*v)(((PyObject *)p->__pyx_outer_scope), a); if (e) return e; - } - if (p->__pyx_v_name) { - e = (*v)(p->__pyx_v_name, a); if (e) return e; - } - if (p->__pyx_v_val) { - e = (*v)(p->__pyx_v_val, a); if (e) return e; - } - return 0; -} - -static PyTypeObject __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = { - PyVarObject_HEAD_INIT(0, 0) - "aiohttp._http_parser.__pyx_scope_struct_1_genexpr", /*tp_name*/ - sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - 0, /*tp_doc*/ - __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - 0, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - 0, /*tp_finalize*/ - #endif - #if PY_VERSION_HEX >= 0x030800b1 - 0, /*tp_vectorcall*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 - 0, /*tp_print*/ - #endif -}; - -static struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__[8]; -static int __pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ = 0; - -static PyObject *__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { - PyObject *o; - if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__)))) { - o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__[--__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__]; - memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__)); - (void) PyObject_INIT(o, t); - PyObject_GC_Track(o); - } else { - o = (*t->tp_alloc)(t, 0); - if (unlikely(!o)) return 0; - } - return o; -} - -static void __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__(PyObject *o) { - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)o; - PyObject_GC_UnTrack(o); - Py_CLEAR(p->__pyx_v_info); - if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__)))) { - __pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__[__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__++] = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)o); - } else { - (*Py_TYPE(o)->tp_free)(o); - } -} - -static int __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)o; - if (p->__pyx_v_info) { - e = (*v)(p->__pyx_v_info, a); if (e) return e; - } - return 0; -} - -static int __pyx_tp_clear_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__(PyObject *o) { - PyObject* tmp; - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)o; - tmp = ((PyObject*)p->__pyx_v_info); - p->__pyx_v_info = ((PyObject*)Py_None); Py_INCREF(Py_None); - Py_XDECREF(tmp); - return 0; -} - -static PyTypeObject __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ = { - PyVarObject_HEAD_INIT(0, 0) - "aiohttp._http_parser.__pyx_scope_struct_2___repr__", /*tp_name*/ - sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - 0, /*tp_doc*/ - __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__, /*tp_traverse*/ - __pyx_tp_clear_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - 0, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - 0, /*tp_finalize*/ - #endif - #if PY_VERSION_HEX >= 0x030800b1 - 0, /*tp_vectorcall*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 - 0, /*tp_print*/ - #endif -}; - -static struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr[8]; -static int __pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr = 0; - -static PyObject *__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { - PyObject *o; - if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr)))) { - o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr[--__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr]; - memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr)); - (void) PyObject_INIT(o, t); - PyObject_GC_Track(o); - } else { - o = (*t->tp_alloc)(t, 0); - if (unlikely(!o)) return 0; - } - return o; -} - -static void __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr(PyObject *o) { - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)o; - PyObject_GC_UnTrack(o); - Py_CLEAR(p->__pyx_outer_scope); - Py_CLEAR(p->__pyx_v_name); - Py_CLEAR(p->__pyx_v_val); - if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr)))) { - __pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr[__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr++] = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)o); - } else { - (*Py_TYPE(o)->tp_free)(o); - } -} - -static int __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr(PyObject *o, visitproc v, void *a) { - int e; - struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)o; - if (p->__pyx_outer_scope) { - e = (*v)(((PyObject *)p->__pyx_outer_scope), a); if (e) return e; - } - if (p->__pyx_v_name) { - e = (*v)(p->__pyx_v_name, a); if (e) return e; - } - if (p->__pyx_v_val) { - e = (*v)(p->__pyx_v_val, a); if (e) return e; - } - return 0; -} - -static PyTypeObject __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr = { - PyVarObject_HEAD_INIT(0, 0) - "aiohttp._http_parser.__pyx_scope_struct_3_genexpr", /*tp_name*/ - sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ - 0, /*tp_doc*/ - __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - 0, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - 0, /*tp_finalize*/ - #endif - #if PY_VERSION_HEX >= 0x030800b1 - 0, /*tp_vectorcall*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 - 0, /*tp_print*/ - #endif -}; - -static PyMethodDef __pyx_methods[] = { - {0, 0, 0, 0} -}; - -#if PY_MAJOR_VERSION >= 3 -#if CYTHON_PEP489_MULTI_PHASE_INIT -static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ -static int __pyx_pymod_exec__http_parser(PyObject* module); /*proto*/ -static PyModuleDef_Slot __pyx_moduledef_slots[] = { - {Py_mod_create, (void*)__pyx_pymod_create}, - {Py_mod_exec, (void*)__pyx_pymod_exec__http_parser}, - {0, NULL} -}; -#endif - -static struct PyModuleDef __pyx_moduledef = { - PyModuleDef_HEAD_INIT, - "_http_parser", - 0, /* m_doc */ - #if CYTHON_PEP489_MULTI_PHASE_INIT - 0, /* m_size */ - #else - -1, /* m_size */ - #endif - __pyx_methods /* m_methods */, - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_moduledef_slots, /* m_slots */ - #else - NULL, /* m_reload */ - #endif - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ -}; -#endif -#ifndef CYTHON_SMALL_CODE -#if defined(__clang__) - #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) - #define CYTHON_SMALL_CODE __attribute__((cold)) -#else - #define CYTHON_SMALL_CODE -#endif -#endif - -static __Pyx_StringTabEntry __pyx_string_tab[] = { - {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0}, - {&__pyx_n_s_ACCEPT, __pyx_k_ACCEPT, sizeof(__pyx_k_ACCEPT), 0, 0, 1, 1}, - {&__pyx_n_s_ACCEPT_CHARSET, __pyx_k_ACCEPT_CHARSET, sizeof(__pyx_k_ACCEPT_CHARSET), 0, 0, 1, 1}, - {&__pyx_n_s_ACCEPT_ENCODING, __pyx_k_ACCEPT_ENCODING, sizeof(__pyx_k_ACCEPT_ENCODING), 0, 0, 1, 1}, - {&__pyx_n_s_ACCEPT_LANGUAGE, __pyx_k_ACCEPT_LANGUAGE, sizeof(__pyx_k_ACCEPT_LANGUAGE), 0, 0, 1, 1}, - {&__pyx_n_s_ACCEPT_RANGES, __pyx_k_ACCEPT_RANGES, sizeof(__pyx_k_ACCEPT_RANGES), 0, 0, 1, 1}, - {&__pyx_n_s_ACCESS_CONTROL_ALLOW_CREDENTIALS, __pyx_k_ACCESS_CONTROL_ALLOW_CREDENTIALS, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_CREDENTIALS), 0, 0, 1, 1}, - {&__pyx_n_s_ACCESS_CONTROL_ALLOW_HEADERS, __pyx_k_ACCESS_CONTROL_ALLOW_HEADERS, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_HEADERS), 0, 0, 1, 1}, - {&__pyx_n_s_ACCESS_CONTROL_ALLOW_METHODS, __pyx_k_ACCESS_CONTROL_ALLOW_METHODS, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_METHODS), 0, 0, 1, 1}, - {&__pyx_n_s_ACCESS_CONTROL_ALLOW_ORIGIN, __pyx_k_ACCESS_CONTROL_ALLOW_ORIGIN, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_ORIGIN), 0, 0, 1, 1}, - {&__pyx_n_s_ACCESS_CONTROL_EXPOSE_HEADERS, __pyx_k_ACCESS_CONTROL_EXPOSE_HEADERS, sizeof(__pyx_k_ACCESS_CONTROL_EXPOSE_HEADERS), 0, 0, 1, 1}, - {&__pyx_n_s_ACCESS_CONTROL_MAX_AGE, __pyx_k_ACCESS_CONTROL_MAX_AGE, sizeof(__pyx_k_ACCESS_CONTROL_MAX_AGE), 0, 0, 1, 1}, - {&__pyx_n_s_ACCESS_CONTROL_REQUEST_HEADERS, __pyx_k_ACCESS_CONTROL_REQUEST_HEADERS, sizeof(__pyx_k_ACCESS_CONTROL_REQUEST_HEADERS), 0, 0, 1, 1}, - {&__pyx_n_s_ACCESS_CONTROL_REQUEST_METHOD, __pyx_k_ACCESS_CONTROL_REQUEST_METHOD, sizeof(__pyx_k_ACCESS_CONTROL_REQUEST_METHOD), 0, 0, 1, 1}, - {&__pyx_n_s_AGE, __pyx_k_AGE, sizeof(__pyx_k_AGE), 0, 0, 1, 1}, - {&__pyx_n_s_ALLOW, __pyx_k_ALLOW, sizeof(__pyx_k_ALLOW), 0, 0, 1, 1}, - {&__pyx_n_s_AUTHORIZATION, __pyx_k_AUTHORIZATION, sizeof(__pyx_k_AUTHORIZATION), 0, 0, 1, 1}, - {&__pyx_n_s_BadHttpMessage, __pyx_k_BadHttpMessage, sizeof(__pyx_k_BadHttpMessage), 0, 0, 1, 1}, - {&__pyx_n_s_BadStatusLine, __pyx_k_BadStatusLine, sizeof(__pyx_k_BadStatusLine), 0, 0, 1, 1}, - {&__pyx_n_s_BaseException, __pyx_k_BaseException, sizeof(__pyx_k_BaseException), 0, 0, 1, 1}, - {&__pyx_n_s_CACHE_CONTROL, __pyx_k_CACHE_CONTROL, sizeof(__pyx_k_CACHE_CONTROL), 0, 0, 1, 1}, - {&__pyx_n_s_CIMultiDict, __pyx_k_CIMultiDict, sizeof(__pyx_k_CIMultiDict), 0, 0, 1, 1}, - {&__pyx_n_s_CIMultiDictProxy, __pyx_k_CIMultiDictProxy, sizeof(__pyx_k_CIMultiDictProxy), 0, 0, 1, 1}, - {&__pyx_n_s_CIMultiDictProxy_2, __pyx_k_CIMultiDictProxy_2, sizeof(__pyx_k_CIMultiDictProxy_2), 0, 0, 1, 1}, - {&__pyx_n_s_CIMultiDict_2, __pyx_k_CIMultiDict_2, sizeof(__pyx_k_CIMultiDict_2), 0, 0, 1, 1}, - {&__pyx_n_s_CONNECTION, __pyx_k_CONNECTION, sizeof(__pyx_k_CONNECTION), 0, 0, 1, 1}, - {&__pyx_n_s_CONTENT_DISPOSITION, __pyx_k_CONTENT_DISPOSITION, sizeof(__pyx_k_CONTENT_DISPOSITION), 0, 0, 1, 1}, - {&__pyx_n_s_CONTENT_ENCODING, __pyx_k_CONTENT_ENCODING, sizeof(__pyx_k_CONTENT_ENCODING), 0, 0, 1, 1}, - {&__pyx_n_s_CONTENT_LANGUAGE, __pyx_k_CONTENT_LANGUAGE, sizeof(__pyx_k_CONTENT_LANGUAGE), 0, 0, 1, 1}, - {&__pyx_n_s_CONTENT_LENGTH, __pyx_k_CONTENT_LENGTH, sizeof(__pyx_k_CONTENT_LENGTH), 0, 0, 1, 1}, - {&__pyx_n_s_CONTENT_LOCATION, __pyx_k_CONTENT_LOCATION, sizeof(__pyx_k_CONTENT_LOCATION), 0, 0, 1, 1}, - {&__pyx_n_s_CONTENT_MD5, __pyx_k_CONTENT_MD5, sizeof(__pyx_k_CONTENT_MD5), 0, 0, 1, 1}, - {&__pyx_n_s_CONTENT_RANGE, __pyx_k_CONTENT_RANGE, sizeof(__pyx_k_CONTENT_RANGE), 0, 0, 1, 1}, - {&__pyx_n_s_CONTENT_TRANSFER_ENCODING, __pyx_k_CONTENT_TRANSFER_ENCODING, sizeof(__pyx_k_CONTENT_TRANSFER_ENCODING), 0, 0, 1, 1}, - {&__pyx_n_s_CONTENT_TYPE, __pyx_k_CONTENT_TYPE, sizeof(__pyx_k_CONTENT_TYPE), 0, 0, 1, 1}, - {&__pyx_n_s_COOKIE, __pyx_k_COOKIE, sizeof(__pyx_k_COOKIE), 0, 0, 1, 1}, - {&__pyx_n_s_ContentLengthError, __pyx_k_ContentLengthError, sizeof(__pyx_k_ContentLengthError), 0, 0, 1, 1}, - {&__pyx_n_s_DATE, __pyx_k_DATE, sizeof(__pyx_k_DATE), 0, 0, 1, 1}, - {&__pyx_n_s_DESTINATION, __pyx_k_DESTINATION, sizeof(__pyx_k_DESTINATION), 0, 0, 1, 1}, - {&__pyx_n_s_DIGEST, __pyx_k_DIGEST, sizeof(__pyx_k_DIGEST), 0, 0, 1, 1}, - {&__pyx_n_s_DeflateBuffer, __pyx_k_DeflateBuffer, sizeof(__pyx_k_DeflateBuffer), 0, 0, 1, 1}, - {&__pyx_n_s_DeflateBuffer_2, __pyx_k_DeflateBuffer_2, sizeof(__pyx_k_DeflateBuffer_2), 0, 0, 1, 1}, - {&__pyx_n_s_EMPTY_PAYLOAD, __pyx_k_EMPTY_PAYLOAD, sizeof(__pyx_k_EMPTY_PAYLOAD), 0, 0, 1, 1}, - {&__pyx_n_s_EMPTY_PAYLOAD_2, __pyx_k_EMPTY_PAYLOAD_2, sizeof(__pyx_k_EMPTY_PAYLOAD_2), 0, 0, 1, 1}, - {&__pyx_n_s_ETAG, __pyx_k_ETAG, sizeof(__pyx_k_ETAG), 0, 0, 1, 1}, - {&__pyx_n_s_EXPECT, __pyx_k_EXPECT, sizeof(__pyx_k_EXPECT), 0, 0, 1, 1}, - {&__pyx_n_s_EXPIRES, __pyx_k_EXPIRES, sizeof(__pyx_k_EXPIRES), 0, 0, 1, 1}, - {&__pyx_n_s_FORWARDED, __pyx_k_FORWARDED, sizeof(__pyx_k_FORWARDED), 0, 0, 1, 1}, - {&__pyx_n_s_FROM, __pyx_k_FROM, sizeof(__pyx_k_FROM), 0, 0, 1, 1}, - {&__pyx_n_s_HOST, __pyx_k_HOST, sizeof(__pyx_k_HOST), 0, 0, 1, 1}, - {&__pyx_kp_u_Header_name_is_too_long, __pyx_k_Header_name_is_too_long, sizeof(__pyx_k_Header_name_is_too_long), 0, 1, 0, 0}, - {&__pyx_kp_u_Header_value_is_too_long, __pyx_k_Header_value_is_too_long, sizeof(__pyx_k_Header_value_is_too_long), 0, 1, 0, 0}, - {&__pyx_n_s_HttpRequestParser, __pyx_k_HttpRequestParser, sizeof(__pyx_k_HttpRequestParser), 0, 0, 1, 1}, - {&__pyx_n_u_HttpRequestParser, __pyx_k_HttpRequestParser, sizeof(__pyx_k_HttpRequestParser), 0, 1, 0, 1}, - {&__pyx_n_s_HttpResponseParser, __pyx_k_HttpResponseParser, sizeof(__pyx_k_HttpResponseParser), 0, 0, 1, 1}, - {&__pyx_n_u_HttpResponseParser, __pyx_k_HttpResponseParser, sizeof(__pyx_k_HttpResponseParser), 0, 1, 0, 1}, - {&__pyx_n_s_HttpVersion, __pyx_k_HttpVersion, sizeof(__pyx_k_HttpVersion), 0, 0, 1, 1}, - {&__pyx_n_s_HttpVersion10, __pyx_k_HttpVersion10, sizeof(__pyx_k_HttpVersion10), 0, 0, 1, 1}, - {&__pyx_n_s_HttpVersion10_2, __pyx_k_HttpVersion10_2, sizeof(__pyx_k_HttpVersion10_2), 0, 0, 1, 1}, - {&__pyx_n_s_HttpVersion11, __pyx_k_HttpVersion11, sizeof(__pyx_k_HttpVersion11), 0, 0, 1, 1}, - {&__pyx_n_s_HttpVersion11_2, __pyx_k_HttpVersion11_2, sizeof(__pyx_k_HttpVersion11_2), 0, 0, 1, 1}, - {&__pyx_n_s_HttpVersion_2, __pyx_k_HttpVersion_2, sizeof(__pyx_k_HttpVersion_2), 0, 0, 1, 1}, - {&__pyx_n_s_IF_MATCH, __pyx_k_IF_MATCH, sizeof(__pyx_k_IF_MATCH), 0, 0, 1, 1}, - {&__pyx_n_s_IF_MODIFIED_SINCE, __pyx_k_IF_MODIFIED_SINCE, sizeof(__pyx_k_IF_MODIFIED_SINCE), 0, 0, 1, 1}, - {&__pyx_n_s_IF_NONE_MATCH, __pyx_k_IF_NONE_MATCH, sizeof(__pyx_k_IF_NONE_MATCH), 0, 0, 1, 1}, - {&__pyx_n_s_IF_RANGE, __pyx_k_IF_RANGE, sizeof(__pyx_k_IF_RANGE), 0, 0, 1, 1}, - {&__pyx_n_s_IF_UNMODIFIED_SINCE, __pyx_k_IF_UNMODIFIED_SINCE, sizeof(__pyx_k_IF_UNMODIFIED_SINCE), 0, 0, 1, 1}, - {&__pyx_kp_s_Incompatible_checksums_s_vs_0x14, __pyx_k_Incompatible_checksums_s_vs_0x14, sizeof(__pyx_k_Incompatible_checksums_s_vs_0x14), 0, 0, 1, 0}, - {&__pyx_kp_s_Incompatible_checksums_s_vs_0xc7, __pyx_k_Incompatible_checksums_s_vs_0xc7, sizeof(__pyx_k_Incompatible_checksums_s_vs_0xc7), 0, 0, 1, 0}, - {&__pyx_n_s_InvalidHeader, __pyx_k_InvalidHeader, sizeof(__pyx_k_InvalidHeader), 0, 0, 1, 1}, - {&__pyx_n_s_InvalidURLError, __pyx_k_InvalidURLError, sizeof(__pyx_k_InvalidURLError), 0, 0, 1, 1}, - {&__pyx_n_s_KEEP_ALIVE, __pyx_k_KEEP_ALIVE, sizeof(__pyx_k_KEEP_ALIVE), 0, 0, 1, 1}, - {&__pyx_n_s_LAST_EVENT_ID, __pyx_k_LAST_EVENT_ID, sizeof(__pyx_k_LAST_EVENT_ID), 0, 0, 1, 1}, - {&__pyx_n_s_LAST_MODIFIED, __pyx_k_LAST_MODIFIED, sizeof(__pyx_k_LAST_MODIFIED), 0, 0, 1, 1}, - {&__pyx_n_s_LINK, __pyx_k_LINK, sizeof(__pyx_k_LINK), 0, 0, 1, 1}, - {&__pyx_n_s_LOCATION, __pyx_k_LOCATION, sizeof(__pyx_k_LOCATION), 0, 0, 1, 1}, - {&__pyx_n_s_LineTooLong, __pyx_k_LineTooLong, sizeof(__pyx_k_LineTooLong), 0, 0, 1, 1}, - {&__pyx_n_s_MAX_FORWARDS, __pyx_k_MAX_FORWARDS, sizeof(__pyx_k_MAX_FORWARDS), 0, 0, 1, 1}, - {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, - {&__pyx_kp_u_Not_enough_data_for_satisfy_cont, __pyx_k_Not_enough_data_for_satisfy_cont, sizeof(__pyx_k_Not_enough_data_for_satisfy_cont), 0, 1, 0, 0}, - {&__pyx_kp_u_Not_enough_data_for_satisfy_tran, __pyx_k_Not_enough_data_for_satisfy_tran, sizeof(__pyx_k_Not_enough_data_for_satisfy_tran), 0, 1, 0, 0}, - {&__pyx_n_s_ORIGIN, __pyx_k_ORIGIN, sizeof(__pyx_k_ORIGIN), 0, 0, 1, 1}, - {&__pyx_n_s_PRAGMA, __pyx_k_PRAGMA, sizeof(__pyx_k_PRAGMA), 0, 0, 1, 1}, - {&__pyx_n_s_PROXY_AUTHENTICATE, __pyx_k_PROXY_AUTHENTICATE, sizeof(__pyx_k_PROXY_AUTHENTICATE), 0, 0, 1, 1}, - {&__pyx_n_s_PROXY_AUTHORIZATION, __pyx_k_PROXY_AUTHORIZATION, sizeof(__pyx_k_PROXY_AUTHORIZATION), 0, 0, 1, 1}, - {&__pyx_n_s_PayloadEncodingError, __pyx_k_PayloadEncodingError, sizeof(__pyx_k_PayloadEncodingError), 0, 0, 1, 1}, - {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, - {&__pyx_n_s_RANGE, __pyx_k_RANGE, sizeof(__pyx_k_RANGE), 0, 0, 1, 1}, - {&__pyx_n_s_REFERER, __pyx_k_REFERER, sizeof(__pyx_k_REFERER), 0, 0, 1, 1}, - {&__pyx_n_s_RETRY_AFTER, __pyx_k_RETRY_AFTER, sizeof(__pyx_k_RETRY_AFTER), 0, 0, 1, 1}, - {&__pyx_kp_u_RawRequestMessage, __pyx_k_RawRequestMessage, sizeof(__pyx_k_RawRequestMessage), 0, 1, 0, 0}, - {&__pyx_n_s_RawRequestMessage_2, __pyx_k_RawRequestMessage_2, sizeof(__pyx_k_RawRequestMessage_2), 0, 0, 1, 1}, - {&__pyx_n_u_RawRequestMessage_2, __pyx_k_RawRequestMessage_2, sizeof(__pyx_k_RawRequestMessage_2), 0, 1, 0, 1}, - {&__pyx_kp_u_RawResponseMessage, __pyx_k_RawResponseMessage, sizeof(__pyx_k_RawResponseMessage), 0, 1, 0, 0}, - {&__pyx_n_s_RawResponseMessage_2, __pyx_k_RawResponseMessage_2, sizeof(__pyx_k_RawResponseMessage_2), 0, 0, 1, 1}, - {&__pyx_n_u_RawResponseMessage_2, __pyx_k_RawResponseMessage_2, sizeof(__pyx_k_RawResponseMessage_2), 0, 1, 0, 1}, - {&__pyx_n_s_SEC_WEBSOCKET_ACCEPT, __pyx_k_SEC_WEBSOCKET_ACCEPT, sizeof(__pyx_k_SEC_WEBSOCKET_ACCEPT), 0, 0, 1, 1}, - {&__pyx_n_s_SEC_WEBSOCKET_EXTENSIONS, __pyx_k_SEC_WEBSOCKET_EXTENSIONS, sizeof(__pyx_k_SEC_WEBSOCKET_EXTENSIONS), 0, 0, 1, 1}, - {&__pyx_n_s_SEC_WEBSOCKET_KEY, __pyx_k_SEC_WEBSOCKET_KEY, sizeof(__pyx_k_SEC_WEBSOCKET_KEY), 0, 0, 1, 1}, - {&__pyx_n_s_SEC_WEBSOCKET_KEY1, __pyx_k_SEC_WEBSOCKET_KEY1, sizeof(__pyx_k_SEC_WEBSOCKET_KEY1), 0, 0, 1, 1}, - {&__pyx_n_s_SEC_WEBSOCKET_PROTOCOL, __pyx_k_SEC_WEBSOCKET_PROTOCOL, sizeof(__pyx_k_SEC_WEBSOCKET_PROTOCOL), 0, 0, 1, 1}, - {&__pyx_n_s_SEC_WEBSOCKET_VERSION, __pyx_k_SEC_WEBSOCKET_VERSION, sizeof(__pyx_k_SEC_WEBSOCKET_VERSION), 0, 0, 1, 1}, - {&__pyx_n_s_SERVER, __pyx_k_SERVER, sizeof(__pyx_k_SERVER), 0, 0, 1, 1}, - {&__pyx_n_s_SET_COOKIE, __pyx_k_SET_COOKIE, sizeof(__pyx_k_SET_COOKIE), 0, 0, 1, 1}, - {&__pyx_kp_u_Status_line_is_too_long, __pyx_k_Status_line_is_too_long, sizeof(__pyx_k_Status_line_is_too_long), 0, 1, 0, 0}, - {&__pyx_n_s_StreamReader, __pyx_k_StreamReader, sizeof(__pyx_k_StreamReader), 0, 0, 1, 1}, - {&__pyx_n_s_StreamReader_2, __pyx_k_StreamReader_2, sizeof(__pyx_k_StreamReader_2), 0, 0, 1, 1}, - {&__pyx_n_s_TE, __pyx_k_TE, sizeof(__pyx_k_TE), 0, 0, 1, 1}, - {&__pyx_n_s_TRAILER, __pyx_k_TRAILER, sizeof(__pyx_k_TRAILER), 0, 0, 1, 1}, - {&__pyx_n_s_TRANSFER_ENCODING, __pyx_k_TRANSFER_ENCODING, sizeof(__pyx_k_TRANSFER_ENCODING), 0, 0, 1, 1}, - {&__pyx_n_s_TransferEncodingError, __pyx_k_TransferEncodingError, sizeof(__pyx_k_TransferEncodingError), 0, 0, 1, 1}, - {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, - {&__pyx_n_s_UPGRADE, __pyx_k_UPGRADE, sizeof(__pyx_k_UPGRADE), 0, 0, 1, 1}, - {&__pyx_n_s_URI, __pyx_k_URI, sizeof(__pyx_k_URI), 0, 0, 1, 1}, - {&__pyx_n_s_URL, __pyx_k_URL, sizeof(__pyx_k_URL), 0, 0, 1, 1}, - {&__pyx_n_s_URL_2, __pyx_k_URL_2, sizeof(__pyx_k_URL_2), 0, 0, 1, 1}, - {&__pyx_n_s_USER_AGENT, __pyx_k_USER_AGENT, sizeof(__pyx_k_USER_AGENT), 0, 0, 1, 1}, - {&__pyx_n_s_VARY, __pyx_k_VARY, sizeof(__pyx_k_VARY), 0, 0, 1, 1}, - {&__pyx_n_s_VIA, __pyx_k_VIA, sizeof(__pyx_k_VIA), 0, 0, 1, 1}, - {&__pyx_n_s_WANT_DIGEST, __pyx_k_WANT_DIGEST, sizeof(__pyx_k_WANT_DIGEST), 0, 0, 1, 1}, - {&__pyx_n_s_WARNING, __pyx_k_WARNING, sizeof(__pyx_k_WARNING), 0, 0, 1, 1}, - {&__pyx_n_s_WWW_AUTHENTICATE, __pyx_k_WWW_AUTHENTICATE, sizeof(__pyx_k_WWW_AUTHENTICATE), 0, 0, 1, 1}, - {&__pyx_n_s_X_FORWARDED_FOR, __pyx_k_X_FORWARDED_FOR, sizeof(__pyx_k_X_FORWARDED_FOR), 0, 0, 1, 1}, - {&__pyx_n_s_X_FORWARDED_HOST, __pyx_k_X_FORWARDED_HOST, sizeof(__pyx_k_X_FORWARDED_HOST), 0, 0, 1, 1}, - {&__pyx_n_s_X_FORWARDED_PROTO, __pyx_k_X_FORWARDED_PROTO, sizeof(__pyx_k_X_FORWARDED_PROTO), 0, 0, 1, 1}, - {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0}, - {&__pyx_kp_u__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 1, 0, 0}, - {&__pyx_n_s__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 0, 1, 1}, - {&__pyx_kp_b__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 0, 0, 0}, - {&__pyx_kp_u__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 1, 0, 0}, - {&__pyx_kp_u__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 1, 0, 0}, - {&__pyx_kp_u__8, __pyx_k__8, sizeof(__pyx_k__8), 0, 1, 0, 0}, - {&__pyx_n_s_add, __pyx_k_add, sizeof(__pyx_k_add), 0, 0, 1, 1}, - {&__pyx_n_s_aiohttp, __pyx_k_aiohttp, sizeof(__pyx_k_aiohttp), 0, 0, 1, 1}, - {&__pyx_n_s_aiohttp__http_parser, __pyx_k_aiohttp__http_parser, sizeof(__pyx_k_aiohttp__http_parser), 0, 0, 1, 1}, - {&__pyx_n_s_all, __pyx_k_all, sizeof(__pyx_k_all), 0, 0, 1, 1}, - {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1}, - {&__pyx_n_s_auto_decompress, __pyx_k_auto_decompress, sizeof(__pyx_k_auto_decompress), 0, 0, 1, 1}, - {&__pyx_n_s_begin_http_chunk_receiving, __pyx_k_begin_http_chunk_receiving, sizeof(__pyx_k_begin_http_chunk_receiving), 0, 0, 1, 1}, - {&__pyx_n_u_br, __pyx_k_br, sizeof(__pyx_k_br), 0, 1, 0, 1}, - {&__pyx_n_s_build, __pyx_k_build, sizeof(__pyx_k_build), 0, 0, 1, 1}, - {&__pyx_n_s_chunked, __pyx_k_chunked, sizeof(__pyx_k_chunked), 0, 0, 1, 1}, - {&__pyx_n_u_chunked, __pyx_k_chunked, sizeof(__pyx_k_chunked), 0, 1, 0, 1}, - {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, - {&__pyx_n_s_close, __pyx_k_close, sizeof(__pyx_k_close), 0, 0, 1, 1}, - {&__pyx_n_s_code, __pyx_k_code, sizeof(__pyx_k_code), 0, 0, 1, 1}, - {&__pyx_n_u_code, __pyx_k_code, sizeof(__pyx_k_code), 0, 1, 0, 1}, - {&__pyx_n_s_compression, __pyx_k_compression, sizeof(__pyx_k_compression), 0, 0, 1, 1}, - {&__pyx_n_u_compression, __pyx_k_compression, sizeof(__pyx_k_compression), 0, 1, 0, 1}, - {&__pyx_n_u_deflate, __pyx_k_deflate, sizeof(__pyx_k_deflate), 0, 1, 0, 1}, - {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, - {&__pyx_n_s_encoded, __pyx_k_encoded, sizeof(__pyx_k_encoded), 0, 0, 1, 1}, - {&__pyx_n_s_end_http_chunk_receiving, __pyx_k_end_http_chunk_receiving, sizeof(__pyx_k_end_http_chunk_receiving), 0, 0, 1, 1}, - {&__pyx_n_s_feed_data, __pyx_k_feed_data, sizeof(__pyx_k_feed_data), 0, 0, 1, 1}, - {&__pyx_n_s_feed_eof, __pyx_k_feed_eof, sizeof(__pyx_k_feed_eof), 0, 0, 1, 1}, - {&__pyx_n_s_fragment, __pyx_k_fragment, sizeof(__pyx_k_fragment), 0, 0, 1, 1}, - {&__pyx_n_s_genexpr, __pyx_k_genexpr, sizeof(__pyx_k_genexpr), 0, 0, 1, 1}, - {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, - {&__pyx_n_u_gzip, __pyx_k_gzip, sizeof(__pyx_k_gzip), 0, 1, 0, 1}, - {&__pyx_n_s_hdrs, __pyx_k_hdrs, sizeof(__pyx_k_hdrs), 0, 0, 1, 1}, - {&__pyx_n_s_headers, __pyx_k_headers, sizeof(__pyx_k_headers), 0, 0, 1, 1}, - {&__pyx_n_u_headers, __pyx_k_headers, sizeof(__pyx_k_headers), 0, 1, 0, 1}, - {&__pyx_n_s_http_exceptions, __pyx_k_http_exceptions, sizeof(__pyx_k_http_exceptions), 0, 0, 1, 1}, - {&__pyx_n_s_http_parser, __pyx_k_http_parser, sizeof(__pyx_k_http_parser), 0, 0, 1, 1}, - {&__pyx_n_s_http_writer, __pyx_k_http_writer, sizeof(__pyx_k_http_writer), 0, 0, 1, 1}, - {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, - {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, - {&__pyx_n_s_limit, __pyx_k_limit, sizeof(__pyx_k_limit), 0, 0, 1, 1}, - {&__pyx_n_s_loop, __pyx_k_loop, sizeof(__pyx_k_loop), 0, 0, 1, 1}, - {&__pyx_n_s_lower, __pyx_k_lower, sizeof(__pyx_k_lower), 0, 0, 1, 1}, - {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, - {&__pyx_n_s_max_field_size, __pyx_k_max_field_size, sizeof(__pyx_k_max_field_size), 0, 0, 1, 1}, - {&__pyx_n_s_max_headers, __pyx_k_max_headers, sizeof(__pyx_k_max_headers), 0, 0, 1, 1}, - {&__pyx_n_s_max_line_size, __pyx_k_max_line_size, sizeof(__pyx_k_max_line_size), 0, 0, 1, 1}, - {&__pyx_n_s_method, __pyx_k_method, sizeof(__pyx_k_method), 0, 0, 1, 1}, - {&__pyx_n_u_method, __pyx_k_method, sizeof(__pyx_k_method), 0, 1, 0, 1}, - {&__pyx_n_s_multidict, __pyx_k_multidict, sizeof(__pyx_k_multidict), 0, 0, 1, 1}, - {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, - {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, - {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, - {&__pyx_n_s_path, __pyx_k_path, sizeof(__pyx_k_path), 0, 0, 1, 1}, - {&__pyx_n_u_path, __pyx_k_path, sizeof(__pyx_k_path), 0, 1, 0, 1}, - {&__pyx_n_s_payload_exception, __pyx_k_payload_exception, sizeof(__pyx_k_payload_exception), 0, 0, 1, 1}, - {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, - {&__pyx_n_s_protocol, __pyx_k_protocol, sizeof(__pyx_k_protocol), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_unpickle_RawRequestMessage, __pyx_k_pyx_unpickle_RawRequestMessage, sizeof(__pyx_k_pyx_unpickle_RawRequestMessage), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_unpickle_RawResponseMessag, __pyx_k_pyx_unpickle_RawResponseMessag, sizeof(__pyx_k_pyx_unpickle_RawResponseMessag), 0, 0, 1, 1}, - {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, - {&__pyx_n_s_query_string, __pyx_k_query_string, sizeof(__pyx_k_query_string), 0, 0, 1, 1}, - {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, - {&__pyx_n_s_raw_headers, __pyx_k_raw_headers, sizeof(__pyx_k_raw_headers), 0, 0, 1, 1}, - {&__pyx_n_u_raw_headers, __pyx_k_raw_headers, sizeof(__pyx_k_raw_headers), 0, 1, 0, 1}, - {&__pyx_n_s_read_until_eof, __pyx_k_read_until_eof, sizeof(__pyx_k_read_until_eof), 0, 0, 1, 1}, - {&__pyx_n_s_reason, __pyx_k_reason, sizeof(__pyx_k_reason), 0, 0, 1, 1}, - {&__pyx_n_u_reason, __pyx_k_reason, sizeof(__pyx_k_reason), 0, 1, 0, 1}, - {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, - {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, - {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, - {&__pyx_n_s_repr___locals_genexpr, __pyx_k_repr___locals_genexpr, sizeof(__pyx_k_repr___locals_genexpr), 0, 0, 1, 1}, - {&__pyx_n_s_response_with_body, __pyx_k_response_with_body, sizeof(__pyx_k_response_with_body), 0, 0, 1, 1}, - {&__pyx_n_s_send, __pyx_k_send, sizeof(__pyx_k_send), 0, 0, 1, 1}, - {&__pyx_n_s_set_exception, __pyx_k_set_exception, sizeof(__pyx_k_set_exception), 0, 0, 1, 1}, - {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, - {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, - {&__pyx_n_s_should_close, __pyx_k_should_close, sizeof(__pyx_k_should_close), 0, 0, 1, 1}, - {&__pyx_n_u_should_close, __pyx_k_should_close, sizeof(__pyx_k_should_close), 0, 1, 0, 1}, - {&__pyx_n_s_streams, __pyx_k_streams, sizeof(__pyx_k_streams), 0, 0, 1, 1}, - {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, - {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, - {&__pyx_n_s_throw, __pyx_k_throw, sizeof(__pyx_k_throw), 0, 0, 1, 1}, - {&__pyx_n_s_timer, __pyx_k_timer, sizeof(__pyx_k_timer), 0, 0, 1, 1}, - {&__pyx_kp_u_unknown, __pyx_k_unknown, sizeof(__pyx_k_unknown), 0, 1, 0, 0}, - {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, - {&__pyx_n_s_upgrade, __pyx_k_upgrade, sizeof(__pyx_k_upgrade), 0, 0, 1, 1}, - {&__pyx_n_u_upgrade, __pyx_k_upgrade, sizeof(__pyx_k_upgrade), 0, 1, 0, 1}, - {&__pyx_n_s_url, __pyx_k_url, sizeof(__pyx_k_url), 0, 0, 1, 1}, - {&__pyx_n_u_url, __pyx_k_url, sizeof(__pyx_k_url), 0, 1, 0, 1}, - {&__pyx_n_s_version, __pyx_k_version, sizeof(__pyx_k_version), 0, 0, 1, 1}, - {&__pyx_n_u_version, __pyx_k_version, sizeof(__pyx_k_version), 0, 1, 0, 1}, - {&__pyx_n_s_yarl, __pyx_k_yarl, sizeof(__pyx_k_yarl), 0, 0, 1, 1}, - {0, 0, 0, 0, 0, 0, 0} -}; -static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 87, __pyx_L1_error) - __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(0, 316, __pyx_L1_error) - __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(1, 2, __pyx_L1_error) - __pyx_builtin_BaseException = __Pyx_GetBuiltinName(__pyx_n_s_BaseException); if (!__pyx_builtin_BaseException) __PYX_ERR(0, 662, __pyx_L1_error) - return 0; - __pyx_L1_error:; - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__5); - __Pyx_GIVEREF(__pyx_tuple__5); - - /* "(tree fragment)":4 - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - */ - __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(1, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__6); - __Pyx_GIVEREF(__pyx_tuple__6); - - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(1, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__9); - __Pyx_GIVEREF(__pyx_tuple__9); - - /* "(tree fragment)":4 - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - */ - __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(1, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__10); - __Pyx_GIVEREF(__pyx_tuple__10); - - /* "(tree fragment)":2 - * def __reduce_cython__(self): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - */ - __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(1, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__11); - __Pyx_GIVEREF(__pyx_tuple__11); - - /* "(tree fragment)":4 - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") - * def __setstate_cython__(self, __pyx_state): - * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< - */ - __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(1, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__12); - __Pyx_GIVEREF(__pyx_tuple__12); - - /* "aiohttp/_http_parser.pyx":57 - * char* PyByteArray_AsString(object) - * - * __all__ = ('HttpRequestParser', 'HttpResponseParser', # <<<<<<<<<<<<<< - * 'RawRequestMessage', 'RawResponseMessage') - * - */ - __pyx_tuple__13 = PyTuple_Pack(4, __pyx_n_u_HttpRequestParser, __pyx_n_u_HttpResponseParser, __pyx_n_u_RawRequestMessage_2, __pyx_n_u_RawResponseMessage_2); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 57, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__13); - __Pyx_GIVEREF(__pyx_tuple__13); - - /* "(tree fragment)":1 - * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - __pyx_tuple__14 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(1, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__14); - __Pyx_GIVEREF(__pyx_tuple__14); - __pyx_codeobj__15 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__14, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_RawRequestMessage, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__15)) __PYX_ERR(1, 1, __pyx_L1_error) - __pyx_tuple__16 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(1, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__16); - __Pyx_GIVEREF(__pyx_tuple__16); - __pyx_codeobj__17 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__16, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_RawResponseMessag, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__17)) __PYX_ERR(1, 1, __pyx_L1_error) - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_RefNannyFinishContext(); - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { - if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); - __pyx_int_21004882 = PyInt_FromLong(21004882L); if (unlikely(!__pyx_int_21004882)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_209127132 = PyInt_FromLong(209127132L); if (unlikely(!__pyx_int_209127132)) __PYX_ERR(0, 1, __pyx_L1_error) - return 0; - __pyx_L1_error:; - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ - -static int __Pyx_modinit_global_init_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); - /*--- Global init code ---*/ - __pyx_v_7aiohttp_12_http_parser_headers = ((PyObject*)Py_None); Py_INCREF(Py_None); - __pyx_v_7aiohttp_12_http_parser_URL = Py_None; Py_INCREF(Py_None); - __pyx_v_7aiohttp_12_http_parser_URL_build = Py_None; Py_INCREF(Py_None); - __pyx_v_7aiohttp_12_http_parser_CIMultiDict = Py_None; Py_INCREF(Py_None); - __pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy = Py_None; Py_INCREF(Py_None); - __pyx_v_7aiohttp_12_http_parser_HttpVersion = Py_None; Py_INCREF(Py_None); - __pyx_v_7aiohttp_12_http_parser_HttpVersion10 = Py_None; Py_INCREF(Py_None); - __pyx_v_7aiohttp_12_http_parser_HttpVersion11 = Py_None; Py_INCREF(Py_None); - __pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1 = Py_None; Py_INCREF(Py_None); - __pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING = Py_None; Py_INCREF(Py_None); - __pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD = Py_None; Py_INCREF(Py_None); - __pyx_v_7aiohttp_12_http_parser_StreamReader = Py_None; Py_INCREF(Py_None); - __pyx_v_7aiohttp_12_http_parser_DeflateBuffer = Py_None; Py_INCREF(Py_None); - __pyx_v_7aiohttp_12_http_parser__http_method = ((PyObject*)Py_None); Py_INCREF(Py_None); - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_variable_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); - /*--- Variable export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); - /*--- Function export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_type_init_code(void) { - __Pyx_RefNannyDeclarations - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); - /*--- Type init code ---*/ - if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser_RawRequestMessage) < 0) __PYX_ERR(0, 110, __pyx_L1_error) - #if PY_VERSION_HEX < 0x030800B1 - __pyx_type_7aiohttp_12_http_parser_RawRequestMessage.tp_print = 0; - #endif - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser_RawRequestMessage.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser_RawRequestMessage.tp_getattro == PyObject_GenericGetAttr)) { - __pyx_type_7aiohttp_12_http_parser_RawRequestMessage.tp_getattro = __Pyx_PyObject_GenericGetAttr; - } - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_RawRequestMessage_2, (PyObject *)&__pyx_type_7aiohttp_12_http_parser_RawRequestMessage) < 0) __PYX_ERR(0, 110, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_12_http_parser_RawRequestMessage) < 0) __PYX_ERR(0, 110, __pyx_L1_error) - __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage = &__pyx_type_7aiohttp_12_http_parser_RawRequestMessage; - if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser_RawResponseMessage) < 0) __PYX_ERR(0, 210, __pyx_L1_error) - #if PY_VERSION_HEX < 0x030800B1 - __pyx_type_7aiohttp_12_http_parser_RawResponseMessage.tp_print = 0; - #endif - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser_RawResponseMessage.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser_RawResponseMessage.tp_getattro == PyObject_GenericGetAttr)) { - __pyx_type_7aiohttp_12_http_parser_RawResponseMessage.tp_getattro = __Pyx_PyObject_GenericGetAttr; - } - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_RawResponseMessage_2, (PyObject *)&__pyx_type_7aiohttp_12_http_parser_RawResponseMessage) < 0) __PYX_ERR(0, 210, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_12_http_parser_RawResponseMessage) < 0) __PYX_ERR(0, 210, __pyx_L1_error) - __pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage = &__pyx_type_7aiohttp_12_http_parser_RawResponseMessage; - __pyx_vtabptr_7aiohttp_12_http_parser_HttpParser = &__pyx_vtable_7aiohttp_12_http_parser_HttpParser; - __pyx_vtable_7aiohttp_12_http_parser_HttpParser._init = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, enum llhttp_type, PyObject *, PyObject *, int, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args))__pyx_f_7aiohttp_12_http_parser_10HttpParser__init; - __pyx_vtable_7aiohttp_12_http_parser_HttpParser._process_header = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__process_header; - __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_header_field = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_field; - __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_header_value = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_value; - __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_headers_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_headers_complete; - __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_message_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_message_complete; - __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_chunk_header = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_header; - __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_chunk_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_complete; - __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_status_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_status_complete; - __pyx_vtable_7aiohttp_12_http_parser_HttpParser.http_version = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version; - if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser_HttpParser) < 0) __PYX_ERR(0, 272, __pyx_L1_error) - #if PY_VERSION_HEX < 0x030800B1 - __pyx_type_7aiohttp_12_http_parser_HttpParser.tp_print = 0; - #endif - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser_HttpParser.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser_HttpParser.tp_getattro == PyObject_GenericGetAttr)) { - __pyx_type_7aiohttp_12_http_parser_HttpParser.tp_getattro = __Pyx_PyObject_GenericGetAttr; - } - if (__Pyx_SetVtable(__pyx_type_7aiohttp_12_http_parser_HttpParser.tp_dict, __pyx_vtabptr_7aiohttp_12_http_parser_HttpParser) < 0) __PYX_ERR(0, 272, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_12_http_parser_HttpParser) < 0) __PYX_ERR(0, 272, __pyx_L1_error) - __pyx_ptype_7aiohttp_12_http_parser_HttpParser = &__pyx_type_7aiohttp_12_http_parser_HttpParser; - __pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser = &__pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser; - __pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser.__pyx_base = *__pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; - __pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser.__pyx_base._on_status_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_17HttpRequestParser__on_status_complete; - __pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_base = __pyx_ptype_7aiohttp_12_http_parser_HttpParser; - if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 568, __pyx_L1_error) - #if PY_VERSION_HEX < 0x030800B1 - __pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_print = 0; - #endif - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_getattro == PyObject_GenericGetAttr)) { - __pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_getattro = __Pyx_PyObject_GenericGetAttr; - } - if (__Pyx_SetVtable(__pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_dict, __pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 568, __pyx_L1_error) - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_HttpRequestParser, (PyObject *)&__pyx_type_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 568, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 568, __pyx_L1_error) - __pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser = &__pyx_type_7aiohttp_12_http_parser_HttpRequestParser; - __pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser = &__pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser; - __pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser.__pyx_base = *__pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; - __pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser.__pyx_base._on_status_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_18HttpResponseParser__on_status_complete; - __pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_base = __pyx_ptype_7aiohttp_12_http_parser_HttpParser; - if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 621, __pyx_L1_error) - #if PY_VERSION_HEX < 0x030800B1 - __pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_print = 0; - #endif - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_getattro == PyObject_GenericGetAttr)) { - __pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_getattro = __Pyx_PyObject_GenericGetAttr; - } - if (__Pyx_SetVtable(__pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_dict, __pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 621, __pyx_L1_error) - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_HttpResponseParser, (PyObject *)&__pyx_type_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 621, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 621, __pyx_L1_error) - __pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser = &__pyx_type_7aiohttp_12_http_parser_HttpResponseParser; - if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__) < 0) __PYX_ERR(0, 135, __pyx_L1_error) - #if PY_VERSION_HEX < 0x030800B1 - __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__.tp_print = 0; - #endif - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__.tp_getattro == PyObject_GenericGetAttr)) { - __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; - } - __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct____repr__ = &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__; - if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr) < 0) __PYX_ERR(0, 147, __pyx_L1_error) - #if PY_VERSION_HEX < 0x030800B1 - __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr.tp_print = 0; - #endif - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr.tp_getattro == PyObject_GenericGetAttr)) { - __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; - } - __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr; - if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__) < 0) __PYX_ERR(0, 233, __pyx_L1_error) - #if PY_VERSION_HEX < 0x030800B1 - __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__.tp_print = 0; - #endif - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__.tp_getattro == PyObject_GenericGetAttr)) { - __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; - } - __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ = &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__; - if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr) < 0) __PYX_ERR(0, 244, __pyx_L1_error) - #if PY_VERSION_HEX < 0x030800B1 - __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr.tp_print = 0; - #endif - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr.tp_getattro == PyObject_GenericGetAttr)) { - __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; - } - __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr = &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr; - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_RefNannyFinishContext(); - return -1; -} - -static int __Pyx_modinit_type_import_code(void) { - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); - /*--- Type import code ---*/ - __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", - #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 - sizeof(PyTypeObject), - #else - sizeof(PyHeapTypeObject), - #endif - __Pyx_ImportType_CheckSize_Warn); - if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __Pyx_ImportType_CheckSize_Warn); - if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(3, 8, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __Pyx_ImportType_CheckSize_Warn); - if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(4, 15, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_RefNannyFinishContext(); - return -1; -} - -static int __Pyx_modinit_variable_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); - /*--- Variable import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); - /*--- Function import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - - -#ifndef CYTHON_NO_PYINIT_EXPORT -#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC -#elif PY_MAJOR_VERSION < 3 -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" void -#else -#define __Pyx_PyMODINIT_FUNC void -#endif -#else -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * -#else -#define __Pyx_PyMODINIT_FUNC PyObject * -#endif -#endif - - -#if PY_MAJOR_VERSION < 3 -__Pyx_PyMODINIT_FUNC init_http_parser(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC init_http_parser(void) -#else -__Pyx_PyMODINIT_FUNC PyInit__http_parser(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC PyInit__http_parser(void) -#if CYTHON_PEP489_MULTI_PHASE_INIT -{ - return PyModuleDef_Init(&__pyx_moduledef); -} -static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { - #if PY_VERSION_HEX >= 0x030700A1 - static PY_INT64_T main_interpreter_id = -1; - PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); - if (main_interpreter_id == -1) { - main_interpreter_id = current_id; - return (unlikely(current_id == -1)) ? -1 : 0; - } else if (unlikely(main_interpreter_id != current_id)) - #else - static PyInterpreterState *main_interpreter = NULL; - PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; - if (!main_interpreter) { - main_interpreter = current_interpreter; - } else if (unlikely(main_interpreter != current_interpreter)) - #endif - { - PyErr_SetString( - PyExc_ImportError, - "Interpreter change detected - this module can only be loaded into one interpreter per process."); - return -1; - } - return 0; -} -static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { - PyObject *value = PyObject_GetAttrString(spec, from_name); - int result = 0; - if (likely(value)) { - if (allow_none || value != Py_None) { - result = PyDict_SetItemString(moddict, to_name, value); - } - Py_DECREF(value); - } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Clear(); - } else { - result = -1; - } - return result; -} -static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { - PyObject *module = NULL, *moddict, *modname; - if (__Pyx_check_single_interpreter()) - return NULL; - if (__pyx_m) - return __Pyx_NewRef(__pyx_m); - modname = PyObject_GetAttrString(spec, "name"); - if (unlikely(!modname)) goto bad; - module = PyModule_NewObject(modname); - Py_DECREF(modname); - if (unlikely(!module)) goto bad; - moddict = PyModule_GetDict(module); - if (unlikely(!moddict)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; - return module; -bad: - Py_XDECREF(module); - return NULL; -} - - -static CYTHON_SMALL_CODE int __pyx_pymod_exec__http_parser(PyObject *__pyx_pyinit_module) -#endif -#endif -{ - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - PyObject *__pyx_t_10 = NULL; - PyObject *__pyx_t_11 = NULL; - PyObject *__pyx_t_12 = NULL; - PyObject *__pyx_t_13 = NULL; - PyObject *__pyx_t_14 = NULL; - PyObject *__pyx_t_15 = NULL; - PyObject *__pyx_t_16 = NULL; - PyObject *__pyx_t_17 = NULL; - PyObject *__pyx_t_18 = NULL; - PyObject *__pyx_t_19 = NULL; - PyObject *__pyx_t_20 = NULL; - PyObject *__pyx_t_21 = NULL; - PyObject *__pyx_t_22 = NULL; - PyObject *__pyx_t_23 = NULL; - PyObject *__pyx_t_24 = NULL; - PyObject *__pyx_t_25 = NULL; - PyObject *__pyx_t_26 = NULL; - PyObject *__pyx_t_27 = NULL; - PyObject *__pyx_t_28 = NULL; - PyObject *__pyx_t_29 = NULL; - PyObject *__pyx_t_30 = NULL; - PyObject *__pyx_t_31 = NULL; - PyObject *__pyx_t_32 = NULL; - PyObject *__pyx_t_33 = NULL; - PyObject *__pyx_t_34 = NULL; - PyObject *__pyx_t_35 = NULL; - PyObject *__pyx_t_36 = NULL; - PyObject *__pyx_t_37 = NULL; - PyObject *__pyx_t_38 = NULL; - PyObject *__pyx_t_39 = NULL; - PyObject *__pyx_t_40 = NULL; - PyObject *__pyx_t_41 = NULL; - PyObject *__pyx_t_42 = NULL; - PyObject *__pyx_t_43 = NULL; - PyObject *__pyx_t_44 = NULL; - PyObject *__pyx_t_45 = NULL; - PyObject *__pyx_t_46 = NULL; - PyObject *__pyx_t_47 = NULL; - PyObject *__pyx_t_48 = NULL; - PyObject *__pyx_t_49 = NULL; - PyObject *__pyx_t_50 = NULL; - PyObject *__pyx_t_51 = NULL; - PyObject *__pyx_t_52 = NULL; - PyObject *__pyx_t_53 = NULL; - PyObject *__pyx_t_54 = NULL; - PyObject *__pyx_t_55 = NULL; - PyObject *__pyx_t_56 = NULL; - PyObject *__pyx_t_57 = NULL; - PyObject *__pyx_t_58 = NULL; - PyObject *__pyx_t_59 = NULL; - PyObject *__pyx_t_60 = NULL; - PyObject *__pyx_t_61 = NULL; - PyObject *__pyx_t_62 = NULL; - PyObject *__pyx_t_63 = NULL; - PyObject *__pyx_t_64 = NULL; - PyObject *__pyx_t_65 = NULL; - PyObject *__pyx_t_66 = NULL; - PyObject *__pyx_t_67 = NULL; - PyObject *__pyx_t_68 = NULL; - PyObject *__pyx_t_69 = NULL; - PyObject *__pyx_t_70 = NULL; - PyObject *__pyx_t_71 = NULL; - PyObject *__pyx_t_72 = NULL; - PyObject *__pyx_t_73 = NULL; - PyObject *__pyx_t_74 = NULL; - PyObject *__pyx_t_75 = NULL; - PyObject *__pyx_t_76 = NULL; - PyObject *__pyx_t_77 = NULL; - PyObject *__pyx_t_78 = NULL; - long __pyx_t_79; - llhttp_method_t __pyx_t_80; - char const *__pyx_t_81; - int __pyx_t_82; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannyDeclarations - #if CYTHON_PEP489_MULTI_PHASE_INIT - if (__pyx_m) { - if (__pyx_m == __pyx_pyinit_module) return 0; - PyErr_SetString(PyExc_RuntimeError, "Module '_http_parser' has already been imported. Re-initialisation is not supported."); - return -1; - } - #elif PY_MAJOR_VERSION >= 3 - if (__pyx_m) return __Pyx_NewRef(__pyx_m); - #endif - #if CYTHON_REFNANNY -__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); -if (!__Pyx_RefNanny) { - PyErr_Clear(); - __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); - if (!__Pyx_RefNanny) - Py_FatalError("failed to import 'refnanny' module"); -} -#endif - __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__http_parser(void)", 0); - if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #ifdef __Pxy_PyFrame_Initialize_Offsets - __Pxy_PyFrame_Initialize_Offsets(); - #endif - __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) - #ifdef __Pyx_CyFunction_USED - if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_FusedFunction_USED - if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Coroutine_USED - if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Generator_USED - if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_AsyncGen_USED - if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_StopAsyncIteration_USED - if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - /*--- Library function declarations ---*/ - /*--- Threads initialization code ---*/ - #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS - PyEval_InitThreads(); - #endif - /*--- Module creation code ---*/ - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_m = __pyx_pyinit_module; - Py_INCREF(__pyx_m); - #else - #if PY_MAJOR_VERSION < 3 - __pyx_m = Py_InitModule4("_http_parser", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); - #else - __pyx_m = PyModule_Create(&__pyx_moduledef); - #endif - if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_d); - __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_b); - __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_cython_runtime); - if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); - /*--- Initialize various global constants etc. ---*/ - if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) - if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - if (__pyx_module_is_main_aiohttp___http_parser) { - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - } - #if PY_MAJOR_VERSION >= 3 - { - PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) - if (!PyDict_GetItemString(modules, "aiohttp._http_parser")) { - if (unlikely(PyDict_SetItemString(modules, "aiohttp._http_parser", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) - } - } - #endif - /*--- Builtin init code ---*/ - if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - /*--- Constants init code ---*/ - if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - /*--- Global type/function init code ---*/ - (void)__Pyx_modinit_global_init_code(); - (void)__Pyx_modinit_variable_export_code(); - (void)__Pyx_modinit_function_export_code(); - if (unlikely(__Pyx_modinit_type_init_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) - if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) - (void)__Pyx_modinit_variable_import_code(); - (void)__Pyx_modinit_function_import_code(); - /*--- Execution code ---*/ - #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) - if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - - /* "aiohttp/_http_parser.pyx":19 - * from libc.string cimport memcpy - * - * from multidict import CIMultiDict as _CIMultiDict, CIMultiDictProxy as _CIMultiDictProxy # <<<<<<<<<<<<<< - * from yarl import URL as _URL - * - */ - __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_s_CIMultiDict); - __Pyx_GIVEREF(__pyx_n_s_CIMultiDict); - PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_CIMultiDict); - __Pyx_INCREF(__pyx_n_s_CIMultiDictProxy); - __Pyx_GIVEREF(__pyx_n_s_CIMultiDictProxy); - PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_CIMultiDictProxy); - __pyx_t_2 = __Pyx_Import(__pyx_n_s_multidict, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_CIMultiDict); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_CIMultiDict_2, __pyx_t_1) < 0) __PYX_ERR(0, 19, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_CIMultiDictProxy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_CIMultiDictProxy_2, __pyx_t_1) < 0) __PYX_ERR(0, 19, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":20 - * - * from multidict import CIMultiDict as _CIMultiDict, CIMultiDictProxy as _CIMultiDictProxy - * from yarl import URL as _URL # <<<<<<<<<<<<<< - * - * from aiohttp import hdrs - */ - __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 20, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_n_s_URL); - __Pyx_GIVEREF(__pyx_n_s_URL); - PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_URL); - __pyx_t_1 = __Pyx_Import(__pyx_n_s_yarl, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 20, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_URL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 20, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_URL_2, __pyx_t_2) < 0) __PYX_ERR(0, 20, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":22 - * from yarl import URL as _URL - * - * from aiohttp import hdrs # <<<<<<<<<<<<<< - * - * from .http_exceptions import ( - */ - __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_s_hdrs); - __Pyx_GIVEREF(__pyx_n_s_hdrs); - PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_hdrs); - __pyx_t_2 = __Pyx_Import(__pyx_n_s_aiohttp, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_hdrs, __pyx_t_1) < 0) __PYX_ERR(0, 22, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":25 - * - * from .http_exceptions import ( - * BadHttpMessage, # <<<<<<<<<<<<<< - * BadStatusLine, - * ContentLengthError, - */ - __pyx_t_2 = PyList_New(8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 25, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_n_s_BadHttpMessage); - __Pyx_GIVEREF(__pyx_n_s_BadHttpMessage); - PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_BadHttpMessage); - __Pyx_INCREF(__pyx_n_s_BadStatusLine); - __Pyx_GIVEREF(__pyx_n_s_BadStatusLine); - PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_BadStatusLine); - __Pyx_INCREF(__pyx_n_s_ContentLengthError); - __Pyx_GIVEREF(__pyx_n_s_ContentLengthError); - PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_ContentLengthError); - __Pyx_INCREF(__pyx_n_s_InvalidHeader); - __Pyx_GIVEREF(__pyx_n_s_InvalidHeader); - PyList_SET_ITEM(__pyx_t_2, 3, __pyx_n_s_InvalidHeader); - __Pyx_INCREF(__pyx_n_s_InvalidURLError); - __Pyx_GIVEREF(__pyx_n_s_InvalidURLError); - PyList_SET_ITEM(__pyx_t_2, 4, __pyx_n_s_InvalidURLError); - __Pyx_INCREF(__pyx_n_s_LineTooLong); - __Pyx_GIVEREF(__pyx_n_s_LineTooLong); - PyList_SET_ITEM(__pyx_t_2, 5, __pyx_n_s_LineTooLong); - __Pyx_INCREF(__pyx_n_s_PayloadEncodingError); - __Pyx_GIVEREF(__pyx_n_s_PayloadEncodingError); - PyList_SET_ITEM(__pyx_t_2, 6, __pyx_n_s_PayloadEncodingError); - __Pyx_INCREF(__pyx_n_s_TransferEncodingError); - __Pyx_GIVEREF(__pyx_n_s_TransferEncodingError); - PyList_SET_ITEM(__pyx_t_2, 7, __pyx_n_s_TransferEncodingError); - - /* "aiohttp/_http_parser.pyx":24 - * from aiohttp import hdrs - * - * from .http_exceptions import ( # <<<<<<<<<<<<<< - * BadHttpMessage, - * BadStatusLine, - */ - __pyx_t_1 = __Pyx_Import(__pyx_n_s_http_exceptions, __pyx_t_2, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 24, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_BadHttpMessage); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_BadHttpMessage, __pyx_t_2) < 0) __PYX_ERR(0, 25, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_BadStatusLine); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_BadStatusLine, __pyx_t_2) < 0) __PYX_ERR(0, 26, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_ContentLengthError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_ContentLengthError, __pyx_t_2) < 0) __PYX_ERR(0, 27, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_InvalidHeader); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_InvalidHeader, __pyx_t_2) < 0) __PYX_ERR(0, 28, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_InvalidURLError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_InvalidURLError, __pyx_t_2) < 0) __PYX_ERR(0, 29, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_LineTooLong, __pyx_t_2) < 0) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_PayloadEncodingError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_PayloadEncodingError, __pyx_t_2) < 0) __PYX_ERR(0, 31, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_TransferEncodingError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_TransferEncodingError, __pyx_t_2) < 0) __PYX_ERR(0, 32, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":34 - * TransferEncodingError, - * ) - * from .http_parser import DeflateBuffer as _DeflateBuffer # <<<<<<<<<<<<<< - * from .http_writer import ( - * HttpVersion as _HttpVersion, - */ - __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 34, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_s_DeflateBuffer); - __Pyx_GIVEREF(__pyx_n_s_DeflateBuffer); - PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_DeflateBuffer); - __pyx_t_2 = __Pyx_Import(__pyx_n_s_http_parser, __pyx_t_1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 34, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_DeflateBuffer); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 34, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_DeflateBuffer_2, __pyx_t_1) < 0) __PYX_ERR(0, 34, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "aiohttp/_http_parser.pyx":36 - * from .http_parser import DeflateBuffer as _DeflateBuffer - * from .http_writer import ( - * HttpVersion as _HttpVersion, # <<<<<<<<<<<<<< - * HttpVersion10 as _HttpVersion10, - * HttpVersion11 as _HttpVersion11, - */ - __pyx_t_2 = PyList_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 36, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_n_s_HttpVersion); - __Pyx_GIVEREF(__pyx_n_s_HttpVersion); - PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_HttpVersion); - __Pyx_INCREF(__pyx_n_s_HttpVersion10); - __Pyx_GIVEREF(__pyx_n_s_HttpVersion10); - PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_HttpVersion10); - __Pyx_INCREF(__pyx_n_s_HttpVersion11); - __Pyx_GIVEREF(__pyx_n_s_HttpVersion11); - PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_HttpVersion11); - - /* "aiohttp/_http_parser.pyx":35 - * ) - * from .http_parser import DeflateBuffer as _DeflateBuffer - * from .http_writer import ( # <<<<<<<<<<<<<< - * HttpVersion as _HttpVersion, - * HttpVersion10 as _HttpVersion10, - */ - __pyx_t_1 = __Pyx_Import(__pyx_n_s_http_writer, __pyx_t_2, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_HttpVersion); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_HttpVersion_2, __pyx_t_2) < 0) __PYX_ERR(0, 36, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_HttpVersion10); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_HttpVersion10_2, __pyx_t_2) < 0) __PYX_ERR(0, 37, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_HttpVersion11); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_HttpVersion11_2, __pyx_t_2) < 0) __PYX_ERR(0, 38, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":40 - * HttpVersion11 as _HttpVersion11, - * ) - * from .streams import EMPTY_PAYLOAD as _EMPTY_PAYLOAD, StreamReader as _StreamReader # <<<<<<<<<<<<<< - * - * cimport cython - */ - __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_s_EMPTY_PAYLOAD); - __Pyx_GIVEREF(__pyx_n_s_EMPTY_PAYLOAD); - PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_EMPTY_PAYLOAD); - __Pyx_INCREF(__pyx_n_s_StreamReader); - __Pyx_GIVEREF(__pyx_n_s_StreamReader); - PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_StreamReader); - __pyx_t_2 = __Pyx_Import(__pyx_n_s_streams, __pyx_t_1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 40, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_EMPTY_PAYLOAD); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_EMPTY_PAYLOAD_2, __pyx_t_1) < 0) __PYX_ERR(0, 40, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_StreamReader); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_StreamReader_2, __pyx_t_1) < 0) __PYX_ERR(0, 40, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "aiohttp/_headers.pxi":4 - * # Run ./tools/gen.py to update it after the origin changing. - * - * from . import hdrs # <<<<<<<<<<<<<< - * cdef tuple headers = ( - * hdrs.ACCEPT, - */ - __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_n_s_hdrs); - __Pyx_GIVEREF(__pyx_n_s_hdrs); - PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_hdrs); - __pyx_t_1 = __Pyx_Import(__pyx_n_s__4, __pyx_t_2, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_hdrs, __pyx_t_2) < 0) __PYX_ERR(5, 4, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":6 - * from . import hdrs - * cdef tuple headers = ( - * hdrs.ACCEPT, # <<<<<<<<<<<<<< - * hdrs.ACCEPT_CHARSET, - * hdrs.ACCEPT_ENCODING, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCEPT); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":7 - * cdef tuple headers = ( - * hdrs.ACCEPT, - * hdrs.ACCEPT_CHARSET, # <<<<<<<<<<<<<< - * hdrs.ACCEPT_ENCODING, - * hdrs.ACCEPT_LANGUAGE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCEPT_CHARSET); if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":8 - * hdrs.ACCEPT, - * hdrs.ACCEPT_CHARSET, - * hdrs.ACCEPT_ENCODING, # <<<<<<<<<<<<<< - * hdrs.ACCEPT_LANGUAGE, - * hdrs.ACCEPT_RANGES, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCEPT_ENCODING); if (unlikely(!__pyx_t_4)) __PYX_ERR(5, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":9 - * hdrs.ACCEPT_CHARSET, - * hdrs.ACCEPT_ENCODING, - * hdrs.ACCEPT_LANGUAGE, # <<<<<<<<<<<<<< - * hdrs.ACCEPT_RANGES, - * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 9, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCEPT_LANGUAGE); if (unlikely(!__pyx_t_5)) __PYX_ERR(5, 9, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":10 - * hdrs.ACCEPT_ENCODING, - * hdrs.ACCEPT_LANGUAGE, - * hdrs.ACCEPT_RANGES, # <<<<<<<<<<<<<< - * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, - * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 10, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCEPT_RANGES); if (unlikely(!__pyx_t_6)) __PYX_ERR(5, 10, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":11 - * hdrs.ACCEPT_LANGUAGE, - * hdrs.ACCEPT_RANGES, - * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, # <<<<<<<<<<<<<< - * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, - * hdrs.ACCESS_CONTROL_ALLOW_METHODS, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 11, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_ALLOW_CREDENTIALS); if (unlikely(!__pyx_t_7)) __PYX_ERR(5, 11, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":12 - * hdrs.ACCEPT_RANGES, - * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, - * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, # <<<<<<<<<<<<<< - * hdrs.ACCESS_CONTROL_ALLOW_METHODS, - * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_ALLOW_HEADERS); if (unlikely(!__pyx_t_8)) __PYX_ERR(5, 12, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":13 - * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, - * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, - * hdrs.ACCESS_CONTROL_ALLOW_METHODS, # <<<<<<<<<<<<<< - * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, - * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_ALLOW_METHODS); if (unlikely(!__pyx_t_9)) __PYX_ERR(5, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":14 - * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, - * hdrs.ACCESS_CONTROL_ALLOW_METHODS, - * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, # <<<<<<<<<<<<<< - * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, - * hdrs.ACCESS_CONTROL_MAX_AGE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_ALLOW_ORIGIN); if (unlikely(!__pyx_t_10)) __PYX_ERR(5, 14, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":15 - * hdrs.ACCESS_CONTROL_ALLOW_METHODS, - * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, - * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, # <<<<<<<<<<<<<< - * hdrs.ACCESS_CONTROL_MAX_AGE, - * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_EXPOSE_HEADERS); if (unlikely(!__pyx_t_11)) __PYX_ERR(5, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":16 - * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, - * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, - * hdrs.ACCESS_CONTROL_MAX_AGE, # <<<<<<<<<<<<<< - * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, - * hdrs.ACCESS_CONTROL_REQUEST_METHOD, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 16, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_MAX_AGE); if (unlikely(!__pyx_t_12)) __PYX_ERR(5, 16, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_12); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":17 - * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, - * hdrs.ACCESS_CONTROL_MAX_AGE, - * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, # <<<<<<<<<<<<<< - * hdrs.ACCESS_CONTROL_REQUEST_METHOD, - * hdrs.AGE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 17, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_REQUEST_HEADERS); if (unlikely(!__pyx_t_13)) __PYX_ERR(5, 17, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_13); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":18 - * hdrs.ACCESS_CONTROL_MAX_AGE, - * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, - * hdrs.ACCESS_CONTROL_REQUEST_METHOD, # <<<<<<<<<<<<<< - * hdrs.AGE, - * hdrs.ALLOW, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 18, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_REQUEST_METHOD); if (unlikely(!__pyx_t_14)) __PYX_ERR(5, 18, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_14); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":19 - * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, - * hdrs.ACCESS_CONTROL_REQUEST_METHOD, - * hdrs.AGE, # <<<<<<<<<<<<<< - * hdrs.ALLOW, - * hdrs.AUTHORIZATION, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 19, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_AGE); if (unlikely(!__pyx_t_15)) __PYX_ERR(5, 19, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_15); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":20 - * hdrs.ACCESS_CONTROL_REQUEST_METHOD, - * hdrs.AGE, - * hdrs.ALLOW, # <<<<<<<<<<<<<< - * hdrs.AUTHORIZATION, - * hdrs.CACHE_CONTROL, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 20, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ALLOW); if (unlikely(!__pyx_t_16)) __PYX_ERR(5, 20, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_16); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":21 - * hdrs.AGE, - * hdrs.ALLOW, - * hdrs.AUTHORIZATION, # <<<<<<<<<<<<<< - * hdrs.CACHE_CONTROL, - * hdrs.CONNECTION, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 21, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_17 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_AUTHORIZATION); if (unlikely(!__pyx_t_17)) __PYX_ERR(5, 21, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_17); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":22 - * hdrs.ALLOW, - * hdrs.AUTHORIZATION, - * hdrs.CACHE_CONTROL, # <<<<<<<<<<<<<< - * hdrs.CONNECTION, - * hdrs.CONTENT_DISPOSITION, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 22, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_18 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CACHE_CONTROL); if (unlikely(!__pyx_t_18)) __PYX_ERR(5, 22, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_18); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":23 - * hdrs.AUTHORIZATION, - * hdrs.CACHE_CONTROL, - * hdrs.CONNECTION, # <<<<<<<<<<<<<< - * hdrs.CONTENT_DISPOSITION, - * hdrs.CONTENT_ENCODING, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 23, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_19 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONNECTION); if (unlikely(!__pyx_t_19)) __PYX_ERR(5, 23, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_19); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":24 - * hdrs.CACHE_CONTROL, - * hdrs.CONNECTION, - * hdrs.CONTENT_DISPOSITION, # <<<<<<<<<<<<<< - * hdrs.CONTENT_ENCODING, - * hdrs.CONTENT_LANGUAGE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 24, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_20 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_DISPOSITION); if (unlikely(!__pyx_t_20)) __PYX_ERR(5, 24, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_20); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":25 - * hdrs.CONNECTION, - * hdrs.CONTENT_DISPOSITION, - * hdrs.CONTENT_ENCODING, # <<<<<<<<<<<<<< - * hdrs.CONTENT_LANGUAGE, - * hdrs.CONTENT_LENGTH, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 25, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_21 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_ENCODING); if (unlikely(!__pyx_t_21)) __PYX_ERR(5, 25, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_21); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":26 - * hdrs.CONTENT_DISPOSITION, - * hdrs.CONTENT_ENCODING, - * hdrs.CONTENT_LANGUAGE, # <<<<<<<<<<<<<< - * hdrs.CONTENT_LENGTH, - * hdrs.CONTENT_LOCATION, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 26, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_22 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_LANGUAGE); if (unlikely(!__pyx_t_22)) __PYX_ERR(5, 26, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_22); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":27 - * hdrs.CONTENT_ENCODING, - * hdrs.CONTENT_LANGUAGE, - * hdrs.CONTENT_LENGTH, # <<<<<<<<<<<<<< - * hdrs.CONTENT_LOCATION, - * hdrs.CONTENT_MD5, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 27, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_23 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_LENGTH); if (unlikely(!__pyx_t_23)) __PYX_ERR(5, 27, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_23); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":28 - * hdrs.CONTENT_LANGUAGE, - * hdrs.CONTENT_LENGTH, - * hdrs.CONTENT_LOCATION, # <<<<<<<<<<<<<< - * hdrs.CONTENT_MD5, - * hdrs.CONTENT_RANGE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 28, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_24 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_LOCATION); if (unlikely(!__pyx_t_24)) __PYX_ERR(5, 28, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_24); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":29 - * hdrs.CONTENT_LENGTH, - * hdrs.CONTENT_LOCATION, - * hdrs.CONTENT_MD5, # <<<<<<<<<<<<<< - * hdrs.CONTENT_RANGE, - * hdrs.CONTENT_TRANSFER_ENCODING, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 29, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_25 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_MD5); if (unlikely(!__pyx_t_25)) __PYX_ERR(5, 29, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_25); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":30 - * hdrs.CONTENT_LOCATION, - * hdrs.CONTENT_MD5, - * hdrs.CONTENT_RANGE, # <<<<<<<<<<<<<< - * hdrs.CONTENT_TRANSFER_ENCODING, - * hdrs.CONTENT_TYPE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_26 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_RANGE); if (unlikely(!__pyx_t_26)) __PYX_ERR(5, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_26); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":31 - * hdrs.CONTENT_MD5, - * hdrs.CONTENT_RANGE, - * hdrs.CONTENT_TRANSFER_ENCODING, # <<<<<<<<<<<<<< - * hdrs.CONTENT_TYPE, - * hdrs.COOKIE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 31, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_27 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_TRANSFER_ENCODING); if (unlikely(!__pyx_t_27)) __PYX_ERR(5, 31, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_27); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":32 - * hdrs.CONTENT_RANGE, - * hdrs.CONTENT_TRANSFER_ENCODING, - * hdrs.CONTENT_TYPE, # <<<<<<<<<<<<<< - * hdrs.COOKIE, - * hdrs.DATE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 32, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_28 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_TYPE); if (unlikely(!__pyx_t_28)) __PYX_ERR(5, 32, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_28); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":33 - * hdrs.CONTENT_TRANSFER_ENCODING, - * hdrs.CONTENT_TYPE, - * hdrs.COOKIE, # <<<<<<<<<<<<<< - * hdrs.DATE, - * hdrs.DESTINATION, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 33, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_29 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_COOKIE); if (unlikely(!__pyx_t_29)) __PYX_ERR(5, 33, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_29); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":34 - * hdrs.CONTENT_TYPE, - * hdrs.COOKIE, - * hdrs.DATE, # <<<<<<<<<<<<<< - * hdrs.DESTINATION, - * hdrs.DIGEST, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 34, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_30 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_DATE); if (unlikely(!__pyx_t_30)) __PYX_ERR(5, 34, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_30); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":35 - * hdrs.COOKIE, - * hdrs.DATE, - * hdrs.DESTINATION, # <<<<<<<<<<<<<< - * hdrs.DIGEST, - * hdrs.ETAG, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 35, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_31 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_DESTINATION); if (unlikely(!__pyx_t_31)) __PYX_ERR(5, 35, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_31); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":36 - * hdrs.DATE, - * hdrs.DESTINATION, - * hdrs.DIGEST, # <<<<<<<<<<<<<< - * hdrs.ETAG, - * hdrs.EXPECT, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 36, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_32 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_DIGEST); if (unlikely(!__pyx_t_32)) __PYX_ERR(5, 36, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_32); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":37 - * hdrs.DESTINATION, - * hdrs.DIGEST, - * hdrs.ETAG, # <<<<<<<<<<<<<< - * hdrs.EXPECT, - * hdrs.EXPIRES, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 37, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_33 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ETAG); if (unlikely(!__pyx_t_33)) __PYX_ERR(5, 37, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_33); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":38 - * hdrs.DIGEST, - * hdrs.ETAG, - * hdrs.EXPECT, # <<<<<<<<<<<<<< - * hdrs.EXPIRES, - * hdrs.FORWARDED, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 38, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_34 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_EXPECT); if (unlikely(!__pyx_t_34)) __PYX_ERR(5, 38, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_34); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":39 - * hdrs.ETAG, - * hdrs.EXPECT, - * hdrs.EXPIRES, # <<<<<<<<<<<<<< - * hdrs.FORWARDED, - * hdrs.FROM, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 39, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_35 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_EXPIRES); if (unlikely(!__pyx_t_35)) __PYX_ERR(5, 39, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_35); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":40 - * hdrs.EXPECT, - * hdrs.EXPIRES, - * hdrs.FORWARDED, # <<<<<<<<<<<<<< - * hdrs.FROM, - * hdrs.HOST, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 40, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_36 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_FORWARDED); if (unlikely(!__pyx_t_36)) __PYX_ERR(5, 40, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_36); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":41 - * hdrs.EXPIRES, - * hdrs.FORWARDED, - * hdrs.FROM, # <<<<<<<<<<<<<< - * hdrs.HOST, - * hdrs.IF_MATCH, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 41, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_37 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_FROM); if (unlikely(!__pyx_t_37)) __PYX_ERR(5, 41, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_37); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":42 - * hdrs.FORWARDED, - * hdrs.FROM, - * hdrs.HOST, # <<<<<<<<<<<<<< - * hdrs.IF_MATCH, - * hdrs.IF_MODIFIED_SINCE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 42, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_38 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_HOST); if (unlikely(!__pyx_t_38)) __PYX_ERR(5, 42, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_38); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":43 - * hdrs.FROM, - * hdrs.HOST, - * hdrs.IF_MATCH, # <<<<<<<<<<<<<< - * hdrs.IF_MODIFIED_SINCE, - * hdrs.IF_NONE_MATCH, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 43, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_39 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_IF_MATCH); if (unlikely(!__pyx_t_39)) __PYX_ERR(5, 43, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_39); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":44 - * hdrs.HOST, - * hdrs.IF_MATCH, - * hdrs.IF_MODIFIED_SINCE, # <<<<<<<<<<<<<< - * hdrs.IF_NONE_MATCH, - * hdrs.IF_RANGE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 44, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_40 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_IF_MODIFIED_SINCE); if (unlikely(!__pyx_t_40)) __PYX_ERR(5, 44, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_40); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":45 - * hdrs.IF_MATCH, - * hdrs.IF_MODIFIED_SINCE, - * hdrs.IF_NONE_MATCH, # <<<<<<<<<<<<<< - * hdrs.IF_RANGE, - * hdrs.IF_UNMODIFIED_SINCE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 45, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_41 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_IF_NONE_MATCH); if (unlikely(!__pyx_t_41)) __PYX_ERR(5, 45, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_41); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":46 - * hdrs.IF_MODIFIED_SINCE, - * hdrs.IF_NONE_MATCH, - * hdrs.IF_RANGE, # <<<<<<<<<<<<<< - * hdrs.IF_UNMODIFIED_SINCE, - * hdrs.KEEP_ALIVE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 46, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_42 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_IF_RANGE); if (unlikely(!__pyx_t_42)) __PYX_ERR(5, 46, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_42); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":47 - * hdrs.IF_NONE_MATCH, - * hdrs.IF_RANGE, - * hdrs.IF_UNMODIFIED_SINCE, # <<<<<<<<<<<<<< - * hdrs.KEEP_ALIVE, - * hdrs.LAST_EVENT_ID, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 47, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_43 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_IF_UNMODIFIED_SINCE); if (unlikely(!__pyx_t_43)) __PYX_ERR(5, 47, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_43); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":48 - * hdrs.IF_RANGE, - * hdrs.IF_UNMODIFIED_SINCE, - * hdrs.KEEP_ALIVE, # <<<<<<<<<<<<<< - * hdrs.LAST_EVENT_ID, - * hdrs.LAST_MODIFIED, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 48, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_44 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_KEEP_ALIVE); if (unlikely(!__pyx_t_44)) __PYX_ERR(5, 48, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_44); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":49 - * hdrs.IF_UNMODIFIED_SINCE, - * hdrs.KEEP_ALIVE, - * hdrs.LAST_EVENT_ID, # <<<<<<<<<<<<<< - * hdrs.LAST_MODIFIED, - * hdrs.LINK, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 49, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_45 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LAST_EVENT_ID); if (unlikely(!__pyx_t_45)) __PYX_ERR(5, 49, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_45); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":50 - * hdrs.KEEP_ALIVE, - * hdrs.LAST_EVENT_ID, - * hdrs.LAST_MODIFIED, # <<<<<<<<<<<<<< - * hdrs.LINK, - * hdrs.LOCATION, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 50, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_46 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LAST_MODIFIED); if (unlikely(!__pyx_t_46)) __PYX_ERR(5, 50, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_46); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":51 - * hdrs.LAST_EVENT_ID, - * hdrs.LAST_MODIFIED, - * hdrs.LINK, # <<<<<<<<<<<<<< - * hdrs.LOCATION, - * hdrs.MAX_FORWARDS, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 51, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_47 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LINK); if (unlikely(!__pyx_t_47)) __PYX_ERR(5, 51, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_47); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":52 - * hdrs.LAST_MODIFIED, - * hdrs.LINK, - * hdrs.LOCATION, # <<<<<<<<<<<<<< - * hdrs.MAX_FORWARDS, - * hdrs.ORIGIN, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 52, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_48 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LOCATION); if (unlikely(!__pyx_t_48)) __PYX_ERR(5, 52, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_48); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":53 - * hdrs.LINK, - * hdrs.LOCATION, - * hdrs.MAX_FORWARDS, # <<<<<<<<<<<<<< - * hdrs.ORIGIN, - * hdrs.PRAGMA, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 53, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_49 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_MAX_FORWARDS); if (unlikely(!__pyx_t_49)) __PYX_ERR(5, 53, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_49); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":54 - * hdrs.LOCATION, - * hdrs.MAX_FORWARDS, - * hdrs.ORIGIN, # <<<<<<<<<<<<<< - * hdrs.PRAGMA, - * hdrs.PROXY_AUTHENTICATE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 54, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_50 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ORIGIN); if (unlikely(!__pyx_t_50)) __PYX_ERR(5, 54, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_50); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":55 - * hdrs.MAX_FORWARDS, - * hdrs.ORIGIN, - * hdrs.PRAGMA, # <<<<<<<<<<<<<< - * hdrs.PROXY_AUTHENTICATE, - * hdrs.PROXY_AUTHORIZATION, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 55, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_51 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_PRAGMA); if (unlikely(!__pyx_t_51)) __PYX_ERR(5, 55, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_51); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":56 - * hdrs.ORIGIN, - * hdrs.PRAGMA, - * hdrs.PROXY_AUTHENTICATE, # <<<<<<<<<<<<<< - * hdrs.PROXY_AUTHORIZATION, - * hdrs.RANGE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 56, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_52 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_PROXY_AUTHENTICATE); if (unlikely(!__pyx_t_52)) __PYX_ERR(5, 56, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_52); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":57 - * hdrs.PRAGMA, - * hdrs.PROXY_AUTHENTICATE, - * hdrs.PROXY_AUTHORIZATION, # <<<<<<<<<<<<<< - * hdrs.RANGE, - * hdrs.REFERER, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 57, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_53 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_PROXY_AUTHORIZATION); if (unlikely(!__pyx_t_53)) __PYX_ERR(5, 57, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_53); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":58 - * hdrs.PROXY_AUTHENTICATE, - * hdrs.PROXY_AUTHORIZATION, - * hdrs.RANGE, # <<<<<<<<<<<<<< - * hdrs.REFERER, - * hdrs.RETRY_AFTER, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 58, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_54 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_RANGE); if (unlikely(!__pyx_t_54)) __PYX_ERR(5, 58, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_54); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":59 - * hdrs.PROXY_AUTHORIZATION, - * hdrs.RANGE, - * hdrs.REFERER, # <<<<<<<<<<<<<< - * hdrs.RETRY_AFTER, - * hdrs.SEC_WEBSOCKET_ACCEPT, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 59, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_55 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_REFERER); if (unlikely(!__pyx_t_55)) __PYX_ERR(5, 59, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_55); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":60 - * hdrs.RANGE, - * hdrs.REFERER, - * hdrs.RETRY_AFTER, # <<<<<<<<<<<<<< - * hdrs.SEC_WEBSOCKET_ACCEPT, - * hdrs.SEC_WEBSOCKET_EXTENSIONS, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 60, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_56 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_RETRY_AFTER); if (unlikely(!__pyx_t_56)) __PYX_ERR(5, 60, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_56); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":61 - * hdrs.REFERER, - * hdrs.RETRY_AFTER, - * hdrs.SEC_WEBSOCKET_ACCEPT, # <<<<<<<<<<<<<< - * hdrs.SEC_WEBSOCKET_EXTENSIONS, - * hdrs.SEC_WEBSOCKET_KEY, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 61, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_57 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_ACCEPT); if (unlikely(!__pyx_t_57)) __PYX_ERR(5, 61, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_57); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":62 - * hdrs.RETRY_AFTER, - * hdrs.SEC_WEBSOCKET_ACCEPT, - * hdrs.SEC_WEBSOCKET_EXTENSIONS, # <<<<<<<<<<<<<< - * hdrs.SEC_WEBSOCKET_KEY, - * hdrs.SEC_WEBSOCKET_KEY1, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 62, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_58 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_EXTENSIONS); if (unlikely(!__pyx_t_58)) __PYX_ERR(5, 62, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_58); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":63 - * hdrs.SEC_WEBSOCKET_ACCEPT, - * hdrs.SEC_WEBSOCKET_EXTENSIONS, - * hdrs.SEC_WEBSOCKET_KEY, # <<<<<<<<<<<<<< - * hdrs.SEC_WEBSOCKET_KEY1, - * hdrs.SEC_WEBSOCKET_PROTOCOL, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 63, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_59 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_KEY); if (unlikely(!__pyx_t_59)) __PYX_ERR(5, 63, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_59); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":64 - * hdrs.SEC_WEBSOCKET_EXTENSIONS, - * hdrs.SEC_WEBSOCKET_KEY, - * hdrs.SEC_WEBSOCKET_KEY1, # <<<<<<<<<<<<<< - * hdrs.SEC_WEBSOCKET_PROTOCOL, - * hdrs.SEC_WEBSOCKET_VERSION, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 64, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_60 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_KEY1); if (unlikely(!__pyx_t_60)) __PYX_ERR(5, 64, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_60); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":65 - * hdrs.SEC_WEBSOCKET_KEY, - * hdrs.SEC_WEBSOCKET_KEY1, - * hdrs.SEC_WEBSOCKET_PROTOCOL, # <<<<<<<<<<<<<< - * hdrs.SEC_WEBSOCKET_VERSION, - * hdrs.SERVER, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 65, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_61 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_PROTOCOL); if (unlikely(!__pyx_t_61)) __PYX_ERR(5, 65, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_61); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":66 - * hdrs.SEC_WEBSOCKET_KEY1, - * hdrs.SEC_WEBSOCKET_PROTOCOL, - * hdrs.SEC_WEBSOCKET_VERSION, # <<<<<<<<<<<<<< - * hdrs.SERVER, - * hdrs.SET_COOKIE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 66, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_62 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_VERSION); if (unlikely(!__pyx_t_62)) __PYX_ERR(5, 66, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_62); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":67 - * hdrs.SEC_WEBSOCKET_PROTOCOL, - * hdrs.SEC_WEBSOCKET_VERSION, - * hdrs.SERVER, # <<<<<<<<<<<<<< - * hdrs.SET_COOKIE, - * hdrs.TE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 67, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_63 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SERVER); if (unlikely(!__pyx_t_63)) __PYX_ERR(5, 67, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_63); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":68 - * hdrs.SEC_WEBSOCKET_VERSION, - * hdrs.SERVER, - * hdrs.SET_COOKIE, # <<<<<<<<<<<<<< - * hdrs.TE, - * hdrs.TRAILER, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 68, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_64 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SET_COOKIE); if (unlikely(!__pyx_t_64)) __PYX_ERR(5, 68, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_64); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":69 - * hdrs.SERVER, - * hdrs.SET_COOKIE, - * hdrs.TE, # <<<<<<<<<<<<<< - * hdrs.TRAILER, - * hdrs.TRANSFER_ENCODING, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 69, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_65 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_TE); if (unlikely(!__pyx_t_65)) __PYX_ERR(5, 69, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_65); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":70 - * hdrs.SET_COOKIE, - * hdrs.TE, - * hdrs.TRAILER, # <<<<<<<<<<<<<< - * hdrs.TRANSFER_ENCODING, - * hdrs.URI, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 70, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_66 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_TRAILER); if (unlikely(!__pyx_t_66)) __PYX_ERR(5, 70, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_66); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":71 - * hdrs.TE, - * hdrs.TRAILER, - * hdrs.TRANSFER_ENCODING, # <<<<<<<<<<<<<< - * hdrs.URI, - * hdrs.UPGRADE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 71, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_67 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_TRANSFER_ENCODING); if (unlikely(!__pyx_t_67)) __PYX_ERR(5, 71, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_67); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":72 - * hdrs.TRAILER, - * hdrs.TRANSFER_ENCODING, - * hdrs.URI, # <<<<<<<<<<<<<< - * hdrs.UPGRADE, - * hdrs.USER_AGENT, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 72, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_68 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_URI); if (unlikely(!__pyx_t_68)) __PYX_ERR(5, 72, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_68); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":73 - * hdrs.TRANSFER_ENCODING, - * hdrs.URI, - * hdrs.UPGRADE, # <<<<<<<<<<<<<< - * hdrs.USER_AGENT, - * hdrs.VARY, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 73, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_69 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_UPGRADE); if (unlikely(!__pyx_t_69)) __PYX_ERR(5, 73, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_69); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":74 - * hdrs.URI, - * hdrs.UPGRADE, - * hdrs.USER_AGENT, # <<<<<<<<<<<<<< - * hdrs.VARY, - * hdrs.VIA, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 74, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_70 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_USER_AGENT); if (unlikely(!__pyx_t_70)) __PYX_ERR(5, 74, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_70); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":75 - * hdrs.UPGRADE, - * hdrs.USER_AGENT, - * hdrs.VARY, # <<<<<<<<<<<<<< - * hdrs.VIA, - * hdrs.WWW_AUTHENTICATE, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 75, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_71 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_VARY); if (unlikely(!__pyx_t_71)) __PYX_ERR(5, 75, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_71); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":76 - * hdrs.USER_AGENT, - * hdrs.VARY, - * hdrs.VIA, # <<<<<<<<<<<<<< - * hdrs.WWW_AUTHENTICATE, - * hdrs.WANT_DIGEST, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 76, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_72 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_VIA); if (unlikely(!__pyx_t_72)) __PYX_ERR(5, 76, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_72); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":77 - * hdrs.VARY, - * hdrs.VIA, - * hdrs.WWW_AUTHENTICATE, # <<<<<<<<<<<<<< - * hdrs.WANT_DIGEST, - * hdrs.WARNING, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 77, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_73 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_WWW_AUTHENTICATE); if (unlikely(!__pyx_t_73)) __PYX_ERR(5, 77, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_73); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":78 - * hdrs.VIA, - * hdrs.WWW_AUTHENTICATE, - * hdrs.WANT_DIGEST, # <<<<<<<<<<<<<< - * hdrs.WARNING, - * hdrs.X_FORWARDED_FOR, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 78, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_74 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_WANT_DIGEST); if (unlikely(!__pyx_t_74)) __PYX_ERR(5, 78, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_74); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":79 - * hdrs.WWW_AUTHENTICATE, - * hdrs.WANT_DIGEST, - * hdrs.WARNING, # <<<<<<<<<<<<<< - * hdrs.X_FORWARDED_FOR, - * hdrs.X_FORWARDED_HOST, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 79, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_75 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_WARNING); if (unlikely(!__pyx_t_75)) __PYX_ERR(5, 79, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_75); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":80 - * hdrs.WANT_DIGEST, - * hdrs.WARNING, - * hdrs.X_FORWARDED_FOR, # <<<<<<<<<<<<<< - * hdrs.X_FORWARDED_HOST, - * hdrs.X_FORWARDED_PROTO, - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 80, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_76 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_X_FORWARDED_FOR); if (unlikely(!__pyx_t_76)) __PYX_ERR(5, 80, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_76); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":81 - * hdrs.WARNING, - * hdrs.X_FORWARDED_FOR, - * hdrs.X_FORWARDED_HOST, # <<<<<<<<<<<<<< - * hdrs.X_FORWARDED_PROTO, - * ) - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 81, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_77 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_X_FORWARDED_HOST); if (unlikely(!__pyx_t_77)) __PYX_ERR(5, 81, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_77); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":82 - * hdrs.X_FORWARDED_FOR, - * hdrs.X_FORWARDED_HOST, - * hdrs.X_FORWARDED_PROTO, # <<<<<<<<<<<<<< - * ) - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 82, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_78 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_X_FORWARDED_PROTO); if (unlikely(!__pyx_t_78)) __PYX_ERR(5, 82, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_78); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_headers.pxi":6 - * from . import hdrs - * cdef tuple headers = ( - * hdrs.ACCEPT, # <<<<<<<<<<<<<< - * hdrs.ACCEPT_CHARSET, - * hdrs.ACCEPT_ENCODING, - */ - __pyx_t_1 = PyTuple_New(77); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_2); - PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2); - __Pyx_GIVEREF(__pyx_t_3); - PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_4); - PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_4); - __Pyx_GIVEREF(__pyx_t_5); - PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_5); - __Pyx_GIVEREF(__pyx_t_6); - PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_t_6); - __Pyx_GIVEREF(__pyx_t_7); - PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_t_7); - __Pyx_GIVEREF(__pyx_t_8); - PyTuple_SET_ITEM(__pyx_t_1, 6, __pyx_t_8); - __Pyx_GIVEREF(__pyx_t_9); - PyTuple_SET_ITEM(__pyx_t_1, 7, __pyx_t_9); - __Pyx_GIVEREF(__pyx_t_10); - PyTuple_SET_ITEM(__pyx_t_1, 8, __pyx_t_10); - __Pyx_GIVEREF(__pyx_t_11); - PyTuple_SET_ITEM(__pyx_t_1, 9, __pyx_t_11); - __Pyx_GIVEREF(__pyx_t_12); - PyTuple_SET_ITEM(__pyx_t_1, 10, __pyx_t_12); - __Pyx_GIVEREF(__pyx_t_13); - PyTuple_SET_ITEM(__pyx_t_1, 11, __pyx_t_13); - __Pyx_GIVEREF(__pyx_t_14); - PyTuple_SET_ITEM(__pyx_t_1, 12, __pyx_t_14); - __Pyx_GIVEREF(__pyx_t_15); - PyTuple_SET_ITEM(__pyx_t_1, 13, __pyx_t_15); - __Pyx_GIVEREF(__pyx_t_16); - PyTuple_SET_ITEM(__pyx_t_1, 14, __pyx_t_16); - __Pyx_GIVEREF(__pyx_t_17); - PyTuple_SET_ITEM(__pyx_t_1, 15, __pyx_t_17); - __Pyx_GIVEREF(__pyx_t_18); - PyTuple_SET_ITEM(__pyx_t_1, 16, __pyx_t_18); - __Pyx_GIVEREF(__pyx_t_19); - PyTuple_SET_ITEM(__pyx_t_1, 17, __pyx_t_19); - __Pyx_GIVEREF(__pyx_t_20); - PyTuple_SET_ITEM(__pyx_t_1, 18, __pyx_t_20); - __Pyx_GIVEREF(__pyx_t_21); - PyTuple_SET_ITEM(__pyx_t_1, 19, __pyx_t_21); - __Pyx_GIVEREF(__pyx_t_22); - PyTuple_SET_ITEM(__pyx_t_1, 20, __pyx_t_22); - __Pyx_GIVEREF(__pyx_t_23); - PyTuple_SET_ITEM(__pyx_t_1, 21, __pyx_t_23); - __Pyx_GIVEREF(__pyx_t_24); - PyTuple_SET_ITEM(__pyx_t_1, 22, __pyx_t_24); - __Pyx_GIVEREF(__pyx_t_25); - PyTuple_SET_ITEM(__pyx_t_1, 23, __pyx_t_25); - __Pyx_GIVEREF(__pyx_t_26); - PyTuple_SET_ITEM(__pyx_t_1, 24, __pyx_t_26); - __Pyx_GIVEREF(__pyx_t_27); - PyTuple_SET_ITEM(__pyx_t_1, 25, __pyx_t_27); - __Pyx_GIVEREF(__pyx_t_28); - PyTuple_SET_ITEM(__pyx_t_1, 26, __pyx_t_28); - __Pyx_GIVEREF(__pyx_t_29); - PyTuple_SET_ITEM(__pyx_t_1, 27, __pyx_t_29); - __Pyx_GIVEREF(__pyx_t_30); - PyTuple_SET_ITEM(__pyx_t_1, 28, __pyx_t_30); - __Pyx_GIVEREF(__pyx_t_31); - PyTuple_SET_ITEM(__pyx_t_1, 29, __pyx_t_31); - __Pyx_GIVEREF(__pyx_t_32); - PyTuple_SET_ITEM(__pyx_t_1, 30, __pyx_t_32); - __Pyx_GIVEREF(__pyx_t_33); - PyTuple_SET_ITEM(__pyx_t_1, 31, __pyx_t_33); - __Pyx_GIVEREF(__pyx_t_34); - PyTuple_SET_ITEM(__pyx_t_1, 32, __pyx_t_34); - __Pyx_GIVEREF(__pyx_t_35); - PyTuple_SET_ITEM(__pyx_t_1, 33, __pyx_t_35); - __Pyx_GIVEREF(__pyx_t_36); - PyTuple_SET_ITEM(__pyx_t_1, 34, __pyx_t_36); - __Pyx_GIVEREF(__pyx_t_37); - PyTuple_SET_ITEM(__pyx_t_1, 35, __pyx_t_37); - __Pyx_GIVEREF(__pyx_t_38); - PyTuple_SET_ITEM(__pyx_t_1, 36, __pyx_t_38); - __Pyx_GIVEREF(__pyx_t_39); - PyTuple_SET_ITEM(__pyx_t_1, 37, __pyx_t_39); - __Pyx_GIVEREF(__pyx_t_40); - PyTuple_SET_ITEM(__pyx_t_1, 38, __pyx_t_40); - __Pyx_GIVEREF(__pyx_t_41); - PyTuple_SET_ITEM(__pyx_t_1, 39, __pyx_t_41); - __Pyx_GIVEREF(__pyx_t_42); - PyTuple_SET_ITEM(__pyx_t_1, 40, __pyx_t_42); - __Pyx_GIVEREF(__pyx_t_43); - PyTuple_SET_ITEM(__pyx_t_1, 41, __pyx_t_43); - __Pyx_GIVEREF(__pyx_t_44); - PyTuple_SET_ITEM(__pyx_t_1, 42, __pyx_t_44); - __Pyx_GIVEREF(__pyx_t_45); - PyTuple_SET_ITEM(__pyx_t_1, 43, __pyx_t_45); - __Pyx_GIVEREF(__pyx_t_46); - PyTuple_SET_ITEM(__pyx_t_1, 44, __pyx_t_46); - __Pyx_GIVEREF(__pyx_t_47); - PyTuple_SET_ITEM(__pyx_t_1, 45, __pyx_t_47); - __Pyx_GIVEREF(__pyx_t_48); - PyTuple_SET_ITEM(__pyx_t_1, 46, __pyx_t_48); - __Pyx_GIVEREF(__pyx_t_49); - PyTuple_SET_ITEM(__pyx_t_1, 47, __pyx_t_49); - __Pyx_GIVEREF(__pyx_t_50); - PyTuple_SET_ITEM(__pyx_t_1, 48, __pyx_t_50); - __Pyx_GIVEREF(__pyx_t_51); - PyTuple_SET_ITEM(__pyx_t_1, 49, __pyx_t_51); - __Pyx_GIVEREF(__pyx_t_52); - PyTuple_SET_ITEM(__pyx_t_1, 50, __pyx_t_52); - __Pyx_GIVEREF(__pyx_t_53); - PyTuple_SET_ITEM(__pyx_t_1, 51, __pyx_t_53); - __Pyx_GIVEREF(__pyx_t_54); - PyTuple_SET_ITEM(__pyx_t_1, 52, __pyx_t_54); - __Pyx_GIVEREF(__pyx_t_55); - PyTuple_SET_ITEM(__pyx_t_1, 53, __pyx_t_55); - __Pyx_GIVEREF(__pyx_t_56); - PyTuple_SET_ITEM(__pyx_t_1, 54, __pyx_t_56); - __Pyx_GIVEREF(__pyx_t_57); - PyTuple_SET_ITEM(__pyx_t_1, 55, __pyx_t_57); - __Pyx_GIVEREF(__pyx_t_58); - PyTuple_SET_ITEM(__pyx_t_1, 56, __pyx_t_58); - __Pyx_GIVEREF(__pyx_t_59); - PyTuple_SET_ITEM(__pyx_t_1, 57, __pyx_t_59); - __Pyx_GIVEREF(__pyx_t_60); - PyTuple_SET_ITEM(__pyx_t_1, 58, __pyx_t_60); - __Pyx_GIVEREF(__pyx_t_61); - PyTuple_SET_ITEM(__pyx_t_1, 59, __pyx_t_61); - __Pyx_GIVEREF(__pyx_t_62); - PyTuple_SET_ITEM(__pyx_t_1, 60, __pyx_t_62); - __Pyx_GIVEREF(__pyx_t_63); - PyTuple_SET_ITEM(__pyx_t_1, 61, __pyx_t_63); - __Pyx_GIVEREF(__pyx_t_64); - PyTuple_SET_ITEM(__pyx_t_1, 62, __pyx_t_64); - __Pyx_GIVEREF(__pyx_t_65); - PyTuple_SET_ITEM(__pyx_t_1, 63, __pyx_t_65); - __Pyx_GIVEREF(__pyx_t_66); - PyTuple_SET_ITEM(__pyx_t_1, 64, __pyx_t_66); - __Pyx_GIVEREF(__pyx_t_67); - PyTuple_SET_ITEM(__pyx_t_1, 65, __pyx_t_67); - __Pyx_GIVEREF(__pyx_t_68); - PyTuple_SET_ITEM(__pyx_t_1, 66, __pyx_t_68); - __Pyx_GIVEREF(__pyx_t_69); - PyTuple_SET_ITEM(__pyx_t_1, 67, __pyx_t_69); - __Pyx_GIVEREF(__pyx_t_70); - PyTuple_SET_ITEM(__pyx_t_1, 68, __pyx_t_70); - __Pyx_GIVEREF(__pyx_t_71); - PyTuple_SET_ITEM(__pyx_t_1, 69, __pyx_t_71); - __Pyx_GIVEREF(__pyx_t_72); - PyTuple_SET_ITEM(__pyx_t_1, 70, __pyx_t_72); - __Pyx_GIVEREF(__pyx_t_73); - PyTuple_SET_ITEM(__pyx_t_1, 71, __pyx_t_73); - __Pyx_GIVEREF(__pyx_t_74); - PyTuple_SET_ITEM(__pyx_t_1, 72, __pyx_t_74); - __Pyx_GIVEREF(__pyx_t_75); - PyTuple_SET_ITEM(__pyx_t_1, 73, __pyx_t_75); - __Pyx_GIVEREF(__pyx_t_76); - PyTuple_SET_ITEM(__pyx_t_1, 74, __pyx_t_76); - __Pyx_GIVEREF(__pyx_t_77); - PyTuple_SET_ITEM(__pyx_t_1, 75, __pyx_t_77); - __Pyx_GIVEREF(__pyx_t_78); - PyTuple_SET_ITEM(__pyx_t_1, 76, __pyx_t_78); - __pyx_t_2 = 0; - __pyx_t_3 = 0; - __pyx_t_4 = 0; - __pyx_t_5 = 0; - __pyx_t_6 = 0; - __pyx_t_7 = 0; - __pyx_t_8 = 0; - __pyx_t_9 = 0; - __pyx_t_10 = 0; - __pyx_t_11 = 0; - __pyx_t_12 = 0; - __pyx_t_13 = 0; - __pyx_t_14 = 0; - __pyx_t_15 = 0; - __pyx_t_16 = 0; - __pyx_t_17 = 0; - __pyx_t_18 = 0; - __pyx_t_19 = 0; - __pyx_t_20 = 0; - __pyx_t_21 = 0; - __pyx_t_22 = 0; - __pyx_t_23 = 0; - __pyx_t_24 = 0; - __pyx_t_25 = 0; - __pyx_t_26 = 0; - __pyx_t_27 = 0; - __pyx_t_28 = 0; - __pyx_t_29 = 0; - __pyx_t_30 = 0; - __pyx_t_31 = 0; - __pyx_t_32 = 0; - __pyx_t_33 = 0; - __pyx_t_34 = 0; - __pyx_t_35 = 0; - __pyx_t_36 = 0; - __pyx_t_37 = 0; - __pyx_t_38 = 0; - __pyx_t_39 = 0; - __pyx_t_40 = 0; - __pyx_t_41 = 0; - __pyx_t_42 = 0; - __pyx_t_43 = 0; - __pyx_t_44 = 0; - __pyx_t_45 = 0; - __pyx_t_46 = 0; - __pyx_t_47 = 0; - __pyx_t_48 = 0; - __pyx_t_49 = 0; - __pyx_t_50 = 0; - __pyx_t_51 = 0; - __pyx_t_52 = 0; - __pyx_t_53 = 0; - __pyx_t_54 = 0; - __pyx_t_55 = 0; - __pyx_t_56 = 0; - __pyx_t_57 = 0; - __pyx_t_58 = 0; - __pyx_t_59 = 0; - __pyx_t_60 = 0; - __pyx_t_61 = 0; - __pyx_t_62 = 0; - __pyx_t_63 = 0; - __pyx_t_64 = 0; - __pyx_t_65 = 0; - __pyx_t_66 = 0; - __pyx_t_67 = 0; - __pyx_t_68 = 0; - __pyx_t_69 = 0; - __pyx_t_70 = 0; - __pyx_t_71 = 0; - __pyx_t_72 = 0; - __pyx_t_73 = 0; - __pyx_t_74 = 0; - __pyx_t_75 = 0; - __pyx_t_76 = 0; - __pyx_t_77 = 0; - __pyx_t_78 = 0; - __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_headers); - __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_headers, ((PyObject*)__pyx_t_1)); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":57 - * char* PyByteArray_AsString(object) - * - * __all__ = ('HttpRequestParser', 'HttpResponseParser', # <<<<<<<<<<<<<< - * 'RawRequestMessage', 'RawResponseMessage') - * - */ - if (PyDict_SetItem(__pyx_d, __pyx_n_s_all, __pyx_tuple__13) < 0) __PYX_ERR(0, 57, __pyx_L1_error) - - /* "aiohttp/_http_parser.pyx":60 - * 'RawRequestMessage', 'RawResponseMessage') - * - * cdef object URL = _URL # <<<<<<<<<<<<<< - * cdef object URL_build = URL.build - * cdef object CIMultiDict = _CIMultiDict - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_URL_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 60, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_URL); - __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_URL, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":61 - * - * cdef object URL = _URL - * cdef object URL_build = URL.build # <<<<<<<<<<<<<< - * cdef object CIMultiDict = _CIMultiDict - * cdef object CIMultiDictProxy = _CIMultiDictProxy - */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_7aiohttp_12_http_parser_URL, __pyx_n_s_build); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 61, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_URL_build); - __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_URL_build, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":62 - * cdef object URL = _URL - * cdef object URL_build = URL.build - * cdef object CIMultiDict = _CIMultiDict # <<<<<<<<<<<<<< - * cdef object CIMultiDictProxy = _CIMultiDictProxy - * cdef object HttpVersion = _HttpVersion - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_CIMultiDict_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 62, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDict); - __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_CIMultiDict, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":63 - * cdef object URL_build = URL.build - * cdef object CIMultiDict = _CIMultiDict - * cdef object CIMultiDictProxy = _CIMultiDictProxy # <<<<<<<<<<<<<< - * cdef object HttpVersion = _HttpVersion - * cdef object HttpVersion10 = _HttpVersion10 - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_CIMultiDictProxy_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 63, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy); - __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":64 - * cdef object CIMultiDict = _CIMultiDict - * cdef object CIMultiDictProxy = _CIMultiDictProxy - * cdef object HttpVersion = _HttpVersion # <<<<<<<<<<<<<< - * cdef object HttpVersion10 = _HttpVersion10 - * cdef object HttpVersion11 = _HttpVersion11 - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_HttpVersion_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 64, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion); - __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_HttpVersion, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":65 - * cdef object CIMultiDictProxy = _CIMultiDictProxy - * cdef object HttpVersion = _HttpVersion - * cdef object HttpVersion10 = _HttpVersion10 # <<<<<<<<<<<<<< - * cdef object HttpVersion11 = _HttpVersion11 - * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_HttpVersion10_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 65, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion10); - __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_HttpVersion10, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":66 - * cdef object HttpVersion = _HttpVersion - * cdef object HttpVersion10 = _HttpVersion10 - * cdef object HttpVersion11 = _HttpVersion11 # <<<<<<<<<<<<<< - * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 - * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_HttpVersion11_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 66, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion11); - __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_HttpVersion11, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":67 - * cdef object HttpVersion10 = _HttpVersion10 - * cdef object HttpVersion11 = _HttpVersion11 - * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 # <<<<<<<<<<<<<< - * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING - * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 67, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_78 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_KEY1); if (unlikely(!__pyx_t_78)) __PYX_ERR(0, 67, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_78); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1); - __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1, __pyx_t_78); - __Pyx_GIVEREF(__pyx_t_78); - __pyx_t_78 = 0; - - /* "aiohttp/_http_parser.pyx":68 - * cdef object HttpVersion11 = _HttpVersion11 - * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 - * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING # <<<<<<<<<<<<<< - * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD - * cdef object StreamReader = _StreamReader - */ - __Pyx_GetModuleGlobalName(__pyx_t_78, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_78)) __PYX_ERR(0, 68, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_78); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_78, __pyx_n_s_CONTENT_ENCODING); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_78); __pyx_t_78 = 0; - __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING); - __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":69 - * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 - * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING - * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD # <<<<<<<<<<<<<< - * cdef object StreamReader = _StreamReader - * cdef object DeflateBuffer = _DeflateBuffer - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_EMPTY_PAYLOAD_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 69, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); - __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":70 - * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING - * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD - * cdef object StreamReader = _StreamReader # <<<<<<<<<<<<<< - * cdef object DeflateBuffer = _DeflateBuffer - * - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_StreamReader_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 70, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_StreamReader); - __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_StreamReader, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":71 - * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD - * cdef object StreamReader = _StreamReader - * cdef object DeflateBuffer = _DeflateBuffer # <<<<<<<<<<<<<< - * - * - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DeflateBuffer_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 71, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_DeflateBuffer); - __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_DeflateBuffer, __pyx_t_1); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":85 - * DEF METHODS_COUNT = 46; - * - * cdef list _http_method = [] # <<<<<<<<<<<<<< - * - * for i in range(METHODS_COUNT): - */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 85, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser__http_method); - __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser__http_method, ((PyObject*)__pyx_t_1)); - __Pyx_GIVEREF(__pyx_t_1); - __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":87 - * cdef list _http_method = [] - * - * for i in range(METHODS_COUNT): # <<<<<<<<<<<<<< - * _http_method.append( - * cparser.llhttp_method_name( i).decode('ascii')) - */ - for (__pyx_t_79 = 0; __pyx_t_79 < 46; __pyx_t_79+=1) { - __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_t_79); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 87, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_i, __pyx_t_1) < 0) __PYX_ERR(0, 87, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":88 - * - * for i in range(METHODS_COUNT): - * _http_method.append( # <<<<<<<<<<<<<< - * cparser.llhttp_method_name( i).decode('ascii')) - * - */ - if (unlikely(__pyx_v_7aiohttp_12_http_parser__http_method == Py_None)) { - PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append"); - __PYX_ERR(0, 88, __pyx_L1_error) - } - - /* "aiohttp/_http_parser.pyx":89 - * for i in range(METHODS_COUNT): - * _http_method.append( - * cparser.llhttp_method_name( i).decode('ascii')) # <<<<<<<<<<<<<< - * - * - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_80 = ((enum llhttp_method)__Pyx_PyInt_As_enum__llhttp_method(__pyx_t_1)); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 89, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_81 = llhttp_method_name(((llhttp_method_t)__pyx_t_80)); - __pyx_t_1 = __Pyx_decode_c_string(__pyx_t_81, 0, strlen(__pyx_t_81), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - - /* "aiohttp/_http_parser.pyx":88 - * - * for i in range(METHODS_COUNT): - * _http_method.append( # <<<<<<<<<<<<<< - * cparser.llhttp_method_name( i).decode('ascii')) - * - */ - __pyx_t_82 = __Pyx_PyList_Append(__pyx_v_7aiohttp_12_http_parser__http_method, __pyx_t_1); if (unlikely(__pyx_t_82 == ((int)-1))) __PYX_ERR(0, 88, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - } - - /* "(tree fragment)":1 - * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< - * cdef object __pyx_PickleError - * cdef object __pyx_result - */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage, NULL, __pyx_n_s_aiohttp__http_parser); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_RawRequestMessage, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "(tree fragment)":11 - * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) - * return __pyx_result - * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< - * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] - * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): - */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage, NULL, __pyx_n_s_aiohttp__http_parser); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_RawResponseMessag, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_parser.pyx":1 - * #cython: language_level=3 # <<<<<<<<<<<<<< - * # - * # Based on https://github.com/MagicStack/httptools - */ - __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /*--- Wrapped vars code ---*/ - - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_XDECREF(__pyx_t_11); - __Pyx_XDECREF(__pyx_t_12); - __Pyx_XDECREF(__pyx_t_13); - __Pyx_XDECREF(__pyx_t_14); - __Pyx_XDECREF(__pyx_t_15); - __Pyx_XDECREF(__pyx_t_16); - __Pyx_XDECREF(__pyx_t_17); - __Pyx_XDECREF(__pyx_t_18); - __Pyx_XDECREF(__pyx_t_19); - __Pyx_XDECREF(__pyx_t_20); - __Pyx_XDECREF(__pyx_t_21); - __Pyx_XDECREF(__pyx_t_22); - __Pyx_XDECREF(__pyx_t_23); - __Pyx_XDECREF(__pyx_t_24); - __Pyx_XDECREF(__pyx_t_25); - __Pyx_XDECREF(__pyx_t_26); - __Pyx_XDECREF(__pyx_t_27); - __Pyx_XDECREF(__pyx_t_28); - __Pyx_XDECREF(__pyx_t_29); - __Pyx_XDECREF(__pyx_t_30); - __Pyx_XDECREF(__pyx_t_31); - __Pyx_XDECREF(__pyx_t_32); - __Pyx_XDECREF(__pyx_t_33); - __Pyx_XDECREF(__pyx_t_34); - __Pyx_XDECREF(__pyx_t_35); - __Pyx_XDECREF(__pyx_t_36); - __Pyx_XDECREF(__pyx_t_37); - __Pyx_XDECREF(__pyx_t_38); - __Pyx_XDECREF(__pyx_t_39); - __Pyx_XDECREF(__pyx_t_40); - __Pyx_XDECREF(__pyx_t_41); - __Pyx_XDECREF(__pyx_t_42); - __Pyx_XDECREF(__pyx_t_43); - __Pyx_XDECREF(__pyx_t_44); - __Pyx_XDECREF(__pyx_t_45); - __Pyx_XDECREF(__pyx_t_46); - __Pyx_XDECREF(__pyx_t_47); - __Pyx_XDECREF(__pyx_t_48); - __Pyx_XDECREF(__pyx_t_49); - __Pyx_XDECREF(__pyx_t_50); - __Pyx_XDECREF(__pyx_t_51); - __Pyx_XDECREF(__pyx_t_52); - __Pyx_XDECREF(__pyx_t_53); - __Pyx_XDECREF(__pyx_t_54); - __Pyx_XDECREF(__pyx_t_55); - __Pyx_XDECREF(__pyx_t_56); - __Pyx_XDECREF(__pyx_t_57); - __Pyx_XDECREF(__pyx_t_58); - __Pyx_XDECREF(__pyx_t_59); - __Pyx_XDECREF(__pyx_t_60); - __Pyx_XDECREF(__pyx_t_61); - __Pyx_XDECREF(__pyx_t_62); - __Pyx_XDECREF(__pyx_t_63); - __Pyx_XDECREF(__pyx_t_64); - __Pyx_XDECREF(__pyx_t_65); - __Pyx_XDECREF(__pyx_t_66); - __Pyx_XDECREF(__pyx_t_67); - __Pyx_XDECREF(__pyx_t_68); - __Pyx_XDECREF(__pyx_t_69); - __Pyx_XDECREF(__pyx_t_70); - __Pyx_XDECREF(__pyx_t_71); - __Pyx_XDECREF(__pyx_t_72); - __Pyx_XDECREF(__pyx_t_73); - __Pyx_XDECREF(__pyx_t_74); - __Pyx_XDECREF(__pyx_t_75); - __Pyx_XDECREF(__pyx_t_76); - __Pyx_XDECREF(__pyx_t_77); - __Pyx_XDECREF(__pyx_t_78); - if (__pyx_m) { - if (__pyx_d) { - __Pyx_AddTraceback("init aiohttp._http_parser", __pyx_clineno, __pyx_lineno, __pyx_filename); - } - Py_CLEAR(__pyx_m); - } else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ImportError, "init aiohttp._http_parser"); - } - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - #if CYTHON_PEP489_MULTI_PHASE_INIT - return (__pyx_m != NULL) ? 0 : -1; - #elif PY_MAJOR_VERSION >= 3 - return __pyx_m; - #else - return; - #endif -} - -/* --- Runtime support code --- */ -/* Refnanny */ -#if CYTHON_REFNANNY -static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { - PyObject *m = NULL, *p = NULL; - void *r = NULL; - m = PyImport_ImportModule(modname); - if (!m) goto end; - p = PyObject_GetAttrString(m, "RefNannyAPI"); - if (!p) goto end; - r = PyLong_AsVoidPtr(p); -end: - Py_XDECREF(p); - Py_XDECREF(m); - return (__Pyx_RefNannyAPIStruct *)r; -} -#endif - -/* PyObjectGetAttrStr */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { - PyTypeObject* tp = Py_TYPE(obj); - if (likely(tp->tp_getattro)) - return tp->tp_getattro(obj, attr_name); -#if PY_MAJOR_VERSION < 3 - if (likely(tp->tp_getattr)) - return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); -#endif - return PyObject_GetAttr(obj, attr_name); -} -#endif - -/* GetBuiltinName */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name) { - PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); - if (unlikely(!result)) { - PyErr_Format(PyExc_NameError, -#if PY_MAJOR_VERSION >= 3 - "name '%U' is not defined", name); -#else - "name '%.200s' is not defined", PyString_AS_STRING(name)); -#endif - } - return result; -} - -/* GetItemInt */ -static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { - PyObject *r; - if (!j) return NULL; - r = PyObject_GetItem(o, j); - Py_DECREF(j); - return r; -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, - CYTHON_NCP_UNUSED int wraparound, - CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - Py_ssize_t wrapped_i = i; - if (wraparound & unlikely(i < 0)) { - wrapped_i += PyList_GET_SIZE(o); - } - if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { - PyObject *r = PyList_GET_ITEM(o, wrapped_i); - Py_INCREF(r); - return r; - } - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -#else - return PySequence_GetItem(o, i); -#endif -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, - CYTHON_NCP_UNUSED int wraparound, - CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - Py_ssize_t wrapped_i = i; - if (wraparound & unlikely(i < 0)) { - wrapped_i += PyTuple_GET_SIZE(o); - } - if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { - PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); - Py_INCREF(r); - return r; - } - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -#else - return PySequence_GetItem(o, i); -#endif -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, - CYTHON_NCP_UNUSED int wraparound, - CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS - if (is_list || PyList_CheckExact(o)) { - Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); - if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { - PyObject *r = PyList_GET_ITEM(o, n); - Py_INCREF(r); - return r; - } - } - else if (PyTuple_CheckExact(o)) { - Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); - if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { - PyObject *r = PyTuple_GET_ITEM(o, n); - Py_INCREF(r); - return r; - } - } else { - PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; - if (likely(m && m->sq_item)) { - if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { - Py_ssize_t l = m->sq_length(o); - if (likely(l >= 0)) { - i += l; - } else { - if (!PyErr_ExceptionMatches(PyExc_OverflowError)) - return NULL; - PyErr_Clear(); - } - } - return m->sq_item(o, i); - } - } -#else - if (is_list || PySequence_Check(o)) { - return PySequence_GetItem(o, i); - } -#endif - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -} - -/* decode_c_bytes */ -static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes( - const char* cstring, Py_ssize_t length, Py_ssize_t start, Py_ssize_t stop, - const char* encoding, const char* errors, - PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { - if (unlikely((start < 0) | (stop < 0))) { - if (start < 0) { - start += length; - if (start < 0) - start = 0; - } - if (stop < 0) - stop += length; - } - if (stop > length) - stop = length; - if (unlikely(stop <= start)) - return __Pyx_NewRef(__pyx_empty_unicode); - length = stop - start; - cstring += start; - if (decode_func) { - return decode_func(cstring, length, errors); - } else { - return PyUnicode_Decode(cstring, length, encoding, errors); - } -} - -/* RaiseArgTupleInvalid */ -static void __Pyx_RaiseArgtupleInvalid( - const char* func_name, - int exact, - Py_ssize_t num_min, - Py_ssize_t num_max, - Py_ssize_t num_found) -{ - Py_ssize_t num_expected; - const char *more_or_less; - if (num_found < num_min) { - num_expected = num_min; - more_or_less = "at least"; - } else { - num_expected = num_max; - more_or_less = "at most"; - } - if (exact) { - more_or_less = "exactly"; - } - PyErr_Format(PyExc_TypeError, - "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", - func_name, more_or_less, num_expected, - (num_expected == 1) ? "" : "s", num_found); -} - -/* RaiseDoubleKeywords */ -static void __Pyx_RaiseDoubleKeywordsError( - const char* func_name, - PyObject* kw_name) -{ - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION >= 3 - "%s() got multiple values for keyword argument '%U'", func_name, kw_name); - #else - "%s() got multiple values for keyword argument '%s'", func_name, - PyString_AsString(kw_name)); - #endif -} - -/* ParseKeywords */ -static int __Pyx_ParseOptionalKeywords( - PyObject *kwds, - PyObject **argnames[], - PyObject *kwds2, - PyObject *values[], - Py_ssize_t num_pos_args, - const char* function_name) -{ - PyObject *key = 0, *value = 0; - Py_ssize_t pos = 0; - PyObject*** name; - PyObject*** first_kw_arg = argnames + num_pos_args; - while (PyDict_Next(kwds, &pos, &key, &value)) { - name = first_kw_arg; - while (*name && (**name != key)) name++; - if (*name) { - values[name-argnames] = value; - continue; - } - name = first_kw_arg; - #if PY_MAJOR_VERSION < 3 - if (likely(PyString_Check(key))) { - while (*name) { - if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) - && _PyString_Eq(**name, key)) { - values[name-argnames] = value; - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - if ((**argname == key) || ( - (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) - && _PyString_Eq(**argname, key))) { - goto arg_passed_twice; - } - argname++; - } - } - } else - #endif - if (likely(PyUnicode_Check(key))) { - while (*name) { - int cmp = (**name == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : - #endif - PyUnicode_Compare(**name, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) { - values[name-argnames] = value; - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - int cmp = (**argname == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : - #endif - PyUnicode_Compare(**argname, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) goto arg_passed_twice; - argname++; - } - } - } else - goto invalid_keyword_type; - if (kwds2) { - if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; - } else { - goto invalid_keyword; - } - } - return 0; -arg_passed_twice: - __Pyx_RaiseDoubleKeywordsError(function_name, key); - goto bad; -invalid_keyword_type: - PyErr_Format(PyExc_TypeError, - "%.200s() keywords must be strings", function_name); - goto bad; -invalid_keyword: - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION < 3 - "%.200s() got an unexpected keyword argument '%.200s'", - function_name, PyString_AsString(key)); - #else - "%s() got an unexpected keyword argument '%U'", - function_name, key); - #endif -bad: - return -1; -} - -/* None */ -static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) { - PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname); -} - -/* RaiseTooManyValuesToUnpack */ -static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { - PyErr_Format(PyExc_ValueError, - "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); -} - -/* RaiseNeedMoreValuesToUnpack */ -static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { - PyErr_Format(PyExc_ValueError, - "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", - index, (index == 1) ? "" : "s"); -} - -/* IterFinish */ -static CYTHON_INLINE int __Pyx_IterFinish(void) { -#if CYTHON_FAST_THREAD_STATE - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject* exc_type = tstate->curexc_type; - if (unlikely(exc_type)) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) { - PyObject *exc_value, *exc_tb; - exc_value = tstate->curexc_value; - exc_tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; - Py_DECREF(exc_type); - Py_XDECREF(exc_value); - Py_XDECREF(exc_tb); - return 0; - } else { - return -1; - } - } - return 0; -#else - if (unlikely(PyErr_Occurred())) { - if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) { - PyErr_Clear(); - return 0; - } else { - return -1; - } - } - return 0; -#endif -} - -/* UnpackItemEndCheck */ -static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { - if (unlikely(retval)) { - Py_DECREF(retval); - __Pyx_RaiseTooManyValuesError(expected); - return -1; - } else { - return __Pyx_IterFinish(); - } - return 0; -} - -/* KeywordStringCheck */ -static int __Pyx_CheckKeywordStrings( - PyObject *kwdict, - const char* function_name, - int kw_allowed) -{ - PyObject* key = 0; - Py_ssize_t pos = 0; -#if CYTHON_COMPILING_IN_PYPY - if (!kw_allowed && PyDict_Next(kwdict, &pos, &key, 0)) - goto invalid_keyword; - return 1; -#else - while (PyDict_Next(kwdict, &pos, &key, 0)) { - #if PY_MAJOR_VERSION < 3 - if (unlikely(!PyString_Check(key))) - #endif - if (unlikely(!PyUnicode_Check(key))) - goto invalid_keyword_type; - } - if ((!kw_allowed) && unlikely(key)) - goto invalid_keyword; - return 1; -invalid_keyword_type: - PyErr_Format(PyExc_TypeError, - "%.200s() keywords must be strings", function_name); - return 0; -#endif -invalid_keyword: - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION < 3 - "%.200s() got an unexpected keyword argument '%.200s'", - function_name, PyString_AsString(key)); - #else - "%s() got an unexpected keyword argument '%U'", - function_name, key); - #endif - return 0; -} - -/* ExtTypeTest */ -static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { - if (unlikely(!type)) { - PyErr_SetString(PyExc_SystemError, "Missing type object"); - return 0; - } - if (likely(__Pyx_TypeCheck(obj, type))) - return 1; - PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", - Py_TYPE(obj)->tp_name, type->tp_name); - return 0; -} - -/* DictGetItem */ -#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY -static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { - PyObject *value; - value = PyDict_GetItemWithError(d, key); - if (unlikely(!value)) { - if (!PyErr_Occurred()) { - if (unlikely(PyTuple_Check(key))) { - PyObject* args = PyTuple_Pack(1, key); - if (likely(args)) { - PyErr_SetObject(PyExc_KeyError, args); - Py_DECREF(args); - } - } else { - PyErr_SetObject(PyExc_KeyError, key); - } - } - return NULL; - } - Py_INCREF(value); - return value; -} -#endif - -/* PyErrExceptionMatches */ -#if CYTHON_FAST_THREAD_STATE -static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(tuple); -#if PY_MAJOR_VERSION >= 3 - for (i=0; icurexc_type; - if (exc_type == err) return 1; - if (unlikely(!exc_type)) return 0; - if (unlikely(PyTuple_Check(err))) - return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); - return __Pyx_PyErr_GivenExceptionMatches(exc_type, err); -} -#endif - -/* PyErrFetchRestore */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - tmp_type = tstate->curexc_type; - tmp_value = tstate->curexc_value; - tmp_tb = tstate->curexc_traceback; - tstate->curexc_type = type; - tstate->curexc_value = value; - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -} -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - *type = tstate->curexc_type; - *value = tstate->curexc_value; - *tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -} -#endif - -/* GetAttr */ -static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { -#if CYTHON_USE_TYPE_SLOTS -#if PY_MAJOR_VERSION >= 3 - if (likely(PyUnicode_Check(n))) -#else - if (likely(PyString_Check(n))) -#endif - return __Pyx_PyObject_GetAttrStr(o, n); -#endif - return PyObject_GetAttr(o, n); -} - -/* GetAttr3 */ -static PyObject *__Pyx_GetAttr3Default(PyObject *d) { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) - return NULL; - __Pyx_PyErr_Clear(); - Py_INCREF(d); - return d; -} -static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { - PyObject *r = __Pyx_GetAttr(o, n); - return (likely(r)) ? r : __Pyx_GetAttr3Default(d); -} - -/* PyDictVersioning */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { - PyObject **dictptr = NULL; - Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; - if (offset) { -#if CYTHON_COMPILING_IN_CPYTHON - dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); -#else - dictptr = _PyObject_GetDictPtr(obj); -#endif - } - return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; -} -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) - return 0; - return obj_dict_version == __Pyx_get_object_dict_version(obj); -} -#endif - -/* GetModuleGlobalName */ -#if CYTHON_USE_DICT_VERSIONS -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) -#else -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) -#endif -{ - PyObject *result; -#if !CYTHON_AVOID_BORROWED_REFS -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 - result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } else if (unlikely(PyErr_Occurred())) { - return NULL; - } -#else - result = PyDict_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } -#endif -#else - result = PyObject_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } - PyErr_Clear(); -#endif - return __Pyx_GetBuiltinName(name); -} - -/* PyFunctionFastCall */ -#if CYTHON_FAST_PYCALL -static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, - PyObject *globals) { - PyFrameObject *f; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject **fastlocals; - Py_ssize_t i; - PyObject *result; - assert(globals != NULL); - /* XXX Perhaps we should create a specialized - PyFrame_New() that doesn't take locals, but does - take builtins without sanity checking them. - */ - assert(tstate != NULL); - f = PyFrame_New(tstate, co, globals, NULL); - if (f == NULL) { - return NULL; - } - fastlocals = __Pyx_PyFrame_GetLocalsplus(f); - for (i = 0; i < na; i++) { - Py_INCREF(*args); - fastlocals[i] = *args++; - } - result = PyEval_EvalFrameEx(f,0); - ++tstate->recursion_depth; - Py_DECREF(f); - --tstate->recursion_depth; - return result; -} -#if 1 || PY_VERSION_HEX < 0x030600B1 -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *globals = PyFunction_GET_GLOBALS(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - PyObject *closure; -#if PY_MAJOR_VERSION >= 3 - PyObject *kwdefs; -#endif - PyObject *kwtuple, **k; - PyObject **d; - Py_ssize_t nd; - Py_ssize_t nk; - PyObject *result; - assert(kwargs == NULL || PyDict_Check(kwargs)); - nk = kwargs ? PyDict_Size(kwargs) : 0; - if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { - return NULL; - } - if ( -#if PY_MAJOR_VERSION >= 3 - co->co_kwonlyargcount == 0 && -#endif - likely(kwargs == NULL || nk == 0) && - co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { - if (argdefs == NULL && co->co_argcount == nargs) { - result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); - goto done; - } - else if (nargs == 0 && argdefs != NULL - && co->co_argcount == Py_SIZE(argdefs)) { - /* function called with no arguments, but all parameters have - a default value: use default values as arguments .*/ - args = &PyTuple_GET_ITEM(argdefs, 0); - result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); - goto done; - } - } - if (kwargs != NULL) { - Py_ssize_t pos, i; - kwtuple = PyTuple_New(2 * nk); - if (kwtuple == NULL) { - result = NULL; - goto done; - } - k = &PyTuple_GET_ITEM(kwtuple, 0); - pos = i = 0; - while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { - Py_INCREF(k[i]); - Py_INCREF(k[i+1]); - i += 2; - } - nk = i / 2; - } - else { - kwtuple = NULL; - k = NULL; - } - closure = PyFunction_GET_CLOSURE(func); -#if PY_MAJOR_VERSION >= 3 - kwdefs = PyFunction_GET_KW_DEFAULTS(func); -#endif - if (argdefs != NULL) { - d = &PyTuple_GET_ITEM(argdefs, 0); - nd = Py_SIZE(argdefs); - } - else { - d = NULL; - nd = 0; - } -#if PY_MAJOR_VERSION >= 3 - result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, kwdefs, closure); -#else - result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, closure); -#endif - Py_XDECREF(kwtuple); -done: - Py_LeaveRecursiveCall(); - return result; -} -#endif -#endif - -/* PyObjectCall */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { - PyObject *result; - ternaryfunc call = Py_TYPE(func)->tp_call; - if (unlikely(!call)) - return PyObject_Call(func, arg, kw); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = (*call)(func, arg, kw); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* PyObjectCallMethO */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { - PyObject *self, *result; - PyCFunction cfunc; - cfunc = PyCFunction_GET_FUNCTION(func); - self = PyCFunction_GET_SELF(func); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = cfunc(self, arg); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* PyObjectCallNoArg */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { -#if CYTHON_FAST_PYCALL - if (PyFunction_Check(func)) { - return __Pyx_PyFunction_FastCall(func, NULL, 0); - } -#endif -#ifdef __Pyx_CyFunction_USED - if (likely(PyCFunction_Check(func) || __Pyx_CyFunction_Check(func))) -#else - if (likely(PyCFunction_Check(func))) -#endif - { - if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) { - return __Pyx_PyObject_CallMethO(func, NULL); - } - } - return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL); -} -#endif - -/* PyCFunctionFastCall */ -#if CYTHON_FAST_PYCCALL -static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { - PyCFunctionObject *func = (PyCFunctionObject*)func_obj; - PyCFunction meth = PyCFunction_GET_FUNCTION(func); - PyObject *self = PyCFunction_GET_SELF(func); - int flags = PyCFunction_GET_FLAGS(func); - assert(PyCFunction_Check(func)); - assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); - assert(nargs >= 0); - assert(nargs == 0 || args != NULL); - /* _PyCFunction_FastCallDict() must not be called with an exception set, - because it may clear it (directly or indirectly) and so the - caller loses its exception */ - assert(!PyErr_Occurred()); - if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { - return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); - } else { - return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); - } -} -#endif - -/* PyObjectCallOneArg */ -#if CYTHON_COMPILING_IN_CPYTHON -static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *result; - PyObject *args = PyTuple_New(1); - if (unlikely(!args)) return NULL; - Py_INCREF(arg); - PyTuple_SET_ITEM(args, 0, arg); - result = __Pyx_PyObject_Call(func, args, NULL); - Py_DECREF(args); - return result; -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { -#if CYTHON_FAST_PYCALL - if (PyFunction_Check(func)) { - return __Pyx_PyFunction_FastCall(func, &arg, 1); - } -#endif - if (likely(PyCFunction_Check(func))) { - if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { - return __Pyx_PyObject_CallMethO(func, arg); -#if CYTHON_FAST_PYCCALL - } else if (__Pyx_PyFastCFunction_Check(func)) { - return __Pyx_PyCFunction_FastCall(func, &arg, 1); -#endif - } - } - return __Pyx__PyObject_CallOneArg(func, arg); -} -#else -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *result; - PyObject *args = PyTuple_Pack(1, arg); - if (unlikely(!args)) return NULL; - result = __Pyx_PyObject_Call(func, args, NULL); - Py_DECREF(args); - return result; -} -#endif - -/* PyObjectCall2Args */ -static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) { - PyObject *args, *result = NULL; - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(function)) { - PyObject *args[2] = {arg1, arg2}; - return __Pyx_PyFunction_FastCall(function, args, 2); - } - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(function)) { - PyObject *args[2] = {arg1, arg2}; - return __Pyx_PyCFunction_FastCall(function, args, 2); - } - #endif - args = PyTuple_New(2); - if (unlikely(!args)) goto done; - Py_INCREF(arg1); - PyTuple_SET_ITEM(args, 0, arg1); - Py_INCREF(arg2); - PyTuple_SET_ITEM(args, 1, arg2); - Py_INCREF(function); - result = __Pyx_PyObject_Call(function, args, NULL); - Py_DECREF(args); - Py_DECREF(function); -done: - return result; -} - -/* RaiseException */ -#if PY_MAJOR_VERSION < 3 -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, - CYTHON_UNUSED PyObject *cause) { - __Pyx_PyThreadState_declare - Py_XINCREF(type); - if (!value || value == Py_None) - value = NULL; - else - Py_INCREF(value); - if (!tb || tb == Py_None) - tb = NULL; - else { - Py_INCREF(tb); - if (!PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto raise_error; - } - } - if (PyType_Check(type)) { -#if CYTHON_COMPILING_IN_PYPY - if (!value) { - Py_INCREF(Py_None); - value = Py_None; - } -#endif - PyErr_NormalizeException(&type, &value, &tb); - } else { - if (value) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto raise_error; - } - value = type; - type = (PyObject*) Py_TYPE(type); - Py_INCREF(type); - if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto raise_error; - } - } - __Pyx_PyThreadState_assign - __Pyx_ErrRestore(type, value, tb); - return; -raise_error: - Py_XDECREF(value); - Py_XDECREF(type); - Py_XDECREF(tb); - return; -} -#else -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { - PyObject* owned_instance = NULL; - if (tb == Py_None) { - tb = 0; - } else if (tb && !PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto bad; - } - if (value == Py_None) - value = 0; - if (PyExceptionInstance_Check(type)) { - if (value) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto bad; - } - value = type; - type = (PyObject*) Py_TYPE(value); - } else if (PyExceptionClass_Check(type)) { - PyObject *instance_class = NULL; - if (value && PyExceptionInstance_Check(value)) { - instance_class = (PyObject*) Py_TYPE(value); - if (instance_class != type) { - int is_subclass = PyObject_IsSubclass(instance_class, type); - if (!is_subclass) { - instance_class = NULL; - } else if (unlikely(is_subclass == -1)) { - goto bad; - } else { - type = instance_class; - } - } - } - if (!instance_class) { - PyObject *args; - if (!value) - args = PyTuple_New(0); - else if (PyTuple_Check(value)) { - Py_INCREF(value); - args = value; - } else - args = PyTuple_Pack(1, value); - if (!args) - goto bad; - owned_instance = PyObject_Call(type, args, NULL); - Py_DECREF(args); - if (!owned_instance) - goto bad; - value = owned_instance; - if (!PyExceptionInstance_Check(value)) { - PyErr_Format(PyExc_TypeError, - "calling %R should have returned an instance of " - "BaseException, not %R", - type, Py_TYPE(value)); - goto bad; - } - } - } else { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto bad; - } - if (cause) { - PyObject *fixed_cause; - if (cause == Py_None) { - fixed_cause = NULL; - } else if (PyExceptionClass_Check(cause)) { - fixed_cause = PyObject_CallObject(cause, NULL); - if (fixed_cause == NULL) - goto bad; - } else if (PyExceptionInstance_Check(cause)) { - fixed_cause = cause; - Py_INCREF(fixed_cause); - } else { - PyErr_SetString(PyExc_TypeError, - "exception causes must derive from " - "BaseException"); - goto bad; - } - PyException_SetCause(value, fixed_cause); - } - PyErr_SetObject(type, value); - if (tb) { -#if CYTHON_COMPILING_IN_PYPY - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); - Py_INCREF(tb); - PyErr_Restore(tmp_type, tmp_value, tb); - Py_XDECREF(tmp_tb); -#else - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject* tmp_tb = tstate->curexc_traceback; - if (tb != tmp_tb) { - Py_INCREF(tb); - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_tb); - } -#endif - } -bad: - Py_XDECREF(owned_instance); - return; -} -#endif - -/* BytesEquals */ -static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { -#if CYTHON_COMPILING_IN_PYPY - return PyObject_RichCompareBool(s1, s2, equals); -#else - if (s1 == s2) { - return (equals == Py_EQ); - } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { - const char *ps1, *ps2; - Py_ssize_t length = PyBytes_GET_SIZE(s1); - if (length != PyBytes_GET_SIZE(s2)) - return (equals == Py_NE); - ps1 = PyBytes_AS_STRING(s1); - ps2 = PyBytes_AS_STRING(s2); - if (ps1[0] != ps2[0]) { - return (equals == Py_NE); - } else if (length == 1) { - return (equals == Py_EQ); - } else { - int result; -#if CYTHON_USE_UNICODE_INTERNALS - Py_hash_t hash1, hash2; - hash1 = ((PyBytesObject*)s1)->ob_shash; - hash2 = ((PyBytesObject*)s2)->ob_shash; - if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { - return (equals == Py_NE); - } -#endif - result = memcmp(ps1, ps2, (size_t)length); - return (equals == Py_EQ) ? (result == 0) : (result != 0); - } - } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { - return (equals == Py_NE); - } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { - return (equals == Py_NE); - } else { - int result; - PyObject* py_result = PyObject_RichCompare(s1, s2, equals); - if (!py_result) - return -1; - result = __Pyx_PyObject_IsTrue(py_result); - Py_DECREF(py_result); - return result; - } -#endif -} - -/* UnicodeEquals */ -static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { -#if CYTHON_COMPILING_IN_PYPY - return PyObject_RichCompareBool(s1, s2, equals); -#else -#if PY_MAJOR_VERSION < 3 - PyObject* owned_ref = NULL; -#endif - int s1_is_unicode, s2_is_unicode; - if (s1 == s2) { - goto return_eq; - } - s1_is_unicode = PyUnicode_CheckExact(s1); - s2_is_unicode = PyUnicode_CheckExact(s2); -#if PY_MAJOR_VERSION < 3 - if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { - owned_ref = PyUnicode_FromObject(s2); - if (unlikely(!owned_ref)) - return -1; - s2 = owned_ref; - s2_is_unicode = 1; - } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { - owned_ref = PyUnicode_FromObject(s1); - if (unlikely(!owned_ref)) - return -1; - s1 = owned_ref; - s1_is_unicode = 1; - } else if (((!s2_is_unicode) & (!s1_is_unicode))) { - return __Pyx_PyBytes_Equals(s1, s2, equals); - } -#endif - if (s1_is_unicode & s2_is_unicode) { - Py_ssize_t length; - int kind; - void *data1, *data2; - if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) - return -1; - length = __Pyx_PyUnicode_GET_LENGTH(s1); - if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { - goto return_ne; - } -#if CYTHON_USE_UNICODE_INTERNALS - { - Py_hash_t hash1, hash2; - #if CYTHON_PEP393_ENABLED - hash1 = ((PyASCIIObject*)s1)->hash; - hash2 = ((PyASCIIObject*)s2)->hash; - #else - hash1 = ((PyUnicodeObject*)s1)->hash; - hash2 = ((PyUnicodeObject*)s2)->hash; - #endif - if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { - goto return_ne; - } - } -#endif - kind = __Pyx_PyUnicode_KIND(s1); - if (kind != __Pyx_PyUnicode_KIND(s2)) { - goto return_ne; - } - data1 = __Pyx_PyUnicode_DATA(s1); - data2 = __Pyx_PyUnicode_DATA(s2); - if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { - goto return_ne; - } else if (length == 1) { - goto return_eq; - } else { - int result = memcmp(data1, data2, (size_t)(length * kind)); - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - return (equals == Py_EQ) ? (result == 0) : (result != 0); - } - } else if ((s1 == Py_None) & s2_is_unicode) { - goto return_ne; - } else if ((s2 == Py_None) & s1_is_unicode) { - goto return_ne; - } else { - int result; - PyObject* py_result = PyObject_RichCompare(s1, s2, equals); - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - if (!py_result) - return -1; - result = __Pyx_PyObject_IsTrue(py_result); - Py_DECREF(py_result); - return result; - } -return_eq: - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - return (equals == Py_EQ); -return_ne: - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - return (equals == Py_NE); -#endif -} - -/* SliceObject */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj, - Py_ssize_t cstart, Py_ssize_t cstop, - PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice, - int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) { -#if CYTHON_USE_TYPE_SLOTS - PyMappingMethods* mp; -#if PY_MAJOR_VERSION < 3 - PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence; - if (likely(ms && ms->sq_slice)) { - if (!has_cstart) { - if (_py_start && (*_py_start != Py_None)) { - cstart = __Pyx_PyIndex_AsSsize_t(*_py_start); - if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; - } else - cstart = 0; - } - if (!has_cstop) { - if (_py_stop && (*_py_stop != Py_None)) { - cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop); - if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; - } else - cstop = PY_SSIZE_T_MAX; - } - if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) { - Py_ssize_t l = ms->sq_length(obj); - if (likely(l >= 0)) { - if (cstop < 0) { - cstop += l; - if (cstop < 0) cstop = 0; - } - if (cstart < 0) { - cstart += l; - if (cstart < 0) cstart = 0; - } - } else { - if (!PyErr_ExceptionMatches(PyExc_OverflowError)) - goto bad; - PyErr_Clear(); - } - } - return ms->sq_slice(obj, cstart, cstop); - } -#endif - mp = Py_TYPE(obj)->tp_as_mapping; - if (likely(mp && mp->mp_subscript)) -#endif - { - PyObject* result; - PyObject *py_slice, *py_start, *py_stop; - if (_py_slice) { - py_slice = *_py_slice; - } else { - PyObject* owned_start = NULL; - PyObject* owned_stop = NULL; - if (_py_start) { - py_start = *_py_start; - } else { - if (has_cstart) { - owned_start = py_start = PyInt_FromSsize_t(cstart); - if (unlikely(!py_start)) goto bad; - } else - py_start = Py_None; - } - if (_py_stop) { - py_stop = *_py_stop; - } else { - if (has_cstop) { - owned_stop = py_stop = PyInt_FromSsize_t(cstop); - if (unlikely(!py_stop)) { - Py_XDECREF(owned_start); - goto bad; - } - } else - py_stop = Py_None; - } - py_slice = PySlice_New(py_start, py_stop, Py_None); - Py_XDECREF(owned_start); - Py_XDECREF(owned_stop); - if (unlikely(!py_slice)) goto bad; - } -#if CYTHON_USE_TYPE_SLOTS - result = mp->mp_subscript(obj, py_slice); -#else - result = PyObject_GetItem(obj, py_slice); -#endif - if (!_py_slice) { - Py_DECREF(py_slice); - } - return result; - } - PyErr_Format(PyExc_TypeError, - "'%.200s' object is unsliceable", Py_TYPE(obj)->tp_name); -bad: - return NULL; -} - -/* PyUnicode_Substring */ -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( - PyObject* text, Py_ssize_t start, Py_ssize_t stop) { - Py_ssize_t length; - if (unlikely(__Pyx_PyUnicode_READY(text) == -1)) return NULL; - length = __Pyx_PyUnicode_GET_LENGTH(text); - if (start < 0) { - start += length; - if (start < 0) - start = 0; - } - if (stop < 0) - stop += length; - else if (stop > length) - stop = length; - if (stop <= start) - return __Pyx_NewRef(__pyx_empty_unicode); -#if CYTHON_PEP393_ENABLED - return PyUnicode_FromKindAndData(PyUnicode_KIND(text), - PyUnicode_1BYTE_DATA(text) + start*PyUnicode_KIND(text), stop-start); -#else - return PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(text)+start, stop-start); -#endif -} - -/* GetException */ -#if CYTHON_FAST_THREAD_STATE -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) -#endif -{ - PyObject *local_type, *local_value, *local_tb; -#if CYTHON_FAST_THREAD_STATE - PyObject *tmp_type, *tmp_value, *tmp_tb; - local_type = tstate->curexc_type; - local_value = tstate->curexc_value; - local_tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -#else - PyErr_Fetch(&local_type, &local_value, &local_tb); -#endif - PyErr_NormalizeException(&local_type, &local_value, &local_tb); -#if CYTHON_FAST_THREAD_STATE - if (unlikely(tstate->curexc_type)) -#else - if (unlikely(PyErr_Occurred())) -#endif - goto bad; - #if PY_MAJOR_VERSION >= 3 - if (local_tb) { - if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) - goto bad; - } - #endif - Py_XINCREF(local_tb); - Py_XINCREF(local_type); - Py_XINCREF(local_value); - *type = local_type; - *value = local_value; - *tb = local_tb; -#if CYTHON_FAST_THREAD_STATE - #if CYTHON_USE_EXC_INFO_STACK - { - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = local_type; - exc_info->exc_value = local_value; - exc_info->exc_traceback = local_tb; - } - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = local_type; - tstate->exc_value = local_value; - tstate->exc_traceback = local_tb; - #endif - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -#else - PyErr_SetExcInfo(local_type, local_value, local_tb); -#endif - return 0; -bad: - *type = 0; - *value = 0; - *tb = 0; - Py_XDECREF(local_type); - Py_XDECREF(local_value); - Py_XDECREF(local_tb); - return -1; -} - -/* SwapException */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = *type; - exc_info->exc_value = *value; - exc_info->exc_traceback = *tb; - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = *type; - tstate->exc_value = *value; - tstate->exc_traceback = *tb; - #endif - *type = tmp_type; - *value = tmp_value; - *tb = tmp_tb; -} -#else -static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); - PyErr_SetExcInfo(*type, *value, *tb); - *type = tmp_type; - *value = tmp_value; - *tb = tmp_tb; -} -#endif - -/* GetTopmostException */ -#if CYTHON_USE_EXC_INFO_STACK -static _PyErr_StackItem * -__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) -{ - _PyErr_StackItem *exc_info = tstate->exc_info; - while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && - exc_info->previous_item != NULL) - { - exc_info = exc_info->previous_item; - } - return exc_info; -} -#endif - -/* SaveResetException */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); - *type = exc_info->exc_type; - *value = exc_info->exc_value; - *tb = exc_info->exc_traceback; - #else - *type = tstate->exc_type; - *value = tstate->exc_value; - *tb = tstate->exc_traceback; - #endif - Py_XINCREF(*type); - Py_XINCREF(*value); - Py_XINCREF(*tb); -} -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = type; - exc_info->exc_value = value; - exc_info->exc_traceback = tb; - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = type; - tstate->exc_value = value; - tstate->exc_traceback = tb; - #endif - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -} -#endif - -/* Import */ -static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { - PyObject *empty_list = 0; - PyObject *module = 0; - PyObject *global_dict = 0; - PyObject *empty_dict = 0; - PyObject *list; - #if PY_MAJOR_VERSION < 3 - PyObject *py_import; - py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); - if (!py_import) - goto bad; - #endif - if (from_list) - list = from_list; - else { - empty_list = PyList_New(0); - if (!empty_list) - goto bad; - list = empty_list; - } - global_dict = PyModule_GetDict(__pyx_m); - if (!global_dict) - goto bad; - empty_dict = PyDict_New(); - if (!empty_dict) - goto bad; - { - #if PY_MAJOR_VERSION >= 3 - if (level == -1) { - if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { - module = PyImport_ImportModuleLevelObject( - name, global_dict, empty_dict, list, 1); - if (!module) { - if (!PyErr_ExceptionMatches(PyExc_ImportError)) - goto bad; - PyErr_Clear(); - } - } - level = 0; - } - #endif - if (!module) { - #if PY_MAJOR_VERSION < 3 - PyObject *py_level = PyInt_FromLong(level); - if (!py_level) - goto bad; - module = PyObject_CallFunctionObjArgs(py_import, - name, global_dict, empty_dict, list, py_level, (PyObject *)NULL); - Py_DECREF(py_level); - #else - module = PyImport_ImportModuleLevelObject( - name, global_dict, empty_dict, list, level); - #endif - } - } -bad: - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(py_import); - #endif - Py_XDECREF(empty_list); - Py_XDECREF(empty_dict); - return module; -} - -/* ImportFrom */ -static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { - PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); - if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Format(PyExc_ImportError, - #if PY_MAJOR_VERSION < 3 - "cannot import name %.230s", PyString_AS_STRING(name)); - #else - "cannot import name %S", name); - #endif - } - return value; -} - -/* HasAttr */ -static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { - PyObject *r; - if (unlikely(!__Pyx_PyBaseString_Check(n))) { - PyErr_SetString(PyExc_TypeError, - "hasattr(): attribute name must be string"); - return -1; - } - r = __Pyx_GetAttr(o, n); - if (unlikely(!r)) { - PyErr_Clear(); - return 0; - } else { - Py_DECREF(r); - return 1; - } -} - -/* PyObject_GenericGetAttrNoDict */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { - PyErr_Format(PyExc_AttributeError, -#if PY_MAJOR_VERSION >= 3 - "'%.50s' object has no attribute '%U'", - tp->tp_name, attr_name); -#else - "'%.50s' object has no attribute '%.400s'", - tp->tp_name, PyString_AS_STRING(attr_name)); -#endif - return NULL; -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { - PyObject *descr; - PyTypeObject *tp = Py_TYPE(obj); - if (unlikely(!PyString_Check(attr_name))) { - return PyObject_GenericGetAttr(obj, attr_name); - } - assert(!tp->tp_dictoffset); - descr = _PyType_Lookup(tp, attr_name); - if (unlikely(!descr)) { - return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); - } - Py_INCREF(descr); - #if PY_MAJOR_VERSION < 3 - if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) - #endif - { - descrgetfunc f = Py_TYPE(descr)->tp_descr_get; - if (unlikely(f)) { - PyObject *res = f(descr, obj, (PyObject *)tp); - Py_DECREF(descr); - return res; - } - } - return descr; -} -#endif - -/* PyObject_GenericGetAttr */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { - if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { - return PyObject_GenericGetAttr(obj, attr_name); - } - return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); -} -#endif - -/* PyObjectGetAttrStrNoError */ -static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) - __Pyx_PyErr_Clear(); -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { - PyObject *result; -#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 - PyTypeObject* tp = Py_TYPE(obj); - if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { - return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); - } -#endif - result = __Pyx_PyObject_GetAttrStr(obj, attr_name); - if (unlikely(!result)) { - __Pyx_PyObject_GetAttrStr_ClearAttributeError(); - } - return result; -} - -/* SetupReduce */ -static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { - int ret; - PyObject *name_attr; - name_attr = __Pyx_PyObject_GetAttrStr(meth, __pyx_n_s_name); - if (likely(name_attr)) { - ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); - } else { - ret = -1; - } - if (unlikely(ret < 0)) { - PyErr_Clear(); - ret = 0; - } - Py_XDECREF(name_attr); - return ret; -} -static int __Pyx_setup_reduce(PyObject* type_obj) { - int ret = 0; - PyObject *object_reduce = NULL; - PyObject *object_reduce_ex = NULL; - PyObject *reduce = NULL; - PyObject *reduce_ex = NULL; - PyObject *reduce_cython = NULL; - PyObject *setstate = NULL; - PyObject *setstate_cython = NULL; -#if CYTHON_USE_PYTYPE_LOOKUP - if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; -#else - if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; -#endif -#if CYTHON_USE_PYTYPE_LOOKUP - object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; -#else - object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; -#endif - reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; - if (reduce_ex == object_reduce_ex) { -#if CYTHON_USE_PYTYPE_LOOKUP - object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; -#else - object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; -#endif - reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; - if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { - reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); - if (likely(reduce_cython)) { - ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - } else if (reduce == object_reduce || PyErr_Occurred()) { - goto __PYX_BAD; - } - setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate); - if (!setstate) PyErr_Clear(); - if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { - setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); - if (likely(setstate_cython)) { - ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - } else if (!setstate || PyErr_Occurred()) { - goto __PYX_BAD; - } - } - PyType_Modified((PyTypeObject*)type_obj); - } - } - goto __PYX_GOOD; -__PYX_BAD: - if (!PyErr_Occurred()) - PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name); - ret = -1; -__PYX_GOOD: -#if !CYTHON_USE_PYTYPE_LOOKUP - Py_XDECREF(object_reduce); - Py_XDECREF(object_reduce_ex); -#endif - Py_XDECREF(reduce); - Py_XDECREF(reduce_ex); - Py_XDECREF(reduce_cython); - Py_XDECREF(setstate); - Py_XDECREF(setstate_cython); - return ret; -} - -/* SetVTable */ -static int __Pyx_SetVtable(PyObject *dict, void *vtable) { -#if PY_VERSION_HEX >= 0x02070000 - PyObject *ob = PyCapsule_New(vtable, 0, 0); -#else - PyObject *ob = PyCObject_FromVoidPtr(vtable, 0); -#endif - if (!ob) - goto bad; - if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0) - goto bad; - Py_DECREF(ob); - return 0; -bad: - Py_XDECREF(ob); - return -1; -} - -/* TypeImport */ -#ifndef __PYX_HAVE_RT_ImportType -#define __PYX_HAVE_RT_ImportType -static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name, - size_t size, enum __Pyx_ImportType_CheckSize check_size) -{ - PyObject *result = 0; - char warning[200]; - Py_ssize_t basicsize; -#ifdef Py_LIMITED_API - PyObject *py_basicsize; -#endif - result = PyObject_GetAttrString(module, class_name); - if (!result) - goto bad; - if (!PyType_Check(result)) { - PyErr_Format(PyExc_TypeError, - "%.200s.%.200s is not a type object", - module_name, class_name); - goto bad; - } -#ifndef Py_LIMITED_API - basicsize = ((PyTypeObject *)result)->tp_basicsize; -#else - py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); - if (!py_basicsize) - goto bad; - basicsize = PyLong_AsSsize_t(py_basicsize); - Py_DECREF(py_basicsize); - py_basicsize = 0; - if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) - goto bad; -#endif - if ((size_t)basicsize < size) { - PyErr_Format(PyExc_ValueError, - "%.200s.%.200s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - goto bad; - } - if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) { - PyErr_Format(PyExc_ValueError, - "%.200s.%.200s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - goto bad; - } - else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) { - PyOS_snprintf(warning, sizeof(warning), - "%s.%s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; - } - return (PyTypeObject *)result; -bad: - Py_XDECREF(result); - return NULL; -} -#endif - -/* decode_c_string */ -static CYTHON_INLINE PyObject* __Pyx_decode_c_string( - const char* cstring, Py_ssize_t start, Py_ssize_t stop, - const char* encoding, const char* errors, - PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { - Py_ssize_t length; - if (unlikely((start < 0) | (stop < 0))) { - size_t slen = strlen(cstring); - if (unlikely(slen > (size_t) PY_SSIZE_T_MAX)) { - PyErr_SetString(PyExc_OverflowError, - "c-string too long to convert to Python"); - return NULL; - } - length = (Py_ssize_t) slen; - if (start < 0) { - start += length; - if (start < 0) - start = 0; - } - if (stop < 0) - stop += length; - } - if (unlikely(stop <= start)) - return __Pyx_NewRef(__pyx_empty_unicode); - length = stop - start; - cstring += start; - if (decode_func) { - return decode_func(cstring, length, errors); - } else { - return PyUnicode_Decode(cstring, length, encoding, errors); - } -} - -/* CLineInTraceback */ -#ifndef CYTHON_CLINE_IN_TRACEBACK -static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { - PyObject *use_cline; - PyObject *ptype, *pvalue, *ptraceback; -#if CYTHON_COMPILING_IN_CPYTHON - PyObject **cython_runtime_dict; -#endif - if (unlikely(!__pyx_cython_runtime)) { - return c_line; - } - __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); -#if CYTHON_COMPILING_IN_CPYTHON - cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); - if (likely(cython_runtime_dict)) { - __PYX_PY_DICT_LOOKUP_IF_MODIFIED( - use_cline, *cython_runtime_dict, - __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) - } else -#endif - { - PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); - if (use_cline_obj) { - use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; - Py_DECREF(use_cline_obj); - } else { - PyErr_Clear(); - use_cline = NULL; - } - } - if (!use_cline) { - c_line = 0; - PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); - } - else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { - c_line = 0; - } - __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); - return c_line; -} -#endif - -/* CodeObjectCache */ -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { - int start = 0, mid = 0, end = count - 1; - if (end >= 0 && code_line > entries[end].code_line) { - return count; - } - while (start < end) { - mid = start + (end - start) / 2; - if (code_line < entries[mid].code_line) { - end = mid; - } else if (code_line > entries[mid].code_line) { - start = mid + 1; - } else { - return mid; - } - } - if (code_line <= entries[mid].code_line) { - return mid; - } else { - return mid + 1; - } -} -static PyCodeObject *__pyx_find_code_object(int code_line) { - PyCodeObject* code_object; - int pos; - if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { - return NULL; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { - return NULL; - } - code_object = __pyx_code_cache.entries[pos].code_object; - Py_INCREF(code_object); - return code_object; -} -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { - int pos, i; - __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; - if (unlikely(!code_line)) { - return; - } - if (unlikely(!entries)) { - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); - if (likely(entries)) { - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = 64; - __pyx_code_cache.count = 1; - entries[0].code_line = code_line; - entries[0].code_object = code_object; - Py_INCREF(code_object); - } - return; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { - PyCodeObject* tmp = entries[pos].code_object; - entries[pos].code_object = code_object; - Py_DECREF(tmp); - return; - } - if (__pyx_code_cache.count == __pyx_code_cache.max_count) { - int new_max = __pyx_code_cache.max_count + 64; - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( - __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); - if (unlikely(!entries)) { - return; - } - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = new_max; - } - for (i=__pyx_code_cache.count; i>pos; i--) { - entries[i] = entries[i-1]; - } - entries[pos].code_line = code_line; - entries[pos].code_object = code_object; - __pyx_code_cache.count++; - Py_INCREF(code_object); -} - -/* AddTraceback */ -#include "compile.h" -#include "frameobject.h" -#include "traceback.h" -static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( - const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyObject *py_srcfile = 0; - PyObject *py_funcname = 0; - #if PY_MAJOR_VERSION < 3 - py_srcfile = PyString_FromString(filename); - #else - py_srcfile = PyUnicode_FromString(filename); - #endif - if (!py_srcfile) goto bad; - if (c_line) { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - #else - py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - #endif - } - else { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromString(funcname); - #else - py_funcname = PyUnicode_FromString(funcname); - #endif - } - if (!py_funcname) goto bad; - py_code = __Pyx_PyCode_New( - 0, - 0, - 0, - 0, - 0, - __pyx_empty_bytes, /*PyObject *code,*/ - __pyx_empty_tuple, /*PyObject *consts,*/ - __pyx_empty_tuple, /*PyObject *names,*/ - __pyx_empty_tuple, /*PyObject *varnames,*/ - __pyx_empty_tuple, /*PyObject *freevars,*/ - __pyx_empty_tuple, /*PyObject *cellvars,*/ - py_srcfile, /*PyObject *filename,*/ - py_funcname, /*PyObject *name,*/ - py_line, - __pyx_empty_bytes /*PyObject *lnotab*/ - ); - Py_DECREF(py_srcfile); - Py_DECREF(py_funcname); - return py_code; -bad: - Py_XDECREF(py_srcfile); - Py_XDECREF(py_funcname); - return NULL; -} -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyFrameObject *py_frame = 0; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - if (c_line) { - c_line = __Pyx_CLineForTraceback(tstate, c_line); - } - py_code = __pyx_find_code_object(c_line ? -c_line : py_line); - if (!py_code) { - py_code = __Pyx_CreateCodeObjectForTraceback( - funcname, c_line, py_line, filename); - if (!py_code) goto bad; - __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); - } - py_frame = PyFrame_New( - tstate, /*PyThreadState *tstate,*/ - py_code, /*PyCodeObject *code,*/ - __pyx_d, /*PyObject *globals,*/ - 0 /*PyObject *locals*/ - ); - if (!py_frame) goto bad; - __Pyx_PyFrame_SetLineNumber(py_frame, py_line); - PyTraceBack_Here(py_frame); -bad: - Py_XDECREF(py_code); - Py_XDECREF(py_frame); -} - -/* CIntFromPyVerify */ -#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) -#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) -#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ - {\ - func_type value = func_value;\ - if (sizeof(target_type) < sizeof(func_type)) {\ - if (unlikely(value != (func_type) (target_type) value)) {\ - func_type zero = 0;\ - if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ - return (target_type) -1;\ - if (is_unsigned && unlikely(value < zero))\ - goto raise_neg_overflow;\ - else\ - goto raise_overflow;\ - }\ - }\ - return (target_type) value;\ - } - -/* CIntToPy */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const int neg_one = (int) -1, const_zero = (int) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(int) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(int) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(int) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(int), - little, !is_unsigned); - } -} - -/* CIntFromPy */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const int neg_one = (int) -1, const_zero = (int) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(int) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (int) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { - return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { - return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { - return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (int) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(int) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) - case -2: - if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - } -#endif - if (sizeof(int) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - int val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (int) -1; - } - } else { - int val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (int) -1; - val = __Pyx_PyInt_As_int(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to int"); - return (int) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to int"); - return (int) -1; -} - -/* CIntFromPy */ -static CYTHON_INLINE enum llhttp_method __Pyx_PyInt_As_enum__llhttp_method(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const enum llhttp_method neg_one = (enum llhttp_method) -1, const_zero = (enum llhttp_method) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(enum llhttp_method) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (enum llhttp_method) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (enum llhttp_method) 0; - case 1: __PYX_VERIFY_RETURN_INT(enum llhttp_method, digit, digits[0]) - case 2: - if (8 * sizeof(enum llhttp_method) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(enum llhttp_method) >= 2 * PyLong_SHIFT) { - return (enum llhttp_method) (((((enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(enum llhttp_method) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(enum llhttp_method) >= 3 * PyLong_SHIFT) { - return (enum llhttp_method) (((((((enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(enum llhttp_method) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(enum llhttp_method) >= 4 * PyLong_SHIFT) { - return (enum llhttp_method) (((((((((enum llhttp_method)digits[3]) << PyLong_SHIFT) | (enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (enum llhttp_method) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(enum llhttp_method) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(enum llhttp_method) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (enum llhttp_method) 0; - case -1: __PYX_VERIFY_RETURN_INT(enum llhttp_method, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(enum llhttp_method, digit, +digits[0]) - case -2: - if (8 * sizeof(enum llhttp_method) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(enum llhttp_method) - 1 > 2 * PyLong_SHIFT) { - return (enum llhttp_method) (((enum llhttp_method)-1)*(((((enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(enum llhttp_method) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(enum llhttp_method) - 1 > 2 * PyLong_SHIFT) { - return (enum llhttp_method) ((((((enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(enum llhttp_method) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(enum llhttp_method) - 1 > 3 * PyLong_SHIFT) { - return (enum llhttp_method) (((enum llhttp_method)-1)*(((((((enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(enum llhttp_method) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(enum llhttp_method) - 1 > 3 * PyLong_SHIFT) { - return (enum llhttp_method) ((((((((enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(enum llhttp_method) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(enum llhttp_method) - 1 > 4 * PyLong_SHIFT) { - return (enum llhttp_method) (((enum llhttp_method)-1)*(((((((((enum llhttp_method)digits[3]) << PyLong_SHIFT) | (enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(enum llhttp_method) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(enum llhttp_method) - 1 > 4 * PyLong_SHIFT) { - return (enum llhttp_method) ((((((((((enum llhttp_method)digits[3]) << PyLong_SHIFT) | (enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); - } - } - break; - } -#endif - if (sizeof(enum llhttp_method) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(enum llhttp_method) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - enum llhttp_method val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (enum llhttp_method) -1; - } - } else { - enum llhttp_method val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (enum llhttp_method) -1; - val = __Pyx_PyInt_As_enum__llhttp_method(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to enum llhttp_method"); - return (enum llhttp_method) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to enum llhttp_method"); - return (enum llhttp_method) -1; -} - -/* CIntFromPy */ -static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const size_t neg_one = (size_t) -1, const_zero = (size_t) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(size_t) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(size_t, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (size_t) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (size_t) 0; - case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, digits[0]) - case 2: - if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) >= 2 * PyLong_SHIFT) { - return (size_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) >= 3 * PyLong_SHIFT) { - return (size_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) >= 4 * PyLong_SHIFT) { - return (size_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (size_t) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(size_t) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(size_t) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (size_t) 0; - case -1: __PYX_VERIFY_RETURN_INT(size_t, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, +digits[0]) - case -2: - if (8 * sizeof(size_t) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { - return (size_t) (((size_t)-1)*(((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { - return (size_t) ((((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { - return (size_t) (((size_t)-1)*(((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { - return (size_t) ((((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { - return (size_t) (((size_t)-1)*(((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { - return (size_t) ((((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); - } - } - break; - } -#endif - if (sizeof(size_t) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(size_t, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(size_t) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(size_t, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - size_t val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (size_t) -1; - } - } else { - size_t val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (size_t) -1; - val = __Pyx_PyInt_As_size_t(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to size_t"); - return (size_t) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to size_t"); - return (size_t) -1; -} - -/* CIntFromPy */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const long neg_one = (long) -1, const_zero = (long) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(long) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (long) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (long) 0; - case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) - case 2: - if (8 * sizeof(long) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { - return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(long) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { - return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(long) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { - return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (long) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(long) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (long) 0; - case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) - case -2: - if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(long) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(long) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(long) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - } -#endif - if (sizeof(long) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - long val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (long) -1; - } - } else { - long val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (long) -1; - val = __Pyx_PyInt_As_long(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to long"); - return (long) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to long"); - return (long) -1; -} - -/* CIntToPy */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint8_t(uint8_t value) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const uint8_t neg_one = (uint8_t) -1, const_zero = (uint8_t) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(uint8_t) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(uint8_t) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(uint8_t) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(uint8_t) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(uint8_t) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(uint8_t), - little, !is_unsigned); - } -} - -/* CIntToPy */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const long neg_one = (long) -1, const_zero = (long) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(long) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(long) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(long) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(long), - little, !is_unsigned); - } -} - -/* FastTypeChecks */ -#if CYTHON_COMPILING_IN_CPYTHON -static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { - while (a) { - a = a->tp_base; - if (a == b) - return 1; - } - return b == &PyBaseObject_Type; -} -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { - PyObject *mro; - if (a == b) return 1; - mro = a->tp_mro; - if (likely(mro)) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(mro); - for (i = 0; i < n; i++) { - if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) - return 1; - } - return 0; - } - return __Pyx_InBases(a, b); -} -#if PY_MAJOR_VERSION == 2 -static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { - PyObject *exception, *value, *tb; - int res; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ErrFetch(&exception, &value, &tb); - res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - if (!res) { - res = PyObject_IsSubclass(err, exc_type2); - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - } - __Pyx_ErrRestore(exception, value, tb); - return res; -} -#else -static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { - int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; - if (!res) { - res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); - } - return res; -} -#endif -static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { - Py_ssize_t i, n; - assert(PyExceptionClass_Check(exc_type)); - n = PyTuple_GET_SIZE(tuple); -#if PY_MAJOR_VERSION >= 3 - for (i=0; itp_name); - if (cached_type) { - if (!PyType_Check((PyObject*)cached_type)) { - PyErr_Format(PyExc_TypeError, - "Shared Cython type %.200s is not a type object", - type->tp_name); - goto bad; - } - if (cached_type->tp_basicsize != type->tp_basicsize) { - PyErr_Format(PyExc_TypeError, - "Shared Cython type %.200s has the wrong size, try recompiling", - type->tp_name); - goto bad; - } - } else { - if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; - PyErr_Clear(); - if (PyType_Ready(type) < 0) goto bad; - if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0) - goto bad; - Py_INCREF(type); - cached_type = type; - } -done: - Py_DECREF(fake_module); - return cached_type; -bad: - Py_XDECREF(cached_type); - cached_type = NULL; - goto done; -} - -/* PyObjectGetMethod */ -static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { - PyObject *attr; -#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP - PyTypeObject *tp = Py_TYPE(obj); - PyObject *descr; - descrgetfunc f = NULL; - PyObject **dictptr, *dict; - int meth_found = 0; - assert (*method == NULL); - if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { - attr = __Pyx_PyObject_GetAttrStr(obj, name); - goto try_unpack; - } - if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { - return 0; - } - descr = _PyType_Lookup(tp, name); - if (likely(descr != NULL)) { - Py_INCREF(descr); -#if PY_MAJOR_VERSION >= 3 - #ifdef __Pyx_CyFunction_USED - if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) - #else - if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type))) - #endif -#else - #ifdef __Pyx_CyFunction_USED - if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) - #else - if (likely(PyFunction_Check(descr))) - #endif -#endif - { - meth_found = 1; - } else { - f = Py_TYPE(descr)->tp_descr_get; - if (f != NULL && PyDescr_IsData(descr)) { - attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); - Py_DECREF(descr); - goto try_unpack; - } - } - } - dictptr = _PyObject_GetDictPtr(obj); - if (dictptr != NULL && (dict = *dictptr) != NULL) { - Py_INCREF(dict); - attr = __Pyx_PyDict_GetItemStr(dict, name); - if (attr != NULL) { - Py_INCREF(attr); - Py_DECREF(dict); - Py_XDECREF(descr); - goto try_unpack; - } - Py_DECREF(dict); - } - if (meth_found) { - *method = descr; - return 1; - } - if (f != NULL) { - attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); - Py_DECREF(descr); - goto try_unpack; - } - if (descr != NULL) { - *method = descr; - return 0; - } - PyErr_Format(PyExc_AttributeError, -#if PY_MAJOR_VERSION >= 3 - "'%.50s' object has no attribute '%U'", - tp->tp_name, name); -#else - "'%.50s' object has no attribute '%.400s'", - tp->tp_name, PyString_AS_STRING(name)); -#endif - return 0; -#else - attr = __Pyx_PyObject_GetAttrStr(obj, name); - goto try_unpack; -#endif -try_unpack: -#if CYTHON_UNPACK_METHODS - if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { - PyObject *function = PyMethod_GET_FUNCTION(attr); - Py_INCREF(function); - Py_DECREF(attr); - *method = function; - return 1; - } -#endif - *method = attr; - return 0; -} - -/* PyObjectCallMethod1 */ -static PyObject* __Pyx__PyObject_CallMethod1(PyObject* method, PyObject* arg) { - PyObject *result = __Pyx_PyObject_CallOneArg(method, arg); - Py_DECREF(method); - return result; -} -static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) { - PyObject *method = NULL, *result; - int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); - if (likely(is_method)) { - result = __Pyx_PyObject_Call2Args(method, obj, arg); - Py_DECREF(method); - return result; - } - if (unlikely(!method)) return NULL; - return __Pyx__PyObject_CallMethod1(method, arg); -} - -/* CoroutineBase */ -#include -#include -#define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom) -static int __Pyx_PyGen__FetchStopIterationValue(CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject **pvalue) { - PyObject *et, *ev, *tb; - PyObject *value = NULL; - __Pyx_ErrFetch(&et, &ev, &tb); - if (!et) { - Py_XDECREF(tb); - Py_XDECREF(ev); - Py_INCREF(Py_None); - *pvalue = Py_None; - return 0; - } - if (likely(et == PyExc_StopIteration)) { - if (!ev) { - Py_INCREF(Py_None); - value = Py_None; - } -#if PY_VERSION_HEX >= 0x030300A0 - else if (Py_TYPE(ev) == (PyTypeObject*)PyExc_StopIteration) { - value = ((PyStopIterationObject *)ev)->value; - Py_INCREF(value); - Py_DECREF(ev); - } -#endif - else if (unlikely(PyTuple_Check(ev))) { - if (PyTuple_GET_SIZE(ev) >= 1) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - value = PyTuple_GET_ITEM(ev, 0); - Py_INCREF(value); -#else - value = PySequence_ITEM(ev, 0); -#endif - } else { - Py_INCREF(Py_None); - value = Py_None; - } - Py_DECREF(ev); - } - else if (!__Pyx_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration)) { - value = ev; - } - if (likely(value)) { - Py_XDECREF(tb); - Py_DECREF(et); - *pvalue = value; - return 0; - } - } else if (!__Pyx_PyErr_GivenExceptionMatches(et, PyExc_StopIteration)) { - __Pyx_ErrRestore(et, ev, tb); - return -1; - } - PyErr_NormalizeException(&et, &ev, &tb); - if (unlikely(!PyObject_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration))) { - __Pyx_ErrRestore(et, ev, tb); - return -1; - } - Py_XDECREF(tb); - Py_DECREF(et); -#if PY_VERSION_HEX >= 0x030300A0 - value = ((PyStopIterationObject *)ev)->value; - Py_INCREF(value); - Py_DECREF(ev); -#else - { - PyObject* args = __Pyx_PyObject_GetAttrStr(ev, __pyx_n_s_args); - Py_DECREF(ev); - if (likely(args)) { - value = PySequence_GetItem(args, 0); - Py_DECREF(args); - } - if (unlikely(!value)) { - __Pyx_ErrRestore(NULL, NULL, NULL); - Py_INCREF(Py_None); - value = Py_None; - } - } -#endif - *pvalue = value; - return 0; -} -static CYTHON_INLINE -void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *exc_state) { - PyObject *t, *v, *tb; - t = exc_state->exc_type; - v = exc_state->exc_value; - tb = exc_state->exc_traceback; - exc_state->exc_type = NULL; - exc_state->exc_value = NULL; - exc_state->exc_traceback = NULL; - Py_XDECREF(t); - Py_XDECREF(v); - Py_XDECREF(tb); -} -#define __Pyx_Coroutine_AlreadyRunningError(gen) (__Pyx__Coroutine_AlreadyRunningError(gen), (PyObject*)NULL) -static void __Pyx__Coroutine_AlreadyRunningError(CYTHON_UNUSED __pyx_CoroutineObject *gen) { - const char *msg; - if ((0)) { - #ifdef __Pyx_Coroutine_USED - } else if (__Pyx_Coroutine_Check((PyObject*)gen)) { - msg = "coroutine already executing"; - #endif - #ifdef __Pyx_AsyncGen_USED - } else if (__Pyx_AsyncGen_CheckExact((PyObject*)gen)) { - msg = "async generator already executing"; - #endif - } else { - msg = "generator already executing"; - } - PyErr_SetString(PyExc_ValueError, msg); -} -#define __Pyx_Coroutine_NotStartedError(gen) (__Pyx__Coroutine_NotStartedError(gen), (PyObject*)NULL) -static void __Pyx__Coroutine_NotStartedError(CYTHON_UNUSED PyObject *gen) { - const char *msg; - if ((0)) { - #ifdef __Pyx_Coroutine_USED - } else if (__Pyx_Coroutine_Check(gen)) { - msg = "can't send non-None value to a just-started coroutine"; - #endif - #ifdef __Pyx_AsyncGen_USED - } else if (__Pyx_AsyncGen_CheckExact(gen)) { - msg = "can't send non-None value to a just-started async generator"; - #endif - } else { - msg = "can't send non-None value to a just-started generator"; - } - PyErr_SetString(PyExc_TypeError, msg); -} -#define __Pyx_Coroutine_AlreadyTerminatedError(gen, value, closing) (__Pyx__Coroutine_AlreadyTerminatedError(gen, value, closing), (PyObject*)NULL) -static void __Pyx__Coroutine_AlreadyTerminatedError(CYTHON_UNUSED PyObject *gen, PyObject *value, CYTHON_UNUSED int closing) { - #ifdef __Pyx_Coroutine_USED - if (!closing && __Pyx_Coroutine_Check(gen)) { - PyErr_SetString(PyExc_RuntimeError, "cannot reuse already awaited coroutine"); - } else - #endif - if (value) { - #ifdef __Pyx_AsyncGen_USED - if (__Pyx_AsyncGen_CheckExact(gen)) - PyErr_SetNone(__Pyx_PyExc_StopAsyncIteration); - else - #endif - PyErr_SetNone(PyExc_StopIteration); - } -} -static -PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value, int closing) { - __Pyx_PyThreadState_declare - PyThreadState *tstate; - __Pyx_ExcInfoStruct *exc_state; - PyObject *retval; - assert(!self->is_running); - if (unlikely(self->resume_label == 0)) { - if (unlikely(value && value != Py_None)) { - return __Pyx_Coroutine_NotStartedError((PyObject*)self); - } - } - if (unlikely(self->resume_label == -1)) { - return __Pyx_Coroutine_AlreadyTerminatedError((PyObject*)self, value, closing); - } -#if CYTHON_FAST_THREAD_STATE - __Pyx_PyThreadState_assign - tstate = __pyx_tstate; -#else - tstate = __Pyx_PyThreadState_Current; -#endif - exc_state = &self->gi_exc_state; - if (exc_state->exc_type) { - #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_PYSTON - #else - if (exc_state->exc_traceback) { - PyTracebackObject *tb = (PyTracebackObject *) exc_state->exc_traceback; - PyFrameObject *f = tb->tb_frame; - Py_XINCREF(tstate->frame); - assert(f->f_back == NULL); - f->f_back = tstate->frame; - } - #endif - } -#if CYTHON_USE_EXC_INFO_STACK - exc_state->previous_item = tstate->exc_info; - tstate->exc_info = exc_state; -#else - if (exc_state->exc_type) { - __Pyx_ExceptionSwap(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback); - } else { - __Pyx_Coroutine_ExceptionClear(exc_state); - __Pyx_ExceptionSave(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback); - } -#endif - self->is_running = 1; - retval = self->body((PyObject *) self, tstate, value); - self->is_running = 0; -#if CYTHON_USE_EXC_INFO_STACK - exc_state = &self->gi_exc_state; - tstate->exc_info = exc_state->previous_item; - exc_state->previous_item = NULL; - __Pyx_Coroutine_ResetFrameBackpointer(exc_state); -#endif - return retval; -} -static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state) { - PyObject *exc_tb = exc_state->exc_traceback; - if (likely(exc_tb)) { -#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_PYSTON -#else - PyTracebackObject *tb = (PyTracebackObject *) exc_tb; - PyFrameObject *f = tb->tb_frame; - Py_CLEAR(f->f_back); -#endif - } -} -static CYTHON_INLINE -PyObject *__Pyx_Coroutine_MethodReturn(CYTHON_UNUSED PyObject* gen, PyObject *retval) { - if (unlikely(!retval)) { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - if (!__Pyx_PyErr_Occurred()) { - PyObject *exc = PyExc_StopIteration; - #ifdef __Pyx_AsyncGen_USED - if (__Pyx_AsyncGen_CheckExact(gen)) - exc = __Pyx_PyExc_StopAsyncIteration; - #endif - __Pyx_PyErr_SetNone(exc); - } - } - return retval; -} -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) -static CYTHON_INLINE -PyObject *__Pyx_PyGen_Send(PyGenObject *gen, PyObject *arg) { -#if PY_VERSION_HEX <= 0x030A00A1 - return _PyGen_Send(gen, arg); -#else - PyObject *result; - if (PyIter_Send((PyObject*)gen, arg ? arg : Py_None, &result) == PYGEN_RETURN) { - if (PyAsyncGen_CheckExact(gen)) { - assert(result == Py_None); - PyErr_SetNone(PyExc_StopAsyncIteration); - } - else if (result == Py_None) { - PyErr_SetNone(PyExc_StopIteration); - } - else { - _PyGen_SetStopIterationValue(result); - } - Py_CLEAR(result); - } - return result; -#endif -} -#endif -static CYTHON_INLINE -PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) { - PyObject *ret; - PyObject *val = NULL; - __Pyx_Coroutine_Undelegate(gen); - __Pyx_PyGen__FetchStopIterationValue(__Pyx_PyThreadState_Current, &val); - ret = __Pyx_Coroutine_SendEx(gen, val, 0); - Py_XDECREF(val); - return ret; -} -static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) { - PyObject *retval; - __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self; - PyObject *yf = gen->yieldfrom; - if (unlikely(gen->is_running)) - return __Pyx_Coroutine_AlreadyRunningError(gen); - if (yf) { - PyObject *ret; - gen->is_running = 1; - #ifdef __Pyx_Generator_USED - if (__Pyx_Generator_CheckExact(yf)) { - ret = __Pyx_Coroutine_Send(yf, value); - } else - #endif - #ifdef __Pyx_Coroutine_USED - if (__Pyx_Coroutine_Check(yf)) { - ret = __Pyx_Coroutine_Send(yf, value); - } else - #endif - #ifdef __Pyx_AsyncGen_USED - if (__pyx_PyAsyncGenASend_CheckExact(yf)) { - ret = __Pyx_async_gen_asend_send(yf, value); - } else - #endif - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) - if (PyGen_CheckExact(yf)) { - ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); - } else - #endif - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03050000 && defined(PyCoro_CheckExact) && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) - if (PyCoro_CheckExact(yf)) { - ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); - } else - #endif - { - if (value == Py_None) - ret = Py_TYPE(yf)->tp_iternext(yf); - else - ret = __Pyx_PyObject_CallMethod1(yf, __pyx_n_s_send, value); - } - gen->is_running = 0; - if (likely(ret)) { - return ret; - } - retval = __Pyx_Coroutine_FinishDelegation(gen); - } else { - retval = __Pyx_Coroutine_SendEx(gen, value, 0); - } - return __Pyx_Coroutine_MethodReturn(self, retval); -} -static int __Pyx_Coroutine_CloseIter(__pyx_CoroutineObject *gen, PyObject *yf) { - PyObject *retval = NULL; - int err = 0; - #ifdef __Pyx_Generator_USED - if (__Pyx_Generator_CheckExact(yf)) { - retval = __Pyx_Coroutine_Close(yf); - if (!retval) - return -1; - } else - #endif - #ifdef __Pyx_Coroutine_USED - if (__Pyx_Coroutine_Check(yf)) { - retval = __Pyx_Coroutine_Close(yf); - if (!retval) - return -1; - } else - if (__Pyx_CoroutineAwait_CheckExact(yf)) { - retval = __Pyx_CoroutineAwait_Close((__pyx_CoroutineAwaitObject*)yf, NULL); - if (!retval) - return -1; - } else - #endif - #ifdef __Pyx_AsyncGen_USED - if (__pyx_PyAsyncGenASend_CheckExact(yf)) { - retval = __Pyx_async_gen_asend_close(yf, NULL); - } else - if (__pyx_PyAsyncGenAThrow_CheckExact(yf)) { - retval = __Pyx_async_gen_athrow_close(yf, NULL); - } else - #endif - { - PyObject *meth; - gen->is_running = 1; - meth = __Pyx_PyObject_GetAttrStr(yf, __pyx_n_s_close); - if (unlikely(!meth)) { - if (!PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_WriteUnraisable(yf); - } - PyErr_Clear(); - } else { - retval = PyObject_CallFunction(meth, NULL); - Py_DECREF(meth); - if (!retval) - err = -1; - } - gen->is_running = 0; - } - Py_XDECREF(retval); - return err; -} -static PyObject *__Pyx_Generator_Next(PyObject *self) { - __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self; - PyObject *yf = gen->yieldfrom; - if (unlikely(gen->is_running)) - return __Pyx_Coroutine_AlreadyRunningError(gen); - if (yf) { - PyObject *ret; - gen->is_running = 1; - #ifdef __Pyx_Generator_USED - if (__Pyx_Generator_CheckExact(yf)) { - ret = __Pyx_Generator_Next(yf); - } else - #endif - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) - if (PyGen_CheckExact(yf)) { - ret = __Pyx_PyGen_Send((PyGenObject*)yf, NULL); - } else - #endif - #ifdef __Pyx_Coroutine_USED - if (__Pyx_Coroutine_Check(yf)) { - ret = __Pyx_Coroutine_Send(yf, Py_None); - } else - #endif - ret = Py_TYPE(yf)->tp_iternext(yf); - gen->is_running = 0; - if (likely(ret)) { - return ret; - } - return __Pyx_Coroutine_FinishDelegation(gen); - } - return __Pyx_Coroutine_SendEx(gen, Py_None, 0); -} -static PyObject *__Pyx_Coroutine_Close_Method(PyObject *self, CYTHON_UNUSED PyObject *arg) { - return __Pyx_Coroutine_Close(self); -} -static PyObject *__Pyx_Coroutine_Close(PyObject *self) { - __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; - PyObject *retval, *raised_exception; - PyObject *yf = gen->yieldfrom; - int err = 0; - if (unlikely(gen->is_running)) - return __Pyx_Coroutine_AlreadyRunningError(gen); - if (yf) { - Py_INCREF(yf); - err = __Pyx_Coroutine_CloseIter(gen, yf); - __Pyx_Coroutine_Undelegate(gen); - Py_DECREF(yf); - } - if (err == 0) - PyErr_SetNone(PyExc_GeneratorExit); - retval = __Pyx_Coroutine_SendEx(gen, NULL, 1); - if (unlikely(retval)) { - const char *msg; - Py_DECREF(retval); - if ((0)) { - #ifdef __Pyx_Coroutine_USED - } else if (__Pyx_Coroutine_Check(self)) { - msg = "coroutine ignored GeneratorExit"; - #endif - #ifdef __Pyx_AsyncGen_USED - } else if (__Pyx_AsyncGen_CheckExact(self)) { -#if PY_VERSION_HEX < 0x03060000 - msg = "async generator ignored GeneratorExit - might require Python 3.6+ finalisation (PEP 525)"; -#else - msg = "async generator ignored GeneratorExit"; -#endif - #endif - } else { - msg = "generator ignored GeneratorExit"; - } - PyErr_SetString(PyExc_RuntimeError, msg); - return NULL; - } - raised_exception = PyErr_Occurred(); - if (likely(!raised_exception || __Pyx_PyErr_GivenExceptionMatches2(raised_exception, PyExc_GeneratorExit, PyExc_StopIteration))) { - if (raised_exception) PyErr_Clear(); - Py_INCREF(Py_None); - return Py_None; - } - return NULL; -} -static PyObject *__Pyx__Coroutine_Throw(PyObject *self, PyObject *typ, PyObject *val, PyObject *tb, - PyObject *args, int close_on_genexit) { - __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; - PyObject *yf = gen->yieldfrom; - if (unlikely(gen->is_running)) - return __Pyx_Coroutine_AlreadyRunningError(gen); - if (yf) { - PyObject *ret; - Py_INCREF(yf); - if (__Pyx_PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit) && close_on_genexit) { - int err = __Pyx_Coroutine_CloseIter(gen, yf); - Py_DECREF(yf); - __Pyx_Coroutine_Undelegate(gen); - if (err < 0) - return __Pyx_Coroutine_MethodReturn(self, __Pyx_Coroutine_SendEx(gen, NULL, 0)); - goto throw_here; - } - gen->is_running = 1; - if (0 - #ifdef __Pyx_Generator_USED - || __Pyx_Generator_CheckExact(yf) - #endif - #ifdef __Pyx_Coroutine_USED - || __Pyx_Coroutine_Check(yf) - #endif - ) { - ret = __Pyx__Coroutine_Throw(yf, typ, val, tb, args, close_on_genexit); - #ifdef __Pyx_Coroutine_USED - } else if (__Pyx_CoroutineAwait_CheckExact(yf)) { - ret = __Pyx__Coroutine_Throw(((__pyx_CoroutineAwaitObject*)yf)->coroutine, typ, val, tb, args, close_on_genexit); - #endif - } else { - PyObject *meth = __Pyx_PyObject_GetAttrStr(yf, __pyx_n_s_throw); - if (unlikely(!meth)) { - Py_DECREF(yf); - if (!PyErr_ExceptionMatches(PyExc_AttributeError)) { - gen->is_running = 0; - return NULL; - } - PyErr_Clear(); - __Pyx_Coroutine_Undelegate(gen); - gen->is_running = 0; - goto throw_here; - } - if (likely(args)) { - ret = PyObject_CallObject(meth, args); - } else { - ret = PyObject_CallFunctionObjArgs(meth, typ, val, tb, NULL); - } - Py_DECREF(meth); - } - gen->is_running = 0; - Py_DECREF(yf); - if (!ret) { - ret = __Pyx_Coroutine_FinishDelegation(gen); - } - return __Pyx_Coroutine_MethodReturn(self, ret); - } -throw_here: - __Pyx_Raise(typ, val, tb, NULL); - return __Pyx_Coroutine_MethodReturn(self, __Pyx_Coroutine_SendEx(gen, NULL, 0)); -} -static PyObject *__Pyx_Coroutine_Throw(PyObject *self, PyObject *args) { - PyObject *typ; - PyObject *val = NULL; - PyObject *tb = NULL; - if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb)) - return NULL; - return __Pyx__Coroutine_Throw(self, typ, val, tb, args, 1); -} -static CYTHON_INLINE int __Pyx_Coroutine_traverse_excstate(__Pyx_ExcInfoStruct *exc_state, visitproc visit, void *arg) { - Py_VISIT(exc_state->exc_type); - Py_VISIT(exc_state->exc_value); - Py_VISIT(exc_state->exc_traceback); - return 0; -} -static int __Pyx_Coroutine_traverse(__pyx_CoroutineObject *gen, visitproc visit, void *arg) { - Py_VISIT(gen->closure); - Py_VISIT(gen->classobj); - Py_VISIT(gen->yieldfrom); - return __Pyx_Coroutine_traverse_excstate(&gen->gi_exc_state, visit, arg); -} -static int __Pyx_Coroutine_clear(PyObject *self) { - __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; - Py_CLEAR(gen->closure); - Py_CLEAR(gen->classobj); - Py_CLEAR(gen->yieldfrom); - __Pyx_Coroutine_ExceptionClear(&gen->gi_exc_state); -#ifdef __Pyx_AsyncGen_USED - if (__Pyx_AsyncGen_CheckExact(self)) { - Py_CLEAR(((__pyx_PyAsyncGenObject*)gen)->ag_finalizer); - } -#endif - Py_CLEAR(gen->gi_code); - Py_CLEAR(gen->gi_frame); - Py_CLEAR(gen->gi_name); - Py_CLEAR(gen->gi_qualname); - Py_CLEAR(gen->gi_modulename); - return 0; -} -static void __Pyx_Coroutine_dealloc(PyObject *self) { - __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; - PyObject_GC_UnTrack(gen); - if (gen->gi_weakreflist != NULL) - PyObject_ClearWeakRefs(self); - if (gen->resume_label >= 0) { - PyObject_GC_Track(self); -#if PY_VERSION_HEX >= 0x030400a1 && CYTHON_USE_TP_FINALIZE - if (PyObject_CallFinalizerFromDealloc(self)) -#else - Py_TYPE(gen)->tp_del(self); - if (Py_REFCNT(self) > 0) -#endif - { - return; - } - PyObject_GC_UnTrack(self); - } -#ifdef __Pyx_AsyncGen_USED - if (__Pyx_AsyncGen_CheckExact(self)) { - /* We have to handle this case for asynchronous generators - right here, because this code has to be between UNTRACK - and GC_Del. */ - Py_CLEAR(((__pyx_PyAsyncGenObject*)self)->ag_finalizer); - } -#endif - __Pyx_Coroutine_clear(self); - PyObject_GC_Del(gen); -} -static void __Pyx_Coroutine_del(PyObject *self) { - PyObject *error_type, *error_value, *error_traceback; - __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; - __Pyx_PyThreadState_declare - if (gen->resume_label < 0) { - return; - } -#if !CYTHON_USE_TP_FINALIZE - assert(self->ob_refcnt == 0); - __Pyx_SET_REFCNT(self, 1); -#endif - __Pyx_PyThreadState_assign - __Pyx_ErrFetch(&error_type, &error_value, &error_traceback); -#ifdef __Pyx_AsyncGen_USED - if (__Pyx_AsyncGen_CheckExact(self)) { - __pyx_PyAsyncGenObject *agen = (__pyx_PyAsyncGenObject*)self; - PyObject *finalizer = agen->ag_finalizer; - if (finalizer && !agen->ag_closed) { - PyObject *res = __Pyx_PyObject_CallOneArg(finalizer, self); - if (unlikely(!res)) { - PyErr_WriteUnraisable(self); - } else { - Py_DECREF(res); - } - __Pyx_ErrRestore(error_type, error_value, error_traceback); - return; - } - } -#endif - if (unlikely(gen->resume_label == 0 && !error_value)) { -#ifdef __Pyx_Coroutine_USED -#ifdef __Pyx_Generator_USED - if (!__Pyx_Generator_CheckExact(self)) -#endif - { - PyObject_GC_UnTrack(self); -#if PY_MAJOR_VERSION >= 3 || defined(PyErr_WarnFormat) - if (unlikely(PyErr_WarnFormat(PyExc_RuntimeWarning, 1, "coroutine '%.50S' was never awaited", gen->gi_qualname) < 0)) - PyErr_WriteUnraisable(self); -#else - {PyObject *msg; - char *cmsg; - #if CYTHON_COMPILING_IN_PYPY - msg = NULL; - cmsg = (char*) "coroutine was never awaited"; - #else - char *cname; - PyObject *qualname; - qualname = gen->gi_qualname; - cname = PyString_AS_STRING(qualname); - msg = PyString_FromFormat("coroutine '%.50s' was never awaited", cname); - if (unlikely(!msg)) { - PyErr_Clear(); - cmsg = (char*) "coroutine was never awaited"; - } else { - cmsg = PyString_AS_STRING(msg); - } - #endif - if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, cmsg, 1) < 0)) - PyErr_WriteUnraisable(self); - Py_XDECREF(msg);} -#endif - PyObject_GC_Track(self); - } -#endif - } else { - PyObject *res = __Pyx_Coroutine_Close(self); - if (unlikely(!res)) { - if (PyErr_Occurred()) - PyErr_WriteUnraisable(self); - } else { - Py_DECREF(res); - } - } - __Pyx_ErrRestore(error_type, error_value, error_traceback); -#if !CYTHON_USE_TP_FINALIZE - assert(Py_REFCNT(self) > 0); - if (--self->ob_refcnt == 0) { - return; - } - { - Py_ssize_t refcnt = Py_REFCNT(self); - _Py_NewReference(self); - __Pyx_SET_REFCNT(self, refcnt); - } -#if CYTHON_COMPILING_IN_CPYTHON - assert(PyType_IS_GC(Py_TYPE(self)) && - _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED); - _Py_DEC_REFTOTAL; -#endif -#ifdef COUNT_ALLOCS - --Py_TYPE(self)->tp_frees; - --Py_TYPE(self)->tp_allocs; -#endif -#endif -} -static PyObject * -__Pyx_Coroutine_get_name(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context) -{ - PyObject *name = self->gi_name; - if (unlikely(!name)) name = Py_None; - Py_INCREF(name); - return name; -} -static int -__Pyx_Coroutine_set_name(__pyx_CoroutineObject *self, PyObject *value, CYTHON_UNUSED void *context) -{ - PyObject *tmp; -#if PY_MAJOR_VERSION >= 3 - if (unlikely(value == NULL || !PyUnicode_Check(value))) -#else - if (unlikely(value == NULL || !PyString_Check(value))) -#endif - { - PyErr_SetString(PyExc_TypeError, - "__name__ must be set to a string object"); - return -1; - } - tmp = self->gi_name; - Py_INCREF(value); - self->gi_name = value; - Py_XDECREF(tmp); - return 0; -} -static PyObject * -__Pyx_Coroutine_get_qualname(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context) -{ - PyObject *name = self->gi_qualname; - if (unlikely(!name)) name = Py_None; - Py_INCREF(name); - return name; -} -static int -__Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value, CYTHON_UNUSED void *context) -{ - PyObject *tmp; -#if PY_MAJOR_VERSION >= 3 - if (unlikely(value == NULL || !PyUnicode_Check(value))) -#else - if (unlikely(value == NULL || !PyString_Check(value))) -#endif - { - PyErr_SetString(PyExc_TypeError, - "__qualname__ must be set to a string object"); - return -1; - } - tmp = self->gi_qualname; - Py_INCREF(value); - self->gi_qualname = value; - Py_XDECREF(tmp); - return 0; -} -static PyObject * -__Pyx_Coroutine_get_frame(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context) -{ - PyObject *frame = self->gi_frame; - if (!frame) { - if (unlikely(!self->gi_code)) { - Py_RETURN_NONE; - } - frame = (PyObject *) PyFrame_New( - PyThreadState_Get(), /*PyThreadState *tstate,*/ - (PyCodeObject*) self->gi_code, /*PyCodeObject *code,*/ - __pyx_d, /*PyObject *globals,*/ - 0 /*PyObject *locals*/ - ); - if (unlikely(!frame)) - return NULL; - self->gi_frame = frame; - } - Py_INCREF(frame); - return frame; -} -static __pyx_CoroutineObject *__Pyx__Coroutine_New( - PyTypeObject* type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, - PyObject *name, PyObject *qualname, PyObject *module_name) { - __pyx_CoroutineObject *gen = PyObject_GC_New(__pyx_CoroutineObject, type); - if (unlikely(!gen)) - return NULL; - return __Pyx__Coroutine_NewInit(gen, body, code, closure, name, qualname, module_name); -} -static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( - __pyx_CoroutineObject *gen, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, - PyObject *name, PyObject *qualname, PyObject *module_name) { - gen->body = body; - gen->closure = closure; - Py_XINCREF(closure); - gen->is_running = 0; - gen->resume_label = 0; - gen->classobj = NULL; - gen->yieldfrom = NULL; - gen->gi_exc_state.exc_type = NULL; - gen->gi_exc_state.exc_value = NULL; - gen->gi_exc_state.exc_traceback = NULL; -#if CYTHON_USE_EXC_INFO_STACK - gen->gi_exc_state.previous_item = NULL; -#endif - gen->gi_weakreflist = NULL; - Py_XINCREF(qualname); - gen->gi_qualname = qualname; - Py_XINCREF(name); - gen->gi_name = name; - Py_XINCREF(module_name); - gen->gi_modulename = module_name; - Py_XINCREF(code); - gen->gi_code = code; - gen->gi_frame = NULL; - PyObject_GC_Track(gen); - return gen; -} - -/* PatchModuleWithCoroutine */ -static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code) { -#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) - int result; - PyObject *globals, *result_obj; - globals = PyDict_New(); if (unlikely(!globals)) goto ignore; - result = PyDict_SetItemString(globals, "_cython_coroutine_type", - #ifdef __Pyx_Coroutine_USED - (PyObject*)__pyx_CoroutineType); - #else - Py_None); - #endif - if (unlikely(result < 0)) goto ignore; - result = PyDict_SetItemString(globals, "_cython_generator_type", - #ifdef __Pyx_Generator_USED - (PyObject*)__pyx_GeneratorType); - #else - Py_None); - #endif - if (unlikely(result < 0)) goto ignore; - if (unlikely(PyDict_SetItemString(globals, "_module", module) < 0)) goto ignore; - if (unlikely(PyDict_SetItemString(globals, "__builtins__", __pyx_b) < 0)) goto ignore; - result_obj = PyRun_String(py_code, Py_file_input, globals, globals); - if (unlikely(!result_obj)) goto ignore; - Py_DECREF(result_obj); - Py_DECREF(globals); - return module; -ignore: - Py_XDECREF(globals); - PyErr_WriteUnraisable(module); - if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, "Cython module failed to patch module with custom type", 1) < 0)) { - Py_DECREF(module); - module = NULL; - } -#else - py_code++; -#endif - return module; -} - -/* PatchGeneratorABC */ -#ifndef CYTHON_REGISTER_ABCS -#define CYTHON_REGISTER_ABCS 1 -#endif -#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) -static PyObject* __Pyx_patch_abc_module(PyObject *module); -static PyObject* __Pyx_patch_abc_module(PyObject *module) { - module = __Pyx_Coroutine_patch_module( - module, "" -"if _cython_generator_type is not None:\n" -" try: Generator = _module.Generator\n" -" except AttributeError: pass\n" -" else: Generator.register(_cython_generator_type)\n" -"if _cython_coroutine_type is not None:\n" -" try: Coroutine = _module.Coroutine\n" -" except AttributeError: pass\n" -" else: Coroutine.register(_cython_coroutine_type)\n" - ); - return module; -} -#endif -static int __Pyx_patch_abc(void) { -#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) - static int abc_patched = 0; - if (CYTHON_REGISTER_ABCS && !abc_patched) { - PyObject *module; - module = PyImport_ImportModule((PY_MAJOR_VERSION >= 3) ? "collections.abc" : "collections"); - if (!module) { - PyErr_WriteUnraisable(NULL); - if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, - ((PY_MAJOR_VERSION >= 3) ? - "Cython module failed to register with collections.abc module" : - "Cython module failed to register with collections module"), 1) < 0)) { - return -1; - } - } else { - module = __Pyx_patch_abc_module(module); - abc_patched = 1; - if (unlikely(!module)) - return -1; - Py_DECREF(module); - } - module = PyImport_ImportModule("backports_abc"); - if (module) { - module = __Pyx_patch_abc_module(module); - Py_XDECREF(module); - } - if (!module) { - PyErr_Clear(); - } - } -#else - if ((0)) __Pyx_Coroutine_patch_module(NULL, NULL); -#endif - return 0; -} - -/* Generator */ -static PyMethodDef __pyx_Generator_methods[] = { - {"send", (PyCFunction) __Pyx_Coroutine_Send, METH_O, - (char*) PyDoc_STR("send(arg) -> send 'arg' into generator,\nreturn next yielded value or raise StopIteration.")}, - {"throw", (PyCFunction) __Pyx_Coroutine_Throw, METH_VARARGS, - (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in generator,\nreturn next yielded value or raise StopIteration.")}, - {"close", (PyCFunction) __Pyx_Coroutine_Close_Method, METH_NOARGS, - (char*) PyDoc_STR("close() -> raise GeneratorExit inside generator.")}, - {0, 0, 0, 0} -}; -static PyMemberDef __pyx_Generator_memberlist[] = { - {(char *) "gi_running", T_BOOL, offsetof(__pyx_CoroutineObject, is_running), READONLY, NULL}, - {(char*) "gi_yieldfrom", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY, - (char*) PyDoc_STR("object being iterated by 'yield from', or None")}, - {(char*) "gi_code", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_code), READONLY, NULL}, - {0, 0, 0, 0, 0} -}; -static PyGetSetDef __pyx_Generator_getsets[] = { - {(char *) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name, - (char*) PyDoc_STR("name of the generator"), 0}, - {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname, - (char*) PyDoc_STR("qualified name of the generator"), 0}, - {(char *) "gi_frame", (getter)__Pyx_Coroutine_get_frame, NULL, - (char*) PyDoc_STR("Frame of the generator"), 0}, - {0, 0, 0, 0, 0} -}; -static PyTypeObject __pyx_GeneratorType_type = { - PyVarObject_HEAD_INIT(0, 0) - "generator", - sizeof(__pyx_CoroutineObject), - 0, - (destructor) __Pyx_Coroutine_dealloc, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, - 0, - (traverseproc) __Pyx_Coroutine_traverse, - 0, - 0, - offsetof(__pyx_CoroutineObject, gi_weakreflist), - 0, - (iternextfunc) __Pyx_Generator_Next, - __pyx_Generator_methods, - __pyx_Generator_memberlist, - __pyx_Generator_getsets, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, -#if CYTHON_USE_TP_FINALIZE - 0, -#else - __Pyx_Coroutine_del, -#endif - 0, -#if CYTHON_USE_TP_FINALIZE - __Pyx_Coroutine_del, -#elif PY_VERSION_HEX >= 0x030400a1 - 0, -#endif -#if PY_VERSION_HEX >= 0x030800b1 - 0, -#endif -#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 - 0, -#endif -}; -static int __pyx_Generator_init(void) { - __pyx_GeneratorType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; - __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter; - __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type); - if (unlikely(!__pyx_GeneratorType)) { - return -1; - } - return 0; -} - -/* CheckBinaryVersion */ -static int __Pyx_check_binary_version(void) { - char ctversion[4], rtversion[4]; - PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); - PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); - if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { - char message[200]; - PyOS_snprintf(message, sizeof(message), - "compiletime version %s of module '%.100s' " - "does not match runtime version %s", - ctversion, __Pyx_MODULE_NAME, rtversion); - return PyErr_WarnEx(NULL, message, 1); - } - return 0; -} - -/* InitStrings */ -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { - while (t->p) { - #if PY_MAJOR_VERSION < 3 - if (t->is_unicode) { - *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); - } else if (t->intern) { - *t->p = PyString_InternFromString(t->s); - } else { - *t->p = PyString_FromStringAndSize(t->s, t->n - 1); - } - #else - if (t->is_unicode | t->is_str) { - if (t->intern) { - *t->p = PyUnicode_InternFromString(t->s); - } else if (t->encoding) { - *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); - } else { - *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); - } - } else { - *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); - } - #endif - if (!*t->p) - return -1; - if (PyObject_Hash(*t->p) == -1) - return -1; - ++t; - } - return 0; -} - -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { - return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); -} -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { - Py_ssize_t ignore; - return __Pyx_PyObject_AsStringAndSize(o, &ignore); -} -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -#if !CYTHON_PEP393_ENABLED -static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - char* defenc_c; - PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); - if (!defenc) return NULL; - defenc_c = PyBytes_AS_STRING(defenc); -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - { - char* end = defenc_c + PyBytes_GET_SIZE(defenc); - char* c; - for (c = defenc_c; c < end; c++) { - if ((unsigned char) (*c) >= 128) { - PyUnicode_AsASCIIString(o); - return NULL; - } - } - } -#endif - *length = PyBytes_GET_SIZE(defenc); - return defenc_c; -} -#else -static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - if (likely(PyUnicode_IS_ASCII(o))) { - *length = PyUnicode_GET_LENGTH(o); - return PyUnicode_AsUTF8(o); - } else { - PyUnicode_AsASCIIString(o); - return NULL; - } -#else - return PyUnicode_AsUTF8AndSize(o, length); -#endif -} -#endif -#endif -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT - if ( -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - __Pyx_sys_getdefaultencoding_not_ascii && -#endif - PyUnicode_Check(o)) { - return __Pyx_PyUnicode_AsStringAndSize(o, length); - } else -#endif -#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) - if (PyByteArray_Check(o)) { - *length = PyByteArray_GET_SIZE(o); - return PyByteArray_AS_STRING(o); - } else -#endif - { - char* result; - int r = PyBytes_AsStringAndSize(o, &result, length); - if (unlikely(r < 0)) { - return NULL; - } else { - return result; - } - } -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { - int is_true = x == Py_True; - if (is_true | (x == Py_False) | (x == Py_None)) return is_true; - else return PyObject_IsTrue(x); -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { - int retval; - if (unlikely(!x)) return -1; - retval = __Pyx_PyObject_IsTrue(x); - Py_DECREF(x); - return retval; -} -static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { -#if PY_MAJOR_VERSION >= 3 - if (PyLong_Check(result)) { - if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, - "__int__ returned non-int (type %.200s). " - "The ability to return an instance of a strict subclass of int " - "is deprecated, and may be removed in a future version of Python.", - Py_TYPE(result)->tp_name)) { - Py_DECREF(result); - return NULL; - } - return result; - } -#endif - PyErr_Format(PyExc_TypeError, - "__%.4s__ returned non-%.4s (type %.200s)", - type_name, type_name, Py_TYPE(result)->tp_name); - Py_DECREF(result); - return NULL; -} -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { -#if CYTHON_USE_TYPE_SLOTS - PyNumberMethods *m; -#endif - const char *name = NULL; - PyObject *res = NULL; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x) || PyLong_Check(x))) -#else - if (likely(PyLong_Check(x))) -#endif - return __Pyx_NewRef(x); -#if CYTHON_USE_TYPE_SLOTS - m = Py_TYPE(x)->tp_as_number; - #if PY_MAJOR_VERSION < 3 - if (m && m->nb_int) { - name = "int"; - res = m->nb_int(x); - } - else if (m && m->nb_long) { - name = "long"; - res = m->nb_long(x); - } - #else - if (likely(m && m->nb_int)) { - name = "int"; - res = m->nb_int(x); - } - #endif -#else - if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { - res = PyNumber_Int(x); - } -#endif - if (likely(res)) { -#if PY_MAJOR_VERSION < 3 - if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { -#else - if (unlikely(!PyLong_CheckExact(res))) { -#endif - return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); - } - } - else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, - "an integer is required"); - } - return res; -} -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { - Py_ssize_t ival; - PyObject *x; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_CheckExact(b))) { - if (sizeof(Py_ssize_t) >= sizeof(long)) - return PyInt_AS_LONG(b); - else - return PyInt_AsSsize_t(b); - } -#endif - if (likely(PyLong_CheckExact(b))) { - #if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)b)->ob_digit; - const Py_ssize_t size = Py_SIZE(b); - if (likely(__Pyx_sst_abs(size) <= 1)) { - ival = likely(size) ? digits[0] : 0; - if (size == -1) ival = -ival; - return ival; - } else { - switch (size) { - case 2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - } - } - #endif - return PyLong_AsSsize_t(b); - } - x = PyNumber_Index(b); - if (!x) return -1; - ival = PyInt_AsSsize_t(x); - Py_DECREF(x); - return ival; -} -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { - return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); -} -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { - return PyInt_FromSize_t(ival); -} - - -#endif /* Py_PYTHON_H */ diff --git a/.venv/Lib/site-packages/aiohttp/_http_parser.cp38-win_amd64.pyd b/.venv/Lib/site-packages/aiohttp/_http_parser.cp38-win_amd64.pyd deleted file mode 100644 index 4224f72b51ca8854a35e9b665bfafacc3dd61215..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245248 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 F{Vzf>*L45@ diff --git a/.venv/Lib/site-packages/aiohttp/_http_parser.pyx b/.venv/Lib/site-packages/aiohttp/_http_parser.pyx deleted file mode 100644 index b76d723..0000000 --- a/.venv/Lib/site-packages/aiohttp/_http_parser.pyx +++ /dev/null @@ -1,818 +0,0 @@ -#cython: language_level=3 -# -# Based on https://github.com/MagicStack/httptools -# -from __future__ import absolute_import, print_function - -from cpython cimport ( - Py_buffer, - PyBUF_SIMPLE, - PyBuffer_Release, - PyBytes_AsString, - PyBytes_AsStringAndSize, - PyObject_GetBuffer, -) -from cpython.mem cimport PyMem_Free, PyMem_Malloc -from libc.limits cimport ULLONG_MAX -from libc.string cimport memcpy - -from multidict import CIMultiDict as _CIMultiDict, CIMultiDictProxy as _CIMultiDictProxy -from yarl import URL as _URL - -from aiohttp import hdrs - -from .http_exceptions import ( - BadHttpMessage, - BadStatusLine, - ContentLengthError, - InvalidHeader, - InvalidURLError, - LineTooLong, - PayloadEncodingError, - TransferEncodingError, -) -from .http_parser import DeflateBuffer as _DeflateBuffer -from .http_writer import ( - HttpVersion as _HttpVersion, - HttpVersion10 as _HttpVersion10, - HttpVersion11 as _HttpVersion11, -) -from .streams import EMPTY_PAYLOAD as _EMPTY_PAYLOAD, StreamReader as _StreamReader - -cimport cython - -from aiohttp cimport _cparser as cparser - -include "_headers.pxi" - -from aiohttp cimport _find_header - -DEF DEFAULT_FREELIST_SIZE = 250 - -cdef extern from "Python.h": - int PyByteArray_Resize(object, Py_ssize_t) except -1 - Py_ssize_t PyByteArray_Size(object) except -1 - char* PyByteArray_AsString(object) - -__all__ = ('HttpRequestParser', 'HttpResponseParser', - 'RawRequestMessage', 'RawResponseMessage') - -cdef object URL = _URL -cdef object URL_build = URL.build -cdef object CIMultiDict = _CIMultiDict -cdef object CIMultiDictProxy = _CIMultiDictProxy -cdef object HttpVersion = _HttpVersion -cdef object HttpVersion10 = _HttpVersion10 -cdef object HttpVersion11 = _HttpVersion11 -cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 -cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING -cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD -cdef object StreamReader = _StreamReader -cdef object DeflateBuffer = _DeflateBuffer - - -cdef inline object extend(object buf, const char* at, size_t length): - cdef Py_ssize_t s - cdef char* ptr - s = PyByteArray_Size(buf) - PyByteArray_Resize(buf, s + length) - ptr = PyByteArray_AsString(buf) - memcpy(ptr + s, at, length) - - -DEF METHODS_COUNT = 46; - -cdef list _http_method = [] - -for i in range(METHODS_COUNT): - _http_method.append( - cparser.llhttp_method_name( i).decode('ascii')) - - -cdef inline str http_method_str(int i): - if i < METHODS_COUNT: - return _http_method[i] - else: - return "" - -cdef inline object find_header(bytes raw_header): - cdef Py_ssize_t size - cdef char *buf - cdef int idx - PyBytes_AsStringAndSize(raw_header, &buf, &size) - idx = _find_header.find_header(buf, size) - if idx == -1: - return raw_header.decode('utf-8', 'surrogateescape') - return headers[idx] - - -@cython.freelist(DEFAULT_FREELIST_SIZE) -cdef class RawRequestMessage: - cdef readonly str method - cdef readonly str path - cdef readonly object version # HttpVersion - cdef readonly object headers # CIMultiDict - cdef readonly object raw_headers # tuple - cdef readonly object should_close - cdef readonly object compression - cdef readonly object upgrade - cdef readonly object chunked - cdef readonly object url # yarl.URL - - def __init__(self, method, path, version, headers, raw_headers, - should_close, compression, upgrade, chunked, url): - self.method = method - self.path = path - self.version = version - self.headers = headers - self.raw_headers = raw_headers - self.should_close = should_close - self.compression = compression - self.upgrade = upgrade - self.chunked = chunked - self.url = url - - def __repr__(self): - info = [] - info.append(("method", self.method)) - info.append(("path", self.path)) - info.append(("version", self.version)) - info.append(("headers", self.headers)) - info.append(("raw_headers", self.raw_headers)) - info.append(("should_close", self.should_close)) - info.append(("compression", self.compression)) - info.append(("upgrade", self.upgrade)) - info.append(("chunked", self.chunked)) - info.append(("url", self.url)) - sinfo = ', '.join(name + '=' + repr(val) for name, val in info) - return '' - - def _replace(self, **dct): - cdef RawRequestMessage ret - ret = _new_request_message(self.method, - self.path, - self.version, - self.headers, - self.raw_headers, - self.should_close, - self.compression, - self.upgrade, - self.chunked, - self.url) - if "method" in dct: - ret.method = dct["method"] - if "path" in dct: - ret.path = dct["path"] - if "version" in dct: - ret.version = dct["version"] - if "headers" in dct: - ret.headers = dct["headers"] - if "raw_headers" in dct: - ret.raw_headers = dct["raw_headers"] - if "should_close" in dct: - ret.should_close = dct["should_close"] - if "compression" in dct: - ret.compression = dct["compression"] - if "upgrade" in dct: - ret.upgrade = dct["upgrade"] - if "chunked" in dct: - ret.chunked = dct["chunked"] - if "url" in dct: - ret.url = dct["url"] - return ret - -cdef _new_request_message(str method, - str path, - object version, - object headers, - object raw_headers, - bint should_close, - object compression, - bint upgrade, - bint chunked, - object url): - cdef RawRequestMessage ret - ret = RawRequestMessage.__new__(RawRequestMessage) - ret.method = method - ret.path = path - ret.version = version - ret.headers = headers - ret.raw_headers = raw_headers - ret.should_close = should_close - ret.compression = compression - ret.upgrade = upgrade - ret.chunked = chunked - ret.url = url - return ret - - -@cython.freelist(DEFAULT_FREELIST_SIZE) -cdef class RawResponseMessage: - cdef readonly object version # HttpVersion - cdef readonly int code - cdef readonly str reason - cdef readonly object headers # CIMultiDict - cdef readonly object raw_headers # tuple - cdef readonly object should_close - cdef readonly object compression - cdef readonly object upgrade - cdef readonly object chunked - - def __init__(self, version, code, reason, headers, raw_headers, - should_close, compression, upgrade, chunked): - self.version = version - self.code = code - self.reason = reason - self.headers = headers - self.raw_headers = raw_headers - self.should_close = should_close - self.compression = compression - self.upgrade = upgrade - self.chunked = chunked - - def __repr__(self): - info = [] - info.append(("version", self.version)) - info.append(("code", self.code)) - info.append(("reason", self.reason)) - info.append(("headers", self.headers)) - info.append(("raw_headers", self.raw_headers)) - info.append(("should_close", self.should_close)) - info.append(("compression", self.compression)) - info.append(("upgrade", self.upgrade)) - info.append(("chunked", self.chunked)) - sinfo = ', '.join(name + '=' + repr(val) for name, val in info) - return '' - - -cdef _new_response_message(object version, - int code, - str reason, - object headers, - object raw_headers, - bint should_close, - object compression, - bint upgrade, - bint chunked): - cdef RawResponseMessage ret - ret = RawResponseMessage.__new__(RawResponseMessage) - ret.version = version - ret.code = code - ret.reason = reason - ret.headers = headers - ret.raw_headers = raw_headers - ret.should_close = should_close - ret.compression = compression - ret.upgrade = upgrade - ret.chunked = chunked - return ret - - -@cython.internal -cdef class HttpParser: - - cdef: - cparser.llhttp_t* _cparser - cparser.llhttp_settings_t* _csettings - - bytearray _raw_name - bytearray _raw_value - bint _has_value - - object _protocol - object _loop - object _timer - - size_t _max_line_size - size_t _max_field_size - size_t _max_headers - bint _response_with_body - bint _read_until_eof - - bint _started - object _url - bytearray _buf - str _path - str _reason - object _headers - list _raw_headers - bint _upgraded - list _messages - object _payload - bint _payload_error - object _payload_exception - object _last_error - bint _auto_decompress - int _limit - - str _content_encoding - - Py_buffer py_buf - - def __cinit__(self): - self._cparser = \ - PyMem_Malloc(sizeof(cparser.llhttp_t)) - if self._cparser is NULL: - raise MemoryError() - - self._csettings = \ - PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) - if self._csettings is NULL: - raise MemoryError() - - def __dealloc__(self): - PyMem_Free(self._cparser) - PyMem_Free(self._csettings) - - cdef _init( - self, cparser.llhttp_type mode, - object protocol, object loop, int limit, - object timer=None, - size_t max_line_size=8190, size_t max_headers=32768, - size_t max_field_size=8190, payload_exception=None, - bint response_with_body=True, bint read_until_eof=False, - bint auto_decompress=True, - ): - cparser.llhttp_settings_init(self._csettings) - cparser.llhttp_init(self._cparser, mode, self._csettings) - self._cparser.data = self - self._cparser.content_length = 0 - - self._protocol = protocol - self._loop = loop - self._timer = timer - - self._buf = bytearray() - self._payload = None - self._payload_error = 0 - self._payload_exception = payload_exception - self._messages = [] - - self._raw_name = bytearray() - self._raw_value = bytearray() - self._has_value = False - - self._max_line_size = max_line_size - self._max_headers = max_headers - self._max_field_size = max_field_size - self._response_with_body = response_with_body - self._read_until_eof = read_until_eof - self._upgraded = False - self._auto_decompress = auto_decompress - self._content_encoding = None - - self._csettings.on_url = cb_on_url - self._csettings.on_status = cb_on_status - self._csettings.on_header_field = cb_on_header_field - self._csettings.on_header_value = cb_on_header_value - self._csettings.on_headers_complete = cb_on_headers_complete - self._csettings.on_body = cb_on_body - self._csettings.on_message_begin = cb_on_message_begin - self._csettings.on_message_complete = cb_on_message_complete - self._csettings.on_chunk_header = cb_on_chunk_header - self._csettings.on_chunk_complete = cb_on_chunk_complete - - self._last_error = None - self._limit = limit - - cdef _process_header(self): - if self._raw_name: - raw_name = bytes(self._raw_name) - raw_value = bytes(self._raw_value) - - name = find_header(raw_name) - value = raw_value.decode('utf-8', 'surrogateescape') - - self._headers.add(name, value) - - if name is CONTENT_ENCODING: - self._content_encoding = value - - PyByteArray_Resize(self._raw_name, 0) - PyByteArray_Resize(self._raw_value, 0) - self._has_value = False - self._raw_headers.append((raw_name, raw_value)) - - cdef _on_header_field(self, char* at, size_t length): - cdef Py_ssize_t size - cdef char *buf - if self._has_value: - self._process_header() - - size = PyByteArray_Size(self._raw_name) - PyByteArray_Resize(self._raw_name, size + length) - buf = PyByteArray_AsString(self._raw_name) - memcpy(buf + size, at, length) - - cdef _on_header_value(self, char* at, size_t length): - cdef Py_ssize_t size - cdef char *buf - - size = PyByteArray_Size(self._raw_value) - PyByteArray_Resize(self._raw_value, size + length) - buf = PyByteArray_AsString(self._raw_value) - memcpy(buf + size, at, length) - self._has_value = True - - cdef _on_headers_complete(self): - self._process_header() - - method = http_method_str(self._cparser.method) - should_close = not cparser.llhttp_should_keep_alive(self._cparser) - upgrade = self._cparser.upgrade - chunked = self._cparser.flags & cparser.F_CHUNKED - - raw_headers = tuple(self._raw_headers) - headers = CIMultiDictProxy(self._headers) - - if upgrade or self._cparser.method == 5: # cparser.CONNECT: - self._upgraded = True - - # do not support old websocket spec - if SEC_WEBSOCKET_KEY1 in headers: - raise InvalidHeader(SEC_WEBSOCKET_KEY1) - - encoding = None - enc = self._content_encoding - if enc is not None: - self._content_encoding = None - enc = enc.lower() - if enc in ('gzip', 'deflate', 'br'): - encoding = enc - - if self._cparser.type == cparser.HTTP_REQUEST: - msg = _new_request_message( - method, self._path, - self.http_version(), headers, raw_headers, - should_close, encoding, upgrade, chunked, self._url) - else: - msg = _new_response_message( - self.http_version(), self._cparser.status_code, self._reason, - headers, raw_headers, should_close, encoding, - upgrade, chunked) - - if ( - ULLONG_MAX > self._cparser.content_length > 0 or chunked or - self._cparser.method == 5 or # CONNECT: 5 - (self._cparser.status_code >= 199 and - self._cparser.content_length == 0 and - self._read_until_eof) - ): - payload = StreamReader( - self._protocol, timer=self._timer, loop=self._loop, - limit=self._limit) - else: - payload = EMPTY_PAYLOAD - - self._payload = payload - if encoding is not None and self._auto_decompress: - self._payload = DeflateBuffer(payload, encoding) - - if not self._response_with_body: - payload = EMPTY_PAYLOAD - - self._messages.append((msg, payload)) - - cdef _on_message_complete(self): - self._payload.feed_eof() - self._payload = None - - cdef _on_chunk_header(self): - self._payload.begin_http_chunk_receiving() - - cdef _on_chunk_complete(self): - self._payload.end_http_chunk_receiving() - - cdef object _on_status_complete(self): - pass - - cdef inline http_version(self): - cdef cparser.llhttp_t* parser = self._cparser - - if parser.http_major == 1: - if parser.http_minor == 0: - return HttpVersion10 - elif parser.http_minor == 1: - return HttpVersion11 - - return HttpVersion(parser.http_major, parser.http_minor) - - ### Public API ### - - def feed_eof(self): - cdef bytes desc - - if self._payload is not None: - if self._cparser.flags & cparser.F_CHUNKED: - raise TransferEncodingError( - "Not enough data for satisfy transfer length header.") - elif self._cparser.flags & cparser.F_CONTENT_LENGTH: - raise ContentLengthError( - "Not enough data for satisfy content length header.") - elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: - desc = cparser.llhttp_get_error_reason(self._cparser) - raise PayloadEncodingError(desc.decode('latin-1')) - else: - self._payload.feed_eof() - elif self._started: - self._on_headers_complete() - if self._messages: - return self._messages[-1][0] - - def feed_data(self, data): - cdef: - size_t data_len - size_t nb - cdef cparser.llhttp_errno_t errno - - PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE) - data_len = self.py_buf.len - - errno = cparser.llhttp_execute( - self._cparser, - self.py_buf.buf, - data_len) - - if errno is cparser.HPE_PAUSED_UPGRADE: - cparser.llhttp_resume_after_upgrade(self._cparser) - - nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf - - PyBuffer_Release(&self.py_buf) - - if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): - if self._payload_error == 0: - if self._last_error is not None: - ex = self._last_error - self._last_error = None - else: - ex = parser_error_from_errno(self._cparser) - self._payload = None - raise ex - - if self._messages: - messages = self._messages - self._messages = [] - else: - messages = () - - if self._upgraded: - return messages, True, data[nb:] - else: - return messages, False, b'' - - def set_upgraded(self, val): - self._upgraded = val - - -cdef class HttpRequestParser(HttpParser): - - def __init__( - self, protocol, loop, int limit, timer=None, - size_t max_line_size=8190, size_t max_headers=32768, - size_t max_field_size=8190, payload_exception=None, - bint response_with_body=True, bint read_until_eof=False, - bint auto_decompress=True, - ): - self._init(cparser.HTTP_REQUEST, protocol, loop, limit, timer, - max_line_size, max_headers, max_field_size, - payload_exception, response_with_body, read_until_eof, - auto_decompress) - - cdef object _on_status_complete(self): - cdef int idx1, idx2 - if not self._buf: - return - self._path = self._buf.decode('utf-8', 'surrogateescape') - try: - idx3 = len(self._path) - idx1 = self._path.find("?") - if idx1 == -1: - query = "" - idx2 = self._path.find("#") - if idx2 == -1: - path = self._path - fragment = "" - else: - path = self._path[0: idx2] - fragment = self._path[idx2+1:] - - else: - path = self._path[0:idx1] - idx1 += 1 - idx2 = self._path.find("#", idx1+1) - if idx2 == -1: - query = self._path[idx1:] - fragment = "" - else: - query = self._path[idx1: idx2] - fragment = self._path[idx2+1:] - - self._url = URL.build( - path=path, - query_string=query, - fragment=fragment, - encoded=True, - ) - finally: - PyByteArray_Resize(self._buf, 0) - - -cdef class HttpResponseParser(HttpParser): - - def __init__( - self, protocol, loop, int limit, timer=None, - size_t max_line_size=8190, size_t max_headers=32768, - size_t max_field_size=8190, payload_exception=None, - bint response_with_body=True, bint read_until_eof=False, - bint auto_decompress=True - ): - self._init(cparser.HTTP_RESPONSE, protocol, loop, limit, timer, - max_line_size, max_headers, max_field_size, - payload_exception, response_with_body, read_until_eof, - auto_decompress) - - cdef object _on_status_complete(self): - if self._buf: - self._reason = self._buf.decode('utf-8', 'surrogateescape') - PyByteArray_Resize(self._buf, 0) - else: - self._reason = self._reason or '' - -cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: - cdef HttpParser pyparser = parser.data - - pyparser._started = True - pyparser._headers = CIMultiDict() - pyparser._raw_headers = [] - PyByteArray_Resize(pyparser._buf, 0) - pyparser._path = None - pyparser._reason = None - return 0 - - -cdef int cb_on_url(cparser.llhttp_t* parser, - const char *at, size_t length) except -1: - cdef HttpParser pyparser = parser.data - try: - if length > pyparser._max_line_size: - raise LineTooLong( - 'Status line is too long', pyparser._max_line_size, length) - extend(pyparser._buf, at, length) - except BaseException as ex: - pyparser._last_error = ex - return -1 - else: - return 0 - - -cdef int cb_on_status(cparser.llhttp_t* parser, - const char *at, size_t length) except -1: - cdef HttpParser pyparser = parser.data - cdef str reason - try: - if length > pyparser._max_line_size: - raise LineTooLong( - 'Status line is too long', pyparser._max_line_size, length) - extend(pyparser._buf, at, length) - except BaseException as ex: - pyparser._last_error = ex - return -1 - else: - return 0 - - -cdef int cb_on_header_field(cparser.llhttp_t* parser, - const char *at, size_t length) except -1: - cdef HttpParser pyparser = parser.data - cdef Py_ssize_t size - try: - pyparser._on_status_complete() - size = len(pyparser._raw_name) + length - if size > pyparser._max_field_size: - raise LineTooLong( - 'Header name is too long', pyparser._max_field_size, size) - pyparser._on_header_field(at, length) - except BaseException as ex: - pyparser._last_error = ex - return -1 - else: - return 0 - - -cdef int cb_on_header_value(cparser.llhttp_t* parser, - const char *at, size_t length) except -1: - cdef HttpParser pyparser = parser.data - cdef Py_ssize_t size - try: - size = len(pyparser._raw_value) + length - if size > pyparser._max_field_size: - raise LineTooLong( - 'Header value is too long', pyparser._max_field_size, size) - pyparser._on_header_value(at, length) - except BaseException as ex: - pyparser._last_error = ex - return -1 - else: - return 0 - - -cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: - cdef HttpParser pyparser = parser.data - try: - pyparser._on_status_complete() - pyparser._on_headers_complete() - except BaseException as exc: - pyparser._last_error = exc - return -1 - else: - if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT - return 2 - else: - return 0 - - -cdef int cb_on_body(cparser.llhttp_t* parser, - const char *at, size_t length) except -1: - cdef HttpParser pyparser = parser.data - cdef bytes body = at[:length] - try: - pyparser._payload.feed_data(body, length) - except BaseException as exc: - if pyparser._payload_exception is not None: - pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) - else: - pyparser._payload.set_exception(exc) - pyparser._payload_error = 1 - return -1 - else: - return 0 - - -cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: - cdef HttpParser pyparser = parser.data - try: - pyparser._started = False - pyparser._on_message_complete() - except BaseException as exc: - pyparser._last_error = exc - return -1 - else: - return 0 - - -cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: - cdef HttpParser pyparser = parser.data - try: - pyparser._on_chunk_header() - except BaseException as exc: - pyparser._last_error = exc - return -1 - else: - return 0 - - -cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: - cdef HttpParser pyparser = parser.data - try: - pyparser._on_chunk_complete() - except BaseException as exc: - pyparser._last_error = exc - return -1 - else: - return 0 - - -cdef parser_error_from_errno(cparser.llhttp_t* parser): - cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) - cdef bytes desc = cparser.llhttp_get_error_reason(parser) - - if errno in (cparser.HPE_CB_MESSAGE_BEGIN, - cparser.HPE_CB_HEADERS_COMPLETE, - cparser.HPE_CB_MESSAGE_COMPLETE, - cparser.HPE_CB_CHUNK_HEADER, - cparser.HPE_CB_CHUNK_COMPLETE, - cparser.HPE_INVALID_CONSTANT, - cparser.HPE_INVALID_HEADER_TOKEN, - cparser.HPE_INVALID_CONTENT_LENGTH, - cparser.HPE_INVALID_CHUNK_SIZE, - cparser.HPE_INVALID_EOF_STATE, - cparser.HPE_INVALID_TRANSFER_ENCODING): - cls = BadHttpMessage - - elif errno == cparser.HPE_INVALID_STATUS: - cls = BadStatusLine - - elif errno == cparser.HPE_INVALID_METHOD: - cls = BadStatusLine - - elif errno == cparser.HPE_INVALID_VERSION: - cls = BadStatusLine - - elif errno == cparser.HPE_INVALID_URL: - cls = InvalidURLError - - else: - cls = BadHttpMessage - - return cls(desc.decode('latin-1')) diff --git a/.venv/Lib/site-packages/aiohttp/_http_writer.c b/.venv/Lib/site-packages/aiohttp/_http_writer.c deleted file mode 100644 index 07fd03e..0000000 --- a/.venv/Lib/site-packages/aiohttp/_http_writer.c +++ /dev/null @@ -1,6047 +0,0 @@ -/* Generated by Cython 0.29.24 */ - -#ifndef PY_SSIZE_T_CLEAN -#define PY_SSIZE_T_CLEAN -#endif /* PY_SSIZE_T_CLEAN */ -#include "Python.h" -#ifndef Py_PYTHON_H - #error Python headers needed to compile C extensions, please install development version of Python. -#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) - #error Cython requires Python 2.6+ or Python 3.3+. -#else -#define CYTHON_ABI "0_29_24" -#define CYTHON_HEX_VERSION 0x001D18F0 -#define CYTHON_FUTURE_DIVISION 1 -#include -#ifndef offsetof - #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) -#endif -#if !defined(WIN32) && !defined(MS_WINDOWS) - #ifndef __stdcall - #define __stdcall - #endif - #ifndef __cdecl - #define __cdecl - #endif - #ifndef __fastcall - #define __fastcall - #endif -#endif -#ifndef DL_IMPORT - #define DL_IMPORT(t) t -#endif -#ifndef DL_EXPORT - #define DL_EXPORT(t) t -#endif -#define __PYX_COMMA , -#ifndef HAVE_LONG_LONG - #if PY_VERSION_HEX >= 0x02070000 - #define HAVE_LONG_LONG - #endif -#endif -#ifndef PY_LONG_LONG - #define PY_LONG_LONG LONG_LONG -#endif -#ifndef Py_HUGE_VAL - #define Py_HUGE_VAL HUGE_VAL -#endif -#ifdef PYPY_VERSION - #define CYTHON_COMPILING_IN_PYPY 1 - #define CYTHON_COMPILING_IN_PYSTON 0 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #undef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 0 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #if PY_VERSION_HEX < 0x03050000 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #undef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #undef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 1 - #undef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 0 - #undef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 0 - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 -#elif defined(PYSTON_VERSION) - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_PYSTON 1 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 -#else - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_PYSTON 0 - #define CYTHON_COMPILING_IN_CPYTHON 1 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #if PY_VERSION_HEX < 0x02070000 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) - #define CYTHON_USE_PYTYPE_LOOKUP 1 - #endif - #if PY_MAJOR_VERSION < 3 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #if PY_VERSION_HEX < 0x02070000 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #elif !defined(CYTHON_USE_PYLONG_INTERNALS) - #define CYTHON_USE_PYLONG_INTERNALS 1 - #endif - #ifndef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 1 - #endif - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #if PY_VERSION_HEX < 0x030300F0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #elif !defined(CYTHON_USE_UNICODE_WRITER) - #define CYTHON_USE_UNICODE_WRITER 1 - #endif - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #ifndef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 1 - #endif - #ifndef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 1 - #endif - #ifndef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) - #endif - #ifndef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) - #endif - #ifndef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) - #endif - #ifndef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) - #endif -#endif -#if !defined(CYTHON_FAST_PYCCALL) -#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) -#endif -#if CYTHON_USE_PYLONG_INTERNALS - #include "longintrepr.h" - #undef SHIFT - #undef BASE - #undef MASK - #ifdef SIZEOF_VOID_P - enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; - #endif -#endif -#ifndef __has_attribute - #define __has_attribute(x) 0 -#endif -#ifndef __has_cpp_attribute - #define __has_cpp_attribute(x) 0 -#endif -#ifndef CYTHON_RESTRICT - #if defined(__GNUC__) - #define CYTHON_RESTRICT __restrict__ - #elif defined(_MSC_VER) && _MSC_VER >= 1400 - #define CYTHON_RESTRICT __restrict - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_RESTRICT restrict - #else - #define CYTHON_RESTRICT - #endif -#endif -#ifndef CYTHON_UNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -#endif -#ifndef CYTHON_MAYBE_UNUSED_VAR -# if defined(__cplusplus) - template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } -# else -# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) -# endif -#endif -#ifndef CYTHON_NCP_UNUSED -# if CYTHON_COMPILING_IN_CPYTHON -# define CYTHON_NCP_UNUSED -# else -# define CYTHON_NCP_UNUSED CYTHON_UNUSED -# endif -#endif -#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) -#ifdef _MSC_VER - #ifndef _MSC_STDINT_H_ - #if _MSC_VER < 1300 - typedef unsigned char uint8_t; - typedef unsigned int uint32_t; - #else - typedef unsigned __int8 uint8_t; - typedef unsigned __int32 uint32_t; - #endif - #endif -#else - #include -#endif -#ifndef CYTHON_FALLTHROUGH - #if defined(__cplusplus) && __cplusplus >= 201103L - #if __has_cpp_attribute(fallthrough) - #define CYTHON_FALLTHROUGH [[fallthrough]] - #elif __has_cpp_attribute(clang::fallthrough) - #define CYTHON_FALLTHROUGH [[clang::fallthrough]] - #elif __has_cpp_attribute(gnu::fallthrough) - #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] - #endif - #endif - #ifndef CYTHON_FALLTHROUGH - #if __has_attribute(fallthrough) - #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) - #else - #define CYTHON_FALLTHROUGH - #endif - #endif - #if defined(__clang__ ) && defined(__apple_build_version__) - #if __apple_build_version__ < 7000000 - #undef CYTHON_FALLTHROUGH - #define CYTHON_FALLTHROUGH - #endif - #endif -#endif - -#ifndef CYTHON_INLINE - #if defined(__clang__) - #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) - #elif defined(__GNUC__) - #define CYTHON_INLINE __inline__ - #elif defined(_MSC_VER) - #define CYTHON_INLINE __inline - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_INLINE inline - #else - #define CYTHON_INLINE - #endif -#endif - -#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) - #define Py_OptimizeFlag 0 -#endif -#define __PYX_BUILD_PY_SSIZE_T "n" -#define CYTHON_FORMAT_SSIZE_T "z" -#if PY_MAJOR_VERSION < 3 - #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) - #define __Pyx_DefaultClassType PyClass_Type -#else - #define __Pyx_BUILTIN_MODULE_NAME "builtins" -#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#else - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#endif - #define __Pyx_DefaultClassType PyType_Type -#endif -#ifndef Py_TPFLAGS_CHECKTYPES - #define Py_TPFLAGS_CHECKTYPES 0 -#endif -#ifndef Py_TPFLAGS_HAVE_INDEX - #define Py_TPFLAGS_HAVE_INDEX 0 -#endif -#ifndef Py_TPFLAGS_HAVE_NEWBUFFER - #define Py_TPFLAGS_HAVE_NEWBUFFER 0 -#endif -#ifndef Py_TPFLAGS_HAVE_FINALIZE - #define Py_TPFLAGS_HAVE_FINALIZE 0 -#endif -#ifndef METH_STACKLESS - #define METH_STACKLESS 0 -#endif -#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) - #ifndef METH_FASTCALL - #define METH_FASTCALL 0x80 - #endif - typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); - typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, - Py_ssize_t nargs, PyObject *kwnames); -#else - #define __Pyx_PyCFunctionFast _PyCFunctionFast - #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords -#endif -#if CYTHON_FAST_PYCCALL -#define __Pyx_PyFastCFunction_Check(func)\ - ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) -#else -#define __Pyx_PyFastCFunction_Check(func) 0 -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) - #define PyObject_Malloc(s) PyMem_Malloc(s) - #define PyObject_Free(p) PyMem_Free(p) - #define PyObject_Realloc(p) PyMem_Realloc(p) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 - #define PyMem_RawMalloc(n) PyMem_Malloc(n) - #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) - #define PyMem_RawFree(p) PyMem_Free(p) -#endif -#if CYTHON_COMPILING_IN_PYSTON - #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) -#else - #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) -#endif -#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#elif PY_VERSION_HEX >= 0x03060000 - #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() -#elif PY_VERSION_HEX >= 0x03000000 - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#else - #define __Pyx_PyThreadState_Current _PyThreadState_Current -#endif -#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) -#include "pythread.h" -#define Py_tss_NEEDS_INIT 0 -typedef int Py_tss_t; -static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { - *key = PyThread_create_key(); - return 0; -} -static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { - Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); - *key = Py_tss_NEEDS_INIT; - return key; -} -static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { - PyObject_Free(key); -} -static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { - return *key != Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { - PyThread_delete_key(*key); - *key = Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { - return PyThread_set_key_value(*key, value); -} -static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { - return PyThread_get_key_value(*key); -} -#endif -#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) -#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) -#else -#define __Pyx_PyDict_NewPresized(n) PyDict_New() -#endif -#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION - #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) -#else - #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS -#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) -#else -#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) -#endif -#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) - #define CYTHON_PEP393_ENABLED 1 - #if defined(PyUnicode_IS_READY) - #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ - 0 : _PyUnicode_Ready((PyObject *)(op))) - #else - #define __Pyx_PyUnicode_READY(op) (0) - #endif - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) - #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) - #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) - #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) - #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) - #else - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) - #endif - #else - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) - #endif -#else - #define CYTHON_PEP393_ENABLED 0 - #define PyUnicode_1BYTE_KIND 1 - #define PyUnicode_2BYTE_KIND 2 - #define PyUnicode_4BYTE_KIND 4 - #define __Pyx_PyUnicode_READY(op) (0) - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) - #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) - #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) - #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) -#endif -#if CYTHON_COMPILING_IN_PYPY - #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) -#else - #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ - PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) - #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) - #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) - #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) -#endif -#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) -#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) -#else - #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) -#endif -#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) - #define PyObject_ASCII(o) PyObject_Repr(o) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBaseString_Type PyUnicode_Type - #define PyStringObject PyUnicodeObject - #define PyString_Type PyUnicode_Type - #define PyString_Check PyUnicode_Check - #define PyString_CheckExact PyUnicode_CheckExact -#ifndef PyObject_Unicode - #define PyObject_Unicode PyObject_Str -#endif -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) - #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) -#else - #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) - #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) -#endif -#ifndef PySet_CheckExact - #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) -#endif -#if PY_VERSION_HEX >= 0x030900A4 - #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) -#else - #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) -#endif -#if CYTHON_ASSUME_SAFE_MACROS - #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) -#else - #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyIntObject PyLongObject - #define PyInt_Type PyLong_Type - #define PyInt_Check(op) PyLong_Check(op) - #define PyInt_CheckExact(op) PyLong_CheckExact(op) - #define PyInt_FromString PyLong_FromString - #define PyInt_FromUnicode PyLong_FromUnicode - #define PyInt_FromLong PyLong_FromLong - #define PyInt_FromSize_t PyLong_FromSize_t - #define PyInt_FromSsize_t PyLong_FromSsize_t - #define PyInt_AsLong PyLong_AsLong - #define PyInt_AS_LONG PyLong_AS_LONG - #define PyInt_AsSsize_t PyLong_AsSsize_t - #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask - #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask - #define PyNumber_Int PyNumber_Long -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBoolObject PyLongObject -#endif -#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY - #ifndef PyUnicode_InternFromString - #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) - #endif -#endif -#if PY_VERSION_HEX < 0x030200A4 - typedef long Py_hash_t; - #define __Pyx_PyInt_FromHash_t PyInt_FromLong - #define __Pyx_PyInt_AsHash_t PyInt_AsLong -#else - #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t - #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) -#else - #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) -#endif -#if CYTHON_USE_ASYNC_SLOTS - #if PY_VERSION_HEX >= 0x030500B1 - #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods - #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) - #else - #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) - #endif -#else - #define __Pyx_PyType_AsAsync(obj) NULL -#endif -#ifndef __Pyx_PyAsyncMethodsStruct - typedef struct { - unaryfunc am_await; - unaryfunc am_aiter; - unaryfunc am_anext; - } __Pyx_PyAsyncMethodsStruct; -#endif - -#if defined(WIN32) || defined(MS_WINDOWS) - #define _USE_MATH_DEFINES -#endif -#include -#ifdef NAN -#define __PYX_NAN() ((float) NAN) -#else -static CYTHON_INLINE float __PYX_NAN() { - float value; - memset(&value, 0xFF, sizeof(value)); - return value; -} -#endif -#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) -#define __Pyx_truncl trunc -#else -#define __Pyx_truncl truncl -#endif - -#define __PYX_MARK_ERR_POS(f_index, lineno) \ - { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } -#define __PYX_ERR(f_index, lineno, Ln_error) \ - { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } - -#ifndef __PYX_EXTERN_C - #ifdef __cplusplus - #define __PYX_EXTERN_C extern "C" - #else - #define __PYX_EXTERN_C extern - #endif -#endif - -#define __PYX_HAVE__aiohttp___http_writer -#define __PYX_HAVE_API__aiohttp___http_writer -/* Early includes */ -#include -#include -#include -#ifdef _OPENMP -#include -#endif /* _OPENMP */ - -#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) -#define CYTHON_WITHOUT_ASSERTIONS -#endif - -typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; - const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; - -#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) -#define __PYX_DEFAULT_STRING_ENCODING "" -#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString -#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#define __Pyx_uchar_cast(c) ((unsigned char)c) -#define __Pyx_long_cast(x) ((long)x) -#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ - (sizeof(type) < sizeof(Py_ssize_t)) ||\ - (sizeof(type) > sizeof(Py_ssize_t) &&\ - likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX) &&\ - (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ - v == (type)PY_SSIZE_T_MIN))) ||\ - (sizeof(type) == sizeof(Py_ssize_t) &&\ - (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX))) ) -static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { - return (size_t) i < (size_t) limit; -} -#if defined (__cplusplus) && __cplusplus >= 201103L - #include - #define __Pyx_sst_abs(value) std::abs(value) -#elif SIZEOF_INT >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) abs(value) -#elif SIZEOF_LONG >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) labs(value) -#elif defined (_MSC_VER) - #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) -#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define __Pyx_sst_abs(value) llabs(value) -#elif defined (__GNUC__) - #define __Pyx_sst_abs(value) __builtin_llabs(value) -#else - #define __Pyx_sst_abs(value) ((value<0) ? -value : value) -#endif -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); -#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) -#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) -#define __Pyx_PyBytes_FromString PyBytes_FromString -#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); -#if PY_MAJOR_VERSION < 3 - #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#else - #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize -#endif -#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) -#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) -#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) -#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) -#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { - const Py_UNICODE *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) -#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode -#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode -#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) -#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); -#define __Pyx_PySequence_Tuple(obj)\ - (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); -#if CYTHON_ASSUME_SAFE_MACROS -#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) -#else -#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) -#endif -#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) -#if PY_MAJOR_VERSION >= 3 -#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) -#else -#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) -#endif -#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII -static int __Pyx_sys_getdefaultencoding_not_ascii; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - PyObject* ascii_chars_u = NULL; - PyObject* ascii_chars_b = NULL; - const char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - if (strcmp(default_encoding_c, "ascii") == 0) { - __Pyx_sys_getdefaultencoding_not_ascii = 0; - } else { - char ascii_chars[128]; - int c; - for (c = 0; c < 128; c++) { - ascii_chars[c] = c; - } - __Pyx_sys_getdefaultencoding_not_ascii = 1; - ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); - if (!ascii_chars_u) goto bad; - ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); - if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { - PyErr_Format( - PyExc_ValueError, - "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", - default_encoding_c); - goto bad; - } - Py_DECREF(ascii_chars_u); - Py_DECREF(ascii_chars_b); - } - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - Py_XDECREF(ascii_chars_u); - Py_XDECREF(ascii_chars_b); - return -1; -} -#endif -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) -#else -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -static char* __PYX_DEFAULT_STRING_ENCODING; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); - if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; - strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - return -1; -} -#endif -#endif - - -/* Test for GCC > 2.95 */ -#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) - #define likely(x) __builtin_expect(!!(x), 1) - #define unlikely(x) __builtin_expect(!!(x), 0) -#else /* !__GNUC__ or GCC < 2.95 */ - #define likely(x) (x) - #define unlikely(x) (x) -#endif /* __GNUC__ */ -static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } - -static PyObject *__pyx_m = NULL; -static PyObject *__pyx_d; -static PyObject *__pyx_b; -static PyObject *__pyx_cython_runtime = NULL; -static PyObject *__pyx_empty_tuple; -static PyObject *__pyx_empty_bytes; -static PyObject *__pyx_empty_unicode; -static int __pyx_lineno; -static int __pyx_clineno = 0; -static const char * __pyx_cfilenm= __FILE__; -static const char *__pyx_filename; - - -static const char *__pyx_f[] = { - "aiohttp\\_http_writer.pyx", - "type.pxd", -}; - -/*--- Type declarations ---*/ -struct __pyx_t_7aiohttp_12_http_writer_Writer; - -/* "aiohttp/_http_writer.pyx":18 - * # ----------------- writer --------------------------- - * - * cdef struct Writer: # <<<<<<<<<<<<<< - * char *buf - * Py_ssize_t size - */ -struct __pyx_t_7aiohttp_12_http_writer_Writer { - char *buf; - Py_ssize_t size; - Py_ssize_t pos; -}; - -/* --- Runtime support code (head) --- */ -/* Refnanny.proto */ -#ifndef CYTHON_REFNANNY - #define CYTHON_REFNANNY 0 -#endif -#if CYTHON_REFNANNY - typedef struct { - void (*INCREF)(void*, PyObject*, int); - void (*DECREF)(void*, PyObject*, int); - void (*GOTREF)(void*, PyObject*, int); - void (*GIVEREF)(void*, PyObject*, int); - void* (*SetupContext)(const char*, int, const char*); - void (*FinishContext)(void**); - } __Pyx_RefNannyAPIStruct; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); - #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; -#ifdef WITH_THREAD - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - if (acquire_gil) {\ - PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ - PyGILState_Release(__pyx_gilstate_save);\ - } else {\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ - } -#else - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) -#endif - #define __Pyx_RefNannyFinishContext()\ - __Pyx_RefNanny->FinishContext(&__pyx_refnanny) - #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) - #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) - #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) - #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) -#else - #define __Pyx_RefNannyDeclarations - #define __Pyx_RefNannySetupContext(name, acquire_gil) - #define __Pyx_RefNannyFinishContext() - #define __Pyx_INCREF(r) Py_INCREF(r) - #define __Pyx_DECREF(r) Py_DECREF(r) - #define __Pyx_GOTREF(r) - #define __Pyx_GIVEREF(r) - #define __Pyx_XINCREF(r) Py_XINCREF(r) - #define __Pyx_XDECREF(r) Py_XDECREF(r) - #define __Pyx_XGOTREF(r) - #define __Pyx_XGIVEREF(r) -#endif -#define __Pyx_XDECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_XDECREF(tmp);\ - } while (0) -#define __Pyx_DECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_DECREF(tmp);\ - } while (0) -#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) -#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) - -/* PyObjectGetAttrStr.proto */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) -#endif - -/* GetBuiltinName.proto */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name); - -/* PyThreadStateGet.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; -#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; -#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type -#else -#define __Pyx_PyThreadState_declare -#define __Pyx_PyThreadState_assign -#define __Pyx_PyErr_Occurred() PyErr_Occurred() -#endif - -/* PyErrFetchRestore.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) -#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) -#else -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#endif -#else -#define __Pyx_PyErr_Clear() PyErr_Clear() -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) -#endif - -/* WriteUnraisableException.proto */ -static void __Pyx_WriteUnraisable(const char *name, int clineno, - int lineno, const char *filename, - int full_traceback, int nogil); - -/* unicode_iter.proto */ -static CYTHON_INLINE int __Pyx_init_unicode_iteration( - PyObject* ustring, Py_ssize_t *length, void** data, int *kind); - -/* PyCFunctionFastCall.proto */ -#if CYTHON_FAST_PYCCALL -static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); -#else -#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) -#endif - -/* PyFunctionFastCall.proto */ -#if CYTHON_FAST_PYCALL -#define __Pyx_PyFunction_FastCall(func, args, nargs)\ - __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) -#if 1 || PY_VERSION_HEX < 0x030600B1 -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); -#else -#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) -#endif -#define __Pyx_BUILD_ASSERT_EXPR(cond)\ - (sizeof(char [1 - 2*!(cond)]) - 1) -#ifndef Py_MEMBER_SIZE -#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) -#endif - static size_t __pyx_pyframe_localsplus_offset = 0; - #include "frameobject.h" - #define __Pxy_PyFrame_Initialize_Offsets()\ - ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ - (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) - #define __Pyx_PyFrame_GetLocalsplus(frame)\ - (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) -#endif - -/* PyObjectCall.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); -#else -#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) -#endif - -/* PyObjectCall2Args.proto */ -static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); - -/* PyObjectCallMethO.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); -#endif - -/* PyObjectCallOneArg.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); - -/* RaiseException.proto */ -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); - -/* PyUnicodeContains.proto */ -static CYTHON_INLINE int __Pyx_PyUnicode_ContainsTF(PyObject* substring, PyObject* text, int eq) { - int result = PyUnicode_Contains(text, substring); - return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); -} - -/* RaiseArgTupleInvalid.proto */ -static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, - Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); - -/* RaiseDoubleKeywords.proto */ -static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); - -/* ParseKeywords.proto */ -static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ - PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ - const char* function_name); - -/* ArgTypeTest.proto */ -#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ - ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\ - __Pyx__ArgTypeTest(obj, type, name, exact)) -static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); - -/* IterFinish.proto */ -static CYTHON_INLINE int __Pyx_IterFinish(void); - -/* PyObjectCallNoArg.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); -#else -#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL) -#endif - -/* PyObjectGetMethod.proto */ -static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); - -/* PyObjectCallMethod0.proto */ -static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); - -/* RaiseNeedMoreValuesToUnpack.proto */ -static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); - -/* RaiseTooManyValuesToUnpack.proto */ -static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); - -/* UnpackItemEndCheck.proto */ -static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); - -/* RaiseNoneIterError.proto */ -static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); - -/* UnpackTupleError.proto */ -static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); - -/* UnpackTuple2.proto */ -#define __Pyx_unpack_tuple2(tuple, value1, value2, is_tuple, has_known_size, decref_tuple)\ - (likely(is_tuple || PyTuple_Check(tuple)) ?\ - (likely(has_known_size || PyTuple_GET_SIZE(tuple) == 2) ?\ - __Pyx_unpack_tuple2_exact(tuple, value1, value2, decref_tuple) :\ - (__Pyx_UnpackTupleError(tuple, 2), -1)) :\ - __Pyx_unpack_tuple2_generic(tuple, value1, value2, has_known_size, decref_tuple)) -static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( - PyObject* tuple, PyObject** value1, PyObject** value2, int decref_tuple); -static int __Pyx_unpack_tuple2_generic( - PyObject* tuple, PyObject** value1, PyObject** value2, int has_known_size, int decref_tuple); - -/* dict_iter.proto */ -static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name, - Py_ssize_t* p_orig_length, int* p_is_dict); -static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos, - PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict); - -/* GetTopmostException.proto */ -#if CYTHON_USE_EXC_INFO_STACK -static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); -#endif - -/* ReRaiseException.proto */ -static CYTHON_INLINE void __Pyx_ReraiseException(void); - -/* GetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); -#endif - -/* SwapException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#else -static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); -#endif - -/* SaveResetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -#else -#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) -#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) -#endif - -/* TypeImport.proto */ -#ifndef __PYX_HAVE_RT_ImportType_proto -#define __PYX_HAVE_RT_ImportType_proto -enum __Pyx_ImportType_CheckSize { - __Pyx_ImportType_CheckSize_Error = 0, - __Pyx_ImportType_CheckSize_Warn = 1, - __Pyx_ImportType_CheckSize_Ignore = 2 -}; -static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); -#endif - -/* Import.proto */ -static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); - -/* ImportFrom.proto */ -static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); - -/* PyDictVersioning.proto */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) -#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ - (version_var) = __PYX_GET_DICT_VERSION(dict);\ - (cache_var) = (value); -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ - (VAR) = __pyx_dict_cached_value;\ - } else {\ - (VAR) = __pyx_dict_cached_value = (LOOKUP);\ - __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ - }\ -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); -#else -#define __PYX_GET_DICT_VERSION(dict) (0) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); -#endif - -/* GetModuleGlobalName.proto */ -#if CYTHON_USE_DICT_VERSIONS -#define __Pyx_GetModuleGlobalName(var, name) {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ - (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ - __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} -#define __Pyx_GetModuleGlobalNameUncached(var, name) {\ - PY_UINT64_T __pyx_dict_version;\ - PyObject *__pyx_dict_cached_value;\ - (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); -#else -#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) -#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); -#endif - -/* CLineInTraceback.proto */ -#ifdef CYTHON_CLINE_IN_TRACEBACK -#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) -#else -static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); -#endif - -/* CodeObjectCache.proto */ -typedef struct { - PyCodeObject* code_object; - int code_line; -} __Pyx_CodeObjectCacheEntry; -struct __Pyx_CodeObjectCache { - int count; - int max_count; - __Pyx_CodeObjectCacheEntry* entries; -}; -static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); -static PyCodeObject *__pyx_find_code_object(int code_line); -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); - -/* AddTraceback.proto */ -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename); - -/* GCCDiagnostics.proto */ -#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) -#define __Pyx_HAS_GCC_DIAGNOSTIC -#endif - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); - -/* CIntFromPy.proto */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); - -/* CIntFromPy.proto */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); - -/* FastTypeChecks.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); -#else -#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) -#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) -#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) -#endif -#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) - -/* CheckBinaryVersion.proto */ -static int __Pyx_check_binary_version(void); - -/* InitStrings.proto */ -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); - - -/* Module declarations from 'libc.string' */ - -/* Module declarations from 'libc.stdio' */ - -/* Module declarations from '__builtin__' */ - -/* Module declarations from 'cpython.type' */ -static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; - -/* Module declarations from 'cpython' */ - -/* Module declarations from 'cpython.object' */ - -/* Module declarations from 'cpython.bytes' */ - -/* Module declarations from 'cpython.exc' */ - -/* Module declarations from 'cpython.mem' */ - -/* Module declarations from 'libc.stdint' */ - -/* Module declarations from 'aiohttp._http_writer' */ -static char __pyx_v_7aiohttp_12_http_writer_BUFFER[0x4000]; -static PyObject *__pyx_v_7aiohttp_12_http_writer__istr = 0; -static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__init_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *); /*proto*/ -static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__release_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *); /*proto*/ -static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_byte(struct __pyx_t_7aiohttp_12_http_writer_Writer *, uint8_t); /*proto*/ -static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_utf8(struct __pyx_t_7aiohttp_12_http_writer_Writer *, Py_UCS4); /*proto*/ -static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_str(struct __pyx_t_7aiohttp_12_http_writer_Writer *, PyObject *); /*proto*/ -static PyObject *__pyx_f_7aiohttp_12_http_writer_to_str(PyObject *); /*proto*/ -static void __pyx_f_7aiohttp_12_http_writer__safe_header(PyObject *); /*proto*/ -#define __Pyx_MODULE_NAME "aiohttp._http_writer" -extern int __pyx_module_is_main_aiohttp___http_writer; -int __pyx_module_is_main_aiohttp___http_writer = 0; - -/* Implementation of 'aiohttp._http_writer' */ -static PyObject *__pyx_builtin_TypeError; -static PyObject *__pyx_builtin_ValueError; -static const char __pyx_k_[] = "\r"; -static const char __pyx_k__2[] = "\n"; -static const char __pyx_k_key[] = "key"; -static const char __pyx_k_ret[] = "ret"; -static const char __pyx_k_val[] = "val"; -static const char __pyx_k_istr[] = "istr"; -static const char __pyx_k_main[] = "__main__"; -static const char __pyx_k_name[] = "__name__"; -static const char __pyx_k_test[] = "__test__"; -static const char __pyx_k_items[] = "items"; -static const char __pyx_k_format[] = "format"; -static const char __pyx_k_import[] = "__import__"; -static const char __pyx_k_writer[] = "writer"; -static const char __pyx_k_headers[] = "headers"; -static const char __pyx_k_TypeError[] = "TypeError"; -static const char __pyx_k_multidict[] = "multidict"; -static const char __pyx_k_ValueError[] = "ValueError"; -static const char __pyx_k_status_line[] = "status_line"; -static const char __pyx_k_serialize_headers[] = "_serialize_headers"; -static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; -static const char __pyx_k_aiohttp__http_writer[] = "aiohttp._http_writer"; -static const char __pyx_k_aiohttp__http_writer_pyx[] = "aiohttp\\_http_writer.pyx"; -static const char __pyx_k_Cannot_serialize_non_str_key_r[] = "Cannot serialize non-str key {!r}"; -static const char __pyx_k_Newline_or_carriage_return_chara[] = "Newline or carriage return character detected in HTTP status message or header. This is a potential security issue."; -static PyObject *__pyx_kp_u_; -static PyObject *__pyx_kp_u_Cannot_serialize_non_str_key_r; -static PyObject *__pyx_kp_u_Newline_or_carriage_return_chara; -static PyObject *__pyx_n_s_TypeError; -static PyObject *__pyx_n_s_ValueError; -static PyObject *__pyx_kp_u__2; -static PyObject *__pyx_n_s_aiohttp__http_writer; -static PyObject *__pyx_kp_s_aiohttp__http_writer_pyx; -static PyObject *__pyx_n_s_cline_in_traceback; -static PyObject *__pyx_n_s_format; -static PyObject *__pyx_n_s_headers; -static PyObject *__pyx_n_s_import; -static PyObject *__pyx_n_s_istr; -static PyObject *__pyx_n_s_items; -static PyObject *__pyx_n_s_key; -static PyObject *__pyx_n_s_main; -static PyObject *__pyx_n_s_multidict; -static PyObject *__pyx_n_s_name; -static PyObject *__pyx_n_s_ret; -static PyObject *__pyx_n_s_serialize_headers; -static PyObject *__pyx_n_s_status_line; -static PyObject *__pyx_n_s_test; -static PyObject *__pyx_n_s_val; -static PyObject *__pyx_n_s_writer; -static PyObject *__pyx_pf_7aiohttp_12_http_writer__serialize_headers(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_status_line, PyObject *__pyx_v_headers); /* proto */ -static PyObject *__pyx_tuple__3; -static PyObject *__pyx_tuple__4; -static PyObject *__pyx_codeobj__5; -/* Late includes */ - -/* "aiohttp/_http_writer.pyx":24 - * - * - * cdef inline void _init_writer(Writer* writer): # <<<<<<<<<<<<<< - * writer.buf = &BUFFER[0] - * writer.size = BUF_SIZE - */ - -static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__init_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("_init_writer", 0); - - /* "aiohttp/_http_writer.pyx":25 - * - * cdef inline void _init_writer(Writer* writer): - * writer.buf = &BUFFER[0] # <<<<<<<<<<<<<< - * writer.size = BUF_SIZE - * writer.pos = 0 - */ - __pyx_v_writer->buf = (&(__pyx_v_7aiohttp_12_http_writer_BUFFER[0])); - - /* "aiohttp/_http_writer.pyx":26 - * cdef inline void _init_writer(Writer* writer): - * writer.buf = &BUFFER[0] - * writer.size = BUF_SIZE # <<<<<<<<<<<<<< - * writer.pos = 0 - * - */ - __pyx_v_writer->size = 0x4000; - - /* "aiohttp/_http_writer.pyx":27 - * writer.buf = &BUFFER[0] - * writer.size = BUF_SIZE - * writer.pos = 0 # <<<<<<<<<<<<<< - * - * - */ - __pyx_v_writer->pos = 0; - - /* "aiohttp/_http_writer.pyx":24 - * - * - * cdef inline void _init_writer(Writer* writer): # <<<<<<<<<<<<<< - * writer.buf = &BUFFER[0] - * writer.size = BUF_SIZE - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "aiohttp/_http_writer.pyx":30 - * - * - * cdef inline void _release_writer(Writer* writer): # <<<<<<<<<<<<<< - * if writer.buf != BUFFER: - * PyMem_Free(writer.buf) - */ - -static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__release_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer) { - __Pyx_RefNannyDeclarations - int __pyx_t_1; - __Pyx_RefNannySetupContext("_release_writer", 0); - - /* "aiohttp/_http_writer.pyx":31 - * - * cdef inline void _release_writer(Writer* writer): - * if writer.buf != BUFFER: # <<<<<<<<<<<<<< - * PyMem_Free(writer.buf) - * - */ - __pyx_t_1 = ((__pyx_v_writer->buf != __pyx_v_7aiohttp_12_http_writer_BUFFER) != 0); - if (__pyx_t_1) { - - /* "aiohttp/_http_writer.pyx":32 - * cdef inline void _release_writer(Writer* writer): - * if writer.buf != BUFFER: - * PyMem_Free(writer.buf) # <<<<<<<<<<<<<< - * - * - */ - PyMem_Free(__pyx_v_writer->buf); - - /* "aiohttp/_http_writer.pyx":31 - * - * cdef inline void _release_writer(Writer* writer): - * if writer.buf != BUFFER: # <<<<<<<<<<<<<< - * PyMem_Free(writer.buf) - * - */ - } - - /* "aiohttp/_http_writer.pyx":30 - * - * - * cdef inline void _release_writer(Writer* writer): # <<<<<<<<<<<<<< - * if writer.buf != BUFFER: - * PyMem_Free(writer.buf) - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "aiohttp/_http_writer.pyx":35 - * - * - * cdef inline int _write_byte(Writer* writer, uint8_t ch): # <<<<<<<<<<<<<< - * cdef char * buf - * cdef Py_ssize_t size - */ - -static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_byte(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer, uint8_t __pyx_v_ch) { - char *__pyx_v_buf; - Py_ssize_t __pyx_v_size; - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_write_byte", 0); - - /* "aiohttp/_http_writer.pyx":39 - * cdef Py_ssize_t size - * - * if writer.pos == writer.size: # <<<<<<<<<<<<<< - * # reallocate - * size = writer.size + BUF_SIZE - */ - __pyx_t_1 = ((__pyx_v_writer->pos == __pyx_v_writer->size) != 0); - if (__pyx_t_1) { - - /* "aiohttp/_http_writer.pyx":41 - * if writer.pos == writer.size: - * # reallocate - * size = writer.size + BUF_SIZE # <<<<<<<<<<<<<< - * if writer.buf == BUFFER: - * buf = PyMem_Malloc(size) - */ - __pyx_v_size = (__pyx_v_writer->size + 0x4000); - - /* "aiohttp/_http_writer.pyx":42 - * # reallocate - * size = writer.size + BUF_SIZE - * if writer.buf == BUFFER: # <<<<<<<<<<<<<< - * buf = PyMem_Malloc(size) - * if buf == NULL: - */ - __pyx_t_1 = ((__pyx_v_writer->buf == __pyx_v_7aiohttp_12_http_writer_BUFFER) != 0); - if (__pyx_t_1) { - - /* "aiohttp/_http_writer.pyx":43 - * size = writer.size + BUF_SIZE - * if writer.buf == BUFFER: - * buf = PyMem_Malloc(size) # <<<<<<<<<<<<<< - * if buf == NULL: - * PyErr_NoMemory() - */ - __pyx_v_buf = ((char *)PyMem_Malloc(__pyx_v_size)); - - /* "aiohttp/_http_writer.pyx":44 - * if writer.buf == BUFFER: - * buf = PyMem_Malloc(size) - * if buf == NULL: # <<<<<<<<<<<<<< - * PyErr_NoMemory() - * return -1 - */ - __pyx_t_1 = ((__pyx_v_buf == NULL) != 0); - if (__pyx_t_1) { - - /* "aiohttp/_http_writer.pyx":45 - * buf = PyMem_Malloc(size) - * if buf == NULL: - * PyErr_NoMemory() # <<<<<<<<<<<<<< - * return -1 - * memcpy(buf, writer.buf, writer.size) - */ - __pyx_t_2 = PyErr_NoMemory(); if (unlikely(__pyx_t_2 == ((PyObject *)NULL))) __PYX_ERR(0, 45, __pyx_L1_error) - - /* "aiohttp/_http_writer.pyx":46 - * if buf == NULL: - * PyErr_NoMemory() - * return -1 # <<<<<<<<<<<<<< - * memcpy(buf, writer.buf, writer.size) - * else: - */ - __pyx_r = -1; - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":44 - * if writer.buf == BUFFER: - * buf = PyMem_Malloc(size) - * if buf == NULL: # <<<<<<<<<<<<<< - * PyErr_NoMemory() - * return -1 - */ - } - - /* "aiohttp/_http_writer.pyx":47 - * PyErr_NoMemory() - * return -1 - * memcpy(buf, writer.buf, writer.size) # <<<<<<<<<<<<<< - * else: - * buf = PyMem_Realloc(writer.buf, size) - */ - (void)(memcpy(__pyx_v_buf, __pyx_v_writer->buf, __pyx_v_writer->size)); - - /* "aiohttp/_http_writer.pyx":42 - * # reallocate - * size = writer.size + BUF_SIZE - * if writer.buf == BUFFER: # <<<<<<<<<<<<<< - * buf = PyMem_Malloc(size) - * if buf == NULL: - */ - goto __pyx_L4; - } - - /* "aiohttp/_http_writer.pyx":49 - * memcpy(buf, writer.buf, writer.size) - * else: - * buf = PyMem_Realloc(writer.buf, size) # <<<<<<<<<<<<<< - * if buf == NULL: - * PyErr_NoMemory() - */ - /*else*/ { - __pyx_v_buf = ((char *)PyMem_Realloc(__pyx_v_writer->buf, __pyx_v_size)); - - /* "aiohttp/_http_writer.pyx":50 - * else: - * buf = PyMem_Realloc(writer.buf, size) - * if buf == NULL: # <<<<<<<<<<<<<< - * PyErr_NoMemory() - * return -1 - */ - __pyx_t_1 = ((__pyx_v_buf == NULL) != 0); - if (__pyx_t_1) { - - /* "aiohttp/_http_writer.pyx":51 - * buf = PyMem_Realloc(writer.buf, size) - * if buf == NULL: - * PyErr_NoMemory() # <<<<<<<<<<<<<< - * return -1 - * writer.buf = buf - */ - __pyx_t_2 = PyErr_NoMemory(); if (unlikely(__pyx_t_2 == ((PyObject *)NULL))) __PYX_ERR(0, 51, __pyx_L1_error) - - /* "aiohttp/_http_writer.pyx":52 - * if buf == NULL: - * PyErr_NoMemory() - * return -1 # <<<<<<<<<<<<<< - * writer.buf = buf - * writer.size = size - */ - __pyx_r = -1; - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":50 - * else: - * buf = PyMem_Realloc(writer.buf, size) - * if buf == NULL: # <<<<<<<<<<<<<< - * PyErr_NoMemory() - * return -1 - */ - } - } - __pyx_L4:; - - /* "aiohttp/_http_writer.pyx":53 - * PyErr_NoMemory() - * return -1 - * writer.buf = buf # <<<<<<<<<<<<<< - * writer.size = size - * writer.buf[writer.pos] = ch - */ - __pyx_v_writer->buf = __pyx_v_buf; - - /* "aiohttp/_http_writer.pyx":54 - * return -1 - * writer.buf = buf - * writer.size = size # <<<<<<<<<<<<<< - * writer.buf[writer.pos] = ch - * writer.pos += 1 - */ - __pyx_v_writer->size = __pyx_v_size; - - /* "aiohttp/_http_writer.pyx":39 - * cdef Py_ssize_t size - * - * if writer.pos == writer.size: # <<<<<<<<<<<<<< - * # reallocate - * size = writer.size + BUF_SIZE - */ - } - - /* "aiohttp/_http_writer.pyx":55 - * writer.buf = buf - * writer.size = size - * writer.buf[writer.pos] = ch # <<<<<<<<<<<<<< - * writer.pos += 1 - * return 0 - */ - (__pyx_v_writer->buf[__pyx_v_writer->pos]) = ((char)__pyx_v_ch); - - /* "aiohttp/_http_writer.pyx":56 - * writer.size = size - * writer.buf[writer.pos] = ch - * writer.pos += 1 # <<<<<<<<<<<<<< - * return 0 - * - */ - __pyx_v_writer->pos = (__pyx_v_writer->pos + 1); - - /* "aiohttp/_http_writer.pyx":57 - * writer.buf[writer.pos] = ch - * writer.pos += 1 - * return 0 # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = 0; - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":35 - * - * - * cdef inline int _write_byte(Writer* writer, uint8_t ch): # <<<<<<<<<<<<<< - * cdef char * buf - * cdef Py_ssize_t size - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_WriteUnraisable("aiohttp._http_writer._write_byte", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); - __pyx_r = 0; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_writer.pyx":60 - * - * - * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): # <<<<<<<<<<<<<< - * cdef uint64_t utf = symbol - * - */ - -static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_utf8(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer, Py_UCS4 __pyx_v_symbol) { - uint64_t __pyx_v_utf; - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - __Pyx_RefNannySetupContext("_write_utf8", 0); - - /* "aiohttp/_http_writer.pyx":61 - * - * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): - * cdef uint64_t utf = symbol # <<<<<<<<<<<<<< - * - * if utf < 0x80: - */ - __pyx_v_utf = ((uint64_t)__pyx_v_symbol); - - /* "aiohttp/_http_writer.pyx":63 - * cdef uint64_t utf = symbol - * - * if utf < 0x80: # <<<<<<<<<<<<<< - * return _write_byte(writer, utf) - * elif utf < 0x800: - */ - __pyx_t_1 = ((__pyx_v_utf < 0x80) != 0); - if (__pyx_t_1) { - - /* "aiohttp/_http_writer.pyx":64 - * - * if utf < 0x80: - * return _write_byte(writer, utf) # <<<<<<<<<<<<<< - * elif utf < 0x800: - * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: - */ - __pyx_r = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)__pyx_v_utf)); - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":63 - * cdef uint64_t utf = symbol - * - * if utf < 0x80: # <<<<<<<<<<<<<< - * return _write_byte(writer, utf) - * elif utf < 0x800: - */ - } - - /* "aiohttp/_http_writer.pyx":65 - * if utf < 0x80: - * return _write_byte(writer, utf) - * elif utf < 0x800: # <<<<<<<<<<<<<< - * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: - * return -1 - */ - __pyx_t_1 = ((__pyx_v_utf < 0x800) != 0); - if (__pyx_t_1) { - - /* "aiohttp/_http_writer.pyx":66 - * return _write_byte(writer, utf) - * elif utf < 0x800: - * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: # <<<<<<<<<<<<<< - * return -1 - * return _write_byte(writer, (0x80 | (utf & 0x3f))) - */ - __pyx_t_1 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0xc0 | (__pyx_v_utf >> 6)))) < 0) != 0); - if (__pyx_t_1) { - - /* "aiohttp/_http_writer.pyx":67 - * elif utf < 0x800: - * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: - * return -1 # <<<<<<<<<<<<<< - * return _write_byte(writer, (0x80 | (utf & 0x3f))) - * elif 0xD800 <= utf <= 0xDFFF: - */ - __pyx_r = -1; - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":66 - * return _write_byte(writer, utf) - * elif utf < 0x800: - * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: # <<<<<<<<<<<<<< - * return -1 - * return _write_byte(writer, (0x80 | (utf & 0x3f))) - */ - } - - /* "aiohttp/_http_writer.pyx":68 - * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: - * return -1 - * return _write_byte(writer, (0x80 | (utf & 0x3f))) # <<<<<<<<<<<<<< - * elif 0xD800 <= utf <= 0xDFFF: - * # surogate pair, ignored - */ - __pyx_r = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f)))); - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":65 - * if utf < 0x80: - * return _write_byte(writer, utf) - * elif utf < 0x800: # <<<<<<<<<<<<<< - * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: - * return -1 - */ - } - - /* "aiohttp/_http_writer.pyx":69 - * return -1 - * return _write_byte(writer, (0x80 | (utf & 0x3f))) - * elif 0xD800 <= utf <= 0xDFFF: # <<<<<<<<<<<<<< - * # surogate pair, ignored - * return 0 - */ - __pyx_t_1 = (0xD800 <= __pyx_v_utf); - if (__pyx_t_1) { - __pyx_t_1 = (__pyx_v_utf <= 0xDFFF); - } - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_writer.pyx":71 - * elif 0xD800 <= utf <= 0xDFFF: - * # surogate pair, ignored - * return 0 # <<<<<<<<<<<<<< - * elif utf < 0x10000: - * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: - */ - __pyx_r = 0; - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":69 - * return -1 - * return _write_byte(writer, (0x80 | (utf & 0x3f))) - * elif 0xD800 <= utf <= 0xDFFF: # <<<<<<<<<<<<<< - * # surogate pair, ignored - * return 0 - */ - } - - /* "aiohttp/_http_writer.pyx":72 - * # surogate pair, ignored - * return 0 - * elif utf < 0x10000: # <<<<<<<<<<<<<< - * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: - * return -1 - */ - __pyx_t_2 = ((__pyx_v_utf < 0x10000) != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_writer.pyx":73 - * return 0 - * elif utf < 0x10000: - * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: # <<<<<<<<<<<<<< - * return -1 - * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: - */ - __pyx_t_2 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0xe0 | (__pyx_v_utf >> 12)))) < 0) != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_writer.pyx":74 - * elif utf < 0x10000: - * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: - * return -1 # <<<<<<<<<<<<<< - * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: - * return -1 - */ - __pyx_r = -1; - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":73 - * return 0 - * elif utf < 0x10000: - * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: # <<<<<<<<<<<<<< - * return -1 - * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: - */ - } - - /* "aiohttp/_http_writer.pyx":75 - * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: - * return -1 - * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: # <<<<<<<<<<<<<< - * return -1 - * return _write_byte(writer, (0x80 | (utf & 0x3f))) - */ - __pyx_t_2 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 6) & 0x3f)))) < 0) != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_writer.pyx":76 - * return -1 - * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: - * return -1 # <<<<<<<<<<<<<< - * return _write_byte(writer, (0x80 | (utf & 0x3f))) - * elif utf > 0x10FFFF: - */ - __pyx_r = -1; - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":75 - * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: - * return -1 - * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: # <<<<<<<<<<<<<< - * return -1 - * return _write_byte(writer, (0x80 | (utf & 0x3f))) - */ - } - - /* "aiohttp/_http_writer.pyx":77 - * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: - * return -1 - * return _write_byte(writer, (0x80 | (utf & 0x3f))) # <<<<<<<<<<<<<< - * elif utf > 0x10FFFF: - * # symbol is too large - */ - __pyx_r = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f)))); - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":72 - * # surogate pair, ignored - * return 0 - * elif utf < 0x10000: # <<<<<<<<<<<<<< - * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: - * return -1 - */ - } - - /* "aiohttp/_http_writer.pyx":78 - * return -1 - * return _write_byte(writer, (0x80 | (utf & 0x3f))) - * elif utf > 0x10FFFF: # <<<<<<<<<<<<<< - * # symbol is too large - * return 0 - */ - __pyx_t_2 = ((__pyx_v_utf > 0x10FFFF) != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_writer.pyx":80 - * elif utf > 0x10FFFF: - * # symbol is too large - * return 0 # <<<<<<<<<<<<<< - * else: - * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: - */ - __pyx_r = 0; - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":78 - * return -1 - * return _write_byte(writer, (0x80 | (utf & 0x3f))) - * elif utf > 0x10FFFF: # <<<<<<<<<<<<<< - * # symbol is too large - * return 0 - */ - } - - /* "aiohttp/_http_writer.pyx":82 - * return 0 - * else: - * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: # <<<<<<<<<<<<<< - * return -1 - * if _write_byte(writer, - */ - /*else*/ { - __pyx_t_2 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0xf0 | (__pyx_v_utf >> 18)))) < 0) != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_writer.pyx":83 - * else: - * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: - * return -1 # <<<<<<<<<<<<<< - * if _write_byte(writer, - * (0x80 | ((utf >> 12) & 0x3f))) < 0: - */ - __pyx_r = -1; - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":82 - * return 0 - * else: - * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: # <<<<<<<<<<<<<< - * return -1 - * if _write_byte(writer, - */ - } - - /* "aiohttp/_http_writer.pyx":85 - * return -1 - * if _write_byte(writer, - * (0x80 | ((utf >> 12) & 0x3f))) < 0: # <<<<<<<<<<<<<< - * return -1 - * if _write_byte(writer, - */ - __pyx_t_2 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 12) & 0x3f)))) < 0) != 0); - - /* "aiohttp/_http_writer.pyx":84 - * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: - * return -1 - * if _write_byte(writer, # <<<<<<<<<<<<<< - * (0x80 | ((utf >> 12) & 0x3f))) < 0: - * return -1 - */ - if (__pyx_t_2) { - - /* "aiohttp/_http_writer.pyx":86 - * if _write_byte(writer, - * (0x80 | ((utf >> 12) & 0x3f))) < 0: - * return -1 # <<<<<<<<<<<<<< - * if _write_byte(writer, - * (0x80 | ((utf >> 6) & 0x3f))) < 0: - */ - __pyx_r = -1; - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":84 - * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: - * return -1 - * if _write_byte(writer, # <<<<<<<<<<<<<< - * (0x80 | ((utf >> 12) & 0x3f))) < 0: - * return -1 - */ - } - - /* "aiohttp/_http_writer.pyx":88 - * return -1 - * if _write_byte(writer, - * (0x80 | ((utf >> 6) & 0x3f))) < 0: # <<<<<<<<<<<<<< - * return -1 - * return _write_byte(writer, (0x80 | (utf & 0x3f))) - */ - __pyx_t_2 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 6) & 0x3f)))) < 0) != 0); - - /* "aiohttp/_http_writer.pyx":87 - * (0x80 | ((utf >> 12) & 0x3f))) < 0: - * return -1 - * if _write_byte(writer, # <<<<<<<<<<<<<< - * (0x80 | ((utf >> 6) & 0x3f))) < 0: - * return -1 - */ - if (__pyx_t_2) { - - /* "aiohttp/_http_writer.pyx":89 - * if _write_byte(writer, - * (0x80 | ((utf >> 6) & 0x3f))) < 0: - * return -1 # <<<<<<<<<<<<<< - * return _write_byte(writer, (0x80 | (utf & 0x3f))) - * - */ - __pyx_r = -1; - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":87 - * (0x80 | ((utf >> 12) & 0x3f))) < 0: - * return -1 - * if _write_byte(writer, # <<<<<<<<<<<<<< - * (0x80 | ((utf >> 6) & 0x3f))) < 0: - * return -1 - */ - } - - /* "aiohttp/_http_writer.pyx":90 - * (0x80 | ((utf >> 6) & 0x3f))) < 0: - * return -1 - * return _write_byte(writer, (0x80 | (utf & 0x3f))) # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f)))); - goto __pyx_L0; - } - - /* "aiohttp/_http_writer.pyx":60 - * - * - * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): # <<<<<<<<<<<<<< - * cdef uint64_t utf = symbol - * - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_writer.pyx":93 - * - * - * cdef inline int _write_str(Writer* writer, str s): # <<<<<<<<<<<<<< - * cdef Py_UCS4 ch - * for ch in s: - */ - -static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_str(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer, PyObject *__pyx_v_s) { - Py_UCS4 __pyx_v_ch; - int __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - Py_ssize_t __pyx_t_2; - Py_ssize_t __pyx_t_3; - void *__pyx_t_4; - int __pyx_t_5; - int __pyx_t_6; - Py_ssize_t __pyx_t_7; - int __pyx_t_8; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_write_str", 0); - - /* "aiohttp/_http_writer.pyx":95 - * cdef inline int _write_str(Writer* writer, str s): - * cdef Py_UCS4 ch - * for ch in s: # <<<<<<<<<<<<<< - * if _write_utf8(writer, ch) < 0: - * return -1 - */ - if (unlikely(__pyx_v_s == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); - __PYX_ERR(0, 95, __pyx_L1_error) - } - __Pyx_INCREF(__pyx_v_s); - __pyx_t_1 = __pyx_v_s; - __pyx_t_6 = __Pyx_init_unicode_iteration(__pyx_t_1, (&__pyx_t_3), (&__pyx_t_4), (&__pyx_t_5)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 95, __pyx_L1_error) - for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_3; __pyx_t_7++) { - __pyx_t_2 = __pyx_t_7; - __pyx_v_ch = __Pyx_PyUnicode_READ(__pyx_t_5, __pyx_t_4, __pyx_t_2); - - /* "aiohttp/_http_writer.pyx":96 - * cdef Py_UCS4 ch - * for ch in s: - * if _write_utf8(writer, ch) < 0: # <<<<<<<<<<<<<< - * return -1 - * - */ - __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_utf8(__pyx_v_writer, __pyx_v_ch) < 0) != 0); - if (__pyx_t_8) { - - /* "aiohttp/_http_writer.pyx":97 - * for ch in s: - * if _write_utf8(writer, ch) < 0: - * return -1 # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = -1; - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":96 - * cdef Py_UCS4 ch - * for ch in s: - * if _write_utf8(writer, ch) < 0: # <<<<<<<<<<<<<< - * return -1 - * - */ - } - } - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_writer.pyx":93 - * - * - * cdef inline int _write_str(Writer* writer, str s): # <<<<<<<<<<<<<< - * cdef Py_UCS4 ch - * for ch in s: - */ - - /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_WriteUnraisable("aiohttp._http_writer._write_str", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); - __pyx_r = 0; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_writer.pyx":102 - * # --------------- _serialize_headers ---------------------- - * - * cdef str to_str(object s): # <<<<<<<<<<<<<< - * typ = type(s) - * if typ is str: - */ - -static PyObject *__pyx_f_7aiohttp_12_http_writer_to_str(PyObject *__pyx_v_s) { - PyTypeObject *__pyx_v_typ = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("to_str", 0); - - /* "aiohttp/_http_writer.pyx":103 - * - * cdef str to_str(object s): - * typ = type(s) # <<<<<<<<<<<<<< - * if typ is str: - * return s - */ - __Pyx_INCREF(((PyObject *)Py_TYPE(__pyx_v_s))); - __pyx_v_typ = ((PyTypeObject*)((PyObject *)Py_TYPE(__pyx_v_s))); - - /* "aiohttp/_http_writer.pyx":104 - * cdef str to_str(object s): - * typ = type(s) - * if typ is str: # <<<<<<<<<<<<<< - * return s - * elif typ is _istr: - */ - __pyx_t_1 = (__pyx_v_typ == (&PyUnicode_Type)); - __pyx_t_2 = (__pyx_t_1 != 0); - if (__pyx_t_2) { - - /* "aiohttp/_http_writer.pyx":105 - * typ = type(s) - * if typ is str: - * return s # <<<<<<<<<<<<<< - * elif typ is _istr: - * return PyObject_Str(s) - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject*)__pyx_v_s)); - __pyx_r = ((PyObject*)__pyx_v_s); - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":104 - * cdef str to_str(object s): - * typ = type(s) - * if typ is str: # <<<<<<<<<<<<<< - * return s - * elif typ is _istr: - */ - } - - /* "aiohttp/_http_writer.pyx":106 - * if typ is str: - * return s - * elif typ is _istr: # <<<<<<<<<<<<<< - * return PyObject_Str(s) - * elif not isinstance(s, str): - */ - __pyx_t_2 = (__pyx_v_typ == ((PyTypeObject*)__pyx_v_7aiohttp_12_http_writer__istr)); - __pyx_t_1 = (__pyx_t_2 != 0); - if (__pyx_t_1) { - - /* "aiohttp/_http_writer.pyx":107 - * return s - * elif typ is _istr: - * return PyObject_Str(s) # <<<<<<<<<<<<<< - * elif not isinstance(s, str): - * raise TypeError("Cannot serialize non-str key {!r}".format(s)) - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = PyObject_Str(__pyx_v_s); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 107, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (!(likely(PyUnicode_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(0, 107, __pyx_L1_error) - __pyx_r = ((PyObject*)__pyx_t_3); - __pyx_t_3 = 0; - goto __pyx_L0; - - /* "aiohttp/_http_writer.pyx":106 - * if typ is str: - * return s - * elif typ is _istr: # <<<<<<<<<<<<<< - * return PyObject_Str(s) - * elif not isinstance(s, str): - */ - } - - /* "aiohttp/_http_writer.pyx":108 - * elif typ is _istr: - * return PyObject_Str(s) - * elif not isinstance(s, str): # <<<<<<<<<<<<<< - * raise TypeError("Cannot serialize non-str key {!r}".format(s)) - * else: - */ - __pyx_t_1 = PyUnicode_Check(__pyx_v_s); - __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); - if (unlikely(__pyx_t_2)) { - - /* "aiohttp/_http_writer.pyx":109 - * return PyObject_Str(s) - * elif not isinstance(s, str): - * raise TypeError("Cannot serialize non-str key {!r}".format(s)) # <<<<<<<<<<<<<< - * else: - * return str(s) - */ - __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_Cannot_serialize_non_str_key_r, __pyx_n_s_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 109, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); - if (likely(__pyx_t_5)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); - __Pyx_INCREF(__pyx_t_5); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_4, function); - } - } - __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_v_s) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_s); - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 109, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 109, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(0, 109, __pyx_L1_error) - - /* "aiohttp/_http_writer.pyx":108 - * elif typ is _istr: - * return PyObject_Str(s) - * elif not isinstance(s, str): # <<<<<<<<<<<<<< - * raise TypeError("Cannot serialize non-str key {!r}".format(s)) - * else: - */ - } - - /* "aiohttp/_http_writer.pyx":111 - * raise TypeError("Cannot serialize non-str key {!r}".format(s)) - * else: - * return str(s) # <<<<<<<<<<<<<< - * - * - */ - /*else*/ { - __Pyx_XDECREF(__pyx_r); - __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_s); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 111, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_r = ((PyObject*)__pyx_t_4); - __pyx_t_4 = 0; - goto __pyx_L0; - } - - /* "aiohttp/_http_writer.pyx":102 - * # --------------- _serialize_headers ---------------------- - * - * cdef str to_str(object s): # <<<<<<<<<<<<<< - * typ = type(s) - * if typ is str: - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("aiohttp._http_writer.to_str", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_typ); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "aiohttp/_http_writer.pyx":114 - * - * - * cdef void _safe_header(str string) except *: # <<<<<<<<<<<<<< - * if "\r" in string or "\n" in string: - * raise ValueError( - */ - -static void __pyx_f_7aiohttp_12_http_writer__safe_header(PyObject *__pyx_v_string) { - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - PyObject *__pyx_t_4 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_safe_header", 0); - - /* "aiohttp/_http_writer.pyx":115 - * - * cdef void _safe_header(str string) except *: - * if "\r" in string or "\n" in string: # <<<<<<<<<<<<<< - * raise ValueError( - * "Newline or carriage return character detected in HTTP status message or " - */ - if (unlikely(__pyx_v_string == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); - __PYX_ERR(0, 115, __pyx_L1_error) - } - __pyx_t_2 = (__Pyx_PyUnicode_ContainsTF(__pyx_kp_u_, __pyx_v_string, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 115, __pyx_L1_error) - __pyx_t_3 = (__pyx_t_2 != 0); - if (!__pyx_t_3) { - } else { - __pyx_t_1 = __pyx_t_3; - goto __pyx_L4_bool_binop_done; - } - if (unlikely(__pyx_v_string == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); - __PYX_ERR(0, 115, __pyx_L1_error) - } - __pyx_t_3 = (__Pyx_PyUnicode_ContainsTF(__pyx_kp_u__2, __pyx_v_string, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 115, __pyx_L1_error) - __pyx_t_2 = (__pyx_t_3 != 0); - __pyx_t_1 = __pyx_t_2; - __pyx_L4_bool_binop_done:; - if (unlikely(__pyx_t_1)) { - - /* "aiohttp/_http_writer.pyx":116 - * cdef void _safe_header(str string) except *: - * if "\r" in string or "\n" in string: - * raise ValueError( # <<<<<<<<<<<<<< - * "Newline or carriage return character detected in HTTP status message or " - * "header. This is a potential security issue." - */ - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 116, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(0, 116, __pyx_L1_error) - - /* "aiohttp/_http_writer.pyx":115 - * - * cdef void _safe_header(str string) except *: - * if "\r" in string or "\n" in string: # <<<<<<<<<<<<<< - * raise ValueError( - * "Newline or carriage return character detected in HTTP status message or " - */ - } - - /* "aiohttp/_http_writer.pyx":114 - * - * - * cdef void _safe_header(str string) except *: # <<<<<<<<<<<<<< - * if "\r" in string or "\n" in string: - * raise ValueError( - */ - - /* function exit code */ - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("aiohttp._http_writer._safe_header", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_L0:; - __Pyx_RefNannyFinishContext(); -} - -/* "aiohttp/_http_writer.pyx":122 - * - * - * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< - * cdef Writer writer - * cdef object key - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_12_http_writer_1_serialize_headers(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static PyMethodDef __pyx_mdef_7aiohttp_12_http_writer_1_serialize_headers = {"_serialize_headers", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_12_http_writer_1_serialize_headers, METH_VARARGS|METH_KEYWORDS, 0}; -static PyObject *__pyx_pw_7aiohttp_12_http_writer_1_serialize_headers(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_status_line = 0; - PyObject *__pyx_v_headers = 0; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("_serialize_headers (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_status_line,&__pyx_n_s_headers,0}; - PyObject* values[2] = {0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_status_line)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_headers)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("_serialize_headers", 1, 2, 2, 1); __PYX_ERR(0, 122, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_serialize_headers") < 0)) __PYX_ERR(0, 122, __pyx_L3_error) - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - } - __pyx_v_status_line = ((PyObject*)values[0]); - __pyx_v_headers = values[1]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("_serialize_headers", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 122, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("aiohttp._http_writer._serialize_headers", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_status_line), (&PyUnicode_Type), 1, "status_line", 1))) __PYX_ERR(0, 122, __pyx_L1_error) - __pyx_r = __pyx_pf_7aiohttp_12_http_writer__serialize_headers(__pyx_self, __pyx_v_status_line, __pyx_v_headers); - - /* function exit code */ - goto __pyx_L0; - __pyx_L1_error:; - __pyx_r = NULL; - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_12_http_writer__serialize_headers(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_status_line, PyObject *__pyx_v_headers) { - struct __pyx_t_7aiohttp_12_http_writer_Writer __pyx_v_writer; - PyObject *__pyx_v_key = 0; - PyObject *__pyx_v_val = 0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - Py_ssize_t __pyx_t_2; - Py_ssize_t __pyx_t_3; - int __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - int __pyx_t_7; - int __pyx_t_8; - char const *__pyx_t_9; - PyObject *__pyx_t_10 = NULL; - PyObject *__pyx_t_11 = NULL; - PyObject *__pyx_t_12 = NULL; - PyObject *__pyx_t_13 = NULL; - PyObject *__pyx_t_14 = NULL; - PyObject *__pyx_t_15 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_serialize_headers", 0); - - /* "aiohttp/_http_writer.pyx":128 - * cdef bytes ret - * - * _init_writer(&writer) # <<<<<<<<<<<<<< - * - * for key, val in headers.items(): - */ - __pyx_f_7aiohttp_12_http_writer__init_writer((&__pyx_v_writer)); - - /* "aiohttp/_http_writer.pyx":130 - * _init_writer(&writer) - * - * for key, val in headers.items(): # <<<<<<<<<<<<<< - * _safe_header(to_str(key)) - * _safe_header(to_str(val)) - */ - __pyx_t_2 = 0; - if (unlikely(__pyx_v_headers == Py_None)) { - PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items"); - __PYX_ERR(0, 130, __pyx_L1_error) - } - __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_headers, 0, __pyx_n_s_items, (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 130, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_1); - __pyx_t_1 = __pyx_t_5; - __pyx_t_5 = 0; - while (1) { - __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_3, &__pyx_t_2, &__pyx_t_5, &__pyx_t_6, NULL, __pyx_t_4); - if (unlikely(__pyx_t_7 == 0)) break; - if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 130, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GOTREF(__pyx_t_6); - __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_5); - __pyx_t_5 = 0; - __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_6); - __pyx_t_6 = 0; - - /* "aiohttp/_http_writer.pyx":131 - * - * for key, val in headers.items(): - * _safe_header(to_str(key)) # <<<<<<<<<<<<<< - * _safe_header(to_str(val)) - * - */ - __pyx_t_6 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_key); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 131, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_f_7aiohttp_12_http_writer__safe_header(((PyObject*)__pyx_t_6)); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 131, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - - /* "aiohttp/_http_writer.pyx":132 - * for key, val in headers.items(): - * _safe_header(to_str(key)) - * _safe_header(to_str(val)) # <<<<<<<<<<<<<< - * - * try: - */ - __pyx_t_6 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_val); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 132, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_f_7aiohttp_12_http_writer__safe_header(((PyObject*)__pyx_t_6)); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_writer.pyx":134 - * _safe_header(to_str(val)) - * - * try: # <<<<<<<<<<<<<< - * if _write_str(&writer, status_line) < 0: - * raise - */ - /*try:*/ { - - /* "aiohttp/_http_writer.pyx":135 - * - * try: - * if _write_str(&writer, status_line) < 0: # <<<<<<<<<<<<<< - * raise - * if _write_byte(&writer, b'\r') < 0: - */ - __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_str((&__pyx_v_writer), __pyx_v_status_line) < 0) != 0); - if (unlikely(__pyx_t_8)) { - - /* "aiohttp/_http_writer.pyx":136 - * try: - * if _write_str(&writer, status_line) < 0: - * raise # <<<<<<<<<<<<<< - * if _write_byte(&writer, b'\r') < 0: - * raise - */ - __Pyx_ReraiseException(); __PYX_ERR(0, 136, __pyx_L6_error) - - /* "aiohttp/_http_writer.pyx":135 - * - * try: - * if _write_str(&writer, status_line) < 0: # <<<<<<<<<<<<<< - * raise - * if _write_byte(&writer, b'\r') < 0: - */ - } - - /* "aiohttp/_http_writer.pyx":137 - * if _write_str(&writer, status_line) < 0: - * raise - * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< - * raise - * if _write_byte(&writer, b'\n') < 0: - */ - __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\r') < 0) != 0); - if (unlikely(__pyx_t_8)) { - - /* "aiohttp/_http_writer.pyx":138 - * raise - * if _write_byte(&writer, b'\r') < 0: - * raise # <<<<<<<<<<<<<< - * if _write_byte(&writer, b'\n') < 0: - * raise - */ - __Pyx_ReraiseException(); __PYX_ERR(0, 138, __pyx_L6_error) - - /* "aiohttp/_http_writer.pyx":137 - * if _write_str(&writer, status_line) < 0: - * raise - * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< - * raise - * if _write_byte(&writer, b'\n') < 0: - */ - } - - /* "aiohttp/_http_writer.pyx":139 - * if _write_byte(&writer, b'\r') < 0: - * raise - * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< - * raise - * - */ - __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\n') < 0) != 0); - if (unlikely(__pyx_t_8)) { - - /* "aiohttp/_http_writer.pyx":140 - * raise - * if _write_byte(&writer, b'\n') < 0: - * raise # <<<<<<<<<<<<<< - * - * for key, val in headers.items(): - */ - __Pyx_ReraiseException(); __PYX_ERR(0, 140, __pyx_L6_error) - - /* "aiohttp/_http_writer.pyx":139 - * if _write_byte(&writer, b'\r') < 0: - * raise - * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< - * raise - * - */ - } - - /* "aiohttp/_http_writer.pyx":142 - * raise - * - * for key, val in headers.items(): # <<<<<<<<<<<<<< - * if _write_str(&writer, to_str(key)) < 0: - * raise - */ - __pyx_t_3 = 0; - if (unlikely(__pyx_v_headers == Py_None)) { - PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items"); - __PYX_ERR(0, 142, __pyx_L6_error) - } - __pyx_t_6 = __Pyx_dict_iterator(__pyx_v_headers, 0, __pyx_n_s_items, (&__pyx_t_2), (&__pyx_t_4)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 142, __pyx_L6_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_1); - __pyx_t_1 = __pyx_t_6; - __pyx_t_6 = 0; - while (1) { - __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_2, &__pyx_t_3, &__pyx_t_6, &__pyx_t_5, NULL, __pyx_t_4); - if (unlikely(__pyx_t_7 == 0)) break; - if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 142, __pyx_L6_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GOTREF(__pyx_t_5); - __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_6); - __pyx_t_6 = 0; - __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_5); - __pyx_t_5 = 0; - - /* "aiohttp/_http_writer.pyx":143 - * - * for key, val in headers.items(): - * if _write_str(&writer, to_str(key)) < 0: # <<<<<<<<<<<<<< - * raise - * if _write_byte(&writer, b':') < 0: - */ - __pyx_t_5 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_key); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 143, __pyx_L6_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_str((&__pyx_v_writer), ((PyObject*)__pyx_t_5)) < 0) != 0); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(__pyx_t_8)) { - - /* "aiohttp/_http_writer.pyx":144 - * for key, val in headers.items(): - * if _write_str(&writer, to_str(key)) < 0: - * raise # <<<<<<<<<<<<<< - * if _write_byte(&writer, b':') < 0: - * raise - */ - __Pyx_ReraiseException(); __PYX_ERR(0, 144, __pyx_L6_error) - - /* "aiohttp/_http_writer.pyx":143 - * - * for key, val in headers.items(): - * if _write_str(&writer, to_str(key)) < 0: # <<<<<<<<<<<<<< - * raise - * if _write_byte(&writer, b':') < 0: - */ - } - - /* "aiohttp/_http_writer.pyx":145 - * if _write_str(&writer, to_str(key)) < 0: - * raise - * if _write_byte(&writer, b':') < 0: # <<<<<<<<<<<<<< - * raise - * if _write_byte(&writer, b' ') < 0: - */ - __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), ':') < 0) != 0); - if (unlikely(__pyx_t_8)) { - - /* "aiohttp/_http_writer.pyx":146 - * raise - * if _write_byte(&writer, b':') < 0: - * raise # <<<<<<<<<<<<<< - * if _write_byte(&writer, b' ') < 0: - * raise - */ - __Pyx_ReraiseException(); __PYX_ERR(0, 146, __pyx_L6_error) - - /* "aiohttp/_http_writer.pyx":145 - * if _write_str(&writer, to_str(key)) < 0: - * raise - * if _write_byte(&writer, b':') < 0: # <<<<<<<<<<<<<< - * raise - * if _write_byte(&writer, b' ') < 0: - */ - } - - /* "aiohttp/_http_writer.pyx":147 - * if _write_byte(&writer, b':') < 0: - * raise - * if _write_byte(&writer, b' ') < 0: # <<<<<<<<<<<<<< - * raise - * if _write_str(&writer, to_str(val)) < 0: - */ - __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), ' ') < 0) != 0); - if (unlikely(__pyx_t_8)) { - - /* "aiohttp/_http_writer.pyx":148 - * raise - * if _write_byte(&writer, b' ') < 0: - * raise # <<<<<<<<<<<<<< - * if _write_str(&writer, to_str(val)) < 0: - * raise - */ - __Pyx_ReraiseException(); __PYX_ERR(0, 148, __pyx_L6_error) - - /* "aiohttp/_http_writer.pyx":147 - * if _write_byte(&writer, b':') < 0: - * raise - * if _write_byte(&writer, b' ') < 0: # <<<<<<<<<<<<<< - * raise - * if _write_str(&writer, to_str(val)) < 0: - */ - } - - /* "aiohttp/_http_writer.pyx":149 - * if _write_byte(&writer, b' ') < 0: - * raise - * if _write_str(&writer, to_str(val)) < 0: # <<<<<<<<<<<<<< - * raise - * if _write_byte(&writer, b'\r') < 0: - */ - __pyx_t_5 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_val); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 149, __pyx_L6_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_str((&__pyx_v_writer), ((PyObject*)__pyx_t_5)) < 0) != 0); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(__pyx_t_8)) { - - /* "aiohttp/_http_writer.pyx":150 - * raise - * if _write_str(&writer, to_str(val)) < 0: - * raise # <<<<<<<<<<<<<< - * if _write_byte(&writer, b'\r') < 0: - * raise - */ - __Pyx_ReraiseException(); __PYX_ERR(0, 150, __pyx_L6_error) - - /* "aiohttp/_http_writer.pyx":149 - * if _write_byte(&writer, b' ') < 0: - * raise - * if _write_str(&writer, to_str(val)) < 0: # <<<<<<<<<<<<<< - * raise - * if _write_byte(&writer, b'\r') < 0: - */ - } - - /* "aiohttp/_http_writer.pyx":151 - * if _write_str(&writer, to_str(val)) < 0: - * raise - * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< - * raise - * if _write_byte(&writer, b'\n') < 0: - */ - __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\r') < 0) != 0); - if (unlikely(__pyx_t_8)) { - - /* "aiohttp/_http_writer.pyx":152 - * raise - * if _write_byte(&writer, b'\r') < 0: - * raise # <<<<<<<<<<<<<< - * if _write_byte(&writer, b'\n') < 0: - * raise - */ - __Pyx_ReraiseException(); __PYX_ERR(0, 152, __pyx_L6_error) - - /* "aiohttp/_http_writer.pyx":151 - * if _write_str(&writer, to_str(val)) < 0: - * raise - * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< - * raise - * if _write_byte(&writer, b'\n') < 0: - */ - } - - /* "aiohttp/_http_writer.pyx":153 - * if _write_byte(&writer, b'\r') < 0: - * raise - * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< - * raise - * - */ - __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\n') < 0) != 0); - if (unlikely(__pyx_t_8)) { - - /* "aiohttp/_http_writer.pyx":154 - * raise - * if _write_byte(&writer, b'\n') < 0: - * raise # <<<<<<<<<<<<<< - * - * if _write_byte(&writer, b'\r') < 0: - */ - __Pyx_ReraiseException(); __PYX_ERR(0, 154, __pyx_L6_error) - - /* "aiohttp/_http_writer.pyx":153 - * if _write_byte(&writer, b'\r') < 0: - * raise - * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< - * raise - * - */ - } - } - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_http_writer.pyx":156 - * raise - * - * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< - * raise - * if _write_byte(&writer, b'\n') < 0: - */ - __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\r') < 0) != 0); - if (unlikely(__pyx_t_8)) { - - /* "aiohttp/_http_writer.pyx":157 - * - * if _write_byte(&writer, b'\r') < 0: - * raise # <<<<<<<<<<<<<< - * if _write_byte(&writer, b'\n') < 0: - * raise - */ - __Pyx_ReraiseException(); __PYX_ERR(0, 157, __pyx_L6_error) - - /* "aiohttp/_http_writer.pyx":156 - * raise - * - * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< - * raise - * if _write_byte(&writer, b'\n') < 0: - */ - } - - /* "aiohttp/_http_writer.pyx":158 - * if _write_byte(&writer, b'\r') < 0: - * raise - * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< - * raise - * - */ - __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\n') < 0) != 0); - if (unlikely(__pyx_t_8)) { - - /* "aiohttp/_http_writer.pyx":159 - * raise - * if _write_byte(&writer, b'\n') < 0: - * raise # <<<<<<<<<<<<<< - * - * return PyBytes_FromStringAndSize(writer.buf, writer.pos) - */ - __Pyx_ReraiseException(); __PYX_ERR(0, 159, __pyx_L6_error) - - /* "aiohttp/_http_writer.pyx":158 - * if _write_byte(&writer, b'\r') < 0: - * raise - * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< - * raise - * - */ - } - - /* "aiohttp/_http_writer.pyx":161 - * raise - * - * return PyBytes_FromStringAndSize(writer.buf, writer.pos) # <<<<<<<<<<<<<< - * finally: - * _release_writer(&writer) - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyBytes_FromStringAndSize(__pyx_v_writer.buf, __pyx_v_writer.pos); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 161, __pyx_L6_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L5_return; - } - - /* "aiohttp/_http_writer.pyx":163 - * return PyBytes_FromStringAndSize(writer.buf, writer.pos) - * finally: - * _release_writer(&writer) # <<<<<<<<<<<<<< - */ - /*finally:*/ { - __pyx_L6_error:; - /*exception exit:*/{ - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_13, &__pyx_t_14, &__pyx_t_15); - if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12) < 0)) __Pyx_ErrFetch(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); - __Pyx_XGOTREF(__pyx_t_10); - __Pyx_XGOTREF(__pyx_t_11); - __Pyx_XGOTREF(__pyx_t_12); - __Pyx_XGOTREF(__pyx_t_13); - __Pyx_XGOTREF(__pyx_t_14); - __Pyx_XGOTREF(__pyx_t_15); - __pyx_t_4 = __pyx_lineno; __pyx_t_7 = __pyx_clineno; __pyx_t_9 = __pyx_filename; - { - __pyx_f_7aiohttp_12_http_writer__release_writer((&__pyx_v_writer)); - } - if (PY_MAJOR_VERSION >= 3) { - __Pyx_XGIVEREF(__pyx_t_13); - __Pyx_XGIVEREF(__pyx_t_14); - __Pyx_XGIVEREF(__pyx_t_15); - __Pyx_ExceptionReset(__pyx_t_13, __pyx_t_14, __pyx_t_15); - } - __Pyx_XGIVEREF(__pyx_t_10); - __Pyx_XGIVEREF(__pyx_t_11); - __Pyx_XGIVEREF(__pyx_t_12); - __Pyx_ErrRestore(__pyx_t_10, __pyx_t_11, __pyx_t_12); - __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; - __pyx_lineno = __pyx_t_4; __pyx_clineno = __pyx_t_7; __pyx_filename = __pyx_t_9; - goto __pyx_L1_error; - } - __pyx_L5_return: { - __pyx_t_15 = __pyx_r; - __pyx_r = 0; - __pyx_f_7aiohttp_12_http_writer__release_writer((&__pyx_v_writer)); - __pyx_r = __pyx_t_15; - __pyx_t_15 = 0; - goto __pyx_L0; - } - } - - /* "aiohttp/_http_writer.pyx":122 - * - * - * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< - * cdef Writer writer - * cdef object key - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("aiohttp._http_writer._serialize_headers", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_key); - __Pyx_XDECREF(__pyx_v_val); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyMethodDef __pyx_methods[] = { - {0, 0, 0, 0} -}; - -#if PY_MAJOR_VERSION >= 3 -#if CYTHON_PEP489_MULTI_PHASE_INIT -static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ -static int __pyx_pymod_exec__http_writer(PyObject* module); /*proto*/ -static PyModuleDef_Slot __pyx_moduledef_slots[] = { - {Py_mod_create, (void*)__pyx_pymod_create}, - {Py_mod_exec, (void*)__pyx_pymod_exec__http_writer}, - {0, NULL} -}; -#endif - -static struct PyModuleDef __pyx_moduledef = { - PyModuleDef_HEAD_INIT, - "_http_writer", - 0, /* m_doc */ - #if CYTHON_PEP489_MULTI_PHASE_INIT - 0, /* m_size */ - #else - -1, /* m_size */ - #endif - __pyx_methods /* m_methods */, - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_moduledef_slots, /* m_slots */ - #else - NULL, /* m_reload */ - #endif - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ -}; -#endif -#ifndef CYTHON_SMALL_CODE -#if defined(__clang__) - #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) - #define CYTHON_SMALL_CODE __attribute__((cold)) -#else - #define CYTHON_SMALL_CODE -#endif -#endif - -static __Pyx_StringTabEntry __pyx_string_tab[] = { - {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0}, - {&__pyx_kp_u_Cannot_serialize_non_str_key_r, __pyx_k_Cannot_serialize_non_str_key_r, sizeof(__pyx_k_Cannot_serialize_non_str_key_r), 0, 1, 0, 0}, - {&__pyx_kp_u_Newline_or_carriage_return_chara, __pyx_k_Newline_or_carriage_return_chara, sizeof(__pyx_k_Newline_or_carriage_return_chara), 0, 1, 0, 0}, - {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, - {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, - {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0}, - {&__pyx_n_s_aiohttp__http_writer, __pyx_k_aiohttp__http_writer, sizeof(__pyx_k_aiohttp__http_writer), 0, 0, 1, 1}, - {&__pyx_kp_s_aiohttp__http_writer_pyx, __pyx_k_aiohttp__http_writer_pyx, sizeof(__pyx_k_aiohttp__http_writer_pyx), 0, 0, 1, 0}, - {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, - {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, - {&__pyx_n_s_headers, __pyx_k_headers, sizeof(__pyx_k_headers), 0, 0, 1, 1}, - {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, - {&__pyx_n_s_istr, __pyx_k_istr, sizeof(__pyx_k_istr), 0, 0, 1, 1}, - {&__pyx_n_s_items, __pyx_k_items, sizeof(__pyx_k_items), 0, 0, 1, 1}, - {&__pyx_n_s_key, __pyx_k_key, sizeof(__pyx_k_key), 0, 0, 1, 1}, - {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, - {&__pyx_n_s_multidict, __pyx_k_multidict, sizeof(__pyx_k_multidict), 0, 0, 1, 1}, - {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, - {&__pyx_n_s_ret, __pyx_k_ret, sizeof(__pyx_k_ret), 0, 0, 1, 1}, - {&__pyx_n_s_serialize_headers, __pyx_k_serialize_headers, sizeof(__pyx_k_serialize_headers), 0, 0, 1, 1}, - {&__pyx_n_s_status_line, __pyx_k_status_line, sizeof(__pyx_k_status_line), 0, 0, 1, 1}, - {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, - {&__pyx_n_s_val, __pyx_k_val, sizeof(__pyx_k_val), 0, 0, 1, 1}, - {&__pyx_n_s_writer, __pyx_k_writer, sizeof(__pyx_k_writer), 0, 0, 1, 1}, - {0, 0, 0, 0, 0, 0, 0} -}; -static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 109, __pyx_L1_error) - __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 116, __pyx_L1_error) - return 0; - __pyx_L1_error:; - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - - /* "aiohttp/_http_writer.pyx":116 - * cdef void _safe_header(str string) except *: - * if "\r" in string or "\n" in string: - * raise ValueError( # <<<<<<<<<<<<<< - * "Newline or carriage return character detected in HTTP status message or " - * "header. This is a potential security issue." - */ - __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_Newline_or_carriage_return_chara); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 116, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__3); - __Pyx_GIVEREF(__pyx_tuple__3); - - /* "aiohttp/_http_writer.pyx":122 - * - * - * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< - * cdef Writer writer - * cdef object key - */ - __pyx_tuple__4 = PyTuple_Pack(6, __pyx_n_s_status_line, __pyx_n_s_headers, __pyx_n_s_writer, __pyx_n_s_key, __pyx_n_s_val, __pyx_n_s_ret); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 122, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__4); - __Pyx_GIVEREF(__pyx_tuple__4); - __pyx_codeobj__5 = (PyObject*)__Pyx_PyCode_New(2, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__4, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_aiohttp__http_writer_pyx, __pyx_n_s_serialize_headers, 122, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__5)) __PYX_ERR(0, 122, __pyx_L1_error) - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_RefNannyFinishContext(); - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { - if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); - return 0; - __pyx_L1_error:; - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ - -static int __Pyx_modinit_global_init_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); - /*--- Global init code ---*/ - __pyx_v_7aiohttp_12_http_writer__istr = Py_None; Py_INCREF(Py_None); - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_variable_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); - /*--- Variable export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); - /*--- Function export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_type_init_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); - /*--- Type init code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_type_import_code(void) { - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); - /*--- Type import code ---*/ - __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", - #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 - sizeof(PyTypeObject), - #else - sizeof(PyHeapTypeObject), - #endif - __Pyx_ImportType_CheckSize_Warn); - if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(1, 9, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_RefNannyFinishContext(); - return -1; -} - -static int __Pyx_modinit_variable_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); - /*--- Variable import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); - /*--- Function import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - - -#ifndef CYTHON_NO_PYINIT_EXPORT -#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC -#elif PY_MAJOR_VERSION < 3 -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" void -#else -#define __Pyx_PyMODINIT_FUNC void -#endif -#else -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * -#else -#define __Pyx_PyMODINIT_FUNC PyObject * -#endif -#endif - - -#if PY_MAJOR_VERSION < 3 -__Pyx_PyMODINIT_FUNC init_http_writer(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC init_http_writer(void) -#else -__Pyx_PyMODINIT_FUNC PyInit__http_writer(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC PyInit__http_writer(void) -#if CYTHON_PEP489_MULTI_PHASE_INIT -{ - return PyModuleDef_Init(&__pyx_moduledef); -} -static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { - #if PY_VERSION_HEX >= 0x030700A1 - static PY_INT64_T main_interpreter_id = -1; - PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); - if (main_interpreter_id == -1) { - main_interpreter_id = current_id; - return (unlikely(current_id == -1)) ? -1 : 0; - } else if (unlikely(main_interpreter_id != current_id)) - #else - static PyInterpreterState *main_interpreter = NULL; - PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; - if (!main_interpreter) { - main_interpreter = current_interpreter; - } else if (unlikely(main_interpreter != current_interpreter)) - #endif - { - PyErr_SetString( - PyExc_ImportError, - "Interpreter change detected - this module can only be loaded into one interpreter per process."); - return -1; - } - return 0; -} -static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { - PyObject *value = PyObject_GetAttrString(spec, from_name); - int result = 0; - if (likely(value)) { - if (allow_none || value != Py_None) { - result = PyDict_SetItemString(moddict, to_name, value); - } - Py_DECREF(value); - } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Clear(); - } else { - result = -1; - } - return result; -} -static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { - PyObject *module = NULL, *moddict, *modname; - if (__Pyx_check_single_interpreter()) - return NULL; - if (__pyx_m) - return __Pyx_NewRef(__pyx_m); - modname = PyObject_GetAttrString(spec, "name"); - if (unlikely(!modname)) goto bad; - module = PyModule_NewObject(modname); - Py_DECREF(modname); - if (unlikely(!module)) goto bad; - moddict = PyModule_GetDict(module); - if (unlikely(!moddict)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; - return module; -bad: - Py_XDECREF(module); - return NULL; -} - - -static CYTHON_SMALL_CODE int __pyx_pymod_exec__http_writer(PyObject *__pyx_pyinit_module) -#endif -#endif -{ - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannyDeclarations - #if CYTHON_PEP489_MULTI_PHASE_INIT - if (__pyx_m) { - if (__pyx_m == __pyx_pyinit_module) return 0; - PyErr_SetString(PyExc_RuntimeError, "Module '_http_writer' has already been imported. Re-initialisation is not supported."); - return -1; - } - #elif PY_MAJOR_VERSION >= 3 - if (__pyx_m) return __Pyx_NewRef(__pyx_m); - #endif - #if CYTHON_REFNANNY -__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); -if (!__Pyx_RefNanny) { - PyErr_Clear(); - __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); - if (!__Pyx_RefNanny) - Py_FatalError("failed to import 'refnanny' module"); -} -#endif - __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__http_writer(void)", 0); - if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #ifdef __Pxy_PyFrame_Initialize_Offsets - __Pxy_PyFrame_Initialize_Offsets(); - #endif - __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) - #ifdef __Pyx_CyFunction_USED - if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_FusedFunction_USED - if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Coroutine_USED - if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Generator_USED - if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_AsyncGen_USED - if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_StopAsyncIteration_USED - if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - /*--- Library function declarations ---*/ - /*--- Threads initialization code ---*/ - #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS - PyEval_InitThreads(); - #endif - /*--- Module creation code ---*/ - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_m = __pyx_pyinit_module; - Py_INCREF(__pyx_m); - #else - #if PY_MAJOR_VERSION < 3 - __pyx_m = Py_InitModule4("_http_writer", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); - #else - __pyx_m = PyModule_Create(&__pyx_moduledef); - #endif - if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_d); - __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_b); - __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_cython_runtime); - if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); - /*--- Initialize various global constants etc. ---*/ - if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) - if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - if (__pyx_module_is_main_aiohttp___http_writer) { - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - } - #if PY_MAJOR_VERSION >= 3 - { - PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) - if (!PyDict_GetItemString(modules, "aiohttp._http_writer")) { - if (unlikely(PyDict_SetItemString(modules, "aiohttp._http_writer", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) - } - } - #endif - /*--- Builtin init code ---*/ - if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - /*--- Constants init code ---*/ - if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - /*--- Global type/function init code ---*/ - (void)__Pyx_modinit_global_init_code(); - (void)__Pyx_modinit_variable_export_code(); - (void)__Pyx_modinit_function_export_code(); - (void)__Pyx_modinit_type_init_code(); - if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) - (void)__Pyx_modinit_variable_import_code(); - (void)__Pyx_modinit_function_import_code(); - /*--- Execution code ---*/ - #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) - if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - - /* "aiohttp/_http_writer.pyx":8 - * from libc.string cimport memcpy - * - * from multidict import istr # <<<<<<<<<<<<<< - * - * DEF BUF_SIZE = 16 * 1024 # 16KiB - */ - __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_INCREF(__pyx_n_s_istr); - __Pyx_GIVEREF(__pyx_n_s_istr); - PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_istr); - __pyx_t_2 = __Pyx_Import(__pyx_n_s_multidict, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_istr); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_istr, __pyx_t_1) < 0) __PYX_ERR(0, 8, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "aiohttp/_http_writer.pyx":13 - * cdef char BUFFER[BUF_SIZE] - * - * cdef object _istr = istr # <<<<<<<<<<<<<< - * - * - */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_istr); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 13, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_writer__istr); - __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_writer__istr, __pyx_t_2); - __Pyx_GIVEREF(__pyx_t_2); - __pyx_t_2 = 0; - - /* "aiohttp/_http_writer.pyx":122 - * - * - * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< - * cdef Writer writer - * cdef object key - */ - __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7aiohttp_12_http_writer_1_serialize_headers, NULL, __pyx_n_s_aiohttp__http_writer); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 122, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_serialize_headers, __pyx_t_2) < 0) __PYX_ERR(0, 122, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "aiohttp/_http_writer.pyx":1 - * from cpython.bytes cimport PyBytes_FromStringAndSize # <<<<<<<<<<<<<< - * from cpython.exc cimport PyErr_NoMemory - * from cpython.mem cimport PyMem_Free, PyMem_Malloc, PyMem_Realloc - */ - __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /*--- Wrapped vars code ---*/ - - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - if (__pyx_m) { - if (__pyx_d) { - __Pyx_AddTraceback("init aiohttp._http_writer", __pyx_clineno, __pyx_lineno, __pyx_filename); - } - Py_CLEAR(__pyx_m); - } else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ImportError, "init aiohttp._http_writer"); - } - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - #if CYTHON_PEP489_MULTI_PHASE_INIT - return (__pyx_m != NULL) ? 0 : -1; - #elif PY_MAJOR_VERSION >= 3 - return __pyx_m; - #else - return; - #endif -} - -/* --- Runtime support code --- */ -/* Refnanny */ -#if CYTHON_REFNANNY -static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { - PyObject *m = NULL, *p = NULL; - void *r = NULL; - m = PyImport_ImportModule(modname); - if (!m) goto end; - p = PyObject_GetAttrString(m, "RefNannyAPI"); - if (!p) goto end; - r = PyLong_AsVoidPtr(p); -end: - Py_XDECREF(p); - Py_XDECREF(m); - return (__Pyx_RefNannyAPIStruct *)r; -} -#endif - -/* PyObjectGetAttrStr */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { - PyTypeObject* tp = Py_TYPE(obj); - if (likely(tp->tp_getattro)) - return tp->tp_getattro(obj, attr_name); -#if PY_MAJOR_VERSION < 3 - if (likely(tp->tp_getattr)) - return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); -#endif - return PyObject_GetAttr(obj, attr_name); -} -#endif - -/* GetBuiltinName */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name) { - PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); - if (unlikely(!result)) { - PyErr_Format(PyExc_NameError, -#if PY_MAJOR_VERSION >= 3 - "name '%U' is not defined", name); -#else - "name '%.200s' is not defined", PyString_AS_STRING(name)); -#endif - } - return result; -} - -/* PyErrFetchRestore */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - tmp_type = tstate->curexc_type; - tmp_value = tstate->curexc_value; - tmp_tb = tstate->curexc_traceback; - tstate->curexc_type = type; - tstate->curexc_value = value; - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -} -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - *type = tstate->curexc_type; - *value = tstate->curexc_value; - *tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -} -#endif - -/* WriteUnraisableException */ -static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno, - CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename, - int full_traceback, CYTHON_UNUSED int nogil) { - PyObject *old_exc, *old_val, *old_tb; - PyObject *ctx; - __Pyx_PyThreadState_declare -#ifdef WITH_THREAD - PyGILState_STATE state; - if (nogil) - state = PyGILState_Ensure(); -#ifdef _MSC_VER - else state = (PyGILState_STATE)-1; -#endif -#endif - __Pyx_PyThreadState_assign - __Pyx_ErrFetch(&old_exc, &old_val, &old_tb); - if (full_traceback) { - Py_XINCREF(old_exc); - Py_XINCREF(old_val); - Py_XINCREF(old_tb); - __Pyx_ErrRestore(old_exc, old_val, old_tb); - PyErr_PrintEx(1); - } - #if PY_MAJOR_VERSION < 3 - ctx = PyString_FromString(name); - #else - ctx = PyUnicode_FromString(name); - #endif - __Pyx_ErrRestore(old_exc, old_val, old_tb); - if (!ctx) { - PyErr_WriteUnraisable(Py_None); - } else { - PyErr_WriteUnraisable(ctx); - Py_DECREF(ctx); - } -#ifdef WITH_THREAD - if (nogil) - PyGILState_Release(state); -#endif -} - -/* unicode_iter */ -static CYTHON_INLINE int __Pyx_init_unicode_iteration( - PyObject* ustring, Py_ssize_t *length, void** data, int *kind) { -#if CYTHON_PEP393_ENABLED - if (unlikely(__Pyx_PyUnicode_READY(ustring) < 0)) return -1; - *kind = PyUnicode_KIND(ustring); - *length = PyUnicode_GET_LENGTH(ustring); - *data = PyUnicode_DATA(ustring); -#else - *kind = 0; - *length = PyUnicode_GET_SIZE(ustring); - *data = (void*)PyUnicode_AS_UNICODE(ustring); -#endif - return 0; -} - -/* PyCFunctionFastCall */ -#if CYTHON_FAST_PYCCALL -static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { - PyCFunctionObject *func = (PyCFunctionObject*)func_obj; - PyCFunction meth = PyCFunction_GET_FUNCTION(func); - PyObject *self = PyCFunction_GET_SELF(func); - int flags = PyCFunction_GET_FLAGS(func); - assert(PyCFunction_Check(func)); - assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); - assert(nargs >= 0); - assert(nargs == 0 || args != NULL); - /* _PyCFunction_FastCallDict() must not be called with an exception set, - because it may clear it (directly or indirectly) and so the - caller loses its exception */ - assert(!PyErr_Occurred()); - if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { - return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); - } else { - return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); - } -} -#endif - -/* PyFunctionFastCall */ -#if CYTHON_FAST_PYCALL -static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, - PyObject *globals) { - PyFrameObject *f; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject **fastlocals; - Py_ssize_t i; - PyObject *result; - assert(globals != NULL); - /* XXX Perhaps we should create a specialized - PyFrame_New() that doesn't take locals, but does - take builtins without sanity checking them. - */ - assert(tstate != NULL); - f = PyFrame_New(tstate, co, globals, NULL); - if (f == NULL) { - return NULL; - } - fastlocals = __Pyx_PyFrame_GetLocalsplus(f); - for (i = 0; i < na; i++) { - Py_INCREF(*args); - fastlocals[i] = *args++; - } - result = PyEval_EvalFrameEx(f,0); - ++tstate->recursion_depth; - Py_DECREF(f); - --tstate->recursion_depth; - return result; -} -#if 1 || PY_VERSION_HEX < 0x030600B1 -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *globals = PyFunction_GET_GLOBALS(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - PyObject *closure; -#if PY_MAJOR_VERSION >= 3 - PyObject *kwdefs; -#endif - PyObject *kwtuple, **k; - PyObject **d; - Py_ssize_t nd; - Py_ssize_t nk; - PyObject *result; - assert(kwargs == NULL || PyDict_Check(kwargs)); - nk = kwargs ? PyDict_Size(kwargs) : 0; - if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { - return NULL; - } - if ( -#if PY_MAJOR_VERSION >= 3 - co->co_kwonlyargcount == 0 && -#endif - likely(kwargs == NULL || nk == 0) && - co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { - if (argdefs == NULL && co->co_argcount == nargs) { - result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); - goto done; - } - else if (nargs == 0 && argdefs != NULL - && co->co_argcount == Py_SIZE(argdefs)) { - /* function called with no arguments, but all parameters have - a default value: use default values as arguments .*/ - args = &PyTuple_GET_ITEM(argdefs, 0); - result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); - goto done; - } - } - if (kwargs != NULL) { - Py_ssize_t pos, i; - kwtuple = PyTuple_New(2 * nk); - if (kwtuple == NULL) { - result = NULL; - goto done; - } - k = &PyTuple_GET_ITEM(kwtuple, 0); - pos = i = 0; - while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { - Py_INCREF(k[i]); - Py_INCREF(k[i+1]); - i += 2; - } - nk = i / 2; - } - else { - kwtuple = NULL; - k = NULL; - } - closure = PyFunction_GET_CLOSURE(func); -#if PY_MAJOR_VERSION >= 3 - kwdefs = PyFunction_GET_KW_DEFAULTS(func); -#endif - if (argdefs != NULL) { - d = &PyTuple_GET_ITEM(argdefs, 0); - nd = Py_SIZE(argdefs); - } - else { - d = NULL; - nd = 0; - } -#if PY_MAJOR_VERSION >= 3 - result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, kwdefs, closure); -#else - result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, closure); -#endif - Py_XDECREF(kwtuple); -done: - Py_LeaveRecursiveCall(); - return result; -} -#endif -#endif - -/* PyObjectCall */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { - PyObject *result; - ternaryfunc call = Py_TYPE(func)->tp_call; - if (unlikely(!call)) - return PyObject_Call(func, arg, kw); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = (*call)(func, arg, kw); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* PyObjectCall2Args */ -static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) { - PyObject *args, *result = NULL; - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(function)) { - PyObject *args[2] = {arg1, arg2}; - return __Pyx_PyFunction_FastCall(function, args, 2); - } - #endif - #if CYTHON_FAST_PYCCALL - if (__Pyx_PyFastCFunction_Check(function)) { - PyObject *args[2] = {arg1, arg2}; - return __Pyx_PyCFunction_FastCall(function, args, 2); - } - #endif - args = PyTuple_New(2); - if (unlikely(!args)) goto done; - Py_INCREF(arg1); - PyTuple_SET_ITEM(args, 0, arg1); - Py_INCREF(arg2); - PyTuple_SET_ITEM(args, 1, arg2); - Py_INCREF(function); - result = __Pyx_PyObject_Call(function, args, NULL); - Py_DECREF(args); - Py_DECREF(function); -done: - return result; -} - -/* PyObjectCallMethO */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { - PyObject *self, *result; - PyCFunction cfunc; - cfunc = PyCFunction_GET_FUNCTION(func); - self = PyCFunction_GET_SELF(func); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = cfunc(self, arg); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* PyObjectCallOneArg */ -#if CYTHON_COMPILING_IN_CPYTHON -static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *result; - PyObject *args = PyTuple_New(1); - if (unlikely(!args)) return NULL; - Py_INCREF(arg); - PyTuple_SET_ITEM(args, 0, arg); - result = __Pyx_PyObject_Call(func, args, NULL); - Py_DECREF(args); - return result; -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { -#if CYTHON_FAST_PYCALL - if (PyFunction_Check(func)) { - return __Pyx_PyFunction_FastCall(func, &arg, 1); - } -#endif - if (likely(PyCFunction_Check(func))) { - if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { - return __Pyx_PyObject_CallMethO(func, arg); -#if CYTHON_FAST_PYCCALL - } else if (__Pyx_PyFastCFunction_Check(func)) { - return __Pyx_PyCFunction_FastCall(func, &arg, 1); -#endif - } - } - return __Pyx__PyObject_CallOneArg(func, arg); -} -#else -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *result; - PyObject *args = PyTuple_Pack(1, arg); - if (unlikely(!args)) return NULL; - result = __Pyx_PyObject_Call(func, args, NULL); - Py_DECREF(args); - return result; -} -#endif - -/* RaiseException */ -#if PY_MAJOR_VERSION < 3 -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, - CYTHON_UNUSED PyObject *cause) { - __Pyx_PyThreadState_declare - Py_XINCREF(type); - if (!value || value == Py_None) - value = NULL; - else - Py_INCREF(value); - if (!tb || tb == Py_None) - tb = NULL; - else { - Py_INCREF(tb); - if (!PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto raise_error; - } - } - if (PyType_Check(type)) { -#if CYTHON_COMPILING_IN_PYPY - if (!value) { - Py_INCREF(Py_None); - value = Py_None; - } -#endif - PyErr_NormalizeException(&type, &value, &tb); - } else { - if (value) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto raise_error; - } - value = type; - type = (PyObject*) Py_TYPE(type); - Py_INCREF(type); - if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto raise_error; - } - } - __Pyx_PyThreadState_assign - __Pyx_ErrRestore(type, value, tb); - return; -raise_error: - Py_XDECREF(value); - Py_XDECREF(type); - Py_XDECREF(tb); - return; -} -#else -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { - PyObject* owned_instance = NULL; - if (tb == Py_None) { - tb = 0; - } else if (tb && !PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto bad; - } - if (value == Py_None) - value = 0; - if (PyExceptionInstance_Check(type)) { - if (value) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto bad; - } - value = type; - type = (PyObject*) Py_TYPE(value); - } else if (PyExceptionClass_Check(type)) { - PyObject *instance_class = NULL; - if (value && PyExceptionInstance_Check(value)) { - instance_class = (PyObject*) Py_TYPE(value); - if (instance_class != type) { - int is_subclass = PyObject_IsSubclass(instance_class, type); - if (!is_subclass) { - instance_class = NULL; - } else if (unlikely(is_subclass == -1)) { - goto bad; - } else { - type = instance_class; - } - } - } - if (!instance_class) { - PyObject *args; - if (!value) - args = PyTuple_New(0); - else if (PyTuple_Check(value)) { - Py_INCREF(value); - args = value; - } else - args = PyTuple_Pack(1, value); - if (!args) - goto bad; - owned_instance = PyObject_Call(type, args, NULL); - Py_DECREF(args); - if (!owned_instance) - goto bad; - value = owned_instance; - if (!PyExceptionInstance_Check(value)) { - PyErr_Format(PyExc_TypeError, - "calling %R should have returned an instance of " - "BaseException, not %R", - type, Py_TYPE(value)); - goto bad; - } - } - } else { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto bad; - } - if (cause) { - PyObject *fixed_cause; - if (cause == Py_None) { - fixed_cause = NULL; - } else if (PyExceptionClass_Check(cause)) { - fixed_cause = PyObject_CallObject(cause, NULL); - if (fixed_cause == NULL) - goto bad; - } else if (PyExceptionInstance_Check(cause)) { - fixed_cause = cause; - Py_INCREF(fixed_cause); - } else { - PyErr_SetString(PyExc_TypeError, - "exception causes must derive from " - "BaseException"); - goto bad; - } - PyException_SetCause(value, fixed_cause); - } - PyErr_SetObject(type, value); - if (tb) { -#if CYTHON_COMPILING_IN_PYPY - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); - Py_INCREF(tb); - PyErr_Restore(tmp_type, tmp_value, tb); - Py_XDECREF(tmp_tb); -#else - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject* tmp_tb = tstate->curexc_traceback; - if (tb != tmp_tb) { - Py_INCREF(tb); - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_tb); - } -#endif - } -bad: - Py_XDECREF(owned_instance); - return; -} -#endif - -/* RaiseArgTupleInvalid */ -static void __Pyx_RaiseArgtupleInvalid( - const char* func_name, - int exact, - Py_ssize_t num_min, - Py_ssize_t num_max, - Py_ssize_t num_found) -{ - Py_ssize_t num_expected; - const char *more_or_less; - if (num_found < num_min) { - num_expected = num_min; - more_or_less = "at least"; - } else { - num_expected = num_max; - more_or_less = "at most"; - } - if (exact) { - more_or_less = "exactly"; - } - PyErr_Format(PyExc_TypeError, - "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", - func_name, more_or_less, num_expected, - (num_expected == 1) ? "" : "s", num_found); -} - -/* RaiseDoubleKeywords */ -static void __Pyx_RaiseDoubleKeywordsError( - const char* func_name, - PyObject* kw_name) -{ - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION >= 3 - "%s() got multiple values for keyword argument '%U'", func_name, kw_name); - #else - "%s() got multiple values for keyword argument '%s'", func_name, - PyString_AsString(kw_name)); - #endif -} - -/* ParseKeywords */ -static int __Pyx_ParseOptionalKeywords( - PyObject *kwds, - PyObject **argnames[], - PyObject *kwds2, - PyObject *values[], - Py_ssize_t num_pos_args, - const char* function_name) -{ - PyObject *key = 0, *value = 0; - Py_ssize_t pos = 0; - PyObject*** name; - PyObject*** first_kw_arg = argnames + num_pos_args; - while (PyDict_Next(kwds, &pos, &key, &value)) { - name = first_kw_arg; - while (*name && (**name != key)) name++; - if (*name) { - values[name-argnames] = value; - continue; - } - name = first_kw_arg; - #if PY_MAJOR_VERSION < 3 - if (likely(PyString_Check(key))) { - while (*name) { - if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) - && _PyString_Eq(**name, key)) { - values[name-argnames] = value; - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - if ((**argname == key) || ( - (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) - && _PyString_Eq(**argname, key))) { - goto arg_passed_twice; - } - argname++; - } - } - } else - #endif - if (likely(PyUnicode_Check(key))) { - while (*name) { - int cmp = (**name == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : - #endif - PyUnicode_Compare(**name, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) { - values[name-argnames] = value; - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - int cmp = (**argname == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : - #endif - PyUnicode_Compare(**argname, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) goto arg_passed_twice; - argname++; - } - } - } else - goto invalid_keyword_type; - if (kwds2) { - if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; - } else { - goto invalid_keyword; - } - } - return 0; -arg_passed_twice: - __Pyx_RaiseDoubleKeywordsError(function_name, key); - goto bad; -invalid_keyword_type: - PyErr_Format(PyExc_TypeError, - "%.200s() keywords must be strings", function_name); - goto bad; -invalid_keyword: - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION < 3 - "%.200s() got an unexpected keyword argument '%.200s'", - function_name, PyString_AsString(key)); - #else - "%s() got an unexpected keyword argument '%U'", - function_name, key); - #endif -bad: - return -1; -} - -/* ArgTypeTest */ -static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) -{ - if (unlikely(!type)) { - PyErr_SetString(PyExc_SystemError, "Missing type object"); - return 0; - } - else if (exact) { - #if PY_MAJOR_VERSION == 2 - if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; - #endif - } - else { - if (likely(__Pyx_TypeCheck(obj, type))) return 1; - } - PyErr_Format(PyExc_TypeError, - "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", - name, type->tp_name, Py_TYPE(obj)->tp_name); - return 0; -} - -/* IterFinish */ -static CYTHON_INLINE int __Pyx_IterFinish(void) { -#if CYTHON_FAST_THREAD_STATE - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject* exc_type = tstate->curexc_type; - if (unlikely(exc_type)) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) { - PyObject *exc_value, *exc_tb; - exc_value = tstate->curexc_value; - exc_tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; - Py_DECREF(exc_type); - Py_XDECREF(exc_value); - Py_XDECREF(exc_tb); - return 0; - } else { - return -1; - } - } - return 0; -#else - if (unlikely(PyErr_Occurred())) { - if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) { - PyErr_Clear(); - return 0; - } else { - return -1; - } - } - return 0; -#endif -} - -/* PyObjectCallNoArg */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { -#if CYTHON_FAST_PYCALL - if (PyFunction_Check(func)) { - return __Pyx_PyFunction_FastCall(func, NULL, 0); - } -#endif -#ifdef __Pyx_CyFunction_USED - if (likely(PyCFunction_Check(func) || __Pyx_CyFunction_Check(func))) -#else - if (likely(PyCFunction_Check(func))) -#endif - { - if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) { - return __Pyx_PyObject_CallMethO(func, NULL); - } - } - return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL); -} -#endif - -/* PyObjectGetMethod */ -static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { - PyObject *attr; -#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP - PyTypeObject *tp = Py_TYPE(obj); - PyObject *descr; - descrgetfunc f = NULL; - PyObject **dictptr, *dict; - int meth_found = 0; - assert (*method == NULL); - if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { - attr = __Pyx_PyObject_GetAttrStr(obj, name); - goto try_unpack; - } - if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { - return 0; - } - descr = _PyType_Lookup(tp, name); - if (likely(descr != NULL)) { - Py_INCREF(descr); -#if PY_MAJOR_VERSION >= 3 - #ifdef __Pyx_CyFunction_USED - if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) - #else - if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type))) - #endif -#else - #ifdef __Pyx_CyFunction_USED - if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) - #else - if (likely(PyFunction_Check(descr))) - #endif -#endif - { - meth_found = 1; - } else { - f = Py_TYPE(descr)->tp_descr_get; - if (f != NULL && PyDescr_IsData(descr)) { - attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); - Py_DECREF(descr); - goto try_unpack; - } - } - } - dictptr = _PyObject_GetDictPtr(obj); - if (dictptr != NULL && (dict = *dictptr) != NULL) { - Py_INCREF(dict); - attr = __Pyx_PyDict_GetItemStr(dict, name); - if (attr != NULL) { - Py_INCREF(attr); - Py_DECREF(dict); - Py_XDECREF(descr); - goto try_unpack; - } - Py_DECREF(dict); - } - if (meth_found) { - *method = descr; - return 1; - } - if (f != NULL) { - attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); - Py_DECREF(descr); - goto try_unpack; - } - if (descr != NULL) { - *method = descr; - return 0; - } - PyErr_Format(PyExc_AttributeError, -#if PY_MAJOR_VERSION >= 3 - "'%.50s' object has no attribute '%U'", - tp->tp_name, name); -#else - "'%.50s' object has no attribute '%.400s'", - tp->tp_name, PyString_AS_STRING(name)); -#endif - return 0; -#else - attr = __Pyx_PyObject_GetAttrStr(obj, name); - goto try_unpack; -#endif -try_unpack: -#if CYTHON_UNPACK_METHODS - if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { - PyObject *function = PyMethod_GET_FUNCTION(attr); - Py_INCREF(function); - Py_DECREF(attr); - *method = function; - return 1; - } -#endif - *method = attr; - return 0; -} - -/* PyObjectCallMethod0 */ -static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { - PyObject *method = NULL, *result = NULL; - int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); - if (likely(is_method)) { - result = __Pyx_PyObject_CallOneArg(method, obj); - Py_DECREF(method); - return result; - } - if (unlikely(!method)) goto bad; - result = __Pyx_PyObject_CallNoArg(method); - Py_DECREF(method); -bad: - return result; -} - -/* RaiseNeedMoreValuesToUnpack */ -static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { - PyErr_Format(PyExc_ValueError, - "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", - index, (index == 1) ? "" : "s"); -} - -/* RaiseTooManyValuesToUnpack */ -static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { - PyErr_Format(PyExc_ValueError, - "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); -} - -/* UnpackItemEndCheck */ -static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { - if (unlikely(retval)) { - Py_DECREF(retval); - __Pyx_RaiseTooManyValuesError(expected); - return -1; - } else { - return __Pyx_IterFinish(); - } - return 0; -} - -/* RaiseNoneIterError */ -static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); -} - -/* UnpackTupleError */ -static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) { - if (t == Py_None) { - __Pyx_RaiseNoneNotIterableError(); - } else if (PyTuple_GET_SIZE(t) < index) { - __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t)); - } else { - __Pyx_RaiseTooManyValuesError(index); - } -} - -/* UnpackTuple2 */ -static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( - PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, int decref_tuple) { - PyObject *value1 = NULL, *value2 = NULL; -#if CYTHON_COMPILING_IN_PYPY - value1 = PySequence_ITEM(tuple, 0); if (unlikely(!value1)) goto bad; - value2 = PySequence_ITEM(tuple, 1); if (unlikely(!value2)) goto bad; -#else - value1 = PyTuple_GET_ITEM(tuple, 0); Py_INCREF(value1); - value2 = PyTuple_GET_ITEM(tuple, 1); Py_INCREF(value2); -#endif - if (decref_tuple) { - Py_DECREF(tuple); - } - *pvalue1 = value1; - *pvalue2 = value2; - return 0; -#if CYTHON_COMPILING_IN_PYPY -bad: - Py_XDECREF(value1); - Py_XDECREF(value2); - if (decref_tuple) { Py_XDECREF(tuple); } - return -1; -#endif -} -static int __Pyx_unpack_tuple2_generic(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, - int has_known_size, int decref_tuple) { - Py_ssize_t index; - PyObject *value1 = NULL, *value2 = NULL, *iter = NULL; - iternextfunc iternext; - iter = PyObject_GetIter(tuple); - if (unlikely(!iter)) goto bad; - if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; } - iternext = Py_TYPE(iter)->tp_iternext; - value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; } - value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; } - if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad; - Py_DECREF(iter); - *pvalue1 = value1; - *pvalue2 = value2; - return 0; -unpacking_failed: - if (!has_known_size && __Pyx_IterFinish() == 0) - __Pyx_RaiseNeedMoreValuesError(index); -bad: - Py_XDECREF(iter); - Py_XDECREF(value1); - Py_XDECREF(value2); - if (decref_tuple) { Py_XDECREF(tuple); } - return -1; -} - -/* dict_iter */ -static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name, - Py_ssize_t* p_orig_length, int* p_source_is_dict) { - is_dict = is_dict || likely(PyDict_CheckExact(iterable)); - *p_source_is_dict = is_dict; - if (is_dict) { -#if !CYTHON_COMPILING_IN_PYPY - *p_orig_length = PyDict_Size(iterable); - Py_INCREF(iterable); - return iterable; -#elif PY_MAJOR_VERSION >= 3 - static PyObject *py_items = NULL, *py_keys = NULL, *py_values = NULL; - PyObject **pp = NULL; - if (method_name) { - const char *name = PyUnicode_AsUTF8(method_name); - if (strcmp(name, "iteritems") == 0) pp = &py_items; - else if (strcmp(name, "iterkeys") == 0) pp = &py_keys; - else if (strcmp(name, "itervalues") == 0) pp = &py_values; - if (pp) { - if (!*pp) { - *pp = PyUnicode_FromString(name + 4); - if (!*pp) - return NULL; - } - method_name = *pp; - } - } -#endif - } - *p_orig_length = 0; - if (method_name) { - PyObject* iter; - iterable = __Pyx_PyObject_CallMethod0(iterable, method_name); - if (!iterable) - return NULL; -#if !CYTHON_COMPILING_IN_PYPY - if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable)) - return iterable; -#endif - iter = PyObject_GetIter(iterable); - Py_DECREF(iterable); - return iter; - } - return PyObject_GetIter(iterable); -} -static CYTHON_INLINE int __Pyx_dict_iter_next( - PyObject* iter_obj, CYTHON_NCP_UNUSED Py_ssize_t orig_length, CYTHON_NCP_UNUSED Py_ssize_t* ppos, - PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) { - PyObject* next_item; -#if !CYTHON_COMPILING_IN_PYPY - if (source_is_dict) { - PyObject *key, *value; - if (unlikely(orig_length != PyDict_Size(iter_obj))) { - PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration"); - return -1; - } - if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) { - return 0; - } - if (pitem) { - PyObject* tuple = PyTuple_New(2); - if (unlikely(!tuple)) { - return -1; - } - Py_INCREF(key); - Py_INCREF(value); - PyTuple_SET_ITEM(tuple, 0, key); - PyTuple_SET_ITEM(tuple, 1, value); - *pitem = tuple; - } else { - if (pkey) { - Py_INCREF(key); - *pkey = key; - } - if (pvalue) { - Py_INCREF(value); - *pvalue = value; - } - } - return 1; - } else if (PyTuple_CheckExact(iter_obj)) { - Py_ssize_t pos = *ppos; - if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0; - *ppos = pos + 1; - next_item = PyTuple_GET_ITEM(iter_obj, pos); - Py_INCREF(next_item); - } else if (PyList_CheckExact(iter_obj)) { - Py_ssize_t pos = *ppos; - if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0; - *ppos = pos + 1; - next_item = PyList_GET_ITEM(iter_obj, pos); - Py_INCREF(next_item); - } else -#endif - { - next_item = PyIter_Next(iter_obj); - if (unlikely(!next_item)) { - return __Pyx_IterFinish(); - } - } - if (pitem) { - *pitem = next_item; - } else if (pkey && pvalue) { - if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1)) - return -1; - } else if (pkey) { - *pkey = next_item; - } else { - *pvalue = next_item; - } - return 1; -} - -/* GetTopmostException */ -#if CYTHON_USE_EXC_INFO_STACK -static _PyErr_StackItem * -__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) -{ - _PyErr_StackItem *exc_info = tstate->exc_info; - while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && - exc_info->previous_item != NULL) - { - exc_info = exc_info->previous_item; - } - return exc_info; -} -#endif - -/* ReRaiseException */ -static CYTHON_INLINE void __Pyx_ReraiseException(void) { - PyObject *type = NULL, *value = NULL, *tb = NULL; -#if CYTHON_FAST_THREAD_STATE - PyThreadState *tstate = PyThreadState_GET(); - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); - type = exc_info->exc_type; - value = exc_info->exc_value; - tb = exc_info->exc_traceback; - #else - type = tstate->exc_type; - value = tstate->exc_value; - tb = tstate->exc_traceback; - #endif -#else - PyErr_GetExcInfo(&type, &value, &tb); -#endif - if (!type || type == Py_None) { -#if !CYTHON_FAST_THREAD_STATE - Py_XDECREF(type); - Py_XDECREF(value); - Py_XDECREF(tb); -#endif - PyErr_SetString(PyExc_RuntimeError, - "No active exception to reraise"); - } else { -#if CYTHON_FAST_THREAD_STATE - Py_INCREF(type); - Py_XINCREF(value); - Py_XINCREF(tb); -#endif - PyErr_Restore(type, value, tb); - } -} - -/* GetException */ -#if CYTHON_FAST_THREAD_STATE -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) -#endif -{ - PyObject *local_type, *local_value, *local_tb; -#if CYTHON_FAST_THREAD_STATE - PyObject *tmp_type, *tmp_value, *tmp_tb; - local_type = tstate->curexc_type; - local_value = tstate->curexc_value; - local_tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -#else - PyErr_Fetch(&local_type, &local_value, &local_tb); -#endif - PyErr_NormalizeException(&local_type, &local_value, &local_tb); -#if CYTHON_FAST_THREAD_STATE - if (unlikely(tstate->curexc_type)) -#else - if (unlikely(PyErr_Occurred())) -#endif - goto bad; - #if PY_MAJOR_VERSION >= 3 - if (local_tb) { - if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) - goto bad; - } - #endif - Py_XINCREF(local_tb); - Py_XINCREF(local_type); - Py_XINCREF(local_value); - *type = local_type; - *value = local_value; - *tb = local_tb; -#if CYTHON_FAST_THREAD_STATE - #if CYTHON_USE_EXC_INFO_STACK - { - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = local_type; - exc_info->exc_value = local_value; - exc_info->exc_traceback = local_tb; - } - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = local_type; - tstate->exc_value = local_value; - tstate->exc_traceback = local_tb; - #endif - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -#else - PyErr_SetExcInfo(local_type, local_value, local_tb); -#endif - return 0; -bad: - *type = 0; - *value = 0; - *tb = 0; - Py_XDECREF(local_type); - Py_XDECREF(local_value); - Py_XDECREF(local_tb); - return -1; -} - -/* SwapException */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = *type; - exc_info->exc_value = *value; - exc_info->exc_traceback = *tb; - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = *type; - tstate->exc_value = *value; - tstate->exc_traceback = *tb; - #endif - *type = tmp_type; - *value = tmp_value; - *tb = tmp_tb; -} -#else -static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); - PyErr_SetExcInfo(*type, *value, *tb); - *type = tmp_type; - *value = tmp_value; - *tb = tmp_tb; -} -#endif - -/* SaveResetException */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); - *type = exc_info->exc_type; - *value = exc_info->exc_value; - *tb = exc_info->exc_traceback; - #else - *type = tstate->exc_type; - *value = tstate->exc_value; - *tb = tstate->exc_traceback; - #endif - Py_XINCREF(*type); - Py_XINCREF(*value); - Py_XINCREF(*tb); -} -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = type; - exc_info->exc_value = value; - exc_info->exc_traceback = tb; - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = type; - tstate->exc_value = value; - tstate->exc_traceback = tb; - #endif - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -} -#endif - -/* TypeImport */ -#ifndef __PYX_HAVE_RT_ImportType -#define __PYX_HAVE_RT_ImportType -static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name, - size_t size, enum __Pyx_ImportType_CheckSize check_size) -{ - PyObject *result = 0; - char warning[200]; - Py_ssize_t basicsize; -#ifdef Py_LIMITED_API - PyObject *py_basicsize; -#endif - result = PyObject_GetAttrString(module, class_name); - if (!result) - goto bad; - if (!PyType_Check(result)) { - PyErr_Format(PyExc_TypeError, - "%.200s.%.200s is not a type object", - module_name, class_name); - goto bad; - } -#ifndef Py_LIMITED_API - basicsize = ((PyTypeObject *)result)->tp_basicsize; -#else - py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); - if (!py_basicsize) - goto bad; - basicsize = PyLong_AsSsize_t(py_basicsize); - Py_DECREF(py_basicsize); - py_basicsize = 0; - if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) - goto bad; -#endif - if ((size_t)basicsize < size) { - PyErr_Format(PyExc_ValueError, - "%.200s.%.200s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - goto bad; - } - if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) { - PyErr_Format(PyExc_ValueError, - "%.200s.%.200s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - goto bad; - } - else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) { - PyOS_snprintf(warning, sizeof(warning), - "%s.%s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; - } - return (PyTypeObject *)result; -bad: - Py_XDECREF(result); - return NULL; -} -#endif - -/* Import */ -static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { - PyObject *empty_list = 0; - PyObject *module = 0; - PyObject *global_dict = 0; - PyObject *empty_dict = 0; - PyObject *list; - #if PY_MAJOR_VERSION < 3 - PyObject *py_import; - py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); - if (!py_import) - goto bad; - #endif - if (from_list) - list = from_list; - else { - empty_list = PyList_New(0); - if (!empty_list) - goto bad; - list = empty_list; - } - global_dict = PyModule_GetDict(__pyx_m); - if (!global_dict) - goto bad; - empty_dict = PyDict_New(); - if (!empty_dict) - goto bad; - { - #if PY_MAJOR_VERSION >= 3 - if (level == -1) { - if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { - module = PyImport_ImportModuleLevelObject( - name, global_dict, empty_dict, list, 1); - if (!module) { - if (!PyErr_ExceptionMatches(PyExc_ImportError)) - goto bad; - PyErr_Clear(); - } - } - level = 0; - } - #endif - if (!module) { - #if PY_MAJOR_VERSION < 3 - PyObject *py_level = PyInt_FromLong(level); - if (!py_level) - goto bad; - module = PyObject_CallFunctionObjArgs(py_import, - name, global_dict, empty_dict, list, py_level, (PyObject *)NULL); - Py_DECREF(py_level); - #else - module = PyImport_ImportModuleLevelObject( - name, global_dict, empty_dict, list, level); - #endif - } - } -bad: - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(py_import); - #endif - Py_XDECREF(empty_list); - Py_XDECREF(empty_dict); - return module; -} - -/* ImportFrom */ -static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { - PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); - if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Format(PyExc_ImportError, - #if PY_MAJOR_VERSION < 3 - "cannot import name %.230s", PyString_AS_STRING(name)); - #else - "cannot import name %S", name); - #endif - } - return value; -} - -/* PyDictVersioning */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { - PyObject **dictptr = NULL; - Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; - if (offset) { -#if CYTHON_COMPILING_IN_CPYTHON - dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); -#else - dictptr = _PyObject_GetDictPtr(obj); -#endif - } - return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; -} -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) - return 0; - return obj_dict_version == __Pyx_get_object_dict_version(obj); -} -#endif - -/* GetModuleGlobalName */ -#if CYTHON_USE_DICT_VERSIONS -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) -#else -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) -#endif -{ - PyObject *result; -#if !CYTHON_AVOID_BORROWED_REFS -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 - result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } else if (unlikely(PyErr_Occurred())) { - return NULL; - } -#else - result = PyDict_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } -#endif -#else - result = PyObject_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } - PyErr_Clear(); -#endif - return __Pyx_GetBuiltinName(name); -} - -/* CLineInTraceback */ -#ifndef CYTHON_CLINE_IN_TRACEBACK -static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { - PyObject *use_cline; - PyObject *ptype, *pvalue, *ptraceback; -#if CYTHON_COMPILING_IN_CPYTHON - PyObject **cython_runtime_dict; -#endif - if (unlikely(!__pyx_cython_runtime)) { - return c_line; - } - __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); -#if CYTHON_COMPILING_IN_CPYTHON - cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); - if (likely(cython_runtime_dict)) { - __PYX_PY_DICT_LOOKUP_IF_MODIFIED( - use_cline, *cython_runtime_dict, - __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) - } else -#endif - { - PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); - if (use_cline_obj) { - use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; - Py_DECREF(use_cline_obj); - } else { - PyErr_Clear(); - use_cline = NULL; - } - } - if (!use_cline) { - c_line = 0; - PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); - } - else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { - c_line = 0; - } - __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); - return c_line; -} -#endif - -/* CodeObjectCache */ -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { - int start = 0, mid = 0, end = count - 1; - if (end >= 0 && code_line > entries[end].code_line) { - return count; - } - while (start < end) { - mid = start + (end - start) / 2; - if (code_line < entries[mid].code_line) { - end = mid; - } else if (code_line > entries[mid].code_line) { - start = mid + 1; - } else { - return mid; - } - } - if (code_line <= entries[mid].code_line) { - return mid; - } else { - return mid + 1; - } -} -static PyCodeObject *__pyx_find_code_object(int code_line) { - PyCodeObject* code_object; - int pos; - if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { - return NULL; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { - return NULL; - } - code_object = __pyx_code_cache.entries[pos].code_object; - Py_INCREF(code_object); - return code_object; -} -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { - int pos, i; - __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; - if (unlikely(!code_line)) { - return; - } - if (unlikely(!entries)) { - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); - if (likely(entries)) { - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = 64; - __pyx_code_cache.count = 1; - entries[0].code_line = code_line; - entries[0].code_object = code_object; - Py_INCREF(code_object); - } - return; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { - PyCodeObject* tmp = entries[pos].code_object; - entries[pos].code_object = code_object; - Py_DECREF(tmp); - return; - } - if (__pyx_code_cache.count == __pyx_code_cache.max_count) { - int new_max = __pyx_code_cache.max_count + 64; - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( - __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); - if (unlikely(!entries)) { - return; - } - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = new_max; - } - for (i=__pyx_code_cache.count; i>pos; i--) { - entries[i] = entries[i-1]; - } - entries[pos].code_line = code_line; - entries[pos].code_object = code_object; - __pyx_code_cache.count++; - Py_INCREF(code_object); -} - -/* AddTraceback */ -#include "compile.h" -#include "frameobject.h" -#include "traceback.h" -static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( - const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyObject *py_srcfile = 0; - PyObject *py_funcname = 0; - #if PY_MAJOR_VERSION < 3 - py_srcfile = PyString_FromString(filename); - #else - py_srcfile = PyUnicode_FromString(filename); - #endif - if (!py_srcfile) goto bad; - if (c_line) { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - #else - py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - #endif - } - else { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromString(funcname); - #else - py_funcname = PyUnicode_FromString(funcname); - #endif - } - if (!py_funcname) goto bad; - py_code = __Pyx_PyCode_New( - 0, - 0, - 0, - 0, - 0, - __pyx_empty_bytes, /*PyObject *code,*/ - __pyx_empty_tuple, /*PyObject *consts,*/ - __pyx_empty_tuple, /*PyObject *names,*/ - __pyx_empty_tuple, /*PyObject *varnames,*/ - __pyx_empty_tuple, /*PyObject *freevars,*/ - __pyx_empty_tuple, /*PyObject *cellvars,*/ - py_srcfile, /*PyObject *filename,*/ - py_funcname, /*PyObject *name,*/ - py_line, - __pyx_empty_bytes /*PyObject *lnotab*/ - ); - Py_DECREF(py_srcfile); - Py_DECREF(py_funcname); - return py_code; -bad: - Py_XDECREF(py_srcfile); - Py_XDECREF(py_funcname); - return NULL; -} -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyFrameObject *py_frame = 0; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - if (c_line) { - c_line = __Pyx_CLineForTraceback(tstate, c_line); - } - py_code = __pyx_find_code_object(c_line ? -c_line : py_line); - if (!py_code) { - py_code = __Pyx_CreateCodeObjectForTraceback( - funcname, c_line, py_line, filename); - if (!py_code) goto bad; - __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); - } - py_frame = PyFrame_New( - tstate, /*PyThreadState *tstate,*/ - py_code, /*PyCodeObject *code,*/ - __pyx_d, /*PyObject *globals,*/ - 0 /*PyObject *locals*/ - ); - if (!py_frame) goto bad; - __Pyx_PyFrame_SetLineNumber(py_frame, py_line); - PyTraceBack_Here(py_frame); -bad: - Py_XDECREF(py_code); - Py_XDECREF(py_frame); -} - -/* CIntToPy */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const long neg_one = (long) -1, const_zero = (long) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(long) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(long) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(long) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(long), - little, !is_unsigned); - } -} - -/* CIntFromPyVerify */ -#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) -#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) -#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ - {\ - func_type value = func_value;\ - if (sizeof(target_type) < sizeof(func_type)) {\ - if (unlikely(value != (func_type) (target_type) value)) {\ - func_type zero = 0;\ - if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ - return (target_type) -1;\ - if (is_unsigned && unlikely(value < zero))\ - goto raise_neg_overflow;\ - else\ - goto raise_overflow;\ - }\ - }\ - return (target_type) value;\ - } - -/* CIntFromPy */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const long neg_one = (long) -1, const_zero = (long) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(long) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (long) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (long) 0; - case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) - case 2: - if (8 * sizeof(long) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { - return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(long) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { - return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(long) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { - return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (long) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(long) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (long) 0; - case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) - case -2: - if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(long) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(long) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(long) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - } -#endif - if (sizeof(long) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - long val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (long) -1; - } - } else { - long val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (long) -1; - val = __Pyx_PyInt_As_long(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to long"); - return (long) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to long"); - return (long) -1; -} - -/* CIntFromPy */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const int neg_one = (int) -1, const_zero = (int) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(int) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (int) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { - return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { - return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { - return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (int) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(int) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) - case -2: - if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - } -#endif - if (sizeof(int) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - int val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (int) -1; - } - } else { - int val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (int) -1; - val = __Pyx_PyInt_As_int(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to int"); - return (int) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to int"); - return (int) -1; -} - -/* FastTypeChecks */ -#if CYTHON_COMPILING_IN_CPYTHON -static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { - while (a) { - a = a->tp_base; - if (a == b) - return 1; - } - return b == &PyBaseObject_Type; -} -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { - PyObject *mro; - if (a == b) return 1; - mro = a->tp_mro; - if (likely(mro)) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(mro); - for (i = 0; i < n; i++) { - if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) - return 1; - } - return 0; - } - return __Pyx_InBases(a, b); -} -#if PY_MAJOR_VERSION == 2 -static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { - PyObject *exception, *value, *tb; - int res; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ErrFetch(&exception, &value, &tb); - res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - if (!res) { - res = PyObject_IsSubclass(err, exc_type2); - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - } - __Pyx_ErrRestore(exception, value, tb); - return res; -} -#else -static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { - int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; - if (!res) { - res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); - } - return res; -} -#endif -static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { - Py_ssize_t i, n; - assert(PyExceptionClass_Check(exc_type)); - n = PyTuple_GET_SIZE(tuple); -#if PY_MAJOR_VERSION >= 3 - for (i=0; ip) { - #if PY_MAJOR_VERSION < 3 - if (t->is_unicode) { - *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); - } else if (t->intern) { - *t->p = PyString_InternFromString(t->s); - } else { - *t->p = PyString_FromStringAndSize(t->s, t->n - 1); - } - #else - if (t->is_unicode | t->is_str) { - if (t->intern) { - *t->p = PyUnicode_InternFromString(t->s); - } else if (t->encoding) { - *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); - } else { - *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); - } - } else { - *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); - } - #endif - if (!*t->p) - return -1; - if (PyObject_Hash(*t->p) == -1) - return -1; - ++t; - } - return 0; -} - -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { - return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); -} -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { - Py_ssize_t ignore; - return __Pyx_PyObject_AsStringAndSize(o, &ignore); -} -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -#if !CYTHON_PEP393_ENABLED -static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - char* defenc_c; - PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); - if (!defenc) return NULL; - defenc_c = PyBytes_AS_STRING(defenc); -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - { - char* end = defenc_c + PyBytes_GET_SIZE(defenc); - char* c; - for (c = defenc_c; c < end; c++) { - if ((unsigned char) (*c) >= 128) { - PyUnicode_AsASCIIString(o); - return NULL; - } - } - } -#endif - *length = PyBytes_GET_SIZE(defenc); - return defenc_c; -} -#else -static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - if (likely(PyUnicode_IS_ASCII(o))) { - *length = PyUnicode_GET_LENGTH(o); - return PyUnicode_AsUTF8(o); - } else { - PyUnicode_AsASCIIString(o); - return NULL; - } -#else - return PyUnicode_AsUTF8AndSize(o, length); -#endif -} -#endif -#endif -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT - if ( -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - __Pyx_sys_getdefaultencoding_not_ascii && -#endif - PyUnicode_Check(o)) { - return __Pyx_PyUnicode_AsStringAndSize(o, length); - } else -#endif -#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) - if (PyByteArray_Check(o)) { - *length = PyByteArray_GET_SIZE(o); - return PyByteArray_AS_STRING(o); - } else -#endif - { - char* result; - int r = PyBytes_AsStringAndSize(o, &result, length); - if (unlikely(r < 0)) { - return NULL; - } else { - return result; - } - } -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { - int is_true = x == Py_True; - if (is_true | (x == Py_False) | (x == Py_None)) return is_true; - else return PyObject_IsTrue(x); -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { - int retval; - if (unlikely(!x)) return -1; - retval = __Pyx_PyObject_IsTrue(x); - Py_DECREF(x); - return retval; -} -static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { -#if PY_MAJOR_VERSION >= 3 - if (PyLong_Check(result)) { - if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, - "__int__ returned non-int (type %.200s). " - "The ability to return an instance of a strict subclass of int " - "is deprecated, and may be removed in a future version of Python.", - Py_TYPE(result)->tp_name)) { - Py_DECREF(result); - return NULL; - } - return result; - } -#endif - PyErr_Format(PyExc_TypeError, - "__%.4s__ returned non-%.4s (type %.200s)", - type_name, type_name, Py_TYPE(result)->tp_name); - Py_DECREF(result); - return NULL; -} -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { -#if CYTHON_USE_TYPE_SLOTS - PyNumberMethods *m; -#endif - const char *name = NULL; - PyObject *res = NULL; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x) || PyLong_Check(x))) -#else - if (likely(PyLong_Check(x))) -#endif - return __Pyx_NewRef(x); -#if CYTHON_USE_TYPE_SLOTS - m = Py_TYPE(x)->tp_as_number; - #if PY_MAJOR_VERSION < 3 - if (m && m->nb_int) { - name = "int"; - res = m->nb_int(x); - } - else if (m && m->nb_long) { - name = "long"; - res = m->nb_long(x); - } - #else - if (likely(m && m->nb_int)) { - name = "int"; - res = m->nb_int(x); - } - #endif -#else - if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { - res = PyNumber_Int(x); - } -#endif - if (likely(res)) { -#if PY_MAJOR_VERSION < 3 - if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { -#else - if (unlikely(!PyLong_CheckExact(res))) { -#endif - return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); - } - } - else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, - "an integer is required"); - } - return res; -} -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { - Py_ssize_t ival; - PyObject *x; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_CheckExact(b))) { - if (sizeof(Py_ssize_t) >= sizeof(long)) - return PyInt_AS_LONG(b); - else - return PyInt_AsSsize_t(b); - } -#endif - if (likely(PyLong_CheckExact(b))) { - #if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)b)->ob_digit; - const Py_ssize_t size = Py_SIZE(b); - if (likely(__Pyx_sst_abs(size) <= 1)) { - ival = likely(size) ? digits[0] : 0; - if (size == -1) ival = -ival; - return ival; - } else { - switch (size) { - case 2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - } - } - #endif - return PyLong_AsSsize_t(b); - } - x = PyNumber_Index(b); - if (!x) return -1; - ival = PyInt_AsSsize_t(x); - Py_DECREF(x); - return ival; -} -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { - return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); -} -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { - return PyInt_FromSize_t(ival); -} - - -#endif /* Py_PYTHON_H */ diff --git a/.venv/Lib/site-packages/aiohttp/_http_writer.cp38-win_amd64.pyd b/.venv/Lib/site-packages/aiohttp/_http_writer.cp38-win_amd64.pyd deleted file mode 100644 index 5a92759b568dde681a5fb65158dde06c8660c5a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44544 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 diff --git a/.venv/Lib/site-packages/aiohttp/_http_writer.pyx b/.venv/Lib/site-packages/aiohttp/_http_writer.pyx deleted file mode 100644 index eff8521..0000000 --- a/.venv/Lib/site-packages/aiohttp/_http_writer.pyx +++ /dev/null @@ -1,163 +0,0 @@ -from cpython.bytes cimport PyBytes_FromStringAndSize -from cpython.exc cimport PyErr_NoMemory -from cpython.mem cimport PyMem_Free, PyMem_Malloc, PyMem_Realloc -from cpython.object cimport PyObject_Str -from libc.stdint cimport uint8_t, uint64_t -from libc.string cimport memcpy - -from multidict import istr - -DEF BUF_SIZE = 16 * 1024 # 16KiB -cdef char BUFFER[BUF_SIZE] - -cdef object _istr = istr - - -# ----------------- writer --------------------------- - -cdef struct Writer: - char *buf - Py_ssize_t size - Py_ssize_t pos - - -cdef inline void _init_writer(Writer* writer): - writer.buf = &BUFFER[0] - writer.size = BUF_SIZE - writer.pos = 0 - - -cdef inline void _release_writer(Writer* writer): - if writer.buf != BUFFER: - PyMem_Free(writer.buf) - - -cdef inline int _write_byte(Writer* writer, uint8_t ch): - cdef char * buf - cdef Py_ssize_t size - - if writer.pos == writer.size: - # reallocate - size = writer.size + BUF_SIZE - if writer.buf == BUFFER: - buf = PyMem_Malloc(size) - if buf == NULL: - PyErr_NoMemory() - return -1 - memcpy(buf, writer.buf, writer.size) - else: - buf = PyMem_Realloc(writer.buf, size) - if buf == NULL: - PyErr_NoMemory() - return -1 - writer.buf = buf - writer.size = size - writer.buf[writer.pos] = ch - writer.pos += 1 - return 0 - - -cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): - cdef uint64_t utf = symbol - - if utf < 0x80: - return _write_byte(writer, utf) - elif utf < 0x800: - if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: - return -1 - return _write_byte(writer, (0x80 | (utf & 0x3f))) - elif 0xD800 <= utf <= 0xDFFF: - # surogate pair, ignored - return 0 - elif utf < 0x10000: - if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: - return -1 - if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: - return -1 - return _write_byte(writer, (0x80 | (utf & 0x3f))) - elif utf > 0x10FFFF: - # symbol is too large - return 0 - else: - if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: - return -1 - if _write_byte(writer, - (0x80 | ((utf >> 12) & 0x3f))) < 0: - return -1 - if _write_byte(writer, - (0x80 | ((utf >> 6) & 0x3f))) < 0: - return -1 - return _write_byte(writer, (0x80 | (utf & 0x3f))) - - -cdef inline int _write_str(Writer* writer, str s): - cdef Py_UCS4 ch - for ch in s: - if _write_utf8(writer, ch) < 0: - return -1 - - -# --------------- _serialize_headers ---------------------- - -cdef str to_str(object s): - typ = type(s) - if typ is str: - return s - elif typ is _istr: - return PyObject_Str(s) - elif not isinstance(s, str): - raise TypeError("Cannot serialize non-str key {!r}".format(s)) - else: - return str(s) - - -cdef void _safe_header(str string) except *: - if "\r" in string or "\n" in string: - raise ValueError( - "Newline or carriage return character detected in HTTP status message or " - "header. This is a potential security issue." - ) - - -def _serialize_headers(str status_line, headers): - cdef Writer writer - cdef object key - cdef object val - cdef bytes ret - - _init_writer(&writer) - - for key, val in headers.items(): - _safe_header(to_str(key)) - _safe_header(to_str(val)) - - try: - if _write_str(&writer, status_line) < 0: - raise - if _write_byte(&writer, b'\r') < 0: - raise - if _write_byte(&writer, b'\n') < 0: - raise - - for key, val in headers.items(): - if _write_str(&writer, to_str(key)) < 0: - raise - if _write_byte(&writer, b':') < 0: - raise - if _write_byte(&writer, b' ') < 0: - raise - if _write_str(&writer, to_str(val)) < 0: - raise - if _write_byte(&writer, b'\r') < 0: - raise - if _write_byte(&writer, b'\n') < 0: - raise - - if _write_byte(&writer, b'\r') < 0: - raise - if _write_byte(&writer, b'\n') < 0: - raise - - return PyBytes_FromStringAndSize(writer.buf, writer.pos) - finally: - _release_writer(&writer) diff --git a/.venv/Lib/site-packages/aiohttp/_websocket.c b/.venv/Lib/site-packages/aiohttp/_websocket.c deleted file mode 100644 index d47da21..0000000 --- a/.venv/Lib/site-packages/aiohttp/_websocket.c +++ /dev/null @@ -1,3622 +0,0 @@ -/* Generated by Cython 0.29.24 */ - -#ifndef PY_SSIZE_T_CLEAN -#define PY_SSIZE_T_CLEAN -#endif /* PY_SSIZE_T_CLEAN */ -#include "Python.h" -#ifndef Py_PYTHON_H - #error Python headers needed to compile C extensions, please install development version of Python. -#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) - #error Cython requires Python 2.6+ or Python 3.3+. -#else -#define CYTHON_ABI "0_29_24" -#define CYTHON_HEX_VERSION 0x001D18F0 -#define CYTHON_FUTURE_DIVISION 1 -#include -#ifndef offsetof - #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) -#endif -#if !defined(WIN32) && !defined(MS_WINDOWS) - #ifndef __stdcall - #define __stdcall - #endif - #ifndef __cdecl - #define __cdecl - #endif - #ifndef __fastcall - #define __fastcall - #endif -#endif -#ifndef DL_IMPORT - #define DL_IMPORT(t) t -#endif -#ifndef DL_EXPORT - #define DL_EXPORT(t) t -#endif -#define __PYX_COMMA , -#ifndef HAVE_LONG_LONG - #if PY_VERSION_HEX >= 0x02070000 - #define HAVE_LONG_LONG - #endif -#endif -#ifndef PY_LONG_LONG - #define PY_LONG_LONG LONG_LONG -#endif -#ifndef Py_HUGE_VAL - #define Py_HUGE_VAL HUGE_VAL -#endif -#ifdef PYPY_VERSION - #define CYTHON_COMPILING_IN_PYPY 1 - #define CYTHON_COMPILING_IN_PYSTON 0 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #undef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 0 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #if PY_VERSION_HEX < 0x03050000 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #undef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #undef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 1 - #undef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 0 - #undef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 0 - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 -#elif defined(PYSTON_VERSION) - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_PYSTON 1 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 -#else - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_PYSTON 0 - #define CYTHON_COMPILING_IN_CPYTHON 1 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #if PY_VERSION_HEX < 0x02070000 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) - #define CYTHON_USE_PYTYPE_LOOKUP 1 - #endif - #if PY_MAJOR_VERSION < 3 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #if PY_VERSION_HEX < 0x02070000 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #elif !defined(CYTHON_USE_PYLONG_INTERNALS) - #define CYTHON_USE_PYLONG_INTERNALS 1 - #endif - #ifndef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 1 - #endif - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #if PY_VERSION_HEX < 0x030300F0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #elif !defined(CYTHON_USE_UNICODE_WRITER) - #define CYTHON_USE_UNICODE_WRITER 1 - #endif - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #ifndef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 1 - #endif - #ifndef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 1 - #endif - #ifndef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) - #endif - #ifndef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) - #endif - #ifndef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) - #endif - #ifndef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) - #endif -#endif -#if !defined(CYTHON_FAST_PYCCALL) -#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) -#endif -#if CYTHON_USE_PYLONG_INTERNALS - #include "longintrepr.h" - #undef SHIFT - #undef BASE - #undef MASK - #ifdef SIZEOF_VOID_P - enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; - #endif -#endif -#ifndef __has_attribute - #define __has_attribute(x) 0 -#endif -#ifndef __has_cpp_attribute - #define __has_cpp_attribute(x) 0 -#endif -#ifndef CYTHON_RESTRICT - #if defined(__GNUC__) - #define CYTHON_RESTRICT __restrict__ - #elif defined(_MSC_VER) && _MSC_VER >= 1400 - #define CYTHON_RESTRICT __restrict - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_RESTRICT restrict - #else - #define CYTHON_RESTRICT - #endif -#endif -#ifndef CYTHON_UNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -#endif -#ifndef CYTHON_MAYBE_UNUSED_VAR -# if defined(__cplusplus) - template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } -# else -# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) -# endif -#endif -#ifndef CYTHON_NCP_UNUSED -# if CYTHON_COMPILING_IN_CPYTHON -# define CYTHON_NCP_UNUSED -# else -# define CYTHON_NCP_UNUSED CYTHON_UNUSED -# endif -#endif -#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) -#ifdef _MSC_VER - #ifndef _MSC_STDINT_H_ - #if _MSC_VER < 1300 - typedef unsigned char uint8_t; - typedef unsigned int uint32_t; - #else - typedef unsigned __int8 uint8_t; - typedef unsigned __int32 uint32_t; - #endif - #endif -#else - #include -#endif -#ifndef CYTHON_FALLTHROUGH - #if defined(__cplusplus) && __cplusplus >= 201103L - #if __has_cpp_attribute(fallthrough) - #define CYTHON_FALLTHROUGH [[fallthrough]] - #elif __has_cpp_attribute(clang::fallthrough) - #define CYTHON_FALLTHROUGH [[clang::fallthrough]] - #elif __has_cpp_attribute(gnu::fallthrough) - #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] - #endif - #endif - #ifndef CYTHON_FALLTHROUGH - #if __has_attribute(fallthrough) - #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) - #else - #define CYTHON_FALLTHROUGH - #endif - #endif - #if defined(__clang__ ) && defined(__apple_build_version__) - #if __apple_build_version__ < 7000000 - #undef CYTHON_FALLTHROUGH - #define CYTHON_FALLTHROUGH - #endif - #endif -#endif - -#ifndef CYTHON_INLINE - #if defined(__clang__) - #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) - #elif defined(__GNUC__) - #define CYTHON_INLINE __inline__ - #elif defined(_MSC_VER) - #define CYTHON_INLINE __inline - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_INLINE inline - #else - #define CYTHON_INLINE - #endif -#endif - -#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) - #define Py_OptimizeFlag 0 -#endif -#define __PYX_BUILD_PY_SSIZE_T "n" -#define CYTHON_FORMAT_SSIZE_T "z" -#if PY_MAJOR_VERSION < 3 - #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) - #define __Pyx_DefaultClassType PyClass_Type -#else - #define __Pyx_BUILTIN_MODULE_NAME "builtins" -#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#else - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#endif - #define __Pyx_DefaultClassType PyType_Type -#endif -#ifndef Py_TPFLAGS_CHECKTYPES - #define Py_TPFLAGS_CHECKTYPES 0 -#endif -#ifndef Py_TPFLAGS_HAVE_INDEX - #define Py_TPFLAGS_HAVE_INDEX 0 -#endif -#ifndef Py_TPFLAGS_HAVE_NEWBUFFER - #define Py_TPFLAGS_HAVE_NEWBUFFER 0 -#endif -#ifndef Py_TPFLAGS_HAVE_FINALIZE - #define Py_TPFLAGS_HAVE_FINALIZE 0 -#endif -#ifndef METH_STACKLESS - #define METH_STACKLESS 0 -#endif -#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) - #ifndef METH_FASTCALL - #define METH_FASTCALL 0x80 - #endif - typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); - typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, - Py_ssize_t nargs, PyObject *kwnames); -#else - #define __Pyx_PyCFunctionFast _PyCFunctionFast - #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords -#endif -#if CYTHON_FAST_PYCCALL -#define __Pyx_PyFastCFunction_Check(func)\ - ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) -#else -#define __Pyx_PyFastCFunction_Check(func) 0 -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) - #define PyObject_Malloc(s) PyMem_Malloc(s) - #define PyObject_Free(p) PyMem_Free(p) - #define PyObject_Realloc(p) PyMem_Realloc(p) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 - #define PyMem_RawMalloc(n) PyMem_Malloc(n) - #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) - #define PyMem_RawFree(p) PyMem_Free(p) -#endif -#if CYTHON_COMPILING_IN_PYSTON - #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) -#else - #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) -#endif -#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#elif PY_VERSION_HEX >= 0x03060000 - #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() -#elif PY_VERSION_HEX >= 0x03000000 - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#else - #define __Pyx_PyThreadState_Current _PyThreadState_Current -#endif -#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) -#include "pythread.h" -#define Py_tss_NEEDS_INIT 0 -typedef int Py_tss_t; -static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { - *key = PyThread_create_key(); - return 0; -} -static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { - Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); - *key = Py_tss_NEEDS_INIT; - return key; -} -static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { - PyObject_Free(key); -} -static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { - return *key != Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { - PyThread_delete_key(*key); - *key = Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { - return PyThread_set_key_value(*key, value); -} -static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { - return PyThread_get_key_value(*key); -} -#endif -#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) -#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) -#else -#define __Pyx_PyDict_NewPresized(n) PyDict_New() -#endif -#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION - #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) -#else - #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS -#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) -#else -#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) -#endif -#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) - #define CYTHON_PEP393_ENABLED 1 - #if defined(PyUnicode_IS_READY) - #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ - 0 : _PyUnicode_Ready((PyObject *)(op))) - #else - #define __Pyx_PyUnicode_READY(op) (0) - #endif - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) - #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) - #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) - #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) - #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) - #else - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) - #endif - #else - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) - #endif -#else - #define CYTHON_PEP393_ENABLED 0 - #define PyUnicode_1BYTE_KIND 1 - #define PyUnicode_2BYTE_KIND 2 - #define PyUnicode_4BYTE_KIND 4 - #define __Pyx_PyUnicode_READY(op) (0) - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) - #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) - #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) - #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) -#endif -#if CYTHON_COMPILING_IN_PYPY - #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) -#else - #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ - PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) - #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) - #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) - #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) -#endif -#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) -#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) -#else - #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) -#endif -#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) - #define PyObject_ASCII(o) PyObject_Repr(o) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBaseString_Type PyUnicode_Type - #define PyStringObject PyUnicodeObject - #define PyString_Type PyUnicode_Type - #define PyString_Check PyUnicode_Check - #define PyString_CheckExact PyUnicode_CheckExact -#ifndef PyObject_Unicode - #define PyObject_Unicode PyObject_Str -#endif -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) - #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) -#else - #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) - #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) -#endif -#ifndef PySet_CheckExact - #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) -#endif -#if PY_VERSION_HEX >= 0x030900A4 - #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) -#else - #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) -#endif -#if CYTHON_ASSUME_SAFE_MACROS - #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) -#else - #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyIntObject PyLongObject - #define PyInt_Type PyLong_Type - #define PyInt_Check(op) PyLong_Check(op) - #define PyInt_CheckExact(op) PyLong_CheckExact(op) - #define PyInt_FromString PyLong_FromString - #define PyInt_FromUnicode PyLong_FromUnicode - #define PyInt_FromLong PyLong_FromLong - #define PyInt_FromSize_t PyLong_FromSize_t - #define PyInt_FromSsize_t PyLong_FromSsize_t - #define PyInt_AsLong PyLong_AsLong - #define PyInt_AS_LONG PyLong_AS_LONG - #define PyInt_AsSsize_t PyLong_AsSsize_t - #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask - #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask - #define PyNumber_Int PyNumber_Long -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBoolObject PyLongObject -#endif -#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY - #ifndef PyUnicode_InternFromString - #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) - #endif -#endif -#if PY_VERSION_HEX < 0x030200A4 - typedef long Py_hash_t; - #define __Pyx_PyInt_FromHash_t PyInt_FromLong - #define __Pyx_PyInt_AsHash_t PyInt_AsLong -#else - #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t - #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) -#else - #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) -#endif -#if CYTHON_USE_ASYNC_SLOTS - #if PY_VERSION_HEX >= 0x030500B1 - #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods - #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) - #else - #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) - #endif -#else - #define __Pyx_PyType_AsAsync(obj) NULL -#endif -#ifndef __Pyx_PyAsyncMethodsStruct - typedef struct { - unaryfunc am_await; - unaryfunc am_aiter; - unaryfunc am_anext; - } __Pyx_PyAsyncMethodsStruct; -#endif - -#if defined(WIN32) || defined(MS_WINDOWS) - #define _USE_MATH_DEFINES -#endif -#include -#ifdef NAN -#define __PYX_NAN() ((float) NAN) -#else -static CYTHON_INLINE float __PYX_NAN() { - float value; - memset(&value, 0xFF, sizeof(value)); - return value; -} -#endif -#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) -#define __Pyx_truncl trunc -#else -#define __Pyx_truncl truncl -#endif - -#define __PYX_MARK_ERR_POS(f_index, lineno) \ - { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } -#define __PYX_ERR(f_index, lineno, Ln_error) \ - { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } - -#ifndef __PYX_EXTERN_C - #ifdef __cplusplus - #define __PYX_EXTERN_C extern "C" - #else - #define __PYX_EXTERN_C extern - #endif -#endif - -#define __PYX_HAVE__aiohttp___websocket -#define __PYX_HAVE_API__aiohttp___websocket -/* Early includes */ -#include -#include -#include "pythread.h" -#include -#ifdef _OPENMP -#include -#endif /* _OPENMP */ - -#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) -#define CYTHON_WITHOUT_ASSERTIONS -#endif - -typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; - const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; - -#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) -#define __PYX_DEFAULT_STRING_ENCODING "" -#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString -#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#define __Pyx_uchar_cast(c) ((unsigned char)c) -#define __Pyx_long_cast(x) ((long)x) -#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ - (sizeof(type) < sizeof(Py_ssize_t)) ||\ - (sizeof(type) > sizeof(Py_ssize_t) &&\ - likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX) &&\ - (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ - v == (type)PY_SSIZE_T_MIN))) ||\ - (sizeof(type) == sizeof(Py_ssize_t) &&\ - (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX))) ) -static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { - return (size_t) i < (size_t) limit; -} -#if defined (__cplusplus) && __cplusplus >= 201103L - #include - #define __Pyx_sst_abs(value) std::abs(value) -#elif SIZEOF_INT >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) abs(value) -#elif SIZEOF_LONG >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) labs(value) -#elif defined (_MSC_VER) - #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) -#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define __Pyx_sst_abs(value) llabs(value) -#elif defined (__GNUC__) - #define __Pyx_sst_abs(value) __builtin_llabs(value) -#else - #define __Pyx_sst_abs(value) ((value<0) ? -value : value) -#endif -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); -#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) -#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) -#define __Pyx_PyBytes_FromString PyBytes_FromString -#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); -#if PY_MAJOR_VERSION < 3 - #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#else - #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize -#endif -#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) -#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) -#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) -#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) -#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { - const Py_UNICODE *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) -#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode -#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode -#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) -#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); -#define __Pyx_PySequence_Tuple(obj)\ - (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); -#if CYTHON_ASSUME_SAFE_MACROS -#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) -#else -#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) -#endif -#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) -#if PY_MAJOR_VERSION >= 3 -#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) -#else -#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) -#endif -#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII -static int __Pyx_sys_getdefaultencoding_not_ascii; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - PyObject* ascii_chars_u = NULL; - PyObject* ascii_chars_b = NULL; - const char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - if (strcmp(default_encoding_c, "ascii") == 0) { - __Pyx_sys_getdefaultencoding_not_ascii = 0; - } else { - char ascii_chars[128]; - int c; - for (c = 0; c < 128; c++) { - ascii_chars[c] = c; - } - __Pyx_sys_getdefaultencoding_not_ascii = 1; - ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); - if (!ascii_chars_u) goto bad; - ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); - if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { - PyErr_Format( - PyExc_ValueError, - "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", - default_encoding_c); - goto bad; - } - Py_DECREF(ascii_chars_u); - Py_DECREF(ascii_chars_b); - } - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - Py_XDECREF(ascii_chars_u); - Py_XDECREF(ascii_chars_b); - return -1; -} -#endif -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) -#else -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -static char* __PYX_DEFAULT_STRING_ENCODING; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); - if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; - strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - return -1; -} -#endif -#endif - - -/* Test for GCC > 2.95 */ -#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) - #define likely(x) __builtin_expect(!!(x), 1) - #define unlikely(x) __builtin_expect(!!(x), 0) -#else /* !__GNUC__ or GCC < 2.95 */ - #define likely(x) (x) - #define unlikely(x) (x) -#endif /* __GNUC__ */ -static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } - -static PyObject *__pyx_m = NULL; -static PyObject *__pyx_d; -static PyObject *__pyx_b; -static PyObject *__pyx_cython_runtime = NULL; -static PyObject *__pyx_empty_tuple; -static PyObject *__pyx_empty_bytes; -static PyObject *__pyx_empty_unicode; -static int __pyx_lineno; -static int __pyx_clineno = 0; -static const char * __pyx_cfilenm= __FILE__; -static const char *__pyx_filename; - - -static const char *__pyx_f[] = { - "aiohttp\\_websocket.pyx", - "type.pxd", - "bool.pxd", - "complex.pxd", -}; - -/*--- Type declarations ---*/ - -/* --- Runtime support code (head) --- */ -/* Refnanny.proto */ -#ifndef CYTHON_REFNANNY - #define CYTHON_REFNANNY 0 -#endif -#if CYTHON_REFNANNY - typedef struct { - void (*INCREF)(void*, PyObject*, int); - void (*DECREF)(void*, PyObject*, int); - void (*GOTREF)(void*, PyObject*, int); - void (*GIVEREF)(void*, PyObject*, int); - void* (*SetupContext)(const char*, int, const char*); - void (*FinishContext)(void**); - } __Pyx_RefNannyAPIStruct; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); - #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; -#ifdef WITH_THREAD - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - if (acquire_gil) {\ - PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ - PyGILState_Release(__pyx_gilstate_save);\ - } else {\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ - } -#else - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) -#endif - #define __Pyx_RefNannyFinishContext()\ - __Pyx_RefNanny->FinishContext(&__pyx_refnanny) - #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) - #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) - #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) - #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) - #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) -#else - #define __Pyx_RefNannyDeclarations - #define __Pyx_RefNannySetupContext(name, acquire_gil) - #define __Pyx_RefNannyFinishContext() - #define __Pyx_INCREF(r) Py_INCREF(r) - #define __Pyx_DECREF(r) Py_DECREF(r) - #define __Pyx_GOTREF(r) - #define __Pyx_GIVEREF(r) - #define __Pyx_XINCREF(r) Py_XINCREF(r) - #define __Pyx_XDECREF(r) Py_XDECREF(r) - #define __Pyx_XGOTREF(r) - #define __Pyx_XGIVEREF(r) -#endif -#define __Pyx_XDECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_XDECREF(tmp);\ - } while (0) -#define __Pyx_DECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_DECREF(tmp);\ - } while (0) -#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) -#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) - -/* PyObjectGetAttrStr.proto */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) -#endif - -/* GetBuiltinName.proto */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name); - -/* RaiseArgTupleInvalid.proto */ -static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, - Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); - -/* RaiseDoubleKeywords.proto */ -static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); - -/* ParseKeywords.proto */ -static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ - PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ - const char* function_name); - -/* PyCFunctionFastCall.proto */ -#if CYTHON_FAST_PYCCALL -static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); -#else -#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) -#endif - -/* PyFunctionFastCall.proto */ -#if CYTHON_FAST_PYCALL -#define __Pyx_PyFunction_FastCall(func, args, nargs)\ - __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) -#if 1 || PY_VERSION_HEX < 0x030600B1 -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); -#else -#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) -#endif -#define __Pyx_BUILD_ASSERT_EXPR(cond)\ - (sizeof(char [1 - 2*!(cond)]) - 1) -#ifndef Py_MEMBER_SIZE -#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) -#endif - static size_t __pyx_pyframe_localsplus_offset = 0; - #include "frameobject.h" - #define __Pxy_PyFrame_Initialize_Offsets()\ - ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ - (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) - #define __Pyx_PyFrame_GetLocalsplus(frame)\ - (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) -#endif - -/* PyObjectCall.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); -#else -#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) -#endif - -/* PyObjectCallMethO.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); -#endif - -/* PyObjectCallOneArg.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); - -/* TypeImport.proto */ -#ifndef __PYX_HAVE_RT_ImportType_proto -#define __PYX_HAVE_RT_ImportType_proto -enum __Pyx_ImportType_CheckSize { - __Pyx_ImportType_CheckSize_Error = 0, - __Pyx_ImportType_CheckSize_Warn = 1, - __Pyx_ImportType_CheckSize_Ignore = 2 -}; -static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); -#endif - -/* PyDictVersioning.proto */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) -#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ - (version_var) = __PYX_GET_DICT_VERSION(dict);\ - (cache_var) = (value); -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ - (VAR) = __pyx_dict_cached_value;\ - } else {\ - (VAR) = __pyx_dict_cached_value = (LOOKUP);\ - __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ - }\ -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); -#else -#define __PYX_GET_DICT_VERSION(dict) (0) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); -#endif - -/* PyThreadStateGet.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; -#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; -#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type -#else -#define __Pyx_PyThreadState_declare -#define __Pyx_PyThreadState_assign -#define __Pyx_PyErr_Occurred() PyErr_Occurred() -#endif - -/* PyErrFetchRestore.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) -#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) -#else -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#endif -#else -#define __Pyx_PyErr_Clear() PyErr_Clear() -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) -#endif - -/* CLineInTraceback.proto */ -#ifdef CYTHON_CLINE_IN_TRACEBACK -#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) -#else -static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); -#endif - -/* CodeObjectCache.proto */ -typedef struct { - PyCodeObject* code_object; - int code_line; -} __Pyx_CodeObjectCacheEntry; -struct __Pyx_CodeObjectCache { - int count; - int max_count; - __Pyx_CodeObjectCacheEntry* entries; -}; -static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); -static PyCodeObject *__pyx_find_code_object(int code_line); -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); - -/* AddTraceback.proto */ -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename); - -/* GCCDiagnostics.proto */ -#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) -#define __Pyx_HAS_GCC_DIAGNOSTIC -#endif - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); - -/* CIntFromPy.proto */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); - -/* CIntFromPy.proto */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); - -/* FastTypeChecks.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); -#else -#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) -#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) -#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) -#endif -#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) - -/* CheckBinaryVersion.proto */ -static int __Pyx_check_binary_version(void); - -/* InitStrings.proto */ -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); - - -/* Module declarations from 'cpython.version' */ - -/* Module declarations from '__builtin__' */ - -/* Module declarations from 'cpython.type' */ -static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; - -/* Module declarations from 'libc.string' */ - -/* Module declarations from 'libc.stdio' */ - -/* Module declarations from 'cpython.object' */ - -/* Module declarations from 'cpython.ref' */ - -/* Module declarations from 'cpython.exc' */ - -/* Module declarations from 'cpython.module' */ - -/* Module declarations from 'cpython.mem' */ - -/* Module declarations from 'cpython.tuple' */ - -/* Module declarations from 'cpython.list' */ - -/* Module declarations from 'cpython.sequence' */ - -/* Module declarations from 'cpython.mapping' */ - -/* Module declarations from 'cpython.iterator' */ - -/* Module declarations from 'cpython.number' */ - -/* Module declarations from 'cpython.int' */ - -/* Module declarations from '__builtin__' */ - -/* Module declarations from 'cpython.bool' */ -static PyTypeObject *__pyx_ptype_7cpython_4bool_bool = 0; - -/* Module declarations from 'cpython.long' */ - -/* Module declarations from 'cpython.float' */ - -/* Module declarations from '__builtin__' */ - -/* Module declarations from 'cpython.complex' */ -static PyTypeObject *__pyx_ptype_7cpython_7complex_complex = 0; - -/* Module declarations from 'cpython.string' */ - -/* Module declarations from 'cpython.unicode' */ - -/* Module declarations from 'cpython.dict' */ - -/* Module declarations from 'cpython.instance' */ - -/* Module declarations from 'cpython.function' */ - -/* Module declarations from 'cpython.method' */ - -/* Module declarations from 'cpython.weakref' */ - -/* Module declarations from 'cpython.getargs' */ - -/* Module declarations from 'cpython.pythread' */ - -/* Module declarations from 'cpython.pystate' */ - -/* Module declarations from 'cpython.cobject' */ - -/* Module declarations from 'cpython.oldbuffer' */ - -/* Module declarations from 'cpython.set' */ - -/* Module declarations from 'cpython.buffer' */ - -/* Module declarations from 'cpython.bytes' */ - -/* Module declarations from 'cpython.pycapsule' */ - -/* Module declarations from 'cpython' */ - -/* Module declarations from 'libc.stdint' */ - -/* Module declarations from 'aiohttp._websocket' */ -#define __Pyx_MODULE_NAME "aiohttp._websocket" -extern int __pyx_module_is_main_aiohttp___websocket; -int __pyx_module_is_main_aiohttp___websocket = 0; - -/* Implementation of 'aiohttp._websocket' */ -static PyObject *__pyx_builtin_range; -static const char __pyx_k_i[] = "i"; -static const char __pyx_k_data[] = "data"; -static const char __pyx_k_main[] = "__main__"; -static const char __pyx_k_mask[] = "mask"; -static const char __pyx_k_name[] = "__name__"; -static const char __pyx_k_test[] = "__test__"; -static const char __pyx_k_range[] = "range"; -static const char __pyx_k_in_buf[] = "in_buf"; -static const char __pyx_k_data_len[] = "data_len"; -static const char __pyx_k_mask_buf[] = "mask_buf"; -static const char __pyx_k_uint32_msk[] = "uint32_msk"; -static const char __pyx_k_uint64_msk[] = "uint64_msk"; -static const char __pyx_k_aiohttp__websocket[] = "aiohttp._websocket"; -static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; -static const char __pyx_k_websocket_mask_cython[] = "_websocket_mask_cython"; -static const char __pyx_k_aiohttp__websocket_pyx[] = "aiohttp\\_websocket.pyx"; -static PyObject *__pyx_n_s_aiohttp__websocket; -static PyObject *__pyx_kp_s_aiohttp__websocket_pyx; -static PyObject *__pyx_n_s_cline_in_traceback; -static PyObject *__pyx_n_s_data; -static PyObject *__pyx_n_s_data_len; -static PyObject *__pyx_n_s_i; -static PyObject *__pyx_n_s_in_buf; -static PyObject *__pyx_n_s_main; -static PyObject *__pyx_n_s_mask; -static PyObject *__pyx_n_s_mask_buf; -static PyObject *__pyx_n_s_name; -static PyObject *__pyx_n_s_range; -static PyObject *__pyx_n_s_test; -static PyObject *__pyx_n_s_uint32_msk; -static PyObject *__pyx_n_s_uint64_msk; -static PyObject *__pyx_n_s_websocket_mask_cython; -static PyObject *__pyx_pf_7aiohttp_10_websocket__websocket_mask_cython(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_mask, PyObject *__pyx_v_data); /* proto */ -static PyObject *__pyx_tuple_; -static PyObject *__pyx_codeobj__2; -/* Late includes */ - -/* "aiohttp/_websocket.pyx":11 - * - * - * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< - * """Note, this function mutates its `data` argument - * """ - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_7aiohttp_10_websocket_1_websocket_mask_cython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ -static char __pyx_doc_7aiohttp_10_websocket__websocket_mask_cython[] = "Note, this function mutates its `data` argument\n "; -static PyMethodDef __pyx_mdef_7aiohttp_10_websocket_1_websocket_mask_cython = {"_websocket_mask_cython", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_10_websocket_1_websocket_mask_cython, METH_VARARGS|METH_KEYWORDS, __pyx_doc_7aiohttp_10_websocket__websocket_mask_cython}; -static PyObject *__pyx_pw_7aiohttp_10_websocket_1_websocket_mask_cython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { - PyObject *__pyx_v_mask = 0; - PyObject *__pyx_v_data = 0; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("_websocket_mask_cython (wrapper)", 0); - { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_mask,&__pyx_n_s_data,0}; - PyObject* values[2] = {0,0}; - if (unlikely(__pyx_kwds)) { - Py_ssize_t kw_args; - const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); - switch (pos_args) { - case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = PyDict_Size(__pyx_kwds); - switch (pos_args) { - case 0: - if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_mask)) != 0)) kw_args--; - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_data)) != 0)) kw_args--; - else { - __Pyx_RaiseArgtupleInvalid("_websocket_mask_cython", 1, 2, 2, 1); __PYX_ERR(0, 11, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_websocket_mask_cython") < 0)) __PYX_ERR(0, 11, __pyx_L3_error) - } - } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = PyTuple_GET_ITEM(__pyx_args, 0); - values[1] = PyTuple_GET_ITEM(__pyx_args, 1); - } - __pyx_v_mask = values[0]; - __pyx_v_data = values[1]; - } - goto __pyx_L4_argument_unpacking_done; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("_websocket_mask_cython", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 11, __pyx_L3_error) - __pyx_L3_error:; - __Pyx_AddTraceback("aiohttp._websocket._websocket_mask_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_7aiohttp_10_websocket__websocket_mask_cython(__pyx_self, __pyx_v_mask, __pyx_v_data); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_7aiohttp_10_websocket__websocket_mask_cython(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_mask, PyObject *__pyx_v_data) { - Py_ssize_t __pyx_v_data_len; - Py_ssize_t __pyx_v_i; - unsigned char *__pyx_v_in_buf; - unsigned char const *__pyx_v_mask_buf; - uint32_t __pyx_v_uint32_msk; - uint64_t __pyx_v_uint64_msk; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - Py_ssize_t __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - PyObject *__pyx_t_4 = NULL; - char *__pyx_t_5; - uint64_t *__pyx_t_6; - long __pyx_t_7; - uint32_t *__pyx_t_8; - Py_ssize_t __pyx_t_9; - Py_ssize_t __pyx_t_10; - Py_ssize_t __pyx_t_11; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_websocket_mask_cython", 0); - __Pyx_INCREF(__pyx_v_mask); - __Pyx_INCREF(__pyx_v_data); - - /* "aiohttp/_websocket.pyx":22 - * uint64_t uint64_msk - * - * assert len(mask) == 4 # <<<<<<<<<<<<<< - * - * if not isinstance(mask, bytes): - */ - #ifndef CYTHON_WITHOUT_ASSERTIONS - if (unlikely(!Py_OptimizeFlag)) { - __pyx_t_1 = PyObject_Length(__pyx_v_mask); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 22, __pyx_L1_error) - if (unlikely(!((__pyx_t_1 == 4) != 0))) { - PyErr_SetNone(PyExc_AssertionError); - __PYX_ERR(0, 22, __pyx_L1_error) - } - } - #endif - - /* "aiohttp/_websocket.pyx":24 - * assert len(mask) == 4 - * - * if not isinstance(mask, bytes): # <<<<<<<<<<<<<< - * mask = bytes(mask) - * - */ - __pyx_t_2 = PyBytes_Check(__pyx_v_mask); - __pyx_t_3 = ((!(__pyx_t_2 != 0)) != 0); - if (__pyx_t_3) { - - /* "aiohttp/_websocket.pyx":25 - * - * if not isinstance(mask, bytes): - * mask = bytes(mask) # <<<<<<<<<<<<<< - * - * if isinstance(data, bytearray): - */ - __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyBytes_Type)), __pyx_v_mask); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 25, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF_SET(__pyx_v_mask, __pyx_t_4); - __pyx_t_4 = 0; - - /* "aiohttp/_websocket.pyx":24 - * assert len(mask) == 4 - * - * if not isinstance(mask, bytes): # <<<<<<<<<<<<<< - * mask = bytes(mask) - * - */ - } - - /* "aiohttp/_websocket.pyx":27 - * mask = bytes(mask) - * - * if isinstance(data, bytearray): # <<<<<<<<<<<<<< - * data = data - * else: - */ - __pyx_t_3 = PyByteArray_Check(__pyx_v_data); - __pyx_t_2 = (__pyx_t_3 != 0); - if (__pyx_t_2) { - - /* "aiohttp/_websocket.pyx":28 - * - * if isinstance(data, bytearray): - * data = data # <<<<<<<<<<<<<< - * else: - * data = bytearray(data) - */ - __pyx_t_4 = __pyx_v_data; - __Pyx_INCREF(__pyx_t_4); - __Pyx_DECREF_SET(__pyx_v_data, __pyx_t_4); - __pyx_t_4 = 0; - - /* "aiohttp/_websocket.pyx":27 - * mask = bytes(mask) - * - * if isinstance(data, bytearray): # <<<<<<<<<<<<<< - * data = data - * else: - */ - goto __pyx_L4; - } - - /* "aiohttp/_websocket.pyx":30 - * data = data - * else: - * data = bytearray(data) # <<<<<<<<<<<<<< - * - * data_len = len(data) - */ - /*else*/ { - __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyByteArray_Type)), __pyx_v_data); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF_SET(__pyx_v_data, __pyx_t_4); - __pyx_t_4 = 0; - } - __pyx_L4:; - - /* "aiohttp/_websocket.pyx":32 - * data = bytearray(data) - * - * data_len = len(data) # <<<<<<<<<<<<<< - * in_buf = PyByteArray_AsString(data) - * mask_buf = PyBytes_AsString(mask) - */ - __pyx_t_1 = PyObject_Length(__pyx_v_data); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 32, __pyx_L1_error) - __pyx_v_data_len = __pyx_t_1; - - /* "aiohttp/_websocket.pyx":33 - * - * data_len = len(data) - * in_buf = PyByteArray_AsString(data) # <<<<<<<<<<<<<< - * mask_buf = PyBytes_AsString(mask) - * uint32_msk = (mask_buf)[0] - */ - if (!(likely(PyByteArray_CheckExact(__pyx_v_data))||((__pyx_v_data) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytearray", Py_TYPE(__pyx_v_data)->tp_name), 0))) __PYX_ERR(0, 33, __pyx_L1_error) - __pyx_t_5 = PyByteArray_AsString(((PyObject*)__pyx_v_data)); if (unlikely(__pyx_t_5 == ((char *)NULL))) __PYX_ERR(0, 33, __pyx_L1_error) - __pyx_v_in_buf = ((unsigned char *)__pyx_t_5); - - /* "aiohttp/_websocket.pyx":34 - * data_len = len(data) - * in_buf = PyByteArray_AsString(data) - * mask_buf = PyBytes_AsString(mask) # <<<<<<<<<<<<<< - * uint32_msk = (mask_buf)[0] - * - */ - __pyx_t_5 = PyBytes_AsString(__pyx_v_mask); if (unlikely(__pyx_t_5 == ((char *)NULL))) __PYX_ERR(0, 34, __pyx_L1_error) - __pyx_v_mask_buf = ((unsigned char const *)__pyx_t_5); - - /* "aiohttp/_websocket.pyx":35 - * in_buf = PyByteArray_AsString(data) - * mask_buf = PyBytes_AsString(mask) - * uint32_msk = (mask_buf)[0] # <<<<<<<<<<<<<< - * - * # TODO: align in_data ptr to achieve even faster speeds - */ - __pyx_v_uint32_msk = (((uint32_t *)__pyx_v_mask_buf)[0]); - - /* "aiohttp/_websocket.pyx":40 - * # does it need in python ?! malloc() always aligns to sizeof(long) bytes - * - * if sizeof(size_t) >= 8: # <<<<<<<<<<<<<< - * uint64_msk = uint32_msk - * uint64_msk = (uint64_msk << 32) | uint32_msk - */ - __pyx_t_2 = (((sizeof(size_t)) >= 8) != 0); - if (__pyx_t_2) { - - /* "aiohttp/_websocket.pyx":41 - * - * if sizeof(size_t) >= 8: - * uint64_msk = uint32_msk # <<<<<<<<<<<<<< - * uint64_msk = (uint64_msk << 32) | uint32_msk - * - */ - __pyx_v_uint64_msk = __pyx_v_uint32_msk; - - /* "aiohttp/_websocket.pyx":42 - * if sizeof(size_t) >= 8: - * uint64_msk = uint32_msk - * uint64_msk = (uint64_msk << 32) | uint32_msk # <<<<<<<<<<<<<< - * - * while data_len >= 8: - */ - __pyx_v_uint64_msk = ((__pyx_v_uint64_msk << 32) | __pyx_v_uint32_msk); - - /* "aiohttp/_websocket.pyx":44 - * uint64_msk = (uint64_msk << 32) | uint32_msk - * - * while data_len >= 8: # <<<<<<<<<<<<<< - * (in_buf)[0] ^= uint64_msk - * in_buf += 8 - */ - while (1) { - __pyx_t_2 = ((__pyx_v_data_len >= 8) != 0); - if (!__pyx_t_2) break; - - /* "aiohttp/_websocket.pyx":45 - * - * while data_len >= 8: - * (in_buf)[0] ^= uint64_msk # <<<<<<<<<<<<<< - * in_buf += 8 - * data_len -= 8 - */ - __pyx_t_6 = ((uint64_t *)__pyx_v_in_buf); - __pyx_t_7 = 0; - (__pyx_t_6[__pyx_t_7]) = ((__pyx_t_6[__pyx_t_7]) ^ __pyx_v_uint64_msk); - - /* "aiohttp/_websocket.pyx":46 - * while data_len >= 8: - * (in_buf)[0] ^= uint64_msk - * in_buf += 8 # <<<<<<<<<<<<<< - * data_len -= 8 - * - */ - __pyx_v_in_buf = (__pyx_v_in_buf + 8); - - /* "aiohttp/_websocket.pyx":47 - * (in_buf)[0] ^= uint64_msk - * in_buf += 8 - * data_len -= 8 # <<<<<<<<<<<<<< - * - * - */ - __pyx_v_data_len = (__pyx_v_data_len - 8); - } - - /* "aiohttp/_websocket.pyx":40 - * # does it need in python ?! malloc() always aligns to sizeof(long) bytes - * - * if sizeof(size_t) >= 8: # <<<<<<<<<<<<<< - * uint64_msk = uint32_msk - * uint64_msk = (uint64_msk << 32) | uint32_msk - */ - } - - /* "aiohttp/_websocket.pyx":50 - * - * - * while data_len >= 4: # <<<<<<<<<<<<<< - * (in_buf)[0] ^= uint32_msk - * in_buf += 4 - */ - while (1) { - __pyx_t_2 = ((__pyx_v_data_len >= 4) != 0); - if (!__pyx_t_2) break; - - /* "aiohttp/_websocket.pyx":51 - * - * while data_len >= 4: - * (in_buf)[0] ^= uint32_msk # <<<<<<<<<<<<<< - * in_buf += 4 - * data_len -= 4 - */ - __pyx_t_8 = ((uint32_t *)__pyx_v_in_buf); - __pyx_t_7 = 0; - (__pyx_t_8[__pyx_t_7]) = ((__pyx_t_8[__pyx_t_7]) ^ __pyx_v_uint32_msk); - - /* "aiohttp/_websocket.pyx":52 - * while data_len >= 4: - * (in_buf)[0] ^= uint32_msk - * in_buf += 4 # <<<<<<<<<<<<<< - * data_len -= 4 - * - */ - __pyx_v_in_buf = (__pyx_v_in_buf + 4); - - /* "aiohttp/_websocket.pyx":53 - * (in_buf)[0] ^= uint32_msk - * in_buf += 4 - * data_len -= 4 # <<<<<<<<<<<<<< - * - * for i in range(0, data_len): - */ - __pyx_v_data_len = (__pyx_v_data_len - 4); - } - - /* "aiohttp/_websocket.pyx":55 - * data_len -= 4 - * - * for i in range(0, data_len): # <<<<<<<<<<<<<< - * in_buf[i] ^= mask_buf[i] - */ - __pyx_t_1 = __pyx_v_data_len; - __pyx_t_9 = __pyx_t_1; - for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { - __pyx_v_i = __pyx_t_10; - - /* "aiohttp/_websocket.pyx":56 - * - * for i in range(0, data_len): - * in_buf[i] ^= mask_buf[i] # <<<<<<<<<<<<<< - */ - __pyx_t_11 = __pyx_v_i; - (__pyx_v_in_buf[__pyx_t_11]) = ((__pyx_v_in_buf[__pyx_t_11]) ^ (__pyx_v_mask_buf[__pyx_v_i])); - } - - /* "aiohttp/_websocket.pyx":11 - * - * - * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< - * """Note, this function mutates its `data` argument - * """ - */ - - /* function exit code */ - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("aiohttp._websocket._websocket_mask_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_mask); - __Pyx_XDECREF(__pyx_v_data); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyMethodDef __pyx_methods[] = { - {0, 0, 0, 0} -}; - -#if PY_MAJOR_VERSION >= 3 -#if CYTHON_PEP489_MULTI_PHASE_INIT -static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ -static int __pyx_pymod_exec__websocket(PyObject* module); /*proto*/ -static PyModuleDef_Slot __pyx_moduledef_slots[] = { - {Py_mod_create, (void*)__pyx_pymod_create}, - {Py_mod_exec, (void*)__pyx_pymod_exec__websocket}, - {0, NULL} -}; -#endif - -static struct PyModuleDef __pyx_moduledef = { - PyModuleDef_HEAD_INIT, - "_websocket", - 0, /* m_doc */ - #if CYTHON_PEP489_MULTI_PHASE_INIT - 0, /* m_size */ - #else - -1, /* m_size */ - #endif - __pyx_methods /* m_methods */, - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_moduledef_slots, /* m_slots */ - #else - NULL, /* m_reload */ - #endif - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ -}; -#endif -#ifndef CYTHON_SMALL_CODE -#if defined(__clang__) - #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) - #define CYTHON_SMALL_CODE __attribute__((cold)) -#else - #define CYTHON_SMALL_CODE -#endif -#endif - -static __Pyx_StringTabEntry __pyx_string_tab[] = { - {&__pyx_n_s_aiohttp__websocket, __pyx_k_aiohttp__websocket, sizeof(__pyx_k_aiohttp__websocket), 0, 0, 1, 1}, - {&__pyx_kp_s_aiohttp__websocket_pyx, __pyx_k_aiohttp__websocket_pyx, sizeof(__pyx_k_aiohttp__websocket_pyx), 0, 0, 1, 0}, - {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, - {&__pyx_n_s_data, __pyx_k_data, sizeof(__pyx_k_data), 0, 0, 1, 1}, - {&__pyx_n_s_data_len, __pyx_k_data_len, sizeof(__pyx_k_data_len), 0, 0, 1, 1}, - {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, - {&__pyx_n_s_in_buf, __pyx_k_in_buf, sizeof(__pyx_k_in_buf), 0, 0, 1, 1}, - {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, - {&__pyx_n_s_mask, __pyx_k_mask, sizeof(__pyx_k_mask), 0, 0, 1, 1}, - {&__pyx_n_s_mask_buf, __pyx_k_mask_buf, sizeof(__pyx_k_mask_buf), 0, 0, 1, 1}, - {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, - {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, - {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, - {&__pyx_n_s_uint32_msk, __pyx_k_uint32_msk, sizeof(__pyx_k_uint32_msk), 0, 0, 1, 1}, - {&__pyx_n_s_uint64_msk, __pyx_k_uint64_msk, sizeof(__pyx_k_uint64_msk), 0, 0, 1, 1}, - {&__pyx_n_s_websocket_mask_cython, __pyx_k_websocket_mask_cython, sizeof(__pyx_k_websocket_mask_cython), 0, 0, 1, 1}, - {0, 0, 0, 0, 0, 0, 0} -}; -static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 55, __pyx_L1_error) - return 0; - __pyx_L1_error:; - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - - /* "aiohttp/_websocket.pyx":11 - * - * - * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< - * """Note, this function mutates its `data` argument - * """ - */ - __pyx_tuple_ = PyTuple_Pack(8, __pyx_n_s_mask, __pyx_n_s_data, __pyx_n_s_data_len, __pyx_n_s_i, __pyx_n_s_in_buf, __pyx_n_s_mask_buf, __pyx_n_s_uint32_msk, __pyx_n_s_uint64_msk); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 11, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple_); - __Pyx_GIVEREF(__pyx_tuple_); - __pyx_codeobj__2 = (PyObject*)__Pyx_PyCode_New(2, 0, 8, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple_, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_aiohttp__websocket_pyx, __pyx_n_s_websocket_mask_cython, 11, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__2)) __PYX_ERR(0, 11, __pyx_L1_error) - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_RefNannyFinishContext(); - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { - if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); - return 0; - __pyx_L1_error:; - return -1; -} - -static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ - -static int __Pyx_modinit_global_init_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); - /*--- Global init code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_variable_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); - /*--- Variable export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); - /*--- Function export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_type_init_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); - /*--- Type init code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_type_import_code(void) { - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); - /*--- Type import code ---*/ - __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", - #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 - sizeof(PyTypeObject), - #else - sizeof(PyHeapTypeObject), - #endif - __Pyx_ImportType_CheckSize_Warn); - if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(1, 9, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 8, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __Pyx_ImportType_CheckSize_Warn); - if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(2, 8, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 15, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __Pyx_ImportType_CheckSize_Warn); - if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(3, 15, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_RefNannyFinishContext(); - return -1; -} - -static int __Pyx_modinit_variable_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); - /*--- Variable import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); - /*--- Function import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - - -#ifndef CYTHON_NO_PYINIT_EXPORT -#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC -#elif PY_MAJOR_VERSION < 3 -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" void -#else -#define __Pyx_PyMODINIT_FUNC void -#endif -#else -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * -#else -#define __Pyx_PyMODINIT_FUNC PyObject * -#endif -#endif - - -#if PY_MAJOR_VERSION < 3 -__Pyx_PyMODINIT_FUNC init_websocket(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC init_websocket(void) -#else -__Pyx_PyMODINIT_FUNC PyInit__websocket(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC PyInit__websocket(void) -#if CYTHON_PEP489_MULTI_PHASE_INIT -{ - return PyModuleDef_Init(&__pyx_moduledef); -} -static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { - #if PY_VERSION_HEX >= 0x030700A1 - static PY_INT64_T main_interpreter_id = -1; - PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); - if (main_interpreter_id == -1) { - main_interpreter_id = current_id; - return (unlikely(current_id == -1)) ? -1 : 0; - } else if (unlikely(main_interpreter_id != current_id)) - #else - static PyInterpreterState *main_interpreter = NULL; - PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; - if (!main_interpreter) { - main_interpreter = current_interpreter; - } else if (unlikely(main_interpreter != current_interpreter)) - #endif - { - PyErr_SetString( - PyExc_ImportError, - "Interpreter change detected - this module can only be loaded into one interpreter per process."); - return -1; - } - return 0; -} -static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { - PyObject *value = PyObject_GetAttrString(spec, from_name); - int result = 0; - if (likely(value)) { - if (allow_none || value != Py_None) { - result = PyDict_SetItemString(moddict, to_name, value); - } - Py_DECREF(value); - } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Clear(); - } else { - result = -1; - } - return result; -} -static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { - PyObject *module = NULL, *moddict, *modname; - if (__Pyx_check_single_interpreter()) - return NULL; - if (__pyx_m) - return __Pyx_NewRef(__pyx_m); - modname = PyObject_GetAttrString(spec, "name"); - if (unlikely(!modname)) goto bad; - module = PyModule_NewObject(modname); - Py_DECREF(modname); - if (unlikely(!module)) goto bad; - moddict = PyModule_GetDict(module); - if (unlikely(!moddict)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; - return module; -bad: - Py_XDECREF(module); - return NULL; -} - - -static CYTHON_SMALL_CODE int __pyx_pymod_exec__websocket(PyObject *__pyx_pyinit_module) -#endif -#endif -{ - PyObject *__pyx_t_1 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannyDeclarations - #if CYTHON_PEP489_MULTI_PHASE_INIT - if (__pyx_m) { - if (__pyx_m == __pyx_pyinit_module) return 0; - PyErr_SetString(PyExc_RuntimeError, "Module '_websocket' has already been imported. Re-initialisation is not supported."); - return -1; - } - #elif PY_MAJOR_VERSION >= 3 - if (__pyx_m) return __Pyx_NewRef(__pyx_m); - #endif - #if CYTHON_REFNANNY -__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); -if (!__Pyx_RefNanny) { - PyErr_Clear(); - __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); - if (!__Pyx_RefNanny) - Py_FatalError("failed to import 'refnanny' module"); -} -#endif - __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__websocket(void)", 0); - if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #ifdef __Pxy_PyFrame_Initialize_Offsets - __Pxy_PyFrame_Initialize_Offsets(); - #endif - __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) - #ifdef __Pyx_CyFunction_USED - if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_FusedFunction_USED - if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Coroutine_USED - if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Generator_USED - if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_AsyncGen_USED - if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_StopAsyncIteration_USED - if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - /*--- Library function declarations ---*/ - /*--- Threads initialization code ---*/ - #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS - PyEval_InitThreads(); - #endif - /*--- Module creation code ---*/ - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_m = __pyx_pyinit_module; - Py_INCREF(__pyx_m); - #else - #if PY_MAJOR_VERSION < 3 - __pyx_m = Py_InitModule4("_websocket", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); - #else - __pyx_m = PyModule_Create(&__pyx_moduledef); - #endif - if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_d); - __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_b); - __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_cython_runtime); - if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); - /*--- Initialize various global constants etc. ---*/ - if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) - if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - if (__pyx_module_is_main_aiohttp___websocket) { - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - } - #if PY_MAJOR_VERSION >= 3 - { - PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) - if (!PyDict_GetItemString(modules, "aiohttp._websocket")) { - if (unlikely(PyDict_SetItemString(modules, "aiohttp._websocket", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) - } - } - #endif - /*--- Builtin init code ---*/ - if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - /*--- Constants init code ---*/ - if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - /*--- Global type/function init code ---*/ - (void)__Pyx_modinit_global_init_code(); - (void)__Pyx_modinit_variable_export_code(); - (void)__Pyx_modinit_function_export_code(); - (void)__Pyx_modinit_type_init_code(); - if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) - (void)__Pyx_modinit_variable_import_code(); - (void)__Pyx_modinit_function_import_code(); - /*--- Execution code ---*/ - #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) - if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - - /* "aiohttp/_websocket.pyx":11 - * - * - * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< - * """Note, this function mutates its `data` argument - * """ - */ - __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7aiohttp_10_websocket_1_websocket_mask_cython, NULL, __pyx_n_s_aiohttp__websocket); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 11, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_websocket_mask_cython, __pyx_t_1) < 0) __PYX_ERR(0, 11, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /* "aiohttp/_websocket.pyx":1 - * from cpython cimport PyBytes_AsString # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - - /*--- Wrapped vars code ---*/ - - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - if (__pyx_m) { - if (__pyx_d) { - __Pyx_AddTraceback("init aiohttp._websocket", __pyx_clineno, __pyx_lineno, __pyx_filename); - } - Py_CLEAR(__pyx_m); - } else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ImportError, "init aiohttp._websocket"); - } - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - #if CYTHON_PEP489_MULTI_PHASE_INIT - return (__pyx_m != NULL) ? 0 : -1; - #elif PY_MAJOR_VERSION >= 3 - return __pyx_m; - #else - return; - #endif -} - -/* --- Runtime support code --- */ -/* Refnanny */ -#if CYTHON_REFNANNY -static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { - PyObject *m = NULL, *p = NULL; - void *r = NULL; - m = PyImport_ImportModule(modname); - if (!m) goto end; - p = PyObject_GetAttrString(m, "RefNannyAPI"); - if (!p) goto end; - r = PyLong_AsVoidPtr(p); -end: - Py_XDECREF(p); - Py_XDECREF(m); - return (__Pyx_RefNannyAPIStruct *)r; -} -#endif - -/* PyObjectGetAttrStr */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { - PyTypeObject* tp = Py_TYPE(obj); - if (likely(tp->tp_getattro)) - return tp->tp_getattro(obj, attr_name); -#if PY_MAJOR_VERSION < 3 - if (likely(tp->tp_getattr)) - return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); -#endif - return PyObject_GetAttr(obj, attr_name); -} -#endif - -/* GetBuiltinName */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name) { - PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); - if (unlikely(!result)) { - PyErr_Format(PyExc_NameError, -#if PY_MAJOR_VERSION >= 3 - "name '%U' is not defined", name); -#else - "name '%.200s' is not defined", PyString_AS_STRING(name)); -#endif - } - return result; -} - -/* RaiseArgTupleInvalid */ -static void __Pyx_RaiseArgtupleInvalid( - const char* func_name, - int exact, - Py_ssize_t num_min, - Py_ssize_t num_max, - Py_ssize_t num_found) -{ - Py_ssize_t num_expected; - const char *more_or_less; - if (num_found < num_min) { - num_expected = num_min; - more_or_less = "at least"; - } else { - num_expected = num_max; - more_or_less = "at most"; - } - if (exact) { - more_or_less = "exactly"; - } - PyErr_Format(PyExc_TypeError, - "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", - func_name, more_or_less, num_expected, - (num_expected == 1) ? "" : "s", num_found); -} - -/* RaiseDoubleKeywords */ -static void __Pyx_RaiseDoubleKeywordsError( - const char* func_name, - PyObject* kw_name) -{ - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION >= 3 - "%s() got multiple values for keyword argument '%U'", func_name, kw_name); - #else - "%s() got multiple values for keyword argument '%s'", func_name, - PyString_AsString(kw_name)); - #endif -} - -/* ParseKeywords */ -static int __Pyx_ParseOptionalKeywords( - PyObject *kwds, - PyObject **argnames[], - PyObject *kwds2, - PyObject *values[], - Py_ssize_t num_pos_args, - const char* function_name) -{ - PyObject *key = 0, *value = 0; - Py_ssize_t pos = 0; - PyObject*** name; - PyObject*** first_kw_arg = argnames + num_pos_args; - while (PyDict_Next(kwds, &pos, &key, &value)) { - name = first_kw_arg; - while (*name && (**name != key)) name++; - if (*name) { - values[name-argnames] = value; - continue; - } - name = first_kw_arg; - #if PY_MAJOR_VERSION < 3 - if (likely(PyString_Check(key))) { - while (*name) { - if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) - && _PyString_Eq(**name, key)) { - values[name-argnames] = value; - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - if ((**argname == key) || ( - (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) - && _PyString_Eq(**argname, key))) { - goto arg_passed_twice; - } - argname++; - } - } - } else - #endif - if (likely(PyUnicode_Check(key))) { - while (*name) { - int cmp = (**name == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : - #endif - PyUnicode_Compare(**name, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) { - values[name-argnames] = value; - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - int cmp = (**argname == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : - #endif - PyUnicode_Compare(**argname, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) goto arg_passed_twice; - argname++; - } - } - } else - goto invalid_keyword_type; - if (kwds2) { - if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; - } else { - goto invalid_keyword; - } - } - return 0; -arg_passed_twice: - __Pyx_RaiseDoubleKeywordsError(function_name, key); - goto bad; -invalid_keyword_type: - PyErr_Format(PyExc_TypeError, - "%.200s() keywords must be strings", function_name); - goto bad; -invalid_keyword: - PyErr_Format(PyExc_TypeError, - #if PY_MAJOR_VERSION < 3 - "%.200s() got an unexpected keyword argument '%.200s'", - function_name, PyString_AsString(key)); - #else - "%s() got an unexpected keyword argument '%U'", - function_name, key); - #endif -bad: - return -1; -} - -/* PyCFunctionFastCall */ -#if CYTHON_FAST_PYCCALL -static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { - PyCFunctionObject *func = (PyCFunctionObject*)func_obj; - PyCFunction meth = PyCFunction_GET_FUNCTION(func); - PyObject *self = PyCFunction_GET_SELF(func); - int flags = PyCFunction_GET_FLAGS(func); - assert(PyCFunction_Check(func)); - assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); - assert(nargs >= 0); - assert(nargs == 0 || args != NULL); - /* _PyCFunction_FastCallDict() must not be called with an exception set, - because it may clear it (directly or indirectly) and so the - caller loses its exception */ - assert(!PyErr_Occurred()); - if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { - return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); - } else { - return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); - } -} -#endif - -/* PyFunctionFastCall */ -#if CYTHON_FAST_PYCALL -static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, - PyObject *globals) { - PyFrameObject *f; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject **fastlocals; - Py_ssize_t i; - PyObject *result; - assert(globals != NULL); - /* XXX Perhaps we should create a specialized - PyFrame_New() that doesn't take locals, but does - take builtins without sanity checking them. - */ - assert(tstate != NULL); - f = PyFrame_New(tstate, co, globals, NULL); - if (f == NULL) { - return NULL; - } - fastlocals = __Pyx_PyFrame_GetLocalsplus(f); - for (i = 0; i < na; i++) { - Py_INCREF(*args); - fastlocals[i] = *args++; - } - result = PyEval_EvalFrameEx(f,0); - ++tstate->recursion_depth; - Py_DECREF(f); - --tstate->recursion_depth; - return result; -} -#if 1 || PY_VERSION_HEX < 0x030600B1 -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *globals = PyFunction_GET_GLOBALS(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - PyObject *closure; -#if PY_MAJOR_VERSION >= 3 - PyObject *kwdefs; -#endif - PyObject *kwtuple, **k; - PyObject **d; - Py_ssize_t nd; - Py_ssize_t nk; - PyObject *result; - assert(kwargs == NULL || PyDict_Check(kwargs)); - nk = kwargs ? PyDict_Size(kwargs) : 0; - if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { - return NULL; - } - if ( -#if PY_MAJOR_VERSION >= 3 - co->co_kwonlyargcount == 0 && -#endif - likely(kwargs == NULL || nk == 0) && - co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { - if (argdefs == NULL && co->co_argcount == nargs) { - result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); - goto done; - } - else if (nargs == 0 && argdefs != NULL - && co->co_argcount == Py_SIZE(argdefs)) { - /* function called with no arguments, but all parameters have - a default value: use default values as arguments .*/ - args = &PyTuple_GET_ITEM(argdefs, 0); - result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); - goto done; - } - } - if (kwargs != NULL) { - Py_ssize_t pos, i; - kwtuple = PyTuple_New(2 * nk); - if (kwtuple == NULL) { - result = NULL; - goto done; - } - k = &PyTuple_GET_ITEM(kwtuple, 0); - pos = i = 0; - while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { - Py_INCREF(k[i]); - Py_INCREF(k[i+1]); - i += 2; - } - nk = i / 2; - } - else { - kwtuple = NULL; - k = NULL; - } - closure = PyFunction_GET_CLOSURE(func); -#if PY_MAJOR_VERSION >= 3 - kwdefs = PyFunction_GET_KW_DEFAULTS(func); -#endif - if (argdefs != NULL) { - d = &PyTuple_GET_ITEM(argdefs, 0); - nd = Py_SIZE(argdefs); - } - else { - d = NULL; - nd = 0; - } -#if PY_MAJOR_VERSION >= 3 - result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, kwdefs, closure); -#else - result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, closure); -#endif - Py_XDECREF(kwtuple); -done: - Py_LeaveRecursiveCall(); - return result; -} -#endif -#endif - -/* PyObjectCall */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { - PyObject *result; - ternaryfunc call = Py_TYPE(func)->tp_call; - if (unlikely(!call)) - return PyObject_Call(func, arg, kw); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = (*call)(func, arg, kw); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* PyObjectCallMethO */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { - PyObject *self, *result; - PyCFunction cfunc; - cfunc = PyCFunction_GET_FUNCTION(func); - self = PyCFunction_GET_SELF(func); - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - result = cfunc(self, arg); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* PyObjectCallOneArg */ -#if CYTHON_COMPILING_IN_CPYTHON -static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *result; - PyObject *args = PyTuple_New(1); - if (unlikely(!args)) return NULL; - Py_INCREF(arg); - PyTuple_SET_ITEM(args, 0, arg); - result = __Pyx_PyObject_Call(func, args, NULL); - Py_DECREF(args); - return result; -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { -#if CYTHON_FAST_PYCALL - if (PyFunction_Check(func)) { - return __Pyx_PyFunction_FastCall(func, &arg, 1); - } -#endif - if (likely(PyCFunction_Check(func))) { - if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { - return __Pyx_PyObject_CallMethO(func, arg); -#if CYTHON_FAST_PYCCALL - } else if (__Pyx_PyFastCFunction_Check(func)) { - return __Pyx_PyCFunction_FastCall(func, &arg, 1); -#endif - } - } - return __Pyx__PyObject_CallOneArg(func, arg); -} -#else -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *result; - PyObject *args = PyTuple_Pack(1, arg); - if (unlikely(!args)) return NULL; - result = __Pyx_PyObject_Call(func, args, NULL); - Py_DECREF(args); - return result; -} -#endif - -/* TypeImport */ -#ifndef __PYX_HAVE_RT_ImportType -#define __PYX_HAVE_RT_ImportType -static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name, - size_t size, enum __Pyx_ImportType_CheckSize check_size) -{ - PyObject *result = 0; - char warning[200]; - Py_ssize_t basicsize; -#ifdef Py_LIMITED_API - PyObject *py_basicsize; -#endif - result = PyObject_GetAttrString(module, class_name); - if (!result) - goto bad; - if (!PyType_Check(result)) { - PyErr_Format(PyExc_TypeError, - "%.200s.%.200s is not a type object", - module_name, class_name); - goto bad; - } -#ifndef Py_LIMITED_API - basicsize = ((PyTypeObject *)result)->tp_basicsize; -#else - py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); - if (!py_basicsize) - goto bad; - basicsize = PyLong_AsSsize_t(py_basicsize); - Py_DECREF(py_basicsize); - py_basicsize = 0; - if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) - goto bad; -#endif - if ((size_t)basicsize < size) { - PyErr_Format(PyExc_ValueError, - "%.200s.%.200s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - goto bad; - } - if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) { - PyErr_Format(PyExc_ValueError, - "%.200s.%.200s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - goto bad; - } - else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) { - PyOS_snprintf(warning, sizeof(warning), - "%s.%s size changed, may indicate binary incompatibility. " - "Expected %zd from C header, got %zd from PyObject", - module_name, class_name, size, basicsize); - if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; - } - return (PyTypeObject *)result; -bad: - Py_XDECREF(result); - return NULL; -} -#endif - -/* PyDictVersioning */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { - PyObject **dictptr = NULL; - Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; - if (offset) { -#if CYTHON_COMPILING_IN_CPYTHON - dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); -#else - dictptr = _PyObject_GetDictPtr(obj); -#endif - } - return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; -} -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) - return 0; - return obj_dict_version == __Pyx_get_object_dict_version(obj); -} -#endif - -/* PyErrFetchRestore */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - tmp_type = tstate->curexc_type; - tmp_value = tstate->curexc_value; - tmp_tb = tstate->curexc_traceback; - tstate->curexc_type = type; - tstate->curexc_value = value; - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -} -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - *type = tstate->curexc_type; - *value = tstate->curexc_value; - *tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -} -#endif - -/* CLineInTraceback */ -#ifndef CYTHON_CLINE_IN_TRACEBACK -static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { - PyObject *use_cline; - PyObject *ptype, *pvalue, *ptraceback; -#if CYTHON_COMPILING_IN_CPYTHON - PyObject **cython_runtime_dict; -#endif - if (unlikely(!__pyx_cython_runtime)) { - return c_line; - } - __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); -#if CYTHON_COMPILING_IN_CPYTHON - cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); - if (likely(cython_runtime_dict)) { - __PYX_PY_DICT_LOOKUP_IF_MODIFIED( - use_cline, *cython_runtime_dict, - __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) - } else -#endif - { - PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); - if (use_cline_obj) { - use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; - Py_DECREF(use_cline_obj); - } else { - PyErr_Clear(); - use_cline = NULL; - } - } - if (!use_cline) { - c_line = 0; - PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); - } - else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { - c_line = 0; - } - __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); - return c_line; -} -#endif - -/* CodeObjectCache */ -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { - int start = 0, mid = 0, end = count - 1; - if (end >= 0 && code_line > entries[end].code_line) { - return count; - } - while (start < end) { - mid = start + (end - start) / 2; - if (code_line < entries[mid].code_line) { - end = mid; - } else if (code_line > entries[mid].code_line) { - start = mid + 1; - } else { - return mid; - } - } - if (code_line <= entries[mid].code_line) { - return mid; - } else { - return mid + 1; - } -} -static PyCodeObject *__pyx_find_code_object(int code_line) { - PyCodeObject* code_object; - int pos; - if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { - return NULL; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { - return NULL; - } - code_object = __pyx_code_cache.entries[pos].code_object; - Py_INCREF(code_object); - return code_object; -} -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { - int pos, i; - __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; - if (unlikely(!code_line)) { - return; - } - if (unlikely(!entries)) { - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); - if (likely(entries)) { - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = 64; - __pyx_code_cache.count = 1; - entries[0].code_line = code_line; - entries[0].code_object = code_object; - Py_INCREF(code_object); - } - return; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { - PyCodeObject* tmp = entries[pos].code_object; - entries[pos].code_object = code_object; - Py_DECREF(tmp); - return; - } - if (__pyx_code_cache.count == __pyx_code_cache.max_count) { - int new_max = __pyx_code_cache.max_count + 64; - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( - __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); - if (unlikely(!entries)) { - return; - } - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = new_max; - } - for (i=__pyx_code_cache.count; i>pos; i--) { - entries[i] = entries[i-1]; - } - entries[pos].code_line = code_line; - entries[pos].code_object = code_object; - __pyx_code_cache.count++; - Py_INCREF(code_object); -} - -/* AddTraceback */ -#include "compile.h" -#include "frameobject.h" -#include "traceback.h" -static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( - const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyObject *py_srcfile = 0; - PyObject *py_funcname = 0; - #if PY_MAJOR_VERSION < 3 - py_srcfile = PyString_FromString(filename); - #else - py_srcfile = PyUnicode_FromString(filename); - #endif - if (!py_srcfile) goto bad; - if (c_line) { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - #else - py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - #endif - } - else { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromString(funcname); - #else - py_funcname = PyUnicode_FromString(funcname); - #endif - } - if (!py_funcname) goto bad; - py_code = __Pyx_PyCode_New( - 0, - 0, - 0, - 0, - 0, - __pyx_empty_bytes, /*PyObject *code,*/ - __pyx_empty_tuple, /*PyObject *consts,*/ - __pyx_empty_tuple, /*PyObject *names,*/ - __pyx_empty_tuple, /*PyObject *varnames,*/ - __pyx_empty_tuple, /*PyObject *freevars,*/ - __pyx_empty_tuple, /*PyObject *cellvars,*/ - py_srcfile, /*PyObject *filename,*/ - py_funcname, /*PyObject *name,*/ - py_line, - __pyx_empty_bytes /*PyObject *lnotab*/ - ); - Py_DECREF(py_srcfile); - Py_DECREF(py_funcname); - return py_code; -bad: - Py_XDECREF(py_srcfile); - Py_XDECREF(py_funcname); - return NULL; -} -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyFrameObject *py_frame = 0; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - if (c_line) { - c_line = __Pyx_CLineForTraceback(tstate, c_line); - } - py_code = __pyx_find_code_object(c_line ? -c_line : py_line); - if (!py_code) { - py_code = __Pyx_CreateCodeObjectForTraceback( - funcname, c_line, py_line, filename); - if (!py_code) goto bad; - __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); - } - py_frame = PyFrame_New( - tstate, /*PyThreadState *tstate,*/ - py_code, /*PyCodeObject *code,*/ - __pyx_d, /*PyObject *globals,*/ - 0 /*PyObject *locals*/ - ); - if (!py_frame) goto bad; - __Pyx_PyFrame_SetLineNumber(py_frame, py_line); - PyTraceBack_Here(py_frame); -bad: - Py_XDECREF(py_code); - Py_XDECREF(py_frame); -} - -/* CIntToPy */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const long neg_one = (long) -1, const_zero = (long) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(long) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(long) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(long) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(long), - little, !is_unsigned); - } -} - -/* CIntFromPyVerify */ -#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) -#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) -#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ - {\ - func_type value = func_value;\ - if (sizeof(target_type) < sizeof(func_type)) {\ - if (unlikely(value != (func_type) (target_type) value)) {\ - func_type zero = 0;\ - if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ - return (target_type) -1;\ - if (is_unsigned && unlikely(value < zero))\ - goto raise_neg_overflow;\ - else\ - goto raise_overflow;\ - }\ - }\ - return (target_type) value;\ - } - -/* CIntFromPy */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const long neg_one = (long) -1, const_zero = (long) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(long) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (long) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (long) 0; - case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) - case 2: - if (8 * sizeof(long) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { - return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(long) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { - return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(long) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { - return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (long) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(long) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (long) 0; - case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) - case -2: - if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(long) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(long) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(long) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - } -#endif - if (sizeof(long) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - long val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (long) -1; - } - } else { - long val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (long) -1; - val = __Pyx_PyInt_As_long(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to long"); - return (long) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to long"); - return (long) -1; -} - -/* CIntFromPy */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const int neg_one = (int) -1, const_zero = (int) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if (sizeof(int) < sizeof(long)) { - __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (int) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { - return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { - return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { - return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (int) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if (sizeof(int) <= sizeof(unsigned long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)x)->ob_digit; - switch (Py_SIZE(x)) { - case 0: return (int) 0; - case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) - case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) - case -2: - if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 2: - if (8 * sizeof(int) > 1 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -3: - if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 3: - if (8 * sizeof(int) > 2 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -4: - if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(int) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { - return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - } -#endif - if (sizeof(int) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - int val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (int) -1; - } - } else { - int val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (int) -1; - val = __Pyx_PyInt_As_int(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to int"); - return (int) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to int"); - return (int) -1; -} - -/* FastTypeChecks */ -#if CYTHON_COMPILING_IN_CPYTHON -static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { - while (a) { - a = a->tp_base; - if (a == b) - return 1; - } - return b == &PyBaseObject_Type; -} -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { - PyObject *mro; - if (a == b) return 1; - mro = a->tp_mro; - if (likely(mro)) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(mro); - for (i = 0; i < n; i++) { - if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) - return 1; - } - return 0; - } - return __Pyx_InBases(a, b); -} -#if PY_MAJOR_VERSION == 2 -static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { - PyObject *exception, *value, *tb; - int res; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ErrFetch(&exception, &value, &tb); - res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - if (!res) { - res = PyObject_IsSubclass(err, exc_type2); - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - } - __Pyx_ErrRestore(exception, value, tb); - return res; -} -#else -static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { - int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; - if (!res) { - res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); - } - return res; -} -#endif -static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { - Py_ssize_t i, n; - assert(PyExceptionClass_Check(exc_type)); - n = PyTuple_GET_SIZE(tuple); -#if PY_MAJOR_VERSION >= 3 - for (i=0; ip) { - #if PY_MAJOR_VERSION < 3 - if (t->is_unicode) { - *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); - } else if (t->intern) { - *t->p = PyString_InternFromString(t->s); - } else { - *t->p = PyString_FromStringAndSize(t->s, t->n - 1); - } - #else - if (t->is_unicode | t->is_str) { - if (t->intern) { - *t->p = PyUnicode_InternFromString(t->s); - } else if (t->encoding) { - *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); - } else { - *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); - } - } else { - *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); - } - #endif - if (!*t->p) - return -1; - if (PyObject_Hash(*t->p) == -1) - return -1; - ++t; - } - return 0; -} - -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { - return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); -} -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { - Py_ssize_t ignore; - return __Pyx_PyObject_AsStringAndSize(o, &ignore); -} -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -#if !CYTHON_PEP393_ENABLED -static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - char* defenc_c; - PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); - if (!defenc) return NULL; - defenc_c = PyBytes_AS_STRING(defenc); -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - { - char* end = defenc_c + PyBytes_GET_SIZE(defenc); - char* c; - for (c = defenc_c; c < end; c++) { - if ((unsigned char) (*c) >= 128) { - PyUnicode_AsASCIIString(o); - return NULL; - } - } - } -#endif - *length = PyBytes_GET_SIZE(defenc); - return defenc_c; -} -#else -static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - if (likely(PyUnicode_IS_ASCII(o))) { - *length = PyUnicode_GET_LENGTH(o); - return PyUnicode_AsUTF8(o); - } else { - PyUnicode_AsASCIIString(o); - return NULL; - } -#else - return PyUnicode_AsUTF8AndSize(o, length); -#endif -} -#endif -#endif -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT - if ( -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - __Pyx_sys_getdefaultencoding_not_ascii && -#endif - PyUnicode_Check(o)) { - return __Pyx_PyUnicode_AsStringAndSize(o, length); - } else -#endif -#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) - if (PyByteArray_Check(o)) { - *length = PyByteArray_GET_SIZE(o); - return PyByteArray_AS_STRING(o); - } else -#endif - { - char* result; - int r = PyBytes_AsStringAndSize(o, &result, length); - if (unlikely(r < 0)) { - return NULL; - } else { - return result; - } - } -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { - int is_true = x == Py_True; - if (is_true | (x == Py_False) | (x == Py_None)) return is_true; - else return PyObject_IsTrue(x); -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { - int retval; - if (unlikely(!x)) return -1; - retval = __Pyx_PyObject_IsTrue(x); - Py_DECREF(x); - return retval; -} -static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { -#if PY_MAJOR_VERSION >= 3 - if (PyLong_Check(result)) { - if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, - "__int__ returned non-int (type %.200s). " - "The ability to return an instance of a strict subclass of int " - "is deprecated, and may be removed in a future version of Python.", - Py_TYPE(result)->tp_name)) { - Py_DECREF(result); - return NULL; - } - return result; - } -#endif - PyErr_Format(PyExc_TypeError, - "__%.4s__ returned non-%.4s (type %.200s)", - type_name, type_name, Py_TYPE(result)->tp_name); - Py_DECREF(result); - return NULL; -} -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { -#if CYTHON_USE_TYPE_SLOTS - PyNumberMethods *m; -#endif - const char *name = NULL; - PyObject *res = NULL; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x) || PyLong_Check(x))) -#else - if (likely(PyLong_Check(x))) -#endif - return __Pyx_NewRef(x); -#if CYTHON_USE_TYPE_SLOTS - m = Py_TYPE(x)->tp_as_number; - #if PY_MAJOR_VERSION < 3 - if (m && m->nb_int) { - name = "int"; - res = m->nb_int(x); - } - else if (m && m->nb_long) { - name = "long"; - res = m->nb_long(x); - } - #else - if (likely(m && m->nb_int)) { - name = "int"; - res = m->nb_int(x); - } - #endif -#else - if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { - res = PyNumber_Int(x); - } -#endif - if (likely(res)) { -#if PY_MAJOR_VERSION < 3 - if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { -#else - if (unlikely(!PyLong_CheckExact(res))) { -#endif - return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); - } - } - else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, - "an integer is required"); - } - return res; -} -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { - Py_ssize_t ival; - PyObject *x; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_CheckExact(b))) { - if (sizeof(Py_ssize_t) >= sizeof(long)) - return PyInt_AS_LONG(b); - else - return PyInt_AsSsize_t(b); - } -#endif - if (likely(PyLong_CheckExact(b))) { - #if CYTHON_USE_PYLONG_INTERNALS - const digit* digits = ((PyLongObject*)b)->ob_digit; - const Py_ssize_t size = Py_SIZE(b); - if (likely(__Pyx_sst_abs(size) <= 1)) { - ival = likely(size) ? digits[0] : 0; - if (size == -1) ival = -ival; - return ival; - } else { - switch (size) { - case 2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - } - } - #endif - return PyLong_AsSsize_t(b); - } - x = PyNumber_Index(b); - if (!x) return -1; - ival = PyInt_AsSsize_t(x); - Py_DECREF(x); - return ival; -} -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { - return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); -} -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { - return PyInt_FromSize_t(ival); -} - - -#endif /* Py_PYTHON_H */ diff --git a/.venv/Lib/site-packages/aiohttp/_websocket.cp38-win_amd64.pyd b/.venv/Lib/site-packages/aiohttp/_websocket.cp38-win_amd64.pyd deleted file mode 100644 index 018f13f719965e6802acf88ae937a5e934b32cd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28672 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 lz$G+o+qmudZQHjU+;(JJ|2D=Y$data - else: - data = bytearray(data) - - data_len = len(data) - in_buf = PyByteArray_AsString(data) - mask_buf = PyBytes_AsString(mask) - uint32_msk = (mask_buf)[0] - - # TODO: align in_data ptr to achieve even faster speeds - # does it need in python ?! malloc() always aligns to sizeof(long) bytes - - if sizeof(size_t) >= 8: - uint64_msk = uint32_msk - uint64_msk = (uint64_msk << 32) | uint32_msk - - while data_len >= 8: - (in_buf)[0] ^= uint64_msk - in_buf += 8 - data_len -= 8 - - - while data_len >= 4: - (in_buf)[0] ^= uint32_msk - in_buf += 4 - data_len -= 4 - - for i in range(0, data_len): - in_buf[i] ^= mask_buf[i] diff --git a/.venv/Lib/site-packages/aiohttp/abc.py b/.venv/Lib/site-packages/aiohttp/abc.py deleted file mode 100644 index 06fc831..0000000 --- a/.venv/Lib/site-packages/aiohttp/abc.py +++ /dev/null @@ -1,207 +0,0 @@ -import asyncio -import logging -from abc import ABC, abstractmethod -from collections.abc import Sized -from http.cookies import BaseCookie, Morsel -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Dict, - Generator, - Iterable, - List, - Optional, - Tuple, -) - -from multidict import CIMultiDict -from yarl import URL - -from .helpers import get_running_loop -from .typedefs import LooseCookies - -if TYPE_CHECKING: # pragma: no cover - from .web_app import Application - from .web_exceptions import HTTPException - from .web_request import BaseRequest, Request - from .web_response import StreamResponse -else: - BaseRequest = Request = Application = StreamResponse = None - HTTPException = None - - -class AbstractRouter(ABC): - def __init__(self) -> None: - self._frozen = False - - def post_init(self, app: Application) -> None: - """Post init stage. - - Not an abstract method for sake of backward compatibility, - but if the router wants to be aware of the application - it can override this. - """ - - @property - def frozen(self) -> bool: - return self._frozen - - def freeze(self) -> None: - """Freeze router.""" - self._frozen = True - - @abstractmethod - async def resolve(self, request: Request) -> "AbstractMatchInfo": - """Return MATCH_INFO for given request""" - - -class AbstractMatchInfo(ABC): - @property # pragma: no branch - @abstractmethod - def handler(self) -> Callable[[Request], Awaitable[StreamResponse]]: - """Execute matched request handler""" - - @property - @abstractmethod - def expect_handler(self) -> Callable[[Request], Awaitable[None]]: - """Expect handler for 100-continue processing""" - - @property # pragma: no branch - @abstractmethod - def http_exception(self) -> Optional[HTTPException]: - """HTTPException instance raised on router's resolving, or None""" - - @abstractmethod # pragma: no branch - def get_info(self) -> Dict[str, Any]: - """Return a dict with additional info useful for introspection""" - - @property # pragma: no branch - @abstractmethod - def apps(self) -> Tuple[Application, ...]: - """Stack of nested applications. - - Top level application is left-most element. - - """ - - @abstractmethod - def add_app(self, app: Application) -> None: - """Add application to the nested apps stack.""" - - @abstractmethod - def freeze(self) -> None: - """Freeze the match info. - - The method is called after route resolution. - - After the call .add_app() is forbidden. - - """ - - -class AbstractView(ABC): - """Abstract class based view.""" - - def __init__(self, request: Request) -> None: - self._request = request - - @property - def request(self) -> Request: - """Request instance.""" - return self._request - - @abstractmethod - def __await__(self) -> Generator[Any, None, StreamResponse]: - """Execute the view handler.""" - - -class AbstractResolver(ABC): - """Abstract DNS resolver.""" - - @abstractmethod - async def resolve(self, host: str, port: int, family: int) -> List[Dict[str, Any]]: - """Return IP address for given hostname""" - - @abstractmethod - async def close(self) -> None: - """Release resolver""" - - -if TYPE_CHECKING: # pragma: no cover - IterableBase = Iterable[Morsel[str]] -else: - IterableBase = Iterable - - -ClearCookiePredicate = Callable[["Morsel[str]"], bool] - - -class AbstractCookieJar(Sized, IterableBase): - """Abstract Cookie Jar.""" - - def __init__(self, *, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: - self._loop = get_running_loop(loop) - - @abstractmethod - def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: - """Clear all cookies if no predicate is passed.""" - - @abstractmethod - def clear_domain(self, domain: str) -> None: - """Clear all cookies for domain and all subdomains.""" - - @abstractmethod - def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: - """Update cookies.""" - - @abstractmethod - def filter_cookies(self, request_url: URL) -> "BaseCookie[str]": - """Return the jar's cookies filtered by their attributes.""" - - -class AbstractStreamWriter(ABC): - """Abstract stream writer.""" - - buffer_size = 0 - output_size = 0 - length = 0 # type: Optional[int] - - @abstractmethod - async def write(self, chunk: bytes) -> None: - """Write chunk into stream.""" - - @abstractmethod - async def write_eof(self, chunk: bytes = b"") -> None: - """Write last chunk.""" - - @abstractmethod - async def drain(self) -> None: - """Flush the write buffer.""" - - @abstractmethod - def enable_compression(self, encoding: str = "deflate") -> None: - """Enable HTTP body compression""" - - @abstractmethod - def enable_chunking(self) -> None: - """Enable HTTP chunked mode""" - - @abstractmethod - async def write_headers( - self, status_line: str, headers: "CIMultiDict[str]" - ) -> None: - """Write HTTP headers""" - - -class AbstractAccessLogger(ABC): - """Abstract writer to access log.""" - - def __init__(self, logger: logging.Logger, log_format: str) -> None: - self.logger = logger - self.log_format = log_format - - @abstractmethod - def log(self, request: BaseRequest, response: StreamResponse, time: float) -> None: - """Emit log to logger.""" diff --git a/.venv/Lib/site-packages/aiohttp/base_protocol.py b/.venv/Lib/site-packages/aiohttp/base_protocol.py deleted file mode 100644 index fff4610..0000000 --- a/.venv/Lib/site-packages/aiohttp/base_protocol.py +++ /dev/null @@ -1,87 +0,0 @@ -import asyncio -from typing import Optional, cast - -from .tcp_helpers import tcp_nodelay - - -class BaseProtocol(asyncio.Protocol): - __slots__ = ( - "_loop", - "_paused", - "_drain_waiter", - "_connection_lost", - "_reading_paused", - "transport", - ) - - def __init__(self, loop: asyncio.AbstractEventLoop) -> None: - self._loop = loop # type: asyncio.AbstractEventLoop - self._paused = False - self._drain_waiter = None # type: Optional[asyncio.Future[None]] - self._connection_lost = False - self._reading_paused = False - - self.transport = None # type: Optional[asyncio.Transport] - - def pause_writing(self) -> None: - assert not self._paused - self._paused = True - - def resume_writing(self) -> None: - assert self._paused - self._paused = False - - waiter = self._drain_waiter - if waiter is not None: - self._drain_waiter = None - if not waiter.done(): - waiter.set_result(None) - - def pause_reading(self) -> None: - if not self._reading_paused and self.transport is not None: - try: - self.transport.pause_reading() - except (AttributeError, NotImplementedError, RuntimeError): - pass - self._reading_paused = True - - def resume_reading(self) -> None: - if self._reading_paused and self.transport is not None: - try: - self.transport.resume_reading() - except (AttributeError, NotImplementedError, RuntimeError): - pass - self._reading_paused = False - - def connection_made(self, transport: asyncio.BaseTransport) -> None: - tr = cast(asyncio.Transport, transport) - tcp_nodelay(tr, True) - self.transport = tr - - def connection_lost(self, exc: Optional[BaseException]) -> None: - self._connection_lost = True - # Wake up the writer if currently paused. - self.transport = None - if not self._paused: - return - waiter = self._drain_waiter - if waiter is None: - return - self._drain_waiter = None - if waiter.done(): - return - if exc is None: - waiter.set_result(None) - else: - waiter.set_exception(exc) - - async def _drain_helper(self) -> None: - if self._connection_lost: - raise ConnectionResetError("Connection lost") - if not self._paused: - return - waiter = self._drain_waiter - if waiter is None: - waiter = self._loop.create_future() - self._drain_waiter = waiter - await asyncio.shield(waiter) diff --git a/.venv/Lib/site-packages/aiohttp/client.py b/.venv/Lib/site-packages/aiohttp/client.py deleted file mode 100644 index c6e4a76..0000000 --- a/.venv/Lib/site-packages/aiohttp/client.py +++ /dev/null @@ -1,1302 +0,0 @@ -"""HTTP Client for asyncio.""" - -import asyncio -import base64 -import hashlib -import json -import os -import sys -import traceback -import warnings -from contextlib import suppress -from types import SimpleNamespace, TracebackType -from typing import ( - Any, - Awaitable, - Callable, - Coroutine, - FrozenSet, - Generator, - Generic, - Iterable, - List, - Mapping, - Optional, - Set, - Tuple, - Type, - TypeVar, - Union, -) - -import attr -from multidict import CIMultiDict, MultiDict, MultiDictProxy, istr -from yarl import URL - -from . import hdrs, http, payload -from .abc import AbstractCookieJar -from .client_exceptions import ( - ClientConnectionError as ClientConnectionError, - ClientConnectorCertificateError as ClientConnectorCertificateError, - ClientConnectorError as ClientConnectorError, - ClientConnectorSSLError as ClientConnectorSSLError, - ClientError as ClientError, - ClientHttpProxyError as ClientHttpProxyError, - ClientOSError as ClientOSError, - ClientPayloadError as ClientPayloadError, - ClientProxyConnectionError as ClientProxyConnectionError, - ClientResponseError as ClientResponseError, - ClientSSLError as ClientSSLError, - ContentTypeError as ContentTypeError, - InvalidURL as InvalidURL, - ServerConnectionError as ServerConnectionError, - ServerDisconnectedError as ServerDisconnectedError, - ServerFingerprintMismatch as ServerFingerprintMismatch, - ServerTimeoutError as ServerTimeoutError, - TooManyRedirects as TooManyRedirects, - WSServerHandshakeError as WSServerHandshakeError, -) -from .client_reqrep import ( - ClientRequest as ClientRequest, - ClientResponse as ClientResponse, - Fingerprint as Fingerprint, - RequestInfo as RequestInfo, - _merge_ssl_params, -) -from .client_ws import ClientWebSocketResponse as ClientWebSocketResponse -from .connector import ( - BaseConnector as BaseConnector, - NamedPipeConnector as NamedPipeConnector, - TCPConnector as TCPConnector, - UnixConnector as UnixConnector, -) -from .cookiejar import CookieJar -from .helpers import ( - DEBUG, - PY_36, - BasicAuth, - TimeoutHandle, - ceil_timeout, - get_env_proxy_for_url, - get_running_loop, - sentinel, - strip_auth_from_url, -) -from .http import WS_KEY, HttpVersion, WebSocketReader, WebSocketWriter -from .http_websocket import WSHandshakeError, WSMessage, ws_ext_gen, ws_ext_parse -from .streams import FlowControlDataQueue -from .tracing import Trace, TraceConfig -from .typedefs import Final, JSONEncoder, LooseCookies, LooseHeaders, StrOrURL - -__all__ = ( - # client_exceptions - "ClientConnectionError", - "ClientConnectorCertificateError", - "ClientConnectorError", - "ClientConnectorSSLError", - "ClientError", - "ClientHttpProxyError", - "ClientOSError", - "ClientPayloadError", - "ClientProxyConnectionError", - "ClientResponseError", - "ClientSSLError", - "ContentTypeError", - "InvalidURL", - "ServerConnectionError", - "ServerDisconnectedError", - "ServerFingerprintMismatch", - "ServerTimeoutError", - "TooManyRedirects", - "WSServerHandshakeError", - # client_reqrep - "ClientRequest", - "ClientResponse", - "Fingerprint", - "RequestInfo", - # connector - "BaseConnector", - "TCPConnector", - "UnixConnector", - "NamedPipeConnector", - # client_ws - "ClientWebSocketResponse", - # client - "ClientSession", - "ClientTimeout", - "request", -) - - -try: - from ssl import SSLContext -except ImportError: # pragma: no cover - SSLContext = object # type: ignore[misc,assignment] - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class ClientTimeout: - total: Optional[float] = None - connect: Optional[float] = None - sock_read: Optional[float] = None - sock_connect: Optional[float] = None - - # pool_queue_timeout: Optional[float] = None - # dns_resolution_timeout: Optional[float] = None - # socket_connect_timeout: Optional[float] = None - # connection_acquiring_timeout: Optional[float] = None - # new_connection_timeout: Optional[float] = None - # http_header_timeout: Optional[float] = None - # response_body_timeout: Optional[float] = None - - # to create a timeout specific for a single request, either - # - create a completely new one to overwrite the default - # - or use http://www.attrs.org/en/stable/api.html#attr.evolve - # to overwrite the defaults - - -# 5 Minute default read timeout -DEFAULT_TIMEOUT: Final[ClientTimeout] = ClientTimeout(total=5 * 60) - -_RetType = TypeVar("_RetType") - - -class ClientSession: - """First-class interface for making HTTP requests.""" - - ATTRS = frozenset( - [ - "_base_url", - "_source_traceback", - "_connector", - "requote_redirect_url", - "_loop", - "_cookie_jar", - "_connector_owner", - "_default_auth", - "_version", - "_json_serialize", - "_requote_redirect_url", - "_timeout", - "_raise_for_status", - "_auto_decompress", - "_trust_env", - "_default_headers", - "_skip_auto_headers", - "_request_class", - "_response_class", - "_ws_response_class", - "_trace_configs", - "_read_bufsize", - ] - ) - - _source_traceback = None - - def __init__( - self, - base_url: Optional[StrOrURL] = None, - *, - connector: Optional[BaseConnector] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, - cookies: Optional[LooseCookies] = None, - headers: Optional[LooseHeaders] = None, - skip_auto_headers: Optional[Iterable[str]] = None, - auth: Optional[BasicAuth] = None, - json_serialize: JSONEncoder = json.dumps, - request_class: Type[ClientRequest] = ClientRequest, - response_class: Type[ClientResponse] = ClientResponse, - ws_response_class: Type[ClientWebSocketResponse] = ClientWebSocketResponse, - version: HttpVersion = http.HttpVersion11, - cookie_jar: Optional[AbstractCookieJar] = None, - connector_owner: bool = True, - raise_for_status: bool = False, - read_timeout: Union[float, object] = sentinel, - conn_timeout: Optional[float] = None, - timeout: Union[object, ClientTimeout] = sentinel, - auto_decompress: bool = True, - trust_env: bool = False, - requote_redirect_url: bool = True, - trace_configs: Optional[List[TraceConfig]] = None, - read_bufsize: int = 2 ** 16, - ) -> None: - if loop is None: - if connector is not None: - loop = connector._loop - - loop = get_running_loop(loop) - - if base_url is None or isinstance(base_url, URL): - self._base_url: Optional[URL] = base_url - else: - self._base_url = URL(base_url) - assert ( - self._base_url.origin() == self._base_url - ), "Only absolute URLs without path part are supported" - - if connector is None: - connector = TCPConnector(loop=loop) - - if connector._loop is not loop: - raise RuntimeError("Session and connector has to use same event loop") - - self._loop = loop - - if loop.get_debug(): - self._source_traceback = traceback.extract_stack(sys._getframe(1)) - - if cookie_jar is None: - cookie_jar = CookieJar(loop=loop) - self._cookie_jar = cookie_jar - - if cookies is not None: - self._cookie_jar.update_cookies(cookies) - - self._connector = connector # type: Optional[BaseConnector] - self._connector_owner = connector_owner - self._default_auth = auth - self._version = version - self._json_serialize = json_serialize - if timeout is sentinel: - self._timeout = DEFAULT_TIMEOUT - if read_timeout is not sentinel: - warnings.warn( - "read_timeout is deprecated, " "use timeout argument instead", - DeprecationWarning, - stacklevel=2, - ) - self._timeout = attr.evolve(self._timeout, total=read_timeout) - if conn_timeout is not None: - self._timeout = attr.evolve(self._timeout, connect=conn_timeout) - warnings.warn( - "conn_timeout is deprecated, " "use timeout argument instead", - DeprecationWarning, - stacklevel=2, - ) - else: - self._timeout = timeout # type: ignore[assignment] - if read_timeout is not sentinel: - raise ValueError( - "read_timeout and timeout parameters " - "conflict, please setup " - "timeout.read" - ) - if conn_timeout is not None: - raise ValueError( - "conn_timeout and timeout parameters " - "conflict, please setup " - "timeout.connect" - ) - self._raise_for_status = raise_for_status - self._auto_decompress = auto_decompress - self._trust_env = trust_env - self._requote_redirect_url = requote_redirect_url - self._read_bufsize = read_bufsize - - # Convert to list of tuples - if headers: - real_headers = CIMultiDict(headers) # type: CIMultiDict[str] - else: - real_headers = CIMultiDict() - self._default_headers = real_headers # type: CIMultiDict[str] - if skip_auto_headers is not None: - self._skip_auto_headers = frozenset(istr(i) for i in skip_auto_headers) - else: - self._skip_auto_headers = frozenset() - - self._request_class = request_class - self._response_class = response_class - self._ws_response_class = ws_response_class - - self._trace_configs = trace_configs or [] - for trace_config in self._trace_configs: - trace_config.freeze() - - def __init_subclass__(cls: Type["ClientSession"]) -> None: - warnings.warn( - "Inheritance class {} from ClientSession " - "is discouraged".format(cls.__name__), - DeprecationWarning, - stacklevel=2, - ) - - if DEBUG: - - def __setattr__(self, name: str, val: Any) -> None: - if name not in self.ATTRS: - warnings.warn( - "Setting custom ClientSession.{} attribute " - "is discouraged".format(name), - DeprecationWarning, - stacklevel=2, - ) - super().__setattr__(name, val) - - def __del__(self, _warnings: Any = warnings) -> None: - if not self.closed: - if PY_36: - kwargs = {"source": self} - else: - kwargs = {} - _warnings.warn( - f"Unclosed client session {self!r}", ResourceWarning, **kwargs - ) - context = {"client_session": self, "message": "Unclosed client session"} - if self._source_traceback is not None: - context["source_traceback"] = self._source_traceback - self._loop.call_exception_handler(context) - - def request( - self, method: str, url: StrOrURL, **kwargs: Any - ) -> "_RequestContextManager": - """Perform HTTP request.""" - return _RequestContextManager(self._request(method, url, **kwargs)) - - def _build_url(self, str_or_url: StrOrURL) -> URL: - url = URL(str_or_url) - if self._base_url is None: - return url - else: - assert not url.is_absolute() and url.path.startswith("/") - return self._base_url.join(url) - - async def _request( - self, - method: str, - str_or_url: StrOrURL, - *, - params: Optional[Mapping[str, str]] = None, - data: Any = None, - json: Any = None, - cookies: Optional[LooseCookies] = None, - headers: Optional[LooseHeaders] = None, - skip_auto_headers: Optional[Iterable[str]] = None, - auth: Optional[BasicAuth] = None, - allow_redirects: bool = True, - max_redirects: int = 10, - compress: Optional[str] = None, - chunked: Optional[bool] = None, - expect100: bool = False, - raise_for_status: Optional[bool] = None, - read_until_eof: bool = True, - proxy: Optional[StrOrURL] = None, - proxy_auth: Optional[BasicAuth] = None, - timeout: Union[ClientTimeout, object] = sentinel, - verify_ssl: Optional[bool] = None, - fingerprint: Optional[bytes] = None, - ssl_context: Optional[SSLContext] = None, - ssl: Optional[Union[SSLContext, bool, Fingerprint]] = None, - proxy_headers: Optional[LooseHeaders] = None, - trace_request_ctx: Optional[SimpleNamespace] = None, - read_bufsize: Optional[int] = None, - ) -> ClientResponse: - - # NOTE: timeout clamps existing connect and read timeouts. We cannot - # set the default to None because we need to detect if the user wants - # to use the existing timeouts by setting timeout to None. - - if self.closed: - raise RuntimeError("Session is closed") - - ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) - - if data is not None and json is not None: - raise ValueError( - "data and json parameters can not be used at the same time" - ) - elif json is not None: - data = payload.JsonPayload(json, dumps=self._json_serialize) - - if not isinstance(chunked, bool) and chunked is not None: - warnings.warn("Chunk size is deprecated #1615", DeprecationWarning) - - redirects = 0 - history = [] - version = self._version - - # Merge with default headers and transform to CIMultiDict - headers = self._prepare_headers(headers) - proxy_headers = self._prepare_headers(proxy_headers) - - try: - url = self._build_url(str_or_url) - except ValueError as e: - raise InvalidURL(str_or_url) from e - - skip_headers = set(self._skip_auto_headers) - if skip_auto_headers is not None: - for i in skip_auto_headers: - skip_headers.add(istr(i)) - - if proxy is not None: - try: - proxy = URL(proxy) - except ValueError as e: - raise InvalidURL(proxy) from e - - if timeout is sentinel: - real_timeout = self._timeout # type: ClientTimeout - else: - if not isinstance(timeout, ClientTimeout): - real_timeout = ClientTimeout(total=timeout) # type: ignore[arg-type] - else: - real_timeout = timeout - # timeout is cumulative for all request operations - # (request, redirects, responses, data consuming) - tm = TimeoutHandle(self._loop, real_timeout.total) - handle = tm.start() - - if read_bufsize is None: - read_bufsize = self._read_bufsize - - traces = [ - Trace( - self, - trace_config, - trace_config.trace_config_ctx(trace_request_ctx=trace_request_ctx), - ) - for trace_config in self._trace_configs - ] - - for trace in traces: - await trace.send_request_start(method, url.update_query(params), headers) - - timer = tm.timer() - try: - with timer: - while True: - url, auth_from_url = strip_auth_from_url(url) - if auth and auth_from_url: - raise ValueError( - "Cannot combine AUTH argument with " - "credentials encoded in URL" - ) - - if auth is None: - auth = auth_from_url - if auth is None: - auth = self._default_auth - # It would be confusing if we support explicit - # Authorization header with auth argument - if ( - headers is not None - and auth is not None - and hdrs.AUTHORIZATION in headers - ): - raise ValueError( - "Cannot combine AUTHORIZATION header " - "with AUTH argument or credentials " - "encoded in URL" - ) - - all_cookies = self._cookie_jar.filter_cookies(url) - - if cookies is not None: - tmp_cookie_jar = CookieJar() - tmp_cookie_jar.update_cookies(cookies) - req_cookies = tmp_cookie_jar.filter_cookies(url) - if req_cookies: - all_cookies.load(req_cookies) - - if proxy is not None: - proxy = URL(proxy) - elif self._trust_env: - with suppress(LookupError): - proxy, proxy_auth = get_env_proxy_for_url(url) - - req = self._request_class( - method, - url, - params=params, - headers=headers, - skip_auto_headers=skip_headers, - data=data, - cookies=all_cookies, - auth=auth, - version=version, - compress=compress, - chunked=chunked, - expect100=expect100, - loop=self._loop, - response_class=self._response_class, - proxy=proxy, - proxy_auth=proxy_auth, - timer=timer, - session=self, - ssl=ssl, - proxy_headers=proxy_headers, - traces=traces, - ) - - # connection timeout - try: - async with ceil_timeout(real_timeout.connect): - assert self._connector is not None - conn = await self._connector.connect( - req, traces=traces, timeout=real_timeout - ) - except asyncio.TimeoutError as exc: - raise ServerTimeoutError( - "Connection timeout " "to host {}".format(url) - ) from exc - - assert conn.transport is not None - - assert conn.protocol is not None - conn.protocol.set_response_params( - timer=timer, - skip_payload=method.upper() == "HEAD", - read_until_eof=read_until_eof, - auto_decompress=self._auto_decompress, - read_timeout=real_timeout.sock_read, - read_bufsize=read_bufsize, - ) - - try: - try: - resp = await req.send(conn) - try: - await resp.start(conn) - except BaseException: - resp.close() - raise - except BaseException: - conn.close() - raise - except ClientError: - raise - except OSError as exc: - raise ClientOSError(*exc.args) from exc - - self._cookie_jar.update_cookies(resp.cookies, resp.url) - - # redirects - if resp.status in (301, 302, 303, 307, 308) and allow_redirects: - - for trace in traces: - await trace.send_request_redirect( - method, url.update_query(params), headers, resp - ) - - redirects += 1 - history.append(resp) - if max_redirects and redirects >= max_redirects: - resp.close() - raise TooManyRedirects( - history[0].request_info, tuple(history) - ) - - # For 301 and 302, mimic IE, now changed in RFC - # https://github.com/kennethreitz/requests/pull/269 - if (resp.status == 303 and resp.method != hdrs.METH_HEAD) or ( - resp.status in (301, 302) and resp.method == hdrs.METH_POST - ): - method = hdrs.METH_GET - data = None - if headers.get(hdrs.CONTENT_LENGTH): - headers.pop(hdrs.CONTENT_LENGTH) - - r_url = resp.headers.get(hdrs.LOCATION) or resp.headers.get( - hdrs.URI - ) - if r_url is None: - # see github.com/aio-libs/aiohttp/issues/2022 - break - else: - # reading from correct redirection - # response is forbidden - resp.release() - - try: - parsed_url = URL( - r_url, encoded=not self._requote_redirect_url - ) - - except ValueError as e: - raise InvalidURL(r_url) from e - - scheme = parsed_url.scheme - if scheme not in ("http", "https", ""): - resp.close() - raise ValueError("Can redirect only to http or https") - elif not scheme: - parsed_url = url.join(parsed_url) - - if url.origin() != parsed_url.origin(): - auth = None - headers.pop(hdrs.AUTHORIZATION, None) - - url = parsed_url - params = None - resp.release() - continue - - break - - # check response status - if raise_for_status is None: - raise_for_status = self._raise_for_status - if raise_for_status: - resp.raise_for_status() - - # register connection - if handle is not None: - if resp.connection is not None: - resp.connection.add_callback(handle.cancel) - else: - handle.cancel() - - resp._history = tuple(history) - - for trace in traces: - await trace.send_request_end( - method, url.update_query(params), headers, resp - ) - return resp - - except BaseException as e: - # cleanup timer - tm.close() - if handle: - handle.cancel() - handle = None - - for trace in traces: - await trace.send_request_exception( - method, url.update_query(params), headers, e - ) - raise - - def ws_connect( - self, - url: StrOrURL, - *, - method: str = hdrs.METH_GET, - protocols: Iterable[str] = (), - timeout: float = 10.0, - receive_timeout: Optional[float] = None, - autoclose: bool = True, - autoping: bool = True, - heartbeat: Optional[float] = None, - auth: Optional[BasicAuth] = None, - origin: Optional[str] = None, - params: Optional[Mapping[str, str]] = None, - headers: Optional[LooseHeaders] = None, - proxy: Optional[StrOrURL] = None, - proxy_auth: Optional[BasicAuth] = None, - ssl: Union[SSLContext, bool, None, Fingerprint] = None, - verify_ssl: Optional[bool] = None, - fingerprint: Optional[bytes] = None, - ssl_context: Optional[SSLContext] = None, - proxy_headers: Optional[LooseHeaders] = None, - compress: int = 0, - max_msg_size: int = 4 * 1024 * 1024, - ) -> "_WSRequestContextManager": - """Initiate websocket connection.""" - return _WSRequestContextManager( - self._ws_connect( - url, - method=method, - protocols=protocols, - timeout=timeout, - receive_timeout=receive_timeout, - autoclose=autoclose, - autoping=autoping, - heartbeat=heartbeat, - auth=auth, - origin=origin, - params=params, - headers=headers, - proxy=proxy, - proxy_auth=proxy_auth, - ssl=ssl, - verify_ssl=verify_ssl, - fingerprint=fingerprint, - ssl_context=ssl_context, - proxy_headers=proxy_headers, - compress=compress, - max_msg_size=max_msg_size, - ) - ) - - async def _ws_connect( - self, - url: StrOrURL, - *, - method: str = hdrs.METH_GET, - protocols: Iterable[str] = (), - timeout: float = 10.0, - receive_timeout: Optional[float] = None, - autoclose: bool = True, - autoping: bool = True, - heartbeat: Optional[float] = None, - auth: Optional[BasicAuth] = None, - origin: Optional[str] = None, - params: Optional[Mapping[str, str]] = None, - headers: Optional[LooseHeaders] = None, - proxy: Optional[StrOrURL] = None, - proxy_auth: Optional[BasicAuth] = None, - ssl: Union[SSLContext, bool, None, Fingerprint] = None, - verify_ssl: Optional[bool] = None, - fingerprint: Optional[bytes] = None, - ssl_context: Optional[SSLContext] = None, - proxy_headers: Optional[LooseHeaders] = None, - compress: int = 0, - max_msg_size: int = 4 * 1024 * 1024, - ) -> ClientWebSocketResponse: - - if headers is None: - real_headers = CIMultiDict() # type: CIMultiDict[str] - else: - real_headers = CIMultiDict(headers) - - default_headers = { - hdrs.UPGRADE: "websocket", - hdrs.CONNECTION: "upgrade", - hdrs.SEC_WEBSOCKET_VERSION: "13", - } - - for key, value in default_headers.items(): - real_headers.setdefault(key, value) - - sec_key = base64.b64encode(os.urandom(16)) - real_headers[hdrs.SEC_WEBSOCKET_KEY] = sec_key.decode() - - if protocols: - real_headers[hdrs.SEC_WEBSOCKET_PROTOCOL] = ",".join(protocols) - if origin is not None: - real_headers[hdrs.ORIGIN] = origin - if compress: - extstr = ws_ext_gen(compress=compress) - real_headers[hdrs.SEC_WEBSOCKET_EXTENSIONS] = extstr - - ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) - - # send request - resp = await self.request( - method, - url, - params=params, - headers=real_headers, - read_until_eof=False, - auth=auth, - proxy=proxy, - proxy_auth=proxy_auth, - ssl=ssl, - proxy_headers=proxy_headers, - ) - - try: - # check handshake - if resp.status != 101: - raise WSServerHandshakeError( - resp.request_info, - resp.history, - message="Invalid response status", - status=resp.status, - headers=resp.headers, - ) - - if resp.headers.get(hdrs.UPGRADE, "").lower() != "websocket": - raise WSServerHandshakeError( - resp.request_info, - resp.history, - message="Invalid upgrade header", - status=resp.status, - headers=resp.headers, - ) - - if resp.headers.get(hdrs.CONNECTION, "").lower() != "upgrade": - raise WSServerHandshakeError( - resp.request_info, - resp.history, - message="Invalid connection header", - status=resp.status, - headers=resp.headers, - ) - - # key calculation - r_key = resp.headers.get(hdrs.SEC_WEBSOCKET_ACCEPT, "") - match = base64.b64encode(hashlib.sha1(sec_key + WS_KEY).digest()).decode() - if r_key != match: - raise WSServerHandshakeError( - resp.request_info, - resp.history, - message="Invalid challenge response", - status=resp.status, - headers=resp.headers, - ) - - # websocket protocol - protocol = None - if protocols and hdrs.SEC_WEBSOCKET_PROTOCOL in resp.headers: - resp_protocols = [ - proto.strip() - for proto in resp.headers[hdrs.SEC_WEBSOCKET_PROTOCOL].split(",") - ] - - for proto in resp_protocols: - if proto in protocols: - protocol = proto - break - - # websocket compress - notakeover = False - if compress: - compress_hdrs = resp.headers.get(hdrs.SEC_WEBSOCKET_EXTENSIONS) - if compress_hdrs: - try: - compress, notakeover = ws_ext_parse(compress_hdrs) - except WSHandshakeError as exc: - raise WSServerHandshakeError( - resp.request_info, - resp.history, - message=exc.args[0], - status=resp.status, - headers=resp.headers, - ) from exc - else: - compress = 0 - notakeover = False - - conn = resp.connection - assert conn is not None - conn_proto = conn.protocol - assert conn_proto is not None - transport = conn.transport - assert transport is not None - reader = FlowControlDataQueue( - conn_proto, 2 ** 16, loop=self._loop - ) # type: FlowControlDataQueue[WSMessage] - conn_proto.set_parser(WebSocketReader(reader, max_msg_size), reader) - writer = WebSocketWriter( - conn_proto, - transport, - use_mask=True, - compress=compress, - notakeover=notakeover, - ) - except BaseException: - resp.close() - raise - else: - return self._ws_response_class( - reader, - writer, - protocol, - resp, - timeout, - autoclose, - autoping, - self._loop, - receive_timeout=receive_timeout, - heartbeat=heartbeat, - compress=compress, - client_notakeover=notakeover, - ) - - def _prepare_headers(self, headers: Optional[LooseHeaders]) -> "CIMultiDict[str]": - """Add default headers and transform it to CIMultiDict""" - # Convert headers to MultiDict - result = CIMultiDict(self._default_headers) - if headers: - if not isinstance(headers, (MultiDictProxy, MultiDict)): - headers = CIMultiDict(headers) - added_names = set() # type: Set[str] - for key, value in headers.items(): - if key in added_names: - result.add(key, value) - else: - result[key] = value - added_names.add(key) - return result - - def get( - self, url: StrOrURL, *, allow_redirects: bool = True, **kwargs: Any - ) -> "_RequestContextManager": - """Perform HTTP GET request.""" - return _RequestContextManager( - self._request(hdrs.METH_GET, url, allow_redirects=allow_redirects, **kwargs) - ) - - def options( - self, url: StrOrURL, *, allow_redirects: bool = True, **kwargs: Any - ) -> "_RequestContextManager": - """Perform HTTP OPTIONS request.""" - return _RequestContextManager( - self._request( - hdrs.METH_OPTIONS, url, allow_redirects=allow_redirects, **kwargs - ) - ) - - def head( - self, url: StrOrURL, *, allow_redirects: bool = False, **kwargs: Any - ) -> "_RequestContextManager": - """Perform HTTP HEAD request.""" - return _RequestContextManager( - self._request( - hdrs.METH_HEAD, url, allow_redirects=allow_redirects, **kwargs - ) - ) - - def post( - self, url: StrOrURL, *, data: Any = None, **kwargs: Any - ) -> "_RequestContextManager": - """Perform HTTP POST request.""" - return _RequestContextManager( - self._request(hdrs.METH_POST, url, data=data, **kwargs) - ) - - def put( - self, url: StrOrURL, *, data: Any = None, **kwargs: Any - ) -> "_RequestContextManager": - """Perform HTTP PUT request.""" - return _RequestContextManager( - self._request(hdrs.METH_PUT, url, data=data, **kwargs) - ) - - def patch( - self, url: StrOrURL, *, data: Any = None, **kwargs: Any - ) -> "_RequestContextManager": - """Perform HTTP PATCH request.""" - return _RequestContextManager( - self._request(hdrs.METH_PATCH, url, data=data, **kwargs) - ) - - def delete(self, url: StrOrURL, **kwargs: Any) -> "_RequestContextManager": - """Perform HTTP DELETE request.""" - return _RequestContextManager(self._request(hdrs.METH_DELETE, url, **kwargs)) - - async def close(self) -> None: - """Close underlying connector. - - Release all acquired resources. - """ - if not self.closed: - if self._connector is not None and self._connector_owner: - await self._connector.close() - self._connector = None - - @property - def closed(self) -> bool: - """Is client session closed. - - A readonly property. - """ - return self._connector is None or self._connector.closed - - @property - def connector(self) -> Optional[BaseConnector]: - """Connector instance used for the session.""" - return self._connector - - @property - def cookie_jar(self) -> AbstractCookieJar: - """The session cookies.""" - return self._cookie_jar - - @property - def version(self) -> Tuple[int, int]: - """The session HTTP protocol version.""" - return self._version - - @property - def requote_redirect_url(self) -> bool: - """Do URL requoting on redirection handling.""" - return self._requote_redirect_url - - @requote_redirect_url.setter - def requote_redirect_url(self, val: bool) -> None: - """Do URL requoting on redirection handling.""" - warnings.warn( - "session.requote_redirect_url modification " "is deprecated #2778", - DeprecationWarning, - stacklevel=2, - ) - self._requote_redirect_url = val - - @property - def loop(self) -> asyncio.AbstractEventLoop: - """Session's loop.""" - warnings.warn( - "client.loop property is deprecated", DeprecationWarning, stacklevel=2 - ) - return self._loop - - @property - def timeout(self) -> Union[object, ClientTimeout]: - """Timeout for the session.""" - return self._timeout - - @property - def headers(self) -> "CIMultiDict[str]": - """The default headers of the client session.""" - return self._default_headers - - @property - def skip_auto_headers(self) -> FrozenSet[istr]: - """Headers for which autogeneration should be skipped""" - return self._skip_auto_headers - - @property - def auth(self) -> Optional[BasicAuth]: - """An object that represents HTTP Basic Authorization""" - return self._default_auth - - @property - def json_serialize(self) -> JSONEncoder: - """Json serializer callable""" - return self._json_serialize - - @property - def connector_owner(self) -> bool: - """Should connector be closed on session closing""" - return self._connector_owner - - @property - def raise_for_status( - self, - ) -> Union[bool, Callable[[ClientResponse], Awaitable[None]]]: - """Should `ClientResponse.raise_for_status()` be called for each response.""" - return self._raise_for_status - - @property - def auto_decompress(self) -> bool: - """Should the body response be automatically decompressed.""" - return self._auto_decompress - - @property - def trust_env(self) -> bool: - """ - Should proxies information from environment or netrc be trusted. - - Information is from HTTP_PROXY / HTTPS_PROXY environment variables - or ~/.netrc file if present. - """ - return self._trust_env - - @property - def trace_configs(self) -> List[TraceConfig]: - """A list of TraceConfig instances used for client tracing""" - return self._trace_configs - - def detach(self) -> None: - """Detach connector from session without closing the former. - - Session is switched to closed state anyway. - """ - self._connector = None - - def __enter__(self) -> None: - raise TypeError("Use async with instead") - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - # __exit__ should exist in pair with __enter__ but never executed - pass # pragma: no cover - - async def __aenter__(self) -> "ClientSession": - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - await self.close() - - -class _BaseRequestContextManager(Coroutine[Any, Any, _RetType], Generic[_RetType]): - - __slots__ = ("_coro", "_resp") - - def __init__(self, coro: Coroutine["asyncio.Future[Any]", None, _RetType]) -> None: - self._coro = coro - - def send(self, arg: None) -> "asyncio.Future[Any]": - return self._coro.send(arg) - - def throw(self, arg: BaseException) -> None: # type: ignore[arg-type,override] - self._coro.throw(arg) - - def close(self) -> None: - return self._coro.close() - - def __await__(self) -> Generator[Any, None, _RetType]: - ret = self._coro.__await__() - return ret - - def __iter__(self) -> Generator[Any, None, _RetType]: - return self.__await__() - - async def __aenter__(self) -> _RetType: - self._resp = await self._coro - return self._resp - - -class _RequestContextManager(_BaseRequestContextManager[ClientResponse]): - __slots__ = () - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc: Optional[BaseException], - tb: Optional[TracebackType], - ) -> None: - # We're basing behavior on the exception as it can be caused by - # user code unrelated to the status of the connection. If you - # would like to close a connection you must do that - # explicitly. Otherwise connection error handling should kick in - # and close/recycle the connection as required. - self._resp.release() - - -class _WSRequestContextManager(_BaseRequestContextManager[ClientWebSocketResponse]): - __slots__ = () - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc: Optional[BaseException], - tb: Optional[TracebackType], - ) -> None: - await self._resp.close() - - -class _SessionRequestContextManager: - - __slots__ = ("_coro", "_resp", "_session") - - def __init__( - self, - coro: Coroutine["asyncio.Future[Any]", None, ClientResponse], - session: ClientSession, - ) -> None: - self._coro = coro - self._resp = None # type: Optional[ClientResponse] - self._session = session - - async def __aenter__(self) -> ClientResponse: - try: - self._resp = await self._coro - except BaseException: - await self._session.close() - raise - else: - return self._resp - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc: Optional[BaseException], - tb: Optional[TracebackType], - ) -> None: - assert self._resp is not None - self._resp.close() - await self._session.close() - - -def request( - method: str, - url: StrOrURL, - *, - params: Optional[Mapping[str, str]] = None, - data: Any = None, - json: Any = None, - headers: Optional[LooseHeaders] = None, - skip_auto_headers: Optional[Iterable[str]] = None, - auth: Optional[BasicAuth] = None, - allow_redirects: bool = True, - max_redirects: int = 10, - compress: Optional[str] = None, - chunked: Optional[bool] = None, - expect100: bool = False, - raise_for_status: Optional[bool] = None, - read_until_eof: bool = True, - proxy: Optional[StrOrURL] = None, - proxy_auth: Optional[BasicAuth] = None, - timeout: Union[ClientTimeout, object] = sentinel, - cookies: Optional[LooseCookies] = None, - version: HttpVersion = http.HttpVersion11, - connector: Optional[BaseConnector] = None, - read_bufsize: Optional[int] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, -) -> _SessionRequestContextManager: - """Constructs and sends a request. - - Returns response object. - method - HTTP method - url - request url - params - (optional) Dictionary or bytes to be sent in the query - string of the new request - data - (optional) Dictionary, bytes, or file-like object to - send in the body of the request - json - (optional) Any json compatible python object - headers - (optional) Dictionary of HTTP Headers to send with - the request - cookies - (optional) Dict object to send with the request - auth - (optional) BasicAuth named tuple represent HTTP Basic Auth - auth - aiohttp.helpers.BasicAuth - allow_redirects - (optional) If set to False, do not follow - redirects - version - Request HTTP version. - compress - Set to True if request has to be compressed - with deflate encoding. - chunked - Set to chunk size for chunked transfer encoding. - expect100 - Expect 100-continue response from server. - connector - BaseConnector sub-class instance to support - connection pooling. - read_until_eof - Read response until eof if response - does not have Content-Length header. - loop - Optional event loop. - timeout - Optional ClientTimeout settings structure, 5min - total timeout by default. - Usage:: - >>> import aiohttp - >>> resp = await aiohttp.request('GET', 'http://python.org/') - >>> resp - - >>> data = await resp.read() - """ - connector_owner = False - if connector is None: - connector_owner = True - connector = TCPConnector(loop=loop, force_close=True) - - session = ClientSession( - loop=loop, - cookies=cookies, - version=version, - timeout=timeout, - connector=connector, - connector_owner=connector_owner, - ) - - return _SessionRequestContextManager( - session._request( - method, - url, - params=params, - data=data, - json=json, - headers=headers, - skip_auto_headers=skip_auto_headers, - auth=auth, - allow_redirects=allow_redirects, - max_redirects=max_redirects, - compress=compress, - chunked=chunked, - expect100=expect100, - raise_for_status=raise_for_status, - read_until_eof=read_until_eof, - proxy=proxy, - proxy_auth=proxy_auth, - read_bufsize=read_bufsize, - ), - session, - ) diff --git a/.venv/Lib/site-packages/aiohttp/client_exceptions.py b/.venv/Lib/site-packages/aiohttp/client_exceptions.py deleted file mode 100644 index dd55321..0000000 --- a/.venv/Lib/site-packages/aiohttp/client_exceptions.py +++ /dev/null @@ -1,342 +0,0 @@ -"""HTTP related errors.""" - -import asyncio -import warnings -from typing import TYPE_CHECKING, Any, Optional, Tuple, Union - -from .http_parser import RawResponseMessage -from .typedefs import LooseHeaders - -try: - import ssl - - SSLContext = ssl.SSLContext -except ImportError: # pragma: no cover - ssl = SSLContext = None # type: ignore[assignment] - - -if TYPE_CHECKING: # pragma: no cover - from .client_reqrep import ClientResponse, ConnectionKey, Fingerprint, RequestInfo -else: - RequestInfo = ClientResponse = ConnectionKey = None - -__all__ = ( - "ClientError", - "ClientConnectionError", - "ClientOSError", - "ClientConnectorError", - "ClientProxyConnectionError", - "ClientSSLError", - "ClientConnectorSSLError", - "ClientConnectorCertificateError", - "ServerConnectionError", - "ServerTimeoutError", - "ServerDisconnectedError", - "ServerFingerprintMismatch", - "ClientResponseError", - "ClientHttpProxyError", - "WSServerHandshakeError", - "ContentTypeError", - "ClientPayloadError", - "InvalidURL", -) - - -class ClientError(Exception): - """Base class for client connection errors.""" - - -class ClientResponseError(ClientError): - """Connection error during reading response. - - request_info: instance of RequestInfo - """ - - def __init__( - self, - request_info: RequestInfo, - history: Tuple[ClientResponse, ...], - *, - code: Optional[int] = None, - status: Optional[int] = None, - message: str = "", - headers: Optional[LooseHeaders] = None, - ) -> None: - self.request_info = request_info - if code is not None: - if status is not None: - raise ValueError( - "Both code and status arguments are provided; " - "code is deprecated, use status instead" - ) - warnings.warn( - "code argument is deprecated, use status instead", - DeprecationWarning, - stacklevel=2, - ) - if status is not None: - self.status = status - elif code is not None: - self.status = code - else: - self.status = 0 - self.message = message - self.headers = headers - self.history = history - self.args = (request_info, history) - - def __str__(self) -> str: - return "{}, message={!r}, url={!r}".format( - self.status, - self.message, - self.request_info.real_url, - ) - - def __repr__(self) -> str: - args = f"{self.request_info!r}, {self.history!r}" - if self.status != 0: - args += f", status={self.status!r}" - if self.message != "": - args += f", message={self.message!r}" - if self.headers is not None: - args += f", headers={self.headers!r}" - return f"{type(self).__name__}({args})" - - @property - def code(self) -> int: - warnings.warn( - "code property is deprecated, use status instead", - DeprecationWarning, - stacklevel=2, - ) - return self.status - - @code.setter - def code(self, value: int) -> None: - warnings.warn( - "code property is deprecated, use status instead", - DeprecationWarning, - stacklevel=2, - ) - self.status = value - - -class ContentTypeError(ClientResponseError): - """ContentType found is not valid.""" - - -class WSServerHandshakeError(ClientResponseError): - """websocket server handshake error.""" - - -class ClientHttpProxyError(ClientResponseError): - """HTTP proxy error. - - Raised in :class:`aiohttp.connector.TCPConnector` if - proxy responds with status other than ``200 OK`` - on ``CONNECT`` request. - """ - - -class TooManyRedirects(ClientResponseError): - """Client was redirected too many times.""" - - -class ClientConnectionError(ClientError): - """Base class for client socket errors.""" - - -class ClientOSError(ClientConnectionError, OSError): - """OSError error.""" - - -class ClientConnectorError(ClientOSError): - """Client connector error. - - Raised in :class:`aiohttp.connector.TCPConnector` if - connection to proxy can not be established. - """ - - def __init__(self, connection_key: ConnectionKey, os_error: OSError) -> None: - self._conn_key = connection_key - self._os_error = os_error - super().__init__(os_error.errno, os_error.strerror) - self.args = (connection_key, os_error) - - @property - def os_error(self) -> OSError: - return self._os_error - - @property - def host(self) -> str: - return self._conn_key.host - - @property - def port(self) -> Optional[int]: - return self._conn_key.port - - @property - def ssl(self) -> Union[SSLContext, None, bool, "Fingerprint"]: - return self._conn_key.ssl - - def __str__(self) -> str: - return "Cannot connect to host {0.host}:{0.port} ssl:{1} [{2}]".format( - self, self.ssl if self.ssl is not None else "default", self.strerror - ) - - # OSError.__reduce__ does too much black magick - __reduce__ = BaseException.__reduce__ - - -class ClientProxyConnectionError(ClientConnectorError): - """Proxy connection error. - - Raised in :class:`aiohttp.connector.TCPConnector` if - connection to proxy can not be established. - """ - - -class UnixClientConnectorError(ClientConnectorError): - """Unix connector error. - - Raised in :py:class:`aiohttp.connector.UnixConnector` - if connection to unix socket can not be established. - """ - - def __init__( - self, path: str, connection_key: ConnectionKey, os_error: OSError - ) -> None: - self._path = path - super().__init__(connection_key, os_error) - - @property - def path(self) -> str: - return self._path - - def __str__(self) -> str: - return "Cannot connect to unix socket {0.path} ssl:{1} [{2}]".format( - self, self.ssl if self.ssl is not None else "default", self.strerror - ) - - -class ServerConnectionError(ClientConnectionError): - """Server connection errors.""" - - -class ServerDisconnectedError(ServerConnectionError): - """Server disconnected.""" - - def __init__(self, message: Union[RawResponseMessage, str, None] = None) -> None: - if message is None: - message = "Server disconnected" - - self.args = (message,) - self.message = message - - -class ServerTimeoutError(ServerConnectionError, asyncio.TimeoutError): - """Server timeout error.""" - - -class ServerFingerprintMismatch(ServerConnectionError): - """SSL certificate does not match expected fingerprint.""" - - def __init__(self, expected: bytes, got: bytes, host: str, port: int) -> None: - self.expected = expected - self.got = got - self.host = host - self.port = port - self.args = (expected, got, host, port) - - def __repr__(self) -> str: - return "<{} expected={!r} got={!r} host={!r} port={!r}>".format( - self.__class__.__name__, self.expected, self.got, self.host, self.port - ) - - -class ClientPayloadError(ClientError): - """Response payload error.""" - - -class InvalidURL(ClientError, ValueError): - """Invalid URL. - - URL used for fetching is malformed, e.g. it doesn't contains host - part. - """ - - # Derive from ValueError for backward compatibility - - def __init__(self, url: Any) -> None: - # The type of url is not yarl.URL because the exception can be raised - # on URL(url) call - super().__init__(url) - - @property - def url(self) -> Any: - return self.args[0] - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} {self.url}>" - - -class ClientSSLError(ClientConnectorError): - """Base error for ssl.*Errors.""" - - -if ssl is not None: - cert_errors = (ssl.CertificateError,) - cert_errors_bases = ( - ClientSSLError, - ssl.CertificateError, - ) - - ssl_errors = (ssl.SSLError,) - ssl_error_bases = (ClientSSLError, ssl.SSLError) -else: # pragma: no cover - cert_errors = tuple() - cert_errors_bases = ( - ClientSSLError, - ValueError, - ) - - ssl_errors = tuple() - ssl_error_bases = (ClientSSLError,) - - -class ClientConnectorSSLError(*ssl_error_bases): # type: ignore[misc] - """Response ssl error.""" - - -class ClientConnectorCertificateError(*cert_errors_bases): # type: ignore[misc] - """Response certificate error.""" - - def __init__( - self, connection_key: ConnectionKey, certificate_error: Exception - ) -> None: - self._conn_key = connection_key - self._certificate_error = certificate_error - self.args = (connection_key, certificate_error) - - @property - def certificate_error(self) -> Exception: - return self._certificate_error - - @property - def host(self) -> str: - return self._conn_key.host - - @property - def port(self) -> Optional[int]: - return self._conn_key.port - - @property - def ssl(self) -> bool: - return self._conn_key.is_ssl - - def __str__(self) -> str: - return ( - "Cannot connect to host {0.host}:{0.port} ssl:{0.ssl} " - "[{0.certificate_error.__class__.__name__}: " - "{0.certificate_error.args}]".format(self) - ) diff --git a/.venv/Lib/site-packages/aiohttp/client_proto.py b/.venv/Lib/site-packages/aiohttp/client_proto.py deleted file mode 100644 index f36863b..0000000 --- a/.venv/Lib/site-packages/aiohttp/client_proto.py +++ /dev/null @@ -1,251 +0,0 @@ -import asyncio -from contextlib import suppress -from typing import Any, Optional, Tuple - -from .base_protocol import BaseProtocol -from .client_exceptions import ( - ClientOSError, - ClientPayloadError, - ServerDisconnectedError, - ServerTimeoutError, -) -from .helpers import BaseTimerContext -from .http import HttpResponseParser, RawResponseMessage -from .streams import EMPTY_PAYLOAD, DataQueue, StreamReader - - -class ResponseHandler(BaseProtocol, DataQueue[Tuple[RawResponseMessage, StreamReader]]): - """Helper class to adapt between Protocol and StreamReader.""" - - def __init__(self, loop: asyncio.AbstractEventLoop) -> None: - BaseProtocol.__init__(self, loop=loop) - DataQueue.__init__(self, loop) - - self._should_close = False - - self._payload: Optional[StreamReader] = None - self._skip_payload = False - self._payload_parser = None - - self._timer = None - - self._tail = b"" - self._upgraded = False - self._parser = None # type: Optional[HttpResponseParser] - - self._read_timeout = None # type: Optional[float] - self._read_timeout_handle = None # type: Optional[asyncio.TimerHandle] - - @property - def upgraded(self) -> bool: - return self._upgraded - - @property - def should_close(self) -> bool: - if self._payload is not None and not self._payload.is_eof() or self._upgraded: - return True - - return ( - self._should_close - or self._upgraded - or self.exception() is not None - or self._payload_parser is not None - or len(self) > 0 - or bool(self._tail) - ) - - def force_close(self) -> None: - self._should_close = True - - def close(self) -> None: - transport = self.transport - if transport is not None: - transport.close() - self.transport = None - self._payload = None - self._drop_timeout() - - def is_connected(self) -> bool: - return self.transport is not None and not self.transport.is_closing() - - def connection_lost(self, exc: Optional[BaseException]) -> None: - self._drop_timeout() - - if self._payload_parser is not None: - with suppress(Exception): - self._payload_parser.feed_eof() - - uncompleted = None - if self._parser is not None: - try: - uncompleted = self._parser.feed_eof() - except Exception: - if self._payload is not None: - self._payload.set_exception( - ClientPayloadError("Response payload is not completed") - ) - - if not self.is_eof(): - if isinstance(exc, OSError): - exc = ClientOSError(*exc.args) - if exc is None: - exc = ServerDisconnectedError(uncompleted) - # assigns self._should_close to True as side effect, - # we do it anyway below - self.set_exception(exc) - - self._should_close = True - self._parser = None - self._payload = None - self._payload_parser = None - self._reading_paused = False - - super().connection_lost(exc) - - def eof_received(self) -> None: - # should call parser.feed_eof() most likely - self._drop_timeout() - - def pause_reading(self) -> None: - super().pause_reading() - self._drop_timeout() - - def resume_reading(self) -> None: - super().resume_reading() - self._reschedule_timeout() - - def set_exception(self, exc: BaseException) -> None: - self._should_close = True - self._drop_timeout() - super().set_exception(exc) - - def set_parser(self, parser: Any, payload: Any) -> None: - # TODO: actual types are: - # parser: WebSocketReader - # payload: FlowControlDataQueue - # but they are not generi enough - # Need an ABC for both types - self._payload = payload - self._payload_parser = parser - - self._drop_timeout() - - if self._tail: - data, self._tail = self._tail, b"" - self.data_received(data) - - def set_response_params( - self, - *, - timer: Optional[BaseTimerContext] = None, - skip_payload: bool = False, - read_until_eof: bool = False, - auto_decompress: bool = True, - read_timeout: Optional[float] = None, - read_bufsize: int = 2 ** 16, - ) -> None: - self._skip_payload = skip_payload - - self._read_timeout = read_timeout - self._reschedule_timeout() - - self._parser = HttpResponseParser( - self, - self._loop, - read_bufsize, - timer=timer, - payload_exception=ClientPayloadError, - response_with_body=not skip_payload, - read_until_eof=read_until_eof, - auto_decompress=auto_decompress, - ) - - if self._tail: - data, self._tail = self._tail, b"" - self.data_received(data) - - def _drop_timeout(self) -> None: - if self._read_timeout_handle is not None: - self._read_timeout_handle.cancel() - self._read_timeout_handle = None - - def _reschedule_timeout(self) -> None: - timeout = self._read_timeout - if self._read_timeout_handle is not None: - self._read_timeout_handle.cancel() - - if timeout: - self._read_timeout_handle = self._loop.call_later( - timeout, self._on_read_timeout - ) - else: - self._read_timeout_handle = None - - def _on_read_timeout(self) -> None: - exc = ServerTimeoutError("Timeout on reading data from socket") - self.set_exception(exc) - if self._payload is not None: - self._payload.set_exception(exc) - - def data_received(self, data: bytes) -> None: - self._reschedule_timeout() - - if not data: - return - - # custom payload parser - if self._payload_parser is not None: - eof, tail = self._payload_parser.feed_data(data) - if eof: - self._payload = None - self._payload_parser = None - - if tail: - self.data_received(tail) - return - else: - if self._upgraded or self._parser is None: - # i.e. websocket connection, websocket parser is not set yet - self._tail += data - else: - # parse http messages - try: - messages, upgraded, tail = self._parser.feed_data(data) - except BaseException as exc: - if self.transport is not None: - # connection.release() could be called BEFORE - # data_received(), the transport is already - # closed in this case - self.transport.close() - # should_close is True after the call - self.set_exception(exc) - return - - self._upgraded = upgraded - - payload: Optional[StreamReader] = None - for message, payload in messages: - if message.should_close: - self._should_close = True - - self._payload = payload - - if self._skip_payload or message.code in (204, 304): - self.feed_data((message, EMPTY_PAYLOAD), 0) - else: - self.feed_data((message, payload), 0) - if payload is not None: - # new message(s) was processed - # register timeout handler unsubscribing - # either on end-of-stream or immediately for - # EMPTY_PAYLOAD - if payload is not EMPTY_PAYLOAD: - payload.on_eof(self._drop_timeout) - else: - self._drop_timeout() - - if tail: - if upgraded: - self.data_received(tail) - else: - self._tail = tail diff --git a/.venv/Lib/site-packages/aiohttp/client_reqrep.py b/.venv/Lib/site-packages/aiohttp/client_reqrep.py deleted file mode 100644 index 3430025..0000000 --- a/.venv/Lib/site-packages/aiohttp/client_reqrep.py +++ /dev/null @@ -1,1133 +0,0 @@ -import asyncio -import codecs -import functools -import io -import re -import sys -import traceback -import warnings -from hashlib import md5, sha1, sha256 -from http.cookies import CookieError, Morsel, SimpleCookie -from types import MappingProxyType, TracebackType -from typing import ( - TYPE_CHECKING, - Any, - Dict, - Iterable, - List, - Mapping, - Optional, - Tuple, - Type, - Union, - cast, -) - -import attr -from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy -from yarl import URL - -from . import hdrs, helpers, http, multipart, payload -from .abc import AbstractStreamWriter -from .client_exceptions import ( - ClientConnectionError, - ClientOSError, - ClientResponseError, - ContentTypeError, - InvalidURL, - ServerFingerprintMismatch, -) -from .formdata import FormData -from .helpers import ( - PY_36, - BaseTimerContext, - BasicAuth, - HeadersMixin, - TimerNoop, - noop, - reify, - set_result, -) -from .http import SERVER_SOFTWARE, HttpVersion10, HttpVersion11, StreamWriter -from .log import client_logger -from .streams import StreamReader -from .typedefs import ( - DEFAULT_JSON_DECODER, - JSONDecoder, - LooseCookies, - LooseHeaders, - RawHeaders, -) - -try: - import ssl - from ssl import SSLContext -except ImportError: # pragma: no cover - ssl = None # type: ignore[assignment] - SSLContext = object # type: ignore[misc,assignment] - -try: - import cchardet as chardet -except ImportError: # pragma: no cover - import charset_normalizer as chardet # type: ignore[no-redef] - - -__all__ = ("ClientRequest", "ClientResponse", "RequestInfo", "Fingerprint") - - -if TYPE_CHECKING: # pragma: no cover - from .client import ClientSession - from .connector import Connection - from .tracing import Trace - - -json_re = re.compile(r"^application/(?:[\w.+-]+?\+)?json") - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class ContentDisposition: - type: Optional[str] - parameters: "MappingProxyType[str, str]" - filename: Optional[str] - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class RequestInfo: - url: URL - method: str - headers: "CIMultiDictProxy[str]" - real_url: URL = attr.ib() - - @real_url.default - def real_url_default(self) -> URL: - return self.url - - -class Fingerprint: - HASHFUNC_BY_DIGESTLEN = { - 16: md5, - 20: sha1, - 32: sha256, - } - - def __init__(self, fingerprint: bytes) -> None: - digestlen = len(fingerprint) - hashfunc = self.HASHFUNC_BY_DIGESTLEN.get(digestlen) - if not hashfunc: - raise ValueError("fingerprint has invalid length") - elif hashfunc is md5 or hashfunc is sha1: - raise ValueError( - "md5 and sha1 are insecure and " "not supported. Use sha256." - ) - self._hashfunc = hashfunc - self._fingerprint = fingerprint - - @property - def fingerprint(self) -> bytes: - return self._fingerprint - - def check(self, transport: asyncio.Transport) -> None: - if not transport.get_extra_info("sslcontext"): - return - sslobj = transport.get_extra_info("ssl_object") - cert = sslobj.getpeercert(binary_form=True) - got = self._hashfunc(cert).digest() - if got != self._fingerprint: - host, port, *_ = transport.get_extra_info("peername") - raise ServerFingerprintMismatch(self._fingerprint, got, host, port) - - -if ssl is not None: - SSL_ALLOWED_TYPES = (ssl.SSLContext, bool, Fingerprint, type(None)) -else: # pragma: no cover - SSL_ALLOWED_TYPES = type(None) - - -def _merge_ssl_params( - ssl: Union["SSLContext", bool, Fingerprint, None], - verify_ssl: Optional[bool], - ssl_context: Optional["SSLContext"], - fingerprint: Optional[bytes], -) -> Union["SSLContext", bool, Fingerprint, None]: - if verify_ssl is not None and not verify_ssl: - warnings.warn( - "verify_ssl is deprecated, use ssl=False instead", - DeprecationWarning, - stacklevel=3, - ) - if ssl is not None: - raise ValueError( - "verify_ssl, ssl_context, fingerprint and ssl " - "parameters are mutually exclusive" - ) - else: - ssl = False - if ssl_context is not None: - warnings.warn( - "ssl_context is deprecated, use ssl=context instead", - DeprecationWarning, - stacklevel=3, - ) - if ssl is not None: - raise ValueError( - "verify_ssl, ssl_context, fingerprint and ssl " - "parameters are mutually exclusive" - ) - else: - ssl = ssl_context - if fingerprint is not None: - warnings.warn( - "fingerprint is deprecated, " "use ssl=Fingerprint(fingerprint) instead", - DeprecationWarning, - stacklevel=3, - ) - if ssl is not None: - raise ValueError( - "verify_ssl, ssl_context, fingerprint and ssl " - "parameters are mutually exclusive" - ) - else: - ssl = Fingerprint(fingerprint) - if not isinstance(ssl, SSL_ALLOWED_TYPES): - raise TypeError( - "ssl should be SSLContext, bool, Fingerprint or None, " - "got {!r} instead.".format(ssl) - ) - return ssl - - -@attr.s(auto_attribs=True, slots=True, frozen=True) -class ConnectionKey: - # the key should contain an information about used proxy / TLS - # to prevent reusing wrong connections from a pool - host: str - port: Optional[int] - is_ssl: bool - ssl: Union[SSLContext, None, bool, Fingerprint] - proxy: Optional[URL] - proxy_auth: Optional[BasicAuth] - proxy_headers_hash: Optional[int] # hash(CIMultiDict) - - -def _is_expected_content_type( - response_content_type: str, expected_content_type: str -) -> bool: - if expected_content_type == "application/json": - return json_re.match(response_content_type) is not None - return expected_content_type in response_content_type - - -class ClientRequest: - GET_METHODS = { - hdrs.METH_GET, - hdrs.METH_HEAD, - hdrs.METH_OPTIONS, - hdrs.METH_TRACE, - } - POST_METHODS = {hdrs.METH_PATCH, hdrs.METH_POST, hdrs.METH_PUT} - ALL_METHODS = GET_METHODS.union(POST_METHODS).union({hdrs.METH_DELETE}) - - DEFAULT_HEADERS = { - hdrs.ACCEPT: "*/*", - hdrs.ACCEPT_ENCODING: "gzip, deflate", - } - - body = b"" - auth = None - response = None - - _writer = None # async task for streaming data - _continue = None # waiter future for '100 Continue' response - - # N.B. - # Adding __del__ method with self._writer closing doesn't make sense - # because _writer is instance method, thus it keeps a reference to self. - # Until writer has finished finalizer will not be called. - - def __init__( - self, - method: str, - url: URL, - *, - params: Optional[Mapping[str, str]] = None, - headers: Optional[LooseHeaders] = None, - skip_auto_headers: Iterable[str] = frozenset(), - data: Any = None, - cookies: Optional[LooseCookies] = None, - auth: Optional[BasicAuth] = None, - version: http.HttpVersion = http.HttpVersion11, - compress: Optional[str] = None, - chunked: Optional[bool] = None, - expect100: bool = False, - loop: Optional[asyncio.AbstractEventLoop] = None, - response_class: Optional[Type["ClientResponse"]] = None, - proxy: Optional[URL] = None, - proxy_auth: Optional[BasicAuth] = None, - timer: Optional[BaseTimerContext] = None, - session: Optional["ClientSession"] = None, - ssl: Union[SSLContext, bool, Fingerprint, None] = None, - proxy_headers: Optional[LooseHeaders] = None, - traces: Optional[List["Trace"]] = None, - ): - - if loop is None: - loop = asyncio.get_event_loop() - - assert isinstance(url, URL), url - assert isinstance(proxy, (URL, type(None))), proxy - # FIXME: session is None in tests only, need to fix tests - # assert session is not None - self._session = cast("ClientSession", session) - if params: - q = MultiDict(url.query) - url2 = url.with_query(params) - q.extend(url2.query) - url = url.with_query(q) - self.original_url = url - self.url = url.with_fragment(None) - self.method = method.upper() - self.chunked = chunked - self.compress = compress - self.loop = loop - self.length = None - if response_class is None: - real_response_class = ClientResponse - else: - real_response_class = response_class - self.response_class = real_response_class # type: Type[ClientResponse] - self._timer = timer if timer is not None else TimerNoop() - self._ssl = ssl - - if loop.get_debug(): - self._source_traceback = traceback.extract_stack(sys._getframe(1)) - - self.update_version(version) - self.update_host(url) - self.update_headers(headers) - self.update_auto_headers(skip_auto_headers) - self.update_cookies(cookies) - self.update_content_encoding(data) - self.update_auth(auth) - self.update_proxy(proxy, proxy_auth, proxy_headers) - - self.update_body_from_data(data) - if data is not None or self.method not in self.GET_METHODS: - self.update_transfer_encoding() - self.update_expect_continue(expect100) - if traces is None: - traces = [] - self._traces = traces - - def is_ssl(self) -> bool: - return self.url.scheme in ("https", "wss") - - @property - def ssl(self) -> Union["SSLContext", None, bool, Fingerprint]: - return self._ssl - - @property - def connection_key(self) -> ConnectionKey: - proxy_headers = self.proxy_headers - if proxy_headers: - h = hash( - tuple((k, v) for k, v in proxy_headers.items()) - ) # type: Optional[int] - else: - h = None - return ConnectionKey( - self.host, - self.port, - self.is_ssl(), - self.ssl, - self.proxy, - self.proxy_auth, - h, - ) - - @property - def host(self) -> str: - ret = self.url.raw_host - assert ret is not None - return ret - - @property - def port(self) -> Optional[int]: - return self.url.port - - @property - def request_info(self) -> RequestInfo: - headers = CIMultiDictProxy(self.headers) # type: CIMultiDictProxy[str] - return RequestInfo(self.url, self.method, headers, self.original_url) - - def update_host(self, url: URL) -> None: - """Update destination host, port and connection type (ssl).""" - # get host/port - if not url.raw_host: - raise InvalidURL(url) - - # basic auth info - username, password = url.user, url.password - if username: - self.auth = helpers.BasicAuth(username, password or "") - - def update_version(self, version: Union[http.HttpVersion, str]) -> None: - """Convert request version to two elements tuple. - - parser HTTP version '1.1' => (1, 1) - """ - if isinstance(version, str): - v = [part.strip() for part in version.split(".", 1)] - try: - version = http.HttpVersion(int(v[0]), int(v[1])) - except ValueError: - raise ValueError( - f"Can not parse http version number: {version}" - ) from None - self.version = version - - def update_headers(self, headers: Optional[LooseHeaders]) -> None: - """Update request headers.""" - self.headers = CIMultiDict() # type: CIMultiDict[str] - - # add host - netloc = cast(str, self.url.raw_host) - if helpers.is_ipv6_address(netloc): - netloc = f"[{netloc}]" - if self.url.port is not None and not self.url.is_default_port(): - netloc += ":" + str(self.url.port) - self.headers[hdrs.HOST] = netloc - - if headers: - if isinstance(headers, (dict, MultiDictProxy, MultiDict)): - headers = headers.items() # type: ignore[assignment] - - for key, value in headers: # type: ignore[misc] - # A special case for Host header - if key.lower() == "host": - self.headers[key] = value - else: - self.headers.add(key, value) - - def update_auto_headers(self, skip_auto_headers: Iterable[str]) -> None: - self.skip_auto_headers = CIMultiDict( - (hdr, None) for hdr in sorted(skip_auto_headers) - ) - used_headers = self.headers.copy() - used_headers.extend(self.skip_auto_headers) # type: ignore[arg-type] - - for hdr, val in self.DEFAULT_HEADERS.items(): - if hdr not in used_headers: - self.headers.add(hdr, val) - - if hdrs.USER_AGENT not in used_headers: - self.headers[hdrs.USER_AGENT] = SERVER_SOFTWARE - - def update_cookies(self, cookies: Optional[LooseCookies]) -> None: - """Update request cookies header.""" - if not cookies: - return - - c = SimpleCookie() # type: SimpleCookie[str] - if hdrs.COOKIE in self.headers: - c.load(self.headers.get(hdrs.COOKIE, "")) - del self.headers[hdrs.COOKIE] - - if isinstance(cookies, Mapping): - iter_cookies = cookies.items() - else: - iter_cookies = cookies # type: ignore[assignment] - for name, value in iter_cookies: - if isinstance(value, Morsel): - # Preserve coded_value - mrsl_val = value.get(value.key, Morsel()) - mrsl_val.set(value.key, value.value, value.coded_value) - c[name] = mrsl_val - else: - c[name] = value # type: ignore[assignment] - - self.headers[hdrs.COOKIE] = c.output(header="", sep=";").strip() - - def update_content_encoding(self, data: Any) -> None: - """Set request content encoding.""" - if data is None: - return - - enc = self.headers.get(hdrs.CONTENT_ENCODING, "").lower() - if enc: - if self.compress: - raise ValueError( - "compress can not be set " "if Content-Encoding header is set" - ) - elif self.compress: - if not isinstance(self.compress, str): - self.compress = "deflate" - self.headers[hdrs.CONTENT_ENCODING] = self.compress - self.chunked = True # enable chunked, no need to deal with length - - def update_transfer_encoding(self) -> None: - """Analyze transfer-encoding header.""" - te = self.headers.get(hdrs.TRANSFER_ENCODING, "").lower() - - if "chunked" in te: - if self.chunked: - raise ValueError( - "chunked can not be set " - 'if "Transfer-Encoding: chunked" header is set' - ) - - elif self.chunked: - if hdrs.CONTENT_LENGTH in self.headers: - raise ValueError( - "chunked can not be set " "if Content-Length header is set" - ) - - self.headers[hdrs.TRANSFER_ENCODING] = "chunked" - else: - if hdrs.CONTENT_LENGTH not in self.headers: - self.headers[hdrs.CONTENT_LENGTH] = str(len(self.body)) - - def update_auth(self, auth: Optional[BasicAuth]) -> None: - """Set basic auth.""" - if auth is None: - auth = self.auth - if auth is None: - return - - if not isinstance(auth, helpers.BasicAuth): - raise TypeError("BasicAuth() tuple is required instead") - - self.headers[hdrs.AUTHORIZATION] = auth.encode() - - def update_body_from_data(self, body: Any) -> None: - if body is None: - return - - # FormData - if isinstance(body, FormData): - body = body() - - try: - body = payload.PAYLOAD_REGISTRY.get(body, disposition=None) - except payload.LookupError: - body = FormData(body)() - - self.body = body - - # enable chunked encoding if needed - if not self.chunked: - if hdrs.CONTENT_LENGTH not in self.headers: - size = body.size - if size is None: - self.chunked = True - else: - if hdrs.CONTENT_LENGTH not in self.headers: - self.headers[hdrs.CONTENT_LENGTH] = str(size) - - # copy payload headers - assert body.headers - for (key, value) in body.headers.items(): - if key in self.headers: - continue - if key in self.skip_auto_headers: - continue - self.headers[key] = value - - def update_expect_continue(self, expect: bool = False) -> None: - if expect: - self.headers[hdrs.EXPECT] = "100-continue" - elif self.headers.get(hdrs.EXPECT, "").lower() == "100-continue": - expect = True - - if expect: - self._continue = self.loop.create_future() - - def update_proxy( - self, - proxy: Optional[URL], - proxy_auth: Optional[BasicAuth], - proxy_headers: Optional[LooseHeaders], - ) -> None: - if proxy_auth and not isinstance(proxy_auth, helpers.BasicAuth): - raise ValueError("proxy_auth must be None or BasicAuth() tuple") - self.proxy = proxy - self.proxy_auth = proxy_auth - self.proxy_headers = proxy_headers - - def keep_alive(self) -> bool: - if self.version < HttpVersion10: - # keep alive not supported at all - return False - if self.version == HttpVersion10: - if self.headers.get(hdrs.CONNECTION) == "keep-alive": - return True - else: # no headers means we close for Http 1.0 - return False - elif self.headers.get(hdrs.CONNECTION) == "close": - return False - - return True - - async def write_bytes( - self, writer: AbstractStreamWriter, conn: "Connection" - ) -> None: - """Support coroutines that yields bytes objects.""" - # 100 response - if self._continue is not None: - await writer.drain() - await self._continue - - protocol = conn.protocol - assert protocol is not None - try: - if isinstance(self.body, payload.Payload): - await self.body.write(writer) - else: - if isinstance(self.body, (bytes, bytearray)): - self.body = (self.body,) # type: ignore[assignment] - - for chunk in self.body: - await writer.write(chunk) # type: ignore[arg-type] - - await writer.write_eof() - except OSError as exc: - new_exc = ClientOSError( - exc.errno, "Can not write request body for %s" % self.url - ) - new_exc.__context__ = exc - new_exc.__cause__ = exc - protocol.set_exception(new_exc) - except asyncio.CancelledError as exc: - if not conn.closed: - protocol.set_exception(exc) - except Exception as exc: - protocol.set_exception(exc) - finally: - self._writer = None - - async def send(self, conn: "Connection") -> "ClientResponse": - # Specify request target: - # - CONNECT request must send authority form URI - # - not CONNECT proxy must send absolute form URI - # - most common is origin form URI - if self.method == hdrs.METH_CONNECT: - connect_host = self.url.raw_host - assert connect_host is not None - if helpers.is_ipv6_address(connect_host): - connect_host = f"[{connect_host}]" - path = f"{connect_host}:{self.url.port}" - elif self.proxy and not self.is_ssl(): - path = str(self.url) - else: - path = self.url.raw_path - if self.url.raw_query_string: - path += "?" + self.url.raw_query_string - - protocol = conn.protocol - assert protocol is not None - writer = StreamWriter( - protocol, - self.loop, - on_chunk_sent=functools.partial( - self._on_chunk_request_sent, self.method, self.url - ), - on_headers_sent=functools.partial( - self._on_headers_request_sent, self.method, self.url - ), - ) - - if self.compress: - writer.enable_compression(self.compress) - - if self.chunked is not None: - writer.enable_chunking() - - # set default content-type - if ( - self.method in self.POST_METHODS - and hdrs.CONTENT_TYPE not in self.skip_auto_headers - and hdrs.CONTENT_TYPE not in self.headers - ): - self.headers[hdrs.CONTENT_TYPE] = "application/octet-stream" - - # set the connection header - connection = self.headers.get(hdrs.CONNECTION) - if not connection: - if self.keep_alive(): - if self.version == HttpVersion10: - connection = "keep-alive" - else: - if self.version == HttpVersion11: - connection = "close" - - if connection is not None: - self.headers[hdrs.CONNECTION] = connection - - # status + headers - status_line = "{0} {1} HTTP/{2[0]}.{2[1]}".format( - self.method, path, self.version - ) - await writer.write_headers(status_line, self.headers) - - self._writer = self.loop.create_task(self.write_bytes(writer, conn)) - - response_class = self.response_class - assert response_class is not None - self.response = response_class( - self.method, - self.original_url, - writer=self._writer, - continue100=self._continue, - timer=self._timer, - request_info=self.request_info, - traces=self._traces, - loop=self.loop, - session=self._session, - ) - return self.response - - async def close(self) -> None: - if self._writer is not None: - try: - await self._writer - finally: - self._writer = None - - def terminate(self) -> None: - if self._writer is not None: - if not self.loop.is_closed(): - self._writer.cancel() - self._writer = None - - async def _on_chunk_request_sent(self, method: str, url: URL, chunk: bytes) -> None: - for trace in self._traces: - await trace.send_request_chunk_sent(method, url, chunk) - - async def _on_headers_request_sent( - self, method: str, url: URL, headers: "CIMultiDict[str]" - ) -> None: - for trace in self._traces: - await trace.send_request_headers(method, url, headers) - - -class ClientResponse(HeadersMixin): - - # from the Status-Line of the response - version = None # HTTP-Version - status = None # type: int # Status-Code - reason = None # Reason-Phrase - - content = None # type: StreamReader # Payload stream - _headers = None # type: CIMultiDictProxy[str] # Response headers - _raw_headers = None # type: RawHeaders # Response raw headers - - _connection = None # current connection - _source_traceback = None - # setted up by ClientRequest after ClientResponse object creation - # post-init stage allows to not change ctor signature - _closed = True # to allow __del__ for non-initialized properly response - _released = False - - def __init__( - self, - method: str, - url: URL, - *, - writer: "asyncio.Task[None]", - continue100: Optional["asyncio.Future[bool]"], - timer: BaseTimerContext, - request_info: RequestInfo, - traces: List["Trace"], - loop: asyncio.AbstractEventLoop, - session: "ClientSession", - ) -> None: - assert isinstance(url, URL) - - self.method = method - self.cookies = SimpleCookie() # type: SimpleCookie[str] - - self._real_url = url - self._url = url.with_fragment(None) - self._body = None # type: Any - self._writer = writer # type: Optional[asyncio.Task[None]] - self._continue = continue100 # None by default - self._closed = True - self._history = () # type: Tuple[ClientResponse, ...] - self._request_info = request_info - self._timer = timer if timer is not None else TimerNoop() - self._cache = {} # type: Dict[str, Any] - self._traces = traces - self._loop = loop - # store a reference to session #1985 - self._session = session # type: Optional[ClientSession] - if loop.get_debug(): - self._source_traceback = traceback.extract_stack(sys._getframe(1)) - - @reify - def url(self) -> URL: - return self._url - - @reify - def url_obj(self) -> URL: - warnings.warn("Deprecated, use .url #1654", DeprecationWarning, stacklevel=2) - return self._url - - @reify - def real_url(self) -> URL: - return self._real_url - - @reify - def host(self) -> str: - assert self._url.host is not None - return self._url.host - - @reify - def headers(self) -> "CIMultiDictProxy[str]": - return self._headers - - @reify - def raw_headers(self) -> RawHeaders: - return self._raw_headers - - @reify - def request_info(self) -> RequestInfo: - return self._request_info - - @reify - def content_disposition(self) -> Optional[ContentDisposition]: - raw = self._headers.get(hdrs.CONTENT_DISPOSITION) - if raw is None: - return None - disposition_type, params_dct = multipart.parse_content_disposition(raw) - params = MappingProxyType(params_dct) - filename = multipart.content_disposition_filename(params) - return ContentDisposition(disposition_type, params, filename) - - def __del__(self, _warnings: Any = warnings) -> None: - if self._closed: - return - - if self._connection is not None: - self._connection.release() - self._cleanup_writer() - - if self._loop.get_debug(): - if PY_36: - kwargs = {"source": self} - else: - kwargs = {} - _warnings.warn(f"Unclosed response {self!r}", ResourceWarning, **kwargs) - context = {"client_response": self, "message": "Unclosed response"} - if self._source_traceback: - context["source_traceback"] = self._source_traceback - self._loop.call_exception_handler(context) - - def __repr__(self) -> str: - out = io.StringIO() - ascii_encodable_url = str(self.url) - if self.reason: - ascii_encodable_reason = self.reason.encode( - "ascii", "backslashreplace" - ).decode("ascii") - else: - ascii_encodable_reason = self.reason - print( - "".format( - ascii_encodable_url, self.status, ascii_encodable_reason - ), - file=out, - ) - print(self.headers, file=out) - return out.getvalue() - - @property - def connection(self) -> Optional["Connection"]: - return self._connection - - @reify - def history(self) -> Tuple["ClientResponse", ...]: - """A sequence of of responses, if redirects occurred.""" - return self._history - - @reify - def links(self) -> "MultiDictProxy[MultiDictProxy[Union[str, URL]]]": - links_str = ", ".join(self.headers.getall("link", [])) - - if not links_str: - return MultiDictProxy(MultiDict()) - - links = MultiDict() # type: MultiDict[MultiDictProxy[Union[str, URL]]] - - for val in re.split(r",(?=\s*<)", links_str): - match = re.match(r"\s*<(.*)>(.*)", val) - if match is None: # pragma: no cover - # the check exists to suppress mypy error - continue - url, params_str = match.groups() - params = params_str.split(";")[1:] - - link = MultiDict() # type: MultiDict[Union[str, URL]] - - for param in params: - match = re.match(r"^\s*(\S*)\s*=\s*(['\"]?)(.*?)(\2)\s*$", param, re.M) - if match is None: # pragma: no cover - # the check exists to suppress mypy error - continue - key, _, value, _ = match.groups() - - link.add(key, value) - - key = link.get("rel", url) # type: ignore[assignment] - - link.add("url", self.url.join(URL(url))) - - links.add(key, MultiDictProxy(link)) - - return MultiDictProxy(links) - - async def start(self, connection: "Connection") -> "ClientResponse": - """Start response processing.""" - self._closed = False - self._protocol = connection.protocol - self._connection = connection - - with self._timer: - while True: - # read response - try: - protocol = self._protocol - message, payload = await protocol.read() # type: ignore[union-attr] - except http.HttpProcessingError as exc: - raise ClientResponseError( - self.request_info, - self.history, - status=exc.code, - message=exc.message, - headers=exc.headers, - ) from exc - - if message.code < 100 or message.code > 199 or message.code == 101: - break - - if self._continue is not None: - set_result(self._continue, True) - self._continue = None - - # payload eof handler - payload.on_eof(self._response_eof) - - # response status - self.version = message.version - self.status = message.code - self.reason = message.reason - - # headers - self._headers = message.headers # type is CIMultiDictProxy - self._raw_headers = message.raw_headers # type is Tuple[bytes, bytes] - - # payload - self.content = payload - - # cookies - for hdr in self.headers.getall(hdrs.SET_COOKIE, ()): - try: - self.cookies.load(hdr) - except CookieError as exc: - client_logger.warning("Can not load response cookies: %s", exc) - return self - - def _response_eof(self) -> None: - if self._closed: - return - - if self._connection is not None: - # websocket, protocol could be None because - # connection could be detached - if ( - self._connection.protocol is not None - and self._connection.protocol.upgraded - ): - return - - self._connection.release() - self._connection = None - - self._closed = True - self._cleanup_writer() - - @property - def closed(self) -> bool: - return self._closed - - def close(self) -> None: - if not self._released: - self._notify_content() - if self._closed: - return - - self._closed = True - if self._loop is None or self._loop.is_closed(): - return - - if self._connection is not None: - self._connection.close() - self._connection = None - self._cleanup_writer() - - def release(self) -> Any: - if not self._released: - self._notify_content() - if self._closed: - return noop() - - self._closed = True - if self._connection is not None: - self._connection.release() - self._connection = None - - self._cleanup_writer() - return noop() - - @property - def ok(self) -> bool: - """Returns ``True`` if ``status`` is less than ``400``, ``False`` if not. - - This is **not** a check for ``200 OK`` but a check that the response - status is under 400. - """ - return 400 > self.status - - def raise_for_status(self) -> None: - if not self.ok: - # reason should always be not None for a started response - assert self.reason is not None - self.release() - raise ClientResponseError( - self.request_info, - self.history, - status=self.status, - message=self.reason, - headers=self.headers, - ) - - def _cleanup_writer(self) -> None: - if self._writer is not None: - self._writer.cancel() - self._writer = None - self._session = None - - def _notify_content(self) -> None: - content = self.content - if content and content.exception() is None: - content.set_exception(ClientConnectionError("Connection closed")) - self._released = True - - async def wait_for_close(self) -> None: - if self._writer is not None: - try: - await self._writer - finally: - self._writer = None - self.release() - - async def read(self) -> bytes: - """Read response payload.""" - if self._body is None: - try: - self._body = await self.content.read() - for trace in self._traces: - await trace.send_response_chunk_received( - self.method, self.url, self._body - ) - except BaseException: - self.close() - raise - elif self._released: - raise ClientConnectionError("Connection closed") - - return self._body # type: ignore[no-any-return] - - def get_encoding(self) -> str: - ctype = self.headers.get(hdrs.CONTENT_TYPE, "").lower() - mimetype = helpers.parse_mimetype(ctype) - - encoding = mimetype.parameters.get("charset") - if encoding: - try: - codecs.lookup(encoding) - except LookupError: - encoding = None - if not encoding: - if mimetype.type == "application" and ( - mimetype.subtype == "json" or mimetype.subtype == "rdap" - ): - # RFC 7159 states that the default encoding is UTF-8. - # RFC 7483 defines application/rdap+json - encoding = "utf-8" - elif self._body is None: - raise RuntimeError( - "Cannot guess the encoding of " "a not yet read body" - ) - else: - encoding = chardet.detect(self._body)["encoding"] - if not encoding: - encoding = "utf-8" - - return encoding - - async def text(self, encoding: Optional[str] = None, errors: str = "strict") -> str: - """Read response payload and decode.""" - if self._body is None: - await self.read() - - if encoding is None: - encoding = self.get_encoding() - - return self._body.decode( # type: ignore[no-any-return,union-attr] - encoding, errors=errors - ) - - async def json( - self, - *, - encoding: Optional[str] = None, - loads: JSONDecoder = DEFAULT_JSON_DECODER, - content_type: Optional[str] = "application/json", - ) -> Any: - """Read and decodes JSON response.""" - if self._body is None: - await self.read() - - if content_type: - ctype = self.headers.get(hdrs.CONTENT_TYPE, "").lower() - if not _is_expected_content_type(ctype, content_type): - raise ContentTypeError( - self.request_info, - self.history, - message=( - "Attempt to decode JSON with " "unexpected mimetype: %s" % ctype - ), - headers=self.headers, - ) - - stripped = self._body.strip() # type: ignore[union-attr] - if not stripped: - return None - - if encoding is None: - encoding = self.get_encoding() - - return loads(stripped.decode(encoding)) - - async def __aenter__(self) -> "ClientResponse": - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - # similar to _RequestContextManager, we do not need to check - # for exceptions, response object can close connection - # if state is broken - self.release() diff --git a/.venv/Lib/site-packages/aiohttp/client_ws.py b/.venv/Lib/site-packages/aiohttp/client_ws.py deleted file mode 100644 index 7c8121f..0000000 --- a/.venv/Lib/site-packages/aiohttp/client_ws.py +++ /dev/null @@ -1,300 +0,0 @@ -"""WebSocket client for asyncio.""" - -import asyncio -from typing import Any, Optional, cast - -import async_timeout - -from .client_exceptions import ClientError -from .client_reqrep import ClientResponse -from .helpers import call_later, set_result -from .http import ( - WS_CLOSED_MESSAGE, - WS_CLOSING_MESSAGE, - WebSocketError, - WSCloseCode, - WSMessage, - WSMsgType, -) -from .http_websocket import WebSocketWriter # WSMessage -from .streams import EofStream, FlowControlDataQueue -from .typedefs import ( - DEFAULT_JSON_DECODER, - DEFAULT_JSON_ENCODER, - JSONDecoder, - JSONEncoder, -) - - -class ClientWebSocketResponse: - def __init__( - self, - reader: "FlowControlDataQueue[WSMessage]", - writer: WebSocketWriter, - protocol: Optional[str], - response: ClientResponse, - timeout: float, - autoclose: bool, - autoping: bool, - loop: asyncio.AbstractEventLoop, - *, - receive_timeout: Optional[float] = None, - heartbeat: Optional[float] = None, - compress: int = 0, - client_notakeover: bool = False, - ) -> None: - self._response = response - self._conn = response.connection - - self._writer = writer - self._reader = reader - self._protocol = protocol - self._closed = False - self._closing = False - self._close_code = None # type: Optional[int] - self._timeout = timeout - self._receive_timeout = receive_timeout - self._autoclose = autoclose - self._autoping = autoping - self._heartbeat = heartbeat - self._heartbeat_cb: Optional[asyncio.TimerHandle] = None - if heartbeat is not None: - self._pong_heartbeat = heartbeat / 2.0 - self._pong_response_cb: Optional[asyncio.TimerHandle] = None - self._loop = loop - self._waiting = None # type: Optional[asyncio.Future[bool]] - self._exception = None # type: Optional[BaseException] - self._compress = compress - self._client_notakeover = client_notakeover - - self._reset_heartbeat() - - def _cancel_heartbeat(self) -> None: - if self._pong_response_cb is not None: - self._pong_response_cb.cancel() - self._pong_response_cb = None - - if self._heartbeat_cb is not None: - self._heartbeat_cb.cancel() - self._heartbeat_cb = None - - def _reset_heartbeat(self) -> None: - self._cancel_heartbeat() - - if self._heartbeat is not None: - self._heartbeat_cb = call_later( - self._send_heartbeat, self._heartbeat, self._loop - ) - - def _send_heartbeat(self) -> None: - if self._heartbeat is not None and not self._closed: - # fire-and-forget a task is not perfect but maybe ok for - # sending ping. Otherwise we need a long-living heartbeat - # task in the class. - self._loop.create_task(self._writer.ping()) - - if self._pong_response_cb is not None: - self._pong_response_cb.cancel() - self._pong_response_cb = call_later( - self._pong_not_received, self._pong_heartbeat, self._loop - ) - - def _pong_not_received(self) -> None: - if not self._closed: - self._closed = True - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - self._exception = asyncio.TimeoutError() - self._response.close() - - @property - def closed(self) -> bool: - return self._closed - - @property - def close_code(self) -> Optional[int]: - return self._close_code - - @property - def protocol(self) -> Optional[str]: - return self._protocol - - @property - def compress(self) -> int: - return self._compress - - @property - def client_notakeover(self) -> bool: - return self._client_notakeover - - def get_extra_info(self, name: str, default: Any = None) -> Any: - """extra info from connection transport""" - conn = self._response.connection - if conn is None: - return default - transport = conn.transport - if transport is None: - return default - return transport.get_extra_info(name, default) - - def exception(self) -> Optional[BaseException]: - return self._exception - - async def ping(self, message: bytes = b"") -> None: - await self._writer.ping(message) - - async def pong(self, message: bytes = b"") -> None: - await self._writer.pong(message) - - async def send_str(self, data: str, compress: Optional[int] = None) -> None: - if not isinstance(data, str): - raise TypeError("data argument must be str (%r)" % type(data)) - await self._writer.send(data, binary=False, compress=compress) - - async def send_bytes(self, data: bytes, compress: Optional[int] = None) -> None: - if not isinstance(data, (bytes, bytearray, memoryview)): - raise TypeError("data argument must be byte-ish (%r)" % type(data)) - await self._writer.send(data, binary=True, compress=compress) - - async def send_json( - self, - data: Any, - compress: Optional[int] = None, - *, - dumps: JSONEncoder = DEFAULT_JSON_ENCODER, - ) -> None: - await self.send_str(dumps(data), compress=compress) - - async def close(self, *, code: int = WSCloseCode.OK, message: bytes = b"") -> bool: - # we need to break `receive()` cycle first, - # `close()` may be called from different task - if self._waiting is not None and not self._closed: - self._reader.feed_data(WS_CLOSING_MESSAGE, 0) - await self._waiting - - if not self._closed: - self._cancel_heartbeat() - self._closed = True - try: - await self._writer.close(code, message) - except asyncio.CancelledError: - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - self._response.close() - raise - except Exception as exc: - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - self._exception = exc - self._response.close() - return True - - if self._closing: - self._response.close() - return True - - while True: - try: - async with async_timeout.timeout(self._timeout): - msg = await self._reader.read() - except asyncio.CancelledError: - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - self._response.close() - raise - except Exception as exc: - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - self._exception = exc - self._response.close() - return True - - if msg.type == WSMsgType.CLOSE: - self._close_code = msg.data - self._response.close() - return True - else: - return False - - async def receive(self, timeout: Optional[float] = None) -> WSMessage: - while True: - if self._waiting is not None: - raise RuntimeError("Concurrent call to receive() is not allowed") - - if self._closed: - return WS_CLOSED_MESSAGE - elif self._closing: - await self.close() - return WS_CLOSED_MESSAGE - - try: - self._waiting = self._loop.create_future() - try: - async with async_timeout.timeout(timeout or self._receive_timeout): - msg = await self._reader.read() - self._reset_heartbeat() - finally: - waiter = self._waiting - self._waiting = None - set_result(waiter, True) - except (asyncio.CancelledError, asyncio.TimeoutError): - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - raise - except EofStream: - self._close_code = WSCloseCode.OK - await self.close() - return WSMessage(WSMsgType.CLOSED, None, None) - except ClientError: - self._closed = True - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - return WS_CLOSED_MESSAGE - except WebSocketError as exc: - self._close_code = exc.code - await self.close(code=exc.code) - return WSMessage(WSMsgType.ERROR, exc, None) - except Exception as exc: - self._exception = exc - self._closing = True - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - await self.close() - return WSMessage(WSMsgType.ERROR, exc, None) - - if msg.type == WSMsgType.CLOSE: - self._closing = True - self._close_code = msg.data - if not self._closed and self._autoclose: - await self.close() - elif msg.type == WSMsgType.CLOSING: - self._closing = True - elif msg.type == WSMsgType.PING and self._autoping: - await self.pong(msg.data) - continue - elif msg.type == WSMsgType.PONG and self._autoping: - continue - - return msg - - async def receive_str(self, *, timeout: Optional[float] = None) -> str: - msg = await self.receive(timeout) - if msg.type != WSMsgType.TEXT: - raise TypeError(f"Received message {msg.type}:{msg.data!r} is not str") - return cast(str, msg.data) - - async def receive_bytes(self, *, timeout: Optional[float] = None) -> bytes: - msg = await self.receive(timeout) - if msg.type != WSMsgType.BINARY: - raise TypeError(f"Received message {msg.type}:{msg.data!r} is not bytes") - return cast(bytes, msg.data) - - async def receive_json( - self, - *, - loads: JSONDecoder = DEFAULT_JSON_DECODER, - timeout: Optional[float] = None, - ) -> Any: - data = await self.receive_str(timeout=timeout) - return loads(data) - - def __aiter__(self) -> "ClientWebSocketResponse": - return self - - async def __anext__(self) -> WSMessage: - msg = await self.receive() - if msg.type in (WSMsgType.CLOSE, WSMsgType.CLOSING, WSMsgType.CLOSED): - raise StopAsyncIteration - return msg diff --git a/.venv/Lib/site-packages/aiohttp/connector.py b/.venv/Lib/site-packages/aiohttp/connector.py deleted file mode 100644 index 08dc496..0000000 --- a/.venv/Lib/site-packages/aiohttp/connector.py +++ /dev/null @@ -1,1449 +0,0 @@ -import asyncio -import functools -import random -import sys -import traceback -import warnings -from collections import defaultdict, deque -from contextlib import suppress -from http.cookies import SimpleCookie -from itertools import cycle, islice -from time import monotonic -from types import TracebackType -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - DefaultDict, - Dict, - Iterator, - List, - Optional, - Set, - Tuple, - Type, - Union, - cast, -) - -import attr - -from . import hdrs, helpers -from .abc import AbstractResolver -from .client_exceptions import ( - ClientConnectionError, - ClientConnectorCertificateError, - ClientConnectorError, - ClientConnectorSSLError, - ClientHttpProxyError, - ClientProxyConnectionError, - ServerFingerprintMismatch, - UnixClientConnectorError, - cert_errors, - ssl_errors, -) -from .client_proto import ResponseHandler -from .client_reqrep import ClientRequest, Fingerprint, _merge_ssl_params -from .helpers import ( - PY_36, - ceil_timeout, - get_running_loop, - is_ip_address, - noop, - sentinel, -) -from .http import RESPONSES -from .locks import EventResultOrError -from .resolver import DefaultResolver - -try: - import ssl - - SSLContext = ssl.SSLContext -except ImportError: # pragma: no cover - ssl = None # type: ignore[assignment] - SSLContext = object # type: ignore[misc,assignment] - - -__all__ = ("BaseConnector", "TCPConnector", "UnixConnector", "NamedPipeConnector") - - -if TYPE_CHECKING: # pragma: no cover - from .client import ClientTimeout - from .client_reqrep import ConnectionKey - from .tracing import Trace - - -class _DeprecationWaiter: - __slots__ = ("_awaitable", "_awaited") - - def __init__(self, awaitable: Awaitable[Any]) -> None: - self._awaitable = awaitable - self._awaited = False - - def __await__(self) -> Any: - self._awaited = True - return self._awaitable.__await__() - - def __del__(self) -> None: - if not self._awaited: - warnings.warn( - "Connector.close() is a coroutine, " - "please use await connector.close()", - DeprecationWarning, - ) - - -class Connection: - - _source_traceback = None - _transport = None - - def __init__( - self, - connector: "BaseConnector", - key: "ConnectionKey", - protocol: ResponseHandler, - loop: asyncio.AbstractEventLoop, - ) -> None: - self._key = key - self._connector = connector - self._loop = loop - self._protocol = protocol # type: Optional[ResponseHandler] - self._callbacks = [] # type: List[Callable[[], None]] - - if loop.get_debug(): - self._source_traceback = traceback.extract_stack(sys._getframe(1)) - - def __repr__(self) -> str: - return f"Connection<{self._key}>" - - def __del__(self, _warnings: Any = warnings) -> None: - if self._protocol is not None: - if PY_36: - kwargs = {"source": self} - else: - kwargs = {} - _warnings.warn(f"Unclosed connection {self!r}", ResourceWarning, **kwargs) - if self._loop.is_closed(): - return - - self._connector._release(self._key, self._protocol, should_close=True) - - context = {"client_connection": self, "message": "Unclosed connection"} - if self._source_traceback is not None: - context["source_traceback"] = self._source_traceback - self._loop.call_exception_handler(context) - - @property - def loop(self) -> asyncio.AbstractEventLoop: - warnings.warn( - "connector.loop property is deprecated", DeprecationWarning, stacklevel=2 - ) - return self._loop - - @property - def transport(self) -> Optional[asyncio.Transport]: - if self._protocol is None: - return None - return self._protocol.transport - - @property - def protocol(self) -> Optional[ResponseHandler]: - return self._protocol - - def add_callback(self, callback: Callable[[], None]) -> None: - if callback is not None: - self._callbacks.append(callback) - - def _notify_release(self) -> None: - callbacks, self._callbacks = self._callbacks[:], [] - - for cb in callbacks: - with suppress(Exception): - cb() - - def close(self) -> None: - self._notify_release() - - if self._protocol is not None: - self._connector._release(self._key, self._protocol, should_close=True) - self._protocol = None - - def release(self) -> None: - self._notify_release() - - if self._protocol is not None: - self._connector._release( - self._key, self._protocol, should_close=self._protocol.should_close - ) - self._protocol = None - - @property - def closed(self) -> bool: - return self._protocol is None or not self._protocol.is_connected() - - -class _TransportPlaceholder: - """placeholder for BaseConnector.connect function""" - - def close(self) -> None: - pass - - -class BaseConnector: - """Base connector class. - - keepalive_timeout - (optional) Keep-alive timeout. - force_close - Set to True to force close and do reconnect - after each request (and between redirects). - limit - The total number of simultaneous connections. - limit_per_host - Number of simultaneous connections to one host. - enable_cleanup_closed - Enables clean-up closed ssl transports. - Disabled by default. - loop - Optional event loop. - """ - - _closed = True # prevent AttributeError in __del__ if ctor was failed - _source_traceback = None - - # abort transport after 2 seconds (cleanup broken connections) - _cleanup_closed_period = 2.0 - - def __init__( - self, - *, - keepalive_timeout: Union[object, None, float] = sentinel, - force_close: bool = False, - limit: int = 100, - limit_per_host: int = 0, - enable_cleanup_closed: bool = False, - loop: Optional[asyncio.AbstractEventLoop] = None, - ) -> None: - - if force_close: - if keepalive_timeout is not None and keepalive_timeout is not sentinel: - raise ValueError( - "keepalive_timeout cannot " "be set if force_close is True" - ) - else: - if keepalive_timeout is sentinel: - keepalive_timeout = 15.0 - - loop = get_running_loop(loop) - - self._closed = False - if loop.get_debug(): - self._source_traceback = traceback.extract_stack(sys._getframe(1)) - - self._conns = ( - {} - ) # type: Dict[ConnectionKey, List[Tuple[ResponseHandler, float]]] - self._limit = limit - self._limit_per_host = limit_per_host - self._acquired = set() # type: Set[ResponseHandler] - self._acquired_per_host = defaultdict( - set - ) # type: DefaultDict[ConnectionKey, Set[ResponseHandler]] - self._keepalive_timeout = cast(float, keepalive_timeout) - self._force_close = force_close - - # {host_key: FIFO list of waiters} - self._waiters = defaultdict(deque) # type: ignore[var-annotated] - - self._loop = loop - self._factory = functools.partial(ResponseHandler, loop=loop) - - self.cookies = SimpleCookie() # type: SimpleCookie[str] - - # start keep-alive connection cleanup task - self._cleanup_handle: Optional[asyncio.TimerHandle] = None - - # start cleanup closed transports task - self._cleanup_closed_handle: Optional[asyncio.TimerHandle] = None - self._cleanup_closed_disabled = not enable_cleanup_closed - self._cleanup_closed_transports = [] # type: List[Optional[asyncio.Transport]] - self._cleanup_closed() - - def __del__(self, _warnings: Any = warnings) -> None: - if self._closed: - return - if not self._conns: - return - - conns = [repr(c) for c in self._conns.values()] - - self._close() - - if PY_36: - kwargs = {"source": self} - else: - kwargs = {} - _warnings.warn(f"Unclosed connector {self!r}", ResourceWarning, **kwargs) - context = { - "connector": self, - "connections": conns, - "message": "Unclosed connector", - } - if self._source_traceback is not None: - context["source_traceback"] = self._source_traceback - self._loop.call_exception_handler(context) - - def __enter__(self) -> "BaseConnector": - warnings.warn( - '"witn Connector():" is deprecated, ' - 'use "async with Connector():" instead', - DeprecationWarning, - ) - return self - - def __exit__(self, *exc: Any) -> None: - self.close() - - async def __aenter__(self) -> "BaseConnector": - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]] = None, - exc_value: Optional[BaseException] = None, - exc_traceback: Optional[TracebackType] = None, - ) -> None: - await self.close() - - @property - def force_close(self) -> bool: - """Ultimately close connection on releasing if True.""" - return self._force_close - - @property - def limit(self) -> int: - """The total number for simultaneous connections. - - If limit is 0 the connector has no limit. - The default limit size is 100. - """ - return self._limit - - @property - def limit_per_host(self) -> int: - """The limit for simultaneous connections to the same endpoint. - - Endpoints are the same if they are have equal - (host, port, is_ssl) triple. - """ - return self._limit_per_host - - def _cleanup(self) -> None: - """Cleanup unused transports.""" - if self._cleanup_handle: - self._cleanup_handle.cancel() - # _cleanup_handle should be unset, otherwise _release() will not - # recreate it ever! - self._cleanup_handle = None - - now = self._loop.time() - timeout = self._keepalive_timeout - - if self._conns: - connections = {} - deadline = now - timeout - for key, conns in self._conns.items(): - alive = [] - for proto, use_time in conns: - if proto.is_connected(): - if use_time - deadline < 0: - transport = proto.transport - proto.close() - if key.is_ssl and not self._cleanup_closed_disabled: - self._cleanup_closed_transports.append(transport) - else: - alive.append((proto, use_time)) - else: - transport = proto.transport - proto.close() - if key.is_ssl and not self._cleanup_closed_disabled: - self._cleanup_closed_transports.append(transport) - - if alive: - connections[key] = alive - - self._conns = connections - - if self._conns: - self._cleanup_handle = helpers.weakref_handle( - self, "_cleanup", timeout, self._loop - ) - - def _drop_acquired_per_host( - self, key: "ConnectionKey", val: ResponseHandler - ) -> None: - acquired_per_host = self._acquired_per_host - if key not in acquired_per_host: - return - conns = acquired_per_host[key] - conns.remove(val) - if not conns: - del self._acquired_per_host[key] - - def _cleanup_closed(self) -> None: - """Double confirmation for transport close. - - Some broken ssl servers may leave socket open without proper close. - """ - if self._cleanup_closed_handle: - self._cleanup_closed_handle.cancel() - - for transport in self._cleanup_closed_transports: - if transport is not None: - transport.abort() - - self._cleanup_closed_transports = [] - - if not self._cleanup_closed_disabled: - self._cleanup_closed_handle = helpers.weakref_handle( - self, "_cleanup_closed", self._cleanup_closed_period, self._loop - ) - - def close(self) -> Awaitable[None]: - """Close all opened transports.""" - self._close() - return _DeprecationWaiter(noop()) - - def _close(self) -> None: - if self._closed: - return - - self._closed = True - - try: - if self._loop.is_closed(): - return - - # cancel cleanup task - if self._cleanup_handle: - self._cleanup_handle.cancel() - - # cancel cleanup close task - if self._cleanup_closed_handle: - self._cleanup_closed_handle.cancel() - - for data in self._conns.values(): - for proto, t0 in data: - proto.close() - - for proto in self._acquired: - proto.close() - - for transport in self._cleanup_closed_transports: - if transport is not None: - transport.abort() - - finally: - self._conns.clear() - self._acquired.clear() - self._waiters.clear() - self._cleanup_handle = None - self._cleanup_closed_transports.clear() - self._cleanup_closed_handle = None - - @property - def closed(self) -> bool: - """Is connector closed. - - A readonly property. - """ - return self._closed - - def _available_connections(self, key: "ConnectionKey") -> int: - """ - Return number of available connections. - - The limit, limit_per_host and the connection key are taken into account. - - If it returns less than 1 means that there are no connections - available. - """ - if self._limit: - # total calc available connections - available = self._limit - len(self._acquired) - - # check limit per host - if ( - self._limit_per_host - and available > 0 - and key in self._acquired_per_host - ): - acquired = self._acquired_per_host.get(key) - assert acquired is not None - available = self._limit_per_host - len(acquired) - - elif self._limit_per_host and key in self._acquired_per_host: - # check limit per host - acquired = self._acquired_per_host.get(key) - assert acquired is not None - available = self._limit_per_host - len(acquired) - else: - available = 1 - - return available - - async def connect( - self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" - ) -> Connection: - """Get from pool or create new connection.""" - key = req.connection_key - available = self._available_connections(key) - - # Wait if there are no available connections or if there are/were - # waiters (i.e. don't steal connection from a waiter about to wake up) - if available <= 0 or key in self._waiters: - fut = self._loop.create_future() - - # This connection will now count towards the limit. - self._waiters[key].append(fut) - - if traces: - for trace in traces: - await trace.send_connection_queued_start() - - try: - await fut - except BaseException as e: - if key in self._waiters: - # remove a waiter even if it was cancelled, normally it's - # removed when it's notified - try: - self._waiters[key].remove(fut) - except ValueError: # fut may no longer be in list - pass - - raise e - finally: - if key in self._waiters and not self._waiters[key]: - del self._waiters[key] - - if traces: - for trace in traces: - await trace.send_connection_queued_end() - - proto = self._get(key) - if proto is None: - placeholder = cast(ResponseHandler, _TransportPlaceholder()) - self._acquired.add(placeholder) - self._acquired_per_host[key].add(placeholder) - - if traces: - for trace in traces: - await trace.send_connection_create_start() - - try: - proto = await self._create_connection(req, traces, timeout) - if self._closed: - proto.close() - raise ClientConnectionError("Connector is closed.") - except BaseException: - if not self._closed: - self._acquired.remove(placeholder) - self._drop_acquired_per_host(key, placeholder) - self._release_waiter() - raise - else: - if not self._closed: - self._acquired.remove(placeholder) - self._drop_acquired_per_host(key, placeholder) - - if traces: - for trace in traces: - await trace.send_connection_create_end() - else: - if traces: - # Acquire the connection to prevent race conditions with limits - placeholder = cast(ResponseHandler, _TransportPlaceholder()) - self._acquired.add(placeholder) - self._acquired_per_host[key].add(placeholder) - for trace in traces: - await trace.send_connection_reuseconn() - self._acquired.remove(placeholder) - self._drop_acquired_per_host(key, placeholder) - - self._acquired.add(proto) - self._acquired_per_host[key].add(proto) - return Connection(self, key, proto, self._loop) - - def _get(self, key: "ConnectionKey") -> Optional[ResponseHandler]: - try: - conns = self._conns[key] - except KeyError: - return None - - t1 = self._loop.time() - while conns: - proto, t0 = conns.pop() - if proto.is_connected(): - if t1 - t0 > self._keepalive_timeout: - transport = proto.transport - proto.close() - # only for SSL transports - if key.is_ssl and not self._cleanup_closed_disabled: - self._cleanup_closed_transports.append(transport) - else: - if not conns: - # The very last connection was reclaimed: drop the key - del self._conns[key] - return proto - else: - transport = proto.transport - proto.close() - if key.is_ssl and not self._cleanup_closed_disabled: - self._cleanup_closed_transports.append(transport) - - # No more connections: drop the key - del self._conns[key] - return None - - def _release_waiter(self) -> None: - """ - Iterates over all waiters until one to be released is found. - - The one to be released is not finsihed and - belongs to a host that has available connections. - """ - if not self._waiters: - return - - # Having the dict keys ordered this avoids to iterate - # at the same order at each call. - queues = list(self._waiters.keys()) - random.shuffle(queues) - - for key in queues: - if self._available_connections(key) < 1: - continue - - waiters = self._waiters[key] - while waiters: - waiter = waiters.popleft() - if not waiter.done(): - waiter.set_result(None) - return - - def _release_acquired(self, key: "ConnectionKey", proto: ResponseHandler) -> None: - if self._closed: - # acquired connection is already released on connector closing - return - - try: - self._acquired.remove(proto) - self._drop_acquired_per_host(key, proto) - except KeyError: # pragma: no cover - # this may be result of undetermenistic order of objects - # finalization due garbage collection. - pass - else: - self._release_waiter() - - def _release( - self, - key: "ConnectionKey", - protocol: ResponseHandler, - *, - should_close: bool = False, - ) -> None: - if self._closed: - # acquired connection is already released on connector closing - return - - self._release_acquired(key, protocol) - - if self._force_close: - should_close = True - - if should_close or protocol.should_close: - transport = protocol.transport - protocol.close() - - if key.is_ssl and not self._cleanup_closed_disabled: - self._cleanup_closed_transports.append(transport) - else: - conns = self._conns.get(key) - if conns is None: - conns = self._conns[key] = [] - conns.append((protocol, self._loop.time())) - - if self._cleanup_handle is None: - self._cleanup_handle = helpers.weakref_handle( - self, "_cleanup", self._keepalive_timeout, self._loop - ) - - async def _create_connection( - self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" - ) -> ResponseHandler: - raise NotImplementedError() - - -class _DNSCacheTable: - def __init__(self, ttl: Optional[float] = None) -> None: - self._addrs_rr = ( - {} - ) # type: Dict[Tuple[str, int], Tuple[Iterator[Dict[str, Any]], int]] - self._timestamps = {} # type: Dict[Tuple[str, int], float] - self._ttl = ttl - - def __contains__(self, host: object) -> bool: - return host in self._addrs_rr - - def add(self, key: Tuple[str, int], addrs: List[Dict[str, Any]]) -> None: - self._addrs_rr[key] = (cycle(addrs), len(addrs)) - - if self._ttl: - self._timestamps[key] = monotonic() - - def remove(self, key: Tuple[str, int]) -> None: - self._addrs_rr.pop(key, None) - - if self._ttl: - self._timestamps.pop(key, None) - - def clear(self) -> None: - self._addrs_rr.clear() - self._timestamps.clear() - - def next_addrs(self, key: Tuple[str, int]) -> List[Dict[str, Any]]: - loop, length = self._addrs_rr[key] - addrs = list(islice(loop, length)) - # Consume one more element to shift internal state of `cycle` - next(loop) - return addrs - - def expired(self, key: Tuple[str, int]) -> bool: - if self._ttl is None: - return False - - return self._timestamps[key] + self._ttl < monotonic() - - -class TCPConnector(BaseConnector): - """TCP connector. - - verify_ssl - Set to True to check ssl certifications. - fingerprint - Pass the binary sha256 - digest of the expected certificate in DER format to verify - that the certificate the server presents matches. See also - https://en.wikipedia.org/wiki/Transport_Layer_Security#Certificate_pinning - resolver - Enable DNS lookups and use this - resolver - use_dns_cache - Use memory cache for DNS lookups. - ttl_dns_cache - Max seconds having cached a DNS entry, None forever. - family - socket address family - local_addr - local tuple of (host, port) to bind socket to - - keepalive_timeout - (optional) Keep-alive timeout. - force_close - Set to True to force close and do reconnect - after each request (and between redirects). - limit - The total number of simultaneous connections. - limit_per_host - Number of simultaneous connections to one host. - enable_cleanup_closed - Enables clean-up closed ssl transports. - Disabled by default. - loop - Optional event loop. - """ - - def __init__( - self, - *, - verify_ssl: bool = True, - fingerprint: Optional[bytes] = None, - use_dns_cache: bool = True, - ttl_dns_cache: Optional[int] = 10, - family: int = 0, - ssl_context: Optional[SSLContext] = None, - ssl: Union[None, bool, Fingerprint, SSLContext] = None, - local_addr: Optional[Tuple[str, int]] = None, - resolver: Optional[AbstractResolver] = None, - keepalive_timeout: Union[None, float, object] = sentinel, - force_close: bool = False, - limit: int = 100, - limit_per_host: int = 0, - enable_cleanup_closed: bool = False, - loop: Optional[asyncio.AbstractEventLoop] = None, - ): - super().__init__( - keepalive_timeout=keepalive_timeout, - force_close=force_close, - limit=limit, - limit_per_host=limit_per_host, - enable_cleanup_closed=enable_cleanup_closed, - loop=loop, - ) - - self._ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) - if resolver is None: - resolver = DefaultResolver(loop=self._loop) - self._resolver = resolver - - self._use_dns_cache = use_dns_cache - self._cached_hosts = _DNSCacheTable(ttl=ttl_dns_cache) - self._throttle_dns_events = ( - {} - ) # type: Dict[Tuple[str, int], EventResultOrError] - self._family = family - self._local_addr = local_addr - - def close(self) -> Awaitable[None]: - """Close all ongoing DNS calls.""" - for ev in self._throttle_dns_events.values(): - ev.cancel() - - return super().close() - - @property - def family(self) -> int: - """Socket family like AF_INET.""" - return self._family - - @property - def use_dns_cache(self) -> bool: - """True if local DNS caching is enabled.""" - return self._use_dns_cache - - def clear_dns_cache( - self, host: Optional[str] = None, port: Optional[int] = None - ) -> None: - """Remove specified host/port or clear all dns local cache.""" - if host is not None and port is not None: - self._cached_hosts.remove((host, port)) - elif host is not None or port is not None: - raise ValueError("either both host and port " "or none of them are allowed") - else: - self._cached_hosts.clear() - - async def _resolve_host( - self, host: str, port: int, traces: Optional[List["Trace"]] = None - ) -> List[Dict[str, Any]]: - if is_ip_address(host): - return [ - { - "hostname": host, - "host": host, - "port": port, - "family": self._family, - "proto": 0, - "flags": 0, - } - ] - - if not self._use_dns_cache: - - if traces: - for trace in traces: - await trace.send_dns_resolvehost_start(host) - - res = await self._resolver.resolve(host, port, family=self._family) - - if traces: - for trace in traces: - await trace.send_dns_resolvehost_end(host) - - return res - - key = (host, port) - - if (key in self._cached_hosts) and (not self._cached_hosts.expired(key)): - # get result early, before any await (#4014) - result = self._cached_hosts.next_addrs(key) - - if traces: - for trace in traces: - await trace.send_dns_cache_hit(host) - return result - - if key in self._throttle_dns_events: - # get event early, before any await (#4014) - event = self._throttle_dns_events[key] - if traces: - for trace in traces: - await trace.send_dns_cache_hit(host) - await event.wait() - else: - # update dict early, before any await (#4014) - self._throttle_dns_events[key] = EventResultOrError(self._loop) - if traces: - for trace in traces: - await trace.send_dns_cache_miss(host) - try: - - if traces: - for trace in traces: - await trace.send_dns_resolvehost_start(host) - - addrs = await self._resolver.resolve(host, port, family=self._family) - if traces: - for trace in traces: - await trace.send_dns_resolvehost_end(host) - - self._cached_hosts.add(key, addrs) - self._throttle_dns_events[key].set() - except BaseException as e: - # any DNS exception, independently of the implementation - # is set for the waiters to raise the same exception. - self._throttle_dns_events[key].set(exc=e) - raise - finally: - self._throttle_dns_events.pop(key) - - return self._cached_hosts.next_addrs(key) - - async def _create_connection( - self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" - ) -> ResponseHandler: - """Create connection. - - Has same keyword arguments as BaseEventLoop.create_connection. - """ - if req.proxy: - _, proto = await self._create_proxy_connection(req, traces, timeout) - else: - _, proto = await self._create_direct_connection(req, traces, timeout) - - return proto - - @staticmethod - @functools.lru_cache(None) - def _make_ssl_context(verified: bool) -> SSLContext: - if verified: - return ssl.create_default_context() - else: - sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) - sslcontext.options |= ssl.OP_NO_SSLv2 - sslcontext.options |= ssl.OP_NO_SSLv3 - sslcontext.check_hostname = False - sslcontext.verify_mode = ssl.CERT_NONE - try: - sslcontext.options |= ssl.OP_NO_COMPRESSION - except AttributeError as attr_err: - warnings.warn( - "{!s}: The Python interpreter is compiled " - "against OpenSSL < 1.0.0. Ref: " - "https://docs.python.org/3/library/ssl.html" - "#ssl.OP_NO_COMPRESSION".format(attr_err), - ) - sslcontext.set_default_verify_paths() - return sslcontext - - def _get_ssl_context(self, req: "ClientRequest") -> Optional[SSLContext]: - """Logic to get the correct SSL context - - 0. if req.ssl is false, return None - - 1. if ssl_context is specified in req, use it - 2. if _ssl_context is specified in self, use it - 3. otherwise: - 1. if verify_ssl is not specified in req, use self.ssl_context - (will generate a default context according to self.verify_ssl) - 2. if verify_ssl is True in req, generate a default SSL context - 3. if verify_ssl is False in req, generate a SSL context that - won't verify - """ - if req.is_ssl(): - if ssl is None: # pragma: no cover - raise RuntimeError("SSL is not supported.") - sslcontext = req.ssl - if isinstance(sslcontext, ssl.SSLContext): - return sslcontext - if sslcontext is not None: - # not verified or fingerprinted - return self._make_ssl_context(False) - sslcontext = self._ssl - if isinstance(sslcontext, ssl.SSLContext): - return sslcontext - if sslcontext is not None: - # not verified or fingerprinted - return self._make_ssl_context(False) - return self._make_ssl_context(True) - else: - return None - - def _get_fingerprint(self, req: "ClientRequest") -> Optional["Fingerprint"]: - ret = req.ssl - if isinstance(ret, Fingerprint): - return ret - ret = self._ssl - if isinstance(ret, Fingerprint): - return ret - return None - - async def _wrap_create_connection( - self, - *args: Any, - req: "ClientRequest", - timeout: "ClientTimeout", - client_error: Type[Exception] = ClientConnectorError, - **kwargs: Any, - ) -> Tuple[asyncio.Transport, ResponseHandler]: - try: - async with ceil_timeout(timeout.sock_connect): - return await self._loop.create_connection(*args, **kwargs) # type: ignore[return-value] # noqa - except cert_errors as exc: - raise ClientConnectorCertificateError(req.connection_key, exc) from exc - except ssl_errors as exc: - raise ClientConnectorSSLError(req.connection_key, exc) from exc - except OSError as exc: - raise client_error(req.connection_key, exc) from exc - - def _fail_on_no_start_tls(self, req: "ClientRequest") -> None: - """Raise a :py:exc:`RuntimeError` on missing ``start_tls()``. - - One case is that :py:meth:`asyncio.loop.start_tls` is not yet - implemented under Python 3.6. It is necessary for TLS-in-TLS so - that it is possible to send HTTPS queries through HTTPS proxies. - - This doesn't affect regular HTTP requests, though. - """ - if not req.is_ssl(): - return - - proxy_url = req.proxy - assert proxy_url is not None - if proxy_url.scheme != "https": - return - - self._check_loop_for_start_tls() - - def _check_loop_for_start_tls(self) -> None: - try: - self._loop.start_tls - except AttributeError as attr_exc: - raise RuntimeError( - "An HTTPS request is being sent through an HTTPS proxy. " - "This needs support for TLS in TLS but it is not implemented " - "in your runtime for the stdlib asyncio.\n\n" - "Please upgrade to Python 3.7 or higher. For more details, " - "please see:\n" - "* https://bugs.python.org/issue37179\n" - "* https://github.com/python/cpython/pull/28073\n" - "* https://docs.aiohttp.org/en/stable/" - "client_advanced.html#proxy-support\n" - "* https://github.com/aio-libs/aiohttp/discussions/6044\n", - ) from attr_exc - - def _loop_supports_start_tls(self) -> bool: - try: - self._check_loop_for_start_tls() - except RuntimeError: - return False - else: - return True - - def _warn_about_tls_in_tls( - self, - underlying_transport: asyncio.Transport, - req: "ClientRequest", - ) -> None: - """Issue a warning if the requested URL has HTTPS scheme.""" - if req.request_info.url.scheme != "https": - return - - asyncio_supports_tls_in_tls = getattr( - underlying_transport, - "_start_tls_compatible", - False, - ) - - if asyncio_supports_tls_in_tls: - return - - warnings.warn( - "An HTTPS request is being sent through an HTTPS proxy. " - "This support for TLS in TLS is known to be disabled " - "in the stdlib asyncio. This is why you'll probably see " - "an error in the log below.\n\n" - "It is possible to enable it via monkeypatching under " - "Python 3.7 or higher. For more details, see:\n" - "* https://bugs.python.org/issue37179\n" - "* https://github.com/python/cpython/pull/28073\n\n" - "You can temporarily patch this as follows:\n" - "* https://docs.aiohttp.org/en/stable/client_advanced.html#proxy-support\n" - "* https://github.com/aio-libs/aiohttp/discussions/6044\n", - RuntimeWarning, - source=self, - # Why `4`? At least 3 of the calls in the stack originate - # from the methods in this class. - stacklevel=3, - ) - - async def _start_tls_connection( - self, - underlying_transport: asyncio.Transport, - req: "ClientRequest", - timeout: "ClientTimeout", - client_error: Type[Exception] = ClientConnectorError, - ) -> Tuple[asyncio.BaseTransport, ResponseHandler]: - """Wrap the raw TCP transport with TLS.""" - tls_proto = self._factory() # Create a brand new proto for TLS - - # Safety of the `cast()` call here is based on the fact that - # internally `_get_ssl_context()` only returns `None` when - # `req.is_ssl()` evaluates to `False` which is never gonna happen - # in this code path. Of course, it's rather fragile - # maintainability-wise but this is to be solved separately. - sslcontext = cast(ssl.SSLContext, self._get_ssl_context(req)) - - try: - async with ceil_timeout(timeout.sock_connect): - try: - tls_transport = await self._loop.start_tls( - underlying_transport, - tls_proto, - sslcontext, - server_hostname=req.host, - ssl_handshake_timeout=timeout.total, - ) - except BaseException: - # We need to close the underlying transport since - # `start_tls()` probably failed before it had a - # chance to do this: - underlying_transport.close() - raise - except cert_errors as exc: - raise ClientConnectorCertificateError(req.connection_key, exc) from exc - except ssl_errors as exc: - raise ClientConnectorSSLError(req.connection_key, exc) from exc - except OSError as exc: - raise client_error(req.connection_key, exc) from exc - except TypeError as type_err: - # Example cause looks like this: - # TypeError: transport is not supported by start_tls() - - raise ClientConnectionError( - "Cannot initialize a TLS-in-TLS connection to host " - f"{req.host!s}:{req.port:d} through an underlying connection " - f"to an HTTPS proxy {req.proxy!s} ssl:{req.ssl or 'default'} " - f"[{type_err!s}]" - ) from type_err - else: - tls_proto.connection_made( - tls_transport - ) # Kick the state machine of the new TLS protocol - - return tls_transport, tls_proto - - async def _create_direct_connection( - self, - req: "ClientRequest", - traces: List["Trace"], - timeout: "ClientTimeout", - *, - client_error: Type[Exception] = ClientConnectorError, - ) -> Tuple[asyncio.Transport, ResponseHandler]: - sslcontext = self._get_ssl_context(req) - fingerprint = self._get_fingerprint(req) - - host = req.url.raw_host - assert host is not None - port = req.port - assert port is not None - host_resolved = asyncio.ensure_future( - self._resolve_host(host, port, traces=traces), loop=self._loop - ) - try: - # Cancelling this lookup should not cancel the underlying lookup - # or else the cancel event will get broadcast to all the waiters - # across all connections. - hosts = await asyncio.shield(host_resolved) - except asyncio.CancelledError: - - def drop_exception(fut: "asyncio.Future[List[Dict[str, Any]]]") -> None: - with suppress(Exception, asyncio.CancelledError): - fut.result() - - host_resolved.add_done_callback(drop_exception) - raise - except OSError as exc: - # in case of proxy it is not ClientProxyConnectionError - # it is problem of resolving proxy ip itself - raise ClientConnectorError(req.connection_key, exc) from exc - - last_exc = None # type: Optional[Exception] - - for hinfo in hosts: - host = hinfo["host"] - port = hinfo["port"] - - try: - transp, proto = await self._wrap_create_connection( - self._factory, - host, - port, - timeout=timeout, - ssl=sslcontext, - family=hinfo["family"], - proto=hinfo["proto"], - flags=hinfo["flags"], - server_hostname=hinfo["hostname"] if sslcontext else None, - local_addr=self._local_addr, - req=req, - client_error=client_error, - ) - except ClientConnectorError as exc: - last_exc = exc - continue - - if req.is_ssl() and fingerprint: - try: - fingerprint.check(transp) - except ServerFingerprintMismatch as exc: - transp.close() - if not self._cleanup_closed_disabled: - self._cleanup_closed_transports.append(transp) - last_exc = exc - continue - - return transp, proto - else: - assert last_exc is not None - raise last_exc - - async def _create_proxy_connection( - self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" - ) -> Tuple[asyncio.BaseTransport, ResponseHandler]: - self._fail_on_no_start_tls(req) - runtime_has_start_tls = self._loop_supports_start_tls() - - headers = {} # type: Dict[str, str] - if req.proxy_headers is not None: - headers = req.proxy_headers # type: ignore[assignment] - headers[hdrs.HOST] = req.headers[hdrs.HOST] - - url = req.proxy - assert url is not None - proxy_req = ClientRequest( - hdrs.METH_GET, - url, - headers=headers, - auth=req.proxy_auth, - loop=self._loop, - ssl=req.ssl, - ) - - # create connection to proxy server - transport, proto = await self._create_direct_connection( - proxy_req, [], timeout, client_error=ClientProxyConnectionError - ) - - # Many HTTP proxies has buggy keepalive support. Let's not - # reuse connection but close it after processing every - # response. - proto.force_close() - - auth = proxy_req.headers.pop(hdrs.AUTHORIZATION, None) - if auth is not None: - if not req.is_ssl(): - req.headers[hdrs.PROXY_AUTHORIZATION] = auth - else: - proxy_req.headers[hdrs.PROXY_AUTHORIZATION] = auth - - if req.is_ssl(): - if runtime_has_start_tls: - self._warn_about_tls_in_tls(transport, req) - - # For HTTPS requests over HTTP proxy - # we must notify proxy to tunnel connection - # so we send CONNECT command: - # CONNECT www.python.org:443 HTTP/1.1 - # Host: www.python.org - # - # next we must do TLS handshake and so on - # to do this we must wrap raw socket into secure one - # asyncio handles this perfectly - proxy_req.method = hdrs.METH_CONNECT - proxy_req.url = req.url - key = attr.evolve( - req.connection_key, proxy=None, proxy_auth=None, proxy_headers_hash=None - ) - conn = Connection(self, key, proto, self._loop) - proxy_resp = await proxy_req.send(conn) - try: - protocol = conn._protocol - assert protocol is not None - - # read_until_eof=True will ensure the connection isn't closed - # once the response is received and processed allowing - # START_TLS to work on the connection below. - protocol.set_response_params(read_until_eof=runtime_has_start_tls) - resp = await proxy_resp.start(conn) - except BaseException: - proxy_resp.close() - conn.close() - raise - else: - conn._protocol = None - conn._transport = None - try: - if resp.status != 200: - message = resp.reason - if message is None: - message = RESPONSES[resp.status][0] - raise ClientHttpProxyError( - proxy_resp.request_info, - resp.history, - status=resp.status, - message=message, - headers=resp.headers, - ) - if not runtime_has_start_tls: - rawsock = transport.get_extra_info("socket", default=None) - if rawsock is None: - raise RuntimeError( - "Transport does not expose socket instance" - ) - # Duplicate the socket, so now we can close proxy transport - rawsock = rawsock.dup() - except BaseException: - # It shouldn't be closed in `finally` because it's fed to - # `loop.start_tls()` and the docs say not to touch it after - # passing there. - transport.close() - raise - finally: - if not runtime_has_start_tls: - transport.close() - - if not runtime_has_start_tls: - # HTTP proxy with support for upgrade to HTTPS - sslcontext = self._get_ssl_context(req) - return await self._wrap_create_connection( - self._factory, - timeout=timeout, - ssl=sslcontext, - sock=rawsock, - server_hostname=req.host, - req=req, - ) - - return await self._start_tls_connection( - # Access the old transport for the last time before it's - # closed and forgotten forever: - transport, - req=req, - timeout=timeout, - ) - finally: - proxy_resp.close() - - return transport, proto - - -class UnixConnector(BaseConnector): - """Unix socket connector. - - path - Unix socket path. - keepalive_timeout - (optional) Keep-alive timeout. - force_close - Set to True to force close and do reconnect - after each request (and between redirects). - limit - The total number of simultaneous connections. - limit_per_host - Number of simultaneous connections to one host. - loop - Optional event loop. - """ - - def __init__( - self, - path: str, - force_close: bool = False, - keepalive_timeout: Union[object, float, None] = sentinel, - limit: int = 100, - limit_per_host: int = 0, - loop: Optional[asyncio.AbstractEventLoop] = None, - ) -> None: - super().__init__( - force_close=force_close, - keepalive_timeout=keepalive_timeout, - limit=limit, - limit_per_host=limit_per_host, - loop=loop, - ) - self._path = path - - @property - def path(self) -> str: - """Path to unix socket.""" - return self._path - - async def _create_connection( - self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" - ) -> ResponseHandler: - try: - async with ceil_timeout(timeout.sock_connect): - _, proto = await self._loop.create_unix_connection( - self._factory, self._path - ) - except OSError as exc: - raise UnixClientConnectorError(self.path, req.connection_key, exc) from exc - - return cast(ResponseHandler, proto) - - -class NamedPipeConnector(BaseConnector): - """Named pipe connector. - - Only supported by the proactor event loop. - See also: https://docs.python.org/3.7/library/asyncio-eventloop.html - - path - Windows named pipe path. - keepalive_timeout - (optional) Keep-alive timeout. - force_close - Set to True to force close and do reconnect - after each request (and between redirects). - limit - The total number of simultaneous connections. - limit_per_host - Number of simultaneous connections to one host. - loop - Optional event loop. - """ - - def __init__( - self, - path: str, - force_close: bool = False, - keepalive_timeout: Union[object, float, None] = sentinel, - limit: int = 100, - limit_per_host: int = 0, - loop: Optional[asyncio.AbstractEventLoop] = None, - ) -> None: - super().__init__( - force_close=force_close, - keepalive_timeout=keepalive_timeout, - limit=limit, - limit_per_host=limit_per_host, - loop=loop, - ) - if not isinstance( - self._loop, asyncio.ProactorEventLoop # type: ignore[attr-defined] - ): - raise RuntimeError( - "Named Pipes only available in proactor " "loop under windows" - ) - self._path = path - - @property - def path(self) -> str: - """Path to the named pipe.""" - return self._path - - async def _create_connection( - self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" - ) -> ResponseHandler: - try: - async with ceil_timeout(timeout.sock_connect): - _, proto = await self._loop.create_pipe_connection( # type: ignore[attr-defined] # noqa: E501 - self._factory, self._path - ) - # the drain is required so that the connection_made is called - # and transport is set otherwise it is not set before the - # `assert conn.transport is not None` - # in client.py's _request method - await asyncio.sleep(0) - # other option is to manually set transport like - # `proto.transport = trans` - except OSError as exc: - raise ClientConnectorError(req.connection_key, exc) from exc - - return cast(ResponseHandler, proto) diff --git a/.venv/Lib/site-packages/aiohttp/cookiejar.py b/.venv/Lib/site-packages/aiohttp/cookiejar.py deleted file mode 100644 index 0a26566..0000000 --- a/.venv/Lib/site-packages/aiohttp/cookiejar.py +++ /dev/null @@ -1,413 +0,0 @@ -import asyncio -import contextlib -import datetime -import os # noqa -import pathlib -import pickle -import re -from collections import defaultdict -from http.cookies import BaseCookie, Morsel, SimpleCookie -from typing import ( # noqa - DefaultDict, - Dict, - Iterable, - Iterator, - List, - Mapping, - Optional, - Set, - Tuple, - Union, - cast, -) - -from yarl import URL - -from .abc import AbstractCookieJar, ClearCookiePredicate -from .helpers import is_ip_address, next_whole_second -from .typedefs import LooseCookies, PathLike, StrOrURL - -__all__ = ("CookieJar", "DummyCookieJar") - - -CookieItem = Union[str, "Morsel[str]"] - - -class CookieJar(AbstractCookieJar): - """Implements cookie storage adhering to RFC 6265.""" - - DATE_TOKENS_RE = re.compile( - r"[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]*" - r"(?P[\x00-\x08\x0A-\x1F\d:a-zA-Z\x7F-\xFF]+)" - ) - - DATE_HMS_TIME_RE = re.compile(r"(\d{1,2}):(\d{1,2}):(\d{1,2})") - - DATE_DAY_OF_MONTH_RE = re.compile(r"(\d{1,2})") - - DATE_MONTH_RE = re.compile( - "(jan)|(feb)|(mar)|(apr)|(may)|(jun)|(jul)|" "(aug)|(sep)|(oct)|(nov)|(dec)", - re.I, - ) - - DATE_YEAR_RE = re.compile(r"(\d{2,4})") - - MAX_TIME = datetime.datetime.max.replace(tzinfo=datetime.timezone.utc) - - MAX_32BIT_TIME = datetime.datetime.utcfromtimestamp(2 ** 31 - 1) - - def __init__( - self, - *, - unsafe: bool = False, - quote_cookie: bool = True, - treat_as_secure_origin: Union[StrOrURL, List[StrOrURL], None] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, - ) -> None: - super().__init__(loop=loop) - self._cookies = defaultdict( - SimpleCookie - ) # type: DefaultDict[str, SimpleCookie[str]] - self._host_only_cookies = set() # type: Set[Tuple[str, str]] - self._unsafe = unsafe - self._quote_cookie = quote_cookie - if treat_as_secure_origin is None: - treat_as_secure_origin = [] - elif isinstance(treat_as_secure_origin, URL): - treat_as_secure_origin = [treat_as_secure_origin.origin()] - elif isinstance(treat_as_secure_origin, str): - treat_as_secure_origin = [URL(treat_as_secure_origin).origin()] - else: - treat_as_secure_origin = [ - URL(url).origin() if isinstance(url, str) else url.origin() - for url in treat_as_secure_origin - ] - self._treat_as_secure_origin = treat_as_secure_origin - self._next_expiration = next_whole_second() - self._expirations = {} # type: Dict[Tuple[str, str], datetime.datetime] - # #4515: datetime.max may not be representable on 32-bit platforms - self._max_time = self.MAX_TIME - try: - self._max_time.timestamp() - except OverflowError: - self._max_time = self.MAX_32BIT_TIME - - def save(self, file_path: PathLike) -> None: - file_path = pathlib.Path(file_path) - with file_path.open(mode="wb") as f: - pickle.dump(self._cookies, f, pickle.HIGHEST_PROTOCOL) - - def load(self, file_path: PathLike) -> None: - file_path = pathlib.Path(file_path) - with file_path.open(mode="rb") as f: - self._cookies = pickle.load(f) - - def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: - if predicate is None: - self._next_expiration = next_whole_second() - self._cookies.clear() - self._host_only_cookies.clear() - self._expirations.clear() - return - - to_del = [] - now = datetime.datetime.now(datetime.timezone.utc) - for domain, cookie in self._cookies.items(): - for name, morsel in cookie.items(): - key = (domain, name) - if ( - key in self._expirations and self._expirations[key] <= now - ) or predicate(morsel): - to_del.append(key) - - for domain, name in to_del: - key = (domain, name) - self._host_only_cookies.discard(key) - if key in self._expirations: - del self._expirations[(domain, name)] - self._cookies[domain].pop(name, None) - - next_expiration = min(self._expirations.values(), default=self._max_time) - try: - self._next_expiration = next_expiration.replace( - microsecond=0 - ) + datetime.timedelta(seconds=1) - except OverflowError: - self._next_expiration = self._max_time - - def clear_domain(self, domain: str) -> None: - self.clear(lambda x: self._is_domain_match(domain, x["domain"])) - - def __iter__(self) -> "Iterator[Morsel[str]]": - self._do_expiration() - for val in self._cookies.values(): - yield from val.values() - - def __len__(self) -> int: - return sum(1 for i in self) - - def _do_expiration(self) -> None: - self.clear(lambda x: False) - - def _expire_cookie(self, when: datetime.datetime, domain: str, name: str) -> None: - self._next_expiration = min(self._next_expiration, when) - self._expirations[(domain, name)] = when - - def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: - """Update cookies.""" - hostname = response_url.raw_host - - if not self._unsafe and is_ip_address(hostname): - # Don't accept cookies from IPs - return - - if isinstance(cookies, Mapping): - cookies = cookies.items() - - for name, cookie in cookies: - if not isinstance(cookie, Morsel): - tmp = SimpleCookie() # type: SimpleCookie[str] - tmp[name] = cookie # type: ignore[assignment] - cookie = tmp[name] - - domain = cookie["domain"] - - # ignore domains with trailing dots - if domain.endswith("."): - domain = "" - del cookie["domain"] - - if not domain and hostname is not None: - # Set the cookie's domain to the response hostname - # and set its host-only-flag - self._host_only_cookies.add((hostname, name)) - domain = cookie["domain"] = hostname - - if domain.startswith("."): - # Remove leading dot - domain = domain[1:] - cookie["domain"] = domain - - if hostname and not self._is_domain_match(domain, hostname): - # Setting cookies for different domains is not allowed - continue - - path = cookie["path"] - if not path or not path.startswith("/"): - # Set the cookie's path to the response path - path = response_url.path - if not path.startswith("/"): - path = "/" - else: - # Cut everything from the last slash to the end - path = "/" + path[1 : path.rfind("/")] - cookie["path"] = path - - max_age = cookie["max-age"] - if max_age: - try: - delta_seconds = int(max_age) - try: - max_age_expiration = datetime.datetime.now( - datetime.timezone.utc - ) + datetime.timedelta(seconds=delta_seconds) - except OverflowError: - max_age_expiration = self._max_time - self._expire_cookie(max_age_expiration, domain, name) - except ValueError: - cookie["max-age"] = "" - - else: - expires = cookie["expires"] - if expires: - expire_time = self._parse_date(expires) - if expire_time: - self._expire_cookie(expire_time, domain, name) - else: - cookie["expires"] = "" - - self._cookies[domain][name] = cookie - - self._do_expiration() - - def filter_cookies( - self, request_url: URL = URL() - ) -> Union["BaseCookie[str]", "SimpleCookie[str]"]: - """Returns this jar's cookies filtered by their attributes.""" - self._do_expiration() - request_url = URL(request_url) - filtered: Union["SimpleCookie[str]", "BaseCookie[str]"] = ( - SimpleCookie() if self._quote_cookie else BaseCookie() - ) - hostname = request_url.raw_host or "" - request_origin = URL() - with contextlib.suppress(ValueError): - request_origin = request_url.origin() - - is_not_secure = ( - request_url.scheme not in ("https", "wss") - and request_origin not in self._treat_as_secure_origin - ) - - for cookie in self: - name = cookie.key - domain = cookie["domain"] - - # Send shared cookies - if not domain: - filtered[name] = cookie.value - continue - - if not self._unsafe and is_ip_address(hostname): - continue - - if (domain, name) in self._host_only_cookies: - if domain != hostname: - continue - elif not self._is_domain_match(domain, hostname): - continue - - if not self._is_path_match(request_url.path, cookie["path"]): - continue - - if is_not_secure and cookie["secure"]: - continue - - # It's critical we use the Morsel so the coded_value - # (based on cookie version) is preserved - mrsl_val = cast("Morsel[str]", cookie.get(cookie.key, Morsel())) - mrsl_val.set(cookie.key, cookie.value, cookie.coded_value) - filtered[name] = mrsl_val - - return filtered - - @staticmethod - def _is_domain_match(domain: str, hostname: str) -> bool: - """Implements domain matching adhering to RFC 6265.""" - if hostname == domain: - return True - - if not hostname.endswith(domain): - return False - - non_matching = hostname[: -len(domain)] - - if not non_matching.endswith("."): - return False - - return not is_ip_address(hostname) - - @staticmethod - def _is_path_match(req_path: str, cookie_path: str) -> bool: - """Implements path matching adhering to RFC 6265.""" - if not req_path.startswith("/"): - req_path = "/" - - if req_path == cookie_path: - return True - - if not req_path.startswith(cookie_path): - return False - - if cookie_path.endswith("/"): - return True - - non_matching = req_path[len(cookie_path) :] - - return non_matching.startswith("/") - - @classmethod - def _parse_date(cls, date_str: str) -> Optional[datetime.datetime]: - """Implements date string parsing adhering to RFC 6265.""" - if not date_str: - return None - - found_time = False - found_day = False - found_month = False - found_year = False - - hour = minute = second = 0 - day = 0 - month = 0 - year = 0 - - for token_match in cls.DATE_TOKENS_RE.finditer(date_str): - - token = token_match.group("token") - - if not found_time: - time_match = cls.DATE_HMS_TIME_RE.match(token) - if time_match: - found_time = True - hour, minute, second = (int(s) for s in time_match.groups()) - continue - - if not found_day: - day_match = cls.DATE_DAY_OF_MONTH_RE.match(token) - if day_match: - found_day = True - day = int(day_match.group()) - continue - - if not found_month: - month_match = cls.DATE_MONTH_RE.match(token) - if month_match: - found_month = True - assert month_match.lastindex is not None - month = month_match.lastindex - continue - - if not found_year: - year_match = cls.DATE_YEAR_RE.match(token) - if year_match: - found_year = True - year = int(year_match.group()) - - if 70 <= year <= 99: - year += 1900 - elif 0 <= year <= 69: - year += 2000 - - if False in (found_day, found_month, found_year, found_time): - return None - - if not 1 <= day <= 31: - return None - - if year < 1601 or hour > 23 or minute > 59 or second > 59: - return None - - return datetime.datetime( - year, month, day, hour, minute, second, tzinfo=datetime.timezone.utc - ) - - -class DummyCookieJar(AbstractCookieJar): - """Implements a dummy cookie storage. - - It can be used with the ClientSession when no cookie processing is needed. - - """ - - def __init__(self, *, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: - super().__init__(loop=loop) - - def __iter__(self) -> "Iterator[Morsel[str]]": - while False: - yield None - - def __len__(self) -> int: - return 0 - - def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: - pass - - def clear_domain(self, domain: str) -> None: - pass - - def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: - pass - - def filter_cookies(self, request_url: URL) -> "BaseCookie[str]": - return SimpleCookie() diff --git a/.venv/Lib/site-packages/aiohttp/formdata.py b/.venv/Lib/site-packages/aiohttp/formdata.py deleted file mode 100644 index 4857c89..0000000 --- a/.venv/Lib/site-packages/aiohttp/formdata.py +++ /dev/null @@ -1,172 +0,0 @@ -import io -from typing import Any, Iterable, List, Optional -from urllib.parse import urlencode - -from multidict import MultiDict, MultiDictProxy - -from . import hdrs, multipart, payload -from .helpers import guess_filename -from .payload import Payload - -__all__ = ("FormData",) - - -class FormData: - """Helper class for form body generation. - - Supports multipart/form-data and application/x-www-form-urlencoded. - """ - - def __init__( - self, - fields: Iterable[Any] = (), - quote_fields: bool = True, - charset: Optional[str] = None, - ) -> None: - self._writer = multipart.MultipartWriter("form-data") - self._fields = [] # type: List[Any] - self._is_multipart = False - self._is_processed = False - self._quote_fields = quote_fields - self._charset = charset - - if isinstance(fields, dict): - fields = list(fields.items()) - elif not isinstance(fields, (list, tuple)): - fields = (fields,) - self.add_fields(*fields) - - @property - def is_multipart(self) -> bool: - return self._is_multipart - - def add_field( - self, - name: str, - value: Any, - *, - content_type: Optional[str] = None, - filename: Optional[str] = None, - content_transfer_encoding: Optional[str] = None, - ) -> None: - - if isinstance(value, io.IOBase): - self._is_multipart = True - elif isinstance(value, (bytes, bytearray, memoryview)): - if filename is None and content_transfer_encoding is None: - filename = name - - type_options = MultiDict({"name": name}) # type: MultiDict[str] - if filename is not None and not isinstance(filename, str): - raise TypeError( - "filename must be an instance of str. " "Got: %s" % filename - ) - if filename is None and isinstance(value, io.IOBase): - filename = guess_filename(value, name) - if filename is not None: - type_options["filename"] = filename - self._is_multipart = True - - headers = {} - if content_type is not None: - if not isinstance(content_type, str): - raise TypeError( - "content_type must be an instance of str. " "Got: %s" % content_type - ) - headers[hdrs.CONTENT_TYPE] = content_type - self._is_multipart = True - if content_transfer_encoding is not None: - if not isinstance(content_transfer_encoding, str): - raise TypeError( - "content_transfer_encoding must be an instance" - " of str. Got: %s" % content_transfer_encoding - ) - headers[hdrs.CONTENT_TRANSFER_ENCODING] = content_transfer_encoding - self._is_multipart = True - - self._fields.append((type_options, headers, value)) - - def add_fields(self, *fields: Any) -> None: - to_add = list(fields) - - while to_add: - rec = to_add.pop(0) - - if isinstance(rec, io.IOBase): - k = guess_filename(rec, "unknown") - self.add_field(k, rec) # type: ignore[arg-type] - - elif isinstance(rec, (MultiDictProxy, MultiDict)): - to_add.extend(rec.items()) - - elif isinstance(rec, (list, tuple)) and len(rec) == 2: - k, fp = rec - self.add_field(k, fp) # type: ignore[arg-type] - - else: - raise TypeError( - "Only io.IOBase, multidict and (name, file) " - "pairs allowed, use .add_field() for passing " - "more complex parameters, got {!r}".format(rec) - ) - - def _gen_form_urlencoded(self) -> payload.BytesPayload: - # form data (x-www-form-urlencoded) - data = [] - for type_options, _, value in self._fields: - data.append((type_options["name"], value)) - - charset = self._charset if self._charset is not None else "utf-8" - - if charset == "utf-8": - content_type = "application/x-www-form-urlencoded" - else: - content_type = "application/x-www-form-urlencoded; " "charset=%s" % charset - - return payload.BytesPayload( - urlencode(data, doseq=True, encoding=charset).encode(), - content_type=content_type, - ) - - def _gen_form_data(self) -> multipart.MultipartWriter: - """Encode a list of fields using the multipart/form-data MIME format""" - if self._is_processed: - raise RuntimeError("Form data has been processed already") - for dispparams, headers, value in self._fields: - try: - if hdrs.CONTENT_TYPE in headers: - part = payload.get_payload( - value, - content_type=headers[hdrs.CONTENT_TYPE], - headers=headers, - encoding=self._charset, - ) - else: - part = payload.get_payload( - value, headers=headers, encoding=self._charset - ) - except Exception as exc: - raise TypeError( - "Can not serialize value type: %r\n " - "headers: %r\n value: %r" % (type(value), headers, value) - ) from exc - - if dispparams: - part.set_content_disposition( - "form-data", quote_fields=self._quote_fields, **dispparams - ) - # FIXME cgi.FieldStorage doesn't likes body parts with - # Content-Length which were sent via chunked transfer encoding - assert part.headers is not None - part.headers.popall(hdrs.CONTENT_LENGTH, None) - - self._writer.append_payload(part) - - self._is_processed = True - return self._writer - - def __call__(self) -> Payload: - if self._is_multipart: - return self._gen_form_data() - else: - return self._gen_form_urlencoded() diff --git a/.venv/Lib/site-packages/aiohttp/hdrs.py b/.venv/Lib/site-packages/aiohttp/hdrs.py deleted file mode 100644 index a619f25..0000000 --- a/.venv/Lib/site-packages/aiohttp/hdrs.py +++ /dev/null @@ -1,114 +0,0 @@ -"""HTTP Headers constants.""" - -# After changing the file content call ./tools/gen.py -# to regenerate the headers parser -import sys -from typing import Set - -from multidict import istr - -if sys.version_info >= (3, 8): - from typing import Final -else: - from typing_extensions import Final - -METH_ANY: Final[str] = "*" -METH_CONNECT: Final[str] = "CONNECT" -METH_HEAD: Final[str] = "HEAD" -METH_GET: Final[str] = "GET" -METH_DELETE: Final[str] = "DELETE" -METH_OPTIONS: Final[str] = "OPTIONS" -METH_PATCH: Final[str] = "PATCH" -METH_POST: Final[str] = "POST" -METH_PUT: Final[str] = "PUT" -METH_TRACE: Final[str] = "TRACE" - -METH_ALL: Final[Set[str]] = { - METH_CONNECT, - METH_HEAD, - METH_GET, - METH_DELETE, - METH_OPTIONS, - METH_PATCH, - METH_POST, - METH_PUT, - METH_TRACE, -} - -ACCEPT: Final[istr] = istr("Accept") -ACCEPT_CHARSET: Final[istr] = istr("Accept-Charset") -ACCEPT_ENCODING: Final[istr] = istr("Accept-Encoding") -ACCEPT_LANGUAGE: Final[istr] = istr("Accept-Language") -ACCEPT_RANGES: Final[istr] = istr("Accept-Ranges") -ACCESS_CONTROL_MAX_AGE: Final[istr] = istr("Access-Control-Max-Age") -ACCESS_CONTROL_ALLOW_CREDENTIALS: Final[istr] = istr("Access-Control-Allow-Credentials") -ACCESS_CONTROL_ALLOW_HEADERS: Final[istr] = istr("Access-Control-Allow-Headers") -ACCESS_CONTROL_ALLOW_METHODS: Final[istr] = istr("Access-Control-Allow-Methods") -ACCESS_CONTROL_ALLOW_ORIGIN: Final[istr] = istr("Access-Control-Allow-Origin") -ACCESS_CONTROL_EXPOSE_HEADERS: Final[istr] = istr("Access-Control-Expose-Headers") -ACCESS_CONTROL_REQUEST_HEADERS: Final[istr] = istr("Access-Control-Request-Headers") -ACCESS_CONTROL_REQUEST_METHOD: Final[istr] = istr("Access-Control-Request-Method") -AGE: Final[istr] = istr("Age") -ALLOW: Final[istr] = istr("Allow") -AUTHORIZATION: Final[istr] = istr("Authorization") -CACHE_CONTROL: Final[istr] = istr("Cache-Control") -CONNECTION: Final[istr] = istr("Connection") -CONTENT_DISPOSITION: Final[istr] = istr("Content-Disposition") -CONTENT_ENCODING: Final[istr] = istr("Content-Encoding") -CONTENT_LANGUAGE: Final[istr] = istr("Content-Language") -CONTENT_LENGTH: Final[istr] = istr("Content-Length") -CONTENT_LOCATION: Final[istr] = istr("Content-Location") -CONTENT_MD5: Final[istr] = istr("Content-MD5") -CONTENT_RANGE: Final[istr] = istr("Content-Range") -CONTENT_TRANSFER_ENCODING: Final[istr] = istr("Content-Transfer-Encoding") -CONTENT_TYPE: Final[istr] = istr("Content-Type") -COOKIE: Final[istr] = istr("Cookie") -DATE: Final[istr] = istr("Date") -DESTINATION: Final[istr] = istr("Destination") -DIGEST: Final[istr] = istr("Digest") -ETAG: Final[istr] = istr("Etag") -EXPECT: Final[istr] = istr("Expect") -EXPIRES: Final[istr] = istr("Expires") -FORWARDED: Final[istr] = istr("Forwarded") -FROM: Final[istr] = istr("From") -HOST: Final[istr] = istr("Host") -IF_MATCH: Final[istr] = istr("If-Match") -IF_MODIFIED_SINCE: Final[istr] = istr("If-Modified-Since") -IF_NONE_MATCH: Final[istr] = istr("If-None-Match") -IF_RANGE: Final[istr] = istr("If-Range") -IF_UNMODIFIED_SINCE: Final[istr] = istr("If-Unmodified-Since") -KEEP_ALIVE: Final[istr] = istr("Keep-Alive") -LAST_EVENT_ID: Final[istr] = istr("Last-Event-ID") -LAST_MODIFIED: Final[istr] = istr("Last-Modified") -LINK: Final[istr] = istr("Link") -LOCATION: Final[istr] = istr("Location") -MAX_FORWARDS: Final[istr] = istr("Max-Forwards") -ORIGIN: Final[istr] = istr("Origin") -PRAGMA: Final[istr] = istr("Pragma") -PROXY_AUTHENTICATE: Final[istr] = istr("Proxy-Authenticate") -PROXY_AUTHORIZATION: Final[istr] = istr("Proxy-Authorization") -RANGE: Final[istr] = istr("Range") -REFERER: Final[istr] = istr("Referer") -RETRY_AFTER: Final[istr] = istr("Retry-After") -SEC_WEBSOCKET_ACCEPT: Final[istr] = istr("Sec-WebSocket-Accept") -SEC_WEBSOCKET_VERSION: Final[istr] = istr("Sec-WebSocket-Version") -SEC_WEBSOCKET_PROTOCOL: Final[istr] = istr("Sec-WebSocket-Protocol") -SEC_WEBSOCKET_EXTENSIONS: Final[istr] = istr("Sec-WebSocket-Extensions") -SEC_WEBSOCKET_KEY: Final[istr] = istr("Sec-WebSocket-Key") -SEC_WEBSOCKET_KEY1: Final[istr] = istr("Sec-WebSocket-Key1") -SERVER: Final[istr] = istr("Server") -SET_COOKIE: Final[istr] = istr("Set-Cookie") -TE: Final[istr] = istr("TE") -TRAILER: Final[istr] = istr("Trailer") -TRANSFER_ENCODING: Final[istr] = istr("Transfer-Encoding") -UPGRADE: Final[istr] = istr("Upgrade") -URI: Final[istr] = istr("URI") -USER_AGENT: Final[istr] = istr("User-Agent") -VARY: Final[istr] = istr("Vary") -VIA: Final[istr] = istr("Via") -WANT_DIGEST: Final[istr] = istr("Want-Digest") -WARNING: Final[istr] = istr("Warning") -WWW_AUTHENTICATE: Final[istr] = istr("WWW-Authenticate") -X_FORWARDED_FOR: Final[istr] = istr("X-Forwarded-For") -X_FORWARDED_HOST: Final[istr] = istr("X-Forwarded-Host") -X_FORWARDED_PROTO: Final[istr] = istr("X-Forwarded-Proto") diff --git a/.venv/Lib/site-packages/aiohttp/helpers.py b/.venv/Lib/site-packages/aiohttp/helpers.py deleted file mode 100644 index 536d219..0000000 --- a/.venv/Lib/site-packages/aiohttp/helpers.py +++ /dev/null @@ -1,875 +0,0 @@ -"""Various helper functions""" - -import asyncio -import base64 -import binascii -import cgi -import datetime -import functools -import inspect -import netrc -import os -import platform -import re -import sys -import time -import warnings -import weakref -from collections import namedtuple -from contextlib import suppress -from email.utils import parsedate -from math import ceil -from pathlib import Path -from types import TracebackType -from typing import ( - Any, - Callable, - ContextManager, - Dict, - Generator, - Generic, - Iterable, - Iterator, - List, - Mapping, - Optional, - Pattern, - Set, - Tuple, - Type, - TypeVar, - Union, - cast, -) -from urllib.parse import quote -from urllib.request import getproxies, proxy_bypass - -import async_timeout -import attr -from multidict import MultiDict, MultiDictProxy -from yarl import URL - -from . import hdrs -from .log import client_logger, internal_logger -from .typedefs import PathLike, Protocol # noqa - -__all__ = ("BasicAuth", "ChainMapProxy", "ETag") - -IS_MACOS = platform.system() == "Darwin" -IS_WINDOWS = platform.system() == "Windows" - -PY_36 = sys.version_info >= (3, 6) -PY_37 = sys.version_info >= (3, 7) -PY_38 = sys.version_info >= (3, 8) -PY_310 = sys.version_info >= (3, 10) - -if sys.version_info < (3, 7): - import idna_ssl - - idna_ssl.patch_match_hostname() - - def all_tasks( - loop: Optional[asyncio.AbstractEventLoop] = None, - ) -> Set["asyncio.Task[Any]"]: - tasks = list(asyncio.Task.all_tasks(loop)) - return {t for t in tasks if not t.done()} - - -else: - all_tasks = asyncio.all_tasks - - -_T = TypeVar("_T") -_S = TypeVar("_S") - - -sentinel = object() # type: Any -NO_EXTENSIONS = bool(os.environ.get("AIOHTTP_NO_EXTENSIONS")) # type: bool - -# N.B. sys.flags.dev_mode is available on Python 3.7+, use getattr -# for compatibility with older versions -DEBUG = getattr(sys.flags, "dev_mode", False) or ( - not sys.flags.ignore_environment and bool(os.environ.get("PYTHONASYNCIODEBUG")) -) # type: bool - - -CHAR = {chr(i) for i in range(0, 128)} -CTL = {chr(i) for i in range(0, 32)} | { - chr(127), -} -SEPARATORS = { - "(", - ")", - "<", - ">", - "@", - ",", - ";", - ":", - "\\", - '"', - "/", - "[", - "]", - "?", - "=", - "{", - "}", - " ", - chr(9), -} -TOKEN = CHAR ^ CTL ^ SEPARATORS - - -class noop: - def __await__(self) -> Generator[None, None, None]: - yield - - -class BasicAuth(namedtuple("BasicAuth", ["login", "password", "encoding"])): - """Http basic authentication helper.""" - - def __new__( - cls, login: str, password: str = "", encoding: str = "latin1" - ) -> "BasicAuth": - if login is None: - raise ValueError("None is not allowed as login value") - - if password is None: - raise ValueError("None is not allowed as password value") - - if ":" in login: - raise ValueError('A ":" is not allowed in login (RFC 1945#section-11.1)') - - return super().__new__(cls, login, password, encoding) - - @classmethod - def decode(cls, auth_header: str, encoding: str = "latin1") -> "BasicAuth": - """Create a BasicAuth object from an Authorization HTTP header.""" - try: - auth_type, encoded_credentials = auth_header.split(" ", 1) - except ValueError: - raise ValueError("Could not parse authorization header.") - - if auth_type.lower() != "basic": - raise ValueError("Unknown authorization method %s" % auth_type) - - try: - decoded = base64.b64decode( - encoded_credentials.encode("ascii"), validate=True - ).decode(encoding) - except binascii.Error: - raise ValueError("Invalid base64 encoding.") - - try: - # RFC 2617 HTTP Authentication - # https://www.ietf.org/rfc/rfc2617.txt - # the colon must be present, but the username and password may be - # otherwise blank. - username, password = decoded.split(":", 1) - except ValueError: - raise ValueError("Invalid credentials.") - - return cls(username, password, encoding=encoding) - - @classmethod - def from_url(cls, url: URL, *, encoding: str = "latin1") -> Optional["BasicAuth"]: - """Create BasicAuth from url.""" - if not isinstance(url, URL): - raise TypeError("url should be yarl.URL instance") - if url.user is None: - return None - return cls(url.user, url.password or "", encoding=encoding) - - def encode(self) -> str: - """Encode credentials.""" - creds = (f"{self.login}:{self.password}").encode(self.encoding) - return "Basic %s" % base64.b64encode(creds).decode(self.encoding) - - -def strip_auth_from_url(url: URL) -> Tuple[URL, Optional[BasicAuth]]: - auth = BasicAuth.from_url(url) - if auth is None: - return url, None - else: - return url.with_user(None), auth - - -def netrc_from_env() -> Optional[netrc.netrc]: - """Load netrc from file. - - Attempt to load it from the path specified by the env-var - NETRC or in the default location in the user's home directory. - - Returns None if it couldn't be found or fails to parse. - """ - netrc_env = os.environ.get("NETRC") - - if netrc_env is not None: - netrc_path = Path(netrc_env) - else: - try: - home_dir = Path.home() - except RuntimeError as e: # pragma: no cover - # if pathlib can't resolve home, it may raise a RuntimeError - client_logger.debug( - "Could not resolve home directory when " - "trying to look for .netrc file: %s", - e, - ) - return None - - netrc_path = home_dir / ("_netrc" if IS_WINDOWS else ".netrc") - - try: - return netrc.netrc(str(netrc_path)) - except netrc.NetrcParseError as e: - client_logger.warning("Could not parse .netrc file: %s", e) - except OSError as e: - # we couldn't read the file (doesn't exist, permissions, etc.) - if netrc_env or netrc_path.is_file(): - # only warn if the environment wanted us to load it, - # or it appears like the default file does actually exist - client_logger.warning("Could not read .netrc file: %s", e) - - return None - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class ProxyInfo: - proxy: URL - proxy_auth: Optional[BasicAuth] - - -def proxies_from_env() -> Dict[str, ProxyInfo]: - proxy_urls = { - k: URL(v) - for k, v in getproxies().items() - if k in ("http", "https", "ws", "wss") - } - netrc_obj = netrc_from_env() - stripped = {k: strip_auth_from_url(v) for k, v in proxy_urls.items()} - ret = {} - for proto, val in stripped.items(): - proxy, auth = val - if proxy.scheme in ("https", "wss"): - client_logger.warning( - "%s proxies %s are not supported, ignoring", proxy.scheme.upper(), proxy - ) - continue - if netrc_obj and auth is None: - auth_from_netrc = None - if proxy.host is not None: - auth_from_netrc = netrc_obj.authenticators(proxy.host) - if auth_from_netrc is not None: - # auth_from_netrc is a (`user`, `account`, `password`) tuple, - # `user` and `account` both can be username, - # if `user` is None, use `account` - *logins, password = auth_from_netrc - login = logins[0] if logins[0] else logins[-1] - auth = BasicAuth(cast(str, login), cast(str, password)) - ret[proto] = ProxyInfo(proxy, auth) - return ret - - -def current_task( - loop: Optional[asyncio.AbstractEventLoop] = None, -) -> "Optional[asyncio.Task[Any]]": - if sys.version_info >= (3, 7): - return asyncio.current_task(loop=loop) - else: - return asyncio.Task.current_task(loop=loop) - - -def get_running_loop( - loop: Optional[asyncio.AbstractEventLoop] = None, -) -> asyncio.AbstractEventLoop: - if loop is None: - loop = asyncio.get_event_loop() - if not loop.is_running(): - warnings.warn( - "The object should be created within an async function", - DeprecationWarning, - stacklevel=3, - ) - if loop.get_debug(): - internal_logger.warning( - "The object should be created within an async function", stack_info=True - ) - return loop - - -def isasyncgenfunction(obj: Any) -> bool: - func = getattr(inspect, "isasyncgenfunction", None) - if func is not None: - return func(obj) # type: ignore[no-any-return] - else: - return False - - -def get_env_proxy_for_url(url: URL) -> Tuple[URL, Optional[BasicAuth]]: - """Get a permitted proxy for the given URL from the env.""" - if url.host is not None and proxy_bypass(url.host): - raise LookupError(f"Proxying is disallowed for `{url.host!r}`") - - proxies_in_env = proxies_from_env() - try: - proxy_info = proxies_in_env[url.scheme] - except KeyError: - raise LookupError(f"No proxies found for `{url!s}` in the env") - else: - return proxy_info.proxy, proxy_info.proxy_auth - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class MimeType: - type: str - subtype: str - suffix: str - parameters: "MultiDictProxy[str]" - - -@functools.lru_cache(maxsize=56) -def parse_mimetype(mimetype: str) -> MimeType: - """Parses a MIME type into its components. - - mimetype is a MIME type string. - - Returns a MimeType object. - - Example: - - >>> parse_mimetype('text/html; charset=utf-8') - MimeType(type='text', subtype='html', suffix='', - parameters={'charset': 'utf-8'}) - - """ - if not mimetype: - return MimeType( - type="", subtype="", suffix="", parameters=MultiDictProxy(MultiDict()) - ) - - parts = mimetype.split(";") - params = MultiDict() # type: MultiDict[str] - for item in parts[1:]: - if not item: - continue - key, value = cast( - Tuple[str, str], item.split("=", 1) if "=" in item else (item, "") - ) - params.add(key.lower().strip(), value.strip(' "')) - - fulltype = parts[0].strip().lower() - if fulltype == "*": - fulltype = "*/*" - - mtype, stype = ( - cast(Tuple[str, str], fulltype.split("/", 1)) - if "/" in fulltype - else (fulltype, "") - ) - stype, suffix = ( - cast(Tuple[str, str], stype.split("+", 1)) if "+" in stype else (stype, "") - ) - - return MimeType( - type=mtype, subtype=stype, suffix=suffix, parameters=MultiDictProxy(params) - ) - - -def guess_filename(obj: Any, default: Optional[str] = None) -> Optional[str]: - name = getattr(obj, "name", None) - if name and isinstance(name, str) and name[0] != "<" and name[-1] != ">": - return Path(name).name - return default - - -not_qtext_re = re.compile(r"[^\041\043-\133\135-\176]") -QCONTENT = {chr(i) for i in range(0x20, 0x7F)} | {"\t"} - - -def quoted_string(content: str) -> str: - """Return 7-bit content as quoted-string. - - Format content into a quoted-string as defined in RFC5322 for - Internet Message Format. Notice that this is not the 8-bit HTTP - format, but the 7-bit email format. Content must be in usascii or - a ValueError is raised. - """ - if not (QCONTENT > set(content)): - raise ValueError(f"bad content for quoted-string {content!r}") - return not_qtext_re.sub(lambda x: "\\" + x.group(0), content) - - -def content_disposition_header( - disptype: str, quote_fields: bool = True, _charset: str = "utf-8", **params: str -) -> str: - """Sets ``Content-Disposition`` header for MIME. - - This is the MIME payload Content-Disposition header from RFC 2183 - and RFC 7579 section 4.2, not the HTTP Content-Disposition from - RFC 6266. - - disptype is a disposition type: inline, attachment, form-data. - Should be valid extension token (see RFC 2183) - - quote_fields performs value quoting to 7-bit MIME headers - according to RFC 7578. Set to quote_fields to False if recipient - can take 8-bit file names and field values. - - _charset specifies the charset to use when quote_fields is True. - - params is a dict with disposition params. - """ - if not disptype or not (TOKEN > set(disptype)): - raise ValueError("bad content disposition type {!r}" "".format(disptype)) - - value = disptype - if params: - lparams = [] - for key, val in params.items(): - if not key or not (TOKEN > set(key)): - raise ValueError( - "bad content disposition parameter" " {!r}={!r}".format(key, val) - ) - if quote_fields: - if key.lower() == "filename": - qval = quote(val, "", encoding=_charset) - lparams.append((key, '"%s"' % qval)) - else: - try: - qval = quoted_string(val) - except ValueError: - qval = "".join( - (_charset, "''", quote(val, "", encoding=_charset)) - ) - lparams.append((key + "*", qval)) - else: - lparams.append((key, '"%s"' % qval)) - else: - qval = val.replace("\\", "\\\\").replace('"', '\\"') - lparams.append((key, '"%s"' % qval)) - sparams = "; ".join("=".join(pair) for pair in lparams) - value = "; ".join((value, sparams)) - return value - - -class _TSelf(Protocol, Generic[_T]): - _cache: Dict[str, _T] - - -class reify(Generic[_T]): - """Use as a class method decorator. - - It operates almost exactly like - the Python `@property` decorator, but it puts the result of the - method it decorates into the instance dict after the first call, - effectively replacing the function it decorates with an instance - variable. It is, in Python parlance, a data descriptor. - """ - - def __init__(self, wrapped: Callable[..., _T]) -> None: - self.wrapped = wrapped - self.__doc__ = wrapped.__doc__ - self.name = wrapped.__name__ - - def __get__(self, inst: _TSelf[_T], owner: Optional[Type[Any]] = None) -> _T: - try: - try: - return inst._cache[self.name] - except KeyError: - val = self.wrapped(inst) - inst._cache[self.name] = val - return val - except AttributeError: - if inst is None: - return self - raise - - def __set__(self, inst: _TSelf[_T], value: _T) -> None: - raise AttributeError("reified property is read-only") - - -reify_py = reify - -try: - from ._helpers import reify as reify_c - - if not NO_EXTENSIONS: - reify = reify_c # type: ignore[misc,assignment] -except ImportError: - pass - -_ipv4_pattern = ( - r"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}" - r"(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" -) -_ipv6_pattern = ( - r"^(?:(?:(?:[A-F0-9]{1,4}:){6}|(?=(?:[A-F0-9]{0,4}:){0,6}" - r"(?:[0-9]{1,3}\.){3}[0-9]{1,3}$)(([0-9A-F]{1,4}:){0,5}|:)" - r"((:[0-9A-F]{1,4}){1,5}:|:)|::(?:[A-F0-9]{1,4}:){5})" - r"(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}" - r"(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])|(?:[A-F0-9]{1,4}:){7}" - r"[A-F0-9]{1,4}|(?=(?:[A-F0-9]{0,4}:){0,7}[A-F0-9]{0,4}$)" - r"(([0-9A-F]{1,4}:){1,7}|:)((:[0-9A-F]{1,4}){1,7}|:)|(?:[A-F0-9]{1,4}:){7}" - r":|:(:[A-F0-9]{1,4}){7})$" -) -_ipv4_regex = re.compile(_ipv4_pattern) -_ipv6_regex = re.compile(_ipv6_pattern, flags=re.IGNORECASE) -_ipv4_regexb = re.compile(_ipv4_pattern.encode("ascii")) -_ipv6_regexb = re.compile(_ipv6_pattern.encode("ascii"), flags=re.IGNORECASE) - - -def _is_ip_address( - regex: Pattern[str], regexb: Pattern[bytes], host: Optional[Union[str, bytes]] -) -> bool: - if host is None: - return False - if isinstance(host, str): - return bool(regex.match(host)) - elif isinstance(host, (bytes, bytearray, memoryview)): - return bool(regexb.match(host)) - else: - raise TypeError(f"{host} [{type(host)}] is not a str or bytes") - - -is_ipv4_address = functools.partial(_is_ip_address, _ipv4_regex, _ipv4_regexb) -is_ipv6_address = functools.partial(_is_ip_address, _ipv6_regex, _ipv6_regexb) - - -def is_ip_address(host: Optional[Union[str, bytes, bytearray, memoryview]]) -> bool: - return is_ipv4_address(host) or is_ipv6_address(host) - - -def next_whole_second() -> datetime.datetime: - """Return current time rounded up to the next whole second.""" - return datetime.datetime.now(datetime.timezone.utc).replace( - microsecond=0 - ) + datetime.timedelta(seconds=0) - - -_cached_current_datetime = None # type: Optional[int] -_cached_formatted_datetime = "" - - -def rfc822_formatted_time() -> str: - global _cached_current_datetime - global _cached_formatted_datetime - - now = int(time.time()) - if now != _cached_current_datetime: - # Weekday and month names for HTTP date/time formatting; - # always English! - # Tuples are constants stored in codeobject! - _weekdayname = ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") - _monthname = ( - "", # Dummy so we can use 1-based month numbers - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - ) - - year, month, day, hh, mm, ss, wd, *tail = time.gmtime(now) - _cached_formatted_datetime = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % ( - _weekdayname[wd], - day, - _monthname[month], - year, - hh, - mm, - ss, - ) - _cached_current_datetime = now - return _cached_formatted_datetime - - -def _weakref_handle(info: "Tuple[weakref.ref[object], str]") -> None: - ref, name = info - ob = ref() - if ob is not None: - with suppress(Exception): - getattr(ob, name)() - - -def weakref_handle( - ob: object, name: str, timeout: float, loop: asyncio.AbstractEventLoop -) -> Optional[asyncio.TimerHandle]: - if timeout is not None and timeout > 0: - when = loop.time() + timeout - if timeout >= 5: - when = ceil(when) - - return loop.call_at(when, _weakref_handle, (weakref.ref(ob), name)) - return None - - -def call_later( - cb: Callable[[], Any], timeout: float, loop: asyncio.AbstractEventLoop -) -> Optional[asyncio.TimerHandle]: - if timeout is not None and timeout > 0: - when = loop.time() + timeout - if timeout > 5: - when = ceil(when) - return loop.call_at(when, cb) - return None - - -class TimeoutHandle: - """Timeout handle""" - - def __init__( - self, loop: asyncio.AbstractEventLoop, timeout: Optional[float] - ) -> None: - self._timeout = timeout - self._loop = loop - self._callbacks = ( - [] - ) # type: List[Tuple[Callable[..., None], Tuple[Any, ...], Dict[str, Any]]] - - def register( - self, callback: Callable[..., None], *args: Any, **kwargs: Any - ) -> None: - self._callbacks.append((callback, args, kwargs)) - - def close(self) -> None: - self._callbacks.clear() - - def start(self) -> Optional[asyncio.Handle]: - timeout = self._timeout - if timeout is not None and timeout > 0: - when = self._loop.time() + timeout - if timeout >= 5: - when = ceil(when) - return self._loop.call_at(when, self.__call__) - else: - return None - - def timer(self) -> "BaseTimerContext": - if self._timeout is not None and self._timeout > 0: - timer = TimerContext(self._loop) - self.register(timer.timeout) - return timer - else: - return TimerNoop() - - def __call__(self) -> None: - for cb, args, kwargs in self._callbacks: - with suppress(Exception): - cb(*args, **kwargs) - - self._callbacks.clear() - - -class BaseTimerContext(ContextManager["BaseTimerContext"]): - pass - - -class TimerNoop(BaseTimerContext): - def __enter__(self) -> BaseTimerContext: - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - return - - -class TimerContext(BaseTimerContext): - """Low resolution timeout context manager""" - - def __init__(self, loop: asyncio.AbstractEventLoop) -> None: - self._loop = loop - self._tasks = [] # type: List[asyncio.Task[Any]] - self._cancelled = False - - def __enter__(self) -> BaseTimerContext: - task = current_task(loop=self._loop) - - if task is None: - raise RuntimeError( - "Timeout context manager should be used " "inside a task" - ) - - if self._cancelled: - raise asyncio.TimeoutError from None - - self._tasks.append(task) - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> Optional[bool]: - if self._tasks: - self._tasks.pop() - - if exc_type is asyncio.CancelledError and self._cancelled: - raise asyncio.TimeoutError from None - return None - - def timeout(self) -> None: - if not self._cancelled: - for task in set(self._tasks): - task.cancel() - - self._cancelled = True - - -def ceil_timeout(delay: Optional[float]) -> async_timeout.Timeout: - if delay is None or delay <= 0: - return async_timeout.timeout(None) - - loop = get_running_loop() - now = loop.time() - when = now + delay - if delay > 5: - when = ceil(when) - return async_timeout.timeout_at(when) - - -class HeadersMixin: - - ATTRS = frozenset(["_content_type", "_content_dict", "_stored_content_type"]) - - _content_type = None # type: Optional[str] - _content_dict = None # type: Optional[Dict[str, str]] - _stored_content_type = sentinel - - def _parse_content_type(self, raw: str) -> None: - self._stored_content_type = raw - if raw is None: - # default value according to RFC 2616 - self._content_type = "application/octet-stream" - self._content_dict = {} - else: - self._content_type, self._content_dict = cgi.parse_header(raw) - - @property - def content_type(self) -> str: - """The value of content part for Content-Type HTTP header.""" - raw = self._headers.get(hdrs.CONTENT_TYPE) # type: ignore[attr-defined] - if self._stored_content_type != raw: - self._parse_content_type(raw) - return self._content_type # type: ignore[return-value] - - @property - def charset(self) -> Optional[str]: - """The value of charset part for Content-Type HTTP header.""" - raw = self._headers.get(hdrs.CONTENT_TYPE) # type: ignore[attr-defined] - if self._stored_content_type != raw: - self._parse_content_type(raw) - return self._content_dict.get("charset") # type: ignore[union-attr] - - @property - def content_length(self) -> Optional[int]: - """The value of Content-Length HTTP header.""" - content_length = self._headers.get( # type: ignore[attr-defined] - hdrs.CONTENT_LENGTH - ) - - if content_length is not None: - return int(content_length) - else: - return None - - -def set_result(fut: "asyncio.Future[_T]", result: _T) -> None: - if not fut.done(): - fut.set_result(result) - - -def set_exception(fut: "asyncio.Future[_T]", exc: BaseException) -> None: - if not fut.done(): - fut.set_exception(exc) - - -class ChainMapProxy(Mapping[str, Any]): - __slots__ = ("_maps",) - - def __init__(self, maps: Iterable[Mapping[str, Any]]) -> None: - self._maps = tuple(maps) - - def __init_subclass__(cls) -> None: - raise TypeError( - "Inheritance class {} from ChainMapProxy " - "is forbidden".format(cls.__name__) - ) - - def __getitem__(self, key: str) -> Any: - for mapping in self._maps: - try: - return mapping[key] - except KeyError: - pass - raise KeyError(key) - - def get(self, key: str, default: Any = None) -> Any: - return self[key] if key in self else default - - def __len__(self) -> int: - # reuses stored hash values if possible - return len(set().union(*self._maps)) # type: ignore[arg-type] - - def __iter__(self) -> Iterator[str]: - d = {} # type: Dict[str, Any] - for mapping in reversed(self._maps): - # reuses stored hash values if possible - d.update(mapping) - return iter(d) - - def __contains__(self, key: object) -> bool: - return any(key in m for m in self._maps) - - def __bool__(self) -> bool: - return any(self._maps) - - def __repr__(self) -> str: - content = ", ".join(map(repr, self._maps)) - return f"ChainMapProxy({content})" - - -# https://tools.ietf.org/html/rfc7232#section-2.3 -_ETAGC = r"[!#-}\x80-\xff]+" -_ETAGC_RE = re.compile(_ETAGC) -_QUOTED_ETAG = fr'(W/)?"({_ETAGC})"' -QUOTED_ETAG_RE = re.compile(_QUOTED_ETAG) -LIST_QUOTED_ETAG_RE = re.compile(fr"({_QUOTED_ETAG})(?:\s*,\s*|$)|(.)") - -ETAG_ANY = "*" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class ETag: - value: str - is_weak: bool = False - - -def validate_etag_value(value: str) -> None: - if value != ETAG_ANY and not _ETAGC_RE.fullmatch(value): - raise ValueError( - f"Value {value!r} is not a valid etag. Maybe it contains '\"'?" - ) - - -def parse_http_date(date_str: Optional[str]) -> Optional[datetime.datetime]: - """Process a date string, return a datetime object""" - if date_str is not None: - timetuple = parsedate(date_str) - if timetuple is not None: - with suppress(ValueError): - return datetime.datetime(*timetuple[:6], tzinfo=datetime.timezone.utc) - return None diff --git a/.venv/Lib/site-packages/aiohttp/http.py b/.venv/Lib/site-packages/aiohttp/http.py deleted file mode 100644 index 415ffbf..0000000 --- a/.venv/Lib/site-packages/aiohttp/http.py +++ /dev/null @@ -1,72 +0,0 @@ -import http.server -import sys -from typing import Mapping, Tuple - -from . import __version__ -from .http_exceptions import HttpProcessingError as HttpProcessingError -from .http_parser import ( - HeadersParser as HeadersParser, - HttpParser as HttpParser, - HttpRequestParser as HttpRequestParser, - HttpResponseParser as HttpResponseParser, - RawRequestMessage as RawRequestMessage, - RawResponseMessage as RawResponseMessage, -) -from .http_websocket import ( - WS_CLOSED_MESSAGE as WS_CLOSED_MESSAGE, - WS_CLOSING_MESSAGE as WS_CLOSING_MESSAGE, - WS_KEY as WS_KEY, - WebSocketError as WebSocketError, - WebSocketReader as WebSocketReader, - WebSocketWriter as WebSocketWriter, - WSCloseCode as WSCloseCode, - WSMessage as WSMessage, - WSMsgType as WSMsgType, - ws_ext_gen as ws_ext_gen, - ws_ext_parse as ws_ext_parse, -) -from .http_writer import ( - HttpVersion as HttpVersion, - HttpVersion10 as HttpVersion10, - HttpVersion11 as HttpVersion11, - StreamWriter as StreamWriter, -) - -__all__ = ( - "HttpProcessingError", - "RESPONSES", - "SERVER_SOFTWARE", - # .http_writer - "StreamWriter", - "HttpVersion", - "HttpVersion10", - "HttpVersion11", - # .http_parser - "HeadersParser", - "HttpParser", - "HttpRequestParser", - "HttpResponseParser", - "RawRequestMessage", - "RawResponseMessage", - # .http_websocket - "WS_CLOSED_MESSAGE", - "WS_CLOSING_MESSAGE", - "WS_KEY", - "WebSocketReader", - "WebSocketWriter", - "ws_ext_gen", - "ws_ext_parse", - "WSMessage", - "WebSocketError", - "WSMsgType", - "WSCloseCode", -) - - -SERVER_SOFTWARE = "Python/{0[0]}.{0[1]} aiohttp/{1}".format( - sys.version_info, __version__ -) # type: str - -RESPONSES = ( - http.server.BaseHTTPRequestHandler.responses -) # type: Mapping[int, Tuple[str, str]] diff --git a/.venv/Lib/site-packages/aiohttp/http_exceptions.py b/.venv/Lib/site-packages/aiohttp/http_exceptions.py deleted file mode 100644 index c885f80..0000000 --- a/.venv/Lib/site-packages/aiohttp/http_exceptions.py +++ /dev/null @@ -1,105 +0,0 @@ -"""Low-level http related exceptions.""" - - -from typing import Optional, Union - -from .typedefs import _CIMultiDict - -__all__ = ("HttpProcessingError",) - - -class HttpProcessingError(Exception): - """HTTP error. - - Shortcut for raising HTTP errors with custom code, message and headers. - - code: HTTP Error code. - message: (optional) Error message. - headers: (optional) Headers to be sent in response, a list of pairs - """ - - code = 0 - message = "" - headers = None - - def __init__( - self, - *, - code: Optional[int] = None, - message: str = "", - headers: Optional[_CIMultiDict] = None, - ) -> None: - if code is not None: - self.code = code - self.headers = headers - self.message = message - - def __str__(self) -> str: - return f"{self.code}, message={self.message!r}" - - def __repr__(self) -> str: - return f"<{self.__class__.__name__}: {self}>" - - -class BadHttpMessage(HttpProcessingError): - - code = 400 - message = "Bad Request" - - def __init__(self, message: str, *, headers: Optional[_CIMultiDict] = None) -> None: - super().__init__(message=message, headers=headers) - self.args = (message,) - - -class HttpBadRequest(BadHttpMessage): - - code = 400 - message = "Bad Request" - - -class PayloadEncodingError(BadHttpMessage): - """Base class for payload errors""" - - -class ContentEncodingError(PayloadEncodingError): - """Content encoding error.""" - - -class TransferEncodingError(PayloadEncodingError): - """transfer encoding error.""" - - -class ContentLengthError(PayloadEncodingError): - """Not enough data for satisfy content length header.""" - - -class LineTooLong(BadHttpMessage): - def __init__( - self, line: str, limit: str = "Unknown", actual_size: str = "Unknown" - ) -> None: - super().__init__( - f"Got more than {limit} bytes ({actual_size}) when reading {line}." - ) - self.args = (line, limit, actual_size) - - -class InvalidHeader(BadHttpMessage): - def __init__(self, hdr: Union[bytes, str]) -> None: - if isinstance(hdr, bytes): - hdr = hdr.decode("utf-8", "surrogateescape") - super().__init__(f"Invalid HTTP Header: {hdr}") - self.hdr = hdr - self.args = (hdr,) - - -class BadStatusLine(BadHttpMessage): - def __init__(self, line: str = "") -> None: - if not isinstance(line, str): - line = repr(line) - super().__init__(f"Bad status line {line!r}") - self.args = (line,) - self.line = line - - -class InvalidURLError(BadHttpMessage): - pass diff --git a/.venv/Lib/site-packages/aiohttp/http_parser.py b/.venv/Lib/site-packages/aiohttp/http_parser.py deleted file mode 100644 index 2dc9482..0000000 --- a/.venv/Lib/site-packages/aiohttp/http_parser.py +++ /dev/null @@ -1,956 +0,0 @@ -import abc -import asyncio -import collections -import re -import string -import zlib -from contextlib import suppress -from enum import IntEnum -from typing import ( - Any, - Generic, - List, - NamedTuple, - Optional, - Pattern, - Set, - Tuple, - Type, - TypeVar, - Union, - cast, -) - -from multidict import CIMultiDict, CIMultiDictProxy, istr -from yarl import URL - -from . import hdrs -from .base_protocol import BaseProtocol -from .helpers import NO_EXTENSIONS, BaseTimerContext -from .http_exceptions import ( - BadHttpMessage, - BadStatusLine, - ContentEncodingError, - ContentLengthError, - InvalidHeader, - LineTooLong, - TransferEncodingError, -) -from .http_writer import HttpVersion, HttpVersion10 -from .log import internal_logger -from .streams import EMPTY_PAYLOAD, StreamReader -from .typedefs import Final, RawHeaders - -try: - import brotli - - HAS_BROTLI = True -except ImportError: # pragma: no cover - HAS_BROTLI = False - - -__all__ = ( - "HeadersParser", - "HttpParser", - "HttpRequestParser", - "HttpResponseParser", - "RawRequestMessage", - "RawResponseMessage", -) - -ASCIISET: Final[Set[str]] = set(string.printable) - -# See https://tools.ietf.org/html/rfc7230#section-3.1.1 -# and https://tools.ietf.org/html/rfc7230#appendix-B -# -# method = token -# tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / -# "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA -# token = 1*tchar -METHRE: Final[Pattern[str]] = re.compile(r"[!#$%&'*+\-.^_`|~0-9A-Za-z]+") -VERSRE: Final[Pattern[str]] = re.compile(r"HTTP/(\d+).(\d+)") -HDRRE: Final[Pattern[bytes]] = re.compile(rb"[\x00-\x1F\x7F()<>@,;:\[\]={} \t\\\\\"]") - - -class RawRequestMessage(NamedTuple): - method: str - path: str - version: HttpVersion - headers: "CIMultiDictProxy[str]" - raw_headers: RawHeaders - should_close: bool - compression: Optional[str] - upgrade: bool - chunked: bool - url: URL - - -RawResponseMessage = collections.namedtuple( - "RawResponseMessage", - [ - "version", - "code", - "reason", - "headers", - "raw_headers", - "should_close", - "compression", - "upgrade", - "chunked", - ], -) - - -_MsgT = TypeVar("_MsgT", RawRequestMessage, RawResponseMessage) - - -class ParseState(IntEnum): - - PARSE_NONE = 0 - PARSE_LENGTH = 1 - PARSE_CHUNKED = 2 - PARSE_UNTIL_EOF = 3 - - -class ChunkState(IntEnum): - PARSE_CHUNKED_SIZE = 0 - PARSE_CHUNKED_CHUNK = 1 - PARSE_CHUNKED_CHUNK_EOF = 2 - PARSE_MAYBE_TRAILERS = 3 - PARSE_TRAILERS = 4 - - -class HeadersParser: - def __init__( - self, - max_line_size: int = 8190, - max_headers: int = 32768, - max_field_size: int = 8190, - ) -> None: - self.max_line_size = max_line_size - self.max_headers = max_headers - self.max_field_size = max_field_size - - def parse_headers( - self, lines: List[bytes] - ) -> Tuple["CIMultiDictProxy[str]", RawHeaders]: - headers = CIMultiDict() # type: CIMultiDict[str] - raw_headers = [] - - lines_idx = 1 - line = lines[1] - line_count = len(lines) - - while line: - # Parse initial header name : value pair. - try: - bname, bvalue = line.split(b":", 1) - except ValueError: - raise InvalidHeader(line) from None - - bname = bname.strip(b" \t") - bvalue = bvalue.lstrip() - if HDRRE.search(bname): - raise InvalidHeader(bname) - if len(bname) > self.max_field_size: - raise LineTooLong( - "request header name {}".format( - bname.decode("utf8", "xmlcharrefreplace") - ), - str(self.max_field_size), - str(len(bname)), - ) - - header_length = len(bvalue) - - # next line - lines_idx += 1 - line = lines[lines_idx] - - # consume continuation lines - continuation = line and line[0] in (32, 9) # (' ', '\t') - - if continuation: - bvalue_lst = [bvalue] - while continuation: - header_length += len(line) - if header_length > self.max_field_size: - raise LineTooLong( - "request header field {}".format( - bname.decode("utf8", "xmlcharrefreplace") - ), - str(self.max_field_size), - str(header_length), - ) - bvalue_lst.append(line) - - # next line - lines_idx += 1 - if lines_idx < line_count: - line = lines[lines_idx] - if line: - continuation = line[0] in (32, 9) # (' ', '\t') - else: - line = b"" - break - bvalue = b"".join(bvalue_lst) - else: - if header_length > self.max_field_size: - raise LineTooLong( - "request header field {}".format( - bname.decode("utf8", "xmlcharrefreplace") - ), - str(self.max_field_size), - str(header_length), - ) - - bvalue = bvalue.strip() - name = bname.decode("utf-8", "surrogateescape") - value = bvalue.decode("utf-8", "surrogateescape") - - headers.add(name, value) - raw_headers.append((bname, bvalue)) - - return (CIMultiDictProxy(headers), tuple(raw_headers)) - - -class HttpParser(abc.ABC, Generic[_MsgT]): - def __init__( - self, - protocol: Optional[BaseProtocol] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, - limit: int = 2 ** 16, - max_line_size: int = 8190, - max_headers: int = 32768, - max_field_size: int = 8190, - timer: Optional[BaseTimerContext] = None, - code: Optional[int] = None, - method: Optional[str] = None, - readall: bool = False, - payload_exception: Optional[Type[BaseException]] = None, - response_with_body: bool = True, - read_until_eof: bool = False, - auto_decompress: bool = True, - ) -> None: - self.protocol = protocol - self.loop = loop - self.max_line_size = max_line_size - self.max_headers = max_headers - self.max_field_size = max_field_size - self.timer = timer - self.code = code - self.method = method - self.readall = readall - self.payload_exception = payload_exception - self.response_with_body = response_with_body - self.read_until_eof = read_until_eof - - self._lines = [] # type: List[bytes] - self._tail = b"" - self._upgraded = False - self._payload = None - self._payload_parser = None # type: Optional[HttpPayloadParser] - self._auto_decompress = auto_decompress - self._limit = limit - self._headers_parser = HeadersParser(max_line_size, max_headers, max_field_size) - - @abc.abstractmethod - def parse_message(self, lines: List[bytes]) -> _MsgT: - pass - - def feed_eof(self) -> Optional[_MsgT]: - if self._payload_parser is not None: - self._payload_parser.feed_eof() - self._payload_parser = None - else: - # try to extract partial message - if self._tail: - self._lines.append(self._tail) - - if self._lines: - if self._lines[-1] != "\r\n": - self._lines.append(b"") - with suppress(Exception): - return self.parse_message(self._lines) - return None - - def feed_data( - self, - data: bytes, - SEP: bytes = b"\r\n", - EMPTY: bytes = b"", - CONTENT_LENGTH: istr = hdrs.CONTENT_LENGTH, - METH_CONNECT: str = hdrs.METH_CONNECT, - SEC_WEBSOCKET_KEY1: istr = hdrs.SEC_WEBSOCKET_KEY1, - ) -> Tuple[List[Tuple[_MsgT, StreamReader]], bool, bytes]: - - messages = [] - - if self._tail: - data, self._tail = self._tail + data, b"" - - data_len = len(data) - start_pos = 0 - loop = self.loop - - while start_pos < data_len: - - # read HTTP message (request/response line + headers), \r\n\r\n - # and split by lines - if self._payload_parser is None and not self._upgraded: - pos = data.find(SEP, start_pos) - # consume \r\n - if pos == start_pos and not self._lines: - start_pos = pos + 2 - continue - - if pos >= start_pos: - # line found - self._lines.append(data[start_pos:pos]) - start_pos = pos + 2 - - # \r\n\r\n found - if self._lines[-1] == EMPTY: - try: - msg: _MsgT = self.parse_message(self._lines) - finally: - self._lines.clear() - - def get_content_length() -> Optional[int]: - # payload length - length_hdr = msg.headers.get(CONTENT_LENGTH) - if length_hdr is None: - return None - - try: - length = int(length_hdr) - except ValueError: - raise InvalidHeader(CONTENT_LENGTH) - - if length < 0: - raise InvalidHeader(CONTENT_LENGTH) - - return length - - length = get_content_length() - # do not support old websocket spec - if SEC_WEBSOCKET_KEY1 in msg.headers: - raise InvalidHeader(SEC_WEBSOCKET_KEY1) - - self._upgraded = msg.upgrade - - method = getattr(msg, "method", self.method) - - assert self.protocol is not None - # calculate payload - if ( - (length is not None and length > 0) - or msg.chunked - and not msg.upgrade - ): - payload = StreamReader( - self.protocol, - timer=self.timer, - loop=loop, - limit=self._limit, - ) - payload_parser = HttpPayloadParser( - payload, - length=length, - chunked=msg.chunked, - method=method, - compression=msg.compression, - code=self.code, - readall=self.readall, - response_with_body=self.response_with_body, - auto_decompress=self._auto_decompress, - ) - if not payload_parser.done: - self._payload_parser = payload_parser - elif method == METH_CONNECT: - assert isinstance(msg, RawRequestMessage) - payload = StreamReader( - self.protocol, - timer=self.timer, - loop=loop, - limit=self._limit, - ) - self._upgraded = True - self._payload_parser = HttpPayloadParser( - payload, - method=msg.method, - compression=msg.compression, - readall=True, - auto_decompress=self._auto_decompress, - ) - else: - if ( - getattr(msg, "code", 100) >= 199 - and length is None - and self.read_until_eof - ): - payload = StreamReader( - self.protocol, - timer=self.timer, - loop=loop, - limit=self._limit, - ) - payload_parser = HttpPayloadParser( - payload, - length=length, - chunked=msg.chunked, - method=method, - compression=msg.compression, - code=self.code, - readall=True, - response_with_body=self.response_with_body, - auto_decompress=self._auto_decompress, - ) - if not payload_parser.done: - self._payload_parser = payload_parser - else: - payload = EMPTY_PAYLOAD - - messages.append((msg, payload)) - else: - self._tail = data[start_pos:] - data = EMPTY - break - - # no parser, just store - elif self._payload_parser is None and self._upgraded: - assert not self._lines - break - - # feed payload - elif data and start_pos < data_len: - assert not self._lines - assert self._payload_parser is not None - try: - eof, data = self._payload_parser.feed_data(data[start_pos:]) - except BaseException as exc: - if self.payload_exception is not None: - self._payload_parser.payload.set_exception( - self.payload_exception(str(exc)) - ) - else: - self._payload_parser.payload.set_exception(exc) - - eof = True - data = b"" - - if eof: - start_pos = 0 - data_len = len(data) - self._payload_parser = None - continue - else: - break - - if data and start_pos < data_len: - data = data[start_pos:] - else: - data = EMPTY - - return messages, self._upgraded, data - - def parse_headers( - self, lines: List[bytes] - ) -> Tuple[ - "CIMultiDictProxy[str]", RawHeaders, Optional[bool], Optional[str], bool, bool - ]: - """Parses RFC 5322 headers from a stream. - - Line continuations are supported. Returns list of header name - and value pairs. Header name is in upper case. - """ - headers, raw_headers = self._headers_parser.parse_headers(lines) - close_conn = None - encoding = None - upgrade = False - chunked = False - - # keep-alive - conn = headers.get(hdrs.CONNECTION) - if conn: - v = conn.lower() - if v == "close": - close_conn = True - elif v == "keep-alive": - close_conn = False - elif v == "upgrade": - upgrade = True - - # encoding - enc = headers.get(hdrs.CONTENT_ENCODING) - if enc: - enc = enc.lower() - if enc in ("gzip", "deflate", "br"): - encoding = enc - - # chunking - te = headers.get(hdrs.TRANSFER_ENCODING) - if te is not None: - if "chunked" == te.lower(): - chunked = True - else: - raise BadHttpMessage("Request has invalid `Transfer-Encoding`") - - if hdrs.CONTENT_LENGTH in headers: - raise BadHttpMessage( - "Content-Length can't be present with Transfer-Encoding", - ) - - return (headers, raw_headers, close_conn, encoding, upgrade, chunked) - - def set_upgraded(self, val: bool) -> None: - """Set connection upgraded (to websocket) mode. - - :param bool val: new state. - """ - self._upgraded = val - - -class HttpRequestParser(HttpParser[RawRequestMessage]): - """Read request status line. - - Exception .http_exceptions.BadStatusLine - could be raised in case of any errors in status line. - Returns RawRequestMessage. - """ - - def parse_message(self, lines: List[bytes]) -> RawRequestMessage: - # request line - line = lines[0].decode("utf-8", "surrogateescape") - try: - method, path, version = line.split(None, 2) - except ValueError: - raise BadStatusLine(line) from None - - if len(path) > self.max_line_size: - raise LineTooLong( - "Status line is too long", str(self.max_line_size), str(len(path)) - ) - - path_part, _hash_separator, url_fragment = path.partition("#") - path_part, _question_mark_separator, qs_part = path_part.partition("?") - - # method - if not METHRE.match(method): - raise BadStatusLine(method) - - # version - try: - if version.startswith("HTTP/"): - n1, n2 = version[5:].split(".", 1) - version_o = HttpVersion(int(n1), int(n2)) - else: - raise BadStatusLine(version) - except Exception: - raise BadStatusLine(version) - - # read headers - ( - headers, - raw_headers, - close, - compression, - upgrade, - chunked, - ) = self.parse_headers(lines) - - if close is None: # then the headers weren't set in the request - if version_o <= HttpVersion10: # HTTP 1.0 must asks to not close - close = True - else: # HTTP 1.1 must ask to close. - close = False - - return RawRequestMessage( - method, - path, - version_o, - headers, - raw_headers, - close, - compression, - upgrade, - chunked, - # NOTE: `yarl.URL.build()` is used to mimic what the Cython-based - # NOTE: parser does, otherwise it results into the same - # NOTE: HTTP Request-Line input producing different - # NOTE: `yarl.URL()` objects - URL.build( - path=path_part, - query_string=qs_part, - fragment=url_fragment, - encoded=True, - ), - ) - - -class HttpResponseParser(HttpParser[RawResponseMessage]): - """Read response status line and headers. - - BadStatusLine could be raised in case of any errors in status line. - Returns RawResponseMessage. - """ - - def parse_message(self, lines: List[bytes]) -> RawResponseMessage: - line = lines[0].decode("utf-8", "surrogateescape") - try: - version, status = line.split(None, 1) - except ValueError: - raise BadStatusLine(line) from None - - try: - status, reason = status.split(None, 1) - except ValueError: - reason = "" - - if len(reason) > self.max_line_size: - raise LineTooLong( - "Status line is too long", str(self.max_line_size), str(len(reason)) - ) - - # version - match = VERSRE.match(version) - if match is None: - raise BadStatusLine(line) - version_o = HttpVersion(int(match.group(1)), int(match.group(2))) - - # The status code is a three-digit number - try: - status_i = int(status) - except ValueError: - raise BadStatusLine(line) from None - - if status_i > 999: - raise BadStatusLine(line) - - # read headers - ( - headers, - raw_headers, - close, - compression, - upgrade, - chunked, - ) = self.parse_headers(lines) - - if close is None: - close = version_o <= HttpVersion10 - - return RawResponseMessage( - version_o, - status_i, - reason.strip(), - headers, - raw_headers, - close, - compression, - upgrade, - chunked, - ) - - -class HttpPayloadParser: - def __init__( - self, - payload: StreamReader, - length: Optional[int] = None, - chunked: bool = False, - compression: Optional[str] = None, - code: Optional[int] = None, - method: Optional[str] = None, - readall: bool = False, - response_with_body: bool = True, - auto_decompress: bool = True, - ) -> None: - self._length = 0 - self._type = ParseState.PARSE_NONE - self._chunk = ChunkState.PARSE_CHUNKED_SIZE - self._chunk_size = 0 - self._chunk_tail = b"" - self._auto_decompress = auto_decompress - self.done = False - - # payload decompression wrapper - if response_with_body and compression and self._auto_decompress: - real_payload = DeflateBuffer( - payload, compression - ) # type: Union[StreamReader, DeflateBuffer] - else: - real_payload = payload - - # payload parser - if not response_with_body: - # don't parse payload if it's not expected to be received - self._type = ParseState.PARSE_NONE - real_payload.feed_eof() - self.done = True - - elif chunked: - self._type = ParseState.PARSE_CHUNKED - elif length is not None: - self._type = ParseState.PARSE_LENGTH - self._length = length - if self._length == 0: - real_payload.feed_eof() - self.done = True - else: - if readall and code != 204: - self._type = ParseState.PARSE_UNTIL_EOF - elif method in ("PUT", "POST"): - internal_logger.warning( # pragma: no cover - "Content-Length or Transfer-Encoding header is required" - ) - self._type = ParseState.PARSE_NONE - real_payload.feed_eof() - self.done = True - - self.payload = real_payload - - def feed_eof(self) -> None: - if self._type == ParseState.PARSE_UNTIL_EOF: - self.payload.feed_eof() - elif self._type == ParseState.PARSE_LENGTH: - raise ContentLengthError( - "Not enough data for satisfy content length header." - ) - elif self._type == ParseState.PARSE_CHUNKED: - raise TransferEncodingError( - "Not enough data for satisfy transfer length header." - ) - - def feed_data( - self, chunk: bytes, SEP: bytes = b"\r\n", CHUNK_EXT: bytes = b";" - ) -> Tuple[bool, bytes]: - # Read specified amount of bytes - if self._type == ParseState.PARSE_LENGTH: - required = self._length - chunk_len = len(chunk) - - if required >= chunk_len: - self._length = required - chunk_len - self.payload.feed_data(chunk, chunk_len) - if self._length == 0: - self.payload.feed_eof() - return True, b"" - else: - self._length = 0 - self.payload.feed_data(chunk[:required], required) - self.payload.feed_eof() - return True, chunk[required:] - - # Chunked transfer encoding parser - elif self._type == ParseState.PARSE_CHUNKED: - if self._chunk_tail: - chunk = self._chunk_tail + chunk - self._chunk_tail = b"" - - while chunk: - - # read next chunk size - if self._chunk == ChunkState.PARSE_CHUNKED_SIZE: - pos = chunk.find(SEP) - if pos >= 0: - i = chunk.find(CHUNK_EXT, 0, pos) - if i >= 0: - size_b = chunk[:i] # strip chunk-extensions - else: - size_b = chunk[:pos] - - try: - size = int(bytes(size_b), 16) - except ValueError: - exc = TransferEncodingError( - chunk[:pos].decode("ascii", "surrogateescape") - ) - self.payload.set_exception(exc) - raise exc from None - - chunk = chunk[pos + 2 :] - if size == 0: # eof marker - self._chunk = ChunkState.PARSE_MAYBE_TRAILERS - else: - self._chunk = ChunkState.PARSE_CHUNKED_CHUNK - self._chunk_size = size - self.payload.begin_http_chunk_receiving() - else: - self._chunk_tail = chunk - return False, b"" - - # read chunk and feed buffer - if self._chunk == ChunkState.PARSE_CHUNKED_CHUNK: - required = self._chunk_size - chunk_len = len(chunk) - - if required > chunk_len: - self._chunk_size = required - chunk_len - self.payload.feed_data(chunk, chunk_len) - return False, b"" - else: - self._chunk_size = 0 - self.payload.feed_data(chunk[:required], required) - chunk = chunk[required:] - self._chunk = ChunkState.PARSE_CHUNKED_CHUNK_EOF - self.payload.end_http_chunk_receiving() - - # toss the CRLF at the end of the chunk - if self._chunk == ChunkState.PARSE_CHUNKED_CHUNK_EOF: - if chunk[:2] == SEP: - chunk = chunk[2:] - self._chunk = ChunkState.PARSE_CHUNKED_SIZE - else: - self._chunk_tail = chunk - return False, b"" - - # if stream does not contain trailer, after 0\r\n - # we should get another \r\n otherwise - # trailers needs to be skiped until \r\n\r\n - if self._chunk == ChunkState.PARSE_MAYBE_TRAILERS: - head = chunk[:2] - if head == SEP: - # end of stream - self.payload.feed_eof() - return True, chunk[2:] - # Both CR and LF, or only LF may not be received yet. It is - # expected that CRLF or LF will be shown at the very first - # byte next time, otherwise trailers should come. The last - # CRLF which marks the end of response might not be - # contained in the same TCP segment which delivered the - # size indicator. - if not head: - return False, b"" - if head == SEP[:1]: - self._chunk_tail = head - return False, b"" - self._chunk = ChunkState.PARSE_TRAILERS - - # read and discard trailer up to the CRLF terminator - if self._chunk == ChunkState.PARSE_TRAILERS: - pos = chunk.find(SEP) - if pos >= 0: - chunk = chunk[pos + 2 :] - self._chunk = ChunkState.PARSE_MAYBE_TRAILERS - else: - self._chunk_tail = chunk - return False, b"" - - # Read all bytes until eof - elif self._type == ParseState.PARSE_UNTIL_EOF: - self.payload.feed_data(chunk, len(chunk)) - - return False, b"" - - -class DeflateBuffer: - """DeflateStream decompress stream and feed data into specified stream.""" - - decompressor: Any - - def __init__(self, out: StreamReader, encoding: Optional[str]) -> None: - self.out = out - self.size = 0 - self.encoding = encoding - self._started_decoding = False - - if encoding == "br": - if not HAS_BROTLI: # pragma: no cover - raise ContentEncodingError( - "Can not decode content-encoding: brotli (br). " - "Please install `Brotli`" - ) - - class BrotliDecoder: - # Supports both 'brotlipy' and 'Brotli' packages - # since they share an import name. The top branches - # are for 'brotlipy' and bottom branches for 'Brotli' - def __init__(self) -> None: - self._obj = brotli.Decompressor() - - def decompress(self, data: bytes) -> bytes: - if hasattr(self._obj, "decompress"): - return cast(bytes, self._obj.decompress(data)) - return cast(bytes, self._obj.process(data)) - - def flush(self) -> bytes: - if hasattr(self._obj, "flush"): - return cast(bytes, self._obj.flush()) - return b"" - - self.decompressor = BrotliDecoder() - else: - zlib_mode = 16 + zlib.MAX_WBITS if encoding == "gzip" else zlib.MAX_WBITS - self.decompressor = zlib.decompressobj(wbits=zlib_mode) - - def set_exception(self, exc: BaseException) -> None: - self.out.set_exception(exc) - - def feed_data(self, chunk: bytes, size: int) -> None: - if not size: - return - - self.size += size - - # RFC1950 - # bits 0..3 = CM = 0b1000 = 8 = "deflate" - # bits 4..7 = CINFO = 1..7 = windows size. - if ( - not self._started_decoding - and self.encoding == "deflate" - and chunk[0] & 0xF != 8 - ): - # Change the decoder to decompress incorrectly compressed data - # Actually we should issue a warning about non-RFC-compliant data. - self.decompressor = zlib.decompressobj(wbits=-zlib.MAX_WBITS) - - try: - chunk = self.decompressor.decompress(chunk) - except Exception: - raise ContentEncodingError( - "Can not decode content-encoding: %s" % self.encoding - ) - - self._started_decoding = True - - if chunk: - self.out.feed_data(chunk, len(chunk)) - - def feed_eof(self) -> None: - chunk = self.decompressor.flush() - - if chunk or self.size > 0: - self.out.feed_data(chunk, len(chunk)) - if self.encoding == "deflate" and not self.decompressor.eof: - raise ContentEncodingError("deflate") - - self.out.feed_eof() - - def begin_http_chunk_receiving(self) -> None: - self.out.begin_http_chunk_receiving() - - def end_http_chunk_receiving(self) -> None: - self.out.end_http_chunk_receiving() - - -HttpRequestParserPy = HttpRequestParser -HttpResponseParserPy = HttpResponseParser -RawRequestMessagePy = RawRequestMessage -RawResponseMessagePy = RawResponseMessage - -try: - if not NO_EXTENSIONS: - from ._http_parser import ( # type: ignore[import,no-redef] - HttpRequestParser, - HttpResponseParser, - RawRequestMessage, - RawResponseMessage, - ) - - HttpRequestParserC = HttpRequestParser - HttpResponseParserC = HttpResponseParser - RawRequestMessageC = RawRequestMessage - RawResponseMessageC = RawResponseMessage -except ImportError: # pragma: no cover - pass diff --git a/.venv/Lib/site-packages/aiohttp/http_websocket.py b/.venv/Lib/site-packages/aiohttp/http_websocket.py deleted file mode 100644 index 991a149..0000000 --- a/.venv/Lib/site-packages/aiohttp/http_websocket.py +++ /dev/null @@ -1,701 +0,0 @@ -"""WebSocket protocol versions 13 and 8.""" - -import asyncio -import collections -import json -import random -import re -import sys -import zlib -from enum import IntEnum -from struct import Struct -from typing import Any, Callable, List, Optional, Pattern, Set, Tuple, Union, cast - -from .base_protocol import BaseProtocol -from .helpers import NO_EXTENSIONS -from .streams import DataQueue -from .typedefs import Final - -__all__ = ( - "WS_CLOSED_MESSAGE", - "WS_CLOSING_MESSAGE", - "WS_KEY", - "WebSocketReader", - "WebSocketWriter", - "WSMessage", - "WebSocketError", - "WSMsgType", - "WSCloseCode", -) - - -class WSCloseCode(IntEnum): - OK = 1000 - GOING_AWAY = 1001 - PROTOCOL_ERROR = 1002 - UNSUPPORTED_DATA = 1003 - ABNORMAL_CLOSURE = 1006 - INVALID_TEXT = 1007 - POLICY_VIOLATION = 1008 - MESSAGE_TOO_BIG = 1009 - MANDATORY_EXTENSION = 1010 - INTERNAL_ERROR = 1011 - SERVICE_RESTART = 1012 - TRY_AGAIN_LATER = 1013 - BAD_GATEWAY = 1014 - - -ALLOWED_CLOSE_CODES: Final[Set[int]] = {int(i) for i in WSCloseCode} - - -class WSMsgType(IntEnum): - # websocket spec types - CONTINUATION = 0x0 - TEXT = 0x1 - BINARY = 0x2 - PING = 0x9 - PONG = 0xA - CLOSE = 0x8 - - # aiohttp specific types - CLOSING = 0x100 - CLOSED = 0x101 - ERROR = 0x102 - - text = TEXT - binary = BINARY - ping = PING - pong = PONG - close = CLOSE - closing = CLOSING - closed = CLOSED - error = ERROR - - -WS_KEY: Final[bytes] = b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11" - - -UNPACK_LEN2 = Struct("!H").unpack_from -UNPACK_LEN3 = Struct("!Q").unpack_from -UNPACK_CLOSE_CODE = Struct("!H").unpack -PACK_LEN1 = Struct("!BB").pack -PACK_LEN2 = Struct("!BBH").pack -PACK_LEN3 = Struct("!BBQ").pack -PACK_CLOSE_CODE = Struct("!H").pack -MSG_SIZE: Final[int] = 2 ** 14 -DEFAULT_LIMIT: Final[int] = 2 ** 16 - - -_WSMessageBase = collections.namedtuple("_WSMessageBase", ["type", "data", "extra"]) - - -class WSMessage(_WSMessageBase): - def json(self, *, loads: Callable[[Any], Any] = json.loads) -> Any: - """Return parsed JSON data. - - .. versionadded:: 0.22 - """ - return loads(self.data) - - -WS_CLOSED_MESSAGE = WSMessage(WSMsgType.CLOSED, None, None) -WS_CLOSING_MESSAGE = WSMessage(WSMsgType.CLOSING, None, None) - - -class WebSocketError(Exception): - """WebSocket protocol parser error.""" - - def __init__(self, code: int, message: str) -> None: - self.code = code - super().__init__(code, message) - - def __str__(self) -> str: - return cast(str, self.args[1]) - - -class WSHandshakeError(Exception): - """WebSocket protocol handshake error.""" - - -native_byteorder: Final[str] = sys.byteorder - - -# Used by _websocket_mask_python -_XOR_TABLE: Final[List[bytes]] = [bytes(a ^ b for a in range(256)) for b in range(256)] - - -def _websocket_mask_python(mask: bytes, data: bytearray) -> None: - """Websocket masking function. - - `mask` is a `bytes` object of length 4; `data` is a `bytearray` - object of any length. The contents of `data` are masked with `mask`, - as specified in section 5.3 of RFC 6455. - - Note that this function mutates the `data` argument. - - This pure-python implementation may be replaced by an optimized - version when available. - - """ - assert isinstance(data, bytearray), data - assert len(mask) == 4, mask - - if data: - a, b, c, d = (_XOR_TABLE[n] for n in mask) - data[::4] = data[::4].translate(a) - data[1::4] = data[1::4].translate(b) - data[2::4] = data[2::4].translate(c) - data[3::4] = data[3::4].translate(d) - - -if NO_EXTENSIONS: # pragma: no cover - _websocket_mask = _websocket_mask_python -else: - try: - from ._websocket import _websocket_mask_cython # type: ignore[import] - - _websocket_mask = _websocket_mask_cython - except ImportError: # pragma: no cover - _websocket_mask = _websocket_mask_python - -_WS_DEFLATE_TRAILING: Final[bytes] = bytes([0x00, 0x00, 0xFF, 0xFF]) - - -_WS_EXT_RE: Final[Pattern[str]] = re.compile( - r"^(?:;\s*(?:" - r"(server_no_context_takeover)|" - r"(client_no_context_takeover)|" - r"(server_max_window_bits(?:=(\d+))?)|" - r"(client_max_window_bits(?:=(\d+))?)))*$" -) - -_WS_EXT_RE_SPLIT: Final[Pattern[str]] = re.compile(r"permessage-deflate([^,]+)?") - - -def ws_ext_parse(extstr: Optional[str], isserver: bool = False) -> Tuple[int, bool]: - if not extstr: - return 0, False - - compress = 0 - notakeover = False - for ext in _WS_EXT_RE_SPLIT.finditer(extstr): - defext = ext.group(1) - # Return compress = 15 when get `permessage-deflate` - if not defext: - compress = 15 - break - match = _WS_EXT_RE.match(defext) - if match: - compress = 15 - if isserver: - # Server never fail to detect compress handshake. - # Server does not need to send max wbit to client - if match.group(4): - compress = int(match.group(4)) - # Group3 must match if group4 matches - # Compress wbit 8 does not support in zlib - # If compress level not support, - # CONTINUE to next extension - if compress > 15 or compress < 9: - compress = 0 - continue - if match.group(1): - notakeover = True - # Ignore regex group 5 & 6 for client_max_window_bits - break - else: - if match.group(6): - compress = int(match.group(6)) - # Group5 must match if group6 matches - # Compress wbit 8 does not support in zlib - # If compress level not support, - # FAIL the parse progress - if compress > 15 or compress < 9: - raise WSHandshakeError("Invalid window size") - if match.group(2): - notakeover = True - # Ignore regex group 5 & 6 for client_max_window_bits - break - # Return Fail if client side and not match - elif not isserver: - raise WSHandshakeError("Extension for deflate not supported" + ext.group(1)) - - return compress, notakeover - - -def ws_ext_gen( - compress: int = 15, isserver: bool = False, server_notakeover: bool = False -) -> str: - # client_notakeover=False not used for server - # compress wbit 8 does not support in zlib - if compress < 9 or compress > 15: - raise ValueError( - "Compress wbits must between 9 and 15, " "zlib does not support wbits=8" - ) - enabledext = ["permessage-deflate"] - if not isserver: - enabledext.append("client_max_window_bits") - - if compress < 15: - enabledext.append("server_max_window_bits=" + str(compress)) - if server_notakeover: - enabledext.append("server_no_context_takeover") - # if client_notakeover: - # enabledext.append('client_no_context_takeover') - return "; ".join(enabledext) - - -class WSParserState(IntEnum): - READ_HEADER = 1 - READ_PAYLOAD_LENGTH = 2 - READ_PAYLOAD_MASK = 3 - READ_PAYLOAD = 4 - - -class WebSocketReader: - def __init__( - self, queue: DataQueue[WSMessage], max_msg_size: int, compress: bool = True - ) -> None: - self.queue = queue - self._max_msg_size = max_msg_size - - self._exc = None # type: Optional[BaseException] - self._partial = bytearray() - self._state = WSParserState.READ_HEADER - - self._opcode = None # type: Optional[int] - self._frame_fin = False - self._frame_opcode = None # type: Optional[int] - self._frame_payload = bytearray() - - self._tail = b"" - self._has_mask = False - self._frame_mask = None # type: Optional[bytes] - self._payload_length = 0 - self._payload_length_flag = 0 - self._compressed = None # type: Optional[bool] - self._decompressobj = None # type: Any # zlib.decompressobj actually - self._compress = compress - - def feed_eof(self) -> None: - self.queue.feed_eof() - - def feed_data(self, data: bytes) -> Tuple[bool, bytes]: - if self._exc: - return True, data - - try: - return self._feed_data(data) - except Exception as exc: - self._exc = exc - self.queue.set_exception(exc) - return True, b"" - - def _feed_data(self, data: bytes) -> Tuple[bool, bytes]: - for fin, opcode, payload, compressed in self.parse_frame(data): - if compressed and not self._decompressobj: - self._decompressobj = zlib.decompressobj(wbits=-zlib.MAX_WBITS) - if opcode == WSMsgType.CLOSE: - if len(payload) >= 2: - close_code = UNPACK_CLOSE_CODE(payload[:2])[0] - if close_code < 3000 and close_code not in ALLOWED_CLOSE_CODES: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - f"Invalid close code: {close_code}", - ) - try: - close_message = payload[2:].decode("utf-8") - except UnicodeDecodeError as exc: - raise WebSocketError( - WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" - ) from exc - msg = WSMessage(WSMsgType.CLOSE, close_code, close_message) - elif payload: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - f"Invalid close frame: {fin} {opcode} {payload!r}", - ) - else: - msg = WSMessage(WSMsgType.CLOSE, 0, "") - - self.queue.feed_data(msg, 0) - - elif opcode == WSMsgType.PING: - self.queue.feed_data( - WSMessage(WSMsgType.PING, payload, ""), len(payload) - ) - - elif opcode == WSMsgType.PONG: - self.queue.feed_data( - WSMessage(WSMsgType.PONG, payload, ""), len(payload) - ) - - elif ( - opcode not in (WSMsgType.TEXT, WSMsgType.BINARY) - and self._opcode is None - ): - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, f"Unexpected opcode={opcode!r}" - ) - else: - # load text/binary - if not fin: - # got partial frame payload - if opcode != WSMsgType.CONTINUATION: - self._opcode = opcode - self._partial.extend(payload) - if self._max_msg_size and len(self._partial) >= self._max_msg_size: - raise WebSocketError( - WSCloseCode.MESSAGE_TOO_BIG, - "Message size {} exceeds limit {}".format( - len(self._partial), self._max_msg_size - ), - ) - else: - # previous frame was non finished - # we should get continuation opcode - if self._partial: - if opcode != WSMsgType.CONTINUATION: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "The opcode in non-fin frame is expected " - "to be zero, got {!r}".format(opcode), - ) - - if opcode == WSMsgType.CONTINUATION: - assert self._opcode is not None - opcode = self._opcode - self._opcode = None - - self._partial.extend(payload) - if self._max_msg_size and len(self._partial) >= self._max_msg_size: - raise WebSocketError( - WSCloseCode.MESSAGE_TOO_BIG, - "Message size {} exceeds limit {}".format( - len(self._partial), self._max_msg_size - ), - ) - - # Decompress process must to be done after all packets - # received. - if compressed: - self._partial.extend(_WS_DEFLATE_TRAILING) - payload_merged = self._decompressobj.decompress( - self._partial, self._max_msg_size - ) - if self._decompressobj.unconsumed_tail: - left = len(self._decompressobj.unconsumed_tail) - raise WebSocketError( - WSCloseCode.MESSAGE_TOO_BIG, - "Decompressed message size {} exceeds limit {}".format( - self._max_msg_size + left, self._max_msg_size - ), - ) - else: - payload_merged = bytes(self._partial) - - self._partial.clear() - - if opcode == WSMsgType.TEXT: - try: - text = payload_merged.decode("utf-8") - self.queue.feed_data( - WSMessage(WSMsgType.TEXT, text, ""), len(text) - ) - except UnicodeDecodeError as exc: - raise WebSocketError( - WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" - ) from exc - else: - self.queue.feed_data( - WSMessage(WSMsgType.BINARY, payload_merged, ""), - len(payload_merged), - ) - - return False, b"" - - def parse_frame( - self, buf: bytes - ) -> List[Tuple[bool, Optional[int], bytearray, Optional[bool]]]: - """Return the next frame from the socket.""" - frames = [] - if self._tail: - buf, self._tail = self._tail + buf, b"" - - start_pos = 0 - buf_length = len(buf) - - while True: - # read header - if self._state == WSParserState.READ_HEADER: - if buf_length - start_pos >= 2: - data = buf[start_pos : start_pos + 2] - start_pos += 2 - first_byte, second_byte = data - - fin = (first_byte >> 7) & 1 - rsv1 = (first_byte >> 6) & 1 - rsv2 = (first_byte >> 5) & 1 - rsv3 = (first_byte >> 4) & 1 - opcode = first_byte & 0xF - - # frame-fin = %x0 ; more frames of this message follow - # / %x1 ; final frame of this message - # frame-rsv1 = %x0 ; - # 1 bit, MUST be 0 unless negotiated otherwise - # frame-rsv2 = %x0 ; - # 1 bit, MUST be 0 unless negotiated otherwise - # frame-rsv3 = %x0 ; - # 1 bit, MUST be 0 unless negotiated otherwise - # - # Remove rsv1 from this test for deflate development - if rsv2 or rsv3 or (rsv1 and not self._compress): - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "Received frame with non-zero reserved bits", - ) - - if opcode > 0x7 and fin == 0: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "Received fragmented control frame", - ) - - has_mask = (second_byte >> 7) & 1 - length = second_byte & 0x7F - - # Control frames MUST have a payload - # length of 125 bytes or less - if opcode > 0x7 and length > 125: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "Control frame payload cannot be " "larger than 125 bytes", - ) - - # Set compress status if last package is FIN - # OR set compress status if this is first fragment - # Raise error if not first fragment with rsv1 = 0x1 - if self._frame_fin or self._compressed is None: - self._compressed = True if rsv1 else False - elif rsv1: - raise WebSocketError( - WSCloseCode.PROTOCOL_ERROR, - "Received frame with non-zero reserved bits", - ) - - self._frame_fin = bool(fin) - self._frame_opcode = opcode - self._has_mask = bool(has_mask) - self._payload_length_flag = length - self._state = WSParserState.READ_PAYLOAD_LENGTH - else: - break - - # read payload length - if self._state == WSParserState.READ_PAYLOAD_LENGTH: - length = self._payload_length_flag - if length == 126: - if buf_length - start_pos >= 2: - data = buf[start_pos : start_pos + 2] - start_pos += 2 - length = UNPACK_LEN2(data)[0] - self._payload_length = length - self._state = ( - WSParserState.READ_PAYLOAD_MASK - if self._has_mask - else WSParserState.READ_PAYLOAD - ) - else: - break - elif length > 126: - if buf_length - start_pos >= 8: - data = buf[start_pos : start_pos + 8] - start_pos += 8 - length = UNPACK_LEN3(data)[0] - self._payload_length = length - self._state = ( - WSParserState.READ_PAYLOAD_MASK - if self._has_mask - else WSParserState.READ_PAYLOAD - ) - else: - break - else: - self._payload_length = length - self._state = ( - WSParserState.READ_PAYLOAD_MASK - if self._has_mask - else WSParserState.READ_PAYLOAD - ) - - # read payload mask - if self._state == WSParserState.READ_PAYLOAD_MASK: - if buf_length - start_pos >= 4: - self._frame_mask = buf[start_pos : start_pos + 4] - start_pos += 4 - self._state = WSParserState.READ_PAYLOAD - else: - break - - if self._state == WSParserState.READ_PAYLOAD: - length = self._payload_length - payload = self._frame_payload - - chunk_len = buf_length - start_pos - if length >= chunk_len: - self._payload_length = length - chunk_len - payload.extend(buf[start_pos:]) - start_pos = buf_length - else: - self._payload_length = 0 - payload.extend(buf[start_pos : start_pos + length]) - start_pos = start_pos + length - - if self._payload_length == 0: - if self._has_mask: - assert self._frame_mask is not None - _websocket_mask(self._frame_mask, payload) - - frames.append( - (self._frame_fin, self._frame_opcode, payload, self._compressed) - ) - - self._frame_payload = bytearray() - self._state = WSParserState.READ_HEADER - else: - break - - self._tail = buf[start_pos:] - - return frames - - -class WebSocketWriter: - def __init__( - self, - protocol: BaseProtocol, - transport: asyncio.Transport, - *, - use_mask: bool = False, - limit: int = DEFAULT_LIMIT, - random: Any = random.Random(), - compress: int = 0, - notakeover: bool = False, - ) -> None: - self.protocol = protocol - self.transport = transport - self.use_mask = use_mask - self.randrange = random.randrange - self.compress = compress - self.notakeover = notakeover - self._closing = False - self._limit = limit - self._output_size = 0 - self._compressobj = None # type: Any # actually compressobj - - async def _send_frame( - self, message: bytes, opcode: int, compress: Optional[int] = None - ) -> None: - """Send a frame over the websocket with message as its payload.""" - if self._closing and not (opcode & WSMsgType.CLOSE): - raise ConnectionResetError("Cannot write to closing transport") - - rsv = 0 - - # Only compress larger packets (disabled) - # Does small packet needs to be compressed? - # if self.compress and opcode < 8 and len(message) > 124: - if (compress or self.compress) and opcode < 8: - if compress: - # Do not set self._compress if compressing is for this frame - compressobj = zlib.compressobj(level=zlib.Z_BEST_SPEED, wbits=-compress) - else: # self.compress - if not self._compressobj: - self._compressobj = zlib.compressobj( - level=zlib.Z_BEST_SPEED, wbits=-self.compress - ) - compressobj = self._compressobj - - message = compressobj.compress(message) - message = message + compressobj.flush( - zlib.Z_FULL_FLUSH if self.notakeover else zlib.Z_SYNC_FLUSH - ) - if message.endswith(_WS_DEFLATE_TRAILING): - message = message[:-4] - rsv = rsv | 0x40 - - msg_length = len(message) - - use_mask = self.use_mask - if use_mask: - mask_bit = 0x80 - else: - mask_bit = 0 - - if msg_length < 126: - header = PACK_LEN1(0x80 | rsv | opcode, msg_length | mask_bit) - elif msg_length < (1 << 16): - header = PACK_LEN2(0x80 | rsv | opcode, 126 | mask_bit, msg_length) - else: - header = PACK_LEN3(0x80 | rsv | opcode, 127 | mask_bit, msg_length) - if use_mask: - mask = self.randrange(0, 0xFFFFFFFF) - mask = mask.to_bytes(4, "big") - message = bytearray(message) - _websocket_mask(mask, message) - self._write(header + mask + message) - self._output_size += len(header) + len(mask) + len(message) - else: - if len(message) > MSG_SIZE: - self._write(header) - self._write(message) - else: - self._write(header + message) - - self._output_size += len(header) + len(message) - - if self._output_size > self._limit: - self._output_size = 0 - await self.protocol._drain_helper() - - def _write(self, data: bytes) -> None: - if self.transport is None or self.transport.is_closing(): - raise ConnectionResetError("Cannot write to closing transport") - self.transport.write(data) - - async def pong(self, message: bytes = b"") -> None: - """Send pong message.""" - if isinstance(message, str): - message = message.encode("utf-8") - await self._send_frame(message, WSMsgType.PONG) - - async def ping(self, message: bytes = b"") -> None: - """Send ping message.""" - if isinstance(message, str): - message = message.encode("utf-8") - await self._send_frame(message, WSMsgType.PING) - - async def send( - self, - message: Union[str, bytes], - binary: bool = False, - compress: Optional[int] = None, - ) -> None: - """Send a frame over the websocket with message as its payload.""" - if isinstance(message, str): - message = message.encode("utf-8") - if binary: - await self._send_frame(message, WSMsgType.BINARY, compress) - else: - await self._send_frame(message, WSMsgType.TEXT, compress) - - async def close(self, code: int = 1000, message: bytes = b"") -> None: - """Close the websocket, sending the specified code and message.""" - if isinstance(message, str): - message = message.encode("utf-8") - try: - await self._send_frame( - PACK_CLOSE_CODE(code) + message, opcode=WSMsgType.CLOSE - ) - finally: - self._closing = True diff --git a/.venv/Lib/site-packages/aiohttp/http_writer.py b/.venv/Lib/site-packages/aiohttp/http_writer.py deleted file mode 100644 index e091447..0000000 --- a/.venv/Lib/site-packages/aiohttp/http_writer.py +++ /dev/null @@ -1,200 +0,0 @@ -"""Http related parsers and protocol.""" - -import asyncio -import zlib -from typing import Any, Awaitable, Callable, NamedTuple, Optional, Union # noqa - -from multidict import CIMultiDict - -from .abc import AbstractStreamWriter -from .base_protocol import BaseProtocol -from .helpers import NO_EXTENSIONS - -__all__ = ("StreamWriter", "HttpVersion", "HttpVersion10", "HttpVersion11") - - -class HttpVersion(NamedTuple): - major: int - minor: int - - -HttpVersion10 = HttpVersion(1, 0) -HttpVersion11 = HttpVersion(1, 1) - - -_T_OnChunkSent = Optional[Callable[[bytes], Awaitable[None]]] -_T_OnHeadersSent = Optional[Callable[["CIMultiDict[str]"], Awaitable[None]]] - - -class StreamWriter(AbstractStreamWriter): - def __init__( - self, - protocol: BaseProtocol, - loop: asyncio.AbstractEventLoop, - on_chunk_sent: _T_OnChunkSent = None, - on_headers_sent: _T_OnHeadersSent = None, - ) -> None: - self._protocol = protocol - self._transport = protocol.transport - - self.loop = loop - self.length = None - self.chunked = False - self.buffer_size = 0 - self.output_size = 0 - - self._eof = False - self._compress = None # type: Any - self._drain_waiter = None - - self._on_chunk_sent = on_chunk_sent # type: _T_OnChunkSent - self._on_headers_sent = on_headers_sent # type: _T_OnHeadersSent - - @property - def transport(self) -> Optional[asyncio.Transport]: - return self._transport - - @property - def protocol(self) -> BaseProtocol: - return self._protocol - - def enable_chunking(self) -> None: - self.chunked = True - - def enable_compression( - self, encoding: str = "deflate", strategy: int = zlib.Z_DEFAULT_STRATEGY - ) -> None: - zlib_mode = 16 + zlib.MAX_WBITS if encoding == "gzip" else zlib.MAX_WBITS - self._compress = zlib.compressobj(wbits=zlib_mode, strategy=strategy) - - def _write(self, chunk: bytes) -> None: - size = len(chunk) - self.buffer_size += size - self.output_size += size - - if self._transport is None or self._transport.is_closing(): - raise ConnectionResetError("Cannot write to closing transport") - self._transport.write(chunk) - - async def write( - self, chunk: bytes, *, drain: bool = True, LIMIT: int = 0x10000 - ) -> None: - """Writes chunk of data to a stream. - - write_eof() indicates end of stream. - writer can't be used after write_eof() method being called. - write() return drain future. - """ - if self._on_chunk_sent is not None: - await self._on_chunk_sent(chunk) - - if isinstance(chunk, memoryview): - if chunk.nbytes != len(chunk): - # just reshape it - chunk = chunk.cast("c") - - if self._compress is not None: - chunk = self._compress.compress(chunk) - if not chunk: - return - - if self.length is not None: - chunk_len = len(chunk) - if self.length >= chunk_len: - self.length = self.length - chunk_len - else: - chunk = chunk[: self.length] - self.length = 0 - if not chunk: - return - - if chunk: - if self.chunked: - chunk_len_pre = ("%x\r\n" % len(chunk)).encode("ascii") - chunk = chunk_len_pre + chunk + b"\r\n" - - self._write(chunk) - - if self.buffer_size > LIMIT and drain: - self.buffer_size = 0 - await self.drain() - - async def write_headers( - self, status_line: str, headers: "CIMultiDict[str]" - ) -> None: - """Write request/response status and headers.""" - if self._on_headers_sent is not None: - await self._on_headers_sent(headers) - - # status + headers - buf = _serialize_headers(status_line, headers) - self._write(buf) - - async def write_eof(self, chunk: bytes = b"") -> None: - if self._eof: - return - - if chunk and self._on_chunk_sent is not None: - await self._on_chunk_sent(chunk) - - if self._compress: - if chunk: - chunk = self._compress.compress(chunk) - - chunk = chunk + self._compress.flush() - if chunk and self.chunked: - chunk_len = ("%x\r\n" % len(chunk)).encode("ascii") - chunk = chunk_len + chunk + b"\r\n0\r\n\r\n" - else: - if self.chunked: - if chunk: - chunk_len = ("%x\r\n" % len(chunk)).encode("ascii") - chunk = chunk_len + chunk + b"\r\n0\r\n\r\n" - else: - chunk = b"0\r\n\r\n" - - if chunk: - self._write(chunk) - - await self.drain() - - self._eof = True - self._transport = None - - async def drain(self) -> None: - """Flush the write buffer. - - The intended use is to write - - await w.write(data) - await w.drain() - """ - if self._protocol.transport is not None: - await self._protocol._drain_helper() - - -def _safe_header(string: str) -> str: - if "\r" in string or "\n" in string: - raise ValueError( - "Newline or carriage return detected in headers. " - "Potential header injection attack." - ) - return string - - -def _py_serialize_headers(status_line: str, headers: "CIMultiDict[str]") -> bytes: - headers_gen = (_safe_header(k) + ": " + _safe_header(v) for k, v in headers.items()) - line = status_line + "\r\n" + "\r\n".join(headers_gen) + "\r\n\r\n" - return line.encode("utf-8") - - -_serialize_headers = _py_serialize_headers - -try: - import aiohttp._http_writer as _http_writer # type: ignore[import] - - _c_serialize_headers = _http_writer._serialize_headers - if not NO_EXTENSIONS: - _serialize_headers = _c_serialize_headers -except ImportError: - pass diff --git a/.venv/Lib/site-packages/aiohttp/locks.py b/.venv/Lib/site-packages/aiohttp/locks.py deleted file mode 100644 index df65e3e..0000000 --- a/.venv/Lib/site-packages/aiohttp/locks.py +++ /dev/null @@ -1,41 +0,0 @@ -import asyncio -import collections -from typing import Any, Deque, Optional - - -class EventResultOrError: - """Event asyncio lock helper class. - - Wraps the Event asyncio lock allowing either to awake the - locked Tasks without any error or raising an exception. - - thanks to @vorpalsmith for the simple design. - """ - - def __init__(self, loop: asyncio.AbstractEventLoop) -> None: - self._loop = loop - self._exc = None # type: Optional[BaseException] - self._event = asyncio.Event() - self._waiters = collections.deque() # type: Deque[asyncio.Future[Any]] - - def set(self, exc: Optional[BaseException] = None) -> None: - self._exc = exc - self._event.set() - - async def wait(self) -> Any: - waiter = self._loop.create_task(self._event.wait()) - self._waiters.append(waiter) - try: - val = await waiter - finally: - self._waiters.remove(waiter) - - if self._exc is not None: - raise self._exc - - return val - - def cancel(self) -> None: - """Cancel all waiters""" - for waiter in self._waiters: - waiter.cancel() diff --git a/.venv/Lib/site-packages/aiohttp/log.py b/.venv/Lib/site-packages/aiohttp/log.py deleted file mode 100644 index 3cecea2..0000000 --- a/.venv/Lib/site-packages/aiohttp/log.py +++ /dev/null @@ -1,8 +0,0 @@ -import logging - -access_logger = logging.getLogger("aiohttp.access") -client_logger = logging.getLogger("aiohttp.client") -internal_logger = logging.getLogger("aiohttp.internal") -server_logger = logging.getLogger("aiohttp.server") -web_logger = logging.getLogger("aiohttp.web") -ws_logger = logging.getLogger("aiohttp.websocket") diff --git a/.venv/Lib/site-packages/aiohttp/multipart.py b/.venv/Lib/site-packages/aiohttp/multipart.py deleted file mode 100644 index c84e200..0000000 --- a/.venv/Lib/site-packages/aiohttp/multipart.py +++ /dev/null @@ -1,963 +0,0 @@ -import base64 -import binascii -import json -import re -import uuid -import warnings -import zlib -from collections import deque -from types import TracebackType -from typing import ( - TYPE_CHECKING, - Any, - AsyncIterator, - Deque, - Dict, - Iterator, - List, - Mapping, - Optional, - Sequence, - Tuple, - Type, - Union, - cast, -) -from urllib.parse import parse_qsl, unquote, urlencode - -from multidict import CIMultiDict, CIMultiDictProxy, MultiMapping - -from .hdrs import ( - CONTENT_DISPOSITION, - CONTENT_ENCODING, - CONTENT_LENGTH, - CONTENT_TRANSFER_ENCODING, - CONTENT_TYPE, -) -from .helpers import CHAR, TOKEN, parse_mimetype, reify -from .http import HeadersParser -from .payload import ( - JsonPayload, - LookupError, - Order, - Payload, - StringPayload, - get_payload, - payload_type, -) -from .streams import StreamReader - -__all__ = ( - "MultipartReader", - "MultipartWriter", - "BodyPartReader", - "BadContentDispositionHeader", - "BadContentDispositionParam", - "parse_content_disposition", - "content_disposition_filename", -) - - -if TYPE_CHECKING: # pragma: no cover - from .client_reqrep import ClientResponse - - -class BadContentDispositionHeader(RuntimeWarning): - pass - - -class BadContentDispositionParam(RuntimeWarning): - pass - - -def parse_content_disposition( - header: Optional[str], -) -> Tuple[Optional[str], Dict[str, str]]: - def is_token(string: str) -> bool: - return bool(string) and TOKEN >= set(string) - - def is_quoted(string: str) -> bool: - return string[0] == string[-1] == '"' - - def is_rfc5987(string: str) -> bool: - return is_token(string) and string.count("'") == 2 - - def is_extended_param(string: str) -> bool: - return string.endswith("*") - - def is_continuous_param(string: str) -> bool: - pos = string.find("*") + 1 - if not pos: - return False - substring = string[pos:-1] if string.endswith("*") else string[pos:] - return substring.isdigit() - - def unescape(text: str, *, chars: str = "".join(map(re.escape, CHAR))) -> str: - return re.sub(f"\\\\([{chars}])", "\\1", text) - - if not header: - return None, {} - - disptype, *parts = header.split(";") - if not is_token(disptype): - warnings.warn(BadContentDispositionHeader(header)) - return None, {} - - params = {} # type: Dict[str, str] - while parts: - item = parts.pop(0) - - if "=" not in item: - warnings.warn(BadContentDispositionHeader(header)) - return None, {} - - key, value = item.split("=", 1) - key = key.lower().strip() - value = value.lstrip() - - if key in params: - warnings.warn(BadContentDispositionHeader(header)) - return None, {} - - if not is_token(key): - warnings.warn(BadContentDispositionParam(item)) - continue - - elif is_continuous_param(key): - if is_quoted(value): - value = unescape(value[1:-1]) - elif not is_token(value): - warnings.warn(BadContentDispositionParam(item)) - continue - - elif is_extended_param(key): - if is_rfc5987(value): - encoding, _, value = value.split("'", 2) - encoding = encoding or "utf-8" - else: - warnings.warn(BadContentDispositionParam(item)) - continue - - try: - value = unquote(value, encoding, "strict") - except UnicodeDecodeError: # pragma: nocover - warnings.warn(BadContentDispositionParam(item)) - continue - - else: - failed = True - if is_quoted(value): - failed = False - value = unescape(value[1:-1].lstrip("\\/")) - elif is_token(value): - failed = False - elif parts: - # maybe just ; in filename, in any case this is just - # one case fix, for proper fix we need to redesign parser - _value = f"{value};{parts[0]}" - if is_quoted(_value): - parts.pop(0) - value = unescape(_value[1:-1].lstrip("\\/")) - failed = False - - if failed: - warnings.warn(BadContentDispositionHeader(header)) - return None, {} - - params[key] = value - - return disptype.lower(), params - - -def content_disposition_filename( - params: Mapping[str, str], name: str = "filename" -) -> Optional[str]: - name_suf = "%s*" % name - if not params: - return None - elif name_suf in params: - return params[name_suf] - elif name in params: - return params[name] - else: - parts = [] - fnparams = sorted( - (key, value) for key, value in params.items() if key.startswith(name_suf) - ) - for num, (key, value) in enumerate(fnparams): - _, tail = key.split("*", 1) - if tail.endswith("*"): - tail = tail[:-1] - if tail == str(num): - parts.append(value) - else: - break - if not parts: - return None - value = "".join(parts) - if "'" in value: - encoding, _, value = value.split("'", 2) - encoding = encoding or "utf-8" - return unquote(value, encoding, "strict") - return value - - -class MultipartResponseWrapper: - """Wrapper around the MultipartReader. - - It takes care about - underlying connection and close it when it needs in. - """ - - def __init__( - self, - resp: "ClientResponse", - stream: "MultipartReader", - ) -> None: - self.resp = resp - self.stream = stream - - def __aiter__(self) -> "MultipartResponseWrapper": - return self - - async def __anext__( - self, - ) -> Union["MultipartReader", "BodyPartReader"]: - part = await self.next() - if part is None: - raise StopAsyncIteration - return part - - def at_eof(self) -> bool: - """Returns True when all response data had been read.""" - return self.resp.content.at_eof() - - async def next( - self, - ) -> Optional[Union["MultipartReader", "BodyPartReader"]]: - """Emits next multipart reader object.""" - item = await self.stream.next() - if self.stream.at_eof(): - await self.release() - return item - - async def release(self) -> None: - """Release the connection gracefully. - - All remaining content is read to the void. - """ - await self.resp.release() - - -class BodyPartReader: - """Multipart reader for single body part.""" - - chunk_size = 8192 - - def __init__( - self, boundary: bytes, headers: "CIMultiDictProxy[str]", content: StreamReader - ) -> None: - self.headers = headers - self._boundary = boundary - self._content = content - self._at_eof = False - length = self.headers.get(CONTENT_LENGTH, None) - self._length = int(length) if length is not None else None - self._read_bytes = 0 - # TODO: typeing.Deque is not supported by Python 3.5 - self._unread: Deque[bytes] = deque() - self._prev_chunk = None # type: Optional[bytes] - self._content_eof = 0 - self._cache = {} # type: Dict[str, Any] - - def __aiter__(self) -> AsyncIterator["BodyPartReader"]: - return self # type: ignore[return-value] - - async def __anext__(self) -> bytes: - part = await self.next() - if part is None: - raise StopAsyncIteration - return part - - async def next(self) -> Optional[bytes]: - item = await self.read() - if not item: - return None - return item - - async def read(self, *, decode: bool = False) -> bytes: - """Reads body part data. - - decode: Decodes data following by encoding - method from Content-Encoding header. If it missed - data remains untouched - """ - if self._at_eof: - return b"" - data = bytearray() - while not self._at_eof: - data.extend(await self.read_chunk(self.chunk_size)) - if decode: - return self.decode(data) - return data - - async def read_chunk(self, size: int = chunk_size) -> bytes: - """Reads body part content chunk of the specified size. - - size: chunk size - """ - if self._at_eof: - return b"" - if self._length: - chunk = await self._read_chunk_from_length(size) - else: - chunk = await self._read_chunk_from_stream(size) - - self._read_bytes += len(chunk) - if self._read_bytes == self._length: - self._at_eof = True - if self._at_eof: - clrf = await self._content.readline() - assert ( - b"\r\n" == clrf - ), "reader did not read all the data or it is malformed" - return chunk - - async def _read_chunk_from_length(self, size: int) -> bytes: - # Reads body part content chunk of the specified size. - # The body part must has Content-Length header with proper value. - assert self._length is not None, "Content-Length required for chunked read" - chunk_size = min(size, self._length - self._read_bytes) - chunk = await self._content.read(chunk_size) - return chunk - - async def _read_chunk_from_stream(self, size: int) -> bytes: - # Reads content chunk of body part with unknown length. - # The Content-Length header for body part is not necessary. - assert ( - size >= len(self._boundary) + 2 - ), "Chunk size must be greater or equal than boundary length + 2" - first_chunk = self._prev_chunk is None - if first_chunk: - self._prev_chunk = await self._content.read(size) - - chunk = await self._content.read(size) - self._content_eof += int(self._content.at_eof()) - assert self._content_eof < 3, "Reading after EOF" - assert self._prev_chunk is not None - window = self._prev_chunk + chunk - sub = b"\r\n" + self._boundary - if first_chunk: - idx = window.find(sub) - else: - idx = window.find(sub, max(0, len(self._prev_chunk) - len(sub))) - if idx >= 0: - # pushing boundary back to content - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=DeprecationWarning) - self._content.unread_data(window[idx:]) - if size > idx: - self._prev_chunk = self._prev_chunk[:idx] - chunk = window[len(self._prev_chunk) : idx] - if not chunk: - self._at_eof = True - result = self._prev_chunk - self._prev_chunk = chunk - return result - - async def readline(self) -> bytes: - """Reads body part by line by line.""" - if self._at_eof: - return b"" - - if self._unread: - line = self._unread.popleft() - else: - line = await self._content.readline() - - if line.startswith(self._boundary): - # the very last boundary may not come with \r\n, - # so set single rules for everyone - sline = line.rstrip(b"\r\n") - boundary = self._boundary - last_boundary = self._boundary + b"--" - # ensure that we read exactly the boundary, not something alike - if sline == boundary or sline == last_boundary: - self._at_eof = True - self._unread.append(line) - return b"" - else: - next_line = await self._content.readline() - if next_line.startswith(self._boundary): - line = line[:-2] # strip CRLF but only once - self._unread.append(next_line) - - return line - - async def release(self) -> None: - """Like read(), but reads all the data to the void.""" - if self._at_eof: - return - while not self._at_eof: - await self.read_chunk(self.chunk_size) - - async def text(self, *, encoding: Optional[str] = None) -> str: - """Like read(), but assumes that body part contains text data.""" - data = await self.read(decode=True) - # see https://www.w3.org/TR/html5/forms.html#multipart/form-data-encoding-algorithm # NOQA - # and https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-send # NOQA - encoding = encoding or self.get_charset(default="utf-8") - return data.decode(encoding) - - async def json(self, *, encoding: Optional[str] = None) -> Optional[Dict[str, Any]]: - """Like read(), but assumes that body parts contains JSON data.""" - data = await self.read(decode=True) - if not data: - return None - encoding = encoding or self.get_charset(default="utf-8") - return cast(Dict[str, Any], json.loads(data.decode(encoding))) - - async def form(self, *, encoding: Optional[str] = None) -> List[Tuple[str, str]]: - """Like read(), but assumes that body parts contain form urlencoded data.""" - data = await self.read(decode=True) - if not data: - return [] - if encoding is not None: - real_encoding = encoding - else: - real_encoding = self.get_charset(default="utf-8") - return parse_qsl( - data.rstrip().decode(real_encoding), - keep_blank_values=True, - encoding=real_encoding, - ) - - def at_eof(self) -> bool: - """Returns True if the boundary was reached or False otherwise.""" - return self._at_eof - - def decode(self, data: bytes) -> bytes: - """Decodes data. - - Decoding is done according the specified Content-Encoding - or Content-Transfer-Encoding headers value. - """ - if CONTENT_TRANSFER_ENCODING in self.headers: - data = self._decode_content_transfer(data) - if CONTENT_ENCODING in self.headers: - return self._decode_content(data) - return data - - def _decode_content(self, data: bytes) -> bytes: - encoding = self.headers.get(CONTENT_ENCODING, "").lower() - - if encoding == "deflate": - return zlib.decompress(data, -zlib.MAX_WBITS) - elif encoding == "gzip": - return zlib.decompress(data, 16 + zlib.MAX_WBITS) - elif encoding == "identity": - return data - else: - raise RuntimeError(f"unknown content encoding: {encoding}") - - def _decode_content_transfer(self, data: bytes) -> bytes: - encoding = self.headers.get(CONTENT_TRANSFER_ENCODING, "").lower() - - if encoding == "base64": - return base64.b64decode(data) - elif encoding == "quoted-printable": - return binascii.a2b_qp(data) - elif encoding in ("binary", "8bit", "7bit"): - return data - else: - raise RuntimeError( - "unknown content transfer encoding: {}" "".format(encoding) - ) - - def get_charset(self, default: str) -> str: - """Returns charset parameter from Content-Type header or default.""" - ctype = self.headers.get(CONTENT_TYPE, "") - mimetype = parse_mimetype(ctype) - return mimetype.parameters.get("charset", default) - - @reify - def name(self) -> Optional[str]: - """Returns name specified in Content-Disposition header. - - If the header is missing or malformed, returns None. - """ - _, params = parse_content_disposition(self.headers.get(CONTENT_DISPOSITION)) - return content_disposition_filename(params, "name") - - @reify - def filename(self) -> Optional[str]: - """Returns filename specified in Content-Disposition header. - - Returns None if the header is missing or malformed. - """ - _, params = parse_content_disposition(self.headers.get(CONTENT_DISPOSITION)) - return content_disposition_filename(params, "filename") - - -@payload_type(BodyPartReader, order=Order.try_first) -class BodyPartReaderPayload(Payload): - def __init__(self, value: BodyPartReader, *args: Any, **kwargs: Any) -> None: - super().__init__(value, *args, **kwargs) - - params = {} # type: Dict[str, str] - if value.name is not None: - params["name"] = value.name - if value.filename is not None: - params["filename"] = value.filename - - if params: - self.set_content_disposition("attachment", True, **params) - - async def write(self, writer: Any) -> None: - field = self._value - chunk = await field.read_chunk(size=2 ** 16) - while chunk: - await writer.write(field.decode(chunk)) - chunk = await field.read_chunk(size=2 ** 16) - - -class MultipartReader: - """Multipart body reader.""" - - #: Response wrapper, used when multipart readers constructs from response. - response_wrapper_cls = MultipartResponseWrapper - #: Multipart reader class, used to handle multipart/* body parts. - #: None points to type(self) - multipart_reader_cls = None - #: Body part reader class for non multipart/* content types. - part_reader_cls = BodyPartReader - - def __init__(self, headers: Mapping[str, str], content: StreamReader) -> None: - self.headers = headers - self._boundary = ("--" + self._get_boundary()).encode() - self._content = content - self._last_part = ( - None - ) # type: Optional[Union['MultipartReader', BodyPartReader]] - self._at_eof = False - self._at_bof = True - self._unread = [] # type: List[bytes] - - def __aiter__( - self, - ) -> AsyncIterator["BodyPartReader"]: - return self # type: ignore[return-value] - - async def __anext__( - self, - ) -> Optional[Union["MultipartReader", BodyPartReader]]: - part = await self.next() - if part is None: - raise StopAsyncIteration - return part - - @classmethod - def from_response( - cls, - response: "ClientResponse", - ) -> MultipartResponseWrapper: - """Constructs reader instance from HTTP response. - - :param response: :class:`~aiohttp.client.ClientResponse` instance - """ - obj = cls.response_wrapper_cls( - response, cls(response.headers, response.content) - ) - return obj - - def at_eof(self) -> bool: - """Returns True if the final boundary was reached, false otherwise.""" - return self._at_eof - - async def next( - self, - ) -> Optional[Union["MultipartReader", BodyPartReader]]: - """Emits the next multipart body part.""" - # So, if we're at BOF, we need to skip till the boundary. - if self._at_eof: - return None - await self._maybe_release_last_part() - if self._at_bof: - await self._read_until_first_boundary() - self._at_bof = False - else: - await self._read_boundary() - if self._at_eof: # we just read the last boundary, nothing to do there - return None - self._last_part = await self.fetch_next_part() - return self._last_part - - async def release(self) -> None: - """Reads all the body parts to the void till the final boundary.""" - while not self._at_eof: - item = await self.next() - if item is None: - break - await item.release() - - async def fetch_next_part( - self, - ) -> Union["MultipartReader", BodyPartReader]: - """Returns the next body part reader.""" - headers = await self._read_headers() - return self._get_part_reader(headers) - - def _get_part_reader( - self, - headers: "CIMultiDictProxy[str]", - ) -> Union["MultipartReader", BodyPartReader]: - """Dispatches the response by the `Content-Type` header. - - Returns a suitable reader instance. - - :param dict headers: Response headers - """ - ctype = headers.get(CONTENT_TYPE, "") - mimetype = parse_mimetype(ctype) - - if mimetype.type == "multipart": - if self.multipart_reader_cls is None: - return type(self)(headers, self._content) - return self.multipart_reader_cls(headers, self._content) - else: - return self.part_reader_cls(self._boundary, headers, self._content) - - def _get_boundary(self) -> str: - mimetype = parse_mimetype(self.headers[CONTENT_TYPE]) - - assert mimetype.type == "multipart", "multipart/* content type expected" - - if "boundary" not in mimetype.parameters: - raise ValueError( - "boundary missed for Content-Type: %s" % self.headers[CONTENT_TYPE] - ) - - boundary = mimetype.parameters["boundary"] - if len(boundary) > 70: - raise ValueError("boundary %r is too long (70 chars max)" % boundary) - - return boundary - - async def _readline(self) -> bytes: - if self._unread: - return self._unread.pop() - return await self._content.readline() - - async def _read_until_first_boundary(self) -> None: - while True: - chunk = await self._readline() - if chunk == b"": - raise ValueError( - "Could not find starting boundary %r" % (self._boundary) - ) - chunk = chunk.rstrip() - if chunk == self._boundary: - return - elif chunk == self._boundary + b"--": - self._at_eof = True - return - - async def _read_boundary(self) -> None: - chunk = (await self._readline()).rstrip() - if chunk == self._boundary: - pass - elif chunk == self._boundary + b"--": - self._at_eof = True - epilogue = await self._readline() - next_line = await self._readline() - - # the epilogue is expected and then either the end of input or the - # parent multipart boundary, if the parent boundary is found then - # it should be marked as unread and handed to the parent for - # processing - if next_line[:2] == b"--": - self._unread.append(next_line) - # otherwise the request is likely missing an epilogue and both - # lines should be passed to the parent for processing - # (this handles the old behavior gracefully) - else: - self._unread.extend([next_line, epilogue]) - else: - raise ValueError(f"Invalid boundary {chunk!r}, expected {self._boundary!r}") - - async def _read_headers(self) -> "CIMultiDictProxy[str]": - lines = [b""] - while True: - chunk = await self._content.readline() - chunk = chunk.strip() - lines.append(chunk) - if not chunk: - break - parser = HeadersParser() - headers, raw_headers = parser.parse_headers(lines) - return headers - - async def _maybe_release_last_part(self) -> None: - """Ensures that the last read body part is read completely.""" - if self._last_part is not None: - if not self._last_part.at_eof(): - await self._last_part.release() - self._unread.extend(self._last_part._unread) - self._last_part = None - - -_Part = Tuple[Payload, str, str] - - -class MultipartWriter(Payload): - """Multipart body writer.""" - - def __init__(self, subtype: str = "mixed", boundary: Optional[str] = None) -> None: - boundary = boundary if boundary is not None else uuid.uuid4().hex - # The underlying Payload API demands a str (utf-8), not bytes, - # so we need to ensure we don't lose anything during conversion. - # As a result, require the boundary to be ASCII only. - # In both situations. - - try: - self._boundary = boundary.encode("ascii") - except UnicodeEncodeError: - raise ValueError("boundary should contain ASCII only chars") from None - ctype = f"multipart/{subtype}; boundary={self._boundary_value}" - - super().__init__(None, content_type=ctype) - - self._parts = [] # type: List[_Part] - - def __enter__(self) -> "MultipartWriter": - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - pass - - def __iter__(self) -> Iterator[_Part]: - return iter(self._parts) - - def __len__(self) -> int: - return len(self._parts) - - def __bool__(self) -> bool: - return True - - _valid_tchar_regex = re.compile(br"\A[!#$%&'*+\-.^_`|~\w]+\Z") - _invalid_qdtext_char_regex = re.compile(br"[\x00-\x08\x0A-\x1F\x7F]") - - @property - def _boundary_value(self) -> str: - """Wrap boundary parameter value in quotes, if necessary. - - Reads self.boundary and returns a unicode sting. - """ - # Refer to RFCs 7231, 7230, 5234. - # - # parameter = token "=" ( token / quoted-string ) - # token = 1*tchar - # quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE - # qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text - # obs-text = %x80-FF - # quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) - # tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" - # / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" - # / DIGIT / ALPHA - # ; any VCHAR, except delimiters - # VCHAR = %x21-7E - value = self._boundary - if re.match(self._valid_tchar_regex, value): - return value.decode("ascii") # cannot fail - - if re.search(self._invalid_qdtext_char_regex, value): - raise ValueError("boundary value contains invalid characters") - - # escape %x5C and %x22 - quoted_value_content = value.replace(b"\\", b"\\\\") - quoted_value_content = quoted_value_content.replace(b'"', b'\\"') - - return '"' + quoted_value_content.decode("ascii") + '"' - - @property - def boundary(self) -> str: - return self._boundary.decode("ascii") - - def append(self, obj: Any, headers: Optional[MultiMapping[str]] = None) -> Payload: - if headers is None: - headers = CIMultiDict() - - if isinstance(obj, Payload): - obj.headers.update(headers) - return self.append_payload(obj) - else: - try: - payload = get_payload(obj, headers=headers) - except LookupError: - raise TypeError("Cannot create payload from %r" % obj) - else: - return self.append_payload(payload) - - def append_payload(self, payload: Payload) -> Payload: - """Adds a new body part to multipart writer.""" - # compression - encoding = payload.headers.get( - CONTENT_ENCODING, - "", - ).lower() # type: Optional[str] - if encoding and encoding not in ("deflate", "gzip", "identity"): - raise RuntimeError(f"unknown content encoding: {encoding}") - if encoding == "identity": - encoding = None - - # te encoding - te_encoding = payload.headers.get( - CONTENT_TRANSFER_ENCODING, - "", - ).lower() # type: Optional[str] - if te_encoding not in ("", "base64", "quoted-printable", "binary"): - raise RuntimeError( - "unknown content transfer encoding: {}" "".format(te_encoding) - ) - if te_encoding == "binary": - te_encoding = None - - # size - size = payload.size - if size is not None and not (encoding or te_encoding): - payload.headers[CONTENT_LENGTH] = str(size) - - self._parts.append((payload, encoding, te_encoding)) # type: ignore[arg-type] - return payload - - def append_json( - self, obj: Any, headers: Optional[MultiMapping[str]] = None - ) -> Payload: - """Helper to append JSON part.""" - if headers is None: - headers = CIMultiDict() - - return self.append_payload(JsonPayload(obj, headers=headers)) - - def append_form( - self, - obj: Union[Sequence[Tuple[str, str]], Mapping[str, str]], - headers: Optional[MultiMapping[str]] = None, - ) -> Payload: - """Helper to append form urlencoded part.""" - assert isinstance(obj, (Sequence, Mapping)) - - if headers is None: - headers = CIMultiDict() - - if isinstance(obj, Mapping): - obj = list(obj.items()) - data = urlencode(obj, doseq=True) - - return self.append_payload( - StringPayload( - data, headers=headers, content_type="application/x-www-form-urlencoded" - ) - ) - - @property - def size(self) -> Optional[int]: - """Size of the payload.""" - total = 0 - for part, encoding, te_encoding in self._parts: - if encoding or te_encoding or part.size is None: - return None - - total += int( - 2 - + len(self._boundary) - + 2 - + part.size # b'--'+self._boundary+b'\r\n' - + len(part._binary_headers) - + 2 # b'\r\n' - ) - - total += 2 + len(self._boundary) + 4 # b'--'+self._boundary+b'--\r\n' - return total - - async def write(self, writer: Any, close_boundary: bool = True) -> None: - """Write body.""" - for part, encoding, te_encoding in self._parts: - await writer.write(b"--" + self._boundary + b"\r\n") - await writer.write(part._binary_headers) - - if encoding or te_encoding: - w = MultipartPayloadWriter(writer) - if encoding: - w.enable_compression(encoding) - if te_encoding: - w.enable_encoding(te_encoding) - await part.write(w) # type: ignore[arg-type] - await w.write_eof() - else: - await part.write(writer) - - await writer.write(b"\r\n") - - if close_boundary: - await writer.write(b"--" + self._boundary + b"--\r\n") - - -class MultipartPayloadWriter: - def __init__(self, writer: Any) -> None: - self._writer = writer - self._encoding = None # type: Optional[str] - self._compress = None # type: Any - self._encoding_buffer = None # type: Optional[bytearray] - - def enable_encoding(self, encoding: str) -> None: - if encoding == "base64": - self._encoding = encoding - self._encoding_buffer = bytearray() - elif encoding == "quoted-printable": - self._encoding = "quoted-printable" - - def enable_compression( - self, encoding: str = "deflate", strategy: int = zlib.Z_DEFAULT_STRATEGY - ) -> None: - zlib_mode = 16 + zlib.MAX_WBITS if encoding == "gzip" else -zlib.MAX_WBITS - self._compress = zlib.compressobj(wbits=zlib_mode, strategy=strategy) - - async def write_eof(self) -> None: - if self._compress is not None: - chunk = self._compress.flush() - if chunk: - self._compress = None - await self.write(chunk) - - if self._encoding == "base64": - if self._encoding_buffer: - await self._writer.write(base64.b64encode(self._encoding_buffer)) - - async def write(self, chunk: bytes) -> None: - if self._compress is not None: - if chunk: - chunk = self._compress.compress(chunk) - if not chunk: - return - - if self._encoding == "base64": - buf = self._encoding_buffer - assert buf is not None - buf.extend(chunk) - - if buf: - div, mod = divmod(len(buf), 3) - enc_chunk, self._encoding_buffer = (buf[: div * 3], buf[div * 3 :]) - if enc_chunk: - b64chunk = base64.b64encode(enc_chunk) - await self._writer.write(b64chunk) - elif self._encoding == "quoted-printable": - await self._writer.write(binascii.b2a_qp(chunk)) - else: - await self._writer.write(chunk) diff --git a/.venv/Lib/site-packages/aiohttp/payload.py b/.venv/Lib/site-packages/aiohttp/payload.py deleted file mode 100644 index 2ee90be..0000000 --- a/.venv/Lib/site-packages/aiohttp/payload.py +++ /dev/null @@ -1,465 +0,0 @@ -import asyncio -import enum -import io -import json -import mimetypes -import os -import warnings -from abc import ABC, abstractmethod -from itertools import chain -from typing import ( - IO, - TYPE_CHECKING, - Any, - ByteString, - Dict, - Iterable, - Optional, - TextIO, - Tuple, - Type, - Union, -) - -from multidict import CIMultiDict - -from . import hdrs -from .abc import AbstractStreamWriter -from .helpers import ( - PY_36, - content_disposition_header, - guess_filename, - parse_mimetype, - sentinel, -) -from .streams import StreamReader -from .typedefs import Final, JSONEncoder, _CIMultiDict - -__all__ = ( - "PAYLOAD_REGISTRY", - "get_payload", - "payload_type", - "Payload", - "BytesPayload", - "StringPayload", - "IOBasePayload", - "BytesIOPayload", - "BufferedReaderPayload", - "TextIOPayload", - "StringIOPayload", - "JsonPayload", - "AsyncIterablePayload", -) - -TOO_LARGE_BYTES_BODY: Final[int] = 2 ** 20 # 1 MB - -if TYPE_CHECKING: # pragma: no cover - from typing import List - - -class LookupError(Exception): - pass - - -class Order(str, enum.Enum): - normal = "normal" - try_first = "try_first" - try_last = "try_last" - - -def get_payload(data: Any, *args: Any, **kwargs: Any) -> "Payload": - return PAYLOAD_REGISTRY.get(data, *args, **kwargs) - - -def register_payload( - factory: Type["Payload"], type: Any, *, order: Order = Order.normal -) -> None: - PAYLOAD_REGISTRY.register(factory, type, order=order) - - -class payload_type: - def __init__(self, type: Any, *, order: Order = Order.normal) -> None: - self.type = type - self.order = order - - def __call__(self, factory: Type["Payload"]) -> Type["Payload"]: - register_payload(factory, self.type, order=self.order) - return factory - - -PayloadType = Type["Payload"] -_PayloadRegistryItem = Tuple[PayloadType, Any] - - -class PayloadRegistry: - """Payload registry. - - note: we need zope.interface for more efficient adapter search - """ - - def __init__(self) -> None: - self._first = [] # type: List[_PayloadRegistryItem] - self._normal = [] # type: List[_PayloadRegistryItem] - self._last = [] # type: List[_PayloadRegistryItem] - - def get( - self, - data: Any, - *args: Any, - _CHAIN: "Type[chain[_PayloadRegistryItem]]" = chain, - **kwargs: Any, - ) -> "Payload": - if isinstance(data, Payload): - return data - for factory, type in _CHAIN(self._first, self._normal, self._last): - if isinstance(data, type): - return factory(data, *args, **kwargs) - - raise LookupError() - - def register( - self, factory: PayloadType, type: Any, *, order: Order = Order.normal - ) -> None: - if order is Order.try_first: - self._first.append((factory, type)) - elif order is Order.normal: - self._normal.append((factory, type)) - elif order is Order.try_last: - self._last.append((factory, type)) - else: - raise ValueError(f"Unsupported order {order!r}") - - -class Payload(ABC): - - _default_content_type = "application/octet-stream" # type: str - _size = None # type: Optional[int] - - def __init__( - self, - value: Any, - headers: Optional[ - Union[_CIMultiDict, Dict[str, str], Iterable[Tuple[str, str]]] - ] = None, - content_type: Optional[str] = sentinel, - filename: Optional[str] = None, - encoding: Optional[str] = None, - **kwargs: Any, - ) -> None: - self._encoding = encoding - self._filename = filename - self._headers = CIMultiDict() # type: _CIMultiDict - self._value = value - if content_type is not sentinel and content_type is not None: - self._headers[hdrs.CONTENT_TYPE] = content_type - elif self._filename is not None: - content_type = mimetypes.guess_type(self._filename)[0] - if content_type is None: - content_type = self._default_content_type - self._headers[hdrs.CONTENT_TYPE] = content_type - else: - self._headers[hdrs.CONTENT_TYPE] = self._default_content_type - self._headers.update(headers or {}) - - @property - def size(self) -> Optional[int]: - """Size of the payload.""" - return self._size - - @property - def filename(self) -> Optional[str]: - """Filename of the payload.""" - return self._filename - - @property - def headers(self) -> _CIMultiDict: - """Custom item headers""" - return self._headers - - @property - def _binary_headers(self) -> bytes: - return ( - "".join([k + ": " + v + "\r\n" for k, v in self.headers.items()]).encode( - "utf-8" - ) - + b"\r\n" - ) - - @property - def encoding(self) -> Optional[str]: - """Payload encoding""" - return self._encoding - - @property - def content_type(self) -> str: - """Content type""" - return self._headers[hdrs.CONTENT_TYPE] - - def set_content_disposition( - self, - disptype: str, - quote_fields: bool = True, - _charset: str = "utf-8", - **params: Any, - ) -> None: - """Sets ``Content-Disposition`` header.""" - self._headers[hdrs.CONTENT_DISPOSITION] = content_disposition_header( - disptype, quote_fields=quote_fields, _charset=_charset, **params - ) - - @abstractmethod - async def write(self, writer: AbstractStreamWriter) -> None: - """Write payload. - - writer is an AbstractStreamWriter instance: - """ - - -class BytesPayload(Payload): - def __init__(self, value: ByteString, *args: Any, **kwargs: Any) -> None: - if not isinstance(value, (bytes, bytearray, memoryview)): - raise TypeError(f"value argument must be byte-ish, not {type(value)!r}") - - if "content_type" not in kwargs: - kwargs["content_type"] = "application/octet-stream" - - super().__init__(value, *args, **kwargs) - - if isinstance(value, memoryview): - self._size = value.nbytes - else: - self._size = len(value) - - if self._size > TOO_LARGE_BYTES_BODY: - if PY_36: - kwargs = {"source": self} - else: - kwargs = {} - warnings.warn( - "Sending a large body directly with raw bytes might" - " lock the event loop. You should probably pass an " - "io.BytesIO object instead", - ResourceWarning, - **kwargs, - ) - - async def write(self, writer: AbstractStreamWriter) -> None: - await writer.write(self._value) - - -class StringPayload(BytesPayload): - def __init__( - self, - value: str, - *args: Any, - encoding: Optional[str] = None, - content_type: Optional[str] = None, - **kwargs: Any, - ) -> None: - - if encoding is None: - if content_type is None: - real_encoding = "utf-8" - content_type = "text/plain; charset=utf-8" - else: - mimetype = parse_mimetype(content_type) - real_encoding = mimetype.parameters.get("charset", "utf-8") - else: - if content_type is None: - content_type = "text/plain; charset=%s" % encoding - real_encoding = encoding - - super().__init__( - value.encode(real_encoding), - encoding=real_encoding, - content_type=content_type, - *args, - **kwargs, - ) - - -class StringIOPayload(StringPayload): - def __init__(self, value: IO[str], *args: Any, **kwargs: Any) -> None: - super().__init__(value.read(), *args, **kwargs) - - -class IOBasePayload(Payload): - _value: IO[Any] - - def __init__( - self, value: IO[Any], disposition: str = "attachment", *args: Any, **kwargs: Any - ) -> None: - if "filename" not in kwargs: - kwargs["filename"] = guess_filename(value) - - super().__init__(value, *args, **kwargs) - - if self._filename is not None and disposition is not None: - if hdrs.CONTENT_DISPOSITION not in self.headers: - self.set_content_disposition(disposition, filename=self._filename) - - async def write(self, writer: AbstractStreamWriter) -> None: - loop = asyncio.get_event_loop() - try: - chunk = await loop.run_in_executor(None, self._value.read, 2 ** 16) - while chunk: - await writer.write(chunk) - chunk = await loop.run_in_executor(None, self._value.read, 2 ** 16) - finally: - await loop.run_in_executor(None, self._value.close) - - -class TextIOPayload(IOBasePayload): - _value: TextIO - - def __init__( - self, - value: TextIO, - *args: Any, - encoding: Optional[str] = None, - content_type: Optional[str] = None, - **kwargs: Any, - ) -> None: - - if encoding is None: - if content_type is None: - encoding = "utf-8" - content_type = "text/plain; charset=utf-8" - else: - mimetype = parse_mimetype(content_type) - encoding = mimetype.parameters.get("charset", "utf-8") - else: - if content_type is None: - content_type = "text/plain; charset=%s" % encoding - - super().__init__( - value, - content_type=content_type, - encoding=encoding, - *args, - **kwargs, - ) - - @property - def size(self) -> Optional[int]: - try: - return os.fstat(self._value.fileno()).st_size - self._value.tell() - except OSError: - return None - - async def write(self, writer: AbstractStreamWriter) -> None: - loop = asyncio.get_event_loop() - try: - chunk = await loop.run_in_executor(None, self._value.read, 2 ** 16) - while chunk: - data = ( - chunk.encode(encoding=self._encoding) - if self._encoding - else chunk.encode() - ) - await writer.write(data) - chunk = await loop.run_in_executor(None, self._value.read, 2 ** 16) - finally: - await loop.run_in_executor(None, self._value.close) - - -class BytesIOPayload(IOBasePayload): - @property - def size(self) -> int: - position = self._value.tell() - end = self._value.seek(0, os.SEEK_END) - self._value.seek(position) - return end - position - - -class BufferedReaderPayload(IOBasePayload): - @property - def size(self) -> Optional[int]: - try: - return os.fstat(self._value.fileno()).st_size - self._value.tell() - except OSError: - # data.fileno() is not supported, e.g. - # io.BufferedReader(io.BytesIO(b'data')) - return None - - -class JsonPayload(BytesPayload): - def __init__( - self, - value: Any, - encoding: str = "utf-8", - content_type: str = "application/json", - dumps: JSONEncoder = json.dumps, - *args: Any, - **kwargs: Any, - ) -> None: - - super().__init__( - dumps(value).encode(encoding), - content_type=content_type, - encoding=encoding, - *args, - **kwargs, - ) - - -if TYPE_CHECKING: # pragma: no cover - from typing import AsyncIterable, AsyncIterator - - _AsyncIterator = AsyncIterator[bytes] - _AsyncIterable = AsyncIterable[bytes] -else: - from collections.abc import AsyncIterable, AsyncIterator - - _AsyncIterator = AsyncIterator - _AsyncIterable = AsyncIterable - - -class AsyncIterablePayload(Payload): - - _iter = None # type: Optional[_AsyncIterator] - - def __init__(self, value: _AsyncIterable, *args: Any, **kwargs: Any) -> None: - if not isinstance(value, AsyncIterable): - raise TypeError( - "value argument must support " - "collections.abc.AsyncIterablebe interface, " - "got {!r}".format(type(value)) - ) - - if "content_type" not in kwargs: - kwargs["content_type"] = "application/octet-stream" - - super().__init__(value, *args, **kwargs) - - self._iter = value.__aiter__() - - async def write(self, writer: AbstractStreamWriter) -> None: - if self._iter: - try: - # iter is not None check prevents rare cases - # when the case iterable is used twice - while True: - chunk = await self._iter.__anext__() - await writer.write(chunk) - except StopAsyncIteration: - self._iter = None - - -class StreamReaderPayload(AsyncIterablePayload): - def __init__(self, value: StreamReader, *args: Any, **kwargs: Any) -> None: - super().__init__(value.iter_any(), *args, **kwargs) - - -PAYLOAD_REGISTRY = PayloadRegistry() -PAYLOAD_REGISTRY.register(BytesPayload, (bytes, bytearray, memoryview)) -PAYLOAD_REGISTRY.register(StringPayload, str) -PAYLOAD_REGISTRY.register(StringIOPayload, io.StringIO) -PAYLOAD_REGISTRY.register(TextIOPayload, io.TextIOBase) -PAYLOAD_REGISTRY.register(BytesIOPayload, io.BytesIO) -PAYLOAD_REGISTRY.register(BufferedReaderPayload, (io.BufferedReader, io.BufferedRandom)) -PAYLOAD_REGISTRY.register(IOBasePayload, io.IOBase) -PAYLOAD_REGISTRY.register(StreamReaderPayload, StreamReader) -# try_last for giving a chance to more specialized async interables like -# multidict.BodyPartReaderPayload override the default -PAYLOAD_REGISTRY.register(AsyncIterablePayload, AsyncIterable, order=Order.try_last) diff --git a/.venv/Lib/site-packages/aiohttp/payload_streamer.py b/.venv/Lib/site-packages/aiohttp/payload_streamer.py deleted file mode 100644 index 9f8b8bc..0000000 --- a/.venv/Lib/site-packages/aiohttp/payload_streamer.py +++ /dev/null @@ -1,75 +0,0 @@ -""" -Payload implemenation for coroutines as data provider. - -As a simple case, you can upload data from file:: - - @aiohttp.streamer - async def file_sender(writer, file_name=None): - with open(file_name, 'rb') as f: - chunk = f.read(2**16) - while chunk: - await writer.write(chunk) - - chunk = f.read(2**16) - -Then you can use `file_sender` like this: - - async with session.post('http://httpbin.org/post', - data=file_sender(file_name='huge_file')) as resp: - print(await resp.text()) - -..note:: Coroutine must accept `writer` as first argument - -""" - -import types -import warnings -from typing import Any, Awaitable, Callable, Dict, Tuple - -from .abc import AbstractStreamWriter -from .payload import Payload, payload_type - -__all__ = ("streamer",) - - -class _stream_wrapper: - def __init__( - self, - coro: Callable[..., Awaitable[None]], - args: Tuple[Any, ...], - kwargs: Dict[str, Any], - ) -> None: - self.coro = types.coroutine(coro) - self.args = args - self.kwargs = kwargs - - async def __call__(self, writer: AbstractStreamWriter) -> None: - await self.coro(writer, *self.args, **self.kwargs) # type: ignore[operator] - - -class streamer: - def __init__(self, coro: Callable[..., Awaitable[None]]) -> None: - warnings.warn( - "@streamer is deprecated, use async generators instead", - DeprecationWarning, - stacklevel=2, - ) - self.coro = coro - - def __call__(self, *args: Any, **kwargs: Any) -> _stream_wrapper: - return _stream_wrapper(self.coro, args, kwargs) - - -@payload_type(_stream_wrapper) -class StreamWrapperPayload(Payload): - async def write(self, writer: AbstractStreamWriter) -> None: - await self._value(writer) - - -@payload_type(streamer) -class StreamPayload(StreamWrapperPayload): - def __init__(self, value: Any, *args: Any, **kwargs: Any) -> None: - super().__init__(value(), *args, **kwargs) - - async def write(self, writer: AbstractStreamWriter) -> None: - await self._value(writer) diff --git a/.venv/Lib/site-packages/aiohttp/py.typed b/.venv/Lib/site-packages/aiohttp/py.typed deleted file mode 100644 index f5642f7..0000000 --- a/.venv/Lib/site-packages/aiohttp/py.typed +++ /dev/null @@ -1 +0,0 @@ -Marker diff --git a/.venv/Lib/site-packages/aiohttp/pytest_plugin.py b/.venv/Lib/site-packages/aiohttp/pytest_plugin.py deleted file mode 100644 index dd9a9f6..0000000 --- a/.venv/Lib/site-packages/aiohttp/pytest_plugin.py +++ /dev/null @@ -1,391 +0,0 @@ -import asyncio -import contextlib -import warnings -from collections.abc import Callable -from typing import Any, Awaitable, Callable, Dict, Generator, Optional, Union - -import pytest - -from aiohttp.helpers import PY_37, isasyncgenfunction -from aiohttp.web import Application - -from .test_utils import ( - BaseTestServer, - RawTestServer, - TestClient, - TestServer, - loop_context, - setup_test_loop, - teardown_test_loop, - unused_port as _unused_port, -) - -try: - import uvloop -except ImportError: # pragma: no cover - uvloop = None - -try: - import tokio -except ImportError: # pragma: no cover - tokio = None - -AiohttpClient = Callable[[Union[Application, BaseTestServer]], Awaitable[TestClient]] - - -def pytest_addoption(parser): # type: ignore[no-untyped-def] - parser.addoption( - "--aiohttp-fast", - action="store_true", - default=False, - help="run tests faster by disabling extra checks", - ) - parser.addoption( - "--aiohttp-loop", - action="store", - default="pyloop", - help="run tests with specific loop: pyloop, uvloop, tokio or all", - ) - parser.addoption( - "--aiohttp-enable-loop-debug", - action="store_true", - default=False, - help="enable event loop debug mode", - ) - - -def pytest_fixture_setup(fixturedef): # type: ignore[no-untyped-def] - """Set up pytest fixture. - - Allow fixtures to be coroutines. Run coroutine fixtures in an event loop. - """ - func = fixturedef.func - - if isasyncgenfunction(func): - # async generator fixture - is_async_gen = True - elif asyncio.iscoroutinefunction(func): - # regular async fixture - is_async_gen = False - else: - # not an async fixture, nothing to do - return - - strip_request = False - if "request" not in fixturedef.argnames: - fixturedef.argnames += ("request",) - strip_request = True - - def wrapper(*args, **kwargs): # type: ignore[no-untyped-def] - request = kwargs["request"] - if strip_request: - del kwargs["request"] - - # if neither the fixture nor the test use the 'loop' fixture, - # 'getfixturevalue' will fail because the test is not parameterized - # (this can be removed someday if 'loop' is no longer parameterized) - if "loop" not in request.fixturenames: - raise Exception( - "Asynchronous fixtures must depend on the 'loop' fixture or " - "be used in tests depending from it." - ) - - _loop = request.getfixturevalue("loop") - - if is_async_gen: - # for async generators, we need to advance the generator once, - # then advance it again in a finalizer - gen = func(*args, **kwargs) - - def finalizer(): # type: ignore[no-untyped-def] - try: - return _loop.run_until_complete(gen.__anext__()) - except StopAsyncIteration: - pass - - request.addfinalizer(finalizer) - return _loop.run_until_complete(gen.__anext__()) - else: - return _loop.run_until_complete(func(*args, **kwargs)) - - fixturedef.func = wrapper - - -@pytest.fixture -def fast(request): # type: ignore[no-untyped-def] - """--fast config option""" - return request.config.getoption("--aiohttp-fast") - - -@pytest.fixture -def loop_debug(request): # type: ignore[no-untyped-def] - """--enable-loop-debug config option""" - return request.config.getoption("--aiohttp-enable-loop-debug") - - -@contextlib.contextmanager -def _runtime_warning_context(): # type: ignore[no-untyped-def] - """Context manager which checks for RuntimeWarnings. - - This exists specifically to - avoid "coroutine 'X' was never awaited" warnings being missed. - - If RuntimeWarnings occur in the context a RuntimeError is raised. - """ - with warnings.catch_warnings(record=True) as _warnings: - yield - rw = [ - "{w.filename}:{w.lineno}:{w.message}".format(w=w) - for w in _warnings - if w.category == RuntimeWarning - ] - if rw: - raise RuntimeError( - "{} Runtime Warning{},\n{}".format( - len(rw), "" if len(rw) == 1 else "s", "\n".join(rw) - ) - ) - - -@contextlib.contextmanager -def _passthrough_loop_context(loop, fast=False): # type: ignore[no-untyped-def] - """Passthrough loop context. - - Sets up and tears down a loop unless one is passed in via the loop - argument when it's passed straight through. - """ - if loop: - # loop already exists, pass it straight through - yield loop - else: - # this shadows loop_context's standard behavior - loop = setup_test_loop() - yield loop - teardown_test_loop(loop, fast=fast) - - -def pytest_pycollect_makeitem(collector, name, obj): # type: ignore[no-untyped-def] - """Fix pytest collecting for coroutines.""" - if collector.funcnamefilter(name) and asyncio.iscoroutinefunction(obj): - return list(collector._genfunctions(name, obj)) - - -def pytest_pyfunc_call(pyfuncitem): # type: ignore[no-untyped-def] - """Run coroutines in an event loop instead of a normal function call.""" - fast = pyfuncitem.config.getoption("--aiohttp-fast") - if asyncio.iscoroutinefunction(pyfuncitem.function): - existing_loop = pyfuncitem.funcargs.get( - "proactor_loop" - ) or pyfuncitem.funcargs.get("loop", None) - with _runtime_warning_context(): - with _passthrough_loop_context(existing_loop, fast=fast) as _loop: - testargs = { - arg: pyfuncitem.funcargs[arg] - for arg in pyfuncitem._fixtureinfo.argnames - } - _loop.run_until_complete(pyfuncitem.obj(**testargs)) - - return True - - -def pytest_generate_tests(metafunc): # type: ignore[no-untyped-def] - if "loop_factory" not in metafunc.fixturenames: - return - - loops = metafunc.config.option.aiohttp_loop - avail_factories = {"pyloop": asyncio.DefaultEventLoopPolicy} - - if uvloop is not None: # pragma: no cover - avail_factories["uvloop"] = uvloop.EventLoopPolicy - - if tokio is not None: # pragma: no cover - avail_factories["tokio"] = tokio.EventLoopPolicy - - if loops == "all": - loops = "pyloop,uvloop?,tokio?" - - factories = {} # type: ignore[var-annotated] - for name in loops.split(","): - required = not name.endswith("?") - name = name.strip(" ?") - if name not in avail_factories: # pragma: no cover - if required: - raise ValueError( - "Unknown loop '%s', available loops: %s" - % (name, list(factories.keys())) - ) - else: - continue - factories[name] = avail_factories[name] - metafunc.parametrize( - "loop_factory", list(factories.values()), ids=list(factories.keys()) - ) - - -@pytest.fixture -def loop(loop_factory, fast, loop_debug): # type: ignore[no-untyped-def] - """Return an instance of the event loop.""" - policy = loop_factory() - asyncio.set_event_loop_policy(policy) - with loop_context(fast=fast) as _loop: - if loop_debug: - _loop.set_debug(True) # pragma: no cover - asyncio.set_event_loop(_loop) - yield _loop - - -@pytest.fixture -def proactor_loop(): # type: ignore[no-untyped-def] - if not PY_37: - policy = asyncio.get_event_loop_policy() - policy._loop_factory = asyncio.ProactorEventLoop # type: ignore[attr-defined] - else: - policy = asyncio.WindowsProactorEventLoopPolicy() # type: ignore[attr-defined] - asyncio.set_event_loop_policy(policy) - - with loop_context(policy.new_event_loop) as _loop: - asyncio.set_event_loop(_loop) - yield _loop - - -@pytest.fixture -def unused_port(aiohttp_unused_port): # type: ignore[no-untyped-def] # pragma: no cover - warnings.warn( - "Deprecated, use aiohttp_unused_port fixture instead", - DeprecationWarning, - stacklevel=2, - ) - return aiohttp_unused_port - - -@pytest.fixture -def aiohttp_unused_port(): # type: ignore[no-untyped-def] - """Return a port that is unused on the current host.""" - return _unused_port - - -@pytest.fixture -def aiohttp_server(loop): # type: ignore[no-untyped-def] - """Factory to create a TestServer instance, given an app. - - aiohttp_server(app, **kwargs) - """ - servers = [] - - async def go(app, *, port=None, **kwargs): # type: ignore[no-untyped-def] - server = TestServer(app, port=port) - await server.start_server(loop=loop, **kwargs) - servers.append(server) - return server - - yield go - - async def finalize() -> None: - while servers: - await servers.pop().close() - - loop.run_until_complete(finalize()) - - -@pytest.fixture -def test_server(aiohttp_server): # type: ignore[no-untyped-def] # pragma: no cover - warnings.warn( - "Deprecated, use aiohttp_server fixture instead", - DeprecationWarning, - stacklevel=2, - ) - return aiohttp_server - - -@pytest.fixture -def aiohttp_raw_server(loop): # type: ignore[no-untyped-def] - """Factory to create a RawTestServer instance, given a web handler. - - aiohttp_raw_server(handler, **kwargs) - """ - servers = [] - - async def go(handler, *, port=None, **kwargs): # type: ignore[no-untyped-def] - server = RawTestServer(handler, port=port) - await server.start_server(loop=loop, **kwargs) - servers.append(server) - return server - - yield go - - async def finalize() -> None: - while servers: - await servers.pop().close() - - loop.run_until_complete(finalize()) - - -@pytest.fixture -def raw_test_server( # type: ignore[no-untyped-def] # pragma: no cover - aiohttp_raw_server, -): - warnings.warn( - "Deprecated, use aiohttp_raw_server fixture instead", - DeprecationWarning, - stacklevel=2, - ) - return aiohttp_raw_server - - -@pytest.fixture -def aiohttp_client( - loop: asyncio.AbstractEventLoop, -) -> Generator[AiohttpClient, None, None]: - """Factory to create a TestClient instance. - - aiohttp_client(app, **kwargs) - aiohttp_client(server, **kwargs) - aiohttp_client(raw_server, **kwargs) - """ - clients = [] - - async def go( - __param: Union[Application, BaseTestServer], - *args: Any, - server_kwargs: Optional[Dict[str, Any]] = None, - **kwargs: Any - ) -> TestClient: - - if isinstance(__param, Callable) and not isinstance( # type: ignore[arg-type] - __param, (Application, BaseTestServer) - ): - __param = __param(loop, *args, **kwargs) - kwargs = {} - else: - assert not args, "args should be empty" - - if isinstance(__param, Application): - server_kwargs = server_kwargs or {} - server = TestServer(__param, loop=loop, **server_kwargs) - client = TestClient(server, loop=loop, **kwargs) - elif isinstance(__param, BaseTestServer): - client = TestClient(__param, loop=loop, **kwargs) - else: - raise ValueError("Unknown argument type: %r" % type(__param)) - - await client.start_server() - clients.append(client) - return client - - yield go - - async def finalize() -> None: - while clients: - await clients.pop().close() - - loop.run_until_complete(finalize()) - - -@pytest.fixture -def test_client(aiohttp_client): # type: ignore[no-untyped-def] # pragma: no cover - warnings.warn( - "Deprecated, use aiohttp_client fixture instead", - DeprecationWarning, - stacklevel=2, - ) - return aiohttp_client diff --git a/.venv/Lib/site-packages/aiohttp/resolver.py b/.venv/Lib/site-packages/aiohttp/resolver.py deleted file mode 100644 index 531ce93..0000000 --- a/.venv/Lib/site-packages/aiohttp/resolver.py +++ /dev/null @@ -1,160 +0,0 @@ -import asyncio -import socket -from typing import Any, Dict, List, Optional, Type, Union - -from .abc import AbstractResolver -from .helpers import get_running_loop - -__all__ = ("ThreadedResolver", "AsyncResolver", "DefaultResolver") - -try: - import aiodns - - # aiodns_default = hasattr(aiodns.DNSResolver, 'gethostbyname') -except ImportError: # pragma: no cover - aiodns = None - -aiodns_default = False - - -class ThreadedResolver(AbstractResolver): - """Threaded resolver. - - Uses an Executor for synchronous getaddrinfo() calls. - concurrent.futures.ThreadPoolExecutor is used by default. - """ - - def __init__(self, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: - self._loop = get_running_loop(loop) - - async def resolve( - self, hostname: str, port: int = 0, family: int = socket.AF_INET - ) -> List[Dict[str, Any]]: - infos = await self._loop.getaddrinfo( - hostname, - port, - type=socket.SOCK_STREAM, - family=family, - flags=socket.AI_ADDRCONFIG, - ) - - hosts = [] - for family, _, proto, _, address in infos: - if family == socket.AF_INET6: - if len(address) < 3: - # IPv6 is not supported by Python build, - # or IPv6 is not enabled in the host - continue - if address[3]: # type: ignore[misc] - # This is essential for link-local IPv6 addresses. - # LL IPv6 is a VERY rare case. Strictly speaking, we should use - # getnameinfo() unconditionally, but performance makes sense. - host, _port = socket.getnameinfo( - address, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV - ) - port = int(_port) - else: - host, port = address[:2] - else: # IPv4 - assert family == socket.AF_INET - host, port = address # type: ignore[misc] - hosts.append( - { - "hostname": hostname, - "host": host, - "port": port, - "family": family, - "proto": proto, - "flags": socket.AI_NUMERICHOST | socket.AI_NUMERICSERV, - } - ) - - return hosts - - async def close(self) -> None: - pass - - -class AsyncResolver(AbstractResolver): - """Use the `aiodns` package to make asynchronous DNS lookups""" - - def __init__( - self, - loop: Optional[asyncio.AbstractEventLoop] = None, - *args: Any, - **kwargs: Any - ) -> None: - if aiodns is None: - raise RuntimeError("Resolver requires aiodns library") - - self._loop = get_running_loop(loop) - self._resolver = aiodns.DNSResolver(*args, loop=loop, **kwargs) - - if not hasattr(self._resolver, "gethostbyname"): - # aiodns 1.1 is not available, fallback to DNSResolver.query - self.resolve = self._resolve_with_query # type: ignore - - async def resolve( - self, host: str, port: int = 0, family: int = socket.AF_INET - ) -> List[Dict[str, Any]]: - try: - resp = await self._resolver.gethostbyname(host, family) - except aiodns.error.DNSError as exc: - msg = exc.args[1] if len(exc.args) >= 1 else "DNS lookup failed" - raise OSError(msg) from exc - hosts = [] - for address in resp.addresses: - hosts.append( - { - "hostname": host, - "host": address, - "port": port, - "family": family, - "proto": 0, - "flags": socket.AI_NUMERICHOST | socket.AI_NUMERICSERV, - } - ) - - if not hosts: - raise OSError("DNS lookup failed") - - return hosts - - async def _resolve_with_query( - self, host: str, port: int = 0, family: int = socket.AF_INET - ) -> List[Dict[str, Any]]: - if family == socket.AF_INET6: - qtype = "AAAA" - else: - qtype = "A" - - try: - resp = await self._resolver.query(host, qtype) - except aiodns.error.DNSError as exc: - msg = exc.args[1] if len(exc.args) >= 1 else "DNS lookup failed" - raise OSError(msg) from exc - - hosts = [] - for rr in resp: - hosts.append( - { - "hostname": host, - "host": rr.host, - "port": port, - "family": family, - "proto": 0, - "flags": socket.AI_NUMERICHOST, - } - ) - - if not hosts: - raise OSError("DNS lookup failed") - - return hosts - - async def close(self) -> None: - self._resolver.cancel() - - -_DefaultType = Type[Union[AsyncResolver, ThreadedResolver]] -DefaultResolver: _DefaultType = AsyncResolver if aiodns_default else ThreadedResolver diff --git a/.venv/Lib/site-packages/aiohttp/streams.py b/.venv/Lib/site-packages/aiohttp/streams.py deleted file mode 100644 index 0558488..0000000 --- a/.venv/Lib/site-packages/aiohttp/streams.py +++ /dev/null @@ -1,660 +0,0 @@ -import asyncio -import collections -import warnings -from typing import Awaitable, Callable, Deque, Generic, List, Optional, Tuple, TypeVar - -from .base_protocol import BaseProtocol -from .helpers import BaseTimerContext, set_exception, set_result -from .log import internal_logger -from .typedefs import Final - -__all__ = ( - "EMPTY_PAYLOAD", - "EofStream", - "StreamReader", - "DataQueue", - "FlowControlDataQueue", -) - -_T = TypeVar("_T") - - -class EofStream(Exception): - """eof stream indication.""" - - -class AsyncStreamIterator(Generic[_T]): - def __init__(self, read_func: Callable[[], Awaitable[_T]]) -> None: - self.read_func = read_func - - def __aiter__(self) -> "AsyncStreamIterator[_T]": - return self - - async def __anext__(self) -> _T: - try: - rv = await self.read_func() - except EofStream: - raise StopAsyncIteration - if rv == b"": - raise StopAsyncIteration - return rv - - -class ChunkTupleAsyncStreamIterator: - def __init__(self, stream: "StreamReader") -> None: - self._stream = stream - - def __aiter__(self) -> "ChunkTupleAsyncStreamIterator": - return self - - async def __anext__(self) -> Tuple[bytes, bool]: - rv = await self._stream.readchunk() - if rv == (b"", False): - raise StopAsyncIteration - return rv - - -class AsyncStreamReaderMixin: - def __aiter__(self) -> AsyncStreamIterator[bytes]: - return AsyncStreamIterator(self.readline) # type: ignore[attr-defined] - - def iter_chunked(self, n: int) -> AsyncStreamIterator[bytes]: - """Returns an asynchronous iterator that yields chunks of size n. - - Python-3.5 available for Python 3.5+ only - """ - return AsyncStreamIterator( - lambda: self.read(n) # type: ignore[attr-defined,no-any-return] - ) - - def iter_any(self) -> AsyncStreamIterator[bytes]: - """Yield all available data as soon as it is received. - - Python-3.5 available for Python 3.5+ only - """ - return AsyncStreamIterator(self.readany) # type: ignore[attr-defined] - - def iter_chunks(self) -> ChunkTupleAsyncStreamIterator: - """Yield chunks of data as they are received by the server. - - The yielded objects are tuples - of (bytes, bool) as returned by the StreamReader.readchunk method. - - Python-3.5 available for Python 3.5+ only - """ - return ChunkTupleAsyncStreamIterator(self) # type: ignore[arg-type] - - -class StreamReader(AsyncStreamReaderMixin): - """An enhancement of asyncio.StreamReader. - - Supports asynchronous iteration by line, chunk or as available:: - - async for line in reader: - ... - async for chunk in reader.iter_chunked(1024): - ... - async for slice in reader.iter_any(): - ... - - """ - - total_bytes = 0 - - def __init__( - self, - protocol: BaseProtocol, - limit: int, - *, - timer: Optional[BaseTimerContext] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, - ) -> None: - self._protocol = protocol - self._low_water = limit - self._high_water = limit * 2 - if loop is None: - loop = asyncio.get_event_loop() - self._loop = loop - self._size = 0 - self._cursor = 0 - self._http_chunk_splits = None # type: Optional[List[int]] - self._buffer = collections.deque() # type: Deque[bytes] - self._buffer_offset = 0 - self._eof = False - self._waiter = None # type: Optional[asyncio.Future[None]] - self._eof_waiter = None # type: Optional[asyncio.Future[None]] - self._exception = None # type: Optional[BaseException] - self._timer = timer - self._eof_callbacks = [] # type: List[Callable[[], None]] - - def __repr__(self) -> str: - info = [self.__class__.__name__] - if self._size: - info.append("%d bytes" % self._size) - if self._eof: - info.append("eof") - if self._low_water != 2 ** 16: # default limit - info.append("low=%d high=%d" % (self._low_water, self._high_water)) - if self._waiter: - info.append("w=%r" % self._waiter) - if self._exception: - info.append("e=%r" % self._exception) - return "<%s>" % " ".join(info) - - def get_read_buffer_limits(self) -> Tuple[int, int]: - return (self._low_water, self._high_water) - - def exception(self) -> Optional[BaseException]: - return self._exception - - def set_exception(self, exc: BaseException) -> None: - self._exception = exc - self._eof_callbacks.clear() - - waiter = self._waiter - if waiter is not None: - self._waiter = None - set_exception(waiter, exc) - - waiter = self._eof_waiter - if waiter is not None: - self._eof_waiter = None - set_exception(waiter, exc) - - def on_eof(self, callback: Callable[[], None]) -> None: - if self._eof: - try: - callback() - except Exception: - internal_logger.exception("Exception in eof callback") - else: - self._eof_callbacks.append(callback) - - def feed_eof(self) -> None: - self._eof = True - - waiter = self._waiter - if waiter is not None: - self._waiter = None - set_result(waiter, None) - - waiter = self._eof_waiter - if waiter is not None: - self._eof_waiter = None - set_result(waiter, None) - - for cb in self._eof_callbacks: - try: - cb() - except Exception: - internal_logger.exception("Exception in eof callback") - - self._eof_callbacks.clear() - - def is_eof(self) -> bool: - """Return True if 'feed_eof' was called.""" - return self._eof - - def at_eof(self) -> bool: - """Return True if the buffer is empty and 'feed_eof' was called.""" - return self._eof and not self._buffer - - async def wait_eof(self) -> None: - if self._eof: - return - - assert self._eof_waiter is None - self._eof_waiter = self._loop.create_future() - try: - await self._eof_waiter - finally: - self._eof_waiter = None - - def unread_data(self, data: bytes) -> None: - """rollback reading some data from stream, inserting it to buffer head.""" - warnings.warn( - "unread_data() is deprecated " - "and will be removed in future releases (#3260)", - DeprecationWarning, - stacklevel=2, - ) - if not data: - return - - if self._buffer_offset: - self._buffer[0] = self._buffer[0][self._buffer_offset :] - self._buffer_offset = 0 - self._size += len(data) - self._cursor -= len(data) - self._buffer.appendleft(data) - self._eof_counter = 0 - - # TODO: size is ignored, remove the param later - def feed_data(self, data: bytes, size: int = 0) -> None: - assert not self._eof, "feed_data after feed_eof" - - if not data: - return - - self._size += len(data) - self._buffer.append(data) - self.total_bytes += len(data) - - waiter = self._waiter - if waiter is not None: - self._waiter = None - set_result(waiter, None) - - if self._size > self._high_water and not self._protocol._reading_paused: - self._protocol.pause_reading() - - def begin_http_chunk_receiving(self) -> None: - if self._http_chunk_splits is None: - if self.total_bytes: - raise RuntimeError( - "Called begin_http_chunk_receiving when" "some data was already fed" - ) - self._http_chunk_splits = [] - - def end_http_chunk_receiving(self) -> None: - if self._http_chunk_splits is None: - raise RuntimeError( - "Called end_chunk_receiving without calling " - "begin_chunk_receiving first" - ) - - # self._http_chunk_splits contains logical byte offsets from start of - # the body transfer. Each offset is the offset of the end of a chunk. - # "Logical" means bytes, accessible for a user. - # If no chunks containig logical data were received, current position - # is difinitely zero. - pos = self._http_chunk_splits[-1] if self._http_chunk_splits else 0 - - if self.total_bytes == pos: - # We should not add empty chunks here. So we check for that. - # Note, when chunked + gzip is used, we can receive a chunk - # of compressed data, but that data may not be enough for gzip FSM - # to yield any uncompressed data. That's why current position may - # not change after receiving a chunk. - return - - self._http_chunk_splits.append(self.total_bytes) - - # wake up readchunk when end of http chunk received - waiter = self._waiter - if waiter is not None: - self._waiter = None - set_result(waiter, None) - - async def _wait(self, func_name: str) -> None: - # StreamReader uses a future to link the protocol feed_data() method - # to a read coroutine. Running two read coroutines at the same time - # would have an unexpected behaviour. It would not possible to know - # which coroutine would get the next data. - if self._waiter is not None: - raise RuntimeError( - "%s() called while another coroutine is " - "already waiting for incoming data" % func_name - ) - - waiter = self._waiter = self._loop.create_future() - try: - if self._timer: - with self._timer: - await waiter - else: - await waiter - finally: - self._waiter = None - - async def readline(self) -> bytes: - return await self.readuntil() - - async def readuntil(self, separator: bytes = b"\n") -> bytes: - seplen = len(separator) - if seplen == 0: - raise ValueError("Separator should be at least one-byte string") - - if self._exception is not None: - raise self._exception - - chunk = b"" - chunk_size = 0 - not_enough = True - - while not_enough: - while self._buffer and not_enough: - offset = self._buffer_offset - ichar = self._buffer[0].find(separator, offset) + 1 - # Read from current offset to found separator or to the end. - data = self._read_nowait_chunk(ichar - offset if ichar else -1) - chunk += data - chunk_size += len(data) - if ichar: - not_enough = False - - if chunk_size > self._high_water: - raise ValueError("Chunk too big") - - if self._eof: - break - - if not_enough: - await self._wait("readuntil") - - return chunk - - async def read(self, n: int = -1) -> bytes: - if self._exception is not None: - raise self._exception - - # migration problem; with DataQueue you have to catch - # EofStream exception, so common way is to run payload.read() inside - # infinite loop. what can cause real infinite loop with StreamReader - # lets keep this code one major release. - if __debug__: - if self._eof and not self._buffer: - self._eof_counter = getattr(self, "_eof_counter", 0) + 1 - if self._eof_counter > 5: - internal_logger.warning( - "Multiple access to StreamReader in eof state, " - "might be infinite loop.", - stack_info=True, - ) - - if not n: - return b"" - - if n < 0: - # This used to just loop creating a new waiter hoping to - # collect everything in self._buffer, but that would - # deadlock if the subprocess sends more than self.limit - # bytes. So just call self.readany() until EOF. - blocks = [] - while True: - block = await self.readany() - if not block: - break - blocks.append(block) - return b"".join(blocks) - - # TODO: should be `if` instead of `while` - # because waiter maybe triggered on chunk end, - # without feeding any data - while not self._buffer and not self._eof: - await self._wait("read") - - return self._read_nowait(n) - - async def readany(self) -> bytes: - if self._exception is not None: - raise self._exception - - # TODO: should be `if` instead of `while` - # because waiter maybe triggered on chunk end, - # without feeding any data - while not self._buffer and not self._eof: - await self._wait("readany") - - return self._read_nowait(-1) - - async def readchunk(self) -> Tuple[bytes, bool]: - """Returns a tuple of (data, end_of_http_chunk). - - When chunked transfer - encoding is used, end_of_http_chunk is a boolean indicating if the end - of the data corresponds to the end of a HTTP chunk , otherwise it is - always False. - """ - while True: - if self._exception is not None: - raise self._exception - - while self._http_chunk_splits: - pos = self._http_chunk_splits.pop(0) - if pos == self._cursor: - return (b"", True) - if pos > self._cursor: - return (self._read_nowait(pos - self._cursor), True) - internal_logger.warning( - "Skipping HTTP chunk end due to data " - "consumption beyond chunk boundary" - ) - - if self._buffer: - return (self._read_nowait_chunk(-1), False) - # return (self._read_nowait(-1), False) - - if self._eof: - # Special case for signifying EOF. - # (b'', True) is not a final return value actually. - return (b"", False) - - await self._wait("readchunk") - - async def readexactly(self, n: int) -> bytes: - if self._exception is not None: - raise self._exception - - blocks = [] # type: List[bytes] - while n > 0: - block = await self.read(n) - if not block: - partial = b"".join(blocks) - raise asyncio.IncompleteReadError(partial, len(partial) + n) - blocks.append(block) - n -= len(block) - - return b"".join(blocks) - - def read_nowait(self, n: int = -1) -> bytes: - # default was changed to be consistent with .read(-1) - # - # I believe the most users don't know about the method and - # they are not affected. - if self._exception is not None: - raise self._exception - - if self._waiter and not self._waiter.done(): - raise RuntimeError( - "Called while some coroutine is waiting for incoming data." - ) - - return self._read_nowait(n) - - def _read_nowait_chunk(self, n: int) -> bytes: - first_buffer = self._buffer[0] - offset = self._buffer_offset - if n != -1 and len(first_buffer) - offset > n: - data = first_buffer[offset : offset + n] - self._buffer_offset += n - - elif offset: - self._buffer.popleft() - data = first_buffer[offset:] - self._buffer_offset = 0 - - else: - data = self._buffer.popleft() - - self._size -= len(data) - self._cursor += len(data) - - chunk_splits = self._http_chunk_splits - # Prevent memory leak: drop useless chunk splits - while chunk_splits and chunk_splits[0] < self._cursor: - chunk_splits.pop(0) - - if self._size < self._low_water and self._protocol._reading_paused: - self._protocol.resume_reading() - return data - - def _read_nowait(self, n: int) -> bytes: - """Read not more than n bytes, or whole buffer if n == -1""" - chunks = [] - - while self._buffer: - chunk = self._read_nowait_chunk(n) - chunks.append(chunk) - if n != -1: - n -= len(chunk) - if n == 0: - break - - return b"".join(chunks) if chunks else b"" - - -class EmptyStreamReader(StreamReader): # lgtm [py/missing-call-to-init] - def __init__(self) -> None: - pass - - def exception(self) -> Optional[BaseException]: - return None - - def set_exception(self, exc: BaseException) -> None: - pass - - def on_eof(self, callback: Callable[[], None]) -> None: - try: - callback() - except Exception: - internal_logger.exception("Exception in eof callback") - - def feed_eof(self) -> None: - pass - - def is_eof(self) -> bool: - return True - - def at_eof(self) -> bool: - return True - - async def wait_eof(self) -> None: - return - - def feed_data(self, data: bytes, n: int = 0) -> None: - pass - - async def readline(self) -> bytes: - return b"" - - async def read(self, n: int = -1) -> bytes: - return b"" - - # TODO add async def readuntil - - async def readany(self) -> bytes: - return b"" - - async def readchunk(self) -> Tuple[bytes, bool]: - return (b"", True) - - async def readexactly(self, n: int) -> bytes: - raise asyncio.IncompleteReadError(b"", n) - - def read_nowait(self, n: int = -1) -> bytes: - return b"" - - -EMPTY_PAYLOAD: Final[StreamReader] = EmptyStreamReader() - - -class DataQueue(Generic[_T]): - """DataQueue is a general-purpose blocking queue with one reader.""" - - def __init__(self, loop: asyncio.AbstractEventLoop) -> None: - self._loop = loop - self._eof = False - self._waiter = None # type: Optional[asyncio.Future[None]] - self._exception = None # type: Optional[BaseException] - self._size = 0 - self._buffer = collections.deque() # type: Deque[Tuple[_T, int]] - - def __len__(self) -> int: - return len(self._buffer) - - def is_eof(self) -> bool: - return self._eof - - def at_eof(self) -> bool: - return self._eof and not self._buffer - - def exception(self) -> Optional[BaseException]: - return self._exception - - def set_exception(self, exc: BaseException) -> None: - self._eof = True - self._exception = exc - - waiter = self._waiter - if waiter is not None: - self._waiter = None - set_exception(waiter, exc) - - def feed_data(self, data: _T, size: int = 0) -> None: - self._size += size - self._buffer.append((data, size)) - - waiter = self._waiter - if waiter is not None: - self._waiter = None - set_result(waiter, None) - - def feed_eof(self) -> None: - self._eof = True - - waiter = self._waiter - if waiter is not None: - self._waiter = None - set_result(waiter, None) - - async def read(self) -> _T: - if not self._buffer and not self._eof: - assert not self._waiter - self._waiter = self._loop.create_future() - try: - await self._waiter - except (asyncio.CancelledError, asyncio.TimeoutError): - self._waiter = None - raise - - if self._buffer: - data, size = self._buffer.popleft() - self._size -= size - return data - else: - if self._exception is not None: - raise self._exception - else: - raise EofStream - - def __aiter__(self) -> AsyncStreamIterator[_T]: - return AsyncStreamIterator(self.read) - - -class FlowControlDataQueue(DataQueue[_T]): - """FlowControlDataQueue resumes and pauses an underlying stream. - - It is a destination for parsed data. - """ - - def __init__( - self, protocol: BaseProtocol, limit: int, *, loop: asyncio.AbstractEventLoop - ) -> None: - super().__init__(loop=loop) - - self._protocol = protocol - self._limit = limit * 2 - - def feed_data(self, data: _T, size: int = 0) -> None: - super().feed_data(data, size) - - if self._size > self._limit and not self._protocol._reading_paused: - self._protocol.pause_reading() - - async def read(self) -> _T: - try: - return await super().read() - finally: - if self._size < self._limit and self._protocol._reading_paused: - self._protocol.resume_reading() diff --git a/.venv/Lib/site-packages/aiohttp/tcp_helpers.py b/.venv/Lib/site-packages/aiohttp/tcp_helpers.py deleted file mode 100644 index 0e1dbf1..0000000 --- a/.venv/Lib/site-packages/aiohttp/tcp_helpers.py +++ /dev/null @@ -1,38 +0,0 @@ -"""Helper methods to tune a TCP connection""" - -import asyncio -import socket -from contextlib import suppress -from typing import Optional # noqa - -__all__ = ("tcp_keepalive", "tcp_nodelay") - - -if hasattr(socket, "SO_KEEPALIVE"): - - def tcp_keepalive(transport: asyncio.Transport) -> None: - sock = transport.get_extra_info("socket") - if sock is not None: - sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - - -else: - - def tcp_keepalive(transport: asyncio.Transport) -> None: # pragma: no cover - pass - - -def tcp_nodelay(transport: asyncio.Transport, value: bool) -> None: - sock = transport.get_extra_info("socket") - - if sock is None: - return - - if sock.family not in (socket.AF_INET, socket.AF_INET6): - return - - value = bool(value) - - # socket may be closed already, on windows OSError get raised - with suppress(OSError): - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, value) diff --git a/.venv/Lib/site-packages/aiohttp/test_utils.py b/.venv/Lib/site-packages/aiohttp/test_utils.py deleted file mode 100644 index 361dae4..0000000 --- a/.venv/Lib/site-packages/aiohttp/test_utils.py +++ /dev/null @@ -1,698 +0,0 @@ -"""Utilities shared by tests.""" - -import asyncio -import contextlib -import gc -import inspect -import ipaddress -import os -import socket -import sys -import warnings -from abc import ABC, abstractmethod -from types import TracebackType -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Iterator, - List, - Optional, - Type, - Union, - cast, -) -from unittest import mock - -from aiosignal import Signal -from multidict import CIMultiDict, CIMultiDictProxy -from yarl import URL - -import aiohttp -from aiohttp.client import _RequestContextManager, _WSRequestContextManager - -from . import ClientSession, hdrs -from .abc import AbstractCookieJar -from .client_reqrep import ClientResponse -from .client_ws import ClientWebSocketResponse -from .helpers import PY_38, sentinel -from .http import HttpVersion, RawRequestMessage -from .web import ( - Application, - AppRunner, - BaseRunner, - Request, - Server, - ServerRunner, - SockSite, - UrlMappingMatchInfo, -) -from .web_protocol import _RequestHandler - -if TYPE_CHECKING: # pragma: no cover - from ssl import SSLContext -else: - SSLContext = None - -if PY_38: - from unittest import IsolatedAsyncioTestCase as TestCase -else: - from asynctest import TestCase # type: ignore[no-redef] - -REUSE_ADDRESS = os.name == "posix" and sys.platform != "cygwin" - - -def get_unused_port_socket( - host: str, family: socket.AddressFamily = socket.AF_INET -) -> socket.socket: - return get_port_socket(host, 0, family) - - -def get_port_socket( - host: str, port: int, family: socket.AddressFamily -) -> socket.socket: - s = socket.socket(family, socket.SOCK_STREAM) - if REUSE_ADDRESS: - # Windows has different semantics for SO_REUSEADDR, - # so don't set it. Ref: - # https://docs.microsoft.com/en-us/windows/win32/winsock/using-so-reuseaddr-and-so-exclusiveaddruse - s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - s.bind((host, port)) - return s - - -def unused_port() -> int: - """Return a port that is unused on the current host.""" - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: - s.bind(("127.0.0.1", 0)) - return cast(int, s.getsockname()[1]) - - -class BaseTestServer(ABC): - __test__ = False - - def __init__( - self, - *, - scheme: Union[str, object] = sentinel, - loop: Optional[asyncio.AbstractEventLoop] = None, - host: str = "127.0.0.1", - port: Optional[int] = None, - skip_url_asserts: bool = False, - socket_factory: Callable[ - [str, int, socket.AddressFamily], socket.socket - ] = get_port_socket, - **kwargs: Any, - ) -> None: - self._loop = loop - self.runner = None # type: Optional[BaseRunner] - self._root = None # type: Optional[URL] - self.host = host - self.port = port - self._closed = False - self.scheme = scheme - self.skip_url_asserts = skip_url_asserts - self.socket_factory = socket_factory - - async def start_server( - self, loop: Optional[asyncio.AbstractEventLoop] = None, **kwargs: Any - ) -> None: - if self.runner: - return - self._loop = loop - self._ssl = kwargs.pop("ssl", None) - self.runner = await self._make_runner(**kwargs) - await self.runner.setup() - if not self.port: - self.port = 0 - try: - version = ipaddress.ip_address(self.host).version - except ValueError: - version = 4 - family = socket.AF_INET6 if version == 6 else socket.AF_INET - _sock = self.socket_factory(self.host, self.port, family) - self.host, self.port = _sock.getsockname()[:2] - site = SockSite(self.runner, sock=_sock, ssl_context=self._ssl) - await site.start() - server = site._server - assert server is not None - sockets = server.sockets - assert sockets is not None - self.port = sockets[0].getsockname()[1] - if self.scheme is sentinel: - if self._ssl: - scheme = "https" - else: - scheme = "http" - self.scheme = scheme - self._root = URL(f"{self.scheme}://{self.host}:{self.port}") - - @abstractmethod # pragma: no cover - async def _make_runner(self, **kwargs: Any) -> BaseRunner: - pass - - def make_url(self, path: str) -> URL: - assert self._root is not None - url = URL(path) - if not self.skip_url_asserts: - assert not url.is_absolute() - return self._root.join(url) - else: - return URL(str(self._root) + path) - - @property - def started(self) -> bool: - return self.runner is not None - - @property - def closed(self) -> bool: - return self._closed - - @property - def handler(self) -> Server: - # for backward compatibility - # web.Server instance - runner = self.runner - assert runner is not None - assert runner.server is not None - return runner.server - - async def close(self) -> None: - """Close all fixtures created by the test client. - - After that point, the TestClient is no longer usable. - - This is an idempotent function: running close multiple times - will not have any additional effects. - - close is also run when the object is garbage collected, and on - exit when used as a context manager. - - """ - if self.started and not self.closed: - assert self.runner is not None - await self.runner.cleanup() - self._root = None - self.port = None - self._closed = True - - def __enter__(self) -> None: - raise TypeError("Use async with instead") - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_value: Optional[BaseException], - traceback: Optional[TracebackType], - ) -> None: - # __exit__ should exist in pair with __enter__ but never executed - pass # pragma: no cover - - async def __aenter__(self) -> "BaseTestServer": - await self.start_server(loop=self._loop) - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc_value: Optional[BaseException], - traceback: Optional[TracebackType], - ) -> None: - await self.close() - - -class TestServer(BaseTestServer): - def __init__( - self, - app: Application, - *, - scheme: Union[str, object] = sentinel, - host: str = "127.0.0.1", - port: Optional[int] = None, - **kwargs: Any, - ): - self.app = app - super().__init__(scheme=scheme, host=host, port=port, **kwargs) - - async def _make_runner(self, **kwargs: Any) -> BaseRunner: - return AppRunner(self.app, **kwargs) - - -class RawTestServer(BaseTestServer): - def __init__( - self, - handler: _RequestHandler, - *, - scheme: Union[str, object] = sentinel, - host: str = "127.0.0.1", - port: Optional[int] = None, - **kwargs: Any, - ) -> None: - self._handler = handler - super().__init__(scheme=scheme, host=host, port=port, **kwargs) - - async def _make_runner(self, debug: bool = True, **kwargs: Any) -> ServerRunner: - srv = Server(self._handler, loop=self._loop, debug=debug, **kwargs) - return ServerRunner(srv, debug=debug, **kwargs) - - -class TestClient: - """ - A test client implementation. - - To write functional tests for aiohttp based servers. - - """ - - __test__ = False - - def __init__( - self, - server: BaseTestServer, - *, - cookie_jar: Optional[AbstractCookieJar] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, - **kwargs: Any, - ) -> None: - if not isinstance(server, BaseTestServer): - raise TypeError( - "server must be TestServer " "instance, found type: %r" % type(server) - ) - self._server = server - self._loop = loop - if cookie_jar is None: - cookie_jar = aiohttp.CookieJar(unsafe=True, loop=loop) - self._session = ClientSession(loop=loop, cookie_jar=cookie_jar, **kwargs) - self._closed = False - self._responses = [] # type: List[ClientResponse] - self._websockets = [] # type: List[ClientWebSocketResponse] - - async def start_server(self) -> None: - await self._server.start_server(loop=self._loop) - - @property - def host(self) -> str: - return self._server.host - - @property - def port(self) -> Optional[int]: - return self._server.port - - @property - def server(self) -> BaseTestServer: - return self._server - - @property - def app(self) -> Optional[Application]: - return cast(Optional[Application], getattr(self._server, "app", None)) - - @property - def session(self) -> ClientSession: - """An internal aiohttp.ClientSession. - - Unlike the methods on the TestClient, client session requests - do not automatically include the host in the url queried, and - will require an absolute path to the resource. - - """ - return self._session - - def make_url(self, path: str) -> URL: - return self._server.make_url(path) - - async def _request(self, method: str, path: str, **kwargs: Any) -> ClientResponse: - resp = await self._session.request(method, self.make_url(path), **kwargs) - # save it to close later - self._responses.append(resp) - return resp - - def request(self, method: str, path: str, **kwargs: Any) -> _RequestContextManager: - """Routes a request to tested http server. - - The interface is identical to aiohttp.ClientSession.request, - except the loop kwarg is overridden by the instance used by the - test server. - - """ - return _RequestContextManager(self._request(method, path, **kwargs)) - - def get(self, path: str, **kwargs: Any) -> _RequestContextManager: - """Perform an HTTP GET request.""" - return _RequestContextManager(self._request(hdrs.METH_GET, path, **kwargs)) - - def post(self, path: str, **kwargs: Any) -> _RequestContextManager: - """Perform an HTTP POST request.""" - return _RequestContextManager(self._request(hdrs.METH_POST, path, **kwargs)) - - def options(self, path: str, **kwargs: Any) -> _RequestContextManager: - """Perform an HTTP OPTIONS request.""" - return _RequestContextManager(self._request(hdrs.METH_OPTIONS, path, **kwargs)) - - def head(self, path: str, **kwargs: Any) -> _RequestContextManager: - """Perform an HTTP HEAD request.""" - return _RequestContextManager(self._request(hdrs.METH_HEAD, path, **kwargs)) - - def put(self, path: str, **kwargs: Any) -> _RequestContextManager: - """Perform an HTTP PUT request.""" - return _RequestContextManager(self._request(hdrs.METH_PUT, path, **kwargs)) - - def patch(self, path: str, **kwargs: Any) -> _RequestContextManager: - """Perform an HTTP PATCH request.""" - return _RequestContextManager(self._request(hdrs.METH_PATCH, path, **kwargs)) - - def delete(self, path: str, **kwargs: Any) -> _RequestContextManager: - """Perform an HTTP PATCH request.""" - return _RequestContextManager(self._request(hdrs.METH_DELETE, path, **kwargs)) - - def ws_connect(self, path: str, **kwargs: Any) -> _WSRequestContextManager: - """Initiate websocket connection. - - The api corresponds to aiohttp.ClientSession.ws_connect. - - """ - return _WSRequestContextManager(self._ws_connect(path, **kwargs)) - - async def _ws_connect(self, path: str, **kwargs: Any) -> ClientWebSocketResponse: - ws = await self._session.ws_connect(self.make_url(path), **kwargs) - self._websockets.append(ws) - return ws - - async def close(self) -> None: - """Close all fixtures created by the test client. - - After that point, the TestClient is no longer usable. - - This is an idempotent function: running close multiple times - will not have any additional effects. - - close is also run on exit when used as a(n) (asynchronous) - context manager. - - """ - if not self._closed: - for resp in self._responses: - resp.close() - for ws in self._websockets: - await ws.close() - await self._session.close() - await self._server.close() - self._closed = True - - def __enter__(self) -> None: - raise TypeError("Use async with instead") - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc: Optional[BaseException], - tb: Optional[TracebackType], - ) -> None: - # __exit__ should exist in pair with __enter__ but never executed - pass # pragma: no cover - - async def __aenter__(self) -> "TestClient": - await self.start_server() - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc: Optional[BaseException], - tb: Optional[TracebackType], - ) -> None: - await self.close() - - -class AioHTTPTestCase(TestCase): - """A base class to allow for unittest web applications using aiohttp. - - Provides the following: - - * self.client (aiohttp.test_utils.TestClient): an aiohttp test client. - * self.loop (asyncio.BaseEventLoop): the event loop in which the - application and server are running. - * self.app (aiohttp.web.Application): the application returned by - self.get_application() - - Note that the TestClient's methods are asynchronous: you have to - execute function on the test client using asynchronous methods. - """ - - async def get_application(self) -> Application: - """Get application. - - This method should be overridden - to return the aiohttp.web.Application - object to test. - """ - return self.get_app() - - def get_app(self) -> Application: - """Obsolete method used to constructing web application. - - Use .get_application() coroutine instead. - """ - raise RuntimeError("Did you forget to define get_application()?") - - def setUp(self) -> None: - try: - self.loop = asyncio.get_running_loop() - except (AttributeError, RuntimeError): # AttributeError->py36 - self.loop = asyncio.get_event_loop_policy().get_event_loop() - - self.loop.run_until_complete(self.setUpAsync()) - - async def setUpAsync(self) -> None: - self.app = await self.get_application() - self.server = await self.get_server(self.app) - self.client = await self.get_client(self.server) - - await self.client.start_server() - - def tearDown(self) -> None: - self.loop.run_until_complete(self.tearDownAsync()) - - async def tearDownAsync(self) -> None: - await self.client.close() - - async def get_server(self, app: Application) -> TestServer: - """Return a TestServer instance.""" - return TestServer(app, loop=self.loop) - - async def get_client(self, server: TestServer) -> TestClient: - """Return a TestClient instance.""" - return TestClient(server, loop=self.loop) - - -def unittest_run_loop(func: Any, *args: Any, **kwargs: Any) -> Any: - """ - A decorator dedicated to use with asynchronous AioHTTPTestCase test methods. - - In 3.8+, this does nothing. - """ - warnings.warn( - "Decorator `@unittest_run_loop` is no longer needed in aiohttp 3.8+", - DeprecationWarning, - stacklevel=2, - ) - return func - - -_LOOP_FACTORY = Callable[[], asyncio.AbstractEventLoop] - - -@contextlib.contextmanager -def loop_context( - loop_factory: _LOOP_FACTORY = asyncio.new_event_loop, fast: bool = False -) -> Iterator[asyncio.AbstractEventLoop]: - """A contextmanager that creates an event_loop, for test purposes. - - Handles the creation and cleanup of a test loop. - """ - loop = setup_test_loop(loop_factory) - yield loop - teardown_test_loop(loop, fast=fast) - - -def setup_test_loop( - loop_factory: _LOOP_FACTORY = asyncio.new_event_loop, -) -> asyncio.AbstractEventLoop: - """Create and return an asyncio.BaseEventLoop instance. - - The caller should also call teardown_test_loop, - once they are done with the loop. - """ - loop = loop_factory() - try: - module = loop.__class__.__module__ - skip_watcher = "uvloop" in module - except AttributeError: # pragma: no cover - # Just in case - skip_watcher = True - asyncio.set_event_loop(loop) - if sys.platform != "win32" and not skip_watcher: - policy = asyncio.get_event_loop_policy() - watcher: asyncio.AbstractChildWatcher - try: # Python >= 3.8 - # Refs: - # * https://github.com/pytest-dev/pytest-xdist/issues/620 - # * https://stackoverflow.com/a/58614689/595220 - # * https://bugs.python.org/issue35621 - # * https://github.com/python/cpython/pull/14344 - watcher = asyncio.ThreadedChildWatcher() - except AttributeError: # Python < 3.8 - watcher = asyncio.SafeChildWatcher() - watcher.attach_loop(loop) - with contextlib.suppress(NotImplementedError): - policy.set_child_watcher(watcher) - return loop - - -def teardown_test_loop(loop: asyncio.AbstractEventLoop, fast: bool = False) -> None: - """Teardown and cleanup an event_loop created by setup_test_loop.""" - closed = loop.is_closed() - if not closed: - loop.call_soon(loop.stop) - loop.run_forever() - loop.close() - - if not fast: - gc.collect() - - asyncio.set_event_loop(None) - - -def _create_app_mock() -> mock.MagicMock: - def get_dict(app: Any, key: str) -> Any: - return app.__app_dict[key] - - def set_dict(app: Any, key: str, value: Any) -> None: - app.__app_dict[key] = value - - app = mock.MagicMock() - app.__app_dict = {} - app.__getitem__ = get_dict - app.__setitem__ = set_dict - - app._debug = False - app.on_response_prepare = Signal(app) - app.on_response_prepare.freeze() - return app - - -def _create_transport(sslcontext: Optional[SSLContext] = None) -> mock.Mock: - transport = mock.Mock() - - def get_extra_info(key: str) -> Optional[SSLContext]: - if key == "sslcontext": - return sslcontext - else: - return None - - transport.get_extra_info.side_effect = get_extra_info - return transport - - -def make_mocked_request( - method: str, - path: str, - headers: Any = None, - *, - match_info: Any = sentinel, - version: HttpVersion = HttpVersion(1, 1), - closing: bool = False, - app: Any = None, - writer: Any = sentinel, - protocol: Any = sentinel, - transport: Any = sentinel, - payload: Any = sentinel, - sslcontext: Optional[SSLContext] = None, - client_max_size: int = 1024 ** 2, - loop: Any = ..., -) -> Request: - """Creates mocked web.Request testing purposes. - - Useful in unit tests, when spinning full web server is overkill or - specific conditions and errors are hard to trigger. - """ - task = mock.Mock() - if loop is ...: - loop = mock.Mock() - loop.create_future.return_value = () - - if version < HttpVersion(1, 1): - closing = True - - if headers: - headers = CIMultiDictProxy(CIMultiDict(headers)) - raw_hdrs = tuple( - (k.encode("utf-8"), v.encode("utf-8")) for k, v in headers.items() - ) - else: - headers = CIMultiDictProxy(CIMultiDict()) - raw_hdrs = () - - chunked = "chunked" in headers.get(hdrs.TRANSFER_ENCODING, "").lower() - - message = RawRequestMessage( - method, - path, - version, - headers, - raw_hdrs, - closing, - None, - False, - chunked, - URL(path), - ) - if app is None: - app = _create_app_mock() - - if transport is sentinel: - transport = _create_transport(sslcontext) - - if protocol is sentinel: - protocol = mock.Mock() - protocol.transport = transport - - if writer is sentinel: - writer = mock.Mock() - writer.write_headers = make_mocked_coro(None) - writer.write = make_mocked_coro(None) - writer.write_eof = make_mocked_coro(None) - writer.drain = make_mocked_coro(None) - writer.transport = transport - - protocol.transport = transport - protocol.writer = writer - - if payload is sentinel: - payload = mock.Mock() - - req = Request( - message, payload, protocol, writer, task, loop, client_max_size=client_max_size - ) - - match_info = UrlMappingMatchInfo( - {} if match_info is sentinel else match_info, mock.Mock() - ) - match_info.add_app(app) - req._match_info = match_info - - return req - - -def make_mocked_coro( - return_value: Any = sentinel, raise_exception: Any = sentinel -) -> Any: - """Creates a coroutine mock.""" - - async def mock_coro(*args: Any, **kwargs: Any) -> Any: - if raise_exception is not sentinel: - raise raise_exception - if not inspect.isawaitable(return_value): - return return_value - await return_value - - return mock.Mock(wraps=mock_coro) diff --git a/.venv/Lib/site-packages/aiohttp/tracing.py b/.venv/Lib/site-packages/aiohttp/tracing.py deleted file mode 100644 index 0e118a3..0000000 --- a/.venv/Lib/site-packages/aiohttp/tracing.py +++ /dev/null @@ -1,472 +0,0 @@ -from types import SimpleNamespace -from typing import TYPE_CHECKING, Awaitable, Optional, Type, TypeVar - -import attr -from aiosignal import Signal -from multidict import CIMultiDict -from yarl import URL - -from .client_reqrep import ClientResponse - -if TYPE_CHECKING: # pragma: no cover - from .client import ClientSession - from .typedefs import Protocol - - _ParamT_contra = TypeVar("_ParamT_contra", contravariant=True) - - class _SignalCallback(Protocol[_ParamT_contra]): - def __call__( - self, - __client_session: ClientSession, - __trace_config_ctx: SimpleNamespace, - __params: _ParamT_contra, - ) -> Awaitable[None]: - ... - - -__all__ = ( - "TraceConfig", - "TraceRequestStartParams", - "TraceRequestEndParams", - "TraceRequestExceptionParams", - "TraceConnectionQueuedStartParams", - "TraceConnectionQueuedEndParams", - "TraceConnectionCreateStartParams", - "TraceConnectionCreateEndParams", - "TraceConnectionReuseconnParams", - "TraceDnsResolveHostStartParams", - "TraceDnsResolveHostEndParams", - "TraceDnsCacheHitParams", - "TraceDnsCacheMissParams", - "TraceRequestRedirectParams", - "TraceRequestChunkSentParams", - "TraceResponseChunkReceivedParams", - "TraceRequestHeadersSentParams", -) - - -class TraceConfig: - """First-class used to trace requests launched via ClientSession objects.""" - - def __init__( - self, trace_config_ctx_factory: Type[SimpleNamespace] = SimpleNamespace - ) -> None: - self._on_request_start = Signal( - self - ) # type: Signal[_SignalCallback[TraceRequestStartParams]] - self._on_request_chunk_sent = Signal( - self - ) # type: Signal[_SignalCallback[TraceRequestChunkSentParams]] - self._on_response_chunk_received = Signal( - self - ) # type: Signal[_SignalCallback[TraceResponseChunkReceivedParams]] - self._on_request_end = Signal( - self - ) # type: Signal[_SignalCallback[TraceRequestEndParams]] - self._on_request_exception = Signal( - self - ) # type: Signal[_SignalCallback[TraceRequestExceptionParams]] - self._on_request_redirect = Signal( - self - ) # type: Signal[_SignalCallback[TraceRequestRedirectParams]] - self._on_connection_queued_start = Signal( - self - ) # type: Signal[_SignalCallback[TraceConnectionQueuedStartParams]] - self._on_connection_queued_end = Signal( - self - ) # type: Signal[_SignalCallback[TraceConnectionQueuedEndParams]] - self._on_connection_create_start = Signal( - self - ) # type: Signal[_SignalCallback[TraceConnectionCreateStartParams]] - self._on_connection_create_end = Signal( - self - ) # type: Signal[_SignalCallback[TraceConnectionCreateEndParams]] - self._on_connection_reuseconn = Signal( - self - ) # type: Signal[_SignalCallback[TraceConnectionReuseconnParams]] - self._on_dns_resolvehost_start = Signal( - self - ) # type: Signal[_SignalCallback[TraceDnsResolveHostStartParams]] - self._on_dns_resolvehost_end = Signal( - self - ) # type: Signal[_SignalCallback[TraceDnsResolveHostEndParams]] - self._on_dns_cache_hit = Signal( - self - ) # type: Signal[_SignalCallback[TraceDnsCacheHitParams]] - self._on_dns_cache_miss = Signal( - self - ) # type: Signal[_SignalCallback[TraceDnsCacheMissParams]] - self._on_request_headers_sent = Signal( - self - ) # type: Signal[_SignalCallback[TraceRequestHeadersSentParams]] - - self._trace_config_ctx_factory = trace_config_ctx_factory - - def trace_config_ctx( - self, trace_request_ctx: Optional[SimpleNamespace] = None - ) -> SimpleNamespace: - """Return a new trace_config_ctx instance""" - return self._trace_config_ctx_factory(trace_request_ctx=trace_request_ctx) - - def freeze(self) -> None: - self._on_request_start.freeze() - self._on_request_chunk_sent.freeze() - self._on_response_chunk_received.freeze() - self._on_request_end.freeze() - self._on_request_exception.freeze() - self._on_request_redirect.freeze() - self._on_connection_queued_start.freeze() - self._on_connection_queued_end.freeze() - self._on_connection_create_start.freeze() - self._on_connection_create_end.freeze() - self._on_connection_reuseconn.freeze() - self._on_dns_resolvehost_start.freeze() - self._on_dns_resolvehost_end.freeze() - self._on_dns_cache_hit.freeze() - self._on_dns_cache_miss.freeze() - self._on_request_headers_sent.freeze() - - @property - def on_request_start(self) -> "Signal[_SignalCallback[TraceRequestStartParams]]": - return self._on_request_start - - @property - def on_request_chunk_sent( - self, - ) -> "Signal[_SignalCallback[TraceRequestChunkSentParams]]": - return self._on_request_chunk_sent - - @property - def on_response_chunk_received( - self, - ) -> "Signal[_SignalCallback[TraceResponseChunkReceivedParams]]": - return self._on_response_chunk_received - - @property - def on_request_end(self) -> "Signal[_SignalCallback[TraceRequestEndParams]]": - return self._on_request_end - - @property - def on_request_exception( - self, - ) -> "Signal[_SignalCallback[TraceRequestExceptionParams]]": - return self._on_request_exception - - @property - def on_request_redirect( - self, - ) -> "Signal[_SignalCallback[TraceRequestRedirectParams]]": - return self._on_request_redirect - - @property - def on_connection_queued_start( - self, - ) -> "Signal[_SignalCallback[TraceConnectionQueuedStartParams]]": - return self._on_connection_queued_start - - @property - def on_connection_queued_end( - self, - ) -> "Signal[_SignalCallback[TraceConnectionQueuedEndParams]]": - return self._on_connection_queued_end - - @property - def on_connection_create_start( - self, - ) -> "Signal[_SignalCallback[TraceConnectionCreateStartParams]]": - return self._on_connection_create_start - - @property - def on_connection_create_end( - self, - ) -> "Signal[_SignalCallback[TraceConnectionCreateEndParams]]": - return self._on_connection_create_end - - @property - def on_connection_reuseconn( - self, - ) -> "Signal[_SignalCallback[TraceConnectionReuseconnParams]]": - return self._on_connection_reuseconn - - @property - def on_dns_resolvehost_start( - self, - ) -> "Signal[_SignalCallback[TraceDnsResolveHostStartParams]]": - return self._on_dns_resolvehost_start - - @property - def on_dns_resolvehost_end( - self, - ) -> "Signal[_SignalCallback[TraceDnsResolveHostEndParams]]": - return self._on_dns_resolvehost_end - - @property - def on_dns_cache_hit(self) -> "Signal[_SignalCallback[TraceDnsCacheHitParams]]": - return self._on_dns_cache_hit - - @property - def on_dns_cache_miss(self) -> "Signal[_SignalCallback[TraceDnsCacheMissParams]]": - return self._on_dns_cache_miss - - @property - def on_request_headers_sent( - self, - ) -> "Signal[_SignalCallback[TraceRequestHeadersSentParams]]": - return self._on_request_headers_sent - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceRequestStartParams: - """Parameters sent by the `on_request_start` signal""" - - method: str - url: URL - headers: "CIMultiDict[str]" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceRequestChunkSentParams: - """Parameters sent by the `on_request_chunk_sent` signal""" - - method: str - url: URL - chunk: bytes - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceResponseChunkReceivedParams: - """Parameters sent by the `on_response_chunk_received` signal""" - - method: str - url: URL - chunk: bytes - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceRequestEndParams: - """Parameters sent by the `on_request_end` signal""" - - method: str - url: URL - headers: "CIMultiDict[str]" - response: ClientResponse - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceRequestExceptionParams: - """Parameters sent by the `on_request_exception` signal""" - - method: str - url: URL - headers: "CIMultiDict[str]" - exception: BaseException - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceRequestRedirectParams: - """Parameters sent by the `on_request_redirect` signal""" - - method: str - url: URL - headers: "CIMultiDict[str]" - response: ClientResponse - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceConnectionQueuedStartParams: - """Parameters sent by the `on_connection_queued_start` signal""" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceConnectionQueuedEndParams: - """Parameters sent by the `on_connection_queued_end` signal""" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceConnectionCreateStartParams: - """Parameters sent by the `on_connection_create_start` signal""" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceConnectionCreateEndParams: - """Parameters sent by the `on_connection_create_end` signal""" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceConnectionReuseconnParams: - """Parameters sent by the `on_connection_reuseconn` signal""" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceDnsResolveHostStartParams: - """Parameters sent by the `on_dns_resolvehost_start` signal""" - - host: str - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceDnsResolveHostEndParams: - """Parameters sent by the `on_dns_resolvehost_end` signal""" - - host: str - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceDnsCacheHitParams: - """Parameters sent by the `on_dns_cache_hit` signal""" - - host: str - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceDnsCacheMissParams: - """Parameters sent by the `on_dns_cache_miss` signal""" - - host: str - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class TraceRequestHeadersSentParams: - """Parameters sent by the `on_request_headers_sent` signal""" - - method: str - url: URL - headers: "CIMultiDict[str]" - - -class Trace: - """Internal dependency holder class. - - Used to keep together the main dependencies used - at the moment of send a signal. - """ - - def __init__( - self, - session: "ClientSession", - trace_config: TraceConfig, - trace_config_ctx: SimpleNamespace, - ) -> None: - self._trace_config = trace_config - self._trace_config_ctx = trace_config_ctx - self._session = session - - async def send_request_start( - self, method: str, url: URL, headers: "CIMultiDict[str]" - ) -> None: - return await self._trace_config.on_request_start.send( - self._session, - self._trace_config_ctx, - TraceRequestStartParams(method, url, headers), - ) - - async def send_request_chunk_sent( - self, method: str, url: URL, chunk: bytes - ) -> None: - return await self._trace_config.on_request_chunk_sent.send( - self._session, - self._trace_config_ctx, - TraceRequestChunkSentParams(method, url, chunk), - ) - - async def send_response_chunk_received( - self, method: str, url: URL, chunk: bytes - ) -> None: - return await self._trace_config.on_response_chunk_received.send( - self._session, - self._trace_config_ctx, - TraceResponseChunkReceivedParams(method, url, chunk), - ) - - async def send_request_end( - self, - method: str, - url: URL, - headers: "CIMultiDict[str]", - response: ClientResponse, - ) -> None: - return await self._trace_config.on_request_end.send( - self._session, - self._trace_config_ctx, - TraceRequestEndParams(method, url, headers, response), - ) - - async def send_request_exception( - self, - method: str, - url: URL, - headers: "CIMultiDict[str]", - exception: BaseException, - ) -> None: - return await self._trace_config.on_request_exception.send( - self._session, - self._trace_config_ctx, - TraceRequestExceptionParams(method, url, headers, exception), - ) - - async def send_request_redirect( - self, - method: str, - url: URL, - headers: "CIMultiDict[str]", - response: ClientResponse, - ) -> None: - return await self._trace_config._on_request_redirect.send( - self._session, - self._trace_config_ctx, - TraceRequestRedirectParams(method, url, headers, response), - ) - - async def send_connection_queued_start(self) -> None: - return await self._trace_config.on_connection_queued_start.send( - self._session, self._trace_config_ctx, TraceConnectionQueuedStartParams() - ) - - async def send_connection_queued_end(self) -> None: - return await self._trace_config.on_connection_queued_end.send( - self._session, self._trace_config_ctx, TraceConnectionQueuedEndParams() - ) - - async def send_connection_create_start(self) -> None: - return await self._trace_config.on_connection_create_start.send( - self._session, self._trace_config_ctx, TraceConnectionCreateStartParams() - ) - - async def send_connection_create_end(self) -> None: - return await self._trace_config.on_connection_create_end.send( - self._session, self._trace_config_ctx, TraceConnectionCreateEndParams() - ) - - async def send_connection_reuseconn(self) -> None: - return await self._trace_config.on_connection_reuseconn.send( - self._session, self._trace_config_ctx, TraceConnectionReuseconnParams() - ) - - async def send_dns_resolvehost_start(self, host: str) -> None: - return await self._trace_config.on_dns_resolvehost_start.send( - self._session, self._trace_config_ctx, TraceDnsResolveHostStartParams(host) - ) - - async def send_dns_resolvehost_end(self, host: str) -> None: - return await self._trace_config.on_dns_resolvehost_end.send( - self._session, self._trace_config_ctx, TraceDnsResolveHostEndParams(host) - ) - - async def send_dns_cache_hit(self, host: str) -> None: - return await self._trace_config.on_dns_cache_hit.send( - self._session, self._trace_config_ctx, TraceDnsCacheHitParams(host) - ) - - async def send_dns_cache_miss(self, host: str) -> None: - return await self._trace_config.on_dns_cache_miss.send( - self._session, self._trace_config_ctx, TraceDnsCacheMissParams(host) - ) - - async def send_request_headers( - self, method: str, url: URL, headers: "CIMultiDict[str]" - ) -> None: - return await self._trace_config._on_request_headers_sent.send( - self._session, - self._trace_config_ctx, - TraceRequestHeadersSentParams(method, url, headers), - ) diff --git a/.venv/Lib/site-packages/aiohttp/typedefs.py b/.venv/Lib/site-packages/aiohttp/typedefs.py deleted file mode 100644 index 84283d9..0000000 --- a/.venv/Lib/site-packages/aiohttp/typedefs.py +++ /dev/null @@ -1,64 +0,0 @@ -import json -import os -import sys -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Iterable, - Mapping, - Tuple, - Union, -) - -from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy, istr -from yarl import URL - -# These are for other modules to use (to avoid repeating the conditional import). -if sys.version_info >= (3, 8): - from typing import Final as Final, Protocol as Protocol, TypedDict as TypedDict -else: - from typing_extensions import ( # noqa: F401 - Final, - Protocol as Protocol, - TypedDict as TypedDict, - ) - -DEFAULT_JSON_ENCODER = json.dumps -DEFAULT_JSON_DECODER = json.loads - -if TYPE_CHECKING: # pragma: no cover - _CIMultiDict = CIMultiDict[str] - _CIMultiDictProxy = CIMultiDictProxy[str] - _MultiDict = MultiDict[str] - _MultiDictProxy = MultiDictProxy[str] - from http.cookies import BaseCookie, Morsel - - from .web import Request, StreamResponse -else: - _CIMultiDict = CIMultiDict - _CIMultiDictProxy = CIMultiDictProxy - _MultiDict = MultiDict - _MultiDictProxy = MultiDictProxy - -Byteish = Union[bytes, bytearray, memoryview] -JSONEncoder = Callable[[Any], str] -JSONDecoder = Callable[[str], Any] -LooseHeaders = Union[Mapping[Union[str, istr], str], _CIMultiDict, _CIMultiDictProxy] -RawHeaders = Tuple[Tuple[bytes, bytes], ...] -StrOrURL = Union[str, URL] - -LooseCookiesMappings = Mapping[str, Union[str, "BaseCookie[str]", "Morsel[Any]"]] -LooseCookiesIterables = Iterable[ - Tuple[str, Union[str, "BaseCookie[str]", "Morsel[Any]"]] -] -LooseCookies = Union[ - LooseCookiesMappings, - LooseCookiesIterables, - "BaseCookie[str]", -] - -Handler = Callable[["Request"], Awaitable["StreamResponse"]] - -PathLike = Union[str, "os.PathLike[str]"] diff --git a/.venv/Lib/site-packages/aiohttp/web.py b/.venv/Lib/site-packages/aiohttp/web.py deleted file mode 100644 index 864428b..0000000 --- a/.venv/Lib/site-packages/aiohttp/web.py +++ /dev/null @@ -1,586 +0,0 @@ -import asyncio -import logging -import socket -import sys -from argparse import ArgumentParser -from collections.abc import Iterable -from importlib import import_module -from typing import ( - Any, - Awaitable, - Callable, - Iterable as TypingIterable, - List, - Optional, - Set, - Type, - Union, - cast, -) - -from .abc import AbstractAccessLogger -from .helpers import all_tasks -from .log import access_logger -from .web_app import Application as Application, CleanupError as CleanupError -from .web_exceptions import ( - HTTPAccepted as HTTPAccepted, - HTTPBadGateway as HTTPBadGateway, - HTTPBadRequest as HTTPBadRequest, - HTTPClientError as HTTPClientError, - HTTPConflict as HTTPConflict, - HTTPCreated as HTTPCreated, - HTTPError as HTTPError, - HTTPException as HTTPException, - HTTPExpectationFailed as HTTPExpectationFailed, - HTTPFailedDependency as HTTPFailedDependency, - HTTPForbidden as HTTPForbidden, - HTTPFound as HTTPFound, - HTTPGatewayTimeout as HTTPGatewayTimeout, - HTTPGone as HTTPGone, - HTTPInsufficientStorage as HTTPInsufficientStorage, - HTTPInternalServerError as HTTPInternalServerError, - HTTPLengthRequired as HTTPLengthRequired, - HTTPMethodNotAllowed as HTTPMethodNotAllowed, - HTTPMisdirectedRequest as HTTPMisdirectedRequest, - HTTPMovedPermanently as HTTPMovedPermanently, - HTTPMultipleChoices as HTTPMultipleChoices, - HTTPNetworkAuthenticationRequired as HTTPNetworkAuthenticationRequired, - HTTPNoContent as HTTPNoContent, - HTTPNonAuthoritativeInformation as HTTPNonAuthoritativeInformation, - HTTPNotAcceptable as HTTPNotAcceptable, - HTTPNotExtended as HTTPNotExtended, - HTTPNotFound as HTTPNotFound, - HTTPNotImplemented as HTTPNotImplemented, - HTTPNotModified as HTTPNotModified, - HTTPOk as HTTPOk, - HTTPPartialContent as HTTPPartialContent, - HTTPPaymentRequired as HTTPPaymentRequired, - HTTPPermanentRedirect as HTTPPermanentRedirect, - HTTPPreconditionFailed as HTTPPreconditionFailed, - HTTPPreconditionRequired as HTTPPreconditionRequired, - HTTPProxyAuthenticationRequired as HTTPProxyAuthenticationRequired, - HTTPRedirection as HTTPRedirection, - HTTPRequestEntityTooLarge as HTTPRequestEntityTooLarge, - HTTPRequestHeaderFieldsTooLarge as HTTPRequestHeaderFieldsTooLarge, - HTTPRequestRangeNotSatisfiable as HTTPRequestRangeNotSatisfiable, - HTTPRequestTimeout as HTTPRequestTimeout, - HTTPRequestURITooLong as HTTPRequestURITooLong, - HTTPResetContent as HTTPResetContent, - HTTPSeeOther as HTTPSeeOther, - HTTPServerError as HTTPServerError, - HTTPServiceUnavailable as HTTPServiceUnavailable, - HTTPSuccessful as HTTPSuccessful, - HTTPTemporaryRedirect as HTTPTemporaryRedirect, - HTTPTooManyRequests as HTTPTooManyRequests, - HTTPUnauthorized as HTTPUnauthorized, - HTTPUnavailableForLegalReasons as HTTPUnavailableForLegalReasons, - HTTPUnprocessableEntity as HTTPUnprocessableEntity, - HTTPUnsupportedMediaType as HTTPUnsupportedMediaType, - HTTPUpgradeRequired as HTTPUpgradeRequired, - HTTPUseProxy as HTTPUseProxy, - HTTPVariantAlsoNegotiates as HTTPVariantAlsoNegotiates, - HTTPVersionNotSupported as HTTPVersionNotSupported, -) -from .web_fileresponse import FileResponse as FileResponse -from .web_log import AccessLogger -from .web_middlewares import ( - middleware as middleware, - normalize_path_middleware as normalize_path_middleware, -) -from .web_protocol import ( - PayloadAccessError as PayloadAccessError, - RequestHandler as RequestHandler, - RequestPayloadError as RequestPayloadError, -) -from .web_request import ( - BaseRequest as BaseRequest, - FileField as FileField, - Request as Request, -) -from .web_response import ( - ContentCoding as ContentCoding, - Response as Response, - StreamResponse as StreamResponse, - json_response as json_response, -) -from .web_routedef import ( - AbstractRouteDef as AbstractRouteDef, - RouteDef as RouteDef, - RouteTableDef as RouteTableDef, - StaticDef as StaticDef, - delete as delete, - get as get, - head as head, - options as options, - patch as patch, - post as post, - put as put, - route as route, - static as static, - view as view, -) -from .web_runner import ( - AppRunner as AppRunner, - BaseRunner as BaseRunner, - BaseSite as BaseSite, - GracefulExit as GracefulExit, - NamedPipeSite as NamedPipeSite, - ServerRunner as ServerRunner, - SockSite as SockSite, - TCPSite as TCPSite, - UnixSite as UnixSite, -) -from .web_server import Server as Server -from .web_urldispatcher import ( - AbstractResource as AbstractResource, - AbstractRoute as AbstractRoute, - DynamicResource as DynamicResource, - PlainResource as PlainResource, - Resource as Resource, - ResourceRoute as ResourceRoute, - StaticResource as StaticResource, - UrlDispatcher as UrlDispatcher, - UrlMappingMatchInfo as UrlMappingMatchInfo, - View as View, -) -from .web_ws import ( - WebSocketReady as WebSocketReady, - WebSocketResponse as WebSocketResponse, - WSMsgType as WSMsgType, -) - -__all__ = ( - # web_app - "Application", - "CleanupError", - # web_exceptions - "HTTPAccepted", - "HTTPBadGateway", - "HTTPBadRequest", - "HTTPClientError", - "HTTPConflict", - "HTTPCreated", - "HTTPError", - "HTTPException", - "HTTPExpectationFailed", - "HTTPFailedDependency", - "HTTPForbidden", - "HTTPFound", - "HTTPGatewayTimeout", - "HTTPGone", - "HTTPInsufficientStorage", - "HTTPInternalServerError", - "HTTPLengthRequired", - "HTTPMethodNotAllowed", - "HTTPMisdirectedRequest", - "HTTPMovedPermanently", - "HTTPMultipleChoices", - "HTTPNetworkAuthenticationRequired", - "HTTPNoContent", - "HTTPNonAuthoritativeInformation", - "HTTPNotAcceptable", - "HTTPNotExtended", - "HTTPNotFound", - "HTTPNotImplemented", - "HTTPNotModified", - "HTTPOk", - "HTTPPartialContent", - "HTTPPaymentRequired", - "HTTPPermanentRedirect", - "HTTPPreconditionFailed", - "HTTPPreconditionRequired", - "HTTPProxyAuthenticationRequired", - "HTTPRedirection", - "HTTPRequestEntityTooLarge", - "HTTPRequestHeaderFieldsTooLarge", - "HTTPRequestRangeNotSatisfiable", - "HTTPRequestTimeout", - "HTTPRequestURITooLong", - "HTTPResetContent", - "HTTPSeeOther", - "HTTPServerError", - "HTTPServiceUnavailable", - "HTTPSuccessful", - "HTTPTemporaryRedirect", - "HTTPTooManyRequests", - "HTTPUnauthorized", - "HTTPUnavailableForLegalReasons", - "HTTPUnprocessableEntity", - "HTTPUnsupportedMediaType", - "HTTPUpgradeRequired", - "HTTPUseProxy", - "HTTPVariantAlsoNegotiates", - "HTTPVersionNotSupported", - # web_fileresponse - "FileResponse", - # web_middlewares - "middleware", - "normalize_path_middleware", - # web_protocol - "PayloadAccessError", - "RequestHandler", - "RequestPayloadError", - # web_request - "BaseRequest", - "FileField", - "Request", - # web_response - "ContentCoding", - "Response", - "StreamResponse", - "json_response", - # web_routedef - "AbstractRouteDef", - "RouteDef", - "RouteTableDef", - "StaticDef", - "delete", - "get", - "head", - "options", - "patch", - "post", - "put", - "route", - "static", - "view", - # web_runner - "AppRunner", - "BaseRunner", - "BaseSite", - "GracefulExit", - "ServerRunner", - "SockSite", - "TCPSite", - "UnixSite", - "NamedPipeSite", - # web_server - "Server", - # web_urldispatcher - "AbstractResource", - "AbstractRoute", - "DynamicResource", - "PlainResource", - "Resource", - "ResourceRoute", - "StaticResource", - "UrlDispatcher", - "UrlMappingMatchInfo", - "View", - # web_ws - "WebSocketReady", - "WebSocketResponse", - "WSMsgType", - # web - "run_app", -) - - -try: - from ssl import SSLContext -except ImportError: # pragma: no cover - SSLContext = Any # type: ignore[misc,assignment] - -HostSequence = TypingIterable[str] - - -async def _run_app( - app: Union[Application, Awaitable[Application]], - *, - host: Optional[Union[str, HostSequence]] = None, - port: Optional[int] = None, - path: Optional[str] = None, - sock: Optional[socket.socket] = None, - shutdown_timeout: float = 60.0, - keepalive_timeout: float = 75.0, - ssl_context: Optional[SSLContext] = None, - print: Callable[..., None] = print, - backlog: int = 128, - access_log_class: Type[AbstractAccessLogger] = AccessLogger, - access_log_format: str = AccessLogger.LOG_FORMAT, - access_log: Optional[logging.Logger] = access_logger, - handle_signals: bool = True, - reuse_address: Optional[bool] = None, - reuse_port: Optional[bool] = None, -) -> None: - # A internal functio to actually do all dirty job for application running - if asyncio.iscoroutine(app): - app = await app # type: ignore[misc] - - app = cast(Application, app) - - runner = AppRunner( - app, - handle_signals=handle_signals, - access_log_class=access_log_class, - access_log_format=access_log_format, - access_log=access_log, - keepalive_timeout=keepalive_timeout, - ) - - await runner.setup() - - sites = [] # type: List[BaseSite] - - try: - if host is not None: - if isinstance(host, (str, bytes, bytearray, memoryview)): - sites.append( - TCPSite( - runner, - host, - port, - shutdown_timeout=shutdown_timeout, - ssl_context=ssl_context, - backlog=backlog, - reuse_address=reuse_address, - reuse_port=reuse_port, - ) - ) - else: - for h in host: - sites.append( - TCPSite( - runner, - h, - port, - shutdown_timeout=shutdown_timeout, - ssl_context=ssl_context, - backlog=backlog, - reuse_address=reuse_address, - reuse_port=reuse_port, - ) - ) - elif path is None and sock is None or port is not None: - sites.append( - TCPSite( - runner, - port=port, - shutdown_timeout=shutdown_timeout, - ssl_context=ssl_context, - backlog=backlog, - reuse_address=reuse_address, - reuse_port=reuse_port, - ) - ) - - if path is not None: - if isinstance(path, (str, bytes, bytearray, memoryview)): - sites.append( - UnixSite( - runner, - path, - shutdown_timeout=shutdown_timeout, - ssl_context=ssl_context, - backlog=backlog, - ) - ) - else: - for p in path: - sites.append( - UnixSite( - runner, - p, - shutdown_timeout=shutdown_timeout, - ssl_context=ssl_context, - backlog=backlog, - ) - ) - - if sock is not None: - if not isinstance(sock, Iterable): - sites.append( - SockSite( - runner, - sock, - shutdown_timeout=shutdown_timeout, - ssl_context=ssl_context, - backlog=backlog, - ) - ) - else: - for s in sock: - sites.append( - SockSite( - runner, - s, - shutdown_timeout=shutdown_timeout, - ssl_context=ssl_context, - backlog=backlog, - ) - ) - for site in sites: - await site.start() - - if print: # pragma: no branch - names = sorted(str(s.name) for s in runner.sites) - print( - "======== Running on {} ========\n" - "(Press CTRL+C to quit)".format(", ".join(names)) - ) - - # sleep forever by 1 hour intervals, - # on Windows before Python 3.8 wake up every 1 second to handle - # Ctrl+C smoothly - if sys.platform == "win32" and sys.version_info < (3, 8): - delay = 1 - else: - delay = 3600 - - while True: - await asyncio.sleep(delay) - finally: - await runner.cleanup() - - -def _cancel_tasks( - to_cancel: Set["asyncio.Task[Any]"], loop: asyncio.AbstractEventLoop -) -> None: - if not to_cancel: - return - - for task in to_cancel: - task.cancel() - - loop.run_until_complete(asyncio.gather(*to_cancel, return_exceptions=True)) - - for task in to_cancel: - if task.cancelled(): - continue - if task.exception() is not None: - loop.call_exception_handler( - { - "message": "unhandled exception during asyncio.run() shutdown", - "exception": task.exception(), - "task": task, - } - ) - - -def run_app( - app: Union[Application, Awaitable[Application]], - *, - host: Optional[Union[str, HostSequence]] = None, - port: Optional[int] = None, - path: Optional[str] = None, - sock: Optional[socket.socket] = None, - shutdown_timeout: float = 60.0, - keepalive_timeout: float = 75.0, - ssl_context: Optional[SSLContext] = None, - print: Callable[..., None] = print, - backlog: int = 128, - access_log_class: Type[AbstractAccessLogger] = AccessLogger, - access_log_format: str = AccessLogger.LOG_FORMAT, - access_log: Optional[logging.Logger] = access_logger, - handle_signals: bool = True, - reuse_address: Optional[bool] = None, - reuse_port: Optional[bool] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, -) -> None: - """Run an app locally""" - if loop is None: - loop = asyncio.new_event_loop() - - # Configure if and only if in debugging mode and using the default logger - if loop.get_debug() and access_log and access_log.name == "aiohttp.access": - if access_log.level == logging.NOTSET: - access_log.setLevel(logging.DEBUG) - if not access_log.hasHandlers(): - access_log.addHandler(logging.StreamHandler()) - - main_task = loop.create_task( - _run_app( - app, - host=host, - port=port, - path=path, - sock=sock, - shutdown_timeout=shutdown_timeout, - keepalive_timeout=keepalive_timeout, - ssl_context=ssl_context, - print=print, - backlog=backlog, - access_log_class=access_log_class, - access_log_format=access_log_format, - access_log=access_log, - handle_signals=handle_signals, - reuse_address=reuse_address, - reuse_port=reuse_port, - ) - ) - - try: - asyncio.set_event_loop(loop) - loop.run_until_complete(main_task) - except (GracefulExit, KeyboardInterrupt): # pragma: no cover - pass - finally: - _cancel_tasks({main_task}, loop) - _cancel_tasks(all_tasks(loop), loop) - loop.run_until_complete(loop.shutdown_asyncgens()) - loop.close() - - -def main(argv: List[str]) -> None: - arg_parser = ArgumentParser( - description="aiohttp.web Application server", prog="aiohttp.web" - ) - arg_parser.add_argument( - "entry_func", - help=( - "Callable returning the `aiohttp.web.Application` instance to " - "run. Should be specified in the 'module:function' syntax." - ), - metavar="entry-func", - ) - arg_parser.add_argument( - "-H", - "--hostname", - help="TCP/IP hostname to serve on (default: %(default)r)", - default="localhost", - ) - arg_parser.add_argument( - "-P", - "--port", - help="TCP/IP port to serve on (default: %(default)r)", - type=int, - default="8080", - ) - arg_parser.add_argument( - "-U", - "--path", - help="Unix file system path to serve on. Specifying a path will cause " - "hostname and port arguments to be ignored.", - ) - args, extra_argv = arg_parser.parse_known_args(argv) - - # Import logic - mod_str, _, func_str = args.entry_func.partition(":") - if not func_str or not mod_str: - arg_parser.error("'entry-func' not in 'module:function' syntax") - if mod_str.startswith("."): - arg_parser.error("relative module names not supported") - try: - module = import_module(mod_str) - except ImportError as ex: - arg_parser.error(f"unable to import {mod_str}: {ex}") - try: - func = getattr(module, func_str) - except AttributeError: - arg_parser.error(f"module {mod_str!r} has no attribute {func_str!r}") - - # Compatibility logic - if args.path is not None and not hasattr(socket, "AF_UNIX"): - arg_parser.error( - "file system paths not supported by your operating" " environment" - ) - - logging.basicConfig(level=logging.DEBUG) - - app = func(extra_argv) - run_app(app, host=args.hostname, port=args.port, path=args.path) - arg_parser.exit(message="Stopped\n") - - -if __name__ == "__main__": # pragma: no branch - main(sys.argv[1:]) # pragma: no cover diff --git a/.venv/Lib/site-packages/aiohttp/web_app.py b/.venv/Lib/site-packages/aiohttp/web_app.py deleted file mode 100644 index d5dc90e..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_app.py +++ /dev/null @@ -1,557 +0,0 @@ -import asyncio -import logging -import warnings -from functools import partial, update_wrapper -from typing import ( - TYPE_CHECKING, - Any, - AsyncIterator, - Awaitable, - Callable, - Dict, - Iterable, - Iterator, - List, - Mapping, - MutableMapping, - Optional, - Sequence, - Tuple, - Type, - Union, - cast, -) - -from aiosignal import Signal -from frozenlist import FrozenList - -from . import hdrs -from .abc import ( - AbstractAccessLogger, - AbstractMatchInfo, - AbstractRouter, - AbstractStreamWriter, -) -from .helpers import DEBUG -from .http_parser import RawRequestMessage -from .log import web_logger -from .streams import StreamReader -from .web_log import AccessLogger -from .web_middlewares import _fix_request_current_app -from .web_protocol import RequestHandler -from .web_request import Request -from .web_response import StreamResponse -from .web_routedef import AbstractRouteDef -from .web_server import Server -from .web_urldispatcher import ( - AbstractResource, - AbstractRoute, - Domain, - MaskDomain, - MatchedSubAppResource, - PrefixedSubAppResource, - UrlDispatcher, -) - -__all__ = ("Application", "CleanupError") - - -if TYPE_CHECKING: # pragma: no cover - from .typedefs import Handler - - _AppSignal = Signal[Callable[["Application"], Awaitable[None]]] - _RespPrepareSignal = Signal[Callable[[Request, StreamResponse], Awaitable[None]]] - _Middleware = Union[ - Callable[[Request, Handler], Awaitable[StreamResponse]], - Callable[["Application", Handler], Awaitable[Handler]], # old-style - ] - _Middlewares = FrozenList[_Middleware] - _MiddlewaresHandlers = Optional[Sequence[Tuple[_Middleware, bool]]] - _Subapps = List["Application"] -else: - # No type checker mode, skip types - _AppSignal = Signal - _RespPrepareSignal = Signal - _Middleware = Callable - _Middlewares = FrozenList - _MiddlewaresHandlers = Optional[Sequence] - _Subapps = List - - -class Application(MutableMapping[str, Any]): - ATTRS = frozenset( - [ - "logger", - "_debug", - "_router", - "_loop", - "_handler_args", - "_middlewares", - "_middlewares_handlers", - "_run_middlewares", - "_state", - "_frozen", - "_pre_frozen", - "_subapps", - "_on_response_prepare", - "_on_startup", - "_on_shutdown", - "_on_cleanup", - "_client_max_size", - "_cleanup_ctx", - ] - ) - - def __init__( - self, - *, - logger: logging.Logger = web_logger, - router: Optional[UrlDispatcher] = None, - middlewares: Iterable[_Middleware] = (), - handler_args: Optional[Mapping[str, Any]] = None, - client_max_size: int = 1024 ** 2, - loop: Optional[asyncio.AbstractEventLoop] = None, - debug: Any = ..., # mypy doesn't support ellipsis - ) -> None: - if router is None: - router = UrlDispatcher() - else: - warnings.warn( - "router argument is deprecated", DeprecationWarning, stacklevel=2 - ) - assert isinstance(router, AbstractRouter), router - - if loop is not None: - warnings.warn( - "loop argument is deprecated", DeprecationWarning, stacklevel=2 - ) - - if debug is not ...: - warnings.warn( - "debug argument is deprecated", DeprecationWarning, stacklevel=2 - ) - self._debug = debug - self._router = router # type: UrlDispatcher - self._loop = loop - self._handler_args = handler_args - self.logger = logger - - self._middlewares = FrozenList(middlewares) # type: _Middlewares - - # initialized on freezing - self._middlewares_handlers = None # type: _MiddlewaresHandlers - # initialized on freezing - self._run_middlewares = None # type: Optional[bool] - - self._state = {} # type: Dict[str, Any] - self._frozen = False - self._pre_frozen = False - self._subapps = [] # type: _Subapps - - self._on_response_prepare = Signal(self) # type: _RespPrepareSignal - self._on_startup = Signal(self) # type: _AppSignal - self._on_shutdown = Signal(self) # type: _AppSignal - self._on_cleanup = Signal(self) # type: _AppSignal - self._cleanup_ctx = CleanupContext() - self._on_startup.append(self._cleanup_ctx._on_startup) - self._on_cleanup.append(self._cleanup_ctx._on_cleanup) - self._client_max_size = client_max_size - - def __init_subclass__(cls: Type["Application"]) -> None: - warnings.warn( - "Inheritance class {} from web.Application " - "is discouraged".format(cls.__name__), - DeprecationWarning, - stacklevel=2, - ) - - if DEBUG: # pragma: no cover - - def __setattr__(self, name: str, val: Any) -> None: - if name not in self.ATTRS: - warnings.warn( - "Setting custom web.Application.{} attribute " - "is discouraged".format(name), - DeprecationWarning, - stacklevel=2, - ) - super().__setattr__(name, val) - - # MutableMapping API - - def __eq__(self, other: object) -> bool: - return self is other - - def __getitem__(self, key: str) -> Any: - return self._state[key] - - def _check_frozen(self) -> None: - if self._frozen: - warnings.warn( - "Changing state of started or joined " "application is deprecated", - DeprecationWarning, - stacklevel=3, - ) - - def __setitem__(self, key: str, value: Any) -> None: - self._check_frozen() - self._state[key] = value - - def __delitem__(self, key: str) -> None: - self._check_frozen() - del self._state[key] - - def __len__(self) -> int: - return len(self._state) - - def __iter__(self) -> Iterator[str]: - return iter(self._state) - - ######## - @property - def loop(self) -> asyncio.AbstractEventLoop: - # Technically the loop can be None - # but we mask it by explicit type cast - # to provide more convinient type annotation - warnings.warn("loop property is deprecated", DeprecationWarning, stacklevel=2) - return cast(asyncio.AbstractEventLoop, self._loop) - - def _set_loop(self, loop: Optional[asyncio.AbstractEventLoop]) -> None: - if loop is None: - loop = asyncio.get_event_loop() - if self._loop is not None and self._loop is not loop: - raise RuntimeError( - "web.Application instance initialized with different loop" - ) - - self._loop = loop - - # set loop debug - if self._debug is ...: - self._debug = loop.get_debug() - - # set loop to sub applications - for subapp in self._subapps: - subapp._set_loop(loop) - - @property - def pre_frozen(self) -> bool: - return self._pre_frozen - - def pre_freeze(self) -> None: - if self._pre_frozen: - return - - self._pre_frozen = True - self._middlewares.freeze() - self._router.freeze() - self._on_response_prepare.freeze() - self._cleanup_ctx.freeze() - self._on_startup.freeze() - self._on_shutdown.freeze() - self._on_cleanup.freeze() - self._middlewares_handlers = tuple(self._prepare_middleware()) - - # If current app and any subapp do not have middlewares avoid run all - # of the code footprint that it implies, which have a middleware - # hardcoded per app that sets up the current_app attribute. If no - # middlewares are configured the handler will receive the proper - # current_app without needing all of this code. - self._run_middlewares = True if self.middlewares else False - - for subapp in self._subapps: - subapp.pre_freeze() - self._run_middlewares = self._run_middlewares or subapp._run_middlewares - - @property - def frozen(self) -> bool: - return self._frozen - - def freeze(self) -> None: - if self._frozen: - return - - self.pre_freeze() - self._frozen = True - for subapp in self._subapps: - subapp.freeze() - - @property - def debug(self) -> bool: - warnings.warn("debug property is deprecated", DeprecationWarning, stacklevel=2) - return self._debug # type: ignore[no-any-return] - - def _reg_subapp_signals(self, subapp: "Application") -> None: - def reg_handler(signame: str) -> None: - subsig = getattr(subapp, signame) - - async def handler(app: "Application") -> None: - await subsig.send(subapp) - - appsig = getattr(self, signame) - appsig.append(handler) - - reg_handler("on_startup") - reg_handler("on_shutdown") - reg_handler("on_cleanup") - - def add_subapp(self, prefix: str, subapp: "Application") -> AbstractResource: - if not isinstance(prefix, str): - raise TypeError("Prefix must be str") - prefix = prefix.rstrip("/") - if not prefix: - raise ValueError("Prefix cannot be empty") - factory = partial(PrefixedSubAppResource, prefix, subapp) - return self._add_subapp(factory, subapp) - - def _add_subapp( - self, resource_factory: Callable[[], AbstractResource], subapp: "Application" - ) -> AbstractResource: - if self.frozen: - raise RuntimeError("Cannot add sub application to frozen application") - if subapp.frozen: - raise RuntimeError("Cannot add frozen application") - resource = resource_factory() - self.router.register_resource(resource) - self._reg_subapp_signals(subapp) - self._subapps.append(subapp) - subapp.pre_freeze() - if self._loop is not None: - subapp._set_loop(self._loop) - return resource - - def add_domain(self, domain: str, subapp: "Application") -> AbstractResource: - if not isinstance(domain, str): - raise TypeError("Domain must be str") - elif "*" in domain: - rule = MaskDomain(domain) # type: Domain - else: - rule = Domain(domain) - factory = partial(MatchedSubAppResource, rule, subapp) - return self._add_subapp(factory, subapp) - - def add_routes(self, routes: Iterable[AbstractRouteDef]) -> List[AbstractRoute]: - return self.router.add_routes(routes) - - @property - def on_response_prepare(self) -> _RespPrepareSignal: - return self._on_response_prepare - - @property - def on_startup(self) -> _AppSignal: - return self._on_startup - - @property - def on_shutdown(self) -> _AppSignal: - return self._on_shutdown - - @property - def on_cleanup(self) -> _AppSignal: - return self._on_cleanup - - @property - def cleanup_ctx(self) -> "CleanupContext": - return self._cleanup_ctx - - @property - def router(self) -> UrlDispatcher: - return self._router - - @property - def middlewares(self) -> _Middlewares: - return self._middlewares - - def _make_handler( - self, - *, - loop: Optional[asyncio.AbstractEventLoop] = None, - access_log_class: Type[AbstractAccessLogger] = AccessLogger, - **kwargs: Any, - ) -> Server: - - if not issubclass(access_log_class, AbstractAccessLogger): - raise TypeError( - "access_log_class must be subclass of " - "aiohttp.abc.AbstractAccessLogger, got {}".format(access_log_class) - ) - - self._set_loop(loop) - self.freeze() - - kwargs["debug"] = self._debug - kwargs["access_log_class"] = access_log_class - if self._handler_args: - for k, v in self._handler_args.items(): - kwargs[k] = v - - return Server( - self._handle, # type: ignore[arg-type] - request_factory=self._make_request, - loop=self._loop, - **kwargs, - ) - - def make_handler( - self, - *, - loop: Optional[asyncio.AbstractEventLoop] = None, - access_log_class: Type[AbstractAccessLogger] = AccessLogger, - **kwargs: Any, - ) -> Server: - - warnings.warn( - "Application.make_handler(...) is deprecated, " "use AppRunner API instead", - DeprecationWarning, - stacklevel=2, - ) - - return self._make_handler( - loop=loop, access_log_class=access_log_class, **kwargs - ) - - async def startup(self) -> None: - """Causes on_startup signal - - Should be called in the event loop along with the request handler. - """ - await self.on_startup.send(self) - - async def shutdown(self) -> None: - """Causes on_shutdown signal - - Should be called before cleanup() - """ - await self.on_shutdown.send(self) - - async def cleanup(self) -> None: - """Causes on_cleanup signal - - Should be called after shutdown() - """ - if self.on_cleanup.frozen: - await self.on_cleanup.send(self) - else: - # If an exception occurs in startup, ensure cleanup contexts are completed. - await self._cleanup_ctx._on_cleanup(self) - - def _make_request( - self, - message: RawRequestMessage, - payload: StreamReader, - protocol: RequestHandler, - writer: AbstractStreamWriter, - task: "asyncio.Task[None]", - _cls: Type[Request] = Request, - ) -> Request: - return _cls( - message, - payload, - protocol, - writer, - task, - self._loop, - client_max_size=self._client_max_size, - ) - - def _prepare_middleware(self) -> Iterator[Tuple[_Middleware, bool]]: - for m in reversed(self._middlewares): - if getattr(m, "__middleware_version__", None) == 1: - yield m, True - else: - warnings.warn( - 'old-style middleware "{!r}" deprecated, ' "see #2252".format(m), - DeprecationWarning, - stacklevel=2, - ) - yield m, False - - yield _fix_request_current_app(self), True - - async def _handle(self, request: Request) -> StreamResponse: - loop = asyncio.get_event_loop() - debug = loop.get_debug() - match_info = await self._router.resolve(request) - if debug: # pragma: no cover - if not isinstance(match_info, AbstractMatchInfo): - raise TypeError( - "match_info should be AbstractMatchInfo " - "instance, not {!r}".format(match_info) - ) - match_info.add_app(self) - - match_info.freeze() - - resp = None - request._match_info = match_info - expect = request.headers.get(hdrs.EXPECT) - if expect: - resp = await match_info.expect_handler(request) - await request.writer.drain() - - if resp is None: - handler = match_info.handler - - if self._run_middlewares: - for app in match_info.apps[::-1]: - for m, new_style in app._middlewares_handlers: # type: ignore[union-attr] # noqa - if new_style: - handler = update_wrapper( - partial(m, handler=handler), handler - ) - else: - handler = await m(app, handler) # type: ignore[arg-type] - - resp = await handler(request) - - return resp - - def __call__(self) -> "Application": - """gunicorn compatibility""" - return self - - def __repr__(self) -> str: - return f"" - - def __bool__(self) -> bool: - return True - - -class CleanupError(RuntimeError): - @property - def exceptions(self) -> List[BaseException]: - return cast(List[BaseException], self.args[1]) - - -if TYPE_CHECKING: # pragma: no cover - _CleanupContextBase = FrozenList[Callable[[Application], AsyncIterator[None]]] -else: - _CleanupContextBase = FrozenList - - -class CleanupContext(_CleanupContextBase): - def __init__(self) -> None: - super().__init__() - self._exits = [] # type: List[AsyncIterator[None]] - - async def _on_startup(self, app: Application) -> None: - for cb in self: - it = cb(app).__aiter__() - await it.__anext__() - self._exits.append(it) - - async def _on_cleanup(self, app: Application) -> None: - errors = [] - for it in reversed(self._exits): - try: - await it.__anext__() - except StopAsyncIteration: - pass - except Exception as exc: - errors.append(exc) - else: - errors.append(RuntimeError(f"{it!r} has more than one 'yield'")) - if errors: - if len(errors) == 1: - raise errors[0] - else: - raise CleanupError("Multiple errors on cleanup stage", errors) diff --git a/.venv/Lib/site-packages/aiohttp/web_exceptions.py b/.venv/Lib/site-packages/aiohttp/web_exceptions.py deleted file mode 100644 index 2eadca0..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_exceptions.py +++ /dev/null @@ -1,441 +0,0 @@ -import warnings -from typing import Any, Dict, Iterable, List, Optional, Set # noqa - -from yarl import URL - -from .typedefs import LooseHeaders, StrOrURL -from .web_response import Response - -__all__ = ( - "HTTPException", - "HTTPError", - "HTTPRedirection", - "HTTPSuccessful", - "HTTPOk", - "HTTPCreated", - "HTTPAccepted", - "HTTPNonAuthoritativeInformation", - "HTTPNoContent", - "HTTPResetContent", - "HTTPPartialContent", - "HTTPMultipleChoices", - "HTTPMovedPermanently", - "HTTPFound", - "HTTPSeeOther", - "HTTPNotModified", - "HTTPUseProxy", - "HTTPTemporaryRedirect", - "HTTPPermanentRedirect", - "HTTPClientError", - "HTTPBadRequest", - "HTTPUnauthorized", - "HTTPPaymentRequired", - "HTTPForbidden", - "HTTPNotFound", - "HTTPMethodNotAllowed", - "HTTPNotAcceptable", - "HTTPProxyAuthenticationRequired", - "HTTPRequestTimeout", - "HTTPConflict", - "HTTPGone", - "HTTPLengthRequired", - "HTTPPreconditionFailed", - "HTTPRequestEntityTooLarge", - "HTTPRequestURITooLong", - "HTTPUnsupportedMediaType", - "HTTPRequestRangeNotSatisfiable", - "HTTPExpectationFailed", - "HTTPMisdirectedRequest", - "HTTPUnprocessableEntity", - "HTTPFailedDependency", - "HTTPUpgradeRequired", - "HTTPPreconditionRequired", - "HTTPTooManyRequests", - "HTTPRequestHeaderFieldsTooLarge", - "HTTPUnavailableForLegalReasons", - "HTTPServerError", - "HTTPInternalServerError", - "HTTPNotImplemented", - "HTTPBadGateway", - "HTTPServiceUnavailable", - "HTTPGatewayTimeout", - "HTTPVersionNotSupported", - "HTTPVariantAlsoNegotiates", - "HTTPInsufficientStorage", - "HTTPNotExtended", - "HTTPNetworkAuthenticationRequired", -) - - -############################################################ -# HTTP Exceptions -############################################################ - - -class HTTPException(Response, Exception): - - # You should set in subclasses: - # status = 200 - - status_code = -1 - empty_body = False - - __http_exception__ = True - - def __init__( - self, - *, - headers: Optional[LooseHeaders] = None, - reason: Optional[str] = None, - body: Any = None, - text: Optional[str] = None, - content_type: Optional[str] = None, - ) -> None: - if body is not None: - warnings.warn( - "body argument is deprecated for http web exceptions", - DeprecationWarning, - ) - Response.__init__( - self, - status=self.status_code, - headers=headers, - reason=reason, - body=body, - text=text, - content_type=content_type, - ) - Exception.__init__(self, self.reason) - if self.body is None and not self.empty_body: - self.text = f"{self.status}: {self.reason}" - - def __bool__(self) -> bool: - return True - - -class HTTPError(HTTPException): - """Base class for exceptions with status codes in the 400s and 500s.""" - - -class HTTPRedirection(HTTPException): - """Base class for exceptions with status codes in the 300s.""" - - -class HTTPSuccessful(HTTPException): - """Base class for exceptions with status codes in the 200s.""" - - -class HTTPOk(HTTPSuccessful): - status_code = 200 - - -class HTTPCreated(HTTPSuccessful): - status_code = 201 - - -class HTTPAccepted(HTTPSuccessful): - status_code = 202 - - -class HTTPNonAuthoritativeInformation(HTTPSuccessful): - status_code = 203 - - -class HTTPNoContent(HTTPSuccessful): - status_code = 204 - empty_body = True - - -class HTTPResetContent(HTTPSuccessful): - status_code = 205 - empty_body = True - - -class HTTPPartialContent(HTTPSuccessful): - status_code = 206 - - -############################################################ -# 3xx redirection -############################################################ - - -class _HTTPMove(HTTPRedirection): - def __init__( - self, - location: StrOrURL, - *, - headers: Optional[LooseHeaders] = None, - reason: Optional[str] = None, - body: Any = None, - text: Optional[str] = None, - content_type: Optional[str] = None, - ) -> None: - if not location: - raise ValueError("HTTP redirects need a location to redirect to.") - super().__init__( - headers=headers, - reason=reason, - body=body, - text=text, - content_type=content_type, - ) - self.headers["Location"] = str(URL(location)) - self.location = location - - -class HTTPMultipleChoices(_HTTPMove): - status_code = 300 - - -class HTTPMovedPermanently(_HTTPMove): - status_code = 301 - - -class HTTPFound(_HTTPMove): - status_code = 302 - - -# This one is safe after a POST (the redirected location will be -# retrieved with GET): -class HTTPSeeOther(_HTTPMove): - status_code = 303 - - -class HTTPNotModified(HTTPRedirection): - # FIXME: this should include a date or etag header - status_code = 304 - empty_body = True - - -class HTTPUseProxy(_HTTPMove): - # Not a move, but looks a little like one - status_code = 305 - - -class HTTPTemporaryRedirect(_HTTPMove): - status_code = 307 - - -class HTTPPermanentRedirect(_HTTPMove): - status_code = 308 - - -############################################################ -# 4xx client error -############################################################ - - -class HTTPClientError(HTTPError): - pass - - -class HTTPBadRequest(HTTPClientError): - status_code = 400 - - -class HTTPUnauthorized(HTTPClientError): - status_code = 401 - - -class HTTPPaymentRequired(HTTPClientError): - status_code = 402 - - -class HTTPForbidden(HTTPClientError): - status_code = 403 - - -class HTTPNotFound(HTTPClientError): - status_code = 404 - - -class HTTPMethodNotAllowed(HTTPClientError): - status_code = 405 - - def __init__( - self, - method: str, - allowed_methods: Iterable[str], - *, - headers: Optional[LooseHeaders] = None, - reason: Optional[str] = None, - body: Any = None, - text: Optional[str] = None, - content_type: Optional[str] = None, - ) -> None: - allow = ",".join(sorted(allowed_methods)) - super().__init__( - headers=headers, - reason=reason, - body=body, - text=text, - content_type=content_type, - ) - self.headers["Allow"] = allow - self.allowed_methods = set(allowed_methods) # type: Set[str] - self.method = method.upper() - - -class HTTPNotAcceptable(HTTPClientError): - status_code = 406 - - -class HTTPProxyAuthenticationRequired(HTTPClientError): - status_code = 407 - - -class HTTPRequestTimeout(HTTPClientError): - status_code = 408 - - -class HTTPConflict(HTTPClientError): - status_code = 409 - - -class HTTPGone(HTTPClientError): - status_code = 410 - - -class HTTPLengthRequired(HTTPClientError): - status_code = 411 - - -class HTTPPreconditionFailed(HTTPClientError): - status_code = 412 - - -class HTTPRequestEntityTooLarge(HTTPClientError): - status_code = 413 - - def __init__(self, max_size: float, actual_size: float, **kwargs: Any) -> None: - kwargs.setdefault( - "text", - "Maximum request body size {} exceeded, " - "actual body size {}".format(max_size, actual_size), - ) - super().__init__(**kwargs) - - -class HTTPRequestURITooLong(HTTPClientError): - status_code = 414 - - -class HTTPUnsupportedMediaType(HTTPClientError): - status_code = 415 - - -class HTTPRequestRangeNotSatisfiable(HTTPClientError): - status_code = 416 - - -class HTTPExpectationFailed(HTTPClientError): - status_code = 417 - - -class HTTPMisdirectedRequest(HTTPClientError): - status_code = 421 - - -class HTTPUnprocessableEntity(HTTPClientError): - status_code = 422 - - -class HTTPFailedDependency(HTTPClientError): - status_code = 424 - - -class HTTPUpgradeRequired(HTTPClientError): - status_code = 426 - - -class HTTPPreconditionRequired(HTTPClientError): - status_code = 428 - - -class HTTPTooManyRequests(HTTPClientError): - status_code = 429 - - -class HTTPRequestHeaderFieldsTooLarge(HTTPClientError): - status_code = 431 - - -class HTTPUnavailableForLegalReasons(HTTPClientError): - status_code = 451 - - def __init__( - self, - link: str, - *, - headers: Optional[LooseHeaders] = None, - reason: Optional[str] = None, - body: Any = None, - text: Optional[str] = None, - content_type: Optional[str] = None, - ) -> None: - super().__init__( - headers=headers, - reason=reason, - body=body, - text=text, - content_type=content_type, - ) - self.headers["Link"] = '<%s>; rel="blocked-by"' % link - self.link = link - - -############################################################ -# 5xx Server Error -############################################################ -# Response status codes beginning with the digit "5" indicate cases in -# which the server is aware that it has erred or is incapable of -# performing the request. Except when responding to a HEAD request, the -# server SHOULD include an entity containing an explanation of the error -# situation, and whether it is a temporary or permanent condition. User -# agents SHOULD display any included entity to the user. These response -# codes are applicable to any request method. - - -class HTTPServerError(HTTPError): - pass - - -class HTTPInternalServerError(HTTPServerError): - status_code = 500 - - -class HTTPNotImplemented(HTTPServerError): - status_code = 501 - - -class HTTPBadGateway(HTTPServerError): - status_code = 502 - - -class HTTPServiceUnavailable(HTTPServerError): - status_code = 503 - - -class HTTPGatewayTimeout(HTTPServerError): - status_code = 504 - - -class HTTPVersionNotSupported(HTTPServerError): - status_code = 505 - - -class HTTPVariantAlsoNegotiates(HTTPServerError): - status_code = 506 - - -class HTTPInsufficientStorage(HTTPServerError): - status_code = 507 - - -class HTTPNotExtended(HTTPServerError): - status_code = 510 - - -class HTTPNetworkAuthenticationRequired(HTTPServerError): - status_code = 511 diff --git a/.venv/Lib/site-packages/aiohttp/web_fileresponse.py b/.venv/Lib/site-packages/aiohttp/web_fileresponse.py deleted file mode 100644 index f41ed3f..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_fileresponse.py +++ /dev/null @@ -1,288 +0,0 @@ -import asyncio -import mimetypes -import os -import pathlib -import sys -from typing import ( # noqa - IO, - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Iterator, - List, - Optional, - Tuple, - Union, - cast, -) - -from . import hdrs -from .abc import AbstractStreamWriter -from .helpers import ETAG_ANY, ETag -from .typedefs import Final, LooseHeaders -from .web_exceptions import ( - HTTPNotModified, - HTTPPartialContent, - HTTPPreconditionFailed, - HTTPRequestRangeNotSatisfiable, -) -from .web_response import StreamResponse - -__all__ = ("FileResponse",) - -if TYPE_CHECKING: # pragma: no cover - from .web_request import BaseRequest - - -_T_OnChunkSent = Optional[Callable[[bytes], Awaitable[None]]] - - -NOSENDFILE: Final[bool] = bool(os.environ.get("AIOHTTP_NOSENDFILE")) - - -class FileResponse(StreamResponse): - """A response object can be used to send files.""" - - def __init__( - self, - path: Union[str, pathlib.Path], - chunk_size: int = 256 * 1024, - status: int = 200, - reason: Optional[str] = None, - headers: Optional[LooseHeaders] = None, - ) -> None: - super().__init__(status=status, reason=reason, headers=headers) - - if isinstance(path, str): - path = pathlib.Path(path) - - self._path = path - self._chunk_size = chunk_size - - async def _sendfile_fallback( - self, writer: AbstractStreamWriter, fobj: IO[Any], offset: int, count: int - ) -> AbstractStreamWriter: - # To keep memory usage low,fobj is transferred in chunks - # controlled by the constructor's chunk_size argument. - - chunk_size = self._chunk_size - loop = asyncio.get_event_loop() - - await loop.run_in_executor(None, fobj.seek, offset) - - chunk = await loop.run_in_executor(None, fobj.read, chunk_size) - while chunk: - await writer.write(chunk) - count = count - chunk_size - if count <= 0: - break - chunk = await loop.run_in_executor(None, fobj.read, min(chunk_size, count)) - - await writer.drain() - return writer - - async def _sendfile( - self, request: "BaseRequest", fobj: IO[Any], offset: int, count: int - ) -> AbstractStreamWriter: - writer = await super().prepare(request) - assert writer is not None - - if NOSENDFILE or sys.version_info < (3, 7) or self.compression: - return await self._sendfile_fallback(writer, fobj, offset, count) - - loop = request._loop - transport = request.transport - assert transport is not None - - try: - await loop.sendfile(transport, fobj, offset, count) - except NotImplementedError: - return await self._sendfile_fallback(writer, fobj, offset, count) - - await super().write_eof() - return writer - - @staticmethod - def _strong_etag_match(etag_value: str, etags: Tuple[ETag, ...]) -> bool: - if len(etags) == 1 and etags[0].value == ETAG_ANY: - return True - return any(etag.value == etag_value for etag in etags if not etag.is_weak) - - async def _not_modified( - self, request: "BaseRequest", etag_value: str, last_modified: float - ) -> Optional[AbstractStreamWriter]: - self.set_status(HTTPNotModified.status_code) - self._length_check = False - self.etag = etag_value # type: ignore[assignment] - self.last_modified = last_modified # type: ignore[assignment] - # Delete any Content-Length headers provided by user. HTTP 304 - # should always have empty response body - return await super().prepare(request) - - async def _precondition_failed( - self, request: "BaseRequest" - ) -> Optional[AbstractStreamWriter]: - self.set_status(HTTPPreconditionFailed.status_code) - self.content_length = 0 - return await super().prepare(request) - - async def prepare(self, request: "BaseRequest") -> Optional[AbstractStreamWriter]: - filepath = self._path - - gzip = False - if "gzip" in request.headers.get(hdrs.ACCEPT_ENCODING, ""): - gzip_path = filepath.with_name(filepath.name + ".gz") - - if gzip_path.is_file(): - filepath = gzip_path - gzip = True - - loop = asyncio.get_event_loop() - st: os.stat_result = await loop.run_in_executor(None, filepath.stat) - - etag_value = f"{st.st_mtime_ns:x}-{st.st_size:x}" - last_modified = st.st_mtime - - # https://tools.ietf.org/html/rfc7232#section-6 - ifmatch = request.if_match - if ifmatch is not None and not self._strong_etag_match(etag_value, ifmatch): - return await self._precondition_failed(request) - - unmodsince = request.if_unmodified_since - if ( - unmodsince is not None - and ifmatch is None - and st.st_mtime > unmodsince.timestamp() - ): - return await self._precondition_failed(request) - - ifnonematch = request.if_none_match - if ifnonematch is not None and self._strong_etag_match(etag_value, ifnonematch): - return await self._not_modified(request, etag_value, last_modified) - - modsince = request.if_modified_since - if ( - modsince is not None - and ifnonematch is None - and st.st_mtime <= modsince.timestamp() - ): - return await self._not_modified(request, etag_value, last_modified) - - if hdrs.CONTENT_TYPE not in self.headers: - ct, encoding = mimetypes.guess_type(str(filepath)) - if not ct: - ct = "application/octet-stream" - should_set_ct = True - else: - encoding = "gzip" if gzip else None - should_set_ct = False - - status = self._status - file_size = st.st_size - count = file_size - - start = None - - ifrange = request.if_range - if ifrange is None or st.st_mtime <= ifrange.timestamp(): - # If-Range header check: - # condition = cached date >= last modification date - # return 206 if True else 200. - # if False: - # Range header would not be processed, return 200 - # if True but Range header missing - # return 200 - try: - rng = request.http_range - start = rng.start - end = rng.stop - except ValueError: - # https://tools.ietf.org/html/rfc7233: - # A server generating a 416 (Range Not Satisfiable) response to - # a byte-range request SHOULD send a Content-Range header field - # with an unsatisfied-range value. - # The complete-length in a 416 response indicates the current - # length of the selected representation. - # - # Will do the same below. Many servers ignore this and do not - # send a Content-Range header with HTTP 416 - self.headers[hdrs.CONTENT_RANGE] = f"bytes */{file_size}" - self.set_status(HTTPRequestRangeNotSatisfiable.status_code) - return await super().prepare(request) - - # If a range request has been made, convert start, end slice - # notation into file pointer offset and count - if start is not None or end is not None: - if start < 0 and end is None: # return tail of file - start += file_size - if start < 0: - # if Range:bytes=-1000 in request header but file size - # is only 200, there would be trouble without this - start = 0 - count = file_size - start - else: - # rfc7233:If the last-byte-pos value is - # absent, or if the value is greater than or equal to - # the current length of the representation data, - # the byte range is interpreted as the remainder - # of the representation (i.e., the server replaces the - # value of last-byte-pos with a value that is one less than - # the current length of the selected representation). - count = ( - min(end if end is not None else file_size, file_size) - start - ) - - if start >= file_size: - # HTTP 416 should be returned in this case. - # - # According to https://tools.ietf.org/html/rfc7233: - # If a valid byte-range-set includes at least one - # byte-range-spec with a first-byte-pos that is less than - # the current length of the representation, or at least one - # suffix-byte-range-spec with a non-zero suffix-length, - # then the byte-range-set is satisfiable. Otherwise, the - # byte-range-set is unsatisfiable. - self.headers[hdrs.CONTENT_RANGE] = f"bytes */{file_size}" - self.set_status(HTTPRequestRangeNotSatisfiable.status_code) - return await super().prepare(request) - - status = HTTPPartialContent.status_code - # Even though you are sending the whole file, you should still - # return a HTTP 206 for a Range request. - self.set_status(status) - - if should_set_ct: - self.content_type = ct # type: ignore[assignment] - if encoding: - self.headers[hdrs.CONTENT_ENCODING] = encoding - if gzip: - self.headers[hdrs.VARY] = hdrs.ACCEPT_ENCODING - - self.etag = etag_value # type: ignore[assignment] - self.last_modified = st.st_mtime # type: ignore[assignment] - self.content_length = count - - self.headers[hdrs.ACCEPT_RANGES] = "bytes" - - real_start = cast(int, start) - - if status == HTTPPartialContent.status_code: - self.headers[hdrs.CONTENT_RANGE] = "bytes {}-{}/{}".format( - real_start, real_start + count - 1, file_size - ) - - # If we are sending 0 bytes calling sendfile() will throw a ValueError - if count == 0 or request.method == hdrs.METH_HEAD or self.status in [204, 304]: - return await super().prepare(request) - - fobj = await loop.run_in_executor(None, filepath.open, "rb") - if start: # be aware that start could be None or int=0 here. - offset = start - else: - offset = 0 - - try: - return await self._sendfile(request, fobj, offset, count) - finally: - await loop.run_in_executor(None, fobj.close) diff --git a/.venv/Lib/site-packages/aiohttp/web_log.py b/.venv/Lib/site-packages/aiohttp/web_log.py deleted file mode 100644 index a977c1b..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_log.py +++ /dev/null @@ -1,208 +0,0 @@ -import datetime -import functools -import logging -import os -import re -from collections import namedtuple -from typing import Any, Callable, Dict, Iterable, List, Tuple # noqa - -from .abc import AbstractAccessLogger -from .web_request import BaseRequest -from .web_response import StreamResponse - -KeyMethod = namedtuple("KeyMethod", "key method") - - -class AccessLogger(AbstractAccessLogger): - """Helper object to log access. - - Usage: - log = logging.getLogger("spam") - log_format = "%a %{User-Agent}i" - access_logger = AccessLogger(log, log_format) - access_logger.log(request, response, time) - - Format: - %% The percent sign - %a Remote IP-address (IP-address of proxy if using reverse proxy) - %t Time when the request was started to process - %P The process ID of the child that serviced the request - %r First line of request - %s Response status code - %b Size of response in bytes, including HTTP headers - %T Time taken to serve the request, in seconds - %Tf Time taken to serve the request, in seconds with floating fraction - in .06f format - %D Time taken to serve the request, in microseconds - %{FOO}i request.headers['FOO'] - %{FOO}o response.headers['FOO'] - %{FOO}e os.environ['FOO'] - - """ - - LOG_FORMAT_MAP = { - "a": "remote_address", - "t": "request_start_time", - "P": "process_id", - "r": "first_request_line", - "s": "response_status", - "b": "response_size", - "T": "request_time", - "Tf": "request_time_frac", - "D": "request_time_micro", - "i": "request_header", - "o": "response_header", - } - - LOG_FORMAT = '%a %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"' - FORMAT_RE = re.compile(r"%(\{([A-Za-z0-9\-_]+)\}([ioe])|[atPrsbOD]|Tf?)") - CLEANUP_RE = re.compile(r"(%[^s])") - _FORMAT_CACHE = {} # type: Dict[str, Tuple[str, List[KeyMethod]]] - - def __init__(self, logger: logging.Logger, log_format: str = LOG_FORMAT) -> None: - """Initialise the logger. - - logger is a logger object to be used for logging. - log_format is a string with apache compatible log format description. - - """ - super().__init__(logger, log_format=log_format) - - _compiled_format = AccessLogger._FORMAT_CACHE.get(log_format) - if not _compiled_format: - _compiled_format = self.compile_format(log_format) - AccessLogger._FORMAT_CACHE[log_format] = _compiled_format - - self._log_format, self._methods = _compiled_format - - def compile_format(self, log_format: str) -> Tuple[str, List[KeyMethod]]: - """Translate log_format into form usable by modulo formatting - - All known atoms will be replaced with %s - Also methods for formatting of those atoms will be added to - _methods in appropriate order - - For example we have log_format = "%a %t" - This format will be translated to "%s %s" - Also contents of _methods will be - [self._format_a, self._format_t] - These method will be called and results will be passed - to translated string format. - - Each _format_* method receive 'args' which is list of arguments - given to self.log - - Exceptions are _format_e, _format_i and _format_o methods which - also receive key name (by functools.partial) - - """ - # list of (key, method) tuples, we don't use an OrderedDict as users - # can repeat the same key more than once - methods = list() - - for atom in self.FORMAT_RE.findall(log_format): - if atom[1] == "": - format_key1 = self.LOG_FORMAT_MAP[atom[0]] - m = getattr(AccessLogger, "_format_%s" % atom[0]) - key_method = KeyMethod(format_key1, m) - else: - format_key2 = (self.LOG_FORMAT_MAP[atom[2]], atom[1]) - m = getattr(AccessLogger, "_format_%s" % atom[2]) - key_method = KeyMethod(format_key2, functools.partial(m, atom[1])) - - methods.append(key_method) - - log_format = self.FORMAT_RE.sub(r"%s", log_format) - log_format = self.CLEANUP_RE.sub(r"%\1", log_format) - return log_format, methods - - @staticmethod - def _format_i( - key: str, request: BaseRequest, response: StreamResponse, time: float - ) -> str: - if request is None: - return "(no headers)" - - # suboptimal, make istr(key) once - return request.headers.get(key, "-") - - @staticmethod - def _format_o( - key: str, request: BaseRequest, response: StreamResponse, time: float - ) -> str: - # suboptimal, make istr(key) once - return response.headers.get(key, "-") - - @staticmethod - def _format_a(request: BaseRequest, response: StreamResponse, time: float) -> str: - if request is None: - return "-" - ip = request.remote - return ip if ip is not None else "-" - - @staticmethod - def _format_t(request: BaseRequest, response: StreamResponse, time: float) -> str: - now = datetime.datetime.utcnow() - start_time = now - datetime.timedelta(seconds=time) - return start_time.strftime("[%d/%b/%Y:%H:%M:%S +0000]") - - @staticmethod - def _format_P(request: BaseRequest, response: StreamResponse, time: float) -> str: - return "<%s>" % os.getpid() - - @staticmethod - def _format_r(request: BaseRequest, response: StreamResponse, time: float) -> str: - if request is None: - return "-" - return "{} {} HTTP/{}.{}".format( - request.method, - request.path_qs, - request.version.major, - request.version.minor, - ) - - @staticmethod - def _format_s(request: BaseRequest, response: StreamResponse, time: float) -> int: - return response.status - - @staticmethod - def _format_b(request: BaseRequest, response: StreamResponse, time: float) -> int: - return response.body_length - - @staticmethod - def _format_T(request: BaseRequest, response: StreamResponse, time: float) -> str: - return str(round(time)) - - @staticmethod - def _format_Tf(request: BaseRequest, response: StreamResponse, time: float) -> str: - return "%06f" % time - - @staticmethod - def _format_D(request: BaseRequest, response: StreamResponse, time: float) -> str: - return str(round(time * 1000000)) - - def _format_line( - self, request: BaseRequest, response: StreamResponse, time: float - ) -> Iterable[Tuple[str, Callable[[BaseRequest, StreamResponse, float], str]]]: - return [(key, method(request, response, time)) for key, method in self._methods] - - def log(self, request: BaseRequest, response: StreamResponse, time: float) -> None: - try: - fmt_info = self._format_line(request, response, time) - - values = list() - extra = dict() - for key, value in fmt_info: - values.append(value) - - if key.__class__ is str: - extra[key] = value - else: - k1, k2 = key # type: ignore[misc] - dct = extra.get(k1, {}) # type: ignore[var-annotated,has-type] - dct[k2] = value # type: ignore[index,has-type] - extra[k1] = dct # type: ignore[has-type,assignment] - - self.logger.info(self._log_format % tuple(values), extra=extra) - except Exception: - self.logger.exception("Error in logging") diff --git a/.venv/Lib/site-packages/aiohttp/web_middlewares.py b/.venv/Lib/site-packages/aiohttp/web_middlewares.py deleted file mode 100644 index fabcc44..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_middlewares.py +++ /dev/null @@ -1,119 +0,0 @@ -import re -from typing import TYPE_CHECKING, Awaitable, Callable, Tuple, Type, TypeVar - -from .typedefs import Handler -from .web_exceptions import HTTPPermanentRedirect, _HTTPMove -from .web_request import Request -from .web_response import StreamResponse -from .web_urldispatcher import SystemRoute - -__all__ = ( - "middleware", - "normalize_path_middleware", -) - -if TYPE_CHECKING: # pragma: no cover - from .web_app import Application - -_Func = TypeVar("_Func") - - -async def _check_request_resolves(request: Request, path: str) -> Tuple[bool, Request]: - alt_request = request.clone(rel_url=path) - - match_info = await request.app.router.resolve(alt_request) - alt_request._match_info = match_info - - if match_info.http_exception is None: - return True, alt_request - - return False, request - - -def middleware(f: _Func) -> _Func: - f.__middleware_version__ = 1 # type: ignore[attr-defined] - return f - - -_Middleware = Callable[[Request, Handler], Awaitable[StreamResponse]] - - -def normalize_path_middleware( - *, - append_slash: bool = True, - remove_slash: bool = False, - merge_slashes: bool = True, - redirect_class: Type[_HTTPMove] = HTTPPermanentRedirect, -) -> _Middleware: - """Factory for producing a middleware that normalizes the path of a request. - - Normalizing means: - - Add or remove a trailing slash to the path. - - Double slashes are replaced by one. - - The middleware returns as soon as it finds a path that resolves - correctly. The order if both merge and append/remove are enabled is - 1) merge slashes - 2) append/remove slash - 3) both merge slashes and append/remove slash. - If the path resolves with at least one of those conditions, it will - redirect to the new path. - - Only one of `append_slash` and `remove_slash` can be enabled. If both - are `True` the factory will raise an assertion error - - If `append_slash` is `True` the middleware will append a slash when - needed. If a resource is defined with trailing slash and the request - comes without it, it will append it automatically. - - If `remove_slash` is `True`, `append_slash` must be `False`. When enabled - the middleware will remove trailing slashes and redirect if the resource - is defined - - If merge_slashes is True, merge multiple consecutive slashes in the - path into one. - """ - correct_configuration = not (append_slash and remove_slash) - assert correct_configuration, "Cannot both remove and append slash" - - @middleware - async def impl(request: Request, handler: Handler) -> StreamResponse: - if isinstance(request.match_info.route, SystemRoute): - paths_to_check = [] - if "?" in request.raw_path: - path, query = request.raw_path.split("?", 1) - query = "?" + query - else: - query = "" - path = request.raw_path - - if merge_slashes: - paths_to_check.append(re.sub("//+", "/", path)) - if append_slash and not request.path.endswith("/"): - paths_to_check.append(path + "/") - if remove_slash and request.path.endswith("/"): - paths_to_check.append(path[:-1]) - if merge_slashes and append_slash: - paths_to_check.append(re.sub("//+", "/", path + "/")) - if merge_slashes and remove_slash: - merged_slashes = re.sub("//+", "/", path) - paths_to_check.append(merged_slashes[:-1]) - - for path in paths_to_check: - path = re.sub("^//+", "/", path) # SECURITY: GHSA-v6wp-4m6f-gcjg - resolves, request = await _check_request_resolves(request, path) - if resolves: - raise redirect_class(request.raw_path + query) - - return await handler(request) - - return impl - - -def _fix_request_current_app(app: "Application") -> _Middleware: - @middleware - async def impl(request: Request, handler: Handler) -> StreamResponse: - with request.match_info.set_current_app(app): - return await handler(request) - - return impl diff --git a/.venv/Lib/site-packages/aiohttp/web_protocol.py b/.venv/Lib/site-packages/aiohttp/web_protocol.py deleted file mode 100644 index ad0c049..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_protocol.py +++ /dev/null @@ -1,681 +0,0 @@ -import asyncio -import asyncio.streams -import traceback -import warnings -from collections import deque -from contextlib import suppress -from html import escape as html_escape -from http import HTTPStatus -from logging import Logger -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Deque, - Optional, - Sequence, - Tuple, - Type, - Union, - cast, -) - -import attr -import yarl - -from .abc import AbstractAccessLogger, AbstractStreamWriter -from .base_protocol import BaseProtocol -from .helpers import ceil_timeout -from .http import ( - HttpProcessingError, - HttpRequestParser, - HttpVersion10, - RawRequestMessage, - StreamWriter, -) -from .log import access_logger, server_logger -from .streams import EMPTY_PAYLOAD, StreamReader -from .tcp_helpers import tcp_keepalive -from .web_exceptions import HTTPException -from .web_log import AccessLogger -from .web_request import BaseRequest -from .web_response import Response, StreamResponse - -__all__ = ("RequestHandler", "RequestPayloadError", "PayloadAccessError") - -if TYPE_CHECKING: # pragma: no cover - from .web_server import Server - - -_RequestFactory = Callable[ - [ - RawRequestMessage, - StreamReader, - "RequestHandler", - AbstractStreamWriter, - "asyncio.Task[None]", - ], - BaseRequest, -] - -_RequestHandler = Callable[[BaseRequest], Awaitable[StreamResponse]] - -ERROR = RawRequestMessage( - "UNKNOWN", - "/", - HttpVersion10, - {}, # type: ignore[arg-type] - {}, # type: ignore[arg-type] - True, - None, - False, - False, - yarl.URL("/"), -) - - -class RequestPayloadError(Exception): - """Payload parsing error.""" - - -class PayloadAccessError(Exception): - """Payload was accessed after response was sent.""" - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class _ErrInfo: - status: int - exc: BaseException - message: str - - -_MsgType = Tuple[Union[RawRequestMessage, _ErrInfo], StreamReader] - - -class RequestHandler(BaseProtocol): - """HTTP protocol implementation. - - RequestHandler handles incoming HTTP request. It reads request line, - request headers and request payload and calls handle_request() method. - By default it always returns with 404 response. - - RequestHandler handles errors in incoming request, like bad - status line, bad headers or incomplete payload. If any error occurs, - connection gets closed. - - keepalive_timeout -- number of seconds before closing - keep-alive connection - - tcp_keepalive -- TCP keep-alive is on, default is on - - debug -- enable debug mode - - logger -- custom logger object - - access_log_class -- custom class for access_logger - - access_log -- custom logging object - - access_log_format -- access log format string - - loop -- Optional event loop - - max_line_size -- Optional maximum header line size - - max_field_size -- Optional maximum header field size - - max_headers -- Optional maximum header size - - """ - - KEEPALIVE_RESCHEDULE_DELAY = 1 - - __slots__ = ( - "_request_count", - "_keepalive", - "_manager", - "_request_handler", - "_request_factory", - "_tcp_keepalive", - "_keepalive_time", - "_keepalive_handle", - "_keepalive_timeout", - "_lingering_time", - "_messages", - "_message_tail", - "_waiter", - "_task_handler", - "_upgrade", - "_payload_parser", - "_request_parser", - "_reading_paused", - "logger", - "debug", - "access_log", - "access_logger", - "_close", - "_force_close", - "_current_request", - ) - - def __init__( - self, - manager: "Server", - *, - loop: asyncio.AbstractEventLoop, - keepalive_timeout: float = 75.0, # NGINX default is 75 secs - tcp_keepalive: bool = True, - logger: Logger = server_logger, - access_log_class: Type[AbstractAccessLogger] = AccessLogger, - access_log: Logger = access_logger, - access_log_format: str = AccessLogger.LOG_FORMAT, - debug: bool = False, - max_line_size: int = 8190, - max_headers: int = 32768, - max_field_size: int = 8190, - lingering_time: float = 10.0, - read_bufsize: int = 2 ** 16, - auto_decompress: bool = True, - ): - super().__init__(loop) - - self._request_count = 0 - self._keepalive = False - self._current_request = None # type: Optional[BaseRequest] - self._manager = manager # type: Optional[Server] - self._request_handler: Optional[_RequestHandler] = manager.request_handler - self._request_factory: Optional[_RequestFactory] = manager.request_factory - - self._tcp_keepalive = tcp_keepalive - # placeholder to be replaced on keepalive timeout setup - self._keepalive_time = 0.0 - self._keepalive_handle = None # type: Optional[asyncio.Handle] - self._keepalive_timeout = keepalive_timeout - self._lingering_time = float(lingering_time) - - self._messages: Deque[_MsgType] = deque() - self._message_tail = b"" - - self._waiter = None # type: Optional[asyncio.Future[None]] - self._task_handler = None # type: Optional[asyncio.Task[None]] - - self._upgrade = False - self._payload_parser = None # type: Any - self._request_parser = HttpRequestParser( - self, - loop, - read_bufsize, - max_line_size=max_line_size, - max_field_size=max_field_size, - max_headers=max_headers, - payload_exception=RequestPayloadError, - auto_decompress=auto_decompress, - ) # type: Optional[HttpRequestParser] - - self.logger = logger - self.debug = debug - self.access_log = access_log - if access_log: - self.access_logger = access_log_class( - access_log, access_log_format - ) # type: Optional[AbstractAccessLogger] - else: - self.access_logger = None - - self._close = False - self._force_close = False - - def __repr__(self) -> str: - return "<{} {}>".format( - self.__class__.__name__, - "connected" if self.transport is not None else "disconnected", - ) - - @property - def keepalive_timeout(self) -> float: - return self._keepalive_timeout - - async def shutdown(self, timeout: Optional[float] = 15.0) -> None: - """Do worker process exit preparations. - - We need to clean up everything and stop accepting requests. - It is especially important for keep-alive connections. - """ - self._force_close = True - - if self._keepalive_handle is not None: - self._keepalive_handle.cancel() - - if self._waiter: - self._waiter.cancel() - - # wait for handlers - with suppress(asyncio.CancelledError, asyncio.TimeoutError): - async with ceil_timeout(timeout): - if self._current_request is not None: - self._current_request._cancel(asyncio.CancelledError()) - - if self._task_handler is not None and not self._task_handler.done(): - await self._task_handler - - # force-close non-idle handler - if self._task_handler is not None: - self._task_handler.cancel() - - if self.transport is not None: - self.transport.close() - self.transport = None - - def connection_made(self, transport: asyncio.BaseTransport) -> None: - super().connection_made(transport) - - real_transport = cast(asyncio.Transport, transport) - if self._tcp_keepalive: - tcp_keepalive(real_transport) - - self._task_handler = self._loop.create_task(self.start()) - assert self._manager is not None - self._manager.connection_made(self, real_transport) - - def connection_lost(self, exc: Optional[BaseException]) -> None: - if self._manager is None: - return - self._manager.connection_lost(self, exc) - - super().connection_lost(exc) - - self._manager = None - self._force_close = True - self._request_factory = None - self._request_handler = None - self._request_parser = None - - if self._keepalive_handle is not None: - self._keepalive_handle.cancel() - - if self._current_request is not None: - if exc is None: - exc = ConnectionResetError("Connection lost") - self._current_request._cancel(exc) - - if self._task_handler is not None: - self._task_handler.cancel() - if self._waiter is not None: - self._waiter.cancel() - - self._task_handler = None - - if self._payload_parser is not None: - self._payload_parser.feed_eof() - self._payload_parser = None - - def set_parser(self, parser: Any) -> None: - # Actual type is WebReader - assert self._payload_parser is None - - self._payload_parser = parser - - if self._message_tail: - self._payload_parser.feed_data(self._message_tail) - self._message_tail = b"" - - def eof_received(self) -> None: - pass - - def data_received(self, data: bytes) -> None: - if self._force_close or self._close: - return - # parse http messages - messages: Sequence[_MsgType] - if self._payload_parser is None and not self._upgrade: - assert self._request_parser is not None - try: - messages, upgraded, tail = self._request_parser.feed_data(data) - except HttpProcessingError as exc: - messages = [ - (_ErrInfo(status=400, exc=exc, message=exc.message), EMPTY_PAYLOAD) - ] - upgraded = False - tail = b"" - - for msg, payload in messages or (): - self._request_count += 1 - self._messages.append((msg, payload)) - - waiter = self._waiter - if messages and waiter is not None and not waiter.done(): - # don't set result twice - waiter.set_result(None) - - self._upgrade = upgraded - if upgraded and tail: - self._message_tail = tail - - # no parser, just store - elif self._payload_parser is None and self._upgrade and data: - self._message_tail += data - - # feed payload - elif data: - eof, tail = self._payload_parser.feed_data(data) - if eof: - self.close() - - def keep_alive(self, val: bool) -> None: - """Set keep-alive connection mode. - - :param bool val: new state. - """ - self._keepalive = val - if self._keepalive_handle: - self._keepalive_handle.cancel() - self._keepalive_handle = None - - def close(self) -> None: - """Close connection. - - Stop accepting new pipelining messages and close - connection when handlers done processing messages. - """ - self._close = True - if self._waiter: - self._waiter.cancel() - - def force_close(self) -> None: - """Forcefully close connection.""" - self._force_close = True - if self._waiter: - self._waiter.cancel() - if self.transport is not None: - self.transport.close() - self.transport = None - - def log_access( - self, request: BaseRequest, response: StreamResponse, time: float - ) -> None: - if self.access_logger is not None: - self.access_logger.log(request, response, self._loop.time() - time) - - def log_debug(self, *args: Any, **kw: Any) -> None: - if self.debug: - self.logger.debug(*args, **kw) - - def log_exception(self, *args: Any, **kw: Any) -> None: - self.logger.exception(*args, **kw) - - def _process_keepalive(self) -> None: - if self._force_close or not self._keepalive: - return - - next = self._keepalive_time + self._keepalive_timeout - - # handler in idle state - if self._waiter: - if self._loop.time() > next: - self.force_close() - return - - # not all request handlers are done, - # reschedule itself to next second - self._keepalive_handle = self._loop.call_later( - self.KEEPALIVE_RESCHEDULE_DELAY, self._process_keepalive - ) - - async def _handle_request( - self, - request: BaseRequest, - start_time: float, - request_handler: Callable[[BaseRequest], Awaitable[StreamResponse]], - ) -> Tuple[StreamResponse, bool]: - assert self._request_handler is not None - try: - try: - self._current_request = request - resp = await request_handler(request) - finally: - self._current_request = None - except HTTPException as exc: - resp = exc - reset = await self.finish_response(request, resp, start_time) - except asyncio.CancelledError: - raise - except asyncio.TimeoutError as exc: - self.log_debug("Request handler timed out.", exc_info=exc) - resp = self.handle_error(request, 504) - reset = await self.finish_response(request, resp, start_time) - except Exception as exc: - resp = self.handle_error(request, 500, exc) - reset = await self.finish_response(request, resp, start_time) - else: - # Deprecation warning (See #2415) - if getattr(resp, "__http_exception__", False): - warnings.warn( - "returning HTTPException object is deprecated " - "(#2415) and will be removed, " - "please raise the exception instead", - DeprecationWarning, - ) - - reset = await self.finish_response(request, resp, start_time) - - return resp, reset - - async def start(self) -> None: - """Process incoming request. - - It reads request line, request headers and request payload, then - calls handle_request() method. Subclass has to override - handle_request(). start() handles various exceptions in request - or response handling. Connection is being closed always unless - keep_alive(True) specified. - """ - loop = self._loop - handler = self._task_handler - assert handler is not None - manager = self._manager - assert manager is not None - keepalive_timeout = self._keepalive_timeout - resp = None - assert self._request_factory is not None - assert self._request_handler is not None - - while not self._force_close: - if not self._messages: - try: - # wait for next request - self._waiter = loop.create_future() - await self._waiter - except asyncio.CancelledError: - break - finally: - self._waiter = None - - message, payload = self._messages.popleft() - - start = loop.time() - - manager.requests_count += 1 - writer = StreamWriter(self, loop) - if isinstance(message, _ErrInfo): - # make request_factory work - request_handler = self._make_error_handler(message) - message = ERROR - else: - request_handler = self._request_handler - - request = self._request_factory(message, payload, self, writer, handler) - try: - # a new task is used for copy context vars (#3406) - task = self._loop.create_task( - self._handle_request(request, start, request_handler) - ) - try: - resp, reset = await task - except (asyncio.CancelledError, ConnectionError): - self.log_debug("Ignored premature client disconnection") - break - - # Drop the processed task from asyncio.Task.all_tasks() early - del task - if reset: - self.log_debug("Ignored premature client disconnection 2") - break - - # notify server about keep-alive - self._keepalive = bool(resp.keep_alive) - - # check payload - if not payload.is_eof(): - lingering_time = self._lingering_time - if not self._force_close and lingering_time: - self.log_debug( - "Start lingering close timer for %s sec.", lingering_time - ) - - now = loop.time() - end_t = now + lingering_time - - with suppress(asyncio.TimeoutError, asyncio.CancelledError): - while not payload.is_eof() and now < end_t: - async with ceil_timeout(end_t - now): - # read and ignore - await payload.readany() - now = loop.time() - - # if payload still uncompleted - if not payload.is_eof() and not self._force_close: - self.log_debug("Uncompleted request.") - self.close() - - payload.set_exception(PayloadAccessError()) - - except asyncio.CancelledError: - self.log_debug("Ignored premature client disconnection ") - break - except RuntimeError as exc: - if self.debug: - self.log_exception("Unhandled runtime exception", exc_info=exc) - self.force_close() - except Exception as exc: - self.log_exception("Unhandled exception", exc_info=exc) - self.force_close() - finally: - if self.transport is None and resp is not None: - self.log_debug("Ignored premature client disconnection.") - elif not self._force_close: - if self._keepalive and not self._close: - # start keep-alive timer - if keepalive_timeout is not None: - now = self._loop.time() - self._keepalive_time = now - if self._keepalive_handle is None: - self._keepalive_handle = loop.call_at( - now + keepalive_timeout, self._process_keepalive - ) - else: - break - - # remove handler, close transport if no handlers left - if not self._force_close: - self._task_handler = None - if self.transport is not None: - self.transport.close() - - async def finish_response( - self, request: BaseRequest, resp: StreamResponse, start_time: float - ) -> bool: - """Prepare the response and write_eof, then log access. - - This has to - be called within the context of any exception so the access logger - can get exception information. Returns True if the client disconnects - prematurely. - """ - if self._request_parser is not None: - self._request_parser.set_upgraded(False) - self._upgrade = False - if self._message_tail: - self._request_parser.feed_data(self._message_tail) - self._message_tail = b"" - try: - prepare_meth = resp.prepare - except AttributeError: - if resp is None: - raise RuntimeError("Missing return " "statement on request handler") - else: - raise RuntimeError( - "Web-handler should return " - "a response instance, " - "got {!r}".format(resp) - ) - try: - await prepare_meth(request) - await resp.write_eof() - except ConnectionError: - self.log_access(request, resp, start_time) - return True - else: - self.log_access(request, resp, start_time) - return False - - def handle_error( - self, - request: BaseRequest, - status: int = 500, - exc: Optional[BaseException] = None, - message: Optional[str] = None, - ) -> StreamResponse: - """Handle errors. - - Returns HTTP response with specific status code. Logs additional - information. It always closes current connection. - """ - self.log_exception("Error handling request", exc_info=exc) - - # some data already got sent, connection is broken - if request.writer.output_size > 0: - raise ConnectionError( - "Response is sent already, cannot send another response " - "with the error message" - ) - - ct = "text/plain" - if status == HTTPStatus.INTERNAL_SERVER_ERROR: - title = "{0.value} {0.phrase}".format(HTTPStatus.INTERNAL_SERVER_ERROR) - msg = HTTPStatus.INTERNAL_SERVER_ERROR.description - tb = None - if self.debug: - with suppress(Exception): - tb = traceback.format_exc() - - if "text/html" in request.headers.get("Accept", ""): - if tb: - tb = html_escape(tb) - msg = f"

Traceback:

\n
{tb}
" - message = ( - "" - "{title}" - "\n

{title}

" - "\n{msg}\n\n" - ).format(title=title, msg=msg) - ct = "text/html" - else: - if tb: - msg = tb - message = title + "\n\n" + msg - - resp = Response(status=status, text=message, content_type=ct) - resp.force_close() - - return resp - - def _make_error_handler( - self, err_info: _ErrInfo - ) -> Callable[[BaseRequest], Awaitable[StreamResponse]]: - async def handler(request: BaseRequest) -> StreamResponse: - return self.handle_error( - request, err_info.status, err_info.exc, err_info.message - ) - - return handler diff --git a/.venv/Lib/site-packages/aiohttp/web_request.py b/.venv/Lib/site-packages/aiohttp/web_request.py deleted file mode 100644 index b3574ca..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_request.py +++ /dev/null @@ -1,874 +0,0 @@ -import asyncio -import datetime -import io -import re -import socket -import string -import tempfile -import types -import warnings -from http.cookies import SimpleCookie -from types import MappingProxyType -from typing import ( - TYPE_CHECKING, - Any, - Dict, - Iterator, - Mapping, - MutableMapping, - Optional, - Pattern, - Tuple, - Union, - cast, -) -from urllib.parse import parse_qsl - -import attr -from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy -from yarl import URL - -from . import hdrs -from .abc import AbstractStreamWriter -from .helpers import ( - DEBUG, - ETAG_ANY, - LIST_QUOTED_ETAG_RE, - ChainMapProxy, - ETag, - HeadersMixin, - parse_http_date, - reify, - sentinel, -) -from .http_parser import RawRequestMessage -from .http_writer import HttpVersion -from .multipart import BodyPartReader, MultipartReader -from .streams import EmptyStreamReader, StreamReader -from .typedefs import ( - DEFAULT_JSON_DECODER, - Final, - JSONDecoder, - LooseHeaders, - RawHeaders, - StrOrURL, -) -from .web_exceptions import HTTPRequestEntityTooLarge -from .web_response import StreamResponse - -__all__ = ("BaseRequest", "FileField", "Request") - - -if TYPE_CHECKING: # pragma: no cover - from .web_app import Application - from .web_protocol import RequestHandler - from .web_urldispatcher import UrlMappingMatchInfo - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class FileField: - name: str - filename: str - file: io.BufferedReader - content_type: str - headers: "CIMultiDictProxy[str]" - - -_TCHAR: Final[str] = string.digits + string.ascii_letters + r"!#$%&'*+.^_`|~-" -# '-' at the end to prevent interpretation as range in a char class - -_TOKEN: Final[str] = fr"[{_TCHAR}]+" - -_QDTEXT: Final[str] = r"[{}]".format( - r"".join(chr(c) for c in (0x09, 0x20, 0x21) + tuple(range(0x23, 0x7F))) -) -# qdtext includes 0x5C to escape 0x5D ('\]') -# qdtext excludes obs-text (because obsoleted, and encoding not specified) - -_QUOTED_PAIR: Final[str] = r"\\[\t !-~]" - -_QUOTED_STRING: Final[str] = r'"(?:{quoted_pair}|{qdtext})*"'.format( - qdtext=_QDTEXT, quoted_pair=_QUOTED_PAIR -) - -_FORWARDED_PAIR: Final[ - str -] = r"({token})=({token}|{quoted_string})(:\d{{1,4}})?".format( - token=_TOKEN, quoted_string=_QUOTED_STRING -) - -_QUOTED_PAIR_REPLACE_RE: Final[Pattern[str]] = re.compile(r"\\([\t !-~])") -# same pattern as _QUOTED_PAIR but contains a capture group - -_FORWARDED_PAIR_RE: Final[Pattern[str]] = re.compile(_FORWARDED_PAIR) - -############################################################ -# HTTP Request -############################################################ - - -class BaseRequest(MutableMapping[str, Any], HeadersMixin): - - POST_METHODS = { - hdrs.METH_PATCH, - hdrs.METH_POST, - hdrs.METH_PUT, - hdrs.METH_TRACE, - hdrs.METH_DELETE, - } - - ATTRS = HeadersMixin.ATTRS | frozenset( - [ - "_message", - "_protocol", - "_payload_writer", - "_payload", - "_headers", - "_method", - "_version", - "_rel_url", - "_post", - "_read_bytes", - "_state", - "_cache", - "_task", - "_client_max_size", - "_loop", - "_transport_sslcontext", - "_transport_peername", - ] - ) - - def __init__( - self, - message: RawRequestMessage, - payload: StreamReader, - protocol: "RequestHandler", - payload_writer: AbstractStreamWriter, - task: "asyncio.Task[None]", - loop: asyncio.AbstractEventLoop, - *, - client_max_size: int = 1024 ** 2, - state: Optional[Dict[str, Any]] = None, - scheme: Optional[str] = None, - host: Optional[str] = None, - remote: Optional[str] = None, - ) -> None: - if state is None: - state = {} - self._message = message - self._protocol = protocol - self._payload_writer = payload_writer - - self._payload = payload - self._headers = message.headers - self._method = message.method - self._version = message.version - self._rel_url = message.url - self._post = ( - None - ) # type: Optional[MultiDictProxy[Union[str, bytes, FileField]]] - self._read_bytes = None # type: Optional[bytes] - - self._state = state - self._cache = {} # type: Dict[str, Any] - self._task = task - self._client_max_size = client_max_size - self._loop = loop - - transport = self._protocol.transport - assert transport is not None - self._transport_sslcontext = transport.get_extra_info("sslcontext") - self._transport_peername = transport.get_extra_info("peername") - - if scheme is not None: - self._cache["scheme"] = scheme - if host is not None: - self._cache["host"] = host - if remote is not None: - self._cache["remote"] = remote - - def clone( - self, - *, - method: str = sentinel, - rel_url: StrOrURL = sentinel, - headers: LooseHeaders = sentinel, - scheme: str = sentinel, - host: str = sentinel, - remote: str = sentinel, - ) -> "BaseRequest": - """Clone itself with replacement some attributes. - - Creates and returns a new instance of Request object. If no parameters - are given, an exact copy is returned. If a parameter is not passed, it - will reuse the one from the current request object. - """ - if self._read_bytes: - raise RuntimeError("Cannot clone request " "after reading its content") - - dct = {} # type: Dict[str, Any] - if method is not sentinel: - dct["method"] = method - if rel_url is not sentinel: - new_url = URL(rel_url) - dct["url"] = new_url - dct["path"] = str(new_url) - if headers is not sentinel: - # a copy semantic - dct["headers"] = CIMultiDictProxy(CIMultiDict(headers)) - dct["raw_headers"] = tuple( - (k.encode("utf-8"), v.encode("utf-8")) for k, v in headers.items() - ) - - message = self._message._replace(**dct) - - kwargs = {} - if scheme is not sentinel: - kwargs["scheme"] = scheme - if host is not sentinel: - kwargs["host"] = host - if remote is not sentinel: - kwargs["remote"] = remote - - return self.__class__( - message, - self._payload, - self._protocol, - self._payload_writer, - self._task, - self._loop, - client_max_size=self._client_max_size, - state=self._state.copy(), - **kwargs, - ) - - @property - def task(self) -> "asyncio.Task[None]": - return self._task - - @property - def protocol(self) -> "RequestHandler": - return self._protocol - - @property - def transport(self) -> Optional[asyncio.Transport]: - if self._protocol is None: - return None - return self._protocol.transport - - @property - def writer(self) -> AbstractStreamWriter: - return self._payload_writer - - @reify - def message(self) -> RawRequestMessage: - warnings.warn("Request.message is deprecated", DeprecationWarning, stacklevel=3) - return self._message - - @reify - def rel_url(self) -> URL: - return self._rel_url - - @reify - def loop(self) -> asyncio.AbstractEventLoop: - warnings.warn( - "request.loop property is deprecated", DeprecationWarning, stacklevel=2 - ) - return self._loop - - # MutableMapping API - - def __getitem__(self, key: str) -> Any: - return self._state[key] - - def __setitem__(self, key: str, value: Any) -> None: - self._state[key] = value - - def __delitem__(self, key: str) -> None: - del self._state[key] - - def __len__(self) -> int: - return len(self._state) - - def __iter__(self) -> Iterator[str]: - return iter(self._state) - - ######## - - @reify - def secure(self) -> bool: - """A bool indicating if the request is handled with SSL.""" - return self.scheme == "https" - - @reify - def forwarded(self) -> Tuple[Mapping[str, str], ...]: - """A tuple containing all parsed Forwarded header(s). - - Makes an effort to parse Forwarded headers as specified by RFC 7239: - - - It adds one (immutable) dictionary per Forwarded 'field-value', ie - per proxy. The element corresponds to the data in the Forwarded - field-value added by the first proxy encountered by the client. Each - subsequent item corresponds to those added by later proxies. - - It checks that every value has valid syntax in general as specified - in section 4: either a 'token' or a 'quoted-string'. - - It un-escapes found escape sequences. - - It does NOT validate 'by' and 'for' contents as specified in section - 6. - - It does NOT validate 'host' contents (Host ABNF). - - It does NOT validate 'proto' contents for valid URI scheme names. - - Returns a tuple containing one or more immutable dicts - """ - elems = [] - for field_value in self._message.headers.getall(hdrs.FORWARDED, ()): - length = len(field_value) - pos = 0 - need_separator = False - elem = {} # type: Dict[str, str] - elems.append(types.MappingProxyType(elem)) - while 0 <= pos < length: - match = _FORWARDED_PAIR_RE.match(field_value, pos) - if match is not None: # got a valid forwarded-pair - if need_separator: - # bad syntax here, skip to next comma - pos = field_value.find(",", pos) - else: - name, value, port = match.groups() - if value[0] == '"': - # quoted string: remove quotes and unescape - value = _QUOTED_PAIR_REPLACE_RE.sub(r"\1", value[1:-1]) - if port: - value += port - elem[name.lower()] = value - pos += len(match.group(0)) - need_separator = True - elif field_value[pos] == ",": # next forwarded-element - need_separator = False - elem = {} - elems.append(types.MappingProxyType(elem)) - pos += 1 - elif field_value[pos] == ";": # next forwarded-pair - need_separator = False - pos += 1 - elif field_value[pos] in " \t": - # Allow whitespace even between forwarded-pairs, though - # RFC 7239 doesn't. This simplifies code and is in line - # with Postel's law. - pos += 1 - else: - # bad syntax here, skip to next comma - pos = field_value.find(",", pos) - return tuple(elems) - - @reify - def scheme(self) -> str: - """A string representing the scheme of the request. - - Hostname is resolved in this order: - - - overridden value by .clone(scheme=new_scheme) call. - - type of connection to peer: HTTPS if socket is SSL, HTTP otherwise. - - 'http' or 'https'. - """ - if self._transport_sslcontext: - return "https" - else: - return "http" - - @reify - def method(self) -> str: - """Read only property for getting HTTP method. - - The value is upper-cased str like 'GET', 'POST', 'PUT' etc. - """ - return self._method - - @reify - def version(self) -> HttpVersion: - """Read only property for getting HTTP version of request. - - Returns aiohttp.protocol.HttpVersion instance. - """ - return self._version - - @reify - def host(self) -> str: - """Hostname of the request. - - Hostname is resolved in this order: - - - overridden value by .clone(host=new_host) call. - - HOST HTTP header - - socket.getfqdn() value - """ - host = self._message.headers.get(hdrs.HOST) - if host is not None: - return host - return socket.getfqdn() - - @reify - def remote(self) -> Optional[str]: - """Remote IP of client initiated HTTP request. - - The IP is resolved in this order: - - - overridden value by .clone(remote=new_remote) call. - - peername of opened socket - """ - if self._transport_peername is None: - return None - if isinstance(self._transport_peername, (list, tuple)): - return str(self._transport_peername[0]) - return str(self._transport_peername) - - @reify - def url(self) -> URL: - url = URL.build(scheme=self.scheme, host=self.host) - return url.join(self._rel_url) - - @reify - def path(self) -> str: - """The URL including *PATH INFO* without the host or scheme. - - E.g., ``/app/blog`` - """ - return self._rel_url.path - - @reify - def path_qs(self) -> str: - """The URL including PATH_INFO and the query string. - - E.g, /app/blog?id=10 - """ - return str(self._rel_url) - - @reify - def raw_path(self) -> str: - """The URL including raw *PATH INFO* without the host or scheme. - - Warning, the path is unquoted and may contains non valid URL characters - - E.g., ``/my%2Fpath%7Cwith%21some%25strange%24characters`` - """ - return self._message.path - - @reify - def query(self) -> "MultiDictProxy[str]": - """A multidict with all the variables in the query string.""" - return MultiDictProxy(self._rel_url.query) - - @reify - def query_string(self) -> str: - """The query string in the URL. - - E.g., id=10 - """ - return self._rel_url.query_string - - @reify - def headers(self) -> "CIMultiDictProxy[str]": - """A case-insensitive multidict proxy with all headers.""" - return self._headers - - @reify - def raw_headers(self) -> RawHeaders: - """A sequence of pairs for all headers.""" - return self._message.raw_headers - - @reify - def if_modified_since(self) -> Optional[datetime.datetime]: - """The value of If-Modified-Since HTTP header, or None. - - This header is represented as a `datetime` object. - """ - return parse_http_date(self.headers.get(hdrs.IF_MODIFIED_SINCE)) - - @reify - def if_unmodified_since(self) -> Optional[datetime.datetime]: - """The value of If-Unmodified-Since HTTP header, or None. - - This header is represented as a `datetime` object. - """ - return parse_http_date(self.headers.get(hdrs.IF_UNMODIFIED_SINCE)) - - @staticmethod - def _etag_values(etag_header: str) -> Iterator[ETag]: - """Extract `ETag` objects from raw header.""" - if etag_header == ETAG_ANY: - yield ETag( - is_weak=False, - value=ETAG_ANY, - ) - else: - for match in LIST_QUOTED_ETAG_RE.finditer(etag_header): - is_weak, value, garbage = match.group(2, 3, 4) - # Any symbol captured by 4th group means - # that the following sequence is invalid. - if garbage: - break - - yield ETag( - is_weak=bool(is_weak), - value=value, - ) - - @classmethod - def _if_match_or_none_impl( - cls, header_value: Optional[str] - ) -> Optional[Tuple[ETag, ...]]: - if not header_value: - return None - - return tuple(cls._etag_values(header_value)) - - @reify - def if_match(self) -> Optional[Tuple[ETag, ...]]: - """The value of If-Match HTTP header, or None. - - This header is represented as a `tuple` of `ETag` objects. - """ - return self._if_match_or_none_impl(self.headers.get(hdrs.IF_MATCH)) - - @reify - def if_none_match(self) -> Optional[Tuple[ETag, ...]]: - """The value of If-None-Match HTTP header, or None. - - This header is represented as a `tuple` of `ETag` objects. - """ - return self._if_match_or_none_impl(self.headers.get(hdrs.IF_NONE_MATCH)) - - @reify - def if_range(self) -> Optional[datetime.datetime]: - """The value of If-Range HTTP header, or None. - - This header is represented as a `datetime` object. - """ - return parse_http_date(self.headers.get(hdrs.IF_RANGE)) - - @reify - def keep_alive(self) -> bool: - """Is keepalive enabled by client?""" - return not self._message.should_close - - @reify - def cookies(self) -> Mapping[str, str]: - """Return request cookies. - - A read-only dictionary-like object. - """ - raw = self.headers.get(hdrs.COOKIE, "") - parsed = SimpleCookie(raw) # type: SimpleCookie[str] - return MappingProxyType({key: val.value for key, val in parsed.items()}) - - @reify - def http_range(self) -> slice: - """The content of Range HTTP header. - - Return a slice instance. - - """ - rng = self._headers.get(hdrs.RANGE) - start, end = None, None - if rng is not None: - try: - pattern = r"^bytes=(\d*)-(\d*)$" - start, end = re.findall(pattern, rng)[0] - except IndexError: # pattern was not found in header - raise ValueError("range not in acceptable format") - - end = int(end) if end else None - start = int(start) if start else None - - if start is None and end is not None: - # end with no start is to return tail of content - start = -end - end = None - - if start is not None and end is not None: - # end is inclusive in range header, exclusive for slice - end += 1 - - if start >= end: - raise ValueError("start cannot be after end") - - if start is end is None: # No valid range supplied - raise ValueError("No start or end of range specified") - - return slice(start, end, 1) - - @reify - def content(self) -> StreamReader: - """Return raw payload stream.""" - return self._payload - - @property - def has_body(self) -> bool: - """Return True if request's HTTP BODY can be read, False otherwise.""" - warnings.warn( - "Deprecated, use .can_read_body #2005", DeprecationWarning, stacklevel=2 - ) - return not self._payload.at_eof() - - @property - def can_read_body(self) -> bool: - """Return True if request's HTTP BODY can be read, False otherwise.""" - return not self._payload.at_eof() - - @reify - def body_exists(self) -> bool: - """Return True if request has HTTP BODY, False otherwise.""" - return type(self._payload) is not EmptyStreamReader - - async def release(self) -> None: - """Release request. - - Eat unread part of HTTP BODY if present. - """ - while not self._payload.at_eof(): - await self._payload.readany() - - async def read(self) -> bytes: - """Read request body if present. - - Returns bytes object with full request content. - """ - if self._read_bytes is None: - body = bytearray() - while True: - chunk = await self._payload.readany() - body.extend(chunk) - if self._client_max_size: - body_size = len(body) - if body_size >= self._client_max_size: - raise HTTPRequestEntityTooLarge( - max_size=self._client_max_size, actual_size=body_size - ) - if not chunk: - break - self._read_bytes = bytes(body) - return self._read_bytes - - async def text(self) -> str: - """Return BODY as text using encoding from .charset.""" - bytes_body = await self.read() - encoding = self.charset or "utf-8" - return bytes_body.decode(encoding) - - async def json(self, *, loads: JSONDecoder = DEFAULT_JSON_DECODER) -> Any: - """Return BODY as JSON.""" - body = await self.text() - return loads(body) - - async def multipart(self) -> MultipartReader: - """Return async iterator to process BODY as multipart.""" - return MultipartReader(self._headers, self._payload) - - async def post(self) -> "MultiDictProxy[Union[str, bytes, FileField]]": - """Return POST parameters.""" - if self._post is not None: - return self._post - if self._method not in self.POST_METHODS: - self._post = MultiDictProxy(MultiDict()) - return self._post - - content_type = self.content_type - if content_type not in ( - "", - "application/x-www-form-urlencoded", - "multipart/form-data", - ): - self._post = MultiDictProxy(MultiDict()) - return self._post - - out = MultiDict() # type: MultiDict[Union[str, bytes, FileField]] - - if content_type == "multipart/form-data": - multipart = await self.multipart() - max_size = self._client_max_size - - field = await multipart.next() - while field is not None: - size = 0 - field_ct = field.headers.get(hdrs.CONTENT_TYPE) - - if isinstance(field, BodyPartReader): - assert field.name is not None - - # Note that according to RFC 7578, the Content-Type header - # is optional, even for files, so we can't assume it's - # present. - # https://tools.ietf.org/html/rfc7578#section-4.4 - if field.filename: - # store file in temp file - tmp = tempfile.TemporaryFile() - chunk = await field.read_chunk(size=2 ** 16) - while chunk: - chunk = field.decode(chunk) - tmp.write(chunk) - size += len(chunk) - if 0 < max_size < size: - tmp.close() - raise HTTPRequestEntityTooLarge( - max_size=max_size, actual_size=size - ) - chunk = await field.read_chunk(size=2 ** 16) - tmp.seek(0) - - if field_ct is None: - field_ct = "application/octet-stream" - - ff = FileField( - field.name, - field.filename, - cast(io.BufferedReader, tmp), - field_ct, - field.headers, - ) - out.add(field.name, ff) - else: - # deal with ordinary data - value = await field.read(decode=True) - if field_ct is None or field_ct.startswith("text/"): - charset = field.get_charset(default="utf-8") - out.add(field.name, value.decode(charset)) - else: - out.add(field.name, value) - size += len(value) - if 0 < max_size < size: - raise HTTPRequestEntityTooLarge( - max_size=max_size, actual_size=size - ) - else: - raise ValueError( - "To decode nested multipart you need " "to use custom reader", - ) - - field = await multipart.next() - else: - data = await self.read() - if data: - charset = self.charset or "utf-8" - out.extend( - parse_qsl( - data.rstrip().decode(charset), - keep_blank_values=True, - encoding=charset, - ) - ) - - self._post = MultiDictProxy(out) - return self._post - - def get_extra_info(self, name: str, default: Any = None) -> Any: - """Extra info from protocol transport""" - protocol = self._protocol - if protocol is None: - return default - - transport = protocol.transport - if transport is None: - return default - - return transport.get_extra_info(name, default) - - def __repr__(self) -> str: - ascii_encodable_path = self.path.encode("ascii", "backslashreplace").decode( - "ascii" - ) - return "<{} {} {} >".format( - self.__class__.__name__, self._method, ascii_encodable_path - ) - - def __eq__(self, other: object) -> bool: - return id(self) == id(other) - - def __bool__(self) -> bool: - return True - - async def _prepare_hook(self, response: StreamResponse) -> None: - return - - def _cancel(self, exc: BaseException) -> None: - self._payload.set_exception(exc) - - -class Request(BaseRequest): - - ATTRS = BaseRequest.ATTRS | frozenset(["_match_info"]) - - def __init__(self, *args: Any, **kwargs: Any) -> None: - super().__init__(*args, **kwargs) - - # matchdict, route_name, handler - # or information about traversal lookup - - # initialized after route resolving - self._match_info = None # type: Optional[UrlMappingMatchInfo] - - if DEBUG: - - def __setattr__(self, name: str, val: Any) -> None: - if name not in self.ATTRS: - warnings.warn( - "Setting custom {}.{} attribute " - "is discouraged".format(self.__class__.__name__, name), - DeprecationWarning, - stacklevel=2, - ) - super().__setattr__(name, val) - - def clone( - self, - *, - method: str = sentinel, - rel_url: StrOrURL = sentinel, - headers: LooseHeaders = sentinel, - scheme: str = sentinel, - host: str = sentinel, - remote: str = sentinel, - ) -> "Request": - ret = super().clone( - method=method, - rel_url=rel_url, - headers=headers, - scheme=scheme, - host=host, - remote=remote, - ) - new_ret = cast(Request, ret) - new_ret._match_info = self._match_info - return new_ret - - @reify - def match_info(self) -> "UrlMappingMatchInfo": - """Result of route resolving.""" - match_info = self._match_info - assert match_info is not None - return match_info - - @property - def app(self) -> "Application": - """Application instance.""" - match_info = self._match_info - assert match_info is not None - return match_info.current_app - - @property - def config_dict(self) -> ChainMapProxy: - match_info = self._match_info - assert match_info is not None - lst = match_info.apps - app = self.app - idx = lst.index(app) - sublist = list(reversed(lst[: idx + 1])) - return ChainMapProxy(sublist) - - async def _prepare_hook(self, response: StreamResponse) -> None: - match_info = self._match_info - if match_info is None: - return - for app in match_info._apps: - await app.on_response_prepare.send(self, response) diff --git a/.venv/Lib/site-packages/aiohttp/web_response.py b/.venv/Lib/site-packages/aiohttp/web_response.py deleted file mode 100644 index 7880ab2..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_response.py +++ /dev/null @@ -1,825 +0,0 @@ -import asyncio -import collections.abc -import datetime -import enum -import json -import math -import time -import warnings -import zlib -from concurrent.futures import Executor -from http.cookies import Morsel, SimpleCookie -from typing import ( - TYPE_CHECKING, - Any, - Dict, - Iterator, - Mapping, - MutableMapping, - Optional, - Tuple, - Union, - cast, -) - -from multidict import CIMultiDict, istr - -from . import hdrs, payload -from .abc import AbstractStreamWriter -from .helpers import ( - ETAG_ANY, - PY_38, - QUOTED_ETAG_RE, - ETag, - HeadersMixin, - parse_http_date, - rfc822_formatted_time, - sentinel, - validate_etag_value, -) -from .http import RESPONSES, SERVER_SOFTWARE, HttpVersion10, HttpVersion11 -from .payload import Payload -from .typedefs import JSONEncoder, LooseHeaders - -__all__ = ("ContentCoding", "StreamResponse", "Response", "json_response") - - -if TYPE_CHECKING: # pragma: no cover - from .web_request import BaseRequest - - BaseClass = MutableMapping[str, Any] -else: - BaseClass = collections.abc.MutableMapping - - -if not PY_38: - # allow samesite to be used in python < 3.8 - # already permitted in python 3.8, see https://bugs.python.org/issue29613 - Morsel._reserved["samesite"] = "SameSite" # type: ignore[attr-defined] - - -class ContentCoding(enum.Enum): - # The content codings that we have support for. - # - # Additional registered codings are listed at: - # https://www.iana.org/assignments/http-parameters/http-parameters.xhtml#content-coding - deflate = "deflate" - gzip = "gzip" - identity = "identity" - - -############################################################ -# HTTP Response classes -############################################################ - - -class StreamResponse(BaseClass, HeadersMixin): - - _length_check = True - - def __init__( - self, - *, - status: int = 200, - reason: Optional[str] = None, - headers: Optional[LooseHeaders] = None, - ) -> None: - self._body = None - self._keep_alive = None # type: Optional[bool] - self._chunked = False - self._compression = False - self._compression_force = None # type: Optional[ContentCoding] - self._cookies = SimpleCookie() # type: SimpleCookie[str] - - self._req = None # type: Optional[BaseRequest] - self._payload_writer = None # type: Optional[AbstractStreamWriter] - self._eof_sent = False - self._body_length = 0 - self._state = {} # type: Dict[str, Any] - - if headers is not None: - self._headers = CIMultiDict(headers) # type: CIMultiDict[str] - else: - self._headers = CIMultiDict() - - self.set_status(status, reason) - - @property - def prepared(self) -> bool: - return self._payload_writer is not None - - @property - def task(self) -> "Optional[asyncio.Task[None]]": - if self._req: - return self._req.task - else: - return None - - @property - def status(self) -> int: - return self._status - - @property - def chunked(self) -> bool: - return self._chunked - - @property - def compression(self) -> bool: - return self._compression - - @property - def reason(self) -> str: - return self._reason - - def set_status( - self, - status: int, - reason: Optional[str] = None, - _RESPONSES: Mapping[int, Tuple[str, str]] = RESPONSES, - ) -> None: - assert not self.prepared, ( - "Cannot change the response status code after " "the headers have been sent" - ) - self._status = int(status) - if reason is None: - try: - reason = _RESPONSES[self._status][0] - except Exception: - reason = "" - self._reason = reason - - @property - def keep_alive(self) -> Optional[bool]: - return self._keep_alive - - def force_close(self) -> None: - self._keep_alive = False - - @property - def body_length(self) -> int: - return self._body_length - - @property - def output_length(self) -> int: - warnings.warn("output_length is deprecated", DeprecationWarning) - assert self._payload_writer - return self._payload_writer.buffer_size - - def enable_chunked_encoding(self, chunk_size: Optional[int] = None) -> None: - """Enables automatic chunked transfer encoding.""" - self._chunked = True - - if hdrs.CONTENT_LENGTH in self._headers: - raise RuntimeError( - "You can't enable chunked encoding when " "a content length is set" - ) - if chunk_size is not None: - warnings.warn("Chunk size is deprecated #1615", DeprecationWarning) - - def enable_compression( - self, force: Optional[Union[bool, ContentCoding]] = None - ) -> None: - """Enables response compression encoding.""" - # Backwards compatibility for when force was a bool <0.17. - if type(force) == bool: - force = ContentCoding.deflate if force else ContentCoding.identity - warnings.warn( - "Using boolean for force is deprecated #3318", DeprecationWarning - ) - elif force is not None: - assert isinstance(force, ContentCoding), ( - "force should one of " "None, bool or " "ContentEncoding" - ) - - self._compression = True - self._compression_force = force - - @property - def headers(self) -> "CIMultiDict[str]": - return self._headers - - @property - def cookies(self) -> "SimpleCookie[str]": - return self._cookies - - def set_cookie( - self, - name: str, - value: str, - *, - expires: Optional[str] = None, - domain: Optional[str] = None, - max_age: Optional[Union[int, str]] = None, - path: str = "/", - secure: Optional[bool] = None, - httponly: Optional[bool] = None, - version: Optional[str] = None, - samesite: Optional[str] = None, - ) -> None: - """Set or update response cookie. - - Sets new cookie or updates existent with new value. - Also updates only those params which are not None. - """ - old = self._cookies.get(name) - if old is not None and old.coded_value == "": - # deleted cookie - self._cookies.pop(name, None) - - self._cookies[name] = value - c = self._cookies[name] - - if expires is not None: - c["expires"] = expires - elif c.get("expires") == "Thu, 01 Jan 1970 00:00:00 GMT": - del c["expires"] - - if domain is not None: - c["domain"] = domain - - if max_age is not None: - c["max-age"] = str(max_age) - elif "max-age" in c: - del c["max-age"] - - c["path"] = path - - if secure is not None: - c["secure"] = secure - if httponly is not None: - c["httponly"] = httponly - if version is not None: - c["version"] = version - if samesite is not None: - c["samesite"] = samesite - - def del_cookie( - self, name: str, *, domain: Optional[str] = None, path: str = "/" - ) -> None: - """Delete cookie. - - Creates new empty expired cookie. - """ - # TODO: do we need domain/path here? - self._cookies.pop(name, None) - self.set_cookie( - name, - "", - max_age=0, - expires="Thu, 01 Jan 1970 00:00:00 GMT", - domain=domain, - path=path, - ) - - @property - def content_length(self) -> Optional[int]: - # Just a placeholder for adding setter - return super().content_length - - @content_length.setter - def content_length(self, value: Optional[int]) -> None: - if value is not None: - value = int(value) - if self._chunked: - raise RuntimeError( - "You can't set content length when " "chunked encoding is enable" - ) - self._headers[hdrs.CONTENT_LENGTH] = str(value) - else: - self._headers.pop(hdrs.CONTENT_LENGTH, None) - - @property - def content_type(self) -> str: - # Just a placeholder for adding setter - return super().content_type - - @content_type.setter - def content_type(self, value: str) -> None: - self.content_type # read header values if needed - self._content_type = str(value) - self._generate_content_type_header() - - @property - def charset(self) -> Optional[str]: - # Just a placeholder for adding setter - return super().charset - - @charset.setter - def charset(self, value: Optional[str]) -> None: - ctype = self.content_type # read header values if needed - if ctype == "application/octet-stream": - raise RuntimeError( - "Setting charset for application/octet-stream " - "doesn't make sense, setup content_type first" - ) - assert self._content_dict is not None - if value is None: - self._content_dict.pop("charset", None) - else: - self._content_dict["charset"] = str(value).lower() - self._generate_content_type_header() - - @property - def last_modified(self) -> Optional[datetime.datetime]: - """The value of Last-Modified HTTP header, or None. - - This header is represented as a `datetime` object. - """ - return parse_http_date(self._headers.get(hdrs.LAST_MODIFIED)) - - @last_modified.setter - def last_modified( - self, value: Optional[Union[int, float, datetime.datetime, str]] - ) -> None: - if value is None: - self._headers.pop(hdrs.LAST_MODIFIED, None) - elif isinstance(value, (int, float)): - self._headers[hdrs.LAST_MODIFIED] = time.strftime( - "%a, %d %b %Y %H:%M:%S GMT", time.gmtime(math.ceil(value)) - ) - elif isinstance(value, datetime.datetime): - self._headers[hdrs.LAST_MODIFIED] = time.strftime( - "%a, %d %b %Y %H:%M:%S GMT", value.utctimetuple() - ) - elif isinstance(value, str): - self._headers[hdrs.LAST_MODIFIED] = value - - @property - def etag(self) -> Optional[ETag]: - quoted_value = self._headers.get(hdrs.ETAG) - if not quoted_value: - return None - elif quoted_value == ETAG_ANY: - return ETag(value=ETAG_ANY) - match = QUOTED_ETAG_RE.fullmatch(quoted_value) - if not match: - return None - is_weak, value = match.group(1, 2) - return ETag( - is_weak=bool(is_weak), - value=value, - ) - - @etag.setter - def etag(self, value: Optional[Union[ETag, str]]) -> None: - if value is None: - self._headers.pop(hdrs.ETAG, None) - elif (isinstance(value, str) and value == ETAG_ANY) or ( - isinstance(value, ETag) and value.value == ETAG_ANY - ): - self._headers[hdrs.ETAG] = ETAG_ANY - elif isinstance(value, str): - validate_etag_value(value) - self._headers[hdrs.ETAG] = f'"{value}"' - elif isinstance(value, ETag) and isinstance(value.value, str): - validate_etag_value(value.value) - hdr_value = f'W/"{value.value}"' if value.is_weak else f'"{value.value}"' - self._headers[hdrs.ETAG] = hdr_value - else: - raise ValueError( - f"Unsupported etag type: {type(value)}. " - f"etag must be str, ETag or None" - ) - - def _generate_content_type_header( - self, CONTENT_TYPE: istr = hdrs.CONTENT_TYPE - ) -> None: - assert self._content_dict is not None - assert self._content_type is not None - params = "; ".join(f"{k}={v}" for k, v in self._content_dict.items()) - if params: - ctype = self._content_type + "; " + params - else: - ctype = self._content_type - self._headers[CONTENT_TYPE] = ctype - - async def _do_start_compression(self, coding: ContentCoding) -> None: - if coding != ContentCoding.identity: - assert self._payload_writer is not None - self._headers[hdrs.CONTENT_ENCODING] = coding.value - self._payload_writer.enable_compression(coding.value) - # Compressed payload may have different content length, - # remove the header - self._headers.popall(hdrs.CONTENT_LENGTH, None) - - async def _start_compression(self, request: "BaseRequest") -> None: - if self._compression_force: - await self._do_start_compression(self._compression_force) - else: - accept_encoding = request.headers.get(hdrs.ACCEPT_ENCODING, "").lower() - for coding in ContentCoding: - if coding.value in accept_encoding: - await self._do_start_compression(coding) - return - - async def prepare(self, request: "BaseRequest") -> Optional[AbstractStreamWriter]: - if self._eof_sent: - return None - if self._payload_writer is not None: - return self._payload_writer - - return await self._start(request) - - async def _start(self, request: "BaseRequest") -> AbstractStreamWriter: - self._req = request - writer = self._payload_writer = request._payload_writer - - await self._prepare_headers() - await request._prepare_hook(self) - await self._write_headers() - - return writer - - async def _prepare_headers(self) -> None: - request = self._req - assert request is not None - writer = self._payload_writer - assert writer is not None - keep_alive = self._keep_alive - if keep_alive is None: - keep_alive = request.keep_alive - self._keep_alive = keep_alive - - version = request.version - - headers = self._headers - for cookie in self._cookies.values(): - value = cookie.output(header="")[1:] - headers.add(hdrs.SET_COOKIE, value) - - if self._compression: - await self._start_compression(request) - - if self._chunked: - if version != HttpVersion11: - raise RuntimeError( - "Using chunked encoding is forbidden " - "for HTTP/{0.major}.{0.minor}".format(request.version) - ) - writer.enable_chunking() - headers[hdrs.TRANSFER_ENCODING] = "chunked" - if hdrs.CONTENT_LENGTH in headers: - del headers[hdrs.CONTENT_LENGTH] - elif self._length_check: - writer.length = self.content_length - if writer.length is None: - if version >= HttpVersion11 and self.status != 204: - writer.enable_chunking() - headers[hdrs.TRANSFER_ENCODING] = "chunked" - if hdrs.CONTENT_LENGTH in headers: - del headers[hdrs.CONTENT_LENGTH] - else: - keep_alive = False - # HTTP 1.1: https://tools.ietf.org/html/rfc7230#section-3.3.2 - # HTTP 1.0: https://tools.ietf.org/html/rfc1945#section-10.4 - elif version >= HttpVersion11 and self.status in (100, 101, 102, 103, 204): - del headers[hdrs.CONTENT_LENGTH] - - if self.status not in (204, 304): - headers.setdefault(hdrs.CONTENT_TYPE, "application/octet-stream") - headers.setdefault(hdrs.DATE, rfc822_formatted_time()) - headers.setdefault(hdrs.SERVER, SERVER_SOFTWARE) - - # connection header - if hdrs.CONNECTION not in headers: - if keep_alive: - if version == HttpVersion10: - headers[hdrs.CONNECTION] = "keep-alive" - else: - if version == HttpVersion11: - headers[hdrs.CONNECTION] = "close" - - async def _write_headers(self) -> None: - request = self._req - assert request is not None - writer = self._payload_writer - assert writer is not None - # status line - version = request.version - status_line = "HTTP/{}.{} {} {}".format( - version[0], version[1], self._status, self._reason - ) - await writer.write_headers(status_line, self._headers) - - async def write(self, data: bytes) -> None: - assert isinstance( - data, (bytes, bytearray, memoryview) - ), "data argument must be byte-ish (%r)" % type(data) - - if self._eof_sent: - raise RuntimeError("Cannot call write() after write_eof()") - if self._payload_writer is None: - raise RuntimeError("Cannot call write() before prepare()") - - await self._payload_writer.write(data) - - async def drain(self) -> None: - assert not self._eof_sent, "EOF has already been sent" - assert self._payload_writer is not None, "Response has not been started" - warnings.warn( - "drain method is deprecated, use await resp.write()", - DeprecationWarning, - stacklevel=2, - ) - await self._payload_writer.drain() - - async def write_eof(self, data: bytes = b"") -> None: - assert isinstance( - data, (bytes, bytearray, memoryview) - ), "data argument must be byte-ish (%r)" % type(data) - - if self._eof_sent: - return - - assert self._payload_writer is not None, "Response has not been started" - - await self._payload_writer.write_eof(data) - self._eof_sent = True - self._req = None - self._body_length = self._payload_writer.output_size - self._payload_writer = None - - def __repr__(self) -> str: - if self._eof_sent: - info = "eof" - elif self.prepared: - assert self._req is not None - info = f"{self._req.method} {self._req.path} " - else: - info = "not prepared" - return f"<{self.__class__.__name__} {self.reason} {info}>" - - def __getitem__(self, key: str) -> Any: - return self._state[key] - - def __setitem__(self, key: str, value: Any) -> None: - self._state[key] = value - - def __delitem__(self, key: str) -> None: - del self._state[key] - - def __len__(self) -> int: - return len(self._state) - - def __iter__(self) -> Iterator[str]: - return iter(self._state) - - def __hash__(self) -> int: - return hash(id(self)) - - def __eq__(self, other: object) -> bool: - return self is other - - -class Response(StreamResponse): - def __init__( - self, - *, - body: Any = None, - status: int = 200, - reason: Optional[str] = None, - text: Optional[str] = None, - headers: Optional[LooseHeaders] = None, - content_type: Optional[str] = None, - charset: Optional[str] = None, - zlib_executor_size: Optional[int] = None, - zlib_executor: Optional[Executor] = None, - ) -> None: - if body is not None and text is not None: - raise ValueError("body and text are not allowed together") - - if headers is None: - real_headers = CIMultiDict() # type: CIMultiDict[str] - elif not isinstance(headers, CIMultiDict): - real_headers = CIMultiDict(headers) - else: - real_headers = headers # = cast('CIMultiDict[str]', headers) - - if content_type is not None and "charset" in content_type: - raise ValueError("charset must not be in content_type " "argument") - - if text is not None: - if hdrs.CONTENT_TYPE in real_headers: - if content_type or charset: - raise ValueError( - "passing both Content-Type header and " - "content_type or charset params " - "is forbidden" - ) - else: - # fast path for filling headers - if not isinstance(text, str): - raise TypeError("text argument must be str (%r)" % type(text)) - if content_type is None: - content_type = "text/plain" - if charset is None: - charset = "utf-8" - real_headers[hdrs.CONTENT_TYPE] = content_type + "; charset=" + charset - body = text.encode(charset) - text = None - else: - if hdrs.CONTENT_TYPE in real_headers: - if content_type is not None or charset is not None: - raise ValueError( - "passing both Content-Type header and " - "content_type or charset params " - "is forbidden" - ) - else: - if content_type is not None: - if charset is not None: - content_type += "; charset=" + charset - real_headers[hdrs.CONTENT_TYPE] = content_type - - super().__init__(status=status, reason=reason, headers=real_headers) - - if text is not None: - self.text = text - else: - self.body = body - - self._compressed_body = None # type: Optional[bytes] - self._zlib_executor_size = zlib_executor_size - self._zlib_executor = zlib_executor - - @property - def body(self) -> Optional[Union[bytes, Payload]]: - return self._body - - @body.setter - def body( - self, - body: bytes, - CONTENT_TYPE: istr = hdrs.CONTENT_TYPE, - CONTENT_LENGTH: istr = hdrs.CONTENT_LENGTH, - ) -> None: - if body is None: - self._body = None # type: Optional[bytes] - self._body_payload = False # type: bool - elif isinstance(body, (bytes, bytearray)): - self._body = body - self._body_payload = False - else: - try: - self._body = body = payload.PAYLOAD_REGISTRY.get(body) - except payload.LookupError: - raise ValueError("Unsupported body type %r" % type(body)) - - self._body_payload = True - - headers = self._headers - - # set content-length header if needed - if not self._chunked and CONTENT_LENGTH not in headers: - size = body.size - if size is not None: - headers[CONTENT_LENGTH] = str(size) - - # set content-type - if CONTENT_TYPE not in headers: - headers[CONTENT_TYPE] = body.content_type - - # copy payload headers - if body.headers: - for (key, value) in body.headers.items(): - if key not in headers: - headers[key] = value - - self._compressed_body = None - - @property - def text(self) -> Optional[str]: - if self._body is None: - return None - return self._body.decode(self.charset or "utf-8") - - @text.setter - def text(self, text: str) -> None: - assert text is None or isinstance( - text, str - ), "text argument must be str (%r)" % type(text) - - if self.content_type == "application/octet-stream": - self.content_type = "text/plain" - if self.charset is None: - self.charset = "utf-8" - - self._body = text.encode(self.charset) - self._body_payload = False - self._compressed_body = None - - @property - def content_length(self) -> Optional[int]: - if self._chunked: - return None - - if hdrs.CONTENT_LENGTH in self._headers: - return super().content_length - - if self._compressed_body is not None: - # Return length of the compressed body - return len(self._compressed_body) - elif self._body_payload: - # A payload without content length, or a compressed payload - return None - elif self._body is not None: - return len(self._body) - else: - return 0 - - @content_length.setter - def content_length(self, value: Optional[int]) -> None: - raise RuntimeError("Content length is set automatically") - - async def write_eof(self, data: bytes = b"") -> None: - if self._eof_sent: - return - if self._compressed_body is None: - body = self._body # type: Optional[Union[bytes, Payload]] - else: - body = self._compressed_body - assert not data, f"data arg is not supported, got {data!r}" - assert self._req is not None - assert self._payload_writer is not None - if body is not None: - if self._req._method == hdrs.METH_HEAD or self._status in [204, 304]: - await super().write_eof() - elif self._body_payload: - payload = cast(Payload, body) - await payload.write(self._payload_writer) - await super().write_eof() - else: - await super().write_eof(cast(bytes, body)) - else: - await super().write_eof() - - async def _start(self, request: "BaseRequest") -> AbstractStreamWriter: - if not self._chunked and hdrs.CONTENT_LENGTH not in self._headers: - if not self._body_payload: - if self._body is not None: - self._headers[hdrs.CONTENT_LENGTH] = str(len(self._body)) - else: - self._headers[hdrs.CONTENT_LENGTH] = "0" - - return await super()._start(request) - - def _compress_body(self, zlib_mode: int) -> None: - assert zlib_mode > 0 - compressobj = zlib.compressobj(wbits=zlib_mode) - body_in = self._body - assert body_in is not None - self._compressed_body = compressobj.compress(body_in) + compressobj.flush() - - async def _do_start_compression(self, coding: ContentCoding) -> None: - if self._body_payload or self._chunked: - return await super()._do_start_compression(coding) - - if coding != ContentCoding.identity: - # Instead of using _payload_writer.enable_compression, - # compress the whole body - zlib_mode = ( - 16 + zlib.MAX_WBITS if coding == ContentCoding.gzip else zlib.MAX_WBITS - ) - body_in = self._body - assert body_in is not None - if ( - self._zlib_executor_size is not None - and len(body_in) > self._zlib_executor_size - ): - await asyncio.get_event_loop().run_in_executor( - self._zlib_executor, self._compress_body, zlib_mode - ) - else: - self._compress_body(zlib_mode) - - body_out = self._compressed_body - assert body_out is not None - - self._headers[hdrs.CONTENT_ENCODING] = coding.value - self._headers[hdrs.CONTENT_LENGTH] = str(len(body_out)) - - -def json_response( - data: Any = sentinel, - *, - text: Optional[str] = None, - body: Optional[bytes] = None, - status: int = 200, - reason: Optional[str] = None, - headers: Optional[LooseHeaders] = None, - content_type: str = "application/json", - dumps: JSONEncoder = json.dumps, -) -> Response: - if data is not sentinel: - if text or body: - raise ValueError("only one of data, text, or body should be specified") - else: - text = dumps(data) - return Response( - text=text, - body=body, - status=status, - reason=reason, - headers=headers, - content_type=content_type, - ) diff --git a/.venv/Lib/site-packages/aiohttp/web_routedef.py b/.venv/Lib/site-packages/aiohttp/web_routedef.py deleted file mode 100644 index 671e5c7..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_routedef.py +++ /dev/null @@ -1,213 +0,0 @@ -import abc -import os # noqa -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Dict, - Iterator, - List, - Optional, - Sequence, - Type, - Union, - overload, -) - -import attr - -from . import hdrs -from .abc import AbstractView -from .typedefs import Handler, PathLike - -if TYPE_CHECKING: # pragma: no cover - from .web_request import Request - from .web_response import StreamResponse - from .web_urldispatcher import AbstractRoute, UrlDispatcher -else: - Request = StreamResponse = UrlDispatcher = AbstractRoute = None - - -__all__ = ( - "AbstractRouteDef", - "RouteDef", - "StaticDef", - "RouteTableDef", - "head", - "options", - "get", - "post", - "patch", - "put", - "delete", - "route", - "view", - "static", -) - - -class AbstractRouteDef(abc.ABC): - @abc.abstractmethod - def register(self, router: UrlDispatcher) -> List[AbstractRoute]: - pass # pragma: no cover - - -_HandlerType = Union[Type[AbstractView], Handler] - - -@attr.s(auto_attribs=True, frozen=True, repr=False, slots=True) -class RouteDef(AbstractRouteDef): - method: str - path: str - handler: _HandlerType - kwargs: Dict[str, Any] - - def __repr__(self) -> str: - info = [] - for name, value in sorted(self.kwargs.items()): - info.append(f", {name}={value!r}") - return " {handler.__name__!r}" "{info}>".format( - method=self.method, path=self.path, handler=self.handler, info="".join(info) - ) - - def register(self, router: UrlDispatcher) -> List[AbstractRoute]: - if self.method in hdrs.METH_ALL: - reg = getattr(router, "add_" + self.method.lower()) - return [reg(self.path, self.handler, **self.kwargs)] - else: - return [ - router.add_route(self.method, self.path, self.handler, **self.kwargs) - ] - - -@attr.s(auto_attribs=True, frozen=True, repr=False, slots=True) -class StaticDef(AbstractRouteDef): - prefix: str - path: PathLike - kwargs: Dict[str, Any] - - def __repr__(self) -> str: - info = [] - for name, value in sorted(self.kwargs.items()): - info.append(f", {name}={value!r}") - return " {path}" "{info}>".format( - prefix=self.prefix, path=self.path, info="".join(info) - ) - - def register(self, router: UrlDispatcher) -> List[AbstractRoute]: - resource = router.add_static(self.prefix, self.path, **self.kwargs) - routes = resource.get_info().get("routes", {}) - return list(routes.values()) - - -def route(method: str, path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: - return RouteDef(method, path, handler, kwargs) - - -def head(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: - return route(hdrs.METH_HEAD, path, handler, **kwargs) - - -def options(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: - return route(hdrs.METH_OPTIONS, path, handler, **kwargs) - - -def get( - path: str, - handler: _HandlerType, - *, - name: Optional[str] = None, - allow_head: bool = True, - **kwargs: Any, -) -> RouteDef: - return route( - hdrs.METH_GET, path, handler, name=name, allow_head=allow_head, **kwargs - ) - - -def post(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: - return route(hdrs.METH_POST, path, handler, **kwargs) - - -def put(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: - return route(hdrs.METH_PUT, path, handler, **kwargs) - - -def patch(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: - return route(hdrs.METH_PATCH, path, handler, **kwargs) - - -def delete(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: - return route(hdrs.METH_DELETE, path, handler, **kwargs) - - -def view(path: str, handler: Type[AbstractView], **kwargs: Any) -> RouteDef: - return route(hdrs.METH_ANY, path, handler, **kwargs) - - -def static(prefix: str, path: PathLike, **kwargs: Any) -> StaticDef: - return StaticDef(prefix, path, kwargs) - - -_Deco = Callable[[_HandlerType], _HandlerType] - - -class RouteTableDef(Sequence[AbstractRouteDef]): - """Route definition table""" - - def __init__(self) -> None: - self._items = [] # type: List[AbstractRouteDef] - - def __repr__(self) -> str: - return f"" - - @overload - def __getitem__(self, index: int) -> AbstractRouteDef: - ... - - @overload - def __getitem__(self, index: slice) -> List[AbstractRouteDef]: - ... - - def __getitem__(self, index): # type: ignore[no-untyped-def] - return self._items[index] - - def __iter__(self) -> Iterator[AbstractRouteDef]: - return iter(self._items) - - def __len__(self) -> int: - return len(self._items) - - def __contains__(self, item: object) -> bool: - return item in self._items - - def route(self, method: str, path: str, **kwargs: Any) -> _Deco: - def inner(handler: _HandlerType) -> _HandlerType: - self._items.append(RouteDef(method, path, handler, kwargs)) - return handler - - return inner - - def head(self, path: str, **kwargs: Any) -> _Deco: - return self.route(hdrs.METH_HEAD, path, **kwargs) - - def get(self, path: str, **kwargs: Any) -> _Deco: - return self.route(hdrs.METH_GET, path, **kwargs) - - def post(self, path: str, **kwargs: Any) -> _Deco: - return self.route(hdrs.METH_POST, path, **kwargs) - - def put(self, path: str, **kwargs: Any) -> _Deco: - return self.route(hdrs.METH_PUT, path, **kwargs) - - def patch(self, path: str, **kwargs: Any) -> _Deco: - return self.route(hdrs.METH_PATCH, path, **kwargs) - - def delete(self, path: str, **kwargs: Any) -> _Deco: - return self.route(hdrs.METH_DELETE, path, **kwargs) - - def view(self, path: str, **kwargs: Any) -> _Deco: - return self.route(hdrs.METH_ANY, path, **kwargs) - - def static(self, prefix: str, path: PathLike, **kwargs: Any) -> None: - self._items.append(StaticDef(prefix, path, kwargs)) diff --git a/.venv/Lib/site-packages/aiohttp/web_runner.py b/.venv/Lib/site-packages/aiohttp/web_runner.py deleted file mode 100644 index f4a64bf..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_runner.py +++ /dev/null @@ -1,381 +0,0 @@ -import asyncio -import signal -import socket -from abc import ABC, abstractmethod -from typing import Any, List, Optional, Set - -from yarl import URL - -from .web_app import Application -from .web_server import Server - -try: - from ssl import SSLContext -except ImportError: - SSLContext = object # type: ignore[misc,assignment] - - -__all__ = ( - "BaseSite", - "TCPSite", - "UnixSite", - "NamedPipeSite", - "SockSite", - "BaseRunner", - "AppRunner", - "ServerRunner", - "GracefulExit", -) - - -class GracefulExit(SystemExit): - code = 1 - - -def _raise_graceful_exit() -> None: - raise GracefulExit() - - -class BaseSite(ABC): - __slots__ = ("_runner", "_shutdown_timeout", "_ssl_context", "_backlog", "_server") - - def __init__( - self, - runner: "BaseRunner", - *, - shutdown_timeout: float = 60.0, - ssl_context: Optional[SSLContext] = None, - backlog: int = 128, - ) -> None: - if runner.server is None: - raise RuntimeError("Call runner.setup() before making a site") - self._runner = runner - self._shutdown_timeout = shutdown_timeout - self._ssl_context = ssl_context - self._backlog = backlog - self._server = None # type: Optional[asyncio.AbstractServer] - - @property - @abstractmethod - def name(self) -> str: - pass # pragma: no cover - - @abstractmethod - async def start(self) -> None: - self._runner._reg_site(self) - - async def stop(self) -> None: - self._runner._check_site(self) - if self._server is None: - self._runner._unreg_site(self) - return # not started yet - self._server.close() - # named pipes do not have wait_closed property - if hasattr(self._server, "wait_closed"): - await self._server.wait_closed() - await self._runner.shutdown() - assert self._runner.server - await self._runner.server.shutdown(self._shutdown_timeout) - self._runner._unreg_site(self) - - -class TCPSite(BaseSite): - __slots__ = ("_host", "_port", "_reuse_address", "_reuse_port") - - def __init__( - self, - runner: "BaseRunner", - host: Optional[str] = None, - port: Optional[int] = None, - *, - shutdown_timeout: float = 60.0, - ssl_context: Optional[SSLContext] = None, - backlog: int = 128, - reuse_address: Optional[bool] = None, - reuse_port: Optional[bool] = None, - ) -> None: - super().__init__( - runner, - shutdown_timeout=shutdown_timeout, - ssl_context=ssl_context, - backlog=backlog, - ) - self._host = host - if port is None: - port = 8443 if self._ssl_context else 8080 - self._port = port - self._reuse_address = reuse_address - self._reuse_port = reuse_port - - @property - def name(self) -> str: - scheme = "https" if self._ssl_context else "http" - host = "0.0.0.0" if self._host is None else self._host - return str(URL.build(scheme=scheme, host=host, port=self._port)) - - async def start(self) -> None: - await super().start() - loop = asyncio.get_event_loop() - server = self._runner.server - assert server is not None - self._server = await loop.create_server( - server, - self._host, - self._port, - ssl=self._ssl_context, - backlog=self._backlog, - reuse_address=self._reuse_address, - reuse_port=self._reuse_port, - ) - - -class UnixSite(BaseSite): - __slots__ = ("_path",) - - def __init__( - self, - runner: "BaseRunner", - path: str, - *, - shutdown_timeout: float = 60.0, - ssl_context: Optional[SSLContext] = None, - backlog: int = 128, - ) -> None: - super().__init__( - runner, - shutdown_timeout=shutdown_timeout, - ssl_context=ssl_context, - backlog=backlog, - ) - self._path = path - - @property - def name(self) -> str: - scheme = "https" if self._ssl_context else "http" - return f"{scheme}://unix:{self._path}:" - - async def start(self) -> None: - await super().start() - loop = asyncio.get_event_loop() - server = self._runner.server - assert server is not None - self._server = await loop.create_unix_server( - server, self._path, ssl=self._ssl_context, backlog=self._backlog - ) - - -class NamedPipeSite(BaseSite): - __slots__ = ("_path",) - - def __init__( - self, runner: "BaseRunner", path: str, *, shutdown_timeout: float = 60.0 - ) -> None: - loop = asyncio.get_event_loop() - if not isinstance( - loop, asyncio.ProactorEventLoop # type: ignore[attr-defined] - ): - raise RuntimeError( - "Named Pipes only available in proactor" "loop under windows" - ) - super().__init__(runner, shutdown_timeout=shutdown_timeout) - self._path = path - - @property - def name(self) -> str: - return self._path - - async def start(self) -> None: - await super().start() - loop = asyncio.get_event_loop() - server = self._runner.server - assert server is not None - _server = await loop.start_serving_pipe( # type: ignore[attr-defined] - server, self._path - ) - self._server = _server[0] - - -class SockSite(BaseSite): - __slots__ = ("_sock", "_name") - - def __init__( - self, - runner: "BaseRunner", - sock: socket.socket, - *, - shutdown_timeout: float = 60.0, - ssl_context: Optional[SSLContext] = None, - backlog: int = 128, - ) -> None: - super().__init__( - runner, - shutdown_timeout=shutdown_timeout, - ssl_context=ssl_context, - backlog=backlog, - ) - self._sock = sock - scheme = "https" if self._ssl_context else "http" - if hasattr(socket, "AF_UNIX") and sock.family == socket.AF_UNIX: - name = f"{scheme}://unix:{sock.getsockname()}:" - else: - host, port = sock.getsockname()[:2] - name = str(URL.build(scheme=scheme, host=host, port=port)) - self._name = name - - @property - def name(self) -> str: - return self._name - - async def start(self) -> None: - await super().start() - loop = asyncio.get_event_loop() - server = self._runner.server - assert server is not None - self._server = await loop.create_server( - server, sock=self._sock, ssl=self._ssl_context, backlog=self._backlog - ) - - -class BaseRunner(ABC): - __slots__ = ("_handle_signals", "_kwargs", "_server", "_sites") - - def __init__(self, *, handle_signals: bool = False, **kwargs: Any) -> None: - self._handle_signals = handle_signals - self._kwargs = kwargs - self._server = None # type: Optional[Server] - self._sites = [] # type: List[BaseSite] - - @property - def server(self) -> Optional[Server]: - return self._server - - @property - def addresses(self) -> List[Any]: - ret = [] # type: List[Any] - for site in self._sites: - server = site._server - if server is not None: - sockets = server.sockets - if sockets is not None: - for sock in sockets: - ret.append(sock.getsockname()) - return ret - - @property - def sites(self) -> Set[BaseSite]: - return set(self._sites) - - async def setup(self) -> None: - loop = asyncio.get_event_loop() - - if self._handle_signals: - try: - loop.add_signal_handler(signal.SIGINT, _raise_graceful_exit) - loop.add_signal_handler(signal.SIGTERM, _raise_graceful_exit) - except NotImplementedError: # pragma: no cover - # add_signal_handler is not implemented on Windows - pass - - self._server = await self._make_server() - - @abstractmethod - async def shutdown(self) -> None: - pass # pragma: no cover - - async def cleanup(self) -> None: - loop = asyncio.get_event_loop() - - # The loop over sites is intentional, an exception on gather() - # leaves self._sites in unpredictable state. - # The loop guaranties that a site is either deleted on success or - # still present on failure - for site in list(self._sites): - await site.stop() - await self._cleanup_server() - self._server = None - if self._handle_signals: - try: - loop.remove_signal_handler(signal.SIGINT) - loop.remove_signal_handler(signal.SIGTERM) - except NotImplementedError: # pragma: no cover - # remove_signal_handler is not implemented on Windows - pass - - @abstractmethod - async def _make_server(self) -> Server: - pass # pragma: no cover - - @abstractmethod - async def _cleanup_server(self) -> None: - pass # pragma: no cover - - def _reg_site(self, site: BaseSite) -> None: - if site in self._sites: - raise RuntimeError(f"Site {site} is already registered in runner {self}") - self._sites.append(site) - - def _check_site(self, site: BaseSite) -> None: - if site not in self._sites: - raise RuntimeError(f"Site {site} is not registered in runner {self}") - - def _unreg_site(self, site: BaseSite) -> None: - if site not in self._sites: - raise RuntimeError(f"Site {site} is not registered in runner {self}") - self._sites.remove(site) - - -class ServerRunner(BaseRunner): - """Low-level web server runner""" - - __slots__ = ("_web_server",) - - def __init__( - self, web_server: Server, *, handle_signals: bool = False, **kwargs: Any - ) -> None: - super().__init__(handle_signals=handle_signals, **kwargs) - self._web_server = web_server - - async def shutdown(self) -> None: - pass - - async def _make_server(self) -> Server: - return self._web_server - - async def _cleanup_server(self) -> None: - pass - - -class AppRunner(BaseRunner): - """Web Application runner""" - - __slots__ = ("_app",) - - def __init__( - self, app: Application, *, handle_signals: bool = False, **kwargs: Any - ) -> None: - super().__init__(handle_signals=handle_signals, **kwargs) - if not isinstance(app, Application): - raise TypeError( - "The first argument should be web.Application " - "instance, got {!r}".format(app) - ) - self._app = app - - @property - def app(self) -> Application: - return self._app - - async def shutdown(self) -> None: - await self._app.shutdown() - - async def _make_server(self) -> Server: - loop = asyncio.get_event_loop() - self._app._set_loop(loop) - self._app.on_startup.freeze() - await self._app.startup() - self._app.freeze() - - return self._app._make_handler(loop=loop, **self._kwargs) - - async def _cleanup_server(self) -> None: - await self._app.cleanup() diff --git a/.venv/Lib/site-packages/aiohttp/web_server.py b/.venv/Lib/site-packages/aiohttp/web_server.py deleted file mode 100644 index 5657ed9..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_server.py +++ /dev/null @@ -1,62 +0,0 @@ -"""Low level HTTP server.""" -import asyncio -from typing import Any, Awaitable, Callable, Dict, List, Optional # noqa - -from .abc import AbstractStreamWriter -from .helpers import get_running_loop -from .http_parser import RawRequestMessage -from .streams import StreamReader -from .web_protocol import RequestHandler, _RequestFactory, _RequestHandler -from .web_request import BaseRequest - -__all__ = ("Server",) - - -class Server: - def __init__( - self, - handler: _RequestHandler, - *, - request_factory: Optional[_RequestFactory] = None, - loop: Optional[asyncio.AbstractEventLoop] = None, - **kwargs: Any - ) -> None: - self._loop = get_running_loop(loop) - self._connections = {} # type: Dict[RequestHandler, asyncio.Transport] - self._kwargs = kwargs - self.requests_count = 0 - self.request_handler = handler - self.request_factory = request_factory or self._make_request - - @property - def connections(self) -> List[RequestHandler]: - return list(self._connections.keys()) - - def connection_made( - self, handler: RequestHandler, transport: asyncio.Transport - ) -> None: - self._connections[handler] = transport - - def connection_lost( - self, handler: RequestHandler, exc: Optional[BaseException] = None - ) -> None: - if handler in self._connections: - del self._connections[handler] - - def _make_request( - self, - message: RawRequestMessage, - payload: StreamReader, - protocol: RequestHandler, - writer: AbstractStreamWriter, - task: "asyncio.Task[None]", - ) -> BaseRequest: - return BaseRequest(message, payload, protocol, writer, task, self._loop) - - async def shutdown(self, timeout: Optional[float] = None) -> None: - coros = [conn.shutdown(timeout) for conn in self._connections] - await asyncio.gather(*coros) - self._connections.clear() - - def __call__(self) -> RequestHandler: - return RequestHandler(self, loop=self._loop, **self._kwargs) diff --git a/.venv/Lib/site-packages/aiohttp/web_urldispatcher.py b/.venv/Lib/site-packages/aiohttp/web_urldispatcher.py deleted file mode 100644 index 73ec4c0..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_urldispatcher.py +++ /dev/null @@ -1,1220 +0,0 @@ -import abc -import asyncio -import base64 -import hashlib -import inspect -import keyword -import os -import re -import warnings -from contextlib import contextmanager -from functools import wraps -from pathlib import Path -from types import MappingProxyType -from typing import ( - TYPE_CHECKING, - Any, - Awaitable, - Callable, - Container, - Dict, - Generator, - Iterable, - Iterator, - List, - Mapping, - Optional, - Pattern, - Set, - Sized, - Tuple, - Type, - Union, - cast, -) - -from yarl import URL, __version__ as yarl_version # type: ignore[attr-defined] - -from . import hdrs -from .abc import AbstractMatchInfo, AbstractRouter, AbstractView -from .helpers import DEBUG -from .http import HttpVersion11 -from .typedefs import Final, Handler, PathLike, TypedDict -from .web_exceptions import ( - HTTPException, - HTTPExpectationFailed, - HTTPForbidden, - HTTPMethodNotAllowed, - HTTPNotFound, -) -from .web_fileresponse import FileResponse -from .web_request import Request -from .web_response import Response, StreamResponse -from .web_routedef import AbstractRouteDef - -__all__ = ( - "UrlDispatcher", - "UrlMappingMatchInfo", - "AbstractResource", - "Resource", - "PlainResource", - "DynamicResource", - "AbstractRoute", - "ResourceRoute", - "StaticResource", - "View", -) - - -if TYPE_CHECKING: # pragma: no cover - from .web_app import Application - - BaseDict = Dict[str, str] -else: - BaseDict = dict - -YARL_VERSION: Final[Tuple[int, ...]] = tuple(map(int, yarl_version.split(".")[:2])) - -HTTP_METHOD_RE: Final[Pattern[str]] = re.compile( - r"^[0-9A-Za-z!#\$%&'\*\+\-\.\^_`\|~]+$" -) -ROUTE_RE: Final[Pattern[str]] = re.compile( - r"(\{[_a-zA-Z][^{}]*(?:\{[^{}]*\}[^{}]*)*\})" -) -PATH_SEP: Final[str] = re.escape("/") - - -_ExpectHandler = Callable[[Request], Awaitable[None]] -_Resolve = Tuple[Optional["UrlMappingMatchInfo"], Set[str]] - - -class _InfoDict(TypedDict, total=False): - path: str - - formatter: str - pattern: Pattern[str] - - directory: Path - prefix: str - routes: Mapping[str, "AbstractRoute"] - - app: "Application" - - domain: str - - rule: "AbstractRuleMatching" - - http_exception: HTTPException - - -class AbstractResource(Sized, Iterable["AbstractRoute"]): - def __init__(self, *, name: Optional[str] = None) -> None: - self._name = name - - @property - def name(self) -> Optional[str]: - return self._name - - @property - @abc.abstractmethod - def canonical(self) -> str: - """Exposes the resource's canonical path. - - For example '/foo/bar/{name}' - - """ - - @abc.abstractmethod # pragma: no branch - def url_for(self, **kwargs: str) -> URL: - """Construct url for resource with additional params.""" - - @abc.abstractmethod # pragma: no branch - async def resolve(self, request: Request) -> _Resolve: - """Resolve resource. - - Return (UrlMappingMatchInfo, allowed_methods) pair. - """ - - @abc.abstractmethod - def add_prefix(self, prefix: str) -> None: - """Add a prefix to processed URLs. - - Required for subapplications support. - """ - - @abc.abstractmethod - def get_info(self) -> _InfoDict: - """Return a dict with additional info useful for introspection""" - - def freeze(self) -> None: - pass - - @abc.abstractmethod - def raw_match(self, path: str) -> bool: - """Perform a raw match against path""" - - -class AbstractRoute(abc.ABC): - def __init__( - self, - method: str, - handler: Union[Handler, Type[AbstractView]], - *, - expect_handler: Optional[_ExpectHandler] = None, - resource: Optional[AbstractResource] = None, - ) -> None: - - if expect_handler is None: - expect_handler = _default_expect_handler - - assert asyncio.iscoroutinefunction( - expect_handler - ), f"Coroutine is expected, got {expect_handler!r}" - - method = method.upper() - if not HTTP_METHOD_RE.match(method): - raise ValueError(f"{method} is not allowed HTTP method") - - assert callable(handler), handler - if asyncio.iscoroutinefunction(handler): - pass - elif inspect.isgeneratorfunction(handler): - warnings.warn( - "Bare generators are deprecated, " "use @coroutine wrapper", - DeprecationWarning, - ) - elif isinstance(handler, type) and issubclass(handler, AbstractView): - pass - else: - warnings.warn( - "Bare functions are deprecated, " "use async ones", DeprecationWarning - ) - - @wraps(handler) - async def handler_wrapper(request: Request) -> StreamResponse: - result = old_handler(request) - if asyncio.iscoroutine(result): - return await result - return result # type: ignore[return-value] - - old_handler = handler - handler = handler_wrapper - - self._method = method - self._handler = handler - self._expect_handler = expect_handler - self._resource = resource - - @property - def method(self) -> str: - return self._method - - @property - def handler(self) -> Handler: - return self._handler - - @property - @abc.abstractmethod - def name(self) -> Optional[str]: - """Optional route's name, always equals to resource's name.""" - - @property - def resource(self) -> Optional[AbstractResource]: - return self._resource - - @abc.abstractmethod - def get_info(self) -> _InfoDict: - """Return a dict with additional info useful for introspection""" - - @abc.abstractmethod # pragma: no branch - def url_for(self, *args: str, **kwargs: str) -> URL: - """Construct url for route with additional params.""" - - async def handle_expect_header(self, request: Request) -> None: - await self._expect_handler(request) - - -class UrlMappingMatchInfo(BaseDict, AbstractMatchInfo): - def __init__(self, match_dict: Dict[str, str], route: AbstractRoute): - super().__init__(match_dict) - self._route = route - self._apps = [] # type: List[Application] - self._current_app = None # type: Optional[Application] - self._frozen = False - - @property - def handler(self) -> Handler: - return self._route.handler - - @property - def route(self) -> AbstractRoute: - return self._route - - @property - def expect_handler(self) -> _ExpectHandler: - return self._route.handle_expect_header - - @property - def http_exception(self) -> Optional[HTTPException]: - return None - - def get_info(self) -> _InfoDict: # type: ignore[override] - return self._route.get_info() - - @property - def apps(self) -> Tuple["Application", ...]: - return tuple(self._apps) - - def add_app(self, app: "Application") -> None: - if self._frozen: - raise RuntimeError("Cannot change apps stack after .freeze() call") - if self._current_app is None: - self._current_app = app - self._apps.insert(0, app) - - @property - def current_app(self) -> "Application": - app = self._current_app - assert app is not None - return app - - @contextmanager - def set_current_app(self, app: "Application") -> Generator[None, None, None]: - if DEBUG: # pragma: no cover - if app not in self._apps: - raise RuntimeError( - "Expected one of the following apps {!r}, got {!r}".format( - self._apps, app - ) - ) - prev = self._current_app - self._current_app = app - try: - yield - finally: - self._current_app = prev - - def freeze(self) -> None: - self._frozen = True - - def __repr__(self) -> str: - return f"" - - -class MatchInfoError(UrlMappingMatchInfo): - def __init__(self, http_exception: HTTPException) -> None: - self._exception = http_exception - super().__init__({}, SystemRoute(self._exception)) - - @property - def http_exception(self) -> HTTPException: - return self._exception - - def __repr__(self) -> str: - return "".format( - self._exception.status, self._exception.reason - ) - - -async def _default_expect_handler(request: Request) -> None: - """Default handler for Expect header. - - Just send "100 Continue" to client. - raise HTTPExpectationFailed if value of header is not "100-continue" - """ - expect = request.headers.get(hdrs.EXPECT, "") - if request.version == HttpVersion11: - if expect.lower() == "100-continue": - await request.writer.write(b"HTTP/1.1 100 Continue\r\n\r\n") - else: - raise HTTPExpectationFailed(text="Unknown Expect: %s" % expect) - - -class Resource(AbstractResource): - def __init__(self, *, name: Optional[str] = None) -> None: - super().__init__(name=name) - self._routes = [] # type: List[ResourceRoute] - - def add_route( - self, - method: str, - handler: Union[Type[AbstractView], Handler], - *, - expect_handler: Optional[_ExpectHandler] = None, - ) -> "ResourceRoute": - - for route_obj in self._routes: - if route_obj.method == method or route_obj.method == hdrs.METH_ANY: - raise RuntimeError( - "Added route will never be executed, " - "method {route.method} is already " - "registered".format(route=route_obj) - ) - - route_obj = ResourceRoute(method, handler, self, expect_handler=expect_handler) - self.register_route(route_obj) - return route_obj - - def register_route(self, route: "ResourceRoute") -> None: - assert isinstance( - route, ResourceRoute - ), f"Instance of Route class is required, got {route!r}" - self._routes.append(route) - - async def resolve(self, request: Request) -> _Resolve: - allowed_methods = set() # type: Set[str] - - match_dict = self._match(request.rel_url.raw_path) - if match_dict is None: - return None, allowed_methods - - for route_obj in self._routes: - route_method = route_obj.method - allowed_methods.add(route_method) - - if route_method == request.method or route_method == hdrs.METH_ANY: - return (UrlMappingMatchInfo(match_dict, route_obj), allowed_methods) - else: - return None, allowed_methods - - @abc.abstractmethod - def _match(self, path: str) -> Optional[Dict[str, str]]: - pass # pragma: no cover - - def __len__(self) -> int: - return len(self._routes) - - def __iter__(self) -> Iterator[AbstractRoute]: - return iter(self._routes) - - # TODO: implement all abstract methods - - -class PlainResource(Resource): - def __init__(self, path: str, *, name: Optional[str] = None) -> None: - super().__init__(name=name) - assert not path or path.startswith("/") - self._path = path - - @property - def canonical(self) -> str: - return self._path - - def freeze(self) -> None: - if not self._path: - self._path = "/" - - def add_prefix(self, prefix: str) -> None: - assert prefix.startswith("/") - assert not prefix.endswith("/") - assert len(prefix) > 1 - self._path = prefix + self._path - - def _match(self, path: str) -> Optional[Dict[str, str]]: - # string comparison is about 10 times faster than regexp matching - if self._path == path: - return {} - else: - return None - - def raw_match(self, path: str) -> bool: - return self._path == path - - def get_info(self) -> _InfoDict: - return {"path": self._path} - - def url_for(self) -> URL: # type: ignore[override] - return URL.build(path=self._path, encoded=True) - - def __repr__(self) -> str: - name = "'" + self.name + "' " if self.name is not None else "" - return f"" - - -class DynamicResource(Resource): - - DYN = re.compile(r"\{(?P[_a-zA-Z][_a-zA-Z0-9]*)\}") - DYN_WITH_RE = re.compile(r"\{(?P[_a-zA-Z][_a-zA-Z0-9]*):(?P.+)\}") - GOOD = r"[^{}/]+" - - def __init__(self, path: str, *, name: Optional[str] = None) -> None: - super().__init__(name=name) - pattern = "" - formatter = "" - for part in ROUTE_RE.split(path): - match = self.DYN.fullmatch(part) - if match: - pattern += "(?P<{}>{})".format(match.group("var"), self.GOOD) - formatter += "{" + match.group("var") + "}" - continue - - match = self.DYN_WITH_RE.fullmatch(part) - if match: - pattern += "(?P<{var}>{re})".format(**match.groupdict()) - formatter += "{" + match.group("var") + "}" - continue - - if "{" in part or "}" in part: - raise ValueError(f"Invalid path '{path}'['{part}']") - - part = _requote_path(part) - formatter += part - pattern += re.escape(part) - - try: - compiled = re.compile(pattern) - except re.error as exc: - raise ValueError(f"Bad pattern '{pattern}': {exc}") from None - assert compiled.pattern.startswith(PATH_SEP) - assert formatter.startswith("/") - self._pattern = compiled - self._formatter = formatter - - @property - def canonical(self) -> str: - return self._formatter - - def add_prefix(self, prefix: str) -> None: - assert prefix.startswith("/") - assert not prefix.endswith("/") - assert len(prefix) > 1 - self._pattern = re.compile(re.escape(prefix) + self._pattern.pattern) - self._formatter = prefix + self._formatter - - def _match(self, path: str) -> Optional[Dict[str, str]]: - match = self._pattern.fullmatch(path) - if match is None: - return None - else: - return { - key: _unquote_path(value) for key, value in match.groupdict().items() - } - - def raw_match(self, path: str) -> bool: - return self._formatter == path - - def get_info(self) -> _InfoDict: - return {"formatter": self._formatter, "pattern": self._pattern} - - def url_for(self, **parts: str) -> URL: - url = self._formatter.format_map({k: _quote_path(v) for k, v in parts.items()}) - return URL.build(path=url, encoded=True) - - def __repr__(self) -> str: - name = "'" + self.name + "' " if self.name is not None else "" - return "".format( - name=name, formatter=self._formatter - ) - - -class PrefixResource(AbstractResource): - def __init__(self, prefix: str, *, name: Optional[str] = None) -> None: - assert not prefix or prefix.startswith("/"), prefix - assert prefix in ("", "/") or not prefix.endswith("/"), prefix - super().__init__(name=name) - self._prefix = _requote_path(prefix) - self._prefix2 = self._prefix + "/" - - @property - def canonical(self) -> str: - return self._prefix - - def add_prefix(self, prefix: str) -> None: - assert prefix.startswith("/") - assert not prefix.endswith("/") - assert len(prefix) > 1 - self._prefix = prefix + self._prefix - self._prefix2 = self._prefix + "/" - - def raw_match(self, prefix: str) -> bool: - return False - - # TODO: impl missing abstract methods - - -class StaticResource(PrefixResource): - VERSION_KEY = "v" - - def __init__( - self, - prefix: str, - directory: PathLike, - *, - name: Optional[str] = None, - expect_handler: Optional[_ExpectHandler] = None, - chunk_size: int = 256 * 1024, - show_index: bool = False, - follow_symlinks: bool = False, - append_version: bool = False, - ) -> None: - super().__init__(prefix, name=name) - try: - directory = Path(directory) - if str(directory).startswith("~"): - directory = Path(os.path.expanduser(str(directory))) - directory = directory.resolve() - if not directory.is_dir(): - raise ValueError("Not a directory") - except (FileNotFoundError, ValueError) as error: - raise ValueError(f"No directory exists at '{directory}'") from error - self._directory = directory - self._show_index = show_index - self._chunk_size = chunk_size - self._follow_symlinks = follow_symlinks - self._expect_handler = expect_handler - self._append_version = append_version - - self._routes = { - "GET": ResourceRoute( - "GET", self._handle, self, expect_handler=expect_handler - ), - "HEAD": ResourceRoute( - "HEAD", self._handle, self, expect_handler=expect_handler - ), - } - - def url_for( # type: ignore[override] - self, - *, - filename: Union[str, Path], - append_version: Optional[bool] = None, - ) -> URL: - if append_version is None: - append_version = self._append_version - if isinstance(filename, Path): - filename = str(filename) - filename = filename.lstrip("/") - - url = URL.build(path=self._prefix, encoded=True) - # filename is not encoded - if YARL_VERSION < (1, 6): - url = url / filename.replace("%", "%25") - else: - url = url / filename - - if append_version: - try: - filepath = self._directory.joinpath(filename).resolve() - if not self._follow_symlinks: - filepath.relative_to(self._directory) - except (ValueError, FileNotFoundError): - # ValueError for case when path point to symlink - # with follow_symlinks is False - return url # relatively safe - if filepath.is_file(): - # TODO cache file content - # with file watcher for cache invalidation - with filepath.open("rb") as f: - file_bytes = f.read() - h = self._get_file_hash(file_bytes) - url = url.with_query({self.VERSION_KEY: h}) - return url - return url - - @staticmethod - def _get_file_hash(byte_array: bytes) -> str: - m = hashlib.sha256() # todo sha256 can be configurable param - m.update(byte_array) - b64 = base64.urlsafe_b64encode(m.digest()) - return b64.decode("ascii") - - def get_info(self) -> _InfoDict: - return { - "directory": self._directory, - "prefix": self._prefix, - "routes": self._routes, - } - - def set_options_route(self, handler: Handler) -> None: - if "OPTIONS" in self._routes: - raise RuntimeError("OPTIONS route was set already") - self._routes["OPTIONS"] = ResourceRoute( - "OPTIONS", handler, self, expect_handler=self._expect_handler - ) - - async def resolve(self, request: Request) -> _Resolve: - path = request.rel_url.raw_path - method = request.method - allowed_methods = set(self._routes) - if not path.startswith(self._prefix2) and path != self._prefix: - return None, set() - - if method not in allowed_methods: - return None, allowed_methods - - match_dict = {"filename": _unquote_path(path[len(self._prefix) + 1 :])} - return (UrlMappingMatchInfo(match_dict, self._routes[method]), allowed_methods) - - def __len__(self) -> int: - return len(self._routes) - - def __iter__(self) -> Iterator[AbstractRoute]: - return iter(self._routes.values()) - - async def _handle(self, request: Request) -> StreamResponse: - rel_url = request.match_info["filename"] - try: - filename = Path(rel_url) - if filename.anchor: - # rel_url is an absolute name like - # /static/\\machine_name\c$ or /static/D:\path - # where the static dir is totally different - raise HTTPForbidden() - filepath = self._directory.joinpath(filename).resolve() - if not self._follow_symlinks: - filepath.relative_to(self._directory) - except (ValueError, FileNotFoundError) as error: - # relatively safe - raise HTTPNotFound() from error - except HTTPForbidden: - raise - except Exception as error: - # perm error or other kind! - request.app.logger.exception(error) - raise HTTPNotFound() from error - - # on opening a dir, load its contents if allowed - if filepath.is_dir(): - if self._show_index: - try: - return Response( - text=self._directory_as_html(filepath), content_type="text/html" - ) - except PermissionError: - raise HTTPForbidden() - else: - raise HTTPForbidden() - elif filepath.is_file(): - return FileResponse(filepath, chunk_size=self._chunk_size) - else: - raise HTTPNotFound - - def _directory_as_html(self, filepath: Path) -> str: - # returns directory's index as html - - # sanity check - assert filepath.is_dir() - - relative_path_to_dir = filepath.relative_to(self._directory).as_posix() - index_of = f"Index of /{relative_path_to_dir}" - h1 = f"

{index_of}

" - - index_list = [] - dir_index = filepath.iterdir() - for _file in sorted(dir_index): - # show file url as relative to static path - rel_path = _file.relative_to(self._directory).as_posix() - file_url = self._prefix + "/" + rel_path - - # if file is a directory, add '/' to the end of the name - if _file.is_dir(): - file_name = f"{_file.name}/" - else: - file_name = _file.name - - index_list.append( - '
'.format( - url=file_url, name=file_name - ) - ) - ul = "
    \n{}\n
".format("\n".join(index_list)) - body = f"\n{h1}\n{ul}\n" - - head_str = f"\n{index_of}\n" - html = f"\n{head_str}\n{body}\n" - - return html - - def __repr__(self) -> str: - name = "'" + self.name + "'" if self.name is not None else "" - return " {directory!r}>".format( - name=name, path=self._prefix, directory=self._directory - ) - - -class PrefixedSubAppResource(PrefixResource): - def __init__(self, prefix: str, app: "Application") -> None: - super().__init__(prefix) - self._app = app - for resource in app.router.resources(): - resource.add_prefix(prefix) - - def add_prefix(self, prefix: str) -> None: - super().add_prefix(prefix) - for resource in self._app.router.resources(): - resource.add_prefix(prefix) - - def url_for(self, *args: str, **kwargs: str) -> URL: - raise RuntimeError(".url_for() is not supported " "by sub-application root") - - def get_info(self) -> _InfoDict: - return {"app": self._app, "prefix": self._prefix} - - async def resolve(self, request: Request) -> _Resolve: - if ( - not request.url.raw_path.startswith(self._prefix2) - and request.url.raw_path != self._prefix - ): - return None, set() - match_info = await self._app.router.resolve(request) - match_info.add_app(self._app) - if isinstance(match_info.http_exception, HTTPMethodNotAllowed): - methods = match_info.http_exception.allowed_methods - else: - methods = set() - return match_info, methods - - def __len__(self) -> int: - return len(self._app.router.routes()) - - def __iter__(self) -> Iterator[AbstractRoute]: - return iter(self._app.router.routes()) - - def __repr__(self) -> str: - return " {app!r}>".format( - prefix=self._prefix, app=self._app - ) - - -class AbstractRuleMatching(abc.ABC): - @abc.abstractmethod # pragma: no branch - async def match(self, request: Request) -> bool: - """Return bool if the request satisfies the criteria""" - - @abc.abstractmethod # pragma: no branch - def get_info(self) -> _InfoDict: - """Return a dict with additional info useful for introspection""" - - @property - @abc.abstractmethod # pragma: no branch - def canonical(self) -> str: - """Return a str""" - - -class Domain(AbstractRuleMatching): - re_part = re.compile(r"(?!-)[a-z\d-]{1,63}(? None: - super().__init__() - self._domain = self.validation(domain) - - @property - def canonical(self) -> str: - return self._domain - - def validation(self, domain: str) -> str: - if not isinstance(domain, str): - raise TypeError("Domain must be str") - domain = domain.rstrip(".").lower() - if not domain: - raise ValueError("Domain cannot be empty") - elif "://" in domain: - raise ValueError("Scheme not supported") - url = URL("http://" + domain) - assert url.raw_host is not None - if not all(self.re_part.fullmatch(x) for x in url.raw_host.split(".")): - raise ValueError("Domain not valid") - if url.port == 80: - return url.raw_host - return f"{url.raw_host}:{url.port}" - - async def match(self, request: Request) -> bool: - host = request.headers.get(hdrs.HOST) - if not host: - return False - return self.match_domain(host) - - def match_domain(self, host: str) -> bool: - return host.lower() == self._domain - - def get_info(self) -> _InfoDict: - return {"domain": self._domain} - - -class MaskDomain(Domain): - re_part = re.compile(r"(?!-)[a-z\d\*-]{1,63}(? None: - super().__init__(domain) - mask = self._domain.replace(".", r"\.").replace("*", ".*") - self._mask = re.compile(mask) - - @property - def canonical(self) -> str: - return self._mask.pattern - - def match_domain(self, host: str) -> bool: - return self._mask.fullmatch(host) is not None - - -class MatchedSubAppResource(PrefixedSubAppResource): - def __init__(self, rule: AbstractRuleMatching, app: "Application") -> None: - AbstractResource.__init__(self) - self._prefix = "" - self._app = app - self._rule = rule - - @property - def canonical(self) -> str: - return self._rule.canonical - - def get_info(self) -> _InfoDict: - return {"app": self._app, "rule": self._rule} - - async def resolve(self, request: Request) -> _Resolve: - if not await self._rule.match(request): - return None, set() - match_info = await self._app.router.resolve(request) - match_info.add_app(self._app) - if isinstance(match_info.http_exception, HTTPMethodNotAllowed): - methods = match_info.http_exception.allowed_methods - else: - methods = set() - return match_info, methods - - def __repr__(self) -> str: - return " {app!r}>" "".format(app=self._app) - - -class ResourceRoute(AbstractRoute): - """A route with resource""" - - def __init__( - self, - method: str, - handler: Union[Handler, Type[AbstractView]], - resource: AbstractResource, - *, - expect_handler: Optional[_ExpectHandler] = None, - ) -> None: - super().__init__( - method, handler, expect_handler=expect_handler, resource=resource - ) - - def __repr__(self) -> str: - return " {handler!r}".format( - method=self.method, resource=self._resource, handler=self.handler - ) - - @property - def name(self) -> Optional[str]: - if self._resource is None: - return None - return self._resource.name - - def url_for(self, *args: str, **kwargs: str) -> URL: - """Construct url for route with additional params.""" - assert self._resource is not None - return self._resource.url_for(*args, **kwargs) - - def get_info(self) -> _InfoDict: - assert self._resource is not None - return self._resource.get_info() - - -class SystemRoute(AbstractRoute): - def __init__(self, http_exception: HTTPException) -> None: - super().__init__(hdrs.METH_ANY, self._handle) - self._http_exception = http_exception - - def url_for(self, *args: str, **kwargs: str) -> URL: - raise RuntimeError(".url_for() is not allowed for SystemRoute") - - @property - def name(self) -> Optional[str]: - return None - - def get_info(self) -> _InfoDict: - return {"http_exception": self._http_exception} - - async def _handle(self, request: Request) -> StreamResponse: - raise self._http_exception - - @property - def status(self) -> int: - return self._http_exception.status - - @property - def reason(self) -> str: - return self._http_exception.reason - - def __repr__(self) -> str: - return "".format(self=self) - - -class View(AbstractView): - async def _iter(self) -> StreamResponse: - if self.request.method not in hdrs.METH_ALL: - self._raise_allowed_methods() - method: Callable[[], Awaitable[StreamResponse]] = getattr( - self, self.request.method.lower(), None - ) - if method is None: - self._raise_allowed_methods() - resp = await method() - return resp - - def __await__(self) -> Generator[Any, None, StreamResponse]: - return self._iter().__await__() - - def _raise_allowed_methods(self) -> None: - allowed_methods = {m for m in hdrs.METH_ALL if hasattr(self, m.lower())} - raise HTTPMethodNotAllowed(self.request.method, allowed_methods) - - -class ResourcesView(Sized, Iterable[AbstractResource], Container[AbstractResource]): - def __init__(self, resources: List[AbstractResource]) -> None: - self._resources = resources - - def __len__(self) -> int: - return len(self._resources) - - def __iter__(self) -> Iterator[AbstractResource]: - yield from self._resources - - def __contains__(self, resource: object) -> bool: - return resource in self._resources - - -class RoutesView(Sized, Iterable[AbstractRoute], Container[AbstractRoute]): - def __init__(self, resources: List[AbstractResource]): - self._routes = [] # type: List[AbstractRoute] - for resource in resources: - for route in resource: - self._routes.append(route) - - def __len__(self) -> int: - return len(self._routes) - - def __iter__(self) -> Iterator[AbstractRoute]: - yield from self._routes - - def __contains__(self, route: object) -> bool: - return route in self._routes - - -class UrlDispatcher(AbstractRouter, Mapping[str, AbstractResource]): - - NAME_SPLIT_RE = re.compile(r"[.:-]") - - def __init__(self) -> None: - super().__init__() - self._resources = [] # type: List[AbstractResource] - self._named_resources = {} # type: Dict[str, AbstractResource] - - async def resolve(self, request: Request) -> UrlMappingMatchInfo: - method = request.method - allowed_methods = set() # type: Set[str] - - for resource in self._resources: - match_dict, allowed = await resource.resolve(request) - if match_dict is not None: - return match_dict - else: - allowed_methods |= allowed - - if allowed_methods: - return MatchInfoError(HTTPMethodNotAllowed(method, allowed_methods)) - else: - return MatchInfoError(HTTPNotFound()) - - def __iter__(self) -> Iterator[str]: - return iter(self._named_resources) - - def __len__(self) -> int: - return len(self._named_resources) - - def __contains__(self, resource: object) -> bool: - return resource in self._named_resources - - def __getitem__(self, name: str) -> AbstractResource: - return self._named_resources[name] - - def resources(self) -> ResourcesView: - return ResourcesView(self._resources) - - def routes(self) -> RoutesView: - return RoutesView(self._resources) - - def named_resources(self) -> Mapping[str, AbstractResource]: - return MappingProxyType(self._named_resources) - - def register_resource(self, resource: AbstractResource) -> None: - assert isinstance( - resource, AbstractResource - ), f"Instance of AbstractResource class is required, got {resource!r}" - if self.frozen: - raise RuntimeError("Cannot register a resource into frozen router.") - - name = resource.name - - if name is not None: - parts = self.NAME_SPLIT_RE.split(name) - for part in parts: - if keyword.iskeyword(part): - raise ValueError( - f"Incorrect route name {name!r}, " - "python keywords cannot be used " - "for route name" - ) - if not part.isidentifier(): - raise ValueError( - "Incorrect route name {!r}, " - "the name should be a sequence of " - "python identifiers separated " - "by dash, dot or column".format(name) - ) - if name in self._named_resources: - raise ValueError( - "Duplicate {!r}, " - "already handled by {!r}".format(name, self._named_resources[name]) - ) - self._named_resources[name] = resource - self._resources.append(resource) - - def add_resource(self, path: str, *, name: Optional[str] = None) -> Resource: - if path and not path.startswith("/"): - raise ValueError("path should be started with / or be empty") - # Reuse last added resource if path and name are the same - if self._resources: - resource = self._resources[-1] - if resource.name == name and resource.raw_match(path): - return cast(Resource, resource) - if not ("{" in path or "}" in path or ROUTE_RE.search(path)): - resource = PlainResource(_requote_path(path), name=name) - self.register_resource(resource) - return resource - resource = DynamicResource(path, name=name) - self.register_resource(resource) - return resource - - def add_route( - self, - method: str, - path: str, - handler: Union[Handler, Type[AbstractView]], - *, - name: Optional[str] = None, - expect_handler: Optional[_ExpectHandler] = None, - ) -> AbstractRoute: - resource = self.add_resource(path, name=name) - return resource.add_route(method, handler, expect_handler=expect_handler) - - def add_static( - self, - prefix: str, - path: PathLike, - *, - name: Optional[str] = None, - expect_handler: Optional[_ExpectHandler] = None, - chunk_size: int = 256 * 1024, - show_index: bool = False, - follow_symlinks: bool = False, - append_version: bool = False, - ) -> AbstractResource: - """Add static files view. - - prefix - url prefix - path - folder with files - - """ - assert prefix.startswith("/") - if prefix.endswith("/"): - prefix = prefix[:-1] - resource = StaticResource( - prefix, - path, - name=name, - expect_handler=expect_handler, - chunk_size=chunk_size, - show_index=show_index, - follow_symlinks=follow_symlinks, - append_version=append_version, - ) - self.register_resource(resource) - return resource - - def add_head(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: - """Shortcut for add_route with method HEAD.""" - return self.add_route(hdrs.METH_HEAD, path, handler, **kwargs) - - def add_options(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: - """Shortcut for add_route with method OPTIONS.""" - return self.add_route(hdrs.METH_OPTIONS, path, handler, **kwargs) - - def add_get( - self, - path: str, - handler: Handler, - *, - name: Optional[str] = None, - allow_head: bool = True, - **kwargs: Any, - ) -> AbstractRoute: - """Shortcut for add_route with method GET. - - If allow_head is true, another - route is added allowing head requests to the same endpoint. - """ - resource = self.add_resource(path, name=name) - if allow_head: - resource.add_route(hdrs.METH_HEAD, handler, **kwargs) - return resource.add_route(hdrs.METH_GET, handler, **kwargs) - - def add_post(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: - """Shortcut for add_route with method POST.""" - return self.add_route(hdrs.METH_POST, path, handler, **kwargs) - - def add_put(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: - """Shortcut for add_route with method PUT.""" - return self.add_route(hdrs.METH_PUT, path, handler, **kwargs) - - def add_patch(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: - """Shortcut for add_route with method PATCH.""" - return self.add_route(hdrs.METH_PATCH, path, handler, **kwargs) - - def add_delete(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: - """Shortcut for add_route with method DELETE.""" - return self.add_route(hdrs.METH_DELETE, path, handler, **kwargs) - - def add_view( - self, path: str, handler: Type[AbstractView], **kwargs: Any - ) -> AbstractRoute: - """Shortcut for add_route with ANY methods for a class-based view.""" - return self.add_route(hdrs.METH_ANY, path, handler, **kwargs) - - def freeze(self) -> None: - super().freeze() - for resource in self._resources: - resource.freeze() - - def add_routes(self, routes: Iterable[AbstractRouteDef]) -> List[AbstractRoute]: - """Append routes to route table. - - Parameter should be a sequence of RouteDef objects. - - Returns a list of registered AbstractRoute instances. - """ - registered_routes = [] - for route_def in routes: - registered_routes.extend(route_def.register(self)) - return registered_routes - - -def _quote_path(value: str) -> str: - if YARL_VERSION < (1, 6): - value = value.replace("%", "%25") - return URL.build(path=value, encoded=False).raw_path - - -def _unquote_path(value: str) -> str: - return URL.build(path=value, encoded=True).path - - -def _requote_path(value: str) -> str: - # Quote non-ascii characters and other characters which must be quoted, - # but preserve existing %-sequences. - result = _quote_path(value) - if "%" in value: - result = result.replace("%25", "%") - return result diff --git a/.venv/Lib/site-packages/aiohttp/web_ws.py b/.venv/Lib/site-packages/aiohttp/web_ws.py deleted file mode 100644 index 16b0a17..0000000 --- a/.venv/Lib/site-packages/aiohttp/web_ws.py +++ /dev/null @@ -1,487 +0,0 @@ -import asyncio -import base64 -import binascii -import hashlib -import json -from typing import Any, Iterable, Optional, Tuple, cast - -import async_timeout -import attr -from multidict import CIMultiDict - -from . import hdrs -from .abc import AbstractStreamWriter -from .helpers import call_later, set_result -from .http import ( - WS_CLOSED_MESSAGE, - WS_CLOSING_MESSAGE, - WS_KEY, - WebSocketError, - WebSocketReader, - WebSocketWriter, - WSCloseCode, - WSMessage, - WSMsgType as WSMsgType, - ws_ext_gen, - ws_ext_parse, -) -from .log import ws_logger -from .streams import EofStream, FlowControlDataQueue -from .typedefs import Final, JSONDecoder, JSONEncoder -from .web_exceptions import HTTPBadRequest, HTTPException -from .web_request import BaseRequest -from .web_response import StreamResponse - -__all__ = ( - "WebSocketResponse", - "WebSocketReady", - "WSMsgType", -) - -THRESHOLD_CONNLOST_ACCESS: Final[int] = 5 - - -@attr.s(auto_attribs=True, frozen=True, slots=True) -class WebSocketReady: - ok: bool - protocol: Optional[str] - - def __bool__(self) -> bool: - return self.ok - - -class WebSocketResponse(StreamResponse): - - _length_check = False - - def __init__( - self, - *, - timeout: float = 10.0, - receive_timeout: Optional[float] = None, - autoclose: bool = True, - autoping: bool = True, - heartbeat: Optional[float] = None, - protocols: Iterable[str] = (), - compress: bool = True, - max_msg_size: int = 4 * 1024 * 1024, - ) -> None: - super().__init__(status=101) - self._protocols = protocols - self._ws_protocol = None # type: Optional[str] - self._writer = None # type: Optional[WebSocketWriter] - self._reader = None # type: Optional[FlowControlDataQueue[WSMessage]] - self._closed = False - self._closing = False - self._conn_lost = 0 - self._close_code = None # type: Optional[int] - self._loop = None # type: Optional[asyncio.AbstractEventLoop] - self._waiting = None # type: Optional[asyncio.Future[bool]] - self._exception = None # type: Optional[BaseException] - self._timeout = timeout - self._receive_timeout = receive_timeout - self._autoclose = autoclose - self._autoping = autoping - self._heartbeat = heartbeat - self._heartbeat_cb: Optional[asyncio.TimerHandle] = None - if heartbeat is not None: - self._pong_heartbeat = heartbeat / 2.0 - self._pong_response_cb: Optional[asyncio.TimerHandle] = None - self._compress = compress - self._max_msg_size = max_msg_size - - def _cancel_heartbeat(self) -> None: - if self._pong_response_cb is not None: - self._pong_response_cb.cancel() - self._pong_response_cb = None - - if self._heartbeat_cb is not None: - self._heartbeat_cb.cancel() - self._heartbeat_cb = None - - def _reset_heartbeat(self) -> None: - self._cancel_heartbeat() - - if self._heartbeat is not None: - assert self._loop is not None - self._heartbeat_cb = call_later( - self._send_heartbeat, self._heartbeat, self._loop - ) - - def _send_heartbeat(self) -> None: - if self._heartbeat is not None and not self._closed: - assert self._loop is not None - # fire-and-forget a task is not perfect but maybe ok for - # sending ping. Otherwise we need a long-living heartbeat - # task in the class. - self._loop.create_task(self._writer.ping()) # type: ignore[union-attr] - - if self._pong_response_cb is not None: - self._pong_response_cb.cancel() - self._pong_response_cb = call_later( - self._pong_not_received, self._pong_heartbeat, self._loop - ) - - def _pong_not_received(self) -> None: - if self._req is not None and self._req.transport is not None: - self._closed = True - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - self._exception = asyncio.TimeoutError() - self._req.transport.close() - - async def prepare(self, request: BaseRequest) -> AbstractStreamWriter: - # make pre-check to don't hide it by do_handshake() exceptions - if self._payload_writer is not None: - return self._payload_writer - - protocol, writer = self._pre_start(request) - payload_writer = await super().prepare(request) - assert payload_writer is not None - self._post_start(request, protocol, writer) - await payload_writer.drain() - return payload_writer - - def _handshake( - self, request: BaseRequest - ) -> Tuple["CIMultiDict[str]", str, bool, bool]: - headers = request.headers - if "websocket" != headers.get(hdrs.UPGRADE, "").lower().strip(): - raise HTTPBadRequest( - text=( - "No WebSocket UPGRADE hdr: {}\n Can " - '"Upgrade" only to "WebSocket".' - ).format(headers.get(hdrs.UPGRADE)) - ) - - if "upgrade" not in headers.get(hdrs.CONNECTION, "").lower(): - raise HTTPBadRequest( - text="No CONNECTION upgrade hdr: {}".format( - headers.get(hdrs.CONNECTION) - ) - ) - - # find common sub-protocol between client and server - protocol = None - if hdrs.SEC_WEBSOCKET_PROTOCOL in headers: - req_protocols = [ - str(proto.strip()) - for proto in headers[hdrs.SEC_WEBSOCKET_PROTOCOL].split(",") - ] - - for proto in req_protocols: - if proto in self._protocols: - protocol = proto - break - else: - # No overlap found: Return no protocol as per spec - ws_logger.warning( - "Client protocols %r don’t overlap server-known ones %r", - req_protocols, - self._protocols, - ) - - # check supported version - version = headers.get(hdrs.SEC_WEBSOCKET_VERSION, "") - if version not in ("13", "8", "7"): - raise HTTPBadRequest(text=f"Unsupported version: {version}") - - # check client handshake for validity - key = headers.get(hdrs.SEC_WEBSOCKET_KEY) - try: - if not key or len(base64.b64decode(key)) != 16: - raise HTTPBadRequest(text=f"Handshake error: {key!r}") - except binascii.Error: - raise HTTPBadRequest(text=f"Handshake error: {key!r}") from None - - accept_val = base64.b64encode( - hashlib.sha1(key.encode() + WS_KEY).digest() - ).decode() - response_headers = CIMultiDict( # type: ignore[var-annotated] - { - hdrs.UPGRADE: "websocket", # type: ignore[arg-type] - hdrs.CONNECTION: "upgrade", - hdrs.SEC_WEBSOCKET_ACCEPT: accept_val, - } - ) - - notakeover = False - compress = 0 - if self._compress: - extensions = headers.get(hdrs.SEC_WEBSOCKET_EXTENSIONS) - # Server side always get return with no exception. - # If something happened, just drop compress extension - compress, notakeover = ws_ext_parse(extensions, isserver=True) - if compress: - enabledext = ws_ext_gen( - compress=compress, isserver=True, server_notakeover=notakeover - ) - response_headers[hdrs.SEC_WEBSOCKET_EXTENSIONS] = enabledext - - if protocol: - response_headers[hdrs.SEC_WEBSOCKET_PROTOCOL] = protocol - return ( - response_headers, - protocol, - compress, - notakeover, - ) # type: ignore[return-value] - - def _pre_start(self, request: BaseRequest) -> Tuple[str, WebSocketWriter]: - self._loop = request._loop - - headers, protocol, compress, notakeover = self._handshake(request) - - self.set_status(101) - self.headers.update(headers) - self.force_close() - self._compress = compress - transport = request._protocol.transport - assert transport is not None - writer = WebSocketWriter( - request._protocol, transport, compress=compress, notakeover=notakeover - ) - - return protocol, writer - - def _post_start( - self, request: BaseRequest, protocol: str, writer: WebSocketWriter - ) -> None: - self._ws_protocol = protocol - self._writer = writer - - self._reset_heartbeat() - - loop = self._loop - assert loop is not None - self._reader = FlowControlDataQueue(request._protocol, 2 ** 16, loop=loop) - request.protocol.set_parser( - WebSocketReader(self._reader, self._max_msg_size, compress=self._compress) - ) - # disable HTTP keepalive for WebSocket - request.protocol.keep_alive(False) - - def can_prepare(self, request: BaseRequest) -> WebSocketReady: - if self._writer is not None: - raise RuntimeError("Already started") - try: - _, protocol, _, _ = self._handshake(request) - except HTTPException: - return WebSocketReady(False, None) - else: - return WebSocketReady(True, protocol) - - @property - def closed(self) -> bool: - return self._closed - - @property - def close_code(self) -> Optional[int]: - return self._close_code - - @property - def ws_protocol(self) -> Optional[str]: - return self._ws_protocol - - @property - def compress(self) -> bool: - return self._compress - - def exception(self) -> Optional[BaseException]: - return self._exception - - async def ping(self, message: bytes = b"") -> None: - if self._writer is None: - raise RuntimeError("Call .prepare() first") - await self._writer.ping(message) - - async def pong(self, message: bytes = b"") -> None: - # unsolicited pong - if self._writer is None: - raise RuntimeError("Call .prepare() first") - await self._writer.pong(message) - - async def send_str(self, data: str, compress: Optional[bool] = None) -> None: - if self._writer is None: - raise RuntimeError("Call .prepare() first") - if not isinstance(data, str): - raise TypeError("data argument must be str (%r)" % type(data)) - await self._writer.send(data, binary=False, compress=compress) - - async def send_bytes(self, data: bytes, compress: Optional[bool] = None) -> None: - if self._writer is None: - raise RuntimeError("Call .prepare() first") - if not isinstance(data, (bytes, bytearray, memoryview)): - raise TypeError("data argument must be byte-ish (%r)" % type(data)) - await self._writer.send(data, binary=True, compress=compress) - - async def send_json( - self, - data: Any, - compress: Optional[bool] = None, - *, - dumps: JSONEncoder = json.dumps, - ) -> None: - await self.send_str(dumps(data), compress=compress) - - async def write_eof(self) -> None: # type: ignore[override] - if self._eof_sent: - return - if self._payload_writer is None: - raise RuntimeError("Response has not been started") - - await self.close() - self._eof_sent = True - - async def close(self, *, code: int = WSCloseCode.OK, message: bytes = b"") -> bool: - if self._writer is None: - raise RuntimeError("Call .prepare() first") - - self._cancel_heartbeat() - reader = self._reader - assert reader is not None - - # we need to break `receive()` cycle first, - # `close()` may be called from different task - if self._waiting is not None and not self._closed: - reader.feed_data(WS_CLOSING_MESSAGE, 0) - await self._waiting - - if not self._closed: - self._closed = True - try: - await self._writer.close(code, message) - writer = self._payload_writer - assert writer is not None - await writer.drain() - except (asyncio.CancelledError, asyncio.TimeoutError): - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - raise - except Exception as exc: - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - self._exception = exc - return True - - if self._closing: - return True - - reader = self._reader - assert reader is not None - try: - async with async_timeout.timeout(self._timeout): - msg = await reader.read() - except asyncio.CancelledError: - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - raise - except Exception as exc: - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - self._exception = exc - return True - - if msg.type == WSMsgType.CLOSE: - self._close_code = msg.data - return True - - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - self._exception = asyncio.TimeoutError() - return True - else: - return False - - async def receive(self, timeout: Optional[float] = None) -> WSMessage: - if self._reader is None: - raise RuntimeError("Call .prepare() first") - - loop = self._loop - assert loop is not None - while True: - if self._waiting is not None: - raise RuntimeError("Concurrent call to receive() is not allowed") - - if self._closed: - self._conn_lost += 1 - if self._conn_lost >= THRESHOLD_CONNLOST_ACCESS: - raise RuntimeError("WebSocket connection is closed.") - return WS_CLOSED_MESSAGE - elif self._closing: - return WS_CLOSING_MESSAGE - - try: - self._waiting = loop.create_future() - try: - async with async_timeout.timeout(timeout or self._receive_timeout): - msg = await self._reader.read() - self._reset_heartbeat() - finally: - waiter = self._waiting - set_result(waiter, True) - self._waiting = None - except (asyncio.CancelledError, asyncio.TimeoutError): - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - raise - except EofStream: - self._close_code = WSCloseCode.OK - await self.close() - return WSMessage(WSMsgType.CLOSED, None, None) - except WebSocketError as exc: - self._close_code = exc.code - await self.close(code=exc.code) - return WSMessage(WSMsgType.ERROR, exc, None) - except Exception as exc: - self._exception = exc - self._closing = True - self._close_code = WSCloseCode.ABNORMAL_CLOSURE - await self.close() - return WSMessage(WSMsgType.ERROR, exc, None) - - if msg.type == WSMsgType.CLOSE: - self._closing = True - self._close_code = msg.data - if not self._closed and self._autoclose: - await self.close() - elif msg.type == WSMsgType.CLOSING: - self._closing = True - elif msg.type == WSMsgType.PING and self._autoping: - await self.pong(msg.data) - continue - elif msg.type == WSMsgType.PONG and self._autoping: - continue - - return msg - - async def receive_str(self, *, timeout: Optional[float] = None) -> str: - msg = await self.receive(timeout) - if msg.type != WSMsgType.TEXT: - raise TypeError( - "Received message {}:{!r} is not WSMsgType.TEXT".format( - msg.type, msg.data - ) - ) - return cast(str, msg.data) - - async def receive_bytes(self, *, timeout: Optional[float] = None) -> bytes: - msg = await self.receive(timeout) - if msg.type != WSMsgType.BINARY: - raise TypeError(f"Received message {msg.type}:{msg.data!r} is not bytes") - return cast(bytes, msg.data) - - async def receive_json( - self, *, loads: JSONDecoder = json.loads, timeout: Optional[float] = None - ) -> Any: - data = await self.receive_str(timeout=timeout) - return loads(data) - - async def write(self, data: bytes) -> None: - raise RuntimeError("Cannot call .write() for websocket") - - def __aiter__(self) -> "WebSocketResponse": - return self - - async def __anext__(self) -> WSMessage: - msg = await self.receive() - if msg.type in (WSMsgType.CLOSE, WSMsgType.CLOSING, WSMsgType.CLOSED): - raise StopAsyncIteration - return msg - - def _cancel(self, exc: BaseException) -> None: - if self._reader is not None: - self._reader.set_exception(exc) diff --git a/.venv/Lib/site-packages/aiohttp/worker.py b/.venv/Lib/site-packages/aiohttp/worker.py deleted file mode 100644 index 08945bc..0000000 --- a/.venv/Lib/site-packages/aiohttp/worker.py +++ /dev/null @@ -1,269 +0,0 @@ -"""Async gunicorn worker for aiohttp.web""" - -import asyncio -import os -import re -import signal -import sys -from types import FrameType -from typing import Any, Awaitable, Callable, Optional, Union # noqa - -from gunicorn.config import AccessLogFormat as GunicornAccessLogFormat -from gunicorn.workers import base - -from aiohttp import web - -from .helpers import set_result -from .web_app import Application -from .web_log import AccessLogger - -try: - import ssl - - SSLContext = ssl.SSLContext -except ImportError: # pragma: no cover - ssl = None # type: ignore[assignment] - SSLContext = object # type: ignore[misc,assignment] - - -__all__ = ("GunicornWebWorker", "GunicornUVLoopWebWorker", "GunicornTokioWebWorker") - - -class GunicornWebWorker(base.Worker): # type: ignore[misc,no-any-unimported] - - DEFAULT_AIOHTTP_LOG_FORMAT = AccessLogger.LOG_FORMAT - DEFAULT_GUNICORN_LOG_FORMAT = GunicornAccessLogFormat.default - - def __init__(self, *args: Any, **kw: Any) -> None: # pragma: no cover - super().__init__(*args, **kw) - - self._task = None # type: Optional[asyncio.Task[None]] - self.exit_code = 0 - self._notify_waiter = None # type: Optional[asyncio.Future[bool]] - - def init_process(self) -> None: - # create new event_loop after fork - asyncio.get_event_loop().close() - - self.loop = asyncio.new_event_loop() - asyncio.set_event_loop(self.loop) - - super().init_process() - - def run(self) -> None: - self._task = self.loop.create_task(self._run()) - - try: # ignore all finalization problems - self.loop.run_until_complete(self._task) - except Exception: - self.log.exception("Exception in gunicorn worker") - self.loop.run_until_complete(self.loop.shutdown_asyncgens()) - self.loop.close() - - sys.exit(self.exit_code) - - async def _run(self) -> None: - runner = None - if isinstance(self.wsgi, Application): - app = self.wsgi - elif asyncio.iscoroutinefunction(self.wsgi): - wsgi = await self.wsgi() - if isinstance(wsgi, web.AppRunner): - runner = wsgi - app = runner.app - else: - app = wsgi - else: - raise RuntimeError( - "wsgi app should be either Application or " - "async function returning Application, got {}".format(self.wsgi) - ) - - if runner is None: - access_log = self.log.access_log if self.cfg.accesslog else None - runner = web.AppRunner( - app, - logger=self.log, - keepalive_timeout=self.cfg.keepalive, - access_log=access_log, - access_log_format=self._get_valid_log_format( - self.cfg.access_log_format - ), - ) - await runner.setup() - - ctx = self._create_ssl_context(self.cfg) if self.cfg.is_ssl else None - - runner = runner - assert runner is not None - server = runner.server - assert server is not None - for sock in self.sockets: - site = web.SockSite( - runner, - sock, - ssl_context=ctx, - shutdown_timeout=self.cfg.graceful_timeout / 100 * 95, - ) - await site.start() - - # If our parent changed then we shut down. - pid = os.getpid() - try: - while self.alive: # type: ignore[has-type] - self.notify() - - cnt = server.requests_count - if self.cfg.max_requests and cnt > self.cfg.max_requests: - self.alive = False - self.log.info("Max requests, shutting down: %s", self) - - elif pid == os.getpid() and self.ppid != os.getppid(): - self.alive = False - self.log.info("Parent changed, shutting down: %s", self) - else: - await self._wait_next_notify() - except BaseException: - pass - - await runner.cleanup() - - def _wait_next_notify(self) -> "asyncio.Future[bool]": - self._notify_waiter_done() - - loop = self.loop - assert loop is not None - self._notify_waiter = waiter = loop.create_future() - self.loop.call_later(1.0, self._notify_waiter_done, waiter) - - return waiter - - def _notify_waiter_done( - self, waiter: Optional["asyncio.Future[bool]"] = None - ) -> None: - if waiter is None: - waiter = self._notify_waiter - if waiter is not None: - set_result(waiter, True) - - if waiter is self._notify_waiter: - self._notify_waiter = None - - def init_signals(self) -> None: - # Set up signals through the event loop API. - - self.loop.add_signal_handler( - signal.SIGQUIT, self.handle_quit, signal.SIGQUIT, None - ) - - self.loop.add_signal_handler( - signal.SIGTERM, self.handle_exit, signal.SIGTERM, None - ) - - self.loop.add_signal_handler( - signal.SIGINT, self.handle_quit, signal.SIGINT, None - ) - - self.loop.add_signal_handler( - signal.SIGWINCH, self.handle_winch, signal.SIGWINCH, None - ) - - self.loop.add_signal_handler( - signal.SIGUSR1, self.handle_usr1, signal.SIGUSR1, None - ) - - self.loop.add_signal_handler( - signal.SIGABRT, self.handle_abort, signal.SIGABRT, None - ) - - # Don't let SIGTERM and SIGUSR1 disturb active requests - # by interrupting system calls - signal.siginterrupt(signal.SIGTERM, False) - signal.siginterrupt(signal.SIGUSR1, False) - # Reset signals so Gunicorn doesn't swallow subprocess return codes - # See: https://github.com/aio-libs/aiohttp/issues/6130 - if sys.version_info < (3, 8): - # Starting from Python 3.8, - # the default child watcher is ThreadedChildWatcher. - # The watcher doesn't depend on SIGCHLD signal, - # there is no need to reset it. - signal.signal(signal.SIGCHLD, signal.SIG_DFL) - - def handle_quit(self, sig: int, frame: FrameType) -> None: - self.alive = False - - # worker_int callback - self.cfg.worker_int(self) - - # wakeup closing process - self._notify_waiter_done() - - def handle_abort(self, sig: int, frame: FrameType) -> None: - self.alive = False - self.exit_code = 1 - self.cfg.worker_abort(self) - sys.exit(1) - - @staticmethod - def _create_ssl_context(cfg: Any) -> "SSLContext": - """Creates SSLContext instance for usage in asyncio.create_server. - - See ssl.SSLSocket.__init__ for more details. - """ - if ssl is None: # pragma: no cover - raise RuntimeError("SSL is not supported.") - - ctx = ssl.SSLContext(cfg.ssl_version) - ctx.load_cert_chain(cfg.certfile, cfg.keyfile) - ctx.verify_mode = cfg.cert_reqs - if cfg.ca_certs: - ctx.load_verify_locations(cfg.ca_certs) - if cfg.ciphers: - ctx.set_ciphers(cfg.ciphers) - return ctx - - def _get_valid_log_format(self, source_format: str) -> str: - if source_format == self.DEFAULT_GUNICORN_LOG_FORMAT: - return self.DEFAULT_AIOHTTP_LOG_FORMAT - elif re.search(r"%\([^\)]+\)", source_format): - raise ValueError( - "Gunicorn's style options in form of `%(name)s` are not " - "supported for the log formatting. Please use aiohttp's " - "format specification to configure access log formatting: " - "http://docs.aiohttp.org/en/stable/logging.html" - "#format-specification" - ) - else: - return source_format - - -class GunicornUVLoopWebWorker(GunicornWebWorker): - def init_process(self) -> None: - import uvloop - - # Close any existing event loop before setting a - # new policy. - asyncio.get_event_loop().close() - - # Setup uvloop policy, so that every - # asyncio.get_event_loop() will create an instance - # of uvloop event loop. - asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) - - super().init_process() - - -class GunicornTokioWebWorker(GunicornWebWorker): - def init_process(self) -> None: # pragma: no cover - import tokio - - # Close any existing event loop before setting a - # new policy. - asyncio.get_event_loop().close() - - # Setup tokio policy, so that every - # asyncio.get_event_loop() will create an instance - # of tokio event loop. - asyncio.set_event_loop_policy(tokio.EventLoopPolicy()) - - super().init_process() diff --git a/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/INSTALLER b/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/LICENSE b/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/LICENSE deleted file mode 100644 index 7082a2d..0000000 --- a/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2013-2019 Nikolay Kim and Andrew Svetlov - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/METADATA b/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/METADATA deleted file mode 100644 index aa63d49..0000000 --- a/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/METADATA +++ /dev/null @@ -1,208 +0,0 @@ -Metadata-Version: 2.1 -Name: aiosignal -Version: 1.2.0 -Summary: aiosignal: a list of registered asynchronous callbacks -Home-page: https://github.com/aio-libs/aiosignal -Author: Nikolay Kim -Author-email: fafhrd91@gmail.com -Maintainer: Martijn Pieters -Maintainer-email: aio-libs@googlegroups.com -License: Apache 2 -Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby -Project-URL: CI: GitHub Actions, https://github.com/aio-libs/aiosignal/actions -Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiosignal -Project-URL: Docs: RTD, https://docs.aiosignal.org -Project-URL: GitHub: issues, https://github.com/aio-libs/aiosignal/issues -Project-URL: GitHub: repo, https://github.com/aio-libs/aiosignal -Platform: UNKNOWN -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Intended Audience :: Developers -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Development Status :: 5 - Production/Stable -Classifier: Operating System :: POSIX -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: Microsoft :: Windows -Classifier: Framework :: AsyncIO -Requires-Python: >=3.6 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: frozenlist (>=1.1.0) - -========= -aiosignal -========= - -.. image:: https://github.com/aio-libs/aiosignal/workflows/CI/badge.svg - :target: https://github.com/aio-libs/aiosignal/actions?query=workflow%3ACI - :alt: GitHub status for master branch - -.. image:: https://codecov.io/gh/aio-libs/aiosignal/branch/master/graph/badge.svg - :target: https://codecov.io/gh/aio-libs/aiosignal - :alt: codecov.io status for master branch - -.. image:: https://badge.fury.io/py/aiosignal.svg - :target: https://pypi.org/project/aiosignal - :alt: Latest PyPI package version - -.. image:: https://readthedocs.org/projects/aiosignal/badge/?version=latest - :target: https://aiosignal.readthedocs.io/ - :alt: Latest Read The Docs - -.. image:: https://img.shields.io/discourse/topics?server=https%3A%2F%2Faio-libs.discourse.group%2F - :target: https://aio-libs.discourse.group/ - :alt: Discourse group for io-libs - -.. image:: https://badges.gitter.im/Join%20Chat.svg - :target: https://gitter.im/aio-libs/Lobby - :alt: Chat on Gitter - -Introduction -============ - -A project to manage callbacks in `asyncio` projects. - -``Signal`` is a list of registered asynchronous callbacks. - -The signal's life-cycle has two stages: after creation its content -could be filled by using standard list operations: ``sig.append()`` -etc. - -After you call ``sig.freeze()`` the signal is *frozen*: adding, removing -and dropping callbacks is forbidden. - -The only available operation is calling the previously registered -callbacks by using ``await sig.send(data)``. - -For concrete usage examples see the `Signals - -section of the `Web Server Advanced -` chapter of the `aiohttp -documentation`_. - - -Installation ------------- - -:: - - $ pip install aiosignal - -The library requires Python 3.6 or newer. - - -Documentation -============= - -https://aiosignal.readthedocs.io/ - -Communication channels -====================== - -*aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs - -Feel free to post your questions and ideas here. - -*gitter chat* https://gitter.im/aio-libs/Lobby - -Requirements -============ - -- Python >= 3.6 -- frozenlist >= 1.0.0 - -License -======= - -``aiosignal`` is offered under the Apache 2 license. - -Source code -=========== - -The project is hosted on GitHub_ - -Please file an issue in the `bug tracker -`_ if you have found a bug -or have some suggestions to improve the library. - -.. _GitHub: https://github.com/aio-libs/aiosignal -.. _aiohttp documentation: https://docs.aiohttp.org/ - -========= -Changelog -========= - -.. - You should *NOT* be adding new change log entries to this file, this - file is managed by towncrier. You *may* edit previous change logs to - fix problems like typo corrections or such. - To add a new change log entry, please see - https://pip.pypa.io/en/latest/development/contributing/#news-entries - we named the news folder "changes". - - WARNING: Don't drop the next directive! - -.. towncrier release notes start - - -1.2.0 (2021-10-16) -================== - -Features --------- - -- Added support for Python 3.10. - `#328 `_ - - -Bugfixes --------- - -- Mark aiosignal as Python3-only package - `#165 `_ - - ----- - - -1.1.2 (2020-11-27) -================== - -Features --------- - -- Fix MANIFEST.in to include ``aiosignal/py.typed`` marker - - -1.1.1 (2020-11-27) -================== - -Features --------- - -- Support type hints - -1.1.0 (2020-10-13) -================== - -Features --------- - -- Added support of Python 3.8 and 3.9 - - -1.0.0 (2019-11-11) -================== - -Deprecations and Removals -------------------------- - -- Dropped support for Python 3.5; only 3.6, 3.7 and 3.8 are supported going forward. - `#23 `_ - diff --git a/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/RECORD b/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/RECORD deleted file mode 100644 index 015823c..0000000 --- a/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/RECORD +++ /dev/null @@ -1,10 +0,0 @@ -aiosignal-1.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -aiosignal-1.2.0.dist-info/LICENSE,sha256=b9UkPpLdf5jsacesN3co50kFcJ_1J6W_mNbQJjwE9bY,11332 -aiosignal-1.2.0.dist-info/METADATA,sha256=_mpNKRs47LsjeAv7Hv0LpexfFiH1B74eOtJhDA8w6-I,5500 -aiosignal-1.2.0.dist-info/RECORD,, -aiosignal-1.2.0.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 -aiosignal-1.2.0.dist-info/top_level.txt,sha256=z45aNOKGDdrI1roqZY3BGXQ22kJFPHBmVdwtLYLtXC0,10 -aiosignal/__init__.py,sha256=MGQyLD_0xNqLqPpBqxPj0CHKQjCIY1UFUK5PtHvCWbU,867 -aiosignal/__init__.pyi,sha256=xeCddYSS8fZAkz8S4HuKSR2IDe3N7RW_LKcXDPPA1Xk,311 -aiosignal/__pycache__/__init__.cpython-38.pyc,, -aiosignal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/WHEEL b/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/WHEEL deleted file mode 100644 index 5bad85f..0000000 --- a/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/top_level.txt b/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/top_level.txt deleted file mode 100644 index ac6df3a..0000000 --- a/.venv/Lib/site-packages/aiosignal-1.2.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -aiosignal diff --git a/.venv/Lib/site-packages/aiosignal/__init__.py b/.venv/Lib/site-packages/aiosignal/__init__.py deleted file mode 100644 index f3b9085..0000000 --- a/.venv/Lib/site-packages/aiosignal/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -from frozenlist import FrozenList - -__version__ = "1.2.0" - -__all__ = ("Signal",) - - -class Signal(FrozenList): - """Coroutine-based signal implementation. - - To connect a callback to a signal, use any list method. - - Signals are fired using the send() coroutine, which takes named - arguments. - """ - - __slots__ = ("_owner",) - - def __init__(self, owner): - super().__init__() - self._owner = owner - - def __repr__(self): - return "".format( - self._owner, self.frozen, list(self) - ) - - async def send(self, *args, **kwargs): - """ - Sends data to all registered receivers. - """ - if not self.frozen: - raise RuntimeError("Cannot send non-frozen signal.") - - for receiver in self: - await receiver(*args, **kwargs) # type: ignore diff --git a/.venv/Lib/site-packages/aiosignal/__init__.pyi b/.venv/Lib/site-packages/aiosignal/__init__.pyi deleted file mode 100644 index d4e3416..0000000 --- a/.venv/Lib/site-packages/aiosignal/__init__.pyi +++ /dev/null @@ -1,12 +0,0 @@ -from typing import Any, Generic, TypeVar - -from frozenlist import FrozenList - -__all__ = ("Signal",) - -_T = TypeVar("_T") - -class Signal(FrozenList[_T], Generic[_T]): - def __init__(self, owner: Any) -> None: ... - def __repr__(self) -> str: ... - async def send(self, *args: Any, **kwargs: Any) -> None: ... diff --git a/.venv/Lib/site-packages/aiosignal/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/aiosignal/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 71262520f6743c4395d7d36aaf68d1bc62220a26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1333 zcmZ8gPj4JG6t`!*vy;uHAgJJikbz4_N)}pi0hJ0V<)2jLK&XU9i!5jC-JNFE-rAl- z-EJ-!EeF4Ykn+C(>)heGJI!<*Lz3ZGsH7HIvbZ!}`JU${M4qz$LF_ z)11ialm`o^{@Ffnz2?$9;|-L-mpUx0+CJ_p@mxC1XSIV+t*_0ThlS=|8+E4u=i6NN z`T3%*7CgvP?YWUltzrVw&09>$PvQ{)6879^S0z0jQKF6;3-q@^1ae7U(pQ9%4c!ot zC;|Y`qay7FzFle8t@ysqVLzV+YzE_r1wI+CV&2T`1$m)*UnED z?cBQQL+ww4T}@AH;2L1FHCHVUp!(_LOq;Xmqxxj(>!1%-fR~(WKb5uZ5&QT$@?`bQ zWf1&rOd7KwbVS#0^r%g)ttyH)+l4wlIfU)s0iozivLR2P#wSTgH{_DON}<~4u(3$qkd(*39nX~vGBUAgxYKh;StG@qu5^6{z3K^r_Urc#r7_SeBpo-_ z9Q1{5DLgqU5_by{>c-!OHJ22SHdy z^CYM1-EBMZw%9@VklR9ZBO#VnwGHZHA)dCf+1?C=P_}~Kz(L>G033`wac_cOhwSe5 zw(P8Q)4=V&J=#GNY*d_e%p~?Grz~g5nB{}`|EL(0qaFinwZqZrc7;ILVD=$2Yl#BHZuOe}J6yNXl`-5|;iA5phst diff --git a/.venv/Lib/site-packages/aiosignal/py.typed b/.venv/Lib/site-packages/aiosignal/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/Lib/site-packages/arrow-1.2.3.dist-info/INSTALLER b/.venv/Lib/site-packages/arrow-1.2.3.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/arrow-1.2.3.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/arrow-1.2.3.dist-info/LICENSE b/.venv/Lib/site-packages/arrow-1.2.3.dist-info/LICENSE deleted file mode 100644 index 4f9eea5..0000000 --- a/.venv/Lib/site-packages/arrow-1.2.3.dist-info/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2021 Chris Smith - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/.venv/Lib/site-packages/arrow-1.2.3.dist-info/METADATA b/.venv/Lib/site-packages/arrow-1.2.3.dist-info/METADATA deleted file mode 100644 index b3f89db..0000000 --- a/.venv/Lib/site-packages/arrow-1.2.3.dist-info/METADATA +++ /dev/null @@ -1,163 +0,0 @@ -Metadata-Version: 2.1 -Name: arrow -Version: 1.2.3 -Summary: Better dates & times for Python -Home-page: https://arrow.readthedocs.io -Author: Chris Smith -Author-email: crsmithdev@gmail.com -License: Apache 2.0 -Project-URL: Repository, https://github.com/arrow-py/arrow -Project-URL: Bug Reports, https://github.com/arrow-py/arrow/issues -Project-URL: Documentation, https://arrow.readthedocs.io -Keywords: arrow date time datetime timestamp timezone humanize -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Requires-Python: >=3.6 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: python-dateutil (>=2.7.0) -Requires-Dist: typing-extensions ; python_version < "3.8" - -Arrow: Better dates & times for Python -====================================== - -.. start-inclusion-marker-do-not-remove - -.. image:: https://github.com/arrow-py/arrow/workflows/tests/badge.svg?branch=master - :alt: Build Status - :target: https://github.com/arrow-py/arrow/actions?query=workflow%3Atests+branch%3Amaster - -.. image:: https://codecov.io/gh/arrow-py/arrow/branch/master/graph/badge.svg - :alt: Coverage - :target: https://codecov.io/gh/arrow-py/arrow - -.. image:: https://img.shields.io/pypi/v/arrow.svg - :alt: PyPI Version - :target: https://pypi.python.org/pypi/arrow - -.. image:: https://img.shields.io/pypi/pyversions/arrow.svg - :alt: Supported Python Versions - :target: https://pypi.python.org/pypi/arrow - -.. image:: https://img.shields.io/pypi/l/arrow.svg - :alt: License - :target: https://pypi.python.org/pypi/arrow - -.. image:: https://img.shields.io/badge/code%20style-black-000000.svg - :alt: Code Style: Black - :target: https://github.com/psf/black - - -**Arrow** is a Python library that offers a sensible and human-friendly approach to creating, manipulating, formatting and converting dates, times and timestamps. It implements and updates the datetime type, plugging gaps in functionality and providing an intelligent module API that supports many common creation scenarios. Simply put, it helps you work with dates and times with fewer imports and a lot less code. - -Arrow is named after the `arrow of time `_ and is heavily inspired by `moment.js `_ and `requests `_. - -Why use Arrow over built-in modules? ------------------------------------- - -Python's standard library and some other low-level modules have near-complete date, time and timezone functionality, but don't work very well from a usability perspective: - -- Too many modules: datetime, time, calendar, dateutil, pytz and more -- Too many types: date, time, datetime, tzinfo, timedelta, relativedelta, etc. -- Timezones and timestamp conversions are verbose and unpleasant -- Timezone naivety is the norm -- Gaps in functionality: ISO 8601 parsing, timespans, humanization - -Features --------- - -- Fully-implemented, drop-in replacement for datetime -- Support for Python 3.6+ -- Timezone-aware and UTC by default -- Super-simple creation options for many common input scenarios -- ``shift`` method with support for relative offsets, including weeks -- Format and parse strings automatically -- Wide support for the `ISO 8601 `_ standard -- Timezone conversion -- Support for ``dateutil``, ``pytz``, and ``ZoneInfo`` tzinfo objects -- Generates time spans, ranges, floors and ceilings for time frames ranging from microsecond to year -- Humanize dates and times with a growing list of contributed locales -- Extensible for your own Arrow-derived types -- Full support for PEP 484-style type hints - -Quick Start ------------ - -Installation -~~~~~~~~~~~~ - -To install Arrow, use `pip `_ or `pipenv `_: - -.. code-block:: console - - $ pip install -U arrow - -Example Usage -~~~~~~~~~~~~~ - -.. code-block:: python - - >>> import arrow - >>> arrow.get('2013-05-11T21:23:58.970460+07:00') - - - >>> utc = arrow.utcnow() - >>> utc - - - >>> utc = utc.shift(hours=-1) - >>> utc - - - >>> local = utc.to('US/Pacific') - >>> local - - - >>> local.timestamp() - 1368303838.970460 - - >>> local.format() - '2013-05-11 13:23:58 -07:00' - - >>> local.format('YYYY-MM-DD HH:mm:ss ZZ') - '2013-05-11 13:23:58 -07:00' - - >>> local.humanize() - 'an hour ago' - - >>> local.humanize(locale='ko-kr') - '한시간 전' - -.. end-inclusion-marker-do-not-remove - -Documentation -------------- - -For full documentation, please visit `arrow.readthedocs.io `_. - -Contributing ------------- - -Contributions are welcome for both code and localizations (adding and updating locales). Begin by gaining familiarity with the Arrow library and its features. Then, jump into contributing: - -#. Find an issue or feature to tackle on the `issue tracker `_. Issues marked with the `"good first issue" label `_ may be a great place to start! -#. Fork `this repository `_ on GitHub and begin making changes in a branch. -#. Add a few tests to ensure that the bug was fixed or the feature works as expected. -#. Run the entire test suite and linting checks by running one of the following commands: ``tox && tox -e lint,docs`` (if you have `tox `_ installed) **OR** ``make build39 && make test && make lint`` (if you do not have Python 3.9 installed, replace ``build39`` with the latest Python version on your system). -#. Submit a pull request and await feedback 😃. - -If you have any questions along the way, feel free to ask them `here `_. - -Support Arrow -------------- - -`Open Collective `_ is an online funding platform that provides tools to raise money and share your finances with full transparency. It is the platform of choice for individuals and companies to make one-time or recurring donations directly to the project. If you are interested in making a financial contribution, please visit the `Arrow collective `_. diff --git a/.venv/Lib/site-packages/arrow-1.2.3.dist-info/RECORD b/.venv/Lib/site-packages/arrow-1.2.3.dist-info/RECORD deleted file mode 100644 index c1052f5..0000000 --- a/.venv/Lib/site-packages/arrow-1.2.3.dist-info/RECORD +++ /dev/null @@ -1,27 +0,0 @@ -arrow-1.2.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -arrow-1.2.3.dist-info/LICENSE,sha256=QNbhJV1xUfXwQaUUcl08lP-owYgeWgwptr6pPwPi47s,11341 -arrow-1.2.3.dist-info/METADATA,sha256=gg8GFdfHjX15F_yMrLsluJwKUXTaQi5ECUvwBlZYe9o,6938 -arrow-1.2.3.dist-info/RECORD,, -arrow-1.2.3.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 -arrow-1.2.3.dist-info/top_level.txt,sha256=aCBThK2RIB824ctI3l9i6z94l8UYpFF-BC4m3dDzFFo,6 -arrow/__init__.py,sha256=HxsSJGl56GoeHB__No-kdGmC_Wes_Ttf0ohOy7OoFig,872 -arrow/__pycache__/__init__.cpython-38.pyc,, -arrow/__pycache__/_version.cpython-38.pyc,, -arrow/__pycache__/api.cpython-38.pyc,, -arrow/__pycache__/arrow.cpython-38.pyc,, -arrow/__pycache__/constants.cpython-38.pyc,, -arrow/__pycache__/factory.cpython-38.pyc,, -arrow/__pycache__/formatter.cpython-38.pyc,, -arrow/__pycache__/locales.cpython-38.pyc,, -arrow/__pycache__/parser.cpython-38.pyc,, -arrow/__pycache__/util.cpython-38.pyc,, -arrow/_version.py,sha256=C-D_WWrVkBDmQmApLcm0sWNh2CgIrwWfc8_sB5vvU-Q,22 -arrow/api.py,sha256=6tdqrG0NjrKO22_eWHU4a5xerfR6IrZPY-yynGpnvTM,2755 -arrow/arrow.py,sha256=CnSXk3GCi1DroUvElSxlwQy9Y-2lCUSV5GKLLrBFmRA,63570 -arrow/constants.py,sha256=y3scgWgxiFuQg4DeFlhmexy1BA7K8LFNZyqK-VWPQJs,3238 -arrow/factory.py,sha256=dWP3XIYfYjqp7DCOdEYAD7PQfsbpQE70Ph9OS1A1LnE,11435 -arrow/formatter.py,sha256=YpYY8jeGZH0sgjc23PBm8HKf-EMHLp-8Ua52XfrVgPQ,5271 -arrow/locales.py,sha256=QSi6FJTVdmxDxAUIDMhUp3sJ13tHhF2tB50fA_mve0I,156276 -arrow/parser.py,sha256=ingY4axAO40kEYUL8MwqTIhFegCAVouDZk3c4YOs9aI,25720 -arrow/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -arrow/util.py,sha256=xnDevqRyNeYWbl3x-n_Tyo4cOgHcdgbxFECFsJ1XoEc,3679 diff --git a/.venv/Lib/site-packages/arrow-1.2.3.dist-info/WHEEL b/.venv/Lib/site-packages/arrow-1.2.3.dist-info/WHEEL deleted file mode 100644 index becc9a6..0000000 --- a/.venv/Lib/site-packages/arrow-1.2.3.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/Lib/site-packages/arrow-1.2.3.dist-info/top_level.txt b/.venv/Lib/site-packages/arrow-1.2.3.dist-info/top_level.txt deleted file mode 100644 index e2dc747..0000000 --- a/.venv/Lib/site-packages/arrow-1.2.3.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -arrow diff --git a/.venv/Lib/site-packages/arrow/__init__.py b/.venv/Lib/site-packages/arrow/__init__.py deleted file mode 100644 index bc59709..0000000 --- a/.venv/Lib/site-packages/arrow/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -from ._version import __version__ -from .api import get, now, utcnow -from .arrow import Arrow -from .factory import ArrowFactory -from .formatter import ( - FORMAT_ATOM, - FORMAT_COOKIE, - FORMAT_RFC822, - FORMAT_RFC850, - FORMAT_RFC1036, - FORMAT_RFC1123, - FORMAT_RFC2822, - FORMAT_RFC3339, - FORMAT_RSS, - FORMAT_W3C, -) -from .parser import ParserError - -# https://mypy.readthedocs.io/en/stable/command_line.html#cmdoption-mypy-no-implicit-reexport -# Mypy with --strict or --no-implicit-reexport requires an explicit reexport. -__all__ = [ - "__version__", - "get", - "now", - "utcnow", - "Arrow", - "ArrowFactory", - "FORMAT_ATOM", - "FORMAT_COOKIE", - "FORMAT_RFC822", - "FORMAT_RFC850", - "FORMAT_RFC1036", - "FORMAT_RFC1123", - "FORMAT_RFC2822", - "FORMAT_RFC3339", - "FORMAT_RSS", - "FORMAT_W3C", - "ParserError", -] diff --git a/.venv/Lib/site-packages/arrow/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/arrow/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 14d7140b21e97ac14f7865ce9b9f3c80768feaf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 829 zcmb7?&u`N(6vvaMY1$^~?{$My4_tbnbd5lO5TYupgkTh{oj_J3E9=X;XmJyqv}pef zcm5?`IdS672|u$<9T$YHeDeJ|&w9_#Id$EtCda4G50)2(rhP}VJDSqGl27(k0yNNL zjp;8q{vKSsx>1nF^gDA7vnOkkc!e~TxB+~nL`}r5|`CTjnzq=HAsUs zNt3lmi?vCcbx23Wm*PFvC0(g4C_@FRV1olL)SwOxXhI9x(1AVZ!v3mB_TgZz_3!=A zWs!Yd*pzNVo<+%;(!L>#RhSE7oqQ3cO}>qX+c!tI_GCJFIvU-vkB6dm9W1{d4!tLL{Nc#k^&{NA6YqK6Gf}noEPL7xx6Zk7ZE0+gs>20LWh$+xoF|+Gc^>lruRxSibv#vxuqX}Un9^?=zmMf1 zek~@?{ZrY2%)i*I67Ihav&%e5{j((Rg)EJes0W)~E@kEqw&8l~zl+ZNEXu=&X|TKu tR$=C=+8g`kf`~$uWHBK97{oyaj6jY95EpX*i4=w?h7`tN22G|aRzp1_J!3yj##`L+ z@nxw+#hLke@$oAeikN`vz{IZ*XRDadVxUw^MrnF}QH)D!adt_5K}=G9i9%{_K~8?A zLQ1JZ36NPFqgR%iR~F-wnG{o;S(2(-keHmEn4Vf3lUP)gU#<_cK(CpMjVG07wcny8r+H diff --git a/.venv/Lib/site-packages/arrow/__pycache__/api.cpython-38.pyc b/.venv/Lib/site-packages/arrow/__pycache__/api.cpython-38.pyc deleted file mode 100644 index bec73eb5990bcf6dccb8333d6c9c79d1e097ab17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2831 zcmb^z$!;7)w5zw-+cRD>j-7NuIE(-zI9gE@%SjND6-SA!M6Ho}+EX=lJG~6mHMVS- zQ*!1D=0Gk;{s(USMPE5_1Bn9!BzUiSR%eiilp59RdP}{nUe%lZN~Ng4c=64h_D`_- z8Ij2`2grSx$?rr_sNyJ;P&FW->Zl=c2tix}Tyu1})&nCn9aFB2AQ$GHd{}S_VbLju zC8rdYopM-lDxu|AQpODC!m3jZYfeq#xnMqAa2Dh`A1sDT&Jt1B(ksPTW)@qZ1zMz~ zzQ$HqkyYyoyT)p?+}CM^TCdGl#Hmk7txn0!^$l8`DOX`NMwrS>rn6Oc9d?!A3%`z5 zS2_i-Gik2|dglK_4`}JAAYYx@vCuc^;>;Z@tOAk+wgPr=-=rPfwKUq5XL*Qqxv$X` zpy?3l@^SrGVRcsl`n5ixb-D`lHK4Bnea%(qtwEM*^m<>VYjpj!;j9CH9r)|8ugq#- zbBW#n?oDdL?i}M+vndFpYZs^r!29>5wj`lc)dW_e%K9I$Rgnh zKaT9UV{f(tFG)6ATb#$IkG!^s`I&v!Lu{jyp&OIDd#z%~#8FHWyAyM}moVE)Y|jp3 z+6$Py_2lb~V(}L&$A+5f)DtYtBNTqf8YDHvxgT|6Sd|jNdu`!LMlRL1qO(-r@e`5e zcf07F7o^5s5ByE_y|XS$jr|CyX+Az-JcvCC`g41Z`|!n+r>P-b1g+MChmW@QclO+! z-R-TNhnFNRPkR6O(WRD}LEQEN#&vKqU5sKLdVzn=+|wgpu%zp?SwrUwz?2ev5yec- zM2|;pSj(XS#0fV{*@l^*GO9dNF3ICdh0g=VSBBv2?)GMLKVdv+9`z1m-h9B4mm=;q z4`N|6IFi`6Y0nn0Oqv@fEIMiK_y^4d-1!XLdFdUpq$!W&bFb@fbk9=lkO@?ur~s54 zuLEotsqXQ^oBM znby%74$Rol`c&4YtX~JIt7=BMq78f48C7p-7k|MlQnR|fbTnp zH+JLF;A`l{I)dq17@zCdm-`@=`BG@VhZTMU)z64+XRNQG$^570%Tsx}Q^yHn3fjZO z?!rvU0EBW(E|d%M9f7BSobPRWK`{Lcy#J-QTP-NLR?E&V{{~#XygPUwvg%W_GPwy3 z%!=p*dM8t(HOO>L0!I$y%Bsl2LMY#pH*lXIfaf15fSzba@#$m?+y+ajnK353mM0<$ z4NKgEIdGjL4za7^Jc|KKXgF|<2O(p?7L74nC~rROG0Y4>11hBTHW-}=>?`!-euHi{Qtn@(qO7J{q-+sov0%Edl#Y(q(PG<1;!El&|oxvBqm#&M7bOStY%(7 zfHlEO2=JOZr7R5+@(PkIB+q5!b{r+bi$ucl|D03FsKYB)Lvb5GszD!3^@BJL%_{O+jotC^;%sRVw1 z>#9mjT>WJgMl{67R7*K?XF2h_b{R`tYa7O?D diff --git a/.venv/Lib/site-packages/arrow/__pycache__/arrow.cpython-38.pyc b/.venv/Lib/site-packages/arrow/__pycache__/arrow.cpython-38.pyc deleted file mode 100644 index 87342afb99400672d647be0111b40729aa64d692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52229 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 Umd3?+pD6v0@A3t;zij>X7s0c3WdHyG diff --git a/.venv/Lib/site-packages/arrow/__pycache__/factory.cpython-38.pyc b/.venv/Lib/site-packages/arrow/__pycache__/factory.cpython-38.pyc deleted file mode 100644 index 590e21de0b8a37e34f8271f802eb5cf9b965d6bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9240 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 Cnjb^} diff --git a/.venv/Lib/site-packages/arrow/__pycache__/formatter.cpython-38.pyc b/.venv/Lib/site-packages/arrow/__pycache__/formatter.cpython-38.pyc deleted file mode 100644 index 1de9c42507cf8237bc608f6f2be90e10f56aaad8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4208 zcmZ`+&2!tv6<;jCPmvTQ%eKC3)2@@4PNX=N<0PtLS~cyetz~;6Yn*K4AP^U{AQAwx z0F{UX^0JLRTX+RdOSR*#wEc0xOh%JbaYmd02 zY*Zs&K}o4t;(2z&9<|3Nh<%g~Ef8K{#|Cl{ zU72sRtst2Hcu@%d)5?N{-E7krt`&y1n5|o(eb;gA8-3);#}(!ATE+4zj@yA)Hm?jE zkgITT3c)Fu-N(bbRi!f9$7BvQ+-`?fRhQY@ozU?;t1UBk)PSBe8deZiHA%xB&`jHJ zSZzB1wp71Nb?1YC zF*$VO_It~Vcg@ASx0ib-IXtgb>UFSNocD*-|SXaQha>#aI z`QD9dZ(qFFn|?0v_lHH}H!sLiG75-qT$sDun>swq;eieszj1Nypz}o-`Jg;EH}{Ur z_k*vj4ETF<*BW>n2Ok53tIz@g#3t|-5k^;ut?wFK+tXOePTLtfJ3%1BbDS;^JHI&u zoDN)}so7a>@YI)-r+Ma4iWTjWodqoWrOtCa|Hxp&fRxccrhEuA1zrTr2sa=bOLF9e z4D0pIt$lc|Hh-@6?z!5Xg|-8EXtl3=_|g6Q)hZzGCP=k7gFL3;HE2N@NJw_I2(~UFCglW{sNJgS0+W>GAK0N8$5a8~ zwJ-v^-BiLiL`;Lx)75M9Ypa1Rg0+qA17EDw?VuI6Tt%Se^YqMLn zx3zZDSzilalV&;XFJ<6YnqPdgr@l_PE@Uc_9kE0``Nx3yqlDV zQg6DUm;{#wF0%h1pMr*cFb?D~*@R_(PCnO~c>mHz*@*7pZKL06z(qZHkjJe!0!=xF zB-9?0UHTaIYgfmV+oKQBk=_z$Ts1@*I;jVtkVP|Ik{S9f+mopW!tZwA)z{o_sMH(n zK%4?wwT#SO>wZ%F~@ao{EALMwndbuT2#zOWRvddk+x~PKFGAGP9!WGul;*P13?I^rDb3GgEQx=Kwh}usWr%dBhT{ib8GyGR99QCv!$& zO@;kvlJK(${*uCfsqmKpeY)~vuv)F2ILFKze`Ft&ENDWzr2Ilew>q5 z7PObb@!g3%;(_1h@f{COv)jLX+uGVZn!wLY<{Cu?QiaYV(rpFDUNSr`il?HA`xX zQoGlqGxw@zWIhNj5eA<+;fBoG9#@?DYO>t6Z3(m4ZMUU?EE`dPwZ1OwEyu#*Qs!OX z3pY&9a&4JXJR6OnLuRTl4ZEGTEi<8OZgXo}>Ofe@7aWUA)9bqHw!m6;JC2rj0{>In zZlP5f(L(`^4Zka-ZmkD0?K)mJv}HQ58@|Wokn1#rp9pGTSfbmJ>9D7!3BBVreL2LT zlE!XEP>)OKMj^)WA zm@k&o9=AlbAf~`S{-j}5AajA;v4j=+LS#T@Nw|3G0n{qa15d1?&pjl|=wsmW#d|2L zFQOv&MHFX%T!t3>0SKYvT7hP@k_N5c1D}VMP2|Er&Vx-}D}xqW9(eqr^<`+6`toyq z33LZr0rk+z(6Z1*wMk=|jzXLg9Z&F*);sm$2l`N*Q60tN2~Wi|p*%EUN4st03#R!= z*J>vkDj;ndzT0uywyGNhzFGpyByk#u95zkM^WcCmCj--rYr^zRbs!>#b|;ZwZ6?km z!QxzPgZ(KDqA%6P)V@qdVr#gMUH7^s=c!WLAlur4Svn?4(f zL!0(zq3t0Y#G8RPj@k^-LJlV`hLK?5EJl!wBEj-dz`y@Q97S>r2`=gT_5q5#_(ZPY dof+W9r6HlRkUC?uKnsv|m`(+~49Igo{eR#LKV$#^ diff --git a/.venv/Lib/site-packages/arrow/__pycache__/locales.cpython-38.pyc b/.venv/Lib/site-packages/arrow/__pycache__/locales.cpython-38.pyc deleted file mode 100644 index 2b9983165e108e48470fdfff846ff4ea28093bf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108781 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 G_WuV^Tx3`P diff --git a/.venv/Lib/site-packages/arrow/__pycache__/parser.cpython-38.pyc b/.venv/Lib/site-packages/arrow/__pycache__/parser.cpython-38.pyc deleted file mode 100644 index 9327461c70a8d649698d98e8d1790cfcb1826966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14735 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 Ul138B4$j)q^g!b0l-5`Kzt$KD4FCWD diff --git a/.venv/Lib/site-packages/arrow/__pycache__/util.cpython-38.pyc b/.venv/Lib/site-packages/arrow/__pycache__/util.cpython-38.pyc deleted file mode 100644 index 21b18ae3cef90776b461dde6dd0fd998ddd1e01b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3709 zcmbtXTXPdf7M`9NT`b>(F}5MME<$2!%T{a%q1MGxu!bbA1w&yIh%luZt6TP1b5VL) z5Ua#Xys!BITgz6#WB$wjf_dGS_%G~3cE8gj3ELr+hm16RznuQgIbWZ7G(KLk@I3kM zQlma$S^uHR@h6AMO}xp!kqE112`21-)fjRoutTTjgl^3ZbG00!J~zmRg<2sj){3T{ z3r50HtrU*dM#Hh%SU6rA4<~99%#yBT`;+G_Sw_x8{*@yNqWE{Wc1AjKN{qa+MM;dJ zepWidHuW(vj{3AbC(nrq^iPU1>N8k@eppSMdF6^JaTcw!at^bmG3uO{LH)caicv8x z&hEOk3&P&CDzn|szLr6|*$H^F6E(CSM+xsFQgA=gQbk@69Pk&u-t!~wDHXq{9svSt zqvE8_t>_>v-fzsq$7bm%@r4q-p+V+$eX6;7aRel@2+7Bgoc5t9;|Q5IV*>+Vi6-U-KfqBe}<)dqGE{s4*qt%Y5Np z908#U_aec+;0v1_Q>|taX0ZKQu12gNR~u7}V6lp+MNG+`V`P%X#U%|h!$d@a_8PvYC zyt1@>l`k)^n*Y0Z-P-G@1Q7g@eXqP@-<99lH$(c5?E1w!cK!VAu7sOnFzll|lJ4cl znKSUP1FT^Tzi$LbG`r%aZd1wcY6YQ<4cA6?4*F_HbB(wYX?Stz8#1grpa7*@%u0&` z4Jq1P5k*#PHAdxeBtKc|9J2pDSXX%y^m3&(A z6F)*j)R3vW6URa7fOykfGl)H%I*C^5ECl?CsX1f@(kz)lH68Pl`f$Z%v?NnVEV~34 z%6M%+l4lc4eT3FuK|pFWO)G%-j6A#Yz_t* ztM^az7xX7&cUFFyO|u!ME}{%O9U1EI-L^VZ)J=?srCPYXu9L;KAY%`<_ks1&iY}tX zM#~~vY|~PP0!c0QKrKBBYRPrK-iTEQ)Vq?0eh@%K4KTgAAws{Q;(mQ7RYEAnJTkN1 zns8F}e|9X(zxmfmt2?)K;xZi0<=qJaSjRCBJOy+st|AQ72qhGD83Zd#eN5$37@p1c zgrslnd>!Kw@@dO1!oExN+GVCLp#@x4^pm)LAU&0ph{)0cwc!fL;DyY?hg3+^W&Gd= z6a?$BzI{(4Okl}}#=iTZ0($L!?`7el_j<&TID#TIQ@b z?4{dtdhVR{GS|y#w(s<8YNw!N&Ju+m?OE$(zL$rBirt^r;^?_l8oUwl_09Vx>@ZP5 zrU}oK3FCesane}^2xR_3SR9W>sFzU5da1;tPPil0B9~rckJEU*=OtVs?1SfAy$qM+ zSFac$lG7^z)odZUVY77*3$4IYRovO#Q6NEqWIqbXTvn9<`O#G*-6cBb zniojKCn`Izar&V%53aM7rK?w}N2Iv!pH9pn34UwJwIgyO_?nARNt&Z$CzV|0z0>HT z4n&m36@?76N7NkCFifZv)F&9DKBZ(HNv+h3J4)}>_q{01nenv}0ax$ept}P)J8jWr zf?vn=;ecE|xx2ziaA3L=91M%P}b;C6@E;Fi0m@5(}$lNQew7#gfST-GLFm2{-3%+liy1V^}2`~^|~^u z$%ArXK8lX2$a_r$Qkx)+nW(^gYM2nj1S7S{>{A7-Mpvs&GNwL7JBGrSXf>jE6EkFt zPnV^kX7xUmh*yjz)CW`|2}wSD89~0cd}T`JRxVx-V}Wm<8x&_Gw1x|&nzqaK`=z3V T5apM#kILiavGVxLT)FUnbbi6U diff --git a/.venv/Lib/site-packages/arrow/_version.py b/.venv/Lib/site-packages/arrow/_version.py deleted file mode 100644 index 10aa336..0000000 --- a/.venv/Lib/site-packages/arrow/_version.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "1.2.3" diff --git a/.venv/Lib/site-packages/arrow/api.py b/.venv/Lib/site-packages/arrow/api.py deleted file mode 100644 index d8ed24b..0000000 --- a/.venv/Lib/site-packages/arrow/api.py +++ /dev/null @@ -1,126 +0,0 @@ -""" -Provides the default implementation of :class:`ArrowFactory ` -methods for use as a module API. - -""" - -from datetime import date, datetime -from datetime import tzinfo as dt_tzinfo -from time import struct_time -from typing import Any, List, Optional, Tuple, Type, Union, overload - -from arrow.arrow import TZ_EXPR, Arrow -from arrow.constants import DEFAULT_LOCALE -from arrow.factory import ArrowFactory - -# internal default factory. -_factory = ArrowFactory() - -# TODO: Use Positional Only Argument (https://www.python.org/dev/peps/pep-0570/) -# after Python 3.7 deprecation - - -@overload -def get( - *, - locale: str = DEFAULT_LOCALE, - tzinfo: Optional[TZ_EXPR] = None, - normalize_whitespace: bool = False, -) -> Arrow: - ... # pragma: no cover - - -@overload -def get( - *args: int, - locale: str = DEFAULT_LOCALE, - tzinfo: Optional[TZ_EXPR] = None, - normalize_whitespace: bool = False, -) -> Arrow: - ... # pragma: no cover - - -@overload -def get( - __obj: Union[ - Arrow, - datetime, - date, - struct_time, - dt_tzinfo, - int, - float, - str, - Tuple[int, int, int], - ], - *, - locale: str = DEFAULT_LOCALE, - tzinfo: Optional[TZ_EXPR] = None, - normalize_whitespace: bool = False, -) -> Arrow: - ... # pragma: no cover - - -@overload -def get( - __arg1: Union[datetime, date], - __arg2: TZ_EXPR, - *, - locale: str = DEFAULT_LOCALE, - tzinfo: Optional[TZ_EXPR] = None, - normalize_whitespace: bool = False, -) -> Arrow: - ... # pragma: no cover - - -@overload -def get( - __arg1: str, - __arg2: Union[str, List[str]], - *, - locale: str = DEFAULT_LOCALE, - tzinfo: Optional[TZ_EXPR] = None, - normalize_whitespace: bool = False, -) -> Arrow: - ... # pragma: no cover - - -def get(*args: Any, **kwargs: Any) -> Arrow: - """Calls the default :class:`ArrowFactory ` ``get`` method.""" - - return _factory.get(*args, **kwargs) - - -get.__doc__ = _factory.get.__doc__ - - -def utcnow() -> Arrow: - """Calls the default :class:`ArrowFactory ` ``utcnow`` method.""" - - return _factory.utcnow() - - -utcnow.__doc__ = _factory.utcnow.__doc__ - - -def now(tz: Optional[TZ_EXPR] = None) -> Arrow: - """Calls the default :class:`ArrowFactory ` ``now`` method.""" - - return _factory.now(tz) - - -now.__doc__ = _factory.now.__doc__ - - -def factory(type: Type[Arrow]) -> ArrowFactory: - """Returns an :class:`.ArrowFactory` for the specified :class:`Arrow ` - or derived type. - - :param type: the type, :class:`Arrow ` or derived. - - """ - - return ArrowFactory(type) - - -__all__ = ["get", "utcnow", "now", "factory"] diff --git a/.venv/Lib/site-packages/arrow/arrow.py b/.venv/Lib/site-packages/arrow/arrow.py deleted file mode 100644 index 1ede107..0000000 --- a/.venv/Lib/site-packages/arrow/arrow.py +++ /dev/null @@ -1,1886 +0,0 @@ -""" -Provides the :class:`Arrow ` class, an enhanced ``datetime`` -replacement. - -""" - - -import calendar -import re -import sys -from datetime import date -from datetime import datetime as dt_datetime -from datetime import time as dt_time -from datetime import timedelta -from datetime import tzinfo as dt_tzinfo -from math import trunc -from time import struct_time -from typing import ( - Any, - ClassVar, - Generator, - Iterable, - List, - Mapping, - Optional, - Tuple, - Union, - cast, - overload, -) - -from dateutil import tz as dateutil_tz -from dateutil.relativedelta import relativedelta - -from arrow import formatter, locales, parser, util -from arrow.constants import DEFAULT_LOCALE, DEHUMANIZE_LOCALES -from arrow.locales import TimeFrameLiteral - -if sys.version_info < (3, 8): # pragma: no cover - from typing_extensions import Final, Literal -else: - from typing import Final, Literal # pragma: no cover - - -TZ_EXPR = Union[dt_tzinfo, str] - -_T_FRAMES = Literal[ - "year", - "years", - "month", - "months", - "day", - "days", - "hour", - "hours", - "minute", - "minutes", - "second", - "seconds", - "microsecond", - "microseconds", - "week", - "weeks", - "quarter", - "quarters", -] - -_BOUNDS = Literal["[)", "()", "(]", "[]"] - -_GRANULARITY = Literal[ - "auto", - "second", - "minute", - "hour", - "day", - "week", - "month", - "quarter", - "year", -] - - -class Arrow: - """An :class:`Arrow ` object. - - Implements the ``datetime`` interface, behaving as an aware ``datetime`` while implementing - additional functionality. - - :param year: the calendar year. - :param month: the calendar month. - :param day: the calendar day. - :param hour: (optional) the hour. Defaults to 0. - :param minute: (optional) the minute, Defaults to 0. - :param second: (optional) the second, Defaults to 0. - :param microsecond: (optional) the microsecond. Defaults to 0. - :param tzinfo: (optional) A timezone expression. Defaults to UTC. - :param fold: (optional) 0 or 1, used to disambiguate repeated wall times. Defaults to 0. - - .. _tz-expr: - - Recognized timezone expressions: - - - A ``tzinfo`` object. - - A ``str`` describing a timezone, similar to 'US/Pacific', or 'Europe/Berlin'. - - A ``str`` in ISO 8601 style, as in '+07:00'. - - A ``str``, one of the following: 'local', 'utc', 'UTC'. - - Usage:: - - >>> import arrow - >>> arrow.Arrow(2013, 5, 5, 12, 30, 45) - - - """ - - resolution: ClassVar[timedelta] = dt_datetime.resolution - min: ClassVar["Arrow"] - max: ClassVar["Arrow"] - - _ATTRS: Final[List[str]] = [ - "year", - "month", - "day", - "hour", - "minute", - "second", - "microsecond", - ] - _ATTRS_PLURAL: Final[List[str]] = [f"{a}s" for a in _ATTRS] - _MONTHS_PER_QUARTER: Final[int] = 3 - _SECS_PER_MINUTE: Final[int] = 60 - _SECS_PER_HOUR: Final[int] = 60 * 60 - _SECS_PER_DAY: Final[int] = 60 * 60 * 24 - _SECS_PER_WEEK: Final[int] = 60 * 60 * 24 * 7 - _SECS_PER_MONTH: Final[float] = 60 * 60 * 24 * 30.5 - _SECS_PER_QUARTER: Final[float] = 60 * 60 * 24 * 30.5 * 3 - _SECS_PER_YEAR: Final[int] = 60 * 60 * 24 * 365 - - _SECS_MAP: Final[Mapping[TimeFrameLiteral, float]] = { - "second": 1.0, - "minute": _SECS_PER_MINUTE, - "hour": _SECS_PER_HOUR, - "day": _SECS_PER_DAY, - "week": _SECS_PER_WEEK, - "month": _SECS_PER_MONTH, - "quarter": _SECS_PER_QUARTER, - "year": _SECS_PER_YEAR, - } - - _datetime: dt_datetime - - def __init__( - self, - year: int, - month: int, - day: int, - hour: int = 0, - minute: int = 0, - second: int = 0, - microsecond: int = 0, - tzinfo: Optional[TZ_EXPR] = None, - **kwargs: Any, - ) -> None: - if tzinfo is None: - tzinfo = dateutil_tz.tzutc() - # detect that tzinfo is a pytz object (issue #626) - elif ( - isinstance(tzinfo, dt_tzinfo) - and hasattr(tzinfo, "localize") - and hasattr(tzinfo, "zone") - and tzinfo.zone # type: ignore[attr-defined] - ): - tzinfo = parser.TzinfoParser.parse(tzinfo.zone) # type: ignore[attr-defined] - elif isinstance(tzinfo, str): - tzinfo = parser.TzinfoParser.parse(tzinfo) - - fold = kwargs.get("fold", 0) - - self._datetime = dt_datetime( - year, month, day, hour, minute, second, microsecond, tzinfo, fold=fold - ) - - # factories: single object, both original and from datetime. - - @classmethod - def now(cls, tzinfo: Optional[dt_tzinfo] = None) -> "Arrow": - """Constructs an :class:`Arrow ` object, representing "now" in the given - timezone. - - :param tzinfo: (optional) a ``tzinfo`` object. Defaults to local time. - - Usage:: - - >>> arrow.now('Asia/Baku') - - - """ - - if tzinfo is None: - tzinfo = dateutil_tz.tzlocal() - - dt = dt_datetime.now(tzinfo) - - return cls( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - dt.tzinfo, - fold=getattr(dt, "fold", 0), - ) - - @classmethod - def utcnow(cls) -> "Arrow": - """Constructs an :class:`Arrow ` object, representing "now" in UTC - time. - - Usage:: - - >>> arrow.utcnow() - - - """ - - dt = dt_datetime.now(dateutil_tz.tzutc()) - - return cls( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - dt.tzinfo, - fold=getattr(dt, "fold", 0), - ) - - @classmethod - def fromtimestamp( - cls, - timestamp: Union[int, float, str], - tzinfo: Optional[TZ_EXPR] = None, - ) -> "Arrow": - """Constructs an :class:`Arrow ` object from a timestamp, converted to - the given timezone. - - :param timestamp: an ``int`` or ``float`` timestamp, or a ``str`` that converts to either. - :param tzinfo: (optional) a ``tzinfo`` object. Defaults to local time. - - """ - - if tzinfo is None: - tzinfo = dateutil_tz.tzlocal() - elif isinstance(tzinfo, str): - tzinfo = parser.TzinfoParser.parse(tzinfo) - - if not util.is_timestamp(timestamp): - raise ValueError(f"The provided timestamp {timestamp!r} is invalid.") - - timestamp = util.normalize_timestamp(float(timestamp)) - dt = dt_datetime.fromtimestamp(timestamp, tzinfo) - - return cls( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - dt.tzinfo, - fold=getattr(dt, "fold", 0), - ) - - @classmethod - def utcfromtimestamp(cls, timestamp: Union[int, float, str]) -> "Arrow": - """Constructs an :class:`Arrow ` object from a timestamp, in UTC time. - - :param timestamp: an ``int`` or ``float`` timestamp, or a ``str`` that converts to either. - - """ - - if not util.is_timestamp(timestamp): - raise ValueError(f"The provided timestamp {timestamp!r} is invalid.") - - timestamp = util.normalize_timestamp(float(timestamp)) - dt = dt_datetime.utcfromtimestamp(timestamp) - - return cls( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - dateutil_tz.tzutc(), - fold=getattr(dt, "fold", 0), - ) - - @classmethod - def fromdatetime(cls, dt: dt_datetime, tzinfo: Optional[TZ_EXPR] = None) -> "Arrow": - """Constructs an :class:`Arrow ` object from a ``datetime`` and - optional replacement timezone. - - :param dt: the ``datetime`` - :param tzinfo: (optional) A :ref:`timezone expression `. Defaults to ``dt``'s - timezone, or UTC if naive. - - Usage:: - - >>> dt - datetime.datetime(2021, 4, 7, 13, 48, tzinfo=tzfile('/usr/share/zoneinfo/US/Pacific')) - >>> arrow.Arrow.fromdatetime(dt) - - - """ - - if tzinfo is None: - if dt.tzinfo is None: - tzinfo = dateutil_tz.tzutc() - else: - tzinfo = dt.tzinfo - - return cls( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - tzinfo, - fold=getattr(dt, "fold", 0), - ) - - @classmethod - def fromdate(cls, date: date, tzinfo: Optional[TZ_EXPR] = None) -> "Arrow": - """Constructs an :class:`Arrow ` object from a ``date`` and optional - replacement timezone. All time values are set to 0. - - :param date: the ``date`` - :param tzinfo: (optional) A :ref:`timezone expression `. Defaults to UTC. - - """ - - if tzinfo is None: - tzinfo = dateutil_tz.tzutc() - - return cls(date.year, date.month, date.day, tzinfo=tzinfo) - - @classmethod - def strptime( - cls, date_str: str, fmt: str, tzinfo: Optional[TZ_EXPR] = None - ) -> "Arrow": - """Constructs an :class:`Arrow ` object from a date string and format, - in the style of ``datetime.strptime``. Optionally replaces the parsed timezone. - - :param date_str: the date string. - :param fmt: the format string using datetime format codes. - :param tzinfo: (optional) A :ref:`timezone expression `. Defaults to the parsed - timezone if ``fmt`` contains a timezone directive, otherwise UTC. - - Usage:: - - >>> arrow.Arrow.strptime('20-01-2019 15:49:10', '%d-%m-%Y %H:%M:%S') - - - """ - - dt = dt_datetime.strptime(date_str, fmt) - if tzinfo is None: - tzinfo = dt.tzinfo - - return cls( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - tzinfo, - fold=getattr(dt, "fold", 0), - ) - - @classmethod - def fromordinal(cls, ordinal: int) -> "Arrow": - """Constructs an :class:`Arrow ` object corresponding - to the Gregorian Ordinal. - - :param ordinal: an ``int`` corresponding to a Gregorian Ordinal. - - Usage:: - - >>> arrow.fromordinal(737741) - - - """ - - util.validate_ordinal(ordinal) - dt = dt_datetime.fromordinal(ordinal) - return cls( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - dt.tzinfo, - fold=getattr(dt, "fold", 0), - ) - - # factories: ranges and spans - - @classmethod - def range( - cls, - frame: _T_FRAMES, - start: Union["Arrow", dt_datetime], - end: Union["Arrow", dt_datetime, None] = None, - tz: Optional[TZ_EXPR] = None, - limit: Optional[int] = None, - ) -> Generator["Arrow", None, None]: - """Returns an iterator of :class:`Arrow ` objects, representing - points in time between two inputs. - - :param frame: The timeframe. Can be any ``datetime`` property (day, hour, minute...). - :param start: A datetime expression, the start of the range. - :param end: (optional) A datetime expression, the end of the range. - :param tz: (optional) A :ref:`timezone expression `. Defaults to - ``start``'s timezone, or UTC if ``start`` is naive. - :param limit: (optional) A maximum number of tuples to return. - - **NOTE**: The ``end`` or ``limit`` must be provided. Call with ``end`` alone to - return the entire range. Call with ``limit`` alone to return a maximum # of results from - the start. Call with both to cap a range at a maximum # of results. - - **NOTE**: ``tz`` internally **replaces** the timezones of both ``start`` and ``end`` before - iterating. As such, either call with naive objects and ``tz``, or aware objects from the - same timezone and no ``tz``. - - Supported frame values: year, quarter, month, week, day, hour, minute, second, microsecond. - - Recognized datetime expressions: - - - An :class:`Arrow ` object. - - A ``datetime`` object. - - Usage:: - - >>> start = datetime(2013, 5, 5, 12, 30) - >>> end = datetime(2013, 5, 5, 17, 15) - >>> for r in arrow.Arrow.range('hour', start, end): - ... print(repr(r)) - ... - - - - - - - **NOTE**: Unlike Python's ``range``, ``end`` *may* be included in the returned iterator:: - - >>> start = datetime(2013, 5, 5, 12, 30) - >>> end = datetime(2013, 5, 5, 13, 30) - >>> for r in arrow.Arrow.range('hour', start, end): - ... print(repr(r)) - ... - - - - """ - - _, frame_relative, relative_steps = cls._get_frames(frame) - - tzinfo = cls._get_tzinfo(start.tzinfo if tz is None else tz) - - start = cls._get_datetime(start).replace(tzinfo=tzinfo) - end, limit = cls._get_iteration_params(end, limit) - end = cls._get_datetime(end).replace(tzinfo=tzinfo) - - current = cls.fromdatetime(start) - original_day = start.day - day_is_clipped = False - i = 0 - - while current <= end and i < limit: - i += 1 - yield current - - values = [getattr(current, f) for f in cls._ATTRS] - current = cls(*values, tzinfo=tzinfo).shift( # type: ignore - **{frame_relative: relative_steps} - ) - - if frame in ["month", "quarter", "year"] and current.day < original_day: - day_is_clipped = True - - if day_is_clipped and not cls._is_last_day_of_month(current): - current = current.replace(day=original_day) - - def span( - self, - frame: _T_FRAMES, - count: int = 1, - bounds: _BOUNDS = "[)", - exact: bool = False, - week_start: int = 1, - ) -> Tuple["Arrow", "Arrow"]: - """Returns a tuple of two new :class:`Arrow ` objects, representing the timespan - of the :class:`Arrow ` object in a given timeframe. - - :param frame: the timeframe. Can be any ``datetime`` property (day, hour, minute...). - :param count: (optional) the number of frames to span. - :param bounds: (optional) a ``str`` of either '()', '(]', '[)', or '[]' that specifies - whether to include or exclude the start and end values in the span. '(' excludes - the start, '[' includes the start, ')' excludes the end, and ']' includes the end. - If the bounds are not specified, the default bound '[)' is used. - :param exact: (optional) whether to have the start of the timespan begin exactly - at the time specified by ``start`` and the end of the timespan truncated - so as not to extend beyond ``end``. - :param week_start: (optional) only used in combination with the week timeframe. Follows isoweekday() where - Monday is 1 and Sunday is 7. - - Supported frame values: year, quarter, month, week, day, hour, minute, second. - - Usage:: - - >>> arrow.utcnow() - - - >>> arrow.utcnow().span('hour') - (, ) - - >>> arrow.utcnow().span('day') - (, ) - - >>> arrow.utcnow().span('day', count=2) - (, ) - - >>> arrow.utcnow().span('day', bounds='[]') - (, ) - - >>> arrow.utcnow().span('week') - (, ) - - >>> arrow.utcnow().span('week', week_start=6) - (, ) - - """ - if not 1 <= week_start <= 7: - raise ValueError("week_start argument must be between 1 and 7.") - - util.validate_bounds(bounds) - - frame_absolute, frame_relative, relative_steps = self._get_frames(frame) - - if frame_absolute == "week": - attr = "day" - elif frame_absolute == "quarter": - attr = "month" - else: - attr = frame_absolute - - floor = self - if not exact: - index = self._ATTRS.index(attr) - frames = self._ATTRS[: index + 1] - - values = [getattr(self, f) for f in frames] - - for _ in range(3 - len(values)): - values.append(1) - - floor = self.__class__(*values, tzinfo=self.tzinfo) # type: ignore - - if frame_absolute == "week": - # if week_start is greater than self.isoweekday() go back one week by setting delta = 7 - delta = 7 if week_start > self.isoweekday() else 0 - floor = floor.shift(days=-(self.isoweekday() - week_start) - delta) - elif frame_absolute == "quarter": - floor = floor.shift(months=-((self.month - 1) % 3)) - - ceil = floor.shift(**{frame_relative: count * relative_steps}) - - if bounds[0] == "(": - floor = floor.shift(microseconds=+1) - - if bounds[1] == ")": - ceil = ceil.shift(microseconds=-1) - - return floor, ceil - - def floor(self, frame: _T_FRAMES) -> "Arrow": - """Returns a new :class:`Arrow ` object, representing the "floor" - of the timespan of the :class:`Arrow ` object in a given timeframe. - Equivalent to the first element in the 2-tuple returned by - :func:`span `. - - :param frame: the timeframe. Can be any ``datetime`` property (day, hour, minute...). - - Usage:: - - >>> arrow.utcnow().floor('hour') - - - """ - - return self.span(frame)[0] - - def ceil(self, frame: _T_FRAMES) -> "Arrow": - """Returns a new :class:`Arrow ` object, representing the "ceiling" - of the timespan of the :class:`Arrow ` object in a given timeframe. - Equivalent to the second element in the 2-tuple returned by - :func:`span `. - - :param frame: the timeframe. Can be any ``datetime`` property (day, hour, minute...). - - Usage:: - - >>> arrow.utcnow().ceil('hour') - - - """ - - return self.span(frame)[1] - - @classmethod - def span_range( - cls, - frame: _T_FRAMES, - start: dt_datetime, - end: dt_datetime, - tz: Optional[TZ_EXPR] = None, - limit: Optional[int] = None, - bounds: _BOUNDS = "[)", - exact: bool = False, - ) -> Iterable[Tuple["Arrow", "Arrow"]]: - """Returns an iterator of tuples, each :class:`Arrow ` objects, - representing a series of timespans between two inputs. - - :param frame: The timeframe. Can be any ``datetime`` property (day, hour, minute...). - :param start: A datetime expression, the start of the range. - :param end: (optional) A datetime expression, the end of the range. - :param tz: (optional) A :ref:`timezone expression `. Defaults to - ``start``'s timezone, or UTC if ``start`` is naive. - :param limit: (optional) A maximum number of tuples to return. - :param bounds: (optional) a ``str`` of either '()', '(]', '[)', or '[]' that specifies - whether to include or exclude the start and end values in each span in the range. '(' excludes - the start, '[' includes the start, ')' excludes the end, and ']' includes the end. - If the bounds are not specified, the default bound '[)' is used. - :param exact: (optional) whether to have the first timespan start exactly - at the time specified by ``start`` and the final span truncated - so as not to extend beyond ``end``. - - **NOTE**: The ``end`` or ``limit`` must be provided. Call with ``end`` alone to - return the entire range. Call with ``limit`` alone to return a maximum # of results from - the start. Call with both to cap a range at a maximum # of results. - - **NOTE**: ``tz`` internally **replaces** the timezones of both ``start`` and ``end`` before - iterating. As such, either call with naive objects and ``tz``, or aware objects from the - same timezone and no ``tz``. - - Supported frame values: year, quarter, month, week, day, hour, minute, second, microsecond. - - Recognized datetime expressions: - - - An :class:`Arrow ` object. - - A ``datetime`` object. - - **NOTE**: Unlike Python's ``range``, ``end`` will *always* be included in the returned - iterator of timespans. - - Usage: - - >>> start = datetime(2013, 5, 5, 12, 30) - >>> end = datetime(2013, 5, 5, 17, 15) - >>> for r in arrow.Arrow.span_range('hour', start, end): - ... print(r) - ... - (, ) - (, ) - (, ) - (, ) - (, ) - (, ) - - """ - - tzinfo = cls._get_tzinfo(start.tzinfo if tz is None else tz) - start = cls.fromdatetime(start, tzinfo).span(frame, exact=exact)[0] - end = cls.fromdatetime(end, tzinfo) - _range = cls.range(frame, start, end, tz, limit) - if not exact: - for r in _range: - yield r.span(frame, bounds=bounds, exact=exact) - - for r in _range: - floor, ceil = r.span(frame, bounds=bounds, exact=exact) - if ceil > end: - ceil = end - if bounds[1] == ")": - ceil += relativedelta(microseconds=-1) - if floor == end: - break - elif floor + relativedelta(microseconds=-1) == end: - break - yield floor, ceil - - @classmethod - def interval( - cls, - frame: _T_FRAMES, - start: dt_datetime, - end: dt_datetime, - interval: int = 1, - tz: Optional[TZ_EXPR] = None, - bounds: _BOUNDS = "[)", - exact: bool = False, - ) -> Iterable[Tuple["Arrow", "Arrow"]]: - """Returns an iterator of tuples, each :class:`Arrow ` objects, - representing a series of intervals between two inputs. - - :param frame: The timeframe. Can be any ``datetime`` property (day, hour, minute...). - :param start: A datetime expression, the start of the range. - :param end: (optional) A datetime expression, the end of the range. - :param interval: (optional) Time interval for the given time frame. - :param tz: (optional) A timezone expression. Defaults to UTC. - :param bounds: (optional) a ``str`` of either '()', '(]', '[)', or '[]' that specifies - whether to include or exclude the start and end values in the intervals. '(' excludes - the start, '[' includes the start, ')' excludes the end, and ']' includes the end. - If the bounds are not specified, the default bound '[)' is used. - :param exact: (optional) whether to have the first timespan start exactly - at the time specified by ``start`` and the final interval truncated - so as not to extend beyond ``end``. - - Supported frame values: year, quarter, month, week, day, hour, minute, second - - Recognized datetime expressions: - - - An :class:`Arrow ` object. - - A ``datetime`` object. - - Recognized timezone expressions: - - - A ``tzinfo`` object. - - A ``str`` describing a timezone, similar to 'US/Pacific', or 'Europe/Berlin'. - - A ``str`` in ISO 8601 style, as in '+07:00'. - - A ``str``, one of the following: 'local', 'utc', 'UTC'. - - Usage: - - >>> start = datetime(2013, 5, 5, 12, 30) - >>> end = datetime(2013, 5, 5, 17, 15) - >>> for r in arrow.Arrow.interval('hour', start, end, 2): - ... print(r) - ... - (, ) - (, ) - (, ) - """ - if interval < 1: - raise ValueError("interval has to be a positive integer") - - spanRange = iter( - cls.span_range(frame, start, end, tz, bounds=bounds, exact=exact) - ) - while True: - try: - intvlStart, intvlEnd = next(spanRange) - for _ in range(interval - 1): - try: - _, intvlEnd = next(spanRange) - except StopIteration: - continue - yield intvlStart, intvlEnd - except StopIteration: - return - - # representations - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} [{self.__str__()}]>" - - def __str__(self) -> str: - return self._datetime.isoformat() - - def __format__(self, formatstr: str) -> str: - - if len(formatstr) > 0: - return self.format(formatstr) - - return str(self) - - def __hash__(self) -> int: - return self._datetime.__hash__() - - # attributes and properties - - def __getattr__(self, name: str) -> int: - - if name == "week": - return self.isocalendar()[1] - - if name == "quarter": - return int((self.month - 1) / self._MONTHS_PER_QUARTER) + 1 - - if not name.startswith("_"): - value: Optional[int] = getattr(self._datetime, name, None) - - if value is not None: - return value - - return cast(int, object.__getattribute__(self, name)) - - @property - def tzinfo(self) -> dt_tzinfo: - """Gets the ``tzinfo`` of the :class:`Arrow ` object. - - Usage:: - - >>> arw=arrow.utcnow() - >>> arw.tzinfo - tzutc() - - """ - - # In Arrow, `_datetime` cannot be naive. - return cast(dt_tzinfo, self._datetime.tzinfo) - - @property - def datetime(self) -> dt_datetime: - """Returns a datetime representation of the :class:`Arrow ` object. - - Usage:: - - >>> arw=arrow.utcnow() - >>> arw.datetime - datetime.datetime(2019, 1, 24, 16, 35, 27, 276649, tzinfo=tzutc()) - - """ - - return self._datetime - - @property - def naive(self) -> dt_datetime: - """Returns a naive datetime representation of the :class:`Arrow ` - object. - - Usage:: - - >>> nairobi = arrow.now('Africa/Nairobi') - >>> nairobi - - >>> nairobi.naive - datetime.datetime(2019, 1, 23, 19, 27, 12, 297999) - - """ - - return self._datetime.replace(tzinfo=None) - - def timestamp(self) -> float: - """Returns a timestamp representation of the :class:`Arrow ` object, in - UTC time. - - Usage:: - - >>> arrow.utcnow().timestamp() - 1616882340.256501 - - """ - - return self._datetime.timestamp() - - @property - def int_timestamp(self) -> int: - """Returns an integer timestamp representation of the :class:`Arrow ` object, in - UTC time. - - Usage:: - - >>> arrow.utcnow().int_timestamp - 1548260567 - - """ - - return int(self.timestamp()) - - @property - def float_timestamp(self) -> float: - """Returns a floating-point timestamp representation of the :class:`Arrow ` - object, in UTC time. - - Usage:: - - >>> arrow.utcnow().float_timestamp - 1548260516.830896 - - """ - - return self.timestamp() - - @property - def fold(self) -> int: - """Returns the ``fold`` value of the :class:`Arrow ` object.""" - - return self._datetime.fold - - @property - def ambiguous(self) -> bool: - """Indicates whether the :class:`Arrow ` object is a repeated wall time in the current - timezone. - - """ - - return dateutil_tz.datetime_ambiguous(self._datetime) - - @property - def imaginary(self) -> bool: - """Indicates whether the :class: `Arrow ` object exists in the current timezone.""" - - return not dateutil_tz.datetime_exists(self._datetime) - - # mutation and duplication. - - def clone(self) -> "Arrow": - """Returns a new :class:`Arrow ` object, cloned from the current one. - - Usage: - - >>> arw = arrow.utcnow() - >>> cloned = arw.clone() - - """ - - return self.fromdatetime(self._datetime) - - def replace(self, **kwargs: Any) -> "Arrow": - """Returns a new :class:`Arrow ` object with attributes updated - according to inputs. - - Use property names to set their value absolutely:: - - >>> import arrow - >>> arw = arrow.utcnow() - >>> arw - - >>> arw.replace(year=2014, month=6) - - - You can also replace the timezone without conversion, using a - :ref:`timezone expression `:: - - >>> arw.replace(tzinfo=tz.tzlocal()) - - - """ - - absolute_kwargs = {} - - for key, value in kwargs.items(): - - if key in self._ATTRS: - absolute_kwargs[key] = value - elif key in ["week", "quarter"]: - raise ValueError(f"Setting absolute {key} is not supported.") - elif key not in ["tzinfo", "fold"]: - raise ValueError(f"Unknown attribute: {key!r}.") - - current = self._datetime.replace(**absolute_kwargs) - - tzinfo = kwargs.get("tzinfo") - - if tzinfo is not None: - tzinfo = self._get_tzinfo(tzinfo) - current = current.replace(tzinfo=tzinfo) - - fold = kwargs.get("fold") - - if fold is not None: - current = current.replace(fold=fold) - - return self.fromdatetime(current) - - def shift(self, **kwargs: Any) -> "Arrow": - """Returns a new :class:`Arrow ` object with attributes updated - according to inputs. - - Use pluralized property names to relatively shift their current value: - - >>> import arrow - >>> arw = arrow.utcnow() - >>> arw - - >>> arw.shift(years=1, months=-1) - - - Day-of-the-week relative shifting can use either Python's weekday numbers - (Monday = 0, Tuesday = 1 .. Sunday = 6) or using dateutil.relativedelta's - day instances (MO, TU .. SU). When using weekday numbers, the returned - date will always be greater than or equal to the starting date. - - Using the above code (which is a Saturday) and asking it to shift to Saturday: - - >>> arw.shift(weekday=5) - - - While asking for a Monday: - - >>> arw.shift(weekday=0) - - - """ - - relative_kwargs = {} - additional_attrs = ["weeks", "quarters", "weekday"] - - for key, value in kwargs.items(): - - if key in self._ATTRS_PLURAL or key in additional_attrs: - relative_kwargs[key] = value - else: - supported_attr = ", ".join(self._ATTRS_PLURAL + additional_attrs) - raise ValueError( - f"Invalid shift time frame. Please select one of the following: {supported_attr}." - ) - - # core datetime does not support quarters, translate to months. - relative_kwargs.setdefault("months", 0) - relative_kwargs["months"] += ( - relative_kwargs.pop("quarters", 0) * self._MONTHS_PER_QUARTER - ) - - current = self._datetime + relativedelta(**relative_kwargs) - - if not dateutil_tz.datetime_exists(current): - current = dateutil_tz.resolve_imaginary(current) - - return self.fromdatetime(current) - - def to(self, tz: TZ_EXPR) -> "Arrow": - """Returns a new :class:`Arrow ` object, converted - to the target timezone. - - :param tz: A :ref:`timezone expression `. - - Usage:: - - >>> utc = arrow.utcnow() - >>> utc - - - >>> utc.to('US/Pacific') - - - >>> utc.to(tz.tzlocal()) - - - >>> utc.to('-07:00') - - - >>> utc.to('local') - - - >>> utc.to('local').to('utc') - - - """ - - if not isinstance(tz, dt_tzinfo): - tz = parser.TzinfoParser.parse(tz) - - dt = self._datetime.astimezone(tz) - - return self.__class__( - dt.year, - dt.month, - dt.day, - dt.hour, - dt.minute, - dt.second, - dt.microsecond, - dt.tzinfo, - fold=getattr(dt, "fold", 0), - ) - - # string output and formatting - - def format( - self, fmt: str = "YYYY-MM-DD HH:mm:ssZZ", locale: str = DEFAULT_LOCALE - ) -> str: - """Returns a string representation of the :class:`Arrow ` object, - formatted according to the provided format string. - - :param fmt: the format string. - :param locale: the locale to format. - - Usage:: - - >>> arrow.utcnow().format('YYYY-MM-DD HH:mm:ss ZZ') - '2013-05-09 03:56:47 -00:00' - - >>> arrow.utcnow().format('X') - '1368071882' - - >>> arrow.utcnow().format('MMMM DD, YYYY') - 'May 09, 2013' - - >>> arrow.utcnow().format() - '2013-05-09 03:56:47 -00:00' - - """ - - return formatter.DateTimeFormatter(locale).format(self._datetime, fmt) - - def humanize( - self, - other: Union["Arrow", dt_datetime, None] = None, - locale: str = DEFAULT_LOCALE, - only_distance: bool = False, - granularity: Union[_GRANULARITY, List[_GRANULARITY]] = "auto", - ) -> str: - """Returns a localized, humanized representation of a relative difference in time. - - :param other: (optional) an :class:`Arrow ` or ``datetime`` object. - Defaults to now in the current :class:`Arrow ` object's timezone. - :param locale: (optional) a ``str`` specifying a locale. Defaults to 'en-us'. - :param only_distance: (optional) returns only time difference eg: "11 seconds" without "in" or "ago" part. - :param granularity: (optional) defines the precision of the output. Set it to strings 'second', 'minute', - 'hour', 'day', 'week', 'month' or 'year' or a list of any combination of these strings - - Usage:: - - >>> earlier = arrow.utcnow().shift(hours=-2) - >>> earlier.humanize() - '2 hours ago' - - >>> later = earlier.shift(hours=4) - >>> later.humanize(earlier) - 'in 4 hours' - - """ - - locale_name = locale - locale = locales.get_locale(locale) - - if other is None: - utc = dt_datetime.utcnow().replace(tzinfo=dateutil_tz.tzutc()) - dt = utc.astimezone(self._datetime.tzinfo) - - elif isinstance(other, Arrow): - dt = other._datetime - - elif isinstance(other, dt_datetime): - if other.tzinfo is None: - dt = other.replace(tzinfo=self._datetime.tzinfo) - else: - dt = other.astimezone(self._datetime.tzinfo) - - else: - raise TypeError( - f"Invalid 'other' argument of type {type(other).__name__!r}. " - "Argument must be of type None, Arrow, or datetime." - ) - - if isinstance(granularity, list) and len(granularity) == 1: - granularity = granularity[0] - - _delta = int(round((self._datetime - dt).total_seconds())) - sign = -1 if _delta < 0 else 1 - delta_second = diff = abs(_delta) - - try: - if granularity == "auto": - if diff < 10: - return locale.describe("now", only_distance=only_distance) - - if diff < self._SECS_PER_MINUTE: - seconds = sign * delta_second - return locale.describe( - "seconds", seconds, only_distance=only_distance - ) - - elif diff < self._SECS_PER_MINUTE * 2: - return locale.describe("minute", sign, only_distance=only_distance) - elif diff < self._SECS_PER_HOUR: - minutes = sign * max(delta_second // self._SECS_PER_MINUTE, 2) - return locale.describe( - "minutes", minutes, only_distance=only_distance - ) - - elif diff < self._SECS_PER_HOUR * 2: - return locale.describe("hour", sign, only_distance=only_distance) - elif diff < self._SECS_PER_DAY: - hours = sign * max(delta_second // self._SECS_PER_HOUR, 2) - return locale.describe("hours", hours, only_distance=only_distance) - elif diff < self._SECS_PER_DAY * 2: - return locale.describe("day", sign, only_distance=only_distance) - elif diff < self._SECS_PER_WEEK: - days = sign * max(delta_second // self._SECS_PER_DAY, 2) - return locale.describe("days", days, only_distance=only_distance) - - elif diff < self._SECS_PER_WEEK * 2: - return locale.describe("week", sign, only_distance=only_distance) - elif diff < self._SECS_PER_MONTH: - weeks = sign * max(delta_second // self._SECS_PER_WEEK, 2) - return locale.describe("weeks", weeks, only_distance=only_distance) - - elif diff < self._SECS_PER_MONTH * 2: - return locale.describe("month", sign, only_distance=only_distance) - elif diff < self._SECS_PER_YEAR: - # TODO revisit for humanization during leap years - self_months = self._datetime.year * 12 + self._datetime.month - other_months = dt.year * 12 + dt.month - - months = sign * max(abs(other_months - self_months), 2) - - return locale.describe( - "months", months, only_distance=only_distance - ) - - elif diff < self._SECS_PER_YEAR * 2: - return locale.describe("year", sign, only_distance=only_distance) - else: - years = sign * max(delta_second // self._SECS_PER_YEAR, 2) - return locale.describe("years", years, only_distance=only_distance) - - elif isinstance(granularity, str): - granularity = cast(TimeFrameLiteral, granularity) # type: ignore[assignment] - - if granularity == "second": - delta = sign * float(delta_second) - if abs(delta) < 2: - return locale.describe("now", only_distance=only_distance) - elif granularity == "minute": - delta = sign * delta_second / self._SECS_PER_MINUTE - elif granularity == "hour": - delta = sign * delta_second / self._SECS_PER_HOUR - elif granularity == "day": - delta = sign * delta_second / self._SECS_PER_DAY - elif granularity == "week": - delta = sign * delta_second / self._SECS_PER_WEEK - elif granularity == "month": - delta = sign * delta_second / self._SECS_PER_MONTH - elif granularity == "quarter": - delta = sign * delta_second / self._SECS_PER_QUARTER - elif granularity == "year": - delta = sign * delta_second / self._SECS_PER_YEAR - else: - raise ValueError( - "Invalid level of granularity. " - "Please select between 'second', 'minute', 'hour', 'day', 'week', 'month', 'quarter' or 'year'." - ) - - if trunc(abs(delta)) != 1: - granularity += "s" # type: ignore - return locale.describe(granularity, delta, only_distance=only_distance) - - else: - - if not granularity: - raise ValueError( - "Empty granularity list provided. " - "Please select one or more from 'second', 'minute', 'hour', 'day', 'week', 'month', 'quarter', 'year'." - ) - - timeframes: List[Tuple[TimeFrameLiteral, float]] = [] - - def gather_timeframes(_delta: float, _frame: TimeFrameLiteral) -> float: - if _frame in granularity: - value = sign * _delta / self._SECS_MAP[_frame] - _delta %= self._SECS_MAP[_frame] - if trunc(abs(value)) != 1: - timeframes.append( - (cast(TimeFrameLiteral, _frame + "s"), value) - ) - else: - timeframes.append((_frame, value)) - return _delta - - delta = float(delta_second) - frames: Tuple[TimeFrameLiteral, ...] = ( - "year", - "quarter", - "month", - "week", - "day", - "hour", - "minute", - "second", - ) - for frame in frames: - delta = gather_timeframes(delta, frame) - - if len(timeframes) < len(granularity): - raise ValueError( - "Invalid level of granularity. " - "Please select between 'second', 'minute', 'hour', 'day', 'week', 'month', 'quarter' or 'year'." - ) - - return locale.describe_multi(timeframes, only_distance=only_distance) - - except KeyError as e: - raise ValueError( - f"Humanization of the {e} granularity is not currently translated in the {locale_name!r} locale. " - "Please consider making a contribution to this locale." - ) - - def dehumanize(self, input_string: str, locale: str = "en_us") -> "Arrow": - """Returns a new :class:`Arrow ` object, that represents - the time difference relative to the attrbiutes of the - :class:`Arrow ` object. - - :param timestring: a ``str`` representing a humanized relative time. - :param locale: (optional) a ``str`` specifying a locale. Defaults to 'en-us'. - - Usage:: - - >>> arw = arrow.utcnow() - >>> arw - - >>> earlier = arw.dehumanize("2 days ago") - >>> earlier - - - >>> arw = arrow.utcnow() - >>> arw - - >>> later = arw.dehumanize("in a month") - >>> later - - - """ - - # Create a locale object based off given local - locale_obj = locales.get_locale(locale) - - # Check to see if locale is supported - normalized_locale_name = locale.lower().replace("_", "-") - - if normalized_locale_name not in DEHUMANIZE_LOCALES: - raise ValueError( - f"Dehumanize does not currently support the {locale} locale, please consider making a contribution to add support for this locale." - ) - - current_time = self.fromdatetime(self._datetime) - - # Create an object containing the relative time info - time_object_info = dict.fromkeys( - ["seconds", "minutes", "hours", "days", "weeks", "months", "years"], 0 - ) - - # Create an object representing if unit has been seen - unit_visited = dict.fromkeys( - ["now", "seconds", "minutes", "hours", "days", "weeks", "months", "years"], - False, - ) - - # Create a regex pattern object for numbers - num_pattern = re.compile(r"\d+") - - # Search input string for each time unit within locale - for unit, unit_object in locale_obj.timeframes.items(): - - # Need to check the type of unit_object to create the correct dictionary - if isinstance(unit_object, Mapping): - strings_to_search = unit_object - else: - strings_to_search = {unit: str(unit_object)} - - # Search for any matches that exist for that locale's unit. - # Needs to cycle all through strings as some locales have strings that - # could overlap in a regex match, since input validation isn't being performed. - for time_delta, time_string in strings_to_search.items(): - - # Replace {0} with regex \d representing digits - search_string = str(time_string) - search_string = search_string.format(r"\d+") - - # Create search pattern and find within string - pattern = re.compile(rf"(^|\b|\d){search_string}") - match = pattern.search(input_string) - - # If there is no match continue to next iteration - if not match: - continue - - match_string = match.group() - num_match = num_pattern.search(match_string) - - # If no number matches - # Need for absolute value as some locales have signs included in their objects - if not num_match: - change_value = ( - 1 if not time_delta.isnumeric() else abs(int(time_delta)) - ) - else: - change_value = int(num_match.group()) - - # No time to update if now is the unit - if unit == "now": - unit_visited[unit] = True - continue - - # Add change value to the correct unit (incorporates the plurality that exists within timeframe i.e second v.s seconds) - time_unit_to_change = str(unit) - time_unit_to_change += ( - "s" if (str(time_unit_to_change)[-1] != "s") else "" - ) - time_object_info[time_unit_to_change] = change_value - unit_visited[time_unit_to_change] = True - - # Assert error if string does not modify any units - if not any([True for k, v in unit_visited.items() if v]): - raise ValueError( - "Input string not valid. Note: Some locales do not support the week granulairty in Arrow. " - "If you are attempting to use the week granularity on an unsupported locale, this could be the cause of this error." - ) - - # Sign logic - future_string = locale_obj.future - future_string = future_string.format(".*") - future_pattern = re.compile(rf"^{future_string}$") - future_pattern_match = future_pattern.findall(input_string) - - past_string = locale_obj.past - past_string = past_string.format(".*") - past_pattern = re.compile(rf"^{past_string}$") - past_pattern_match = past_pattern.findall(input_string) - - # If a string contains the now unit, there will be no relative units, hence the need to check if the now unit - # was visited before raising a ValueError - if past_pattern_match: - sign_val = -1 - elif future_pattern_match: - sign_val = 1 - elif unit_visited["now"]: - sign_val = 0 - else: - raise ValueError( - "Invalid input String. String does not contain any relative time information. " - "String should either represent a time in the future or a time in the past. " - "Ex: 'in 5 seconds' or '5 seconds ago'." - ) - - time_changes = {k: sign_val * v for k, v in time_object_info.items()} - - return current_time.shift(**time_changes) - - # query functions - - def is_between( - self, - start: "Arrow", - end: "Arrow", - bounds: _BOUNDS = "()", - ) -> bool: - """Returns a boolean denoting whether the :class:`Arrow ` object is between - the start and end limits. - - :param start: an :class:`Arrow ` object. - :param end: an :class:`Arrow ` object. - :param bounds: (optional) a ``str`` of either '()', '(]', '[)', or '[]' that specifies - whether to include or exclude the start and end values in the range. '(' excludes - the start, '[' includes the start, ')' excludes the end, and ']' includes the end. - If the bounds are not specified, the default bound '()' is used. - - Usage:: - - >>> start = arrow.get(datetime(2013, 5, 5, 12, 30, 10)) - >>> end = arrow.get(datetime(2013, 5, 5, 12, 30, 36)) - >>> arrow.get(datetime(2013, 5, 5, 12, 30, 27)).is_between(start, end) - True - - >>> start = arrow.get(datetime(2013, 5, 5)) - >>> end = arrow.get(datetime(2013, 5, 8)) - >>> arrow.get(datetime(2013, 5, 8)).is_between(start, end, '[]') - True - - >>> start = arrow.get(datetime(2013, 5, 5)) - >>> end = arrow.get(datetime(2013, 5, 8)) - >>> arrow.get(datetime(2013, 5, 8)).is_between(start, end, '[)') - False - - """ - - util.validate_bounds(bounds) - - if not isinstance(start, Arrow): - raise TypeError( - f"Cannot parse start date argument type of {type(start)!r}." - ) - - if not isinstance(end, Arrow): - raise TypeError(f"Cannot parse end date argument type of {type(start)!r}.") - - include_start = bounds[0] == "[" - include_end = bounds[1] == "]" - - target_ts = self.float_timestamp - start_ts = start.float_timestamp - end_ts = end.float_timestamp - - return ( - (start_ts <= target_ts <= end_ts) - and (include_start or start_ts < target_ts) - and (include_end or target_ts < end_ts) - ) - - # datetime methods - - def date(self) -> date: - """Returns a ``date`` object with the same year, month and day. - - Usage:: - - >>> arrow.utcnow().date() - datetime.date(2019, 1, 23) - - """ - - return self._datetime.date() - - def time(self) -> dt_time: - """Returns a ``time`` object with the same hour, minute, second, microsecond. - - Usage:: - - >>> arrow.utcnow().time() - datetime.time(12, 15, 34, 68352) - - """ - - return self._datetime.time() - - def timetz(self) -> dt_time: - """Returns a ``time`` object with the same hour, minute, second, microsecond and - tzinfo. - - Usage:: - - >>> arrow.utcnow().timetz() - datetime.time(12, 5, 18, 298893, tzinfo=tzutc()) - - """ - - return self._datetime.timetz() - - def astimezone(self, tz: Optional[dt_tzinfo]) -> dt_datetime: - """Returns a ``datetime`` object, converted to the specified timezone. - - :param tz: a ``tzinfo`` object. - - Usage:: - - >>> pacific=arrow.now('US/Pacific') - >>> nyc=arrow.now('America/New_York').tzinfo - >>> pacific.astimezone(nyc) - datetime.datetime(2019, 1, 20, 10, 24, 22, 328172, tzinfo=tzfile('/usr/share/zoneinfo/America/New_York')) - - """ - - return self._datetime.astimezone(tz) - - def utcoffset(self) -> Optional[timedelta]: - """Returns a ``timedelta`` object representing the whole number of minutes difference from - UTC time. - - Usage:: - - >>> arrow.now('US/Pacific').utcoffset() - datetime.timedelta(-1, 57600) - - """ - - return self._datetime.utcoffset() - - def dst(self) -> Optional[timedelta]: - """Returns the daylight savings time adjustment. - - Usage:: - - >>> arrow.utcnow().dst() - datetime.timedelta(0) - - """ - - return self._datetime.dst() - - def timetuple(self) -> struct_time: - """Returns a ``time.struct_time``, in the current timezone. - - Usage:: - - >>> arrow.utcnow().timetuple() - time.struct_time(tm_year=2019, tm_mon=1, tm_mday=20, tm_hour=15, tm_min=17, tm_sec=8, tm_wday=6, tm_yday=20, tm_isdst=0) - - """ - - return self._datetime.timetuple() - - def utctimetuple(self) -> struct_time: - """Returns a ``time.struct_time``, in UTC time. - - Usage:: - - >>> arrow.utcnow().utctimetuple() - time.struct_time(tm_year=2019, tm_mon=1, tm_mday=19, tm_hour=21, tm_min=41, tm_sec=7, tm_wday=5, tm_yday=19, tm_isdst=0) - - """ - - return self._datetime.utctimetuple() - - def toordinal(self) -> int: - """Returns the proleptic Gregorian ordinal of the date. - - Usage:: - - >>> arrow.utcnow().toordinal() - 737078 - - """ - - return self._datetime.toordinal() - - def weekday(self) -> int: - """Returns the day of the week as an integer (0-6). - - Usage:: - - >>> arrow.utcnow().weekday() - 5 - - """ - - return self._datetime.weekday() - - def isoweekday(self) -> int: - """Returns the ISO day of the week as an integer (1-7). - - Usage:: - - >>> arrow.utcnow().isoweekday() - 6 - - """ - - return self._datetime.isoweekday() - - def isocalendar(self) -> Tuple[int, int, int]: - """Returns a 3-tuple, (ISO year, ISO week number, ISO weekday). - - Usage:: - - >>> arrow.utcnow().isocalendar() - (2019, 3, 6) - - """ - - return self._datetime.isocalendar() - - def isoformat(self, sep: str = "T", timespec: str = "auto") -> str: - """Returns an ISO 8601 formatted representation of the date and time. - - Usage:: - - >>> arrow.utcnow().isoformat() - '2019-01-19T18:30:52.442118+00:00' - - """ - - return self._datetime.isoformat(sep, timespec) - - def ctime(self) -> str: - """Returns a ctime formatted representation of the date and time. - - Usage:: - - >>> arrow.utcnow().ctime() - 'Sat Jan 19 18:26:50 2019' - - """ - - return self._datetime.ctime() - - def strftime(self, format: str) -> str: - """Formats in the style of ``datetime.strftime``. - - :param format: the format string. - - Usage:: - - >>> arrow.utcnow().strftime('%d-%m-%Y %H:%M:%S') - '23-01-2019 12:28:17' - - """ - - return self._datetime.strftime(format) - - def for_json(self) -> str: - """Serializes for the ``for_json`` protocol of simplejson. - - Usage:: - - >>> arrow.utcnow().for_json() - '2019-01-19T18:25:36.760079+00:00' - - """ - - return self.isoformat() - - # math - - def __add__(self, other: Any) -> "Arrow": - - if isinstance(other, (timedelta, relativedelta)): - return self.fromdatetime(self._datetime + other, self._datetime.tzinfo) - - return NotImplemented - - def __radd__(self, other: Union[timedelta, relativedelta]) -> "Arrow": - return self.__add__(other) - - @overload - def __sub__(self, other: Union[timedelta, relativedelta]) -> "Arrow": - pass # pragma: no cover - - @overload - def __sub__(self, other: Union[dt_datetime, "Arrow"]) -> timedelta: - pass # pragma: no cover - - def __sub__(self, other: Any) -> Union[timedelta, "Arrow"]: - - if isinstance(other, (timedelta, relativedelta)): - return self.fromdatetime(self._datetime - other, self._datetime.tzinfo) - - elif isinstance(other, dt_datetime): - return self._datetime - other - - elif isinstance(other, Arrow): - return self._datetime - other._datetime - - return NotImplemented - - def __rsub__(self, other: Any) -> timedelta: - - if isinstance(other, dt_datetime): - return other - self._datetime - - return NotImplemented - - # comparisons - - def __eq__(self, other: Any) -> bool: - - if not isinstance(other, (Arrow, dt_datetime)): - return False - - return self._datetime == self._get_datetime(other) - - def __ne__(self, other: Any) -> bool: - - if not isinstance(other, (Arrow, dt_datetime)): - return True - - return not self.__eq__(other) - - def __gt__(self, other: Any) -> bool: - - if not isinstance(other, (Arrow, dt_datetime)): - return NotImplemented - - return self._datetime > self._get_datetime(other) - - def __ge__(self, other: Any) -> bool: - - if not isinstance(other, (Arrow, dt_datetime)): - return NotImplemented - - return self._datetime >= self._get_datetime(other) - - def __lt__(self, other: Any) -> bool: - - if not isinstance(other, (Arrow, dt_datetime)): - return NotImplemented - - return self._datetime < self._get_datetime(other) - - def __le__(self, other: Any) -> bool: - - if not isinstance(other, (Arrow, dt_datetime)): - return NotImplemented - - return self._datetime <= self._get_datetime(other) - - # internal methods - @staticmethod - def _get_tzinfo(tz_expr: Optional[TZ_EXPR]) -> dt_tzinfo: - """Get normalized tzinfo object from various inputs.""" - if tz_expr is None: - return dateutil_tz.tzutc() - if isinstance(tz_expr, dt_tzinfo): - return tz_expr - else: - try: - return parser.TzinfoParser.parse(tz_expr) - except parser.ParserError: - raise ValueError(f"{tz_expr!r} not recognized as a timezone.") - - @classmethod - def _get_datetime( - cls, expr: Union["Arrow", dt_datetime, int, float, str] - ) -> dt_datetime: - """Get datetime object from a specified expression.""" - if isinstance(expr, Arrow): - return expr.datetime - elif isinstance(expr, dt_datetime): - return expr - elif util.is_timestamp(expr): - timestamp = float(expr) - return cls.utcfromtimestamp(timestamp).datetime - else: - raise ValueError(f"{expr!r} not recognized as a datetime or timestamp.") - - @classmethod - def _get_frames(cls, name: _T_FRAMES) -> Tuple[str, str, int]: - """Finds relevant timeframe and steps for use in range and span methods. - - Returns a 3 element tuple in the form (frame, plural frame, step), for example ("day", "days", 1) - - """ - if name in cls._ATTRS: - return name, f"{name}s", 1 - elif name[-1] == "s" and name[:-1] in cls._ATTRS: - return name[:-1], name, 1 - elif name in ["week", "weeks"]: - return "week", "weeks", 1 - elif name in ["quarter", "quarters"]: - return "quarter", "months", 3 - else: - supported = ", ".join( - [ - "year(s)", - "month(s)", - "day(s)", - "hour(s)", - "minute(s)", - "second(s)", - "microsecond(s)", - "week(s)", - "quarter(s)", - ] - ) - raise ValueError( - f"Range or span over frame {name} not supported. Supported frames: {supported}." - ) - - @classmethod - def _get_iteration_params(cls, end: Any, limit: Optional[int]) -> Tuple[Any, int]: - """Sets default end and limit values for range method.""" - if end is None: - - if limit is None: - raise ValueError("One of 'end' or 'limit' is required.") - - return cls.max, limit - - else: - if limit is None: - return end, sys.maxsize - return end, limit - - @staticmethod - def _is_last_day_of_month(date: "Arrow") -> bool: - """Returns a boolean indicating whether the datetime is the last day of the month.""" - return date.day == calendar.monthrange(date.year, date.month)[1] - - -Arrow.min = Arrow.fromdatetime(dt_datetime.min) -Arrow.max = Arrow.fromdatetime(dt_datetime.max) diff --git a/.venv/Lib/site-packages/arrow/constants.py b/.venv/Lib/site-packages/arrow/constants.py deleted file mode 100644 index 53d163b..0000000 --- a/.venv/Lib/site-packages/arrow/constants.py +++ /dev/null @@ -1,177 +0,0 @@ -"""Constants used internally in arrow.""" - -import sys -from datetime import datetime - -if sys.version_info < (3, 8): # pragma: no cover - from typing_extensions import Final -else: - from typing import Final # pragma: no cover - -# datetime.max.timestamp() errors on Windows, so we must hardcode -# the highest possible datetime value that can output a timestamp. -# tl;dr platform-independent max timestamps are hard to form -# See: https://stackoverflow.com/q/46133223 -try: - # Get max timestamp. Works on POSIX-based systems like Linux and macOS, - # but will trigger an OverflowError, ValueError, or OSError on Windows - _MAX_TIMESTAMP = datetime.max.timestamp() -except (OverflowError, ValueError, OSError): # pragma: no cover - # Fallback for Windows and 32-bit systems if initial max timestamp call fails - # Must get max value of ctime on Windows based on architecture (x32 vs x64) - # https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/ctime-ctime32-ctime64-wctime-wctime32-wctime64 - # Note: this may occur on both 32-bit Linux systems (issue #930) along with Windows systems - is_64bits = sys.maxsize > 2**32 - _MAX_TIMESTAMP = ( - datetime(3000, 1, 1, 23, 59, 59, 999999).timestamp() - if is_64bits - else datetime(2038, 1, 1, 23, 59, 59, 999999).timestamp() - ) - -MAX_TIMESTAMP: Final[float] = _MAX_TIMESTAMP -MAX_TIMESTAMP_MS: Final[float] = MAX_TIMESTAMP * 1000 -MAX_TIMESTAMP_US: Final[float] = MAX_TIMESTAMP * 1_000_000 - -MAX_ORDINAL: Final[int] = datetime.max.toordinal() -MIN_ORDINAL: Final[int] = 1 - -DEFAULT_LOCALE: Final[str] = "en-us" - -# Supported dehumanize locales -DEHUMANIZE_LOCALES = { - "en", - "en-us", - "en-gb", - "en-au", - "en-be", - "en-jp", - "en-za", - "en-ca", - "en-ph", - "fr", - "fr-fr", - "fr-ca", - "it", - "it-it", - "es", - "es-es", - "el", - "el-gr", - "ja", - "ja-jp", - "se", - "se-fi", - "se-no", - "se-se", - "sv", - "sv-se", - "fi", - "fi-fi", - "zh", - "zh-cn", - "zh-tw", - "zh-hk", - "nl", - "nl-nl", - "be", - "be-by", - "pl", - "pl-pl", - "ru", - "ru-ru", - "af", - "bg", - "bg-bg", - "ua", - "uk", - "uk-ua", - "mk", - "mk-mk", - "de", - "de-de", - "de-ch", - "de-at", - "nb", - "nb-no", - "nn", - "nn-no", - "pt", - "pt-pt", - "pt-br", - "tl", - "tl-ph", - "vi", - "vi-vn", - "tr", - "tr-tr", - "az", - "az-az", - "da", - "da-dk", - "ml", - "hi", - "cs", - "cs-cz", - "sk", - "sk-sk", - "fa", - "fa-ir", - "mr", - "ca", - "ca-es", - "ca-ad", - "ca-fr", - "ca-it", - "eo", - "eo-xx", - "bn", - "bn-bd", - "bn-in", - "rm", - "rm-ch", - "ro", - "ro-ro", - "sl", - "sl-si", - "id", - "id-id", - "ne", - "ne-np", - "ee", - "et", - "sw", - "sw-ke", - "sw-tz", - "la", - "la-va", - "lt", - "lt-lt", - "ms", - "ms-my", - "ms-bn", - "or", - "or-in", - "lb", - "lb-lu", - "zu", - "zu-za", - "sq", - "sq-al", - "ta", - "ta-in", - "ta-lk", - "ur", - "ur-pk", - "ka", - "ka-ge", - "kk", - "kk-kz", - # "lo", - # "lo-la", - "am", - "am-et", - "hy-am", - "hy", - "uz", - "uz-uz", -} diff --git a/.venv/Lib/site-packages/arrow/factory.py b/.venv/Lib/site-packages/arrow/factory.py deleted file mode 100644 index aad4af8..0000000 --- a/.venv/Lib/site-packages/arrow/factory.py +++ /dev/null @@ -1,348 +0,0 @@ -""" -Implements the :class:`ArrowFactory ` class, -providing factory methods for common :class:`Arrow ` -construction scenarios. - -""" - - -import calendar -from datetime import date, datetime -from datetime import tzinfo as dt_tzinfo -from decimal import Decimal -from time import struct_time -from typing import Any, List, Optional, Tuple, Type, Union, overload - -from dateutil import tz as dateutil_tz - -from arrow import parser -from arrow.arrow import TZ_EXPR, Arrow -from arrow.constants import DEFAULT_LOCALE -from arrow.util import is_timestamp, iso_to_gregorian - - -class ArrowFactory: - """A factory for generating :class:`Arrow ` objects. - - :param type: (optional) the :class:`Arrow `-based class to construct from. - Defaults to :class:`Arrow `. - - """ - - type: Type[Arrow] - - def __init__(self, type: Type[Arrow] = Arrow) -> None: - self.type = type - - @overload - def get( - self, - *, - locale: str = DEFAULT_LOCALE, - tzinfo: Optional[TZ_EXPR] = None, - normalize_whitespace: bool = False, - ) -> Arrow: - ... # pragma: no cover - - @overload - def get( - self, - __obj: Union[ - Arrow, - datetime, - date, - struct_time, - dt_tzinfo, - int, - float, - str, - Tuple[int, int, int], - ], - *, - locale: str = DEFAULT_LOCALE, - tzinfo: Optional[TZ_EXPR] = None, - normalize_whitespace: bool = False, - ) -> Arrow: - ... # pragma: no cover - - @overload - def get( - self, - __arg1: Union[datetime, date], - __arg2: TZ_EXPR, - *, - locale: str = DEFAULT_LOCALE, - tzinfo: Optional[TZ_EXPR] = None, - normalize_whitespace: bool = False, - ) -> Arrow: - ... # pragma: no cover - - @overload - def get( - self, - __arg1: str, - __arg2: Union[str, List[str]], - *, - locale: str = DEFAULT_LOCALE, - tzinfo: Optional[TZ_EXPR] = None, - normalize_whitespace: bool = False, - ) -> Arrow: - ... # pragma: no cover - - def get(self, *args: Any, **kwargs: Any) -> Arrow: - """Returns an :class:`Arrow ` object based on flexible inputs. - - :param locale: (optional) a ``str`` specifying a locale for the parser. Defaults to 'en-us'. - :param tzinfo: (optional) a :ref:`timezone expression ` or tzinfo object. - Replaces the timezone unless using an input form that is explicitly UTC or specifies - the timezone in a positional argument. Defaults to UTC. - :param normalize_whitespace: (optional) a ``bool`` specifying whether or not to normalize - redundant whitespace (spaces, tabs, and newlines) in a datetime string before parsing. - Defaults to false. - - Usage:: - - >>> import arrow - - **No inputs** to get current UTC time:: - - >>> arrow.get() - - - **One** :class:`Arrow ` object, to get a copy. - - >>> arw = arrow.utcnow() - >>> arrow.get(arw) - - - **One** ``float`` or ``int``, convertible to a floating-point timestamp, to get - that timestamp in UTC:: - - >>> arrow.get(1367992474.293378) - - - >>> arrow.get(1367992474) - - - **One** ISO 8601-formatted ``str``, to parse it:: - - >>> arrow.get('2013-09-29T01:26:43.830580') - - - **One** ISO 8601-formatted ``str``, in basic format, to parse it:: - - >>> arrow.get('20160413T133656.456289') - - - **One** ``tzinfo``, to get the current time **converted** to that timezone:: - - >>> arrow.get(tz.tzlocal()) - - - **One** naive ``datetime``, to get that datetime in UTC:: - - >>> arrow.get(datetime(2013, 5, 5)) - - - **One** aware ``datetime``, to get that datetime:: - - >>> arrow.get(datetime(2013, 5, 5, tzinfo=tz.tzlocal())) - - - **One** naive ``date``, to get that date in UTC:: - - >>> arrow.get(date(2013, 5, 5)) - - - **One** time.struct time:: - - >>> arrow.get(gmtime(0)) - - - **One** iso calendar ``tuple``, to get that week date in UTC:: - - >>> arrow.get((2013, 18, 7)) - - - **Two** arguments, a naive or aware ``datetime``, and a replacement - :ref:`timezone expression `:: - - >>> arrow.get(datetime(2013, 5, 5), 'US/Pacific') - - - **Two** arguments, a naive ``date``, and a replacement - :ref:`timezone expression `:: - - >>> arrow.get(date(2013, 5, 5), 'US/Pacific') - - - **Two** arguments, both ``str``, to parse the first according to the format of the second:: - - >>> arrow.get('2013-05-05 12:30:45 America/Chicago', 'YYYY-MM-DD HH:mm:ss ZZZ') - - - **Two** arguments, first a ``str`` to parse and second a ``list`` of formats to try:: - - >>> arrow.get('2013-05-05 12:30:45', ['MM/DD/YYYY', 'YYYY-MM-DD HH:mm:ss']) - - - **Three or more** arguments, as for the direct constructor of an ``Arrow`` object:: - - >>> arrow.get(2013, 5, 5, 12, 30, 45) - - - """ - - arg_count = len(args) - locale = kwargs.pop("locale", DEFAULT_LOCALE) - tz = kwargs.get("tzinfo", None) - normalize_whitespace = kwargs.pop("normalize_whitespace", False) - - # if kwargs given, send to constructor unless only tzinfo provided - if len(kwargs) > 1: - arg_count = 3 - - # tzinfo kwarg is not provided - if len(kwargs) == 1 and tz is None: - arg_count = 3 - - # () -> now, @ tzinfo or utc - if arg_count == 0: - if isinstance(tz, str): - tz = parser.TzinfoParser.parse(tz) - return self.type.now(tzinfo=tz) - - if isinstance(tz, dt_tzinfo): - return self.type.now(tzinfo=tz) - - return self.type.utcnow() - - if arg_count == 1: - arg = args[0] - if isinstance(arg, Decimal): - arg = float(arg) - - # (None) -> raises an exception - if arg is None: - raise TypeError("Cannot parse argument of type None.") - - # try (int, float) -> from timestamp @ tzinfo - elif not isinstance(arg, str) and is_timestamp(arg): - if tz is None: - # set to UTC by default - tz = dateutil_tz.tzutc() - return self.type.fromtimestamp(arg, tzinfo=tz) - - # (Arrow) -> from the object's datetime @ tzinfo - elif isinstance(arg, Arrow): - return self.type.fromdatetime(arg.datetime, tzinfo=tz) - - # (datetime) -> from datetime @ tzinfo - elif isinstance(arg, datetime): - return self.type.fromdatetime(arg, tzinfo=tz) - - # (date) -> from date @ tzinfo - elif isinstance(arg, date): - return self.type.fromdate(arg, tzinfo=tz) - - # (tzinfo) -> now @ tzinfo - elif isinstance(arg, dt_tzinfo): - return self.type.now(tzinfo=arg) - - # (str) -> parse @ tzinfo - elif isinstance(arg, str): - dt = parser.DateTimeParser(locale).parse_iso(arg, normalize_whitespace) - return self.type.fromdatetime(dt, tzinfo=tz) - - # (struct_time) -> from struct_time - elif isinstance(arg, struct_time): - return self.type.utcfromtimestamp(calendar.timegm(arg)) - - # (iso calendar) -> convert then from date @ tzinfo - elif isinstance(arg, tuple) and len(arg) == 3: - d = iso_to_gregorian(*arg) - return self.type.fromdate(d, tzinfo=tz) - - else: - raise TypeError(f"Cannot parse single argument of type {type(arg)!r}.") - - elif arg_count == 2: - - arg_1, arg_2 = args[0], args[1] - - if isinstance(arg_1, datetime): - - # (datetime, tzinfo/str) -> fromdatetime @ tzinfo - if isinstance(arg_2, (dt_tzinfo, str)): - return self.type.fromdatetime(arg_1, tzinfo=arg_2) - else: - raise TypeError( - f"Cannot parse two arguments of types 'datetime', {type(arg_2)!r}." - ) - - elif isinstance(arg_1, date): - - # (date, tzinfo/str) -> fromdate @ tzinfo - if isinstance(arg_2, (dt_tzinfo, str)): - return self.type.fromdate(arg_1, tzinfo=arg_2) - else: - raise TypeError( - f"Cannot parse two arguments of types 'date', {type(arg_2)!r}." - ) - - # (str, format) -> parse @ tzinfo - elif isinstance(arg_1, str) and isinstance(arg_2, (str, list)): - dt = parser.DateTimeParser(locale).parse( - args[0], args[1], normalize_whitespace - ) - return self.type.fromdatetime(dt, tzinfo=tz) - - else: - raise TypeError( - f"Cannot parse two arguments of types {type(arg_1)!r} and {type(arg_2)!r}." - ) - - # 3+ args -> datetime-like via constructor - else: - return self.type(*args, **kwargs) - - def utcnow(self) -> Arrow: - """Returns an :class:`Arrow ` object, representing "now" in UTC time. - - Usage:: - - >>> import arrow - >>> arrow.utcnow() - - """ - - return self.type.utcnow() - - def now(self, tz: Optional[TZ_EXPR] = None) -> Arrow: - """Returns an :class:`Arrow ` object, representing "now" in the given - timezone. - - :param tz: (optional) A :ref:`timezone expression `. Defaults to local time. - - Usage:: - - >>> import arrow - >>> arrow.now() - - - >>> arrow.now('US/Pacific') - - - >>> arrow.now('+02:00') - - - >>> arrow.now('local') - - """ - - if tz is None: - tz = dateutil_tz.tzlocal() - elif not isinstance(tz, dt_tzinfo): - tz = parser.TzinfoParser.parse(tz) - - return self.type.now(tz) diff --git a/.venv/Lib/site-packages/arrow/formatter.py b/.venv/Lib/site-packages/arrow/formatter.py deleted file mode 100644 index 728bea1..0000000 --- a/.venv/Lib/site-packages/arrow/formatter.py +++ /dev/null @@ -1,152 +0,0 @@ -"""Provides the :class:`Arrow ` class, an improved formatter for datetimes.""" - -import re -import sys -from datetime import datetime, timedelta -from typing import Optional, Pattern, cast - -from dateutil import tz as dateutil_tz - -from arrow import locales -from arrow.constants import DEFAULT_LOCALE - -if sys.version_info < (3, 8): # pragma: no cover - from typing_extensions import Final -else: - from typing import Final # pragma: no cover - - -FORMAT_ATOM: Final[str] = "YYYY-MM-DD HH:mm:ssZZ" -FORMAT_COOKIE: Final[str] = "dddd, DD-MMM-YYYY HH:mm:ss ZZZ" -FORMAT_RFC822: Final[str] = "ddd, DD MMM YY HH:mm:ss Z" -FORMAT_RFC850: Final[str] = "dddd, DD-MMM-YY HH:mm:ss ZZZ" -FORMAT_RFC1036: Final[str] = "ddd, DD MMM YY HH:mm:ss Z" -FORMAT_RFC1123: Final[str] = "ddd, DD MMM YYYY HH:mm:ss Z" -FORMAT_RFC2822: Final[str] = "ddd, DD MMM YYYY HH:mm:ss Z" -FORMAT_RFC3339: Final[str] = "YYYY-MM-DD HH:mm:ssZZ" -FORMAT_RSS: Final[str] = "ddd, DD MMM YYYY HH:mm:ss Z" -FORMAT_W3C: Final[str] = "YYYY-MM-DD HH:mm:ssZZ" - - -class DateTimeFormatter: - - # This pattern matches characters enclosed in square brackets are matched as - # an atomic group. For more info on atomic groups and how to they are - # emulated in Python's re library, see https://stackoverflow.com/a/13577411/2701578 - - _FORMAT_RE: Final[Pattern[str]] = re.compile( - r"(\[(?:(?=(?P[^]]))(?P=literal))*\]|YYY?Y?|MM?M?M?|Do|DD?D?D?|d?dd?d?|HH?|hh?|mm?|ss?|SS?S?S?S?S?|ZZ?Z?|a|A|X|x|W)" - ) - - locale: locales.Locale - - def __init__(self, locale: str = DEFAULT_LOCALE) -> None: - - self.locale = locales.get_locale(locale) - - def format(cls, dt: datetime, fmt: str) -> str: - - # FIXME: _format_token() is nullable - return cls._FORMAT_RE.sub( - lambda m: cast(str, cls._format_token(dt, m.group(0))), fmt - ) - - def _format_token(self, dt: datetime, token: Optional[str]) -> Optional[str]: - - if token and token.startswith("[") and token.endswith("]"): - return token[1:-1] - - if token == "YYYY": - return self.locale.year_full(dt.year) - if token == "YY": - return self.locale.year_abbreviation(dt.year) - - if token == "MMMM": - return self.locale.month_name(dt.month) - if token == "MMM": - return self.locale.month_abbreviation(dt.month) - if token == "MM": - return f"{dt.month:02d}" - if token == "M": - return f"{dt.month}" - - if token == "DDDD": - return f"{dt.timetuple().tm_yday:03d}" - if token == "DDD": - return f"{dt.timetuple().tm_yday}" - if token == "DD": - return f"{dt.day:02d}" - if token == "D": - return f"{dt.day}" - - if token == "Do": - return self.locale.ordinal_number(dt.day) - - if token == "dddd": - return self.locale.day_name(dt.isoweekday()) - if token == "ddd": - return self.locale.day_abbreviation(dt.isoweekday()) - if token == "d": - return f"{dt.isoweekday()}" - - if token == "HH": - return f"{dt.hour:02d}" - if token == "H": - return f"{dt.hour}" - if token == "hh": - return f"{dt.hour if 0 < dt.hour < 13 else abs(dt.hour - 12):02d}" - if token == "h": - return f"{dt.hour if 0 < dt.hour < 13 else abs(dt.hour - 12)}" - - if token == "mm": - return f"{dt.minute:02d}" - if token == "m": - return f"{dt.minute}" - - if token == "ss": - return f"{dt.second:02d}" - if token == "s": - return f"{dt.second}" - - if token == "SSSSSS": - return f"{dt.microsecond:06d}" - if token == "SSSSS": - return f"{dt.microsecond // 10:05d}" - if token == "SSSS": - return f"{dt.microsecond // 100:04d}" - if token == "SSS": - return f"{dt.microsecond // 1000:03d}" - if token == "SS": - return f"{dt.microsecond // 10000:02d}" - if token == "S": - return f"{dt.microsecond // 100000}" - - if token == "X": - return f"{dt.timestamp()}" - - if token == "x": - return f"{dt.timestamp() * 1_000_000:.0f}" - - if token == "ZZZ": - return dt.tzname() - - if token in ["ZZ", "Z"]: - separator = ":" if token == "ZZ" else "" - tz = dateutil_tz.tzutc() if dt.tzinfo is None else dt.tzinfo - # `dt` must be aware object. Otherwise, this line will raise AttributeError - # https://github.com/arrow-py/arrow/pull/883#discussion_r529866834 - # datetime awareness: https://docs.python.org/3/library/datetime.html#aware-and-naive-objects - total_minutes = int(cast(timedelta, tz.utcoffset(dt)).total_seconds() / 60) - - sign = "+" if total_minutes >= 0 else "-" - total_minutes = abs(total_minutes) - hour, minute = divmod(total_minutes, 60) - - return f"{sign}{hour:02d}{separator}{minute:02d}" - - if token in ("a", "A"): - return self.locale.meridian(dt.hour, token) - - if token == "W": - year, week, day = dt.isocalendar() - return f"{year}-W{week:02d}-{day}" diff --git a/.venv/Lib/site-packages/arrow/locales.py b/.venv/Lib/site-packages/arrow/locales.py deleted file mode 100644 index 3627497..0000000 --- a/.venv/Lib/site-packages/arrow/locales.py +++ /dev/null @@ -1,6475 +0,0 @@ -"""Provides internationalization for arrow in over 60 languages and dialects.""" - -import sys -from math import trunc -from typing import ( - Any, - ClassVar, - Dict, - List, - Mapping, - Optional, - Sequence, - Tuple, - Type, - Union, - cast, -) - -if sys.version_info < (3, 8): # pragma: no cover - from typing_extensions import Literal -else: - from typing import Literal # pragma: no cover - -TimeFrameLiteral = Literal[ - "now", - "second", - "seconds", - "minute", - "minutes", - "hour", - "hours", - "day", - "days", - "week", - "weeks", - "month", - "months", - "quarter", - "quarters", - "year", - "years", -] - -_TimeFrameElements = Union[ - str, Sequence[str], Mapping[str, str], Mapping[str, Sequence[str]] -] - -_locale_map: Dict[str, Type["Locale"]] = {} - - -def get_locale(name: str) -> "Locale": - """Returns an appropriate :class:`Locale ` - corresponding to an input locale name. - - :param name: the name of the locale. - - """ - - normalized_locale_name = name.lower().replace("_", "-") - locale_cls = _locale_map.get(normalized_locale_name) - - if locale_cls is None: - raise ValueError(f"Unsupported locale {normalized_locale_name!r}.") - - return locale_cls() - - -def get_locale_by_class_name(name: str) -> "Locale": - """Returns an appropriate :class:`Locale ` - corresponding to an locale class name. - - :param name: the name of the locale class. - - """ - locale_cls: Optional[Type[Locale]] = globals().get(name) - - if locale_cls is None: - raise ValueError(f"Unsupported locale {name!r}.") - - return locale_cls() - - -class Locale: - """Represents locale-specific data and functionality.""" - - names: ClassVar[List[str]] = [] - - timeframes: ClassVar[Mapping[TimeFrameLiteral, _TimeFrameElements]] = { - "now": "", - "second": "", - "seconds": "", - "minute": "", - "minutes": "", - "hour": "", - "hours": "", - "day": "", - "days": "", - "week": "", - "weeks": "", - "month": "", - "months": "", - "quarter": "", - "quarters": "", - "year": "", - "years": "", - } - - meridians: ClassVar[Dict[str, str]] = {"am": "", "pm": "", "AM": "", "PM": ""} - - past: ClassVar[str] - future: ClassVar[str] - and_word: ClassVar[Optional[str]] = None - - month_names: ClassVar[List[str]] = [] - month_abbreviations: ClassVar[List[str]] = [] - - day_names: ClassVar[List[str]] = [] - day_abbreviations: ClassVar[List[str]] = [] - - ordinal_day_re: ClassVar[str] = r"(\d+)" - - _month_name_to_ordinal: Optional[Dict[str, int]] - - def __init_subclass__(cls, **kwargs: Any) -> None: - for locale_name in cls.names: - if locale_name in _locale_map: - raise LookupError(f"Duplicated locale name: {locale_name}") - - _locale_map[locale_name.lower().replace("_", "-")] = cls - - def __init__(self) -> None: - - self._month_name_to_ordinal = None - - def describe( - self, - timeframe: TimeFrameLiteral, - delta: Union[float, int] = 0, - only_distance: bool = False, - ) -> str: - """Describes a delta within a timeframe in plain language. - - :param timeframe: a string representing a timeframe. - :param delta: a quantity representing a delta in a timeframe. - :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords - """ - - humanized = self._format_timeframe(timeframe, trunc(delta)) - if not only_distance: - humanized = self._format_relative(humanized, timeframe, delta) - - return humanized - - def describe_multi( - self, - timeframes: Sequence[Tuple[TimeFrameLiteral, Union[int, float]]], - only_distance: bool = False, - ) -> str: - """Describes a delta within multiple timeframes in plain language. - - :param timeframes: a list of string, quantity pairs each representing a timeframe and delta. - :param only_distance: return only distance eg: "2 hours and 11 seconds" without "in" or "ago" keywords - """ - - parts = [ - self._format_timeframe(timeframe, trunc(delta)) - for timeframe, delta in timeframes - ] - if self.and_word: - parts.insert(-1, self.and_word) - humanized = " ".join(parts) - - if not only_distance: - # Needed to determine the correct relative string to use - timeframe_value = 0 - - for _unit_name, unit_value in timeframes: - if trunc(unit_value) != 0: - timeframe_value = trunc(unit_value) - break - - # Note it doesn't matter the timeframe unit we use on the call, only the value - humanized = self._format_relative(humanized, "seconds", timeframe_value) - - return humanized - - def day_name(self, day: int) -> str: - """Returns the day name for a specified day of the week. - - :param day: the ``int`` day of the week (1-7). - - """ - - return self.day_names[day] - - def day_abbreviation(self, day: int) -> str: - """Returns the day abbreviation for a specified day of the week. - - :param day: the ``int`` day of the week (1-7). - - """ - - return self.day_abbreviations[day] - - def month_name(self, month: int) -> str: - """Returns the month name for a specified month of the year. - - :param month: the ``int`` month of the year (1-12). - - """ - - return self.month_names[month] - - def month_abbreviation(self, month: int) -> str: - """Returns the month abbreviation for a specified month of the year. - - :param month: the ``int`` month of the year (1-12). - - """ - - return self.month_abbreviations[month] - - def month_number(self, name: str) -> Optional[int]: - """Returns the month number for a month specified by name or abbreviation. - - :param name: the month name or abbreviation. - - """ - - if self._month_name_to_ordinal is None: - self._month_name_to_ordinal = self._name_to_ordinal(self.month_names) - self._month_name_to_ordinal.update( - self._name_to_ordinal(self.month_abbreviations) - ) - - return self._month_name_to_ordinal.get(name) - - def year_full(self, year: int) -> str: - """Returns the year for specific locale if available - - :param year: the ``int`` year (4-digit) - """ - return f"{year:04d}" - - def year_abbreviation(self, year: int) -> str: - """Returns the year for specific locale if available - - :param year: the ``int`` year (4-digit) - """ - return f"{year:04d}"[2:] - - def meridian(self, hour: int, token: Any) -> Optional[str]: - """Returns the meridian indicator for a specified hour and format token. - - :param hour: the ``int`` hour of the day. - :param token: the format token. - """ - - if token == "a": - return self.meridians["am"] if hour < 12 else self.meridians["pm"] - if token == "A": - return self.meridians["AM"] if hour < 12 else self.meridians["PM"] - return None - - def ordinal_number(self, n: int) -> str: - """Returns the ordinal format of a given integer - - :param n: an integer - """ - return self._ordinal_number(n) - - def _ordinal_number(self, n: int) -> str: - return f"{n}" - - def _name_to_ordinal(self, lst: Sequence[str]) -> Dict[str, int]: - return {elem.lower(): i for i, elem in enumerate(lst[1:], 1)} - - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - # TODO: remove cast - return cast(str, self.timeframes[timeframe]).format(trunc(abs(delta))) - - def _format_relative( - self, - humanized: str, - timeframe: TimeFrameLiteral, - delta: Union[float, int], - ) -> str: - - if timeframe == "now": - return humanized - - direction = self.past if delta < 0 else self.future - - return direction.format(humanized) - - -class EnglishLocale(Locale): - names = [ - "en", - "en-us", - "en-gb", - "en-au", - "en-be", - "en-jp", - "en-za", - "en-ca", - "en-ph", - ] - - past = "{0} ago" - future = "in {0}" - and_word = "and" - - timeframes = { - "now": "just now", - "second": "a second", - "seconds": "{0} seconds", - "minute": "a minute", - "minutes": "{0} minutes", - "hour": "an hour", - "hours": "{0} hours", - "day": "a day", - "days": "{0} days", - "week": "a week", - "weeks": "{0} weeks", - "month": "a month", - "months": "{0} months", - "quarter": "a quarter", - "quarters": "{0} quarters", - "year": "a year", - "years": "{0} years", - } - - meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"} - - month_names = [ - "", - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ] - month_abbreviations = [ - "", - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - ] - - day_names = [ - "", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - "Sunday", - ] - day_abbreviations = ["", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] - - ordinal_day_re = r"((?P[2-3]?1(?=st)|[2-3]?2(?=nd)|[2-3]?3(?=rd)|[1-3]?[04-9](?=th)|1[1-3](?=th))(st|nd|rd|th))" - - def _ordinal_number(self, n: int) -> str: - if n % 100 not in (11, 12, 13): - remainder = abs(n) % 10 - if remainder == 1: - return f"{n}st" - elif remainder == 2: - return f"{n}nd" - elif remainder == 3: - return f"{n}rd" - return f"{n}th" - - def describe( - self, - timeframe: TimeFrameLiteral, - delta: Union[int, float] = 0, - only_distance: bool = False, - ) -> str: - """Describes a delta within a timeframe in plain language. - - :param timeframe: a string representing a timeframe. - :param delta: a quantity representing a delta in a timeframe. - :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords - """ - - humanized = super().describe(timeframe, delta, only_distance) - if only_distance and timeframe == "now": - humanized = "instantly" - - return humanized - - -class ItalianLocale(Locale): - names = ["it", "it-it"] - past = "{0} fa" - future = "tra {0}" - and_word = "e" - - timeframes = { - "now": "adesso", - "second": "un secondo", - "seconds": "{0} qualche secondo", - "minute": "un minuto", - "minutes": "{0} minuti", - "hour": "un'ora", - "hours": "{0} ore", - "day": "un giorno", - "days": "{0} giorni", - "week": "una settimana,", - "weeks": "{0} settimane", - "month": "un mese", - "months": "{0} mesi", - "year": "un anno", - "years": "{0} anni", - } - - month_names = [ - "", - "gennaio", - "febbraio", - "marzo", - "aprile", - "maggio", - "giugno", - "luglio", - "agosto", - "settembre", - "ottobre", - "novembre", - "dicembre", - ] - month_abbreviations = [ - "", - "gen", - "feb", - "mar", - "apr", - "mag", - "giu", - "lug", - "ago", - "set", - "ott", - "nov", - "dic", - ] - - day_names = [ - "", - "lunedì", - "martedì", - "mercoledì", - "giovedì", - "venerdì", - "sabato", - "domenica", - ] - day_abbreviations = ["", "lun", "mar", "mer", "gio", "ven", "sab", "dom"] - - ordinal_day_re = r"((?P[1-3]?[0-9](?=[ºª]))[ºª])" - - def _ordinal_number(self, n: int) -> str: - return f"{n}º" - - -class SpanishLocale(Locale): - names = ["es", "es-es"] - past = "hace {0}" - future = "en {0}" - and_word = "y" - - timeframes = { - "now": "ahora", - "second": "un segundo", - "seconds": "{0} segundos", - "minute": "un minuto", - "minutes": "{0} minutos", - "hour": "una hora", - "hours": "{0} horas", - "day": "un día", - "days": "{0} días", - "week": "una semana", - "weeks": "{0} semanas", - "month": "un mes", - "months": "{0} meses", - "year": "un año", - "years": "{0} años", - } - - meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"} - - month_names = [ - "", - "enero", - "febrero", - "marzo", - "abril", - "mayo", - "junio", - "julio", - "agosto", - "septiembre", - "octubre", - "noviembre", - "diciembre", - ] - month_abbreviations = [ - "", - "ene", - "feb", - "mar", - "abr", - "may", - "jun", - "jul", - "ago", - "sep", - "oct", - "nov", - "dic", - ] - - day_names = [ - "", - "lunes", - "martes", - "miércoles", - "jueves", - "viernes", - "sábado", - "domingo", - ] - day_abbreviations = ["", "lun", "mar", "mie", "jue", "vie", "sab", "dom"] - - ordinal_day_re = r"((?P[1-3]?[0-9](?=[ºª]))[ºª])" - - def _ordinal_number(self, n: int) -> str: - return f"{n}º" - - -class FrenchBaseLocale(Locale): - past = "il y a {0}" - future = "dans {0}" - and_word = "et" - - timeframes = { - "now": "maintenant", - "second": "une seconde", - "seconds": "{0} secondes", - "minute": "une minute", - "minutes": "{0} minutes", - "hour": "une heure", - "hours": "{0} heures", - "day": "un jour", - "days": "{0} jours", - "week": "une semaine", - "weeks": "{0} semaines", - "month": "un mois", - "months": "{0} mois", - "year": "un an", - "years": "{0} ans", - } - - month_names = [ - "", - "janvier", - "février", - "mars", - "avril", - "mai", - "juin", - "juillet", - "août", - "septembre", - "octobre", - "novembre", - "décembre", - ] - - day_names = [ - "", - "lundi", - "mardi", - "mercredi", - "jeudi", - "vendredi", - "samedi", - "dimanche", - ] - day_abbreviations = ["", "lun", "mar", "mer", "jeu", "ven", "sam", "dim"] - - ordinal_day_re = ( - r"((?P\b1(?=er\b)|[1-3]?[02-9](?=e\b)|[1-3]1(?=e\b))(er|e)\b)" - ) - - def _ordinal_number(self, n: int) -> str: - if abs(n) == 1: - return f"{n}er" - return f"{n}e" - - -class FrenchLocale(FrenchBaseLocale, Locale): - names = ["fr", "fr-fr"] - - month_abbreviations = [ - "", - "janv", - "févr", - "mars", - "avr", - "mai", - "juin", - "juil", - "août", - "sept", - "oct", - "nov", - "déc", - ] - - -class FrenchCanadianLocale(FrenchBaseLocale, Locale): - names = ["fr-ca"] - - month_abbreviations = [ - "", - "janv", - "févr", - "mars", - "avr", - "mai", - "juin", - "juill", - "août", - "sept", - "oct", - "nov", - "déc", - ] - - -class GreekLocale(Locale): - names = ["el", "el-gr"] - - past = "{0} πριν" - future = "σε {0}" - and_word = "και" - - timeframes = { - "now": "τώρα", - "second": "ένα δεύτερο", - "seconds": "{0} δευτερόλεπτα", - "minute": "ένα λεπτό", - "minutes": "{0} λεπτά", - "hour": "μία ώρα", - "hours": "{0} ώρες", - "day": "μία μέρα", - "days": "{0} μέρες", - "week": "μία εβδομάδα", - "weeks": "{0} εβδομάδες", - "month": "ένα μήνα", - "months": "{0} μήνες", - "year": "ένα χρόνο", - "years": "{0} χρόνια", - } - - month_names = [ - "", - "Ιανουαρίου", - "Φεβρουαρίου", - "Μαρτίου", - "Απριλίου", - "Μαΐου", - "Ιουνίου", - "Ιουλίου", - "Αυγούστου", - "Σεπτεμβρίου", - "Οκτωβρίου", - "Νοεμβρίου", - "Δεκεμβρίου", - ] - month_abbreviations = [ - "", - "Ιαν", - "Φεβ", - "Μαρ", - "Απρ", - "Μαϊ", - "Ιον", - "Ιολ", - "Αυγ", - "Σεπ", - "Οκτ", - "Νοε", - "Δεκ", - ] - - day_names = [ - "", - "Δευτέρα", - "Τρίτη", - "Τετάρτη", - "Πέμπτη", - "Παρασκευή", - "Σάββατο", - "Κυριακή", - ] - day_abbreviations = ["", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ", "Κυρ"] - - -class JapaneseLocale(Locale): - names = ["ja", "ja-jp"] - - past = "{0}前" - future = "{0}後" - and_word = "" - - timeframes = { - "now": "現在", - "second": "1秒", - "seconds": "{0}秒", - "minute": "1分", - "minutes": "{0}分", - "hour": "1時間", - "hours": "{0}時間", - "day": "1日", - "days": "{0}日", - "week": "1週間", - "weeks": "{0}週間", - "month": "1ヶ月", - "months": "{0}ヶ月", - "year": "1年", - "years": "{0}年", - } - - month_names = [ - "", - "1月", - "2月", - "3月", - "4月", - "5月", - "6月", - "7月", - "8月", - "9月", - "10月", - "11月", - "12月", - ] - month_abbreviations = [ - "", - " 1", - " 2", - " 3", - " 4", - " 5", - " 6", - " 7", - " 8", - " 9", - "10", - "11", - "12", - ] - - day_names = ["", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日"] - day_abbreviations = ["", "月", "火", "水", "木", "金", "土", "日"] - - -class SwedishLocale(Locale): - names = ["sv", "sv-se"] - - past = "för {0} sen" - future = "om {0}" - and_word = "och" - - timeframes = { - "now": "just nu", - "second": "en sekund", - "seconds": "{0} sekunder", - "minute": "en minut", - "minutes": "{0} minuter", - "hour": "en timme", - "hours": "{0} timmar", - "day": "en dag", - "days": "{0} dagar", - "week": "en vecka", - "weeks": "{0} veckor", - "month": "en månad", - "months": "{0} månader", - "year": "ett år", - "years": "{0} år", - } - - month_names = [ - "", - "januari", - "februari", - "mars", - "april", - "maj", - "juni", - "juli", - "augusti", - "september", - "oktober", - "november", - "december", - ] - month_abbreviations = [ - "", - "jan", - "feb", - "mar", - "apr", - "maj", - "jun", - "jul", - "aug", - "sep", - "okt", - "nov", - "dec", - ] - - day_names = [ - "", - "måndag", - "tisdag", - "onsdag", - "torsdag", - "fredag", - "lördag", - "söndag", - ] - day_abbreviations = ["", "mån", "tis", "ons", "tor", "fre", "lör", "sön"] - - -class FinnishLocale(Locale): - names = ["fi", "fi-fi"] - - # The finnish grammar is very complex, and its hard to convert - # 1-to-1 to something like English. - - past = "{0} sitten" - future = "{0} kuluttua" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "juuri nyt", - "second": "sekunti", - "seconds": {"past": "{0} muutama sekunti", "future": "{0} muutaman sekunnin"}, - "minute": {"past": "minuutti", "future": "minuutin"}, - "minutes": {"past": "{0} minuuttia", "future": "{0} minuutin"}, - "hour": {"past": "tunti", "future": "tunnin"}, - "hours": {"past": "{0} tuntia", "future": "{0} tunnin"}, - "day": "päivä", - "days": {"past": "{0} päivää", "future": "{0} päivän"}, - "month": {"past": "kuukausi", "future": "kuukauden"}, - "months": {"past": "{0} kuukautta", "future": "{0} kuukauden"}, - "year": {"past": "vuosi", "future": "vuoden"}, - "years": {"past": "{0} vuotta", "future": "{0} vuoden"}, - } - - # Months and days are lowercase in Finnish - month_names = [ - "", - "tammikuu", - "helmikuu", - "maaliskuu", - "huhtikuu", - "toukokuu", - "kesäkuu", - "heinäkuu", - "elokuu", - "syyskuu", - "lokakuu", - "marraskuu", - "joulukuu", - ] - - month_abbreviations = [ - "", - "tammi", - "helmi", - "maalis", - "huhti", - "touko", - "kesä", - "heinä", - "elo", - "syys", - "loka", - "marras", - "joulu", - ] - - day_names = [ - "", - "maanantai", - "tiistai", - "keskiviikko", - "torstai", - "perjantai", - "lauantai", - "sunnuntai", - ] - - day_abbreviations = ["", "ma", "ti", "ke", "to", "pe", "la", "su"] - - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - form = self.timeframes[timeframe] - - if isinstance(form, Mapping): - if delta < 0: - form = form["past"] - else: - form = form["future"] - - return form.format(abs(delta)) - - def _ordinal_number(self, n: int) -> str: - return f"{n}." - - -class ChineseCNLocale(Locale): - names = ["zh", "zh-cn"] - - past = "{0}前" - future = "{0}后" - - timeframes = { - "now": "刚才", - "second": "1秒", - "seconds": "{0}秒", - "minute": "1分钟", - "minutes": "{0}分钟", - "hour": "1小时", - "hours": "{0}小时", - "day": "1天", - "days": "{0}天", - "week": "1周", - "weeks": "{0}周", - "month": "1个月", - "months": "{0}个月", - "year": "1年", - "years": "{0}年", - } - - month_names = [ - "", - "一月", - "二月", - "三月", - "四月", - "五月", - "六月", - "七月", - "八月", - "九月", - "十月", - "十一月", - "十二月", - ] - month_abbreviations = [ - "", - " 1", - " 2", - " 3", - " 4", - " 5", - " 6", - " 7", - " 8", - " 9", - "10", - "11", - "12", - ] - - day_names = ["", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"] - day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"] - - -class ChineseTWLocale(Locale): - names = ["zh-tw"] - - past = "{0}前" - future = "{0}後" - and_word = "和" - - timeframes = { - "now": "剛才", - "second": "1秒", - "seconds": "{0}秒", - "minute": "1分鐘", - "minutes": "{0}分鐘", - "hour": "1小時", - "hours": "{0}小時", - "day": "1天", - "days": "{0}天", - "week": "1週", - "weeks": "{0}週", - "month": "1個月", - "months": "{0}個月", - "year": "1年", - "years": "{0}年", - } - - month_names = [ - "", - "1月", - "2月", - "3月", - "4月", - "5月", - "6月", - "7月", - "8月", - "9月", - "10月", - "11月", - "12月", - ] - month_abbreviations = [ - "", - " 1", - " 2", - " 3", - " 4", - " 5", - " 6", - " 7", - " 8", - " 9", - "10", - "11", - "12", - ] - - day_names = ["", "週一", "週二", "週三", "週四", "週五", "週六", "週日"] - day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"] - - -class HongKongLocale(Locale): - names = ["zh-hk"] - - past = "{0}前" - future = "{0}後" - - timeframes = { - "now": "剛才", - "second": "1秒", - "seconds": "{0}秒", - "minute": "1分鐘", - "minutes": "{0}分鐘", - "hour": "1小時", - "hours": "{0}小時", - "day": "1天", - "days": "{0}天", - "week": "1星期", - "weeks": "{0}星期", - "month": "1個月", - "months": "{0}個月", - "year": "1年", - "years": "{0}年", - } - - month_names = [ - "", - "1月", - "2月", - "3月", - "4月", - "5月", - "6月", - "7月", - "8月", - "9月", - "10月", - "11月", - "12月", - ] - month_abbreviations = [ - "", - " 1", - " 2", - " 3", - " 4", - " 5", - " 6", - " 7", - " 8", - " 9", - "10", - "11", - "12", - ] - - day_names = ["", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"] - day_abbreviations = ["", "一", "二", "三", "四", "五", "六", "日"] - - -class KoreanLocale(Locale): - names = ["ko", "ko-kr"] - - past = "{0} 전" - future = "{0} 후" - - timeframes = { - "now": "지금", - "second": "1초", - "seconds": "{0}초", - "minute": "1분", - "minutes": "{0}분", - "hour": "한시간", - "hours": "{0}시간", - "day": "하루", - "days": "{0}일", - "week": "1주", - "weeks": "{0}주", - "month": "한달", - "months": "{0}개월", - "year": "1년", - "years": "{0}년", - } - - special_dayframes = { - -3: "그끄제", - -2: "그제", - -1: "어제", - 1: "내일", - 2: "모레", - 3: "글피", - 4: "그글피", - } - - special_yearframes = {-2: "제작년", -1: "작년", 1: "내년", 2: "내후년"} - - month_names = [ - "", - "1월", - "2월", - "3월", - "4월", - "5월", - "6월", - "7월", - "8월", - "9월", - "10월", - "11월", - "12월", - ] - month_abbreviations = [ - "", - " 1", - " 2", - " 3", - " 4", - " 5", - " 6", - " 7", - " 8", - " 9", - "10", - "11", - "12", - ] - - day_names = ["", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"] - day_abbreviations = ["", "월", "화", "수", "목", "금", "토", "일"] - - def _ordinal_number(self, n: int) -> str: - ordinals = ["0", "첫", "두", "세", "네", "다섯", "여섯", "일곱", "여덟", "아홉", "열"] - if n < len(ordinals): - return f"{ordinals[n]}번째" - return f"{n}번째" - - def _format_relative( - self, - humanized: str, - timeframe: TimeFrameLiteral, - delta: Union[float, int], - ) -> str: - if timeframe in ("day", "days"): - special = self.special_dayframes.get(int(delta)) - if special: - return special - elif timeframe in ("year", "years"): - special = self.special_yearframes.get(int(delta)) - if special: - return special - - return super()._format_relative(humanized, timeframe, delta) - - -# derived locale types & implementations. -class DutchLocale(Locale): - names = ["nl", "nl-nl"] - - past = "{0} geleden" - future = "over {0}" - - timeframes = { - "now": "nu", - "second": "een seconde", - "seconds": "{0} seconden", - "minute": "een minuut", - "minutes": "{0} minuten", - "hour": "een uur", - "hours": "{0} uur", - "day": "een dag", - "days": "{0} dagen", - "week": "een week", - "weeks": "{0} weken", - "month": "een maand", - "months": "{0} maanden", - "year": "een jaar", - "years": "{0} jaar", - } - - # In Dutch names of months and days are not starting with a capital letter - # like in the English language. - month_names = [ - "", - "januari", - "februari", - "maart", - "april", - "mei", - "juni", - "juli", - "augustus", - "september", - "oktober", - "november", - "december", - ] - month_abbreviations = [ - "", - "jan", - "feb", - "mrt", - "apr", - "mei", - "jun", - "jul", - "aug", - "sep", - "okt", - "nov", - "dec", - ] - - day_names = [ - "", - "maandag", - "dinsdag", - "woensdag", - "donderdag", - "vrijdag", - "zaterdag", - "zondag", - ] - day_abbreviations = ["", "ma", "di", "wo", "do", "vr", "za", "zo"] - - -class SlavicBaseLocale(Locale): - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] - - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - form = self.timeframes[timeframe] - delta = abs(delta) - - if isinstance(form, Mapping): - if delta % 10 == 1 and delta % 100 != 11: - form = form["singular"] - elif 2 <= delta % 10 <= 4 and (delta % 100 < 10 or delta % 100 >= 20): - form = form["dual"] - else: - form = form["plural"] - - return form.format(delta) - - -class BelarusianLocale(SlavicBaseLocale): - names = ["be", "be-by"] - - past = "{0} таму" - future = "праз {0}" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "зараз", - "second": "секунду", - "seconds": "{0} некалькі секунд", - "minute": "хвіліну", - "minutes": { - "singular": "{0} хвіліну", - "dual": "{0} хвіліны", - "plural": "{0} хвілін", - }, - "hour": "гадзіну", - "hours": { - "singular": "{0} гадзіну", - "dual": "{0} гадзіны", - "plural": "{0} гадзін", - }, - "day": "дзень", - "days": {"singular": "{0} дзень", "dual": "{0} дні", "plural": "{0} дзён"}, - "month": "месяц", - "months": { - "singular": "{0} месяц", - "dual": "{0} месяцы", - "plural": "{0} месяцаў", - }, - "year": "год", - "years": {"singular": "{0} год", "dual": "{0} гады", "plural": "{0} гадоў"}, - } - - month_names = [ - "", - "студзеня", - "лютага", - "сакавіка", - "красавіка", - "траўня", - "чэрвеня", - "ліпеня", - "жніўня", - "верасня", - "кастрычніка", - "лістапада", - "снежня", - ] - month_abbreviations = [ - "", - "студ", - "лют", - "сак", - "крас", - "трав", - "чэрв", - "ліп", - "жнів", - "вер", - "каст", - "ліст", - "снеж", - ] - - day_names = [ - "", - "панядзелак", - "аўторак", - "серада", - "чацвер", - "пятніца", - "субота", - "нядзеля", - ] - day_abbreviations = ["", "пн", "ат", "ср", "чц", "пт", "сб", "нд"] - - -class PolishLocale(SlavicBaseLocale): - names = ["pl", "pl-pl"] - - past = "{0} temu" - future = "za {0}" - - # The nouns should be in genitive case (Polish: "dopełniacz") - # in order to correctly form `past` & `future` expressions. - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "teraz", - "second": "sekundę", - "seconds": { - "singular": "{0} sekund", - "dual": "{0} sekundy", - "plural": "{0} sekund", - }, - "minute": "minutę", - "minutes": { - "singular": "{0} minut", - "dual": "{0} minuty", - "plural": "{0} minut", - }, - "hour": "godzinę", - "hours": { - "singular": "{0} godzin", - "dual": "{0} godziny", - "plural": "{0} godzin", - }, - "day": "dzień", - "days": "{0} dni", - "week": "tydzień", - "weeks": { - "singular": "{0} tygodni", - "dual": "{0} tygodnie", - "plural": "{0} tygodni", - }, - "month": "miesiąc", - "months": { - "singular": "{0} miesięcy", - "dual": "{0} miesiące", - "plural": "{0} miesięcy", - }, - "year": "rok", - "years": {"singular": "{0} lat", "dual": "{0} lata", "plural": "{0} lat"}, - } - - month_names = [ - "", - "styczeń", - "luty", - "marzec", - "kwiecień", - "maj", - "czerwiec", - "lipiec", - "sierpień", - "wrzesień", - "październik", - "listopad", - "grudzień", - ] - month_abbreviations = [ - "", - "sty", - "lut", - "mar", - "kwi", - "maj", - "cze", - "lip", - "sie", - "wrz", - "paź", - "lis", - "gru", - ] - - day_names = [ - "", - "poniedziałek", - "wtorek", - "środa", - "czwartek", - "piątek", - "sobota", - "niedziela", - ] - day_abbreviations = ["", "Pn", "Wt", "Śr", "Czw", "Pt", "So", "Nd"] - - -class RussianLocale(SlavicBaseLocale): - names = ["ru", "ru-ru"] - - past = "{0} назад" - future = "через {0}" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "сейчас", - "second": "секунда", - "seconds": { - "singular": "{0} секунду", - "dual": "{0} секунды", - "plural": "{0} секунд", - }, - "minute": "минуту", - "minutes": { - "singular": "{0} минуту", - "dual": "{0} минуты", - "plural": "{0} минут", - }, - "hour": "час", - "hours": {"singular": "{0} час", "dual": "{0} часа", "plural": "{0} часов"}, - "day": "день", - "days": {"singular": "{0} день", "dual": "{0} дня", "plural": "{0} дней"}, - "week": "неделю", - "weeks": { - "singular": "{0} неделю", - "dual": "{0} недели", - "plural": "{0} недель", - }, - "month": "месяц", - "months": { - "singular": "{0} месяц", - "dual": "{0} месяца", - "plural": "{0} месяцев", - }, - "quarter": "квартал", - "quarters": { - "singular": "{0} квартал", - "dual": "{0} квартала", - "plural": "{0} кварталов", - }, - "year": "год", - "years": {"singular": "{0} год", "dual": "{0} года", "plural": "{0} лет"}, - } - - month_names = [ - "", - "января", - "февраля", - "марта", - "апреля", - "мая", - "июня", - "июля", - "августа", - "сентября", - "октября", - "ноября", - "декабря", - ] - month_abbreviations = [ - "", - "янв", - "фев", - "мар", - "апр", - "май", - "июн", - "июл", - "авг", - "сен", - "окт", - "ноя", - "дек", - ] - - day_names = [ - "", - "понедельник", - "вторник", - "среда", - "четверг", - "пятница", - "суббота", - "воскресенье", - ] - day_abbreviations = ["", "пн", "вт", "ср", "чт", "пт", "сб", "вс"] - - -class AfrikaansLocale(Locale): - names = ["af", "af-nl"] - - past = "{0} gelede" - future = "in {0}" - - timeframes = { - "now": "nou", - "second": "n sekonde", - "seconds": "{0} sekondes", - "minute": "minuut", - "minutes": "{0} minute", - "hour": "uur", - "hours": "{0} ure", - "day": "een dag", - "days": "{0} dae", - "month": "een maand", - "months": "{0} maande", - "year": "een jaar", - "years": "{0} jaar", - } - - month_names = [ - "", - "Januarie", - "Februarie", - "Maart", - "April", - "Mei", - "Junie", - "Julie", - "Augustus", - "September", - "Oktober", - "November", - "Desember", - ] - month_abbreviations = [ - "", - "Jan", - "Feb", - "Mrt", - "Apr", - "Mei", - "Jun", - "Jul", - "Aug", - "Sep", - "Okt", - "Nov", - "Des", - ] - - day_names = [ - "", - "Maandag", - "Dinsdag", - "Woensdag", - "Donderdag", - "Vrydag", - "Saterdag", - "Sondag", - ] - day_abbreviations = ["", "Ma", "Di", "Wo", "Do", "Vr", "Za", "So"] - - -class BulgarianLocale(SlavicBaseLocale): - names = ["bg", "bg-bg"] - - past = "{0} назад" - future = "напред {0}" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "сега", - "second": "секунда", - "seconds": "{0} няколко секунди", - "minute": "минута", - "minutes": { - "singular": "{0} минута", - "dual": "{0} минути", - "plural": "{0} минути", - }, - "hour": "час", - "hours": {"singular": "{0} час", "dual": "{0} часа", "plural": "{0} часа"}, - "day": "ден", - "days": {"singular": "{0} ден", "dual": "{0} дни", "plural": "{0} дни"}, - "month": "месец", - "months": { - "singular": "{0} месец", - "dual": "{0} месеца", - "plural": "{0} месеца", - }, - "year": "година", - "years": { - "singular": "{0} година", - "dual": "{0} години", - "plural": "{0} години", - }, - } - - month_names = [ - "", - "януари", - "февруари", - "март", - "април", - "май", - "юни", - "юли", - "август", - "септември", - "октомври", - "ноември", - "декември", - ] - month_abbreviations = [ - "", - "ян", - "февр", - "март", - "апр", - "май", - "юни", - "юли", - "авг", - "септ", - "окт", - "ноем", - "дек", - ] - - day_names = [ - "", - "понеделник", - "вторник", - "сряда", - "четвъртък", - "петък", - "събота", - "неделя", - ] - day_abbreviations = ["", "пон", "вт", "ср", "четв", "пет", "съб", "нед"] - - -class UkrainianLocale(SlavicBaseLocale): - names = ["ua", "uk", "uk-ua"] - - past = "{0} тому" - future = "за {0}" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "зараз", - "second": "секунда", - "seconds": "{0} кілька секунд", - "minute": "хвилину", - "minutes": { - "singular": "{0} хвилину", - "dual": "{0} хвилини", - "plural": "{0} хвилин", - }, - "hour": "годину", - "hours": { - "singular": "{0} годину", - "dual": "{0} години", - "plural": "{0} годин", - }, - "day": "день", - "days": {"singular": "{0} день", "dual": "{0} дні", "plural": "{0} днів"}, - "month": "місяць", - "months": { - "singular": "{0} місяць", - "dual": "{0} місяці", - "plural": "{0} місяців", - }, - "year": "рік", - "years": {"singular": "{0} рік", "dual": "{0} роки", "plural": "{0} років"}, - } - - month_names = [ - "", - "січня", - "лютого", - "березня", - "квітня", - "травня", - "червня", - "липня", - "серпня", - "вересня", - "жовтня", - "листопада", - "грудня", - ] - month_abbreviations = [ - "", - "січ", - "лют", - "бер", - "квіт", - "трав", - "черв", - "лип", - "серп", - "вер", - "жовт", - "лист", - "груд", - ] - - day_names = [ - "", - "понеділок", - "вівторок", - "середа", - "четвер", - "п’ятниця", - "субота", - "неділя", - ] - day_abbreviations = ["", "пн", "вт", "ср", "чт", "пт", "сб", "нд"] - - -class MacedonianLocale(SlavicBaseLocale): - names = ["mk", "mk-mk"] - - past = "пред {0}" - future = "за {0}" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "сега", - "second": "една секунда", - "seconds": { - "singular": "{0} секунда", - "dual": "{0} секунди", - "plural": "{0} секунди", - }, - "minute": "една минута", - "minutes": { - "singular": "{0} минута", - "dual": "{0} минути", - "plural": "{0} минути", - }, - "hour": "еден саат", - "hours": {"singular": "{0} саат", "dual": "{0} саати", "plural": "{0} саати"}, - "day": "еден ден", - "days": {"singular": "{0} ден", "dual": "{0} дена", "plural": "{0} дена"}, - "week": "една недела", - "weeks": { - "singular": "{0} недела", - "dual": "{0} недели", - "plural": "{0} недели", - }, - "month": "еден месец", - "months": { - "singular": "{0} месец", - "dual": "{0} месеци", - "plural": "{0} месеци", - }, - "year": "една година", - "years": { - "singular": "{0} година", - "dual": "{0} години", - "plural": "{0} години", - }, - } - - meridians = {"am": "дп", "pm": "пп", "AM": "претпладне", "PM": "попладне"} - - month_names = [ - "", - "Јануари", - "Февруари", - "Март", - "Април", - "Мај", - "Јуни", - "Јули", - "Август", - "Септември", - "Октомври", - "Ноември", - "Декември", - ] - month_abbreviations = [ - "", - "Јан", - "Фев", - "Мар", - "Апр", - "Мај", - "Јун", - "Јул", - "Авг", - "Септ", - "Окт", - "Ноем", - "Декем", - ] - - day_names = [ - "", - "Понеделник", - "Вторник", - "Среда", - "Четврток", - "Петок", - "Сабота", - "Недела", - ] - day_abbreviations = [ - "", - "Пон", - "Вт", - "Сре", - "Чет", - "Пет", - "Саб", - "Нед", - ] - - -class GermanBaseLocale(Locale): - past = "vor {0}" - future = "in {0}" - and_word = "und" - - timeframes = { - "now": "gerade eben", - "second": "einer Sekunde", - "seconds": "{0} Sekunden", - "minute": "einer Minute", - "minutes": "{0} Minuten", - "hour": "einer Stunde", - "hours": "{0} Stunden", - "day": "einem Tag", - "days": "{0} Tagen", - "week": "einer Woche", - "weeks": "{0} Wochen", - "month": "einem Monat", - "months": "{0} Monaten", - "year": "einem Jahr", - "years": "{0} Jahren", - } - - timeframes_only_distance = timeframes.copy() - timeframes_only_distance["second"] = "eine Sekunde" - timeframes_only_distance["minute"] = "eine Minute" - timeframes_only_distance["hour"] = "eine Stunde" - timeframes_only_distance["day"] = "ein Tag" - timeframes_only_distance["days"] = "{0} Tage" - timeframes_only_distance["week"] = "eine Woche" - timeframes_only_distance["month"] = "ein Monat" - timeframes_only_distance["months"] = "{0} Monate" - timeframes_only_distance["year"] = "ein Jahr" - timeframes_only_distance["years"] = "{0} Jahre" - - month_names = [ - "", - "Januar", - "Februar", - "März", - "April", - "Mai", - "Juni", - "Juli", - "August", - "September", - "Oktober", - "November", - "Dezember", - ] - - month_abbreviations = [ - "", - "Jan", - "Feb", - "Mär", - "Apr", - "Mai", - "Jun", - "Jul", - "Aug", - "Sep", - "Okt", - "Nov", - "Dez", - ] - - day_names = [ - "", - "Montag", - "Dienstag", - "Mittwoch", - "Donnerstag", - "Freitag", - "Samstag", - "Sonntag", - ] - - day_abbreviations = ["", "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"] - - def _ordinal_number(self, n: int) -> str: - return f"{n}." - - def describe( - self, - timeframe: TimeFrameLiteral, - delta: Union[int, float] = 0, - only_distance: bool = False, - ) -> str: - """Describes a delta within a timeframe in plain language. - - :param timeframe: a string representing a timeframe. - :param delta: a quantity representing a delta in a timeframe. - :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords - """ - - if not only_distance: - return super().describe(timeframe, delta, only_distance) - - # German uses a different case without 'in' or 'ago' - humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta))) - - return humanized - - -class GermanLocale(GermanBaseLocale, Locale): - names = ["de", "de-de"] - - -class SwissLocale(GermanBaseLocale, Locale): - names = ["de-ch"] - - -class AustrianLocale(GermanBaseLocale, Locale): - names = ["de-at"] - - month_names = [ - "", - "Jänner", - "Februar", - "März", - "April", - "Mai", - "Juni", - "Juli", - "August", - "September", - "Oktober", - "November", - "Dezember", - ] - - -class NorwegianLocale(Locale): - names = ["nb", "nb-no"] - - past = "for {0} siden" - future = "om {0}" - - timeframes = { - "now": "nå nettopp", - "second": "ett sekund", - "seconds": "{0} sekunder", - "minute": "ett minutt", - "minutes": "{0} minutter", - "hour": "en time", - "hours": "{0} timer", - "day": "en dag", - "days": "{0} dager", - "week": "en uke", - "weeks": "{0} uker", - "month": "en måned", - "months": "{0} måneder", - "year": "ett år", - "years": "{0} år", - } - - month_names = [ - "", - "januar", - "februar", - "mars", - "april", - "mai", - "juni", - "juli", - "august", - "september", - "oktober", - "november", - "desember", - ] - month_abbreviations = [ - "", - "jan", - "feb", - "mar", - "apr", - "mai", - "jun", - "jul", - "aug", - "sep", - "okt", - "nov", - "des", - ] - - day_names = [ - "", - "mandag", - "tirsdag", - "onsdag", - "torsdag", - "fredag", - "lørdag", - "søndag", - ] - day_abbreviations = ["", "ma", "ti", "on", "to", "fr", "lø", "sø"] - - def _ordinal_number(self, n: int) -> str: - return f"{n}." - - -class NewNorwegianLocale(Locale): - names = ["nn", "nn-no"] - - past = "for {0} sidan" - future = "om {0}" - - timeframes = { - "now": "no nettopp", - "second": "eitt sekund", - "seconds": "{0} sekund", - "minute": "eitt minutt", - "minutes": "{0} minutt", - "hour": "ein time", - "hours": "{0} timar", - "day": "ein dag", - "days": "{0} dagar", - "week": "ei veke", - "weeks": "{0} veker", - "month": "ein månad", - "months": "{0} månader", - "year": "eitt år", - "years": "{0} år", - } - - month_names = [ - "", - "januar", - "februar", - "mars", - "april", - "mai", - "juni", - "juli", - "august", - "september", - "oktober", - "november", - "desember", - ] - month_abbreviations = [ - "", - "jan", - "feb", - "mar", - "apr", - "mai", - "jun", - "jul", - "aug", - "sep", - "okt", - "nov", - "des", - ] - - day_names = [ - "", - "måndag", - "tysdag", - "onsdag", - "torsdag", - "fredag", - "laurdag", - "sundag", - ] - day_abbreviations = ["", "må", "ty", "on", "to", "fr", "la", "su"] - - def _ordinal_number(self, n: int) -> str: - return f"{n}." - - -class PortugueseLocale(Locale): - names = ["pt", "pt-pt"] - - past = "há {0}" - future = "em {0}" - and_word = "e" - - timeframes = { - "now": "agora", - "second": "um segundo", - "seconds": "{0} segundos", - "minute": "um minuto", - "minutes": "{0} minutos", - "hour": "uma hora", - "hours": "{0} horas", - "day": "um dia", - "days": "{0} dias", - "week": "uma semana", - "weeks": "{0} semanas", - "month": "um mês", - "months": "{0} meses", - "year": "um ano", - "years": "{0} anos", - } - - month_names = [ - "", - "Janeiro", - "Fevereiro", - "Março", - "Abril", - "Maio", - "Junho", - "Julho", - "Agosto", - "Setembro", - "Outubro", - "Novembro", - "Dezembro", - ] - month_abbreviations = [ - "", - "Jan", - "Fev", - "Mar", - "Abr", - "Mai", - "Jun", - "Jul", - "Ago", - "Set", - "Out", - "Nov", - "Dez", - ] - - day_names = [ - "", - "Segunda-feira", - "Terça-feira", - "Quarta-feira", - "Quinta-feira", - "Sexta-feira", - "Sábado", - "Domingo", - ] - day_abbreviations = ["", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab", "Dom"] - - -class BrazilianPortugueseLocale(PortugueseLocale): - names = ["pt-br"] - - past = "faz {0}" - - -class TagalogLocale(Locale): - names = ["tl", "tl-ph"] - - past = "nakaraang {0}" - future = "{0} mula ngayon" - - timeframes = { - "now": "ngayon lang", - "second": "isang segundo", - "seconds": "{0} segundo", - "minute": "isang minuto", - "minutes": "{0} minuto", - "hour": "isang oras", - "hours": "{0} oras", - "day": "isang araw", - "days": "{0} araw", - "week": "isang linggo", - "weeks": "{0} linggo", - "month": "isang buwan", - "months": "{0} buwan", - "year": "isang taon", - "years": "{0} taon", - } - - month_names = [ - "", - "Enero", - "Pebrero", - "Marso", - "Abril", - "Mayo", - "Hunyo", - "Hulyo", - "Agosto", - "Setyembre", - "Oktubre", - "Nobyembre", - "Disyembre", - ] - month_abbreviations = [ - "", - "Ene", - "Peb", - "Mar", - "Abr", - "May", - "Hun", - "Hul", - "Ago", - "Set", - "Okt", - "Nob", - "Dis", - ] - - day_names = [ - "", - "Lunes", - "Martes", - "Miyerkules", - "Huwebes", - "Biyernes", - "Sabado", - "Linggo", - ] - day_abbreviations = ["", "Lun", "Mar", "Miy", "Huw", "Biy", "Sab", "Lin"] - - meridians = {"am": "nu", "pm": "nh", "AM": "ng umaga", "PM": "ng hapon"} - - def _ordinal_number(self, n: int) -> str: - return f"ika-{n}" - - -class VietnameseLocale(Locale): - names = ["vi", "vi-vn"] - - past = "{0} trước" - future = "{0} nữa" - - timeframes = { - "now": "hiện tại", - "second": "một giây", - "seconds": "{0} giây", - "minute": "một phút", - "minutes": "{0} phút", - "hour": "một giờ", - "hours": "{0} giờ", - "day": "một ngày", - "days": "{0} ngày", - "week": "một tuần", - "weeks": "{0} tuần", - "month": "một tháng", - "months": "{0} tháng", - "year": "một năm", - "years": "{0} năm", - } - - month_names = [ - "", - "Tháng Một", - "Tháng Hai", - "Tháng Ba", - "Tháng Tư", - "Tháng Năm", - "Tháng Sáu", - "Tháng Bảy", - "Tháng Tám", - "Tháng Chín", - "Tháng Mười", - "Tháng Mười Một", - "Tháng Mười Hai", - ] - month_abbreviations = [ - "", - "Tháng 1", - "Tháng 2", - "Tháng 3", - "Tháng 4", - "Tháng 5", - "Tháng 6", - "Tháng 7", - "Tháng 8", - "Tháng 9", - "Tháng 10", - "Tháng 11", - "Tháng 12", - ] - - day_names = [ - "", - "Thứ Hai", - "Thứ Ba", - "Thứ Tư", - "Thứ Năm", - "Thứ Sáu", - "Thứ Bảy", - "Chủ Nhật", - ] - day_abbreviations = ["", "Thứ 2", "Thứ 3", "Thứ 4", "Thứ 5", "Thứ 6", "Thứ 7", "CN"] - - -class TurkishLocale(Locale): - names = ["tr", "tr-tr"] - - past = "{0} önce" - future = "{0} sonra" - and_word = "ve" - - timeframes = { - "now": "şimdi", - "second": "bir saniye", - "seconds": "{0} saniye", - "minute": "bir dakika", - "minutes": "{0} dakika", - "hour": "bir saat", - "hours": "{0} saat", - "day": "bir gün", - "days": "{0} gün", - "week": "bir hafta", - "weeks": "{0} hafta", - "month": "bir ay", - "months": "{0} ay", - "year": "bir yıl", - "years": "{0} yıl", - } - - meridians = {"am": "öö", "pm": "ös", "AM": "ÖÖ", "PM": "ÖS"} - - month_names = [ - "", - "Ocak", - "Şubat", - "Mart", - "Nisan", - "Mayıs", - "Haziran", - "Temmuz", - "Ağustos", - "Eylül", - "Ekim", - "Kasım", - "Aralık", - ] - month_abbreviations = [ - "", - "Oca", - "Şub", - "Mar", - "Nis", - "May", - "Haz", - "Tem", - "Ağu", - "Eyl", - "Eki", - "Kas", - "Ara", - ] - - day_names = [ - "", - "Pazartesi", - "Salı", - "Çarşamba", - "Perşembe", - "Cuma", - "Cumartesi", - "Pazar", - ] - day_abbreviations = ["", "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Paz"] - - -class AzerbaijaniLocale(Locale): - names = ["az", "az-az"] - - past = "{0} əvvəl" - future = "{0} sonra" - - timeframes = { - "now": "indi", - "second": "bir saniyə", - "seconds": "{0} saniyə", - "minute": "bir dəqiqə", - "minutes": "{0} dəqiqə", - "hour": "bir saat", - "hours": "{0} saat", - "day": "bir gün", - "days": "{0} gün", - "week": "bir həftə", - "weeks": "{0} həftə", - "month": "bir ay", - "months": "{0} ay", - "year": "bir il", - "years": "{0} il", - } - - month_names = [ - "", - "Yanvar", - "Fevral", - "Mart", - "Aprel", - "May", - "İyun", - "İyul", - "Avqust", - "Sentyabr", - "Oktyabr", - "Noyabr", - "Dekabr", - ] - month_abbreviations = [ - "", - "Yan", - "Fev", - "Mar", - "Apr", - "May", - "İyn", - "İyl", - "Avq", - "Sen", - "Okt", - "Noy", - "Dek", - ] - - day_names = [ - "", - "Bazar ertəsi", - "Çərşənbə axşamı", - "Çərşənbə", - "Cümə axşamı", - "Cümə", - "Şənbə", - "Bazar", - ] - day_abbreviations = ["", "Ber", "Çax", "Çər", "Cax", "Cüm", "Şnb", "Bzr"] - - -class ArabicLocale(Locale): - names = [ - "ar", - "ar-ae", - "ar-bh", - "ar-dj", - "ar-eg", - "ar-eh", - "ar-er", - "ar-km", - "ar-kw", - "ar-ly", - "ar-om", - "ar-qa", - "ar-sa", - "ar-sd", - "ar-so", - "ar-ss", - "ar-td", - "ar-ye", - ] - - past = "منذ {0}" - future = "خلال {0}" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "الآن", - "second": "ثانية", - "seconds": {"2": "ثانيتين", "ten": "{0} ثوان", "higher": "{0} ثانية"}, - "minute": "دقيقة", - "minutes": {"2": "دقيقتين", "ten": "{0} دقائق", "higher": "{0} دقيقة"}, - "hour": "ساعة", - "hours": {"2": "ساعتين", "ten": "{0} ساعات", "higher": "{0} ساعة"}, - "day": "يوم", - "days": {"2": "يومين", "ten": "{0} أيام", "higher": "{0} يوم"}, - "month": "شهر", - "months": {"2": "شهرين", "ten": "{0} أشهر", "higher": "{0} شهر"}, - "year": "سنة", - "years": {"2": "سنتين", "ten": "{0} سنوات", "higher": "{0} سنة"}, - } - - month_names = [ - "", - "يناير", - "فبراير", - "مارس", - "أبريل", - "مايو", - "يونيو", - "يوليو", - "أغسطس", - "سبتمبر", - "أكتوبر", - "نوفمبر", - "ديسمبر", - ] - month_abbreviations = [ - "", - "يناير", - "فبراير", - "مارس", - "أبريل", - "مايو", - "يونيو", - "يوليو", - "أغسطس", - "سبتمبر", - "أكتوبر", - "نوفمبر", - "ديسمبر", - ] - - day_names = [ - "", - "الإثنين", - "الثلاثاء", - "الأربعاء", - "الخميس", - "الجمعة", - "السبت", - "الأحد", - ] - day_abbreviations = ["", "إثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت", "أحد"] - - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - form = self.timeframes[timeframe] - delta = abs(delta) - if isinstance(form, Mapping): - if delta == 2: - form = form["2"] - elif 2 < delta <= 10: - form = form["ten"] - else: - form = form["higher"] - - return form.format(delta) - - -class LevantArabicLocale(ArabicLocale): - names = ["ar-iq", "ar-jo", "ar-lb", "ar-ps", "ar-sy"] - month_names = [ - "", - "كانون الثاني", - "شباط", - "آذار", - "نيسان", - "أيار", - "حزيران", - "تموز", - "آب", - "أيلول", - "تشرين الأول", - "تشرين الثاني", - "كانون الأول", - ] - month_abbreviations = [ - "", - "كانون الثاني", - "شباط", - "آذار", - "نيسان", - "أيار", - "حزيران", - "تموز", - "آب", - "أيلول", - "تشرين الأول", - "تشرين الثاني", - "كانون الأول", - ] - - -class AlgeriaTunisiaArabicLocale(ArabicLocale): - names = ["ar-tn", "ar-dz"] - month_names = [ - "", - "جانفي", - "فيفري", - "مارس", - "أفريل", - "ماي", - "جوان", - "جويلية", - "أوت", - "سبتمبر", - "أكتوبر", - "نوفمبر", - "ديسمبر", - ] - month_abbreviations = [ - "", - "جانفي", - "فيفري", - "مارس", - "أفريل", - "ماي", - "جوان", - "جويلية", - "أوت", - "سبتمبر", - "أكتوبر", - "نوفمبر", - "ديسمبر", - ] - - -class MauritaniaArabicLocale(ArabicLocale): - names = ["ar-mr"] - month_names = [ - "", - "يناير", - "فبراير", - "مارس", - "إبريل", - "مايو", - "يونيو", - "يوليو", - "أغشت", - "شتمبر", - "أكتوبر", - "نوفمبر", - "دجمبر", - ] - month_abbreviations = [ - "", - "يناير", - "فبراير", - "مارس", - "إبريل", - "مايو", - "يونيو", - "يوليو", - "أغشت", - "شتمبر", - "أكتوبر", - "نوفمبر", - "دجمبر", - ] - - -class MoroccoArabicLocale(ArabicLocale): - names = ["ar-ma"] - month_names = [ - "", - "يناير", - "فبراير", - "مارس", - "أبريل", - "ماي", - "يونيو", - "يوليوز", - "غشت", - "شتنبر", - "أكتوبر", - "نونبر", - "دجنبر", - ] - month_abbreviations = [ - "", - "يناير", - "فبراير", - "مارس", - "أبريل", - "ماي", - "يونيو", - "يوليوز", - "غشت", - "شتنبر", - "أكتوبر", - "نونبر", - "دجنبر", - ] - - -class IcelandicLocale(Locale): - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - form = self.timeframes[timeframe] - - if isinstance(form, Mapping): - if delta < 0: - form = form["past"] - elif delta > 0: - form = form["future"] - else: - raise ValueError( - "Icelandic Locale does not support units with a delta of zero. " - "Please consider making a contribution to fix this issue." - ) - # FIXME: handle when delta is 0 - - return form.format(abs(delta)) - - names = ["is", "is-is"] - - past = "fyrir {0} síðan" - future = "eftir {0}" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "rétt í þessu", - "second": {"past": "sekúndu", "future": "sekúndu"}, - "seconds": {"past": "{0} nokkrum sekúndum", "future": "nokkrar sekúndur"}, - "minute": {"past": "einni mínútu", "future": "eina mínútu"}, - "minutes": {"past": "{0} mínútum", "future": "{0} mínútur"}, - "hour": {"past": "einum tíma", "future": "einn tíma"}, - "hours": {"past": "{0} tímum", "future": "{0} tíma"}, - "day": {"past": "einum degi", "future": "einn dag"}, - "days": {"past": "{0} dögum", "future": "{0} daga"}, - "month": {"past": "einum mánuði", "future": "einn mánuð"}, - "months": {"past": "{0} mánuðum", "future": "{0} mánuði"}, - "year": {"past": "einu ári", "future": "eitt ár"}, - "years": {"past": "{0} árum", "future": "{0} ár"}, - } - - meridians = {"am": "f.h.", "pm": "e.h.", "AM": "f.h.", "PM": "e.h."} - - month_names = [ - "", - "janúar", - "febrúar", - "mars", - "apríl", - "maí", - "júní", - "júlí", - "ágúst", - "september", - "október", - "nóvember", - "desember", - ] - month_abbreviations = [ - "", - "jan", - "feb", - "mar", - "apr", - "maí", - "jún", - "júl", - "ágú", - "sep", - "okt", - "nóv", - "des", - ] - - day_names = [ - "", - "mánudagur", - "þriðjudagur", - "miðvikudagur", - "fimmtudagur", - "föstudagur", - "laugardagur", - "sunnudagur", - ] - day_abbreviations = ["", "mán", "þri", "mið", "fim", "fös", "lau", "sun"] - - -class DanishLocale(Locale): - names = ["da", "da-dk"] - - past = "for {0} siden" - future = "om {0}" - and_word = "og" - - timeframes = { - "now": "lige nu", - "second": "et sekund", - "seconds": "{0} sekunder", - "minute": "et minut", - "minutes": "{0} minutter", - "hour": "en time", - "hours": "{0} timer", - "day": "en dag", - "days": "{0} dage", - "week": "en uge", - "weeks": "{0} uger", - "month": "en måned", - "months": "{0} måneder", - "year": "et år", - "years": "{0} år", - } - - month_names = [ - "", - "januar", - "februar", - "marts", - "april", - "maj", - "juni", - "juli", - "august", - "september", - "oktober", - "november", - "december", - ] - month_abbreviations = [ - "", - "jan", - "feb", - "mar", - "apr", - "maj", - "jun", - "jul", - "aug", - "sep", - "okt", - "nov", - "dec", - ] - - day_names = [ - "", - "mandag", - "tirsdag", - "onsdag", - "torsdag", - "fredag", - "lørdag", - "søndag", - ] - day_abbreviations = ["", "man", "tir", "ons", "tor", "fre", "lør", "søn"] - - def _ordinal_number(self, n: int) -> str: - return f"{n}." - - -class MalayalamLocale(Locale): - names = ["ml"] - - past = "{0} മുമ്പ്" - future = "{0} ശേഷം" - - timeframes = { - "now": "ഇപ്പോൾ", - "second": "ഒരു നിമിഷം", - "seconds": "{0} സെക്കന്റ്‌", - "minute": "ഒരു മിനിറ്റ്", - "minutes": "{0} മിനിറ്റ്", - "hour": "ഒരു മണിക്കൂർ", - "hours": "{0} മണിക്കൂർ", - "day": "ഒരു ദിവസം ", - "days": "{0} ദിവസം ", - "month": "ഒരു മാസം ", - "months": "{0} മാസം ", - "year": "ഒരു വർഷം ", - "years": "{0} വർഷം ", - } - - meridians = { - "am": "രാവിലെ", - "pm": "ഉച്ചക്ക് ശേഷം", - "AM": "രാവിലെ", - "PM": "ഉച്ചക്ക് ശേഷം", - } - - month_names = [ - "", - "ജനുവരി", - "ഫെബ്രുവരി", - "മാർച്ച്‌", - "ഏപ്രിൽ ", - "മെയ്‌ ", - "ജൂണ്‍", - "ജൂലൈ", - "ഓഗസ്റ്റ്‌", - "സെപ്റ്റംബർ", - "ഒക്ടോബർ", - "നവംബർ", - "ഡിസംബർ", - ] - month_abbreviations = [ - "", - "ജനു", - "ഫെബ് ", - "മാർ", - "ഏപ്രിൽ", - "മേയ്", - "ജൂണ്‍", - "ജൂലൈ", - "ഓഗസ്റ", - "സെപ്റ്റ", - "ഒക്ടോ", - "നവം", - "ഡിസം", - ] - - day_names = ["", "തിങ്കള്‍", "ചൊവ്വ", "ബുധന്‍", "വ്യാഴം", "വെള്ളി", "ശനി", "ഞായര്‍"] - day_abbreviations = [ - "", - "തിങ്കള്‍", - "ചൊവ്വ", - "ബുധന്‍", - "വ്യാഴം", - "വെള്ളി", - "ശനി", - "ഞായര്‍", - ] - - -class HindiLocale(Locale): - names = ["hi", "hi-in"] - - past = "{0} पहले" - future = "{0} बाद" - - timeframes = { - "now": "अभी", - "second": "एक पल", - "seconds": "{0} सेकंड्", - "minute": "एक मिनट ", - "minutes": "{0} मिनट ", - "hour": "एक घंटा", - "hours": "{0} घंटे", - "day": "एक दिन", - "days": "{0} दिन", - "month": "एक माह ", - "months": "{0} महीने ", - "year": "एक वर्ष ", - "years": "{0} साल ", - } - - meridians = {"am": "सुबह", "pm": "शाम", "AM": "सुबह", "PM": "शाम"} - - month_names = [ - "", - "जनवरी", - "फरवरी", - "मार्च", - "अप्रैल ", - "मई", - "जून", - "जुलाई", - "अगस्त", - "सितंबर", - "अक्टूबर", - "नवंबर", - "दिसंबर", - ] - month_abbreviations = [ - "", - "जन", - "फ़र", - "मार्च", - "अप्रै", - "मई", - "जून", - "जुलाई", - "आग", - "सित", - "अकत", - "नवे", - "दिस", - ] - - day_names = [ - "", - "सोमवार", - "मंगलवार", - "बुधवार", - "गुरुवार", - "शुक्रवार", - "शनिवार", - "रविवार", - ] - day_abbreviations = ["", "सोम", "मंगल", "बुध", "गुरुवार", "शुक्र", "शनि", "रवि"] - - -class CzechLocale(Locale): - names = ["cs", "cs-cz"] - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "Teď", - "second": {"past": "vteřina", "future": "vteřina"}, - "seconds": { - "zero": "vteřina", - "past": "{0} sekundami", - "future-singular": "{0} sekundy", - "future-paucal": "{0} sekund", - }, - "minute": {"past": "minutou", "future": "minutu"}, - "minutes": { - "zero": "{0} minut", - "past": "{0} minutami", - "future-singular": "{0} minuty", - "future-paucal": "{0} minut", - }, - "hour": {"past": "hodinou", "future": "hodinu"}, - "hours": { - "zero": "{0} hodin", - "past": "{0} hodinami", - "future-singular": "{0} hodiny", - "future-paucal": "{0} hodin", - }, - "day": {"past": "dnem", "future": "den"}, - "days": { - "zero": "{0} dnů", - "past": "{0} dny", - "future-singular": "{0} dny", - "future-paucal": "{0} dnů", - }, - "week": {"past": "týdnem", "future": "týden"}, - "weeks": { - "zero": "{0} týdnů", - "past": "{0} týdny", - "future-singular": "{0} týdny", - "future-paucal": "{0} týdnů", - }, - "month": {"past": "měsícem", "future": "měsíc"}, - "months": { - "zero": "{0} měsíců", - "past": "{0} měsíci", - "future-singular": "{0} měsíce", - "future-paucal": "{0} měsíců", - }, - "year": {"past": "rokem", "future": "rok"}, - "years": { - "zero": "{0} let", - "past": "{0} lety", - "future-singular": "{0} roky", - "future-paucal": "{0} let", - }, - } - - past = "Před {0}" - future = "Za {0}" - - month_names = [ - "", - "leden", - "únor", - "březen", - "duben", - "květen", - "červen", - "červenec", - "srpen", - "září", - "říjen", - "listopad", - "prosinec", - ] - month_abbreviations = [ - "", - "led", - "úno", - "bře", - "dub", - "kvě", - "čvn", - "čvc", - "srp", - "zář", - "říj", - "lis", - "pro", - ] - - day_names = [ - "", - "pondělí", - "úterý", - "středa", - "čtvrtek", - "pátek", - "sobota", - "neděle", - ] - day_abbreviations = ["", "po", "út", "st", "čt", "pá", "so", "ne"] - - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - """Czech aware time frame format function, takes into account - the differences between past and future forms.""" - abs_delta = abs(delta) - form = self.timeframes[timeframe] - - if isinstance(form, str): - return form.format(abs_delta) - - if delta == 0: - key = "zero" # And *never* use 0 in the singular! - elif delta < 0: - key = "past" - else: - # Needed since both regular future and future-singular and future-paucal cases - if "future-singular" not in form: - key = "future" - elif 2 <= abs_delta % 10 <= 4 and ( - abs_delta % 100 < 10 or abs_delta % 100 >= 20 - ): - key = "future-singular" - else: - key = "future-paucal" - - form: str = form[key] - return form.format(abs_delta) - - -class SlovakLocale(Locale): - names = ["sk", "sk-sk"] - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "Teraz", - "second": {"past": "sekundou", "future": "sekundu"}, - "seconds": { - "zero": "{0} sekúnd", - "past": "{0} sekundami", - "future-singular": "{0} sekundy", - "future-paucal": "{0} sekúnd", - }, - "minute": {"past": "minútou", "future": "minútu"}, - "minutes": { - "zero": "{0} minút", - "past": "{0} minútami", - "future-singular": "{0} minúty", - "future-paucal": "{0} minút", - }, - "hour": {"past": "hodinou", "future": "hodinu"}, - "hours": { - "zero": "{0} hodín", - "past": "{0} hodinami", - "future-singular": "{0} hodiny", - "future-paucal": "{0} hodín", - }, - "day": {"past": "dňom", "future": "deň"}, - "days": { - "zero": "{0} dní", - "past": "{0} dňami", - "future-singular": "{0} dni", - "future-paucal": "{0} dní", - }, - "week": {"past": "týždňom", "future": "týždeň"}, - "weeks": { - "zero": "{0} týždňov", - "past": "{0} týždňami", - "future-singular": "{0} týždne", - "future-paucal": "{0} týždňov", - }, - "month": {"past": "mesiacom", "future": "mesiac"}, - "months": { - "zero": "{0} mesiacov", - "past": "{0} mesiacmi", - "future-singular": "{0} mesiace", - "future-paucal": "{0} mesiacov", - }, - "year": {"past": "rokom", "future": "rok"}, - "years": { - "zero": "{0} rokov", - "past": "{0} rokmi", - "future-singular": "{0} roky", - "future-paucal": "{0} rokov", - }, - } - - past = "Pred {0}" - future = "O {0}" - and_word = "a" - - month_names = [ - "", - "január", - "február", - "marec", - "apríl", - "máj", - "jún", - "júl", - "august", - "september", - "október", - "november", - "december", - ] - month_abbreviations = [ - "", - "jan", - "feb", - "mar", - "apr", - "máj", - "jún", - "júl", - "aug", - "sep", - "okt", - "nov", - "dec", - ] - - day_names = [ - "", - "pondelok", - "utorok", - "streda", - "štvrtok", - "piatok", - "sobota", - "nedeľa", - ] - day_abbreviations = ["", "po", "ut", "st", "št", "pi", "so", "ne"] - - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - """Slovak aware time frame format function, takes into account - the differences between past and future forms.""" - abs_delta = abs(delta) - form = self.timeframes[timeframe] - - if isinstance(form, str): - return form.format(abs_delta) - - if delta == 0: - key = "zero" # And *never* use 0 in the singular! - elif delta < 0: - key = "past" - else: - if "future-singular" not in form: - key = "future" - elif 2 <= abs_delta % 10 <= 4 and ( - abs_delta % 100 < 10 or abs_delta % 100 >= 20 - ): - key = "future-singular" - else: - key = "future-paucal" - - form: str = form[key] - return form.format(abs_delta) - - -class FarsiLocale(Locale): - names = ["fa", "fa-ir"] - - past = "{0} قبل" - future = "در {0}" - - timeframes = { - "now": "اکنون", - "second": "یک لحظه", - "seconds": "{0} ثانیه", - "minute": "یک دقیقه", - "minutes": "{0} دقیقه", - "hour": "یک ساعت", - "hours": "{0} ساعت", - "day": "یک روز", - "days": "{0} روز", - "month": "یک ماه", - "months": "{0} ماه", - "year": "یک سال", - "years": "{0} سال", - } - - meridians = { - "am": "قبل از ظهر", - "pm": "بعد از ظهر", - "AM": "قبل از ظهر", - "PM": "بعد از ظهر", - } - - month_names = [ - "", - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ] - month_abbreviations = [ - "", - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - ] - - day_names = [ - "", - "دو شنبه", - "سه شنبه", - "چهارشنبه", - "پنجشنبه", - "جمعه", - "شنبه", - "یکشنبه", - ] - day_abbreviations = ["", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] - - -class HebrewLocale(Locale): - names = ["he", "he-il"] - - past = "לפני {0}" - future = "בעוד {0}" - and_word = "ו" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "הרגע", - "second": "שנייה", - "seconds": "{0} שניות", - "minute": "דקה", - "minutes": "{0} דקות", - "hour": "שעה", - "hours": {"2": "שעתיים", "ten": "{0} שעות", "higher": "{0} שעות"}, - "day": "יום", - "days": {"2": "יומיים", "ten": "{0} ימים", "higher": "{0} יום"}, - "week": "שבוע", - "weeks": {"2": "שבועיים", "ten": "{0} שבועות", "higher": "{0} שבועות"}, - "month": "חודש", - "months": {"2": "חודשיים", "ten": "{0} חודשים", "higher": "{0} חודשים"}, - "year": "שנה", - "years": {"2": "שנתיים", "ten": "{0} שנים", "higher": "{0} שנה"}, - } - - meridians = { - "am": 'לפנ"צ', - "pm": 'אחר"צ', - "AM": "לפני הצהריים", - "PM": "אחרי הצהריים", - } - - month_names = [ - "", - "ינואר", - "פברואר", - "מרץ", - "אפריל", - "מאי", - "יוני", - "יולי", - "אוגוסט", - "ספטמבר", - "אוקטובר", - "נובמבר", - "דצמבר", - ] - month_abbreviations = [ - "", - "ינו׳", - "פבר׳", - "מרץ", - "אפר׳", - "מאי", - "יוני", - "יולי", - "אוג׳", - "ספט׳", - "אוק׳", - "נוב׳", - "דצמ׳", - ] - - day_names = ["", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת", "ראשון"] - day_abbreviations = ["", "ב׳", "ג׳", "ד׳", "ה׳", "ו׳", "ש׳", "א׳"] - - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - form = self.timeframes[timeframe] - delta = abs(delta) - if isinstance(form, Mapping): - if delta == 2: - form = form["2"] - elif delta == 0 or 2 < delta <= 10: - form = form["ten"] - else: - form = form["higher"] - - return form.format(delta) - - def describe_multi( - self, - timeframes: Sequence[Tuple[TimeFrameLiteral, Union[int, float]]], - only_distance: bool = False, - ) -> str: - """Describes a delta within multiple timeframes in plain language. - In Hebrew, the and word behaves a bit differently. - - :param timeframes: a list of string, quantity pairs each representing a timeframe and delta. - :param only_distance: return only distance eg: "2 hours and 11 seconds" without "in" or "ago" keywords - """ - - humanized = "" - for index, (timeframe, delta) in enumerate(timeframes): - last_humanized = self._format_timeframe(timeframe, trunc(delta)) - if index == 0: - humanized = last_humanized - elif index == len(timeframes) - 1: # Must have at least 2 items - humanized += " " + self.and_word - if last_humanized[0].isdecimal(): - humanized += "־" - humanized += last_humanized - else: # Don't add for the last one - humanized += ", " + last_humanized - - if not only_distance: - humanized = self._format_relative(humanized, timeframe, trunc(delta)) - - return humanized - - -class MarathiLocale(Locale): - names = ["mr"] - - past = "{0} आधी" - future = "{0} नंतर" - - timeframes = { - "now": "सद्य", - "second": "एक सेकंद", - "seconds": "{0} सेकंद", - "minute": "एक मिनिट ", - "minutes": "{0} मिनिट ", - "hour": "एक तास", - "hours": "{0} तास", - "day": "एक दिवस", - "days": "{0} दिवस", - "month": "एक महिना ", - "months": "{0} महिने ", - "year": "एक वर्ष ", - "years": "{0} वर्ष ", - } - - meridians = {"am": "सकाळ", "pm": "संध्याकाळ", "AM": "सकाळ", "PM": "संध्याकाळ"} - - month_names = [ - "", - "जानेवारी", - "फेब्रुवारी", - "मार्च", - "एप्रिल", - "मे", - "जून", - "जुलै", - "अॉगस्ट", - "सप्टेंबर", - "अॉक्टोबर", - "नोव्हेंबर", - "डिसेंबर", - ] - month_abbreviations = [ - "", - "जान", - "फेब्रु", - "मार्च", - "एप्रि", - "मे", - "जून", - "जुलै", - "अॉग", - "सप्टें", - "अॉक्टो", - "नोव्हें", - "डिसें", - ] - - day_names = [ - "", - "सोमवार", - "मंगळवार", - "बुधवार", - "गुरुवार", - "शुक्रवार", - "शनिवार", - "रविवार", - ] - day_abbreviations = ["", "सोम", "मंगळ", "बुध", "गुरु", "शुक्र", "शनि", "रवि"] - - -class CatalanLocale(Locale): - names = ["ca", "ca-es", "ca-ad", "ca-fr", "ca-it"] - past = "Fa {0}" - future = "En {0}" - and_word = "i" - - timeframes = { - "now": "Ara mateix", - "second": "un segon", - "seconds": "{0} segons", - "minute": "un minut", - "minutes": "{0} minuts", - "hour": "una hora", - "hours": "{0} hores", - "day": "un dia", - "days": "{0} dies", - "month": "un mes", - "months": "{0} mesos", - "year": "un any", - "years": "{0} anys", - } - - month_names = [ - "", - "gener", - "febrer", - "març", - "abril", - "maig", - "juny", - "juliol", - "agost", - "setembre", - "octubre", - "novembre", - "desembre", - ] - month_abbreviations = [ - "", - "gen.", - "febr.", - "març", - "abr.", - "maig", - "juny", - "jul.", - "ag.", - "set.", - "oct.", - "nov.", - "des.", - ] - day_names = [ - "", - "dilluns", - "dimarts", - "dimecres", - "dijous", - "divendres", - "dissabte", - "diumenge", - ] - day_abbreviations = [ - "", - "dl.", - "dt.", - "dc.", - "dj.", - "dv.", - "ds.", - "dg.", - ] - - -class BasqueLocale(Locale): - names = ["eu", "eu-eu"] - past = "duela {0}" - future = "{0}" # I don't know what's the right phrase in Basque for the future. - - timeframes = { - "now": "Orain", - "second": "segundo bat", - "seconds": "{0} segundu", - "minute": "minutu bat", - "minutes": "{0} minutu", - "hour": "ordu bat", - "hours": "{0} ordu", - "day": "egun bat", - "days": "{0} egun", - "month": "hilabete bat", - "months": "{0} hilabet", - "year": "urte bat", - "years": "{0} urte", - } - - month_names = [ - "", - "urtarrilak", - "otsailak", - "martxoak", - "apirilak", - "maiatzak", - "ekainak", - "uztailak", - "abuztuak", - "irailak", - "urriak", - "azaroak", - "abenduak", - ] - month_abbreviations = [ - "", - "urt", - "ots", - "mar", - "api", - "mai", - "eka", - "uzt", - "abu", - "ira", - "urr", - "aza", - "abe", - ] - day_names = [ - "", - "astelehena", - "asteartea", - "asteazkena", - "osteguna", - "ostirala", - "larunbata", - "igandea", - ] - day_abbreviations = ["", "al", "ar", "az", "og", "ol", "lr", "ig"] - - -class HungarianLocale(Locale): - names = ["hu", "hu-hu"] - - past = "{0} ezelőtt" - future = "{0} múlva" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "éppen most", - "second": {"past": "egy második", "future": "egy második"}, - "seconds": {"past": "{0} másodpercekkel", "future": "{0} pár másodperc"}, - "minute": {"past": "egy perccel", "future": "egy perc"}, - "minutes": {"past": "{0} perccel", "future": "{0} perc"}, - "hour": {"past": "egy órával", "future": "egy óra"}, - "hours": {"past": "{0} órával", "future": "{0} óra"}, - "day": {"past": "egy nappal", "future": "egy nap"}, - "days": {"past": "{0} nappal", "future": "{0} nap"}, - "month": {"past": "egy hónappal", "future": "egy hónap"}, - "months": {"past": "{0} hónappal", "future": "{0} hónap"}, - "year": {"past": "egy évvel", "future": "egy év"}, - "years": {"past": "{0} évvel", "future": "{0} év"}, - } - - month_names = [ - "", - "január", - "február", - "március", - "április", - "május", - "június", - "július", - "augusztus", - "szeptember", - "október", - "november", - "december", - ] - month_abbreviations = [ - "", - "jan", - "febr", - "márc", - "ápr", - "máj", - "jún", - "júl", - "aug", - "szept", - "okt", - "nov", - "dec", - ] - - day_names = [ - "", - "hétfő", - "kedd", - "szerda", - "csütörtök", - "péntek", - "szombat", - "vasárnap", - ] - day_abbreviations = ["", "hét", "kedd", "szer", "csüt", "pént", "szom", "vas"] - - meridians = {"am": "de", "pm": "du", "AM": "DE", "PM": "DU"} - - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - form = self.timeframes[timeframe] - - if isinstance(form, Mapping): - if delta > 0: - form = form["future"] - else: - form = form["past"] - - return form.format(abs(delta)) - - -class EsperantoLocale(Locale): - names = ["eo", "eo-xx"] - past = "antaŭ {0}" - future = "post {0}" - - timeframes = { - "now": "nun", - "second": "sekundo", - "seconds": "{0} kelkaj sekundoj", - "minute": "unu minuto", - "minutes": "{0} minutoj", - "hour": "un horo", - "hours": "{0} horoj", - "day": "unu tago", - "days": "{0} tagoj", - "month": "unu monato", - "months": "{0} monatoj", - "year": "unu jaro", - "years": "{0} jaroj", - } - - month_names = [ - "", - "januaro", - "februaro", - "marto", - "aprilo", - "majo", - "junio", - "julio", - "aŭgusto", - "septembro", - "oktobro", - "novembro", - "decembro", - ] - month_abbreviations = [ - "", - "jan", - "feb", - "mar", - "apr", - "maj", - "jun", - "jul", - "aŭg", - "sep", - "okt", - "nov", - "dec", - ] - - day_names = [ - "", - "lundo", - "mardo", - "merkredo", - "ĵaŭdo", - "vendredo", - "sabato", - "dimanĉo", - ] - day_abbreviations = ["", "lun", "mar", "mer", "ĵaŭ", "ven", "sab", "dim"] - - meridians = {"am": "atm", "pm": "ptm", "AM": "ATM", "PM": "PTM"} - - ordinal_day_re = r"((?P[1-3]?[0-9](?=a))a)" - - def _ordinal_number(self, n: int) -> str: - return f"{n}a" - - -class ThaiLocale(Locale): - names = ["th", "th-th"] - - past = "{0} ที่ผ่านมา" - future = "ในอีก {0}" - - timeframes = { - "now": "ขณะนี้", - "second": "วินาที", - "seconds": "{0} ไม่กี่วินาที", - "minute": "1 นาที", - "minutes": "{0} นาที", - "hour": "1 ชั่วโมง", - "hours": "{0} ชั่วโมง", - "day": "1 วัน", - "days": "{0} วัน", - "month": "1 เดือน", - "months": "{0} เดือน", - "year": "1 ปี", - "years": "{0} ปี", - } - - month_names = [ - "", - "มกราคม", - "กุมภาพันธ์", - "มีนาคม", - "เมษายน", - "พฤษภาคม", - "มิถุนายน", - "กรกฎาคม", - "สิงหาคม", - "กันยายน", - "ตุลาคม", - "พฤศจิกายน", - "ธันวาคม", - ] - month_abbreviations = [ - "", - "ม.ค.", - "ก.พ.", - "มี.ค.", - "เม.ย.", - "พ.ค.", - "มิ.ย.", - "ก.ค.", - "ส.ค.", - "ก.ย.", - "ต.ค.", - "พ.ย.", - "ธ.ค.", - ] - - day_names = ["", "จันทร์", "อังคาร", "พุธ", "พฤหัสบดี", "ศุกร์", "เสาร์", "อาทิตย์"] - day_abbreviations = ["", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"] - - meridians = {"am": "am", "pm": "pm", "AM": "AM", "PM": "PM"} - - BE_OFFSET = 543 - - def year_full(self, year: int) -> str: - """Thai always use Buddhist Era (BE) which is CE + 543""" - year += self.BE_OFFSET - return f"{year:04d}" - - def year_abbreviation(self, year: int) -> str: - """Thai always use Buddhist Era (BE) which is CE + 543""" - year += self.BE_OFFSET - return f"{year:04d}"[2:] - - def _format_relative( - self, - humanized: str, - timeframe: TimeFrameLiteral, - delta: Union[float, int], - ) -> str: - """Thai normally doesn't have any space between words""" - if timeframe == "now": - return humanized - - direction = self.past if delta < 0 else self.future - relative_string = direction.format(humanized) - - if timeframe == "seconds": - relative_string = relative_string.replace(" ", "") - - return relative_string - - -class LaotianLocale(Locale): - - names = ["lo", "lo-la"] - - past = "{0} ກ່ອນຫນ້ານີ້" - future = "ໃນ {0}" - - timeframes = { - "now": "ດຽວນີ້", - "second": "ວິນາທີ", - "seconds": "{0} ວິນາທີ", - "minute": "ນາທີ", - "minutes": "{0} ນາທີ", - "hour": "ຊົ່ວໂມງ", - "hours": "{0} ຊົ່ວໂມງ", - "day": "ມື້", - "days": "{0} ມື້", - "week": "ອາທິດ", - "weeks": "{0} ອາທິດ", - "month": "ເດືອນ", - "months": "{0} ເດືອນ", - "year": "ປີ", - "years": "{0} ປີ", - } - - month_names = [ - "", - "ມັງກອນ", # mangkon - "ກຸມພາ", # kumpha - "ມີນາ", # mina - "ເມສາ", # mesa - "ພຶດສະພາ", # phudsapha - "ມິຖຸນາ", # mithuna - "ກໍລະກົດ", # kolakod - "ສິງຫາ", # singha - "ກັນຍາ", # knaia - "ຕຸລາ", # tula - "ພະຈິກ", # phachik - "ທັນວາ", # thanuaa - ] - month_abbreviations = [ - "", - "ມັງກອນ", - "ກຸມພາ", - "ມີນາ", - "ເມສາ", - "ພຶດສະພາ", - "ມິຖຸນາ", - "ກໍລະກົດ", - "ສິງຫາ", - "ກັນຍາ", - "ຕຸລາ", - "ພະຈິກ", - "ທັນວາ", - ] - - day_names = [ - "", - "ວັນຈັນ", # vanchan - "ວັນອັງຄານ", # vnoangkhan - "ວັນພຸດ", # vanphud - "ວັນພະຫັດ", # vanphahad - "ວັນ​ສຸກ", # vansuk - "ວັນເສົາ", # vansao - "ວັນອາທິດ", # vnoathid - ] - day_abbreviations = [ - "", - "ວັນຈັນ", - "ວັນອັງຄານ", - "ວັນພຸດ", - "ວັນພະຫັດ", - "ວັນ​ສຸກ", - "ວັນເສົາ", - "ວັນອາທິດ", - ] - - BE_OFFSET = 543 - - def year_full(self, year: int) -> str: - """Lao always use Buddhist Era (BE) which is CE + 543""" - year += self.BE_OFFSET - return f"{year:04d}" - - def year_abbreviation(self, year: int) -> str: - """Lao always use Buddhist Era (BE) which is CE + 543""" - year += self.BE_OFFSET - return f"{year:04d}"[2:] - - def _format_relative( - self, - humanized: str, - timeframe: TimeFrameLiteral, - delta: Union[float, int], - ) -> str: - """Lao normally doesn't have any space between words""" - if timeframe == "now": - return humanized - - direction = self.past if delta < 0 else self.future - relative_string = direction.format(humanized) - - if timeframe == "seconds": - relative_string = relative_string.replace(" ", "") - - return relative_string - - -class BengaliLocale(Locale): - names = ["bn", "bn-bd", "bn-in"] - - past = "{0} আগে" - future = "{0} পরে" - - timeframes = { - "now": "এখন", - "second": "একটি দ্বিতীয়", - "seconds": "{0} সেকেন্ড", - "minute": "এক মিনিট", - "minutes": "{0} মিনিট", - "hour": "এক ঘণ্টা", - "hours": "{0} ঘণ্টা", - "day": "এক দিন", - "days": "{0} দিন", - "month": "এক মাস", - "months": "{0} মাস ", - "year": "এক বছর", - "years": "{0} বছর", - } - - meridians = {"am": "সকাল", "pm": "বিকাল", "AM": "সকাল", "PM": "বিকাল"} - - month_names = [ - "", - "জানুয়ারি", - "ফেব্রুয়ারি", - "মার্চ", - "এপ্রিল", - "মে", - "জুন", - "জুলাই", - "আগস্ট", - "সেপ্টেম্বর", - "অক্টোবর", - "নভেম্বর", - "ডিসেম্বর", - ] - month_abbreviations = [ - "", - "জানু", - "ফেব", - "মার্চ", - "এপ্রি", - "মে", - "জুন", - "জুল", - "অগা", - "সেপ্ট", - "অক্টো", - "নভে", - "ডিসে", - ] - - day_names = [ - "", - "সোমবার", - "মঙ্গলবার", - "বুধবার", - "বৃহস্পতিবার", - "শুক্রবার", - "শনিবার", - "রবিবার", - ] - day_abbreviations = ["", "সোম", "মঙ্গল", "বুধ", "বৃহঃ", "শুক্র", "শনি", "রবি"] - - def _ordinal_number(self, n: int) -> str: - if n > 10 or n == 0: - return f"{n}তম" - if n in [1, 5, 7, 8, 9, 10]: - return f"{n}ম" - if n in [2, 3]: - return f"{n}য়" - if n == 4: - return f"{n}র্থ" - if n == 6: - return f"{n}ষ্ঠ" - - -class RomanshLocale(Locale): - names = ["rm", "rm-ch"] - - past = "avant {0}" - future = "en {0}" - - timeframes = { - "now": "en quest mument", - "second": "in secunda", - "seconds": "{0} secundas", - "minute": "ina minuta", - "minutes": "{0} minutas", - "hour": "in'ura", - "hours": "{0} ura", - "day": "in di", - "days": "{0} dis", - "month": "in mais", - "months": "{0} mais", - "year": "in onn", - "years": "{0} onns", - } - - month_names = [ - "", - "schaner", - "favrer", - "mars", - "avrigl", - "matg", - "zercladur", - "fanadur", - "avust", - "settember", - "october", - "november", - "december", - ] - - month_abbreviations = [ - "", - "schan", - "fav", - "mars", - "avr", - "matg", - "zer", - "fan", - "avu", - "set", - "oct", - "nov", - "dec", - ] - - day_names = [ - "", - "glindesdi", - "mardi", - "mesemna", - "gievgia", - "venderdi", - "sonda", - "dumengia", - ] - - day_abbreviations = ["", "gli", "ma", "me", "gie", "ve", "so", "du"] - - -class RomanianLocale(Locale): - names = ["ro", "ro-ro"] - - past = "{0} în urmă" - future = "peste {0}" - and_word = "și" - - timeframes = { - "now": "acum", - "second": "o secunda", - "seconds": "{0} câteva secunde", - "minute": "un minut", - "minutes": "{0} minute", - "hour": "o oră", - "hours": "{0} ore", - "day": "o zi", - "days": "{0} zile", - "month": "o lună", - "months": "{0} luni", - "year": "un an", - "years": "{0} ani", - } - - month_names = [ - "", - "ianuarie", - "februarie", - "martie", - "aprilie", - "mai", - "iunie", - "iulie", - "august", - "septembrie", - "octombrie", - "noiembrie", - "decembrie", - ] - month_abbreviations = [ - "", - "ian", - "febr", - "mart", - "apr", - "mai", - "iun", - "iul", - "aug", - "sept", - "oct", - "nov", - "dec", - ] - - day_names = [ - "", - "luni", - "marți", - "miercuri", - "joi", - "vineri", - "sâmbătă", - "duminică", - ] - day_abbreviations = ["", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"] - - -class SlovenianLocale(Locale): - names = ["sl", "sl-si"] - - past = "pred {0}" - future = "čez {0}" - and_word = "in" - - timeframes = { - "now": "zdaj", - "second": "sekundo", - "seconds": "{0} sekund", - "minute": "minuta", - "minutes": "{0} minutami", - "hour": "uro", - "hours": "{0} ur", - "day": "dan", - "days": "{0} dni", - "month": "mesec", - "months": "{0} mesecev", - "year": "leto", - "years": "{0} let", - } - - meridians = {"am": "", "pm": "", "AM": "", "PM": ""} - - month_names = [ - "", - "Januar", - "Februar", - "Marec", - "April", - "Maj", - "Junij", - "Julij", - "Avgust", - "September", - "Oktober", - "November", - "December", - ] - - month_abbreviations = [ - "", - "Jan", - "Feb", - "Mar", - "Apr", - "Maj", - "Jun", - "Jul", - "Avg", - "Sep", - "Okt", - "Nov", - "Dec", - ] - - day_names = [ - "", - "Ponedeljek", - "Torek", - "Sreda", - "Četrtek", - "Petek", - "Sobota", - "Nedelja", - ] - - day_abbreviations = ["", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob", "Ned"] - - -class IndonesianLocale(Locale): - names = ["id", "id-id"] - - past = "{0} yang lalu" - future = "dalam {0}" - and_word = "dan" - - timeframes = { - "now": "baru saja", - "second": "1 sebentar", - "seconds": "{0} detik", - "minute": "1 menit", - "minutes": "{0} menit", - "hour": "1 jam", - "hours": "{0} jam", - "day": "1 hari", - "days": "{0} hari", - "week": "1 minggu", - "weeks": "{0} minggu", - "month": "1 bulan", - "months": "{0} bulan", - "quarter": "1 kuartal", - "quarters": "{0} kuartal", - "year": "1 tahun", - "years": "{0} tahun", - } - - meridians = {"am": "", "pm": "", "AM": "", "PM": ""} - - month_names = [ - "", - "Januari", - "Februari", - "Maret", - "April", - "Mei", - "Juni", - "Juli", - "Agustus", - "September", - "Oktober", - "November", - "Desember", - ] - - month_abbreviations = [ - "", - "Jan", - "Feb", - "Mar", - "Apr", - "Mei", - "Jun", - "Jul", - "Ags", - "Sept", - "Okt", - "Nov", - "Des", - ] - - day_names = ["", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"] - - day_abbreviations = [ - "", - "Senin", - "Selasa", - "Rabu", - "Kamis", - "Jumat", - "Sabtu", - "Minggu", - ] - - -class NepaliLocale(Locale): - names = ["ne", "ne-np"] - - past = "{0} पहिले" - future = "{0} पछी" - - timeframes = { - "now": "अहिले", - "second": "एक सेकेन्ड", - "seconds": "{0} सेकण्ड", - "minute": "मिनेट", - "minutes": "{0} मिनेट", - "hour": "एक घण्टा", - "hours": "{0} घण्टा", - "day": "एक दिन", - "days": "{0} दिन", - "month": "एक महिना", - "months": "{0} महिना", - "year": "एक बर्ष", - "years": "{0} बर्ष", - } - - meridians = {"am": "पूर्वाह्न", "pm": "अपरान्ह", "AM": "पूर्वाह्न", "PM": "अपरान्ह"} - - month_names = [ - "", - "जनवरी", - "फेब्रुअरी", - "मार्च", - "एप्रील", - "मे", - "जुन", - "जुलाई", - "अगष्ट", - "सेप्टेम्बर", - "अक्टोबर", - "नोवेम्बर", - "डिसेम्बर", - ] - month_abbreviations = [ - "", - "जन", - "फेब", - "मार्च", - "एप्रील", - "मे", - "जुन", - "जुलाई", - "अग", - "सेप", - "अक्ट", - "नोव", - "डिस", - ] - - day_names = [ - "", - "सोमवार", - "मंगलवार", - "बुधवार", - "बिहिवार", - "शुक्रवार", - "शनिवार", - "आइतवार", - ] - - day_abbreviations = ["", "सोम", "मंगल", "बुध", "बिहि", "शुक्र", "शनि", "आइत"] - - -class EstonianLocale(Locale): - names = ["ee", "et"] - - past = "{0} tagasi" - future = "{0} pärast" - and_word = "ja" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Mapping[str, str]]] = { - "now": {"past": "just nüüd", "future": "just nüüd"}, - "second": {"past": "üks sekund", "future": "ühe sekundi"}, - "seconds": {"past": "{0} sekundit", "future": "{0} sekundi"}, - "minute": {"past": "üks minut", "future": "ühe minuti"}, - "minutes": {"past": "{0} minutit", "future": "{0} minuti"}, - "hour": {"past": "tund aega", "future": "tunni aja"}, - "hours": {"past": "{0} tundi", "future": "{0} tunni"}, - "day": {"past": "üks päev", "future": "ühe päeva"}, - "days": {"past": "{0} päeva", "future": "{0} päeva"}, - "month": {"past": "üks kuu", "future": "ühe kuu"}, - "months": {"past": "{0} kuud", "future": "{0} kuu"}, - "year": {"past": "üks aasta", "future": "ühe aasta"}, - "years": {"past": "{0} aastat", "future": "{0} aasta"}, - } - - month_names = [ - "", - "Jaanuar", - "Veebruar", - "Märts", - "Aprill", - "Mai", - "Juuni", - "Juuli", - "August", - "September", - "Oktoober", - "November", - "Detsember", - ] - month_abbreviations = [ - "", - "Jan", - "Veb", - "Mär", - "Apr", - "Mai", - "Jun", - "Jul", - "Aug", - "Sep", - "Okt", - "Nov", - "Dets", - ] - - day_names = [ - "", - "Esmaspäev", - "Teisipäev", - "Kolmapäev", - "Neljapäev", - "Reede", - "Laupäev", - "Pühapäev", - ] - day_abbreviations = ["", "Esm", "Teis", "Kolm", "Nelj", "Re", "Lau", "Püh"] - - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - form = self.timeframes[timeframe] - if delta > 0: - _form = form["future"] - else: - _form = form["past"] - return _form.format(abs(delta)) - - -class LatvianLocale(Locale): - names = ["lv", "lv-lv"] - - past = "pirms {0}" - future = "pēc {0}" - and_word = "un" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "tagad", - "second": "sekundes", - "seconds": "{0} sekundēm", - "minute": "minūtes", - "minutes": "{0} minūtēm", - "hour": "stundas", - "hours": "{0} stundām", - "day": "dienas", - "days": "{0} dienām", - "week": "nedēļas", - "weeks": "{0} nedēļām", - "month": "mēneša", - "months": "{0} mēnešiem", - "year": "gada", - "years": "{0} gadiem", - } - - month_names = [ - "", - "janvāris", - "februāris", - "marts", - "aprīlis", - "maijs", - "jūnijs", - "jūlijs", - "augusts", - "septembris", - "oktobris", - "novembris", - "decembris", - ] - - month_abbreviations = [ - "", - "jan", - "feb", - "marts", - "apr", - "maijs", - "jūnijs", - "jūlijs", - "aug", - "sept", - "okt", - "nov", - "dec", - ] - - day_names = [ - "", - "pirmdiena", - "otrdiena", - "trešdiena", - "ceturtdiena", - "piektdiena", - "sestdiena", - "svētdiena", - ] - - day_abbreviations = [ - "", - "pi", - "ot", - "tr", - "ce", - "pi", - "se", - "sv", - ] - - -class SwahiliLocale(Locale): - names = [ - "sw", - "sw-ke", - "sw-tz", - ] - - past = "{0} iliyopita" - future = "muda wa {0}" - and_word = "na" - - timeframes = { - "now": "sasa hivi", - "second": "sekunde", - "seconds": "sekunde {0}", - "minute": "dakika moja", - "minutes": "dakika {0}", - "hour": "saa moja", - "hours": "saa {0}", - "day": "siku moja", - "days": "siku {0}", - "week": "wiki moja", - "weeks": "wiki {0}", - "month": "mwezi moja", - "months": "miezi {0}", - "year": "mwaka moja", - "years": "miaka {0}", - } - - meridians = {"am": "asu", "pm": "mch", "AM": "ASU", "PM": "MCH"} - - month_names = [ - "", - "Januari", - "Februari", - "Machi", - "Aprili", - "Mei", - "Juni", - "Julai", - "Agosti", - "Septemba", - "Oktoba", - "Novemba", - "Desemba", - ] - month_abbreviations = [ - "", - "Jan", - "Feb", - "Mac", - "Apr", - "Mei", - "Jun", - "Jul", - "Ago", - "Sep", - "Okt", - "Nov", - "Des", - ] - - day_names = [ - "", - "Jumatatu", - "Jumanne", - "Jumatano", - "Alhamisi", - "Ijumaa", - "Jumamosi", - "Jumapili", - ] - day_abbreviations = [ - "", - "Jumatatu", - "Jumanne", - "Jumatano", - "Alhamisi", - "Ijumaa", - "Jumamosi", - "Jumapili", - ] - - -class CroatianLocale(Locale): - names = ["hr", "hr-hr"] - - past = "prije {0}" - future = "za {0}" - and_word = "i" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "upravo sad", - "second": "sekundu", - "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"}, - "minute": "minutu", - "minutes": {"double": "{0} minute", "higher": "{0} minuta"}, - "hour": "sat", - "hours": {"double": "{0} sata", "higher": "{0} sati"}, - "day": "jedan dan", - "days": {"double": "{0} dana", "higher": "{0} dana"}, - "week": "tjedan", - "weeks": {"double": "{0} tjedna", "higher": "{0} tjedana"}, - "month": "mjesec", - "months": {"double": "{0} mjeseca", "higher": "{0} mjeseci"}, - "year": "godinu", - "years": {"double": "{0} godine", "higher": "{0} godina"}, - } - - month_names = [ - "", - "siječanj", - "veljača", - "ožujak", - "travanj", - "svibanj", - "lipanj", - "srpanj", - "kolovoz", - "rujan", - "listopad", - "studeni", - "prosinac", - ] - - month_abbreviations = [ - "", - "siječ", - "velj", - "ožuj", - "trav", - "svib", - "lip", - "srp", - "kol", - "ruj", - "list", - "stud", - "pros", - ] - - day_names = [ - "", - "ponedjeljak", - "utorak", - "srijeda", - "četvrtak", - "petak", - "subota", - "nedjelja", - ] - - day_abbreviations = [ - "", - "po", - "ut", - "sr", - "če", - "pe", - "su", - "ne", - ] - - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - form = self.timeframes[timeframe] - delta = abs(delta) - if isinstance(form, Mapping): - if 1 < delta <= 4: - form = form["double"] - else: - form = form["higher"] - - return form.format(delta) - - -class LatinLocale(Locale): - names = ["la", "la-va"] - - past = "ante {0}" - future = "in {0}" - and_word = "et" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "nunc", - "second": "secundum", - "seconds": "{0} secundis", - "minute": "minutam", - "minutes": "{0} minutis", - "hour": "horam", - "hours": "{0} horas", - "day": "diem", - "days": "{0} dies", - "week": "hebdomadem", - "weeks": "{0} hebdomades", - "month": "mensem", - "months": "{0} mensis", - "year": "annum", - "years": "{0} annos", - } - - month_names = [ - "", - "Ianuarius", - "Februarius", - "Martius", - "Aprilis", - "Maius", - "Iunius", - "Iulius", - "Augustus", - "September", - "October", - "November", - "December", - ] - - month_abbreviations = [ - "", - "Ian", - "Febr", - "Mart", - "Apr", - "Mai", - "Iun", - "Iul", - "Aug", - "Sept", - "Oct", - "Nov", - "Dec", - ] - - day_names = [ - "", - "dies Lunae", - "dies Martis", - "dies Mercurii", - "dies Iovis", - "dies Veneris", - "dies Saturni", - "dies Solis", - ] - - day_abbreviations = [ - "", - "dies Lunae", - "dies Martis", - "dies Mercurii", - "dies Iovis", - "dies Veneris", - "dies Saturni", - "dies Solis", - ] - - -class LithuanianLocale(Locale): - names = ["lt", "lt-lt"] - - past = "prieš {0}" - future = "po {0}" - and_word = "ir" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "dabar", - "second": "sekundės", - "seconds": "{0} sekundžių", - "minute": "minutės", - "minutes": "{0} minučių", - "hour": "valandos", - "hours": "{0} valandų", - "day": "dieną", - "days": "{0} dienų", - "week": "savaitės", - "weeks": "{0} savaičių", - "month": "mėnesio", - "months": "{0} mėnesių", - "year": "metų", - "years": "{0} metų", - } - - month_names = [ - "", - "sausis", - "vasaris", - "kovas", - "balandis", - "gegužė", - "birželis", - "liepa", - "rugpjūtis", - "rugsėjis", - "spalis", - "lapkritis", - "gruodis", - ] - - month_abbreviations = [ - "", - "saus", - "vas", - "kovas", - "bal", - "geg", - "birž", - "liepa", - "rugp", - "rugs", - "spalis", - "lapkr", - "gr", - ] - - day_names = [ - "", - "pirmadienis", - "antradienis", - "trečiadienis", - "ketvirtadienis", - "penktadienis", - "šeštadienis", - "sekmadienis", - ] - - day_abbreviations = [ - "", - "pi", - "an", - "tr", - "ke", - "pe", - "še", - "se", - ] - - -class MalayLocale(Locale): - names = ["ms", "ms-my", "ms-bn"] - - past = "{0} yang lalu" - future = "dalam {0}" - and_word = "dan" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "sekarang", - "second": "saat", - "seconds": "{0} saat", - "minute": "minit", - "minutes": "{0} minit", - "hour": "jam", - "hours": "{0} jam", - "day": "hari", - "days": "{0} hari", - "week": "minggu", - "weeks": "{0} minggu", - "month": "bulan", - "months": "{0} bulan", - "year": "tahun", - "years": "{0} tahun", - } - - month_names = [ - "", - "Januari", - "Februari", - "Mac", - "April", - "Mei", - "Jun", - "Julai", - "Ogos", - "September", - "Oktober", - "November", - "Disember", - ] - - month_abbreviations = [ - "", - "Jan.", - "Feb.", - "Mac", - "Apr.", - "Mei", - "Jun", - "Julai", - "Og.", - "Sept.", - "Okt.", - "Nov.", - "Dis.", - ] - - day_names = [ - "", - "Isnin", - "Selasa", - "Rabu", - "Khamis", - "Jumaat", - "Sabtu", - "Ahad", - ] - - day_abbreviations = [ - "", - "Isnin", - "Selasa", - "Rabu", - "Khamis", - "Jumaat", - "Sabtu", - "Ahad", - ] - - -class MalteseLocale(Locale): - names = ["mt", "mt-mt"] - - past = "{0} ilu" - future = "fi {0}" - and_word = "u" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "issa", - "second": "sekonda", - "seconds": "{0} sekondi", - "minute": "minuta", - "minutes": "{0} minuti", - "hour": "siegħa", - "hours": {"dual": "{0} sagħtejn", "plural": "{0} sigħat"}, - "day": "jum", - "days": {"dual": "{0} jumejn", "plural": "{0} ijiem"}, - "week": "ġimgħa", - "weeks": {"dual": "{0} ġimagħtejn", "plural": "{0} ġimgħat"}, - "month": "xahar", - "months": {"dual": "{0} xahrejn", "plural": "{0} xhur"}, - "year": "sena", - "years": {"dual": "{0} sentejn", "plural": "{0} snin"}, - } - - month_names = [ - "", - "Jannar", - "Frar", - "Marzu", - "April", - "Mejju", - "Ġunju", - "Lulju", - "Awwissu", - "Settembru", - "Ottubru", - "Novembru", - "Diċembru", - ] - - month_abbreviations = [ - "", - "Jan", - "Fr", - "Mar", - "Apr", - "Mejju", - "Ġun", - "Lul", - "Aw", - "Sett", - "Ott", - "Nov", - "Diċ", - ] - - day_names = [ - "", - "It-Tnejn", - "It-Tlieta", - "L-Erbgħa", - "Il-Ħamis", - "Il-Ġimgħa", - "Is-Sibt", - "Il-Ħadd", - ] - - day_abbreviations = [ - "", - "T", - "TL", - "E", - "Ħ", - "Ġ", - "S", - "Ħ", - ] - - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - form = self.timeframes[timeframe] - delta = abs(delta) - if isinstance(form, Mapping): - if delta == 2: - form = form["dual"] - else: - form = form["plural"] - - return form.format(delta) - - -class SamiLocale(Locale): - names = ["se", "se-fi", "se-no", "se-se"] - - past = "{0} dassái" - future = "{0} " # NOTE: couldn't find preposition for Sami here, none needed? - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "dál", - "second": "sekunda", - "seconds": "{0} sekundda", - "minute": "minuhta", - "minutes": "{0} minuhta", - "hour": "diimmu", - "hours": "{0} diimmu", - "day": "beaivvi", - "days": "{0} beaivvi", - "week": "vahku", - "weeks": "{0} vahku", - "month": "mánu", - "months": "{0} mánu", - "year": "jagi", - "years": "{0} jagi", - } - - month_names = [ - "", - "Ođđajagimánnu", - "Guovvamánnu", - "Njukčamánnu", - "Cuoŋománnu", - "Miessemánnu", - "Geassemánnu", - "Suoidnemánnu", - "Borgemánnu", - "Čakčamánnu", - "Golggotmánnu", - "Skábmamánnu", - "Juovlamánnu", - ] - - month_abbreviations = [ - "", - "Ođđajagimánnu", - "Guovvamánnu", - "Njukčamánnu", - "Cuoŋománnu", - "Miessemánnu", - "Geassemánnu", - "Suoidnemánnu", - "Borgemánnu", - "Čakčamánnu", - "Golggotmánnu", - "Skábmamánnu", - "Juovlamánnu", - ] - - day_names = [ - "", - "Mánnodat", - "Disdat", - "Gaskavahkku", - "Duorastat", - "Bearjadat", - "Lávvordat", - "Sotnabeaivi", - ] - - day_abbreviations = [ - "", - "Mánnodat", - "Disdat", - "Gaskavahkku", - "Duorastat", - "Bearjadat", - "Lávvordat", - "Sotnabeaivi", - ] - - -class OdiaLocale(Locale): - names = ["or", "or-in"] - - past = "{0} ପୂର୍ବେ" - future = "{0} ପରେ" - - timeframes = { - "now": "ବର୍ତ୍ତମାନ", - "second": "ଏକ ସେକେଣ୍ଡ", - "seconds": "{0} ସେକେଣ୍ଡ", - "minute": "ଏକ ମିନଟ", - "minutes": "{0} ମିନଟ", - "hour": "ଏକ ଘଣ୍ଟା", - "hours": "{0} ଘଣ୍ଟା", - "day": "ଏକ ଦିନ", - "days": "{0} ଦିନ", - "month": "ଏକ ମାସ", - "months": "{0} ମାସ ", - "year": "ଏକ ବର୍ଷ", - "years": "{0} ବର୍ଷ", - } - - meridians = {"am": "ପୂର୍ବାହ୍ନ", "pm": "ଅପରାହ୍ନ", "AM": "ପୂର୍ବାହ୍ନ", "PM": "ଅପରାହ୍ନ"} - - month_names = [ - "", - "ଜାନୁଆରୀ", - "ଫେବୃଆରୀ", - "ମାର୍ଚ୍ଚ୍", - "ଅପ୍ରେଲ", - "ମଇ", - "ଜୁନ୍", - "ଜୁଲାଇ", - "ଅଗଷ୍ଟ", - "ସେପ୍ଟେମ୍ବର", - "ଅକ୍ଟୋବର୍", - "ନଭେମ୍ବର୍", - "ଡିସେମ୍ବର୍", - ] - month_abbreviations = [ - "", - "ଜାନୁ", - "ଫେବୃ", - "ମାର୍ଚ୍ଚ୍", - "ଅପ୍ରେ", - "ମଇ", - "ଜୁନ୍", - "ଜୁଲା", - "ଅଗ", - "ସେପ୍ଟେ", - "ଅକ୍ଟୋ", - "ନଭେ", - "ଡିସେ", - ] - - day_names = [ - "", - "ସୋମବାର", - "ମଙ୍ଗଳବାର", - "ବୁଧବାର", - "ଗୁରୁବାର", - "ଶୁକ୍ରବାର", - "ଶନିବାର", - "ରବିବାର", - ] - day_abbreviations = [ - "", - "ସୋମ", - "ମଙ୍ଗଳ", - "ବୁଧ", - "ଗୁରୁ", - "ଶୁକ୍ର", - "ଶନି", - "ରବି", - ] - - def _ordinal_number(self, n: int) -> str: - if n > 10 or n == 0: - return f"{n}ତମ" - if n in [1, 5, 7, 8, 9, 10]: - return f"{n}ମ" - if n in [2, 3]: - return f"{n}ୟ" - if n == 4: - return f"{n}ର୍ଥ" - if n == 6: - return f"{n}ଷ୍ଠ" - return "" - - -class SerbianLocale(Locale): - names = ["sr", "sr-rs", "sr-sp"] - - past = "pre {0}" - future = "za {0}" - and_word = "i" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[str, Mapping[str, str]]]] = { - "now": "sada", - "second": "sekundu", - "seconds": {"double": "{0} sekunde", "higher": "{0} sekundi"}, - "minute": "minutu", - "minutes": {"double": "{0} minute", "higher": "{0} minuta"}, - "hour": "sat", - "hours": {"double": "{0} sata", "higher": "{0} sati"}, - "day": "dan", - "days": {"double": "{0} dana", "higher": "{0} dana"}, - "week": "nedelju", - "weeks": {"double": "{0} nedelje", "higher": "{0} nedelja"}, - "month": "mesec", - "months": {"double": "{0} meseca", "higher": "{0} meseci"}, - "year": "godinu", - "years": {"double": "{0} godine", "higher": "{0} godina"}, - } - - month_names = [ - "", - "januar", # јануар - "februar", # фебруар - "mart", # март - "april", # април - "maj", # мај - "jun", # јун - "jul", # јул - "avgust", # август - "septembar", # септембар - "oktobar", # октобар - "novembar", # новембар - "decembar", # децембар - ] - - month_abbreviations = [ - "", - "jan", - "feb", - "mar", - "apr", - "maj", - "jun", - "jul", - "avg", - "sep", - "okt", - "nov", - "dec", - ] - - day_names = [ - "", - "ponedeljak", # понедељак - "utorak", # уторак - "sreda", # среда - "četvrtak", # четвртак - "petak", # петак - "subota", # субота - "nedelja", # недеља - ] - - day_abbreviations = [ - "", - "po", # по - "ut", # ут - "sr", # ср - "če", # че - "pe", # пе - "su", # су - "ne", # не - ] - - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - form = self.timeframes[timeframe] - delta = abs(delta) - if isinstance(form, Mapping): - if 1 < delta <= 4: - form = form["double"] - else: - form = form["higher"] - - return form.format(delta) - - -class LuxembourgishLocale(Locale): - names = ["lb", "lb-lu"] - - past = "virun {0}" - future = "an {0}" - and_word = "an" - - timeframes = { - "now": "just elo", - "second": "enger Sekonn", - "seconds": "{0} Sekonnen", - "minute": "enger Minutt", - "minutes": "{0} Minutten", - "hour": "enger Stonn", - "hours": "{0} Stonnen", - "day": "engem Dag", - "days": "{0} Deeg", - "week": "enger Woch", - "weeks": "{0} Wochen", - "month": "engem Mount", - "months": "{0} Méint", - "year": "engem Joer", - "years": "{0} Jahren", - } - - timeframes_only_distance = timeframes.copy() - timeframes_only_distance["second"] = "eng Sekonn" - timeframes_only_distance["minute"] = "eng Minutt" - timeframes_only_distance["hour"] = "eng Stonn" - timeframes_only_distance["day"] = "een Dag" - timeframes_only_distance["days"] = "{0} Deeg" - timeframes_only_distance["week"] = "eng Woch" - timeframes_only_distance["month"] = "ee Mount" - timeframes_only_distance["months"] = "{0} Méint" - timeframes_only_distance["year"] = "ee Joer" - timeframes_only_distance["years"] = "{0} Joer" - - month_names = [ - "", - "Januar", - "Februar", - "Mäerz", - "Abrëll", - "Mee", - "Juni", - "Juli", - "August", - "September", - "Oktouber", - "November", - "Dezember", - ] - - month_abbreviations = [ - "", - "Jan", - "Feb", - "Mäe", - "Abr", - "Mee", - "Jun", - "Jul", - "Aug", - "Sep", - "Okt", - "Nov", - "Dez", - ] - - day_names = [ - "", - "Méindeg", - "Dënschdeg", - "Mëttwoch", - "Donneschdeg", - "Freideg", - "Samschdeg", - "Sonndeg", - ] - - day_abbreviations = ["", "Méi", "Dën", "Mët", "Don", "Fre", "Sam", "Son"] - - def _ordinal_number(self, n: int) -> str: - return f"{n}." - - def describe( - self, - timeframe: TimeFrameLiteral, - delta: Union[int, float] = 0, - only_distance: bool = False, - ) -> str: - if not only_distance: - return super().describe(timeframe, delta, only_distance) - - # Luxembourgish uses a different case without 'in' or 'ago' - humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta))) - - return humanized - - -class ZuluLocale(Locale): - names = ["zu", "zu-za"] - - past = "{0} edlule" - future = "{0} " - and_word = "futhi" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = { - "now": "manje", - "second": {"past": "umzuzwana", "future": "ngomzuzwana"}, - "seconds": {"past": "{0} imizuzwana", "future": "{0} ngemizuzwana"}, - "minute": {"past": "umzuzu", "future": "ngomzuzu"}, - "minutes": {"past": "{0} imizuzu", "future": "{0} ngemizuzu"}, - "hour": {"past": "ihora", "future": "ngehora"}, - "hours": {"past": "{0} amahora", "future": "{0} emahoreni"}, - "day": {"past": "usuku", "future": "ngosuku"}, - "days": {"past": "{0} izinsuku", "future": "{0} ezinsukwini"}, - "week": {"past": "isonto", "future": "ngesonto"}, - "weeks": {"past": "{0} amasonto", "future": "{0} emasontweni"}, - "month": {"past": "inyanga", "future": "ngenyanga"}, - "months": {"past": "{0} izinyanga", "future": "{0} ezinyangeni"}, - "year": {"past": "unyaka", "future": "ngonyak"}, - "years": {"past": "{0} iminyaka", "future": "{0} eminyakeni"}, - } - - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - """Zulu aware time frame format function, takes into account - the differences between past and future forms.""" - abs_delta = abs(delta) - form = self.timeframes[timeframe] - - if isinstance(form, str): - return form.format(abs_delta) - - if delta > 0: - key = "future" - else: - key = "past" - form = form[key] - - return form.format(abs_delta) - - month_names = [ - "", - "uMasingane", - "uNhlolanja", - "uNdasa", - "UMbasa", - "UNhlaba", - "UNhlangulana", - "uNtulikazi", - "UNcwaba", - "uMandulo", - "uMfumfu", - "uLwezi", - "uZibandlela", - ] - - month_abbreviations = [ - "", - "uMasingane", - "uNhlolanja", - "uNdasa", - "UMbasa", - "UNhlaba", - "UNhlangulana", - "uNtulikazi", - "UNcwaba", - "uMandulo", - "uMfumfu", - "uLwezi", - "uZibandlela", - ] - - day_names = [ - "", - "uMsombuluko", - "uLwesibili", - "uLwesithathu", - "uLwesine", - "uLwesihlanu", - "uMgqibelo", - "iSonto", - ] - - day_abbreviations = [ - "", - "uMsombuluko", - "uLwesibili", - "uLwesithathu", - "uLwesine", - "uLwesihlanu", - "uMgqibelo", - "iSonto", - ] - - -class TamilLocale(Locale): - names = ["ta", "ta-in", "ta-lk"] - - past = "{0} நேரத்திற்கு முன்பு" - future = "இல் {0}" - - timeframes = { - "now": "இப்போது", - "second": "ஒரு இரண்டாவது", - "seconds": "{0} விநாடிகள்", - "minute": "ஒரு நிமிடம்", - "minutes": "{0} நிமிடங்கள்", - "hour": "ஒரு மணி", - "hours": "{0} மணிநேரம்", - "day": "ஒரு நாள்", - "days": "{0} நாட்கள்", - "week": "ஒரு வாரம்", - "weeks": "{0} வாரங்கள்", - "month": "ஒரு மாதம்", - "months": "{0} மாதங்கள்", - "year": "ஒரு ஆண்டு", - "years": "{0} ஆண்டுகள்", - } - - month_names = [ - "", - "சித்திரை", - "வைகாசி", - "ஆனி", - "ஆடி", - "ஆவணி", - "புரட்டாசி", - "ஐப்பசி", - "கார்த்திகை", - "மார்கழி", - "தை", - "மாசி", - "பங்குனி", - ] - - month_abbreviations = [ - "", - "ஜன", - "பிப்", - "மார்", - "ஏப்", - "மே", - "ஜூன்", - "ஜூலை", - "ஆக", - "செப்", - "அக்", - "நவ", - "டிச", - ] - - day_names = [ - "", - "திங்கட்கிழமை", - "செவ்வாய்க்கிழமை", - "புதன்கிழமை", - "வியாழக்கிழமை", - "வெள்ளிக்கிழமை", - "சனிக்கிழமை", - "ஞாயிற்றுக்கிழமை", - ] - - day_abbreviations = [ - "", - "திங்கட்", - "செவ்வாய்", - "புதன்", - "வியாழன்", - "வெள்ளி", - "சனி", - "ஞாயிறு", - ] - - def _ordinal_number(self, n: int) -> str: - if n == 1: - return f"{n}வது" - elif n >= 0: - return f"{n}ஆம்" - else: - return "" - - -class AlbanianLocale(Locale): - names = ["sq", "sq-al"] - - past = "{0} më parë" - future = "në {0}" - and_word = "dhe" - - timeframes = { - "now": "tani", - "second": "sekondë", - "seconds": "{0} sekonda", - "minute": "minutë", - "minutes": "{0} minuta", - "hour": "orë", - "hours": "{0} orë", - "day": "ditë", - "days": "{0} ditë", - "week": "javë", - "weeks": "{0} javë", - "month": "muaj", - "months": "{0} muaj", - "year": "vit", - "years": "{0} vjet", - } - - month_names = [ - "", - "janar", - "shkurt", - "mars", - "prill", - "maj", - "qershor", - "korrik", - "gusht", - "shtator", - "tetor", - "nëntor", - "dhjetor", - ] - - month_abbreviations = [ - "", - "jan", - "shk", - "mar", - "pri", - "maj", - "qer", - "korr", - "gush", - "sht", - "tet", - "nën", - "dhj", - ] - - day_names = [ - "", - "e hënë", - "e martë", - "e mërkurë", - "e enjte", - "e premte", - "e shtunë", - "e diel", - ] - - day_abbreviations = [ - "", - "hën", - "mar", - "mër", - "enj", - "pre", - "sht", - "die", - ] - - -class GeorgianLocale(Locale): - names = ["ka", "ka-ge"] - - past = "{0} წინ" # ts’in - future = "{0} შემდეგ" # shemdeg - and_word = "და" # da - - timeframes = { - "now": "ახლა", # akhla - # When a cardinal qualifies a noun, it stands in the singular - "second": "წამის", # ts’amis - "seconds": "{0} წამის", - "minute": "წუთის", # ts’utis - "minutes": "{0} წუთის", - "hour": "საათის", # saatis - "hours": "{0} საათის", - "day": "დღის", # dghis - "days": "{0} დღის", - "week": "კვირის", # k’viris - "weeks": "{0} კვირის", - "month": "თვის", # tvis - "months": "{0} თვის", - "year": "წლის", # ts’lis - "years": "{0} წლის", - } - - month_names = [ - # modern month names - "", - "იანვარი", # Ianvari - "თებერვალი", # Tebervali - "მარტი", # Mart'i - "აპრილი", # Ap'rili - "მაისი", # Maisi - "ივნისი", # Ivnisi - "ივლისი", # Ivlisi - "აგვისტო", # Agvist'o - "სექტემბერი", # Sekt'emberi - "ოქტომბერი", # Okt'omberi - "ნოემბერი", # Noemberi - "დეკემბერი", # Dek'emberi - ] - - month_abbreviations = [ - # no abbr. found yet - "", - "იანვარი", # Ianvari - "თებერვალი", # Tebervali - "მარტი", # Mart'i - "აპრილი", # Ap'rili - "მაისი", # Maisi - "ივნისი", # Ivnisi - "ივლისი", # Ivlisi - "აგვისტო", # Agvist'o - "სექტემბერი", # Sekt'emberi - "ოქტომბერი", # Okt'omberi - "ნოემბერი", # Noemberi - "დეკემბერი", # Dek'emberi - ] - - day_names = [ - "", - "ორშაბათი", # orshabati - "სამშაბათი", # samshabati - "ოთხშაბათი", # otkhshabati - "ხუთშაბათი", # khutshabati - "პარასკევი", # p’arask’evi - "შაბათი", # shabati - # "k’vira" also serves as week; to avoid confusion "k’vira-dge" can be used for Sunday - "კვირა", # k’vira - ] - - day_abbreviations = [ - "", - "ორშაბათი", # orshabati - "სამშაბათი", # samshabati - "ოთხშაბათი", # otkhshabati - "ხუთშაბათი", # khutshabati - "პარასკევი", # p’arask’evi - "შაბათი", # shabati - "კვირა", # k’vira - ] - - -class SinhalaLocale(Locale): - names = ["si", "si-lk"] - - past = "{0}ට පෙර" - future = "{0}" - and_word = "සහ" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = { - "now": "දැන්", - "second": { - "past": "තත්පරයක", - "future": "තත්පරයකින්", - }, # ක් is the article - "seconds": { - "past": "තත්පර {0} ක", - "future": "තත්පර {0} කින්", - }, - "minute": { - "past": "විනාඩියක", - "future": "විනාඩියකින්", - }, - "minutes": { - "past": "විනාඩි {0} ක", - "future": "මිනිත්තු {0} කින්", - }, - "hour": {"past": "පැයක", "future": "පැයකින්"}, - "hours": { - "past": "පැය {0} ක", - "future": "පැය {0} කින්", - }, - "day": {"past": "දිනක", "future": "දිනකට"}, - "days": { - "past": "දින {0} ක", - "future": "දින {0} කින්", - }, - "week": {"past": "සතියක", "future": "සතියකින්"}, - "weeks": { - "past": "සති {0} ක", - "future": "සති {0} කින්", - }, - "month": {"past": "මාසයක", "future": "එය මාසය තුළ"}, - "months": { - "past": "මාස {0} ක", - "future": "මාස {0} කින්", - }, - "year": {"past": "වසරක", "future": "වසරක් තුළ"}, - "years": { - "past": "අවුරුදු {0} ක", - "future": "අවුරුදු {0} තුළ", - }, - } - # Sinhala: the general format to describe timeframe is different from past and future, - # so we do not copy the original timeframes dictionary - timeframes_only_distance = {} - timeframes_only_distance["second"] = "තත්පරයක්" - timeframes_only_distance["seconds"] = "තත්පර {0}" - timeframes_only_distance["minute"] = "මිනිත්තුවක්" - timeframes_only_distance["minutes"] = "විනාඩි {0}" - timeframes_only_distance["hour"] = "පැයක්" - timeframes_only_distance["hours"] = "පැය {0}" - timeframes_only_distance["day"] = "දවසක්" - timeframes_only_distance["days"] = "දවස් {0}" - timeframes_only_distance["week"] = "සතියක්" - timeframes_only_distance["weeks"] = "සති {0}" - timeframes_only_distance["month"] = "මාසයක්" - timeframes_only_distance["months"] = "මාස {0}" - timeframes_only_distance["year"] = "අවුරුද්දක්" - timeframes_only_distance["years"] = "අවුරුදු {0}" - - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - """ - Sinhala awares time frame format function, takes into account - the differences between general, past, and future forms (three different suffixes). - """ - abs_delta = abs(delta) - form = self.timeframes[timeframe] - - if isinstance(form, str): - return form.format(abs_delta) - - if delta > 0: - key = "future" - else: - key = "past" - form = form[key] - - return form.format(abs_delta) - - def describe( - self, - timeframe: TimeFrameLiteral, - delta: Union[float, int] = 1, # key is always future when only_distance=False - only_distance: bool = False, - ) -> str: - """Describes a delta within a timeframe in plain language. - - :param timeframe: a string representing a timeframe. - :param delta: a quantity representing a delta in a timeframe. - :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords - """ - - if not only_distance: - return super().describe(timeframe, delta, only_distance) - # Sinhala uses a different case without 'in' or 'ago' - humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta))) - - return humanized - - month_names = [ - "", - "ජනවාරි", - "පෙබරවාරි", - "මාර්තු", - "අප්‍රේල්", - "මැයි", - "ජූනි", - "ජූලි", - "අගෝස්තු", - "සැප්තැම්බර්", - "ඔක්තෝබර්", - "නොවැම්බර්", - "දෙසැම්බර්", - ] - - month_abbreviations = [ - "", - "ජන", - "පෙබ", - "මාර්", - "අප්‍රේ", - "මැයි", - "ජුනි", - "ජූලි", - "අගෝ", - "සැප්", - "ඔක්", - "නොවැ", - "දෙසැ", - ] - - day_names = [ - "", - "සදුදා", - "අඟහරැවදා", - "බදාදා", - "බ්‍රහස්‍පතින්‍දා", - "සිකුරාදා", - "සෙනසුරාදා", - "ඉරිදා", - ] - - day_abbreviations = [ - "", - "සදුද", - "බදා", - "බදා", - "සිකු", - "සෙන", - "අ", - "ඉරිදා", - ] - - -class UrduLocale(Locale): - names = ["ur", "ur-pk"] - - past = "پہلے {0}" - future = "میں {0}" - and_word = "اور" - - timeframes = { - "now": "ابھی", - "second": "ایک سیکنڈ", - "seconds": "{0} سیکنڈ", - "minute": "ایک منٹ", - "minutes": "{0} منٹ", - "hour": "ایک گھنٹے", - "hours": "{0} گھنٹے", - "day": "ایک دن", - "days": "{0} دن", - "week": "ایک ہفتے", - "weeks": "{0} ہفتے", - "month": "ایک مہینہ", - "months": "{0} ماہ", - "year": "ایک سال", - "years": "{0} سال", - } - - month_names = [ - "", - "جنوری", - "فروری", - "مارچ", - "اپریل", - "مئی", - "جون", - "جولائی", - "اگست", - "ستمبر", - "اکتوبر", - "نومبر", - "دسمبر", - ] - - month_abbreviations = [ - "", - "جنوری", - "فروری", - "مارچ", - "اپریل", - "مئی", - "جون", - "جولائی", - "اگست", - "ستمبر", - "اکتوبر", - "نومبر", - "دسمبر", - ] - - day_names = [ - "", - "سوموار", - "منگل", - "بدھ", - "جمعرات", - "جمعہ", - "ہفتہ", - "اتوار", - ] - - day_abbreviations = [ - "", - "سوموار", - "منگل", - "بدھ", - "جمعرات", - "جمعہ", - "ہفتہ", - "اتوار", - ] - - -class KazakhLocale(Locale): - names = ["kk", "kk-kz"] - - past = "{0} бұрын" - future = "{0} кейін" - timeframes = { - "now": "қазір", - "second": "бір секунд", - "seconds": "{0} секунд", - "minute": "бір минут", - "minutes": "{0} минут", - "hour": "бір сағат", - "hours": "{0} сағат", - "day": "бір күн", - "days": "{0} күн", - "week": "бір апта", - "weeks": "{0} апта", - "month": "бір ай", - "months": "{0} ай", - "year": "бір жыл", - "years": "{0} жыл", - } - - month_names = [ - "", - "Қаңтар", - "Ақпан", - "Наурыз", - "Сәуір", - "Мамыр", - "Маусым", - "Шілде", - "Тамыз", - "Қыркүйек", - "Қазан", - "Қараша", - "Желтоқсан", - ] - month_abbreviations = [ - "", - "Қан", - "Ақп", - "Нау", - "Сәу", - "Мам", - "Мау", - "Шіл", - "Там", - "Қыр", - "Қаз", - "Қар", - "Жел", - ] - - day_names = [ - "", - "Дүйсембі", - "Сейсенбі", - "Сәрсенбі", - "Бейсенбі", - "Жұма", - "Сенбі", - "Жексенбі", - ] - day_abbreviations = ["", "Дс", "Сс", "Ср", "Бс", "Жм", "Сб", "Жс"] - - -class AmharicLocale(Locale): - names = ["am", "am-et"] - - past = "{0} በፊት" - future = "{0} ውስጥ" - and_word = "እና" - - timeframes: ClassVar[Mapping[TimeFrameLiteral, Union[Mapping[str, str], str]]] = { - "now": "አሁን", - "second": { - "past": "ከአንድ ሰከንድ", - "future": "በአንድ ሰከንድ", - }, - "seconds": { - "past": "ከ {0} ሰከንድ", - "future": "በ {0} ሰከንድ", - }, - "minute": { - "past": "ከአንድ ደቂቃ", - "future": "በአንድ ደቂቃ", - }, - "minutes": { - "past": "ከ {0} ደቂቃዎች", - "future": "በ {0} ደቂቃዎች", - }, - "hour": { - "past": "ከአንድ ሰዓት", - "future": "በአንድ ሰዓት", - }, - "hours": { - "past": "ከ {0} ሰዓታት", - "future": "በ {0} ሰከንድ", - }, - "day": { - "past": "ከአንድ ቀን", - "future": "በአንድ ቀን", - }, - "days": { - "past": "ከ {0} ቀናት", - "future": "በ {0} ቀናት", - }, - "week": { - "past": "ከአንድ ሳምንት", - "future": "በአንድ ሳምንት", - }, - "weeks": { - "past": "ከ {0} ሳምንታት", - "future": "በ {0} ሳምንታት", - }, - "month": { - "past": "ከአንድ ወር", - "future": "በአንድ ወር", - }, - "months": { - "past": "ከ {0} ወር", - "future": "በ {0} ወራት", - }, - "year": { - "past": "ከአንድ አመት", - "future": "በአንድ አመት", - }, - "years": { - "past": "ከ {0} ዓመታት", - "future": "በ {0} ዓመታት", - }, - } - # Amharic: the general format to describe timeframe is different from past and future, - # so we do not copy the original timeframes dictionary - timeframes_only_distance = { - "second": "አንድ ሰከንድ", - "seconds": "{0} ሰከንድ", - "minute": "አንድ ደቂቃ", - "minutes": "{0} ደቂቃዎች", - "hour": "አንድ ሰዓት", - "hours": "{0} ሰዓት", - "day": "አንድ ቀን", - "days": "{0} ቀናት", - "week": "አንድ ሳምንት", - "weeks": "{0} ሳምንት", - "month": "አንድ ወር", - "months": "{0} ወራት", - "year": "አንድ አመት", - "years": "{0} ዓመታት", - } - - month_names = [ - "", - "ጃንዩወሪ", - "ፌብሩወሪ", - "ማርች", - "ኤፕሪል", - "ሜይ", - "ጁን", - "ጁላይ", - "ኦገስት", - "ሴፕቴምበር", - "ኦክቶበር", - "ኖቬምበር", - "ዲሴምበር", - ] - - month_abbreviations = [ - "", - "ጃንዩ", - "ፌብሩ", - "ማርች", - "ኤፕሪ", - "ሜይ", - "ጁን", - "ጁላይ", - "ኦገስ", - "ሴፕቴ", - "ኦክቶ", - "ኖቬም", - "ዲሴም", - ] - - day_names = [ - "", - "ሰኞ", - "ማክሰኞ", - "ረቡዕ", - "ሐሙስ", - "ዓርብ", - "ቅዳሜ", - "እሑድ", - ] - day_abbreviations = ["", "እ", "ሰ", "ማ", "ረ", "ሐ", "ዓ", "ቅ"] - - def _ordinal_number(self, n: int) -> str: - return f"{n}ኛ" - - def _format_timeframe(self, timeframe: TimeFrameLiteral, delta: int) -> str: - """ - Amharic awares time frame format function, takes into account - the differences between general, past, and future forms (three different suffixes). - """ - abs_delta = abs(delta) - form = self.timeframes[timeframe] - - if isinstance(form, str): - return form.format(abs_delta) - - if delta > 0: - key = "future" - else: - key = "past" - form = form[key] - - return form.format(abs_delta) - - def describe( - self, - timeframe: TimeFrameLiteral, - delta: Union[float, int] = 1, # key is always future when only_distance=False - only_distance: bool = False, - ) -> str: - """Describes a delta within a timeframe in plain language. - - :param timeframe: a string representing a timeframe. - :param delta: a quantity representing a delta in a timeframe. - :param only_distance: return only distance eg: "11 seconds" without "in" or "ago" keywords - """ - - if not only_distance: - return super().describe(timeframe, delta, only_distance) - humanized = self.timeframes_only_distance[timeframe].format(trunc(abs(delta))) - - return humanized - - -class ArmenianLocale(Locale): - names = ["hy", "hy-am"] - past = "{0} առաջ" - future = "{0}ից" - and_word = "Եվ" # Yev - - timeframes = { - "now": "հիմա", - "second": "վայրկյան", - "seconds": "{0} վայրկյան", - "minute": "րոպե", - "minutes": "{0} րոպե", - "hour": "ժամ", - "hours": "{0} ժամ", - "day": "օր", - "days": "{0} օր", - "month": "ամիս", - "months": "{0} ամիս", - "year": "տարին", - "years": "{0} տարին", - "week": "շաբաթ", - "weeks": "{0} շաբաթ", - } - - meridians = { - "am": "Ամ", - "pm": "պ.մ.", - "AM": "Ամ", - "PM": "պ.մ.", - } - - month_names = [ - "", - "հունվար", - "փետրվար", - "մարտ", - "ապրիլ", - "մայիս", - "հունիս", - "հուլիս", - "օգոստոս", - "սեպտեմբեր", - "հոկտեմբեր", - "նոյեմբեր", - "դեկտեմբեր", - ] - - month_abbreviations = [ - "", - "հունվար", - "փետրվար", - "մարտ", - "ապրիլ", - "մայիս", - "հունիս", - "հուլիս", - "օգոստոս", - "սեպտեմբեր", - "հոկտեմբեր", - "նոյեմբեր", - "դեկտեմբեր", - ] - - day_names = [ - "", - "երկուշաբթի", - "երեքշաբթի", - "չորեքշաբթի", - "հինգշաբթի", - "ուրբաթ", - "շաբաթ", - "կիրակի", - ] - - day_abbreviations = [ - "", - "երկ.", - "երեք.", - "չորեք.", - "հինգ.", - "ուրբ.", - "շաբ.", - "կիր.", - ] - - -class UzbekLocale(Locale): - names = ["uz", "uz-uz"] - past = "{0}dan avval" - future = "{0}dan keyin" - timeframes = { - "now": "hozir", - "second": "bir soniya", - "seconds": "{0} soniya", - "minute": "bir daqiqa", - "minutes": "{0} daqiqa", - "hour": "bir soat", - "hours": "{0} soat", - "day": "bir kun", - "days": "{0} kun", - "week": "bir hafta", - "weeks": "{0} hafta", - "month": "bir oy", - "months": "{0} oy", - "year": "bir yil", - "years": "{0} yil", - } - - month_names = [ - "", - "Yanvar", - "Fevral", - "Mart", - "Aprel", - "May", - "Iyun", - "Iyul", - "Avgust", - "Sentyabr", - "Oktyabr", - "Noyabr", - "Dekabr", - ] - - month_abbreviations = [ - "", - "Yan", - "Fev", - "Mar", - "Apr", - "May", - "Iyn", - "Iyl", - "Avg", - "Sen", - "Okt", - "Noy", - "Dek", - ] - - day_names = [ - "", - "Dushanba", - "Seshanba", - "Chorshanba", - "Payshanba", - "Juma", - "Shanba", - "Yakshanba", - ] - - day_abbreviations = ["", "Dush", "Sesh", "Chor", "Pay", "Jum", "Shan", "Yak"] diff --git a/.venv/Lib/site-packages/arrow/parser.py b/.venv/Lib/site-packages/arrow/parser.py deleted file mode 100644 index e95d78b..0000000 --- a/.venv/Lib/site-packages/arrow/parser.py +++ /dev/null @@ -1,779 +0,0 @@ -"""Provides the :class:`Arrow ` class, a better way to parse datetime strings.""" - -import re -import sys -from datetime import datetime, timedelta -from datetime import tzinfo as dt_tzinfo -from functools import lru_cache -from typing import ( - Any, - ClassVar, - Dict, - Iterable, - List, - Match, - Optional, - Pattern, - SupportsFloat, - SupportsInt, - Tuple, - Union, - cast, - overload, -) - -from dateutil import tz - -from arrow import locales -from arrow.constants import DEFAULT_LOCALE -from arrow.util import next_weekday, normalize_timestamp - -if sys.version_info < (3, 8): # pragma: no cover - from typing_extensions import Literal, TypedDict -else: - from typing import Literal, TypedDict # pragma: no cover - - -class ParserError(ValueError): - pass - - -# Allows for ParserErrors to be propagated from _build_datetime() -# when day_of_year errors occur. -# Before this, the ParserErrors were caught by the try/except in -# _parse_multiformat() and the appropriate error message was not -# transmitted to the user. -class ParserMatchError(ParserError): - pass - - -_WEEKDATE_ELEMENT = Union[str, bytes, SupportsInt, bytearray] - -_FORMAT_TYPE = Literal[ - "YYYY", - "YY", - "MM", - "M", - "DDDD", - "DDD", - "DD", - "D", - "HH", - "H", - "hh", - "h", - "mm", - "m", - "ss", - "s", - "X", - "x", - "ZZZ", - "ZZ", - "Z", - "S", - "W", - "MMMM", - "MMM", - "Do", - "dddd", - "ddd", - "d", - "a", - "A", -] - - -class _Parts(TypedDict, total=False): - year: int - month: int - day_of_year: int - day: int - hour: int - minute: int - second: int - microsecond: int - timestamp: float - expanded_timestamp: int - tzinfo: dt_tzinfo - am_pm: Literal["am", "pm"] - day_of_week: int - weekdate: Tuple[_WEEKDATE_ELEMENT, _WEEKDATE_ELEMENT, Optional[_WEEKDATE_ELEMENT]] - - -class DateTimeParser: - _FORMAT_RE: ClassVar[Pattern[str]] = re.compile( - r"(YYY?Y?|MM?M?M?|Do|DD?D?D?|d?d?d?d|HH?|hh?|mm?|ss?|S+|ZZ?Z?|a|A|x|X|W)" - ) - _ESCAPE_RE: ClassVar[Pattern[str]] = re.compile(r"\[[^\[\]]*\]") - - _ONE_OR_TWO_DIGIT_RE: ClassVar[Pattern[str]] = re.compile(r"\d{1,2}") - _ONE_OR_TWO_OR_THREE_DIGIT_RE: ClassVar[Pattern[str]] = re.compile(r"\d{1,3}") - _ONE_OR_MORE_DIGIT_RE: ClassVar[Pattern[str]] = re.compile(r"\d+") - _TWO_DIGIT_RE: ClassVar[Pattern[str]] = re.compile(r"\d{2}") - _THREE_DIGIT_RE: ClassVar[Pattern[str]] = re.compile(r"\d{3}") - _FOUR_DIGIT_RE: ClassVar[Pattern[str]] = re.compile(r"\d{4}") - _TZ_Z_RE: ClassVar[Pattern[str]] = re.compile(r"([\+\-])(\d{2})(?:(\d{2}))?|Z") - _TZ_ZZ_RE: ClassVar[Pattern[str]] = re.compile(r"([\+\-])(\d{2})(?:\:(\d{2}))?|Z") - _TZ_NAME_RE: ClassVar[Pattern[str]] = re.compile(r"\w[\w+\-/]+") - # NOTE: timestamps cannot be parsed from natural language strings (by removing the ^...$) because it will - # break cases like "15 Jul 2000" and a format list (see issue #447) - _TIMESTAMP_RE: ClassVar[Pattern[str]] = re.compile(r"^\-?\d+\.?\d+$") - _TIMESTAMP_EXPANDED_RE: ClassVar[Pattern[str]] = re.compile(r"^\-?\d+$") - _TIME_RE: ClassVar[Pattern[str]] = re.compile( - r"^(\d{2})(?:\:?(\d{2}))?(?:\:?(\d{2}))?(?:([\.\,])(\d+))?$" - ) - _WEEK_DATE_RE: ClassVar[Pattern[str]] = re.compile( - r"(?P\d{4})[\-]?W(?P\d{2})[\-]?(?P\d)?" - ) - - _BASE_INPUT_RE_MAP: ClassVar[Dict[_FORMAT_TYPE, Pattern[str]]] = { - "YYYY": _FOUR_DIGIT_RE, - "YY": _TWO_DIGIT_RE, - "MM": _TWO_DIGIT_RE, - "M": _ONE_OR_TWO_DIGIT_RE, - "DDDD": _THREE_DIGIT_RE, - "DDD": _ONE_OR_TWO_OR_THREE_DIGIT_RE, - "DD": _TWO_DIGIT_RE, - "D": _ONE_OR_TWO_DIGIT_RE, - "HH": _TWO_DIGIT_RE, - "H": _ONE_OR_TWO_DIGIT_RE, - "hh": _TWO_DIGIT_RE, - "h": _ONE_OR_TWO_DIGIT_RE, - "mm": _TWO_DIGIT_RE, - "m": _ONE_OR_TWO_DIGIT_RE, - "ss": _TWO_DIGIT_RE, - "s": _ONE_OR_TWO_DIGIT_RE, - "X": _TIMESTAMP_RE, - "x": _TIMESTAMP_EXPANDED_RE, - "ZZZ": _TZ_NAME_RE, - "ZZ": _TZ_ZZ_RE, - "Z": _TZ_Z_RE, - "S": _ONE_OR_MORE_DIGIT_RE, - "W": _WEEK_DATE_RE, - } - - SEPARATORS: ClassVar[List[str]] = ["-", "/", "."] - - locale: locales.Locale - _input_re_map: Dict[_FORMAT_TYPE, Pattern[str]] - - def __init__(self, locale: str = DEFAULT_LOCALE, cache_size: int = 0) -> None: - - self.locale = locales.get_locale(locale) - self._input_re_map = self._BASE_INPUT_RE_MAP.copy() - self._input_re_map.update( - { - "MMMM": self._generate_choice_re( - self.locale.month_names[1:], re.IGNORECASE - ), - "MMM": self._generate_choice_re( - self.locale.month_abbreviations[1:], re.IGNORECASE - ), - "Do": re.compile(self.locale.ordinal_day_re), - "dddd": self._generate_choice_re( - self.locale.day_names[1:], re.IGNORECASE - ), - "ddd": self._generate_choice_re( - self.locale.day_abbreviations[1:], re.IGNORECASE - ), - "d": re.compile(r"[1-7]"), - "a": self._generate_choice_re( - (self.locale.meridians["am"], self.locale.meridians["pm"]) - ), - # note: 'A' token accepts both 'am/pm' and 'AM/PM' formats to - # ensure backwards compatibility of this token - "A": self._generate_choice_re(self.locale.meridians.values()), - } - ) - if cache_size > 0: - self._generate_pattern_re = lru_cache(maxsize=cache_size)( # type: ignore - self._generate_pattern_re - ) - - # TODO: since we support more than ISO 8601, we should rename this function - # IDEA: break into multiple functions - def parse_iso( - self, datetime_string: str, normalize_whitespace: bool = False - ) -> datetime: - - if normalize_whitespace: - datetime_string = re.sub(r"\s+", " ", datetime_string.strip()) - - has_space_divider = " " in datetime_string - has_t_divider = "T" in datetime_string - - num_spaces = datetime_string.count(" ") - if has_space_divider and num_spaces != 1 or has_t_divider and num_spaces > 0: - raise ParserError( - f"Expected an ISO 8601-like string, but was given {datetime_string!r}. " - "Try passing in a format string to resolve this." - ) - - has_time = has_space_divider or has_t_divider - has_tz = False - - # date formats (ISO 8601 and others) to test against - # NOTE: YYYYMM is omitted to avoid confusion with YYMMDD (no longer part of ISO 8601, but is still often used) - formats = [ - "YYYY-MM-DD", - "YYYY-M-DD", - "YYYY-M-D", - "YYYY/MM/DD", - "YYYY/M/DD", - "YYYY/M/D", - "YYYY.MM.DD", - "YYYY.M.DD", - "YYYY.M.D", - "YYYYMMDD", - "YYYY-DDDD", - "YYYYDDDD", - "YYYY-MM", - "YYYY/MM", - "YYYY.MM", - "YYYY", - "W", - ] - - if has_time: - - if has_space_divider: - date_string, time_string = datetime_string.split(" ", 1) - else: - date_string, time_string = datetime_string.split("T", 1) - - time_parts = re.split(r"[\+\-Z]", time_string, 1, re.IGNORECASE) - - time_components: Optional[Match[str]] = self._TIME_RE.match(time_parts[0]) - - if time_components is None: - raise ParserError( - "Invalid time component provided. " - "Please specify a format or provide a valid time component in the basic or extended ISO 8601 time format." - ) - - ( - hours, - minutes, - seconds, - subseconds_sep, - subseconds, - ) = time_components.groups() - - has_tz = len(time_parts) == 2 - has_minutes = minutes is not None - has_seconds = seconds is not None - has_subseconds = subseconds is not None - - is_basic_time_format = ":" not in time_parts[0] - tz_format = "Z" - - # use 'ZZ' token instead since tz offset is present in non-basic format - if has_tz and ":" in time_parts[1]: - tz_format = "ZZ" - - time_sep = "" if is_basic_time_format else ":" - - if has_subseconds: - time_string = "HH{time_sep}mm{time_sep}ss{subseconds_sep}S".format( - time_sep=time_sep, subseconds_sep=subseconds_sep - ) - elif has_seconds: - time_string = "HH{time_sep}mm{time_sep}ss".format(time_sep=time_sep) - elif has_minutes: - time_string = f"HH{time_sep}mm" - else: - time_string = "HH" - - if has_space_divider: - formats = [f"{f} {time_string}" for f in formats] - else: - formats = [f"{f}T{time_string}" for f in formats] - - if has_time and has_tz: - # Add "Z" or "ZZ" to the format strings to indicate to - # _parse_token() that a timezone needs to be parsed - formats = [f"{f}{tz_format}" for f in formats] - - return self._parse_multiformat(datetime_string, formats) - - def parse( - self, - datetime_string: str, - fmt: Union[List[str], str], - normalize_whitespace: bool = False, - ) -> datetime: - - if normalize_whitespace: - datetime_string = re.sub(r"\s+", " ", datetime_string) - - if isinstance(fmt, list): - return self._parse_multiformat(datetime_string, fmt) - - try: - fmt_tokens: List[_FORMAT_TYPE] - fmt_pattern_re: Pattern[str] - fmt_tokens, fmt_pattern_re = self._generate_pattern_re(fmt) - except re.error as e: - raise ParserMatchError( - f"Failed to generate regular expression pattern: {e}." - ) - - match = fmt_pattern_re.search(datetime_string) - - if match is None: - raise ParserMatchError( - f"Failed to match {fmt!r} when parsing {datetime_string!r}." - ) - - parts: _Parts = {} - for token in fmt_tokens: - value: Union[Tuple[str, str, str], str] - if token == "Do": - value = match.group("value") - elif token == "W": - value = (match.group("year"), match.group("week"), match.group("day")) - else: - value = match.group(token) - - if value is None: - raise ParserMatchError( - f"Unable to find a match group for the specified token {token!r}." - ) - - self._parse_token(token, value, parts) # type: ignore - - return self._build_datetime(parts) - - def _generate_pattern_re(self, fmt: str) -> Tuple[List[_FORMAT_TYPE], Pattern[str]]: - - # fmt is a string of tokens like 'YYYY-MM-DD' - # we construct a new string by replacing each - # token by its pattern: - # 'YYYY-MM-DD' -> '(?P\d{4})-(?P\d{2})-(?P
\d{2})' - tokens: List[_FORMAT_TYPE] = [] - offset = 0 - - # Escape all special RegEx chars - escaped_fmt = re.escape(fmt) - - # Extract the bracketed expressions to be reinserted later. - escaped_fmt = re.sub(self._ESCAPE_RE, "#", escaped_fmt) - - # Any number of S is the same as one. - # TODO: allow users to specify the number of digits to parse - escaped_fmt = re.sub(r"S+", "S", escaped_fmt) - - escaped_data = re.findall(self._ESCAPE_RE, fmt) - - fmt_pattern = escaped_fmt - - for m in self._FORMAT_RE.finditer(escaped_fmt): - token: _FORMAT_TYPE = cast(_FORMAT_TYPE, m.group(0)) - try: - input_re = self._input_re_map[token] - except KeyError: - raise ParserError(f"Unrecognized token {token!r}.") - input_pattern = f"(?P<{token}>{input_re.pattern})" - tokens.append(token) - # a pattern doesn't have the same length as the token - # it replaces! We keep the difference in the offset variable. - # This works because the string is scanned left-to-right and matches - # are returned in the order found by finditer. - fmt_pattern = ( - fmt_pattern[: m.start() + offset] - + input_pattern - + fmt_pattern[m.end() + offset :] - ) - offset += len(input_pattern) - (m.end() - m.start()) - - final_fmt_pattern = "" - split_fmt = fmt_pattern.split(r"\#") - - # Due to the way Python splits, 'split_fmt' will always be longer - for i in range(len(split_fmt)): - final_fmt_pattern += split_fmt[i] - if i < len(escaped_data): - final_fmt_pattern += escaped_data[i][1:-1] - - # Wrap final_fmt_pattern in a custom word boundary to strictly - # match the formatting pattern and filter out date and time formats - # that include junk such as: blah1998-09-12 blah, blah 1998-09-12blah, - # blah1998-09-12blah. The custom word boundary matches every character - # that is not a whitespace character to allow for searching for a date - # and time string in a natural language sentence. Therefore, searching - # for a string of the form YYYY-MM-DD in "blah 1998-09-12 blah" will - # work properly. - # Certain punctuation before or after the target pattern such as - # "1998-09-12," is permitted. For the full list of valid punctuation, - # see the documentation. - - starting_word_boundary = ( - r"(?\s])" # This is the list of punctuation that is ok before the - # pattern (i.e. "It can't not be these characters before the pattern") - r"(\b|^)" - # The \b is to block cases like 1201912 but allow 201912 for pattern YYYYMM. The ^ was necessary to allow a - # negative number through i.e. before epoch numbers - ) - ending_word_boundary = ( - r"(?=[\,\.\;\:\?\!\"\'\`\[\]\{\}\(\)\<\>]?" # Positive lookahead stating that these punctuation marks - # can appear after the pattern at most 1 time - r"(?!\S))" # Don't allow any non-whitespace character after the punctuation - ) - bounded_fmt_pattern = r"{}{}{}".format( - starting_word_boundary, final_fmt_pattern, ending_word_boundary - ) - - return tokens, re.compile(bounded_fmt_pattern, flags=re.IGNORECASE) - - @overload - def _parse_token( - self, - token: Literal[ - "YYYY", - "YY", - "MM", - "M", - "DDDD", - "DDD", - "DD", - "D", - "Do", - "HH", - "hh", - "h", - "H", - "mm", - "m", - "ss", - "s", - "x", - ], - value: Union[str, bytes, SupportsInt, bytearray], - parts: _Parts, - ) -> None: - ... # pragma: no cover - - @overload - def _parse_token( - self, - token: Literal["X"], - value: Union[str, bytes, SupportsFloat, bytearray], - parts: _Parts, - ) -> None: - ... # pragma: no cover - - @overload - def _parse_token( - self, - token: Literal["MMMM", "MMM", "dddd", "ddd", "S"], - value: Union[str, bytes, bytearray], - parts: _Parts, - ) -> None: - ... # pragma: no cover - - @overload - def _parse_token( - self, - token: Literal["a", "A", "ZZZ", "ZZ", "Z"], - value: Union[str, bytes], - parts: _Parts, - ) -> None: - ... # pragma: no cover - - @overload - def _parse_token( - self, - token: Literal["W"], - value: Tuple[_WEEKDATE_ELEMENT, _WEEKDATE_ELEMENT, Optional[_WEEKDATE_ELEMENT]], - parts: _Parts, - ) -> None: - ... # pragma: no cover - - def _parse_token( - self, - token: Any, - value: Any, - parts: _Parts, - ) -> None: - - if token == "YYYY": - parts["year"] = int(value) - - elif token == "YY": - value = int(value) - parts["year"] = 1900 + value if value > 68 else 2000 + value - - elif token in ["MMMM", "MMM"]: - # FIXME: month_number() is nullable - parts["month"] = self.locale.month_number(value.lower()) # type: ignore - - elif token in ["MM", "M"]: - parts["month"] = int(value) - - elif token in ["DDDD", "DDD"]: - parts["day_of_year"] = int(value) - - elif token in ["DD", "D"]: - parts["day"] = int(value) - - elif token == "Do": - parts["day"] = int(value) - - elif token == "dddd": - # locale day names are 1-indexed - day_of_week = [x.lower() for x in self.locale.day_names].index( - value.lower() - ) - parts["day_of_week"] = day_of_week - 1 - - elif token == "ddd": - # locale day abbreviations are 1-indexed - day_of_week = [x.lower() for x in self.locale.day_abbreviations].index( - value.lower() - ) - parts["day_of_week"] = day_of_week - 1 - - elif token.upper() in ["HH", "H"]: - parts["hour"] = int(value) - - elif token in ["mm", "m"]: - parts["minute"] = int(value) - - elif token in ["ss", "s"]: - parts["second"] = int(value) - - elif token == "S": - # We have the *most significant* digits of an arbitrary-precision integer. - # We want the six most significant digits as an integer, rounded. - # IDEA: add nanosecond support somehow? Need datetime support for it first. - value = value.ljust(7, "0") - - # floating-point (IEEE-754) defaults to half-to-even rounding - seventh_digit = int(value[6]) - if seventh_digit == 5: - rounding = int(value[5]) % 2 - elif seventh_digit > 5: - rounding = 1 - else: - rounding = 0 - - parts["microsecond"] = int(value[:6]) + rounding - - elif token == "X": - parts["timestamp"] = float(value) - - elif token == "x": - parts["expanded_timestamp"] = int(value) - - elif token in ["ZZZ", "ZZ", "Z"]: - parts["tzinfo"] = TzinfoParser.parse(value) - - elif token in ["a", "A"]: - if value in (self.locale.meridians["am"], self.locale.meridians["AM"]): - parts["am_pm"] = "am" - if "hour" in parts and not 0 <= parts["hour"] <= 12: - raise ParserMatchError( - f"Hour token value must be between 0 and 12 inclusive for token {token!r}." - ) - elif value in (self.locale.meridians["pm"], self.locale.meridians["PM"]): - parts["am_pm"] = "pm" - elif token == "W": - parts["weekdate"] = value - - @staticmethod - def _build_datetime(parts: _Parts) -> datetime: - weekdate = parts.get("weekdate") - - if weekdate is not None: - - year, week = int(weekdate[0]), int(weekdate[1]) - - if weekdate[2] is not None: - _day = int(weekdate[2]) - else: - # day not given, default to 1 - _day = 1 - - date_string = f"{year}-{week}-{_day}" - - # tokens for ISO 8601 weekdates - dt = datetime.strptime(date_string, "%G-%V-%u") - - parts["year"] = dt.year - parts["month"] = dt.month - parts["day"] = dt.day - - timestamp = parts.get("timestamp") - - if timestamp is not None: - return datetime.fromtimestamp(timestamp, tz=tz.tzutc()) - - expanded_timestamp = parts.get("expanded_timestamp") - - if expanded_timestamp is not None: - return datetime.fromtimestamp( - normalize_timestamp(expanded_timestamp), - tz=tz.tzutc(), - ) - - day_of_year = parts.get("day_of_year") - - if day_of_year is not None: - _year = parts.get("year") - month = parts.get("month") - if _year is None: - raise ParserError( - "Year component is required with the DDD and DDDD tokens." - ) - - if month is not None: - raise ParserError( - "Month component is not allowed with the DDD and DDDD tokens." - ) - - date_string = f"{_year}-{day_of_year}" - try: - dt = datetime.strptime(date_string, "%Y-%j") - except ValueError: - raise ParserError( - f"The provided day of year {day_of_year!r} is invalid." - ) - - parts["year"] = dt.year - parts["month"] = dt.month - parts["day"] = dt.day - - day_of_week: Optional[int] = parts.get("day_of_week") - day = parts.get("day") - - # If day is passed, ignore day of week - if day_of_week is not None and day is None: - year = parts.get("year", 1970) - month = parts.get("month", 1) - day = 1 - - # dddd => first day of week after epoch - # dddd YYYY => first day of week in specified year - # dddd MM YYYY => first day of week in specified year and month - # dddd MM => first day after epoch in specified month - next_weekday_dt = next_weekday(datetime(year, month, day), day_of_week) - parts["year"] = next_weekday_dt.year - parts["month"] = next_weekday_dt.month - parts["day"] = next_weekday_dt.day - - am_pm = parts.get("am_pm") - hour = parts.get("hour", 0) - - if am_pm == "pm" and hour < 12: - hour += 12 - elif am_pm == "am" and hour == 12: - hour = 0 - - # Support for midnight at the end of day - if hour == 24: - if parts.get("minute", 0) != 0: - raise ParserError("Midnight at the end of day must not contain minutes") - if parts.get("second", 0) != 0: - raise ParserError("Midnight at the end of day must not contain seconds") - if parts.get("microsecond", 0) != 0: - raise ParserError( - "Midnight at the end of day must not contain microseconds" - ) - hour = 0 - day_increment = 1 - else: - day_increment = 0 - - # account for rounding up to 1000000 - microsecond = parts.get("microsecond", 0) - if microsecond == 1000000: - microsecond = 0 - second_increment = 1 - else: - second_increment = 0 - - increment = timedelta(days=day_increment, seconds=second_increment) - - return ( - datetime( - year=parts.get("year", 1), - month=parts.get("month", 1), - day=parts.get("day", 1), - hour=hour, - minute=parts.get("minute", 0), - second=parts.get("second", 0), - microsecond=microsecond, - tzinfo=parts.get("tzinfo"), - ) - + increment - ) - - def _parse_multiformat(self, string: str, formats: Iterable[str]) -> datetime: - - _datetime: Optional[datetime] = None - - for fmt in formats: - try: - _datetime = self.parse(string, fmt) - break - except ParserMatchError: - pass - - if _datetime is None: - supported_formats = ", ".join(formats) - raise ParserError( - f"Could not match input {string!r} to any of the following formats: {supported_formats}." - ) - - return _datetime - - # generates a capture group of choices separated by an OR operator - @staticmethod - def _generate_choice_re( - choices: Iterable[str], flags: Union[int, re.RegexFlag] = 0 - ) -> Pattern[str]: - return re.compile(r"({})".format("|".join(choices)), flags=flags) - - -class TzinfoParser: - _TZINFO_RE: ClassVar[Pattern[str]] = re.compile( - r"^([\+\-])?(\d{2})(?:\:?(\d{2}))?$" - ) - - @classmethod - def parse(cls, tzinfo_string: str) -> dt_tzinfo: - - tzinfo: Optional[dt_tzinfo] = None - - if tzinfo_string == "local": - tzinfo = tz.tzlocal() - - elif tzinfo_string in ["utc", "UTC", "Z"]: - tzinfo = tz.tzutc() - - else: - - iso_match = cls._TZINFO_RE.match(tzinfo_string) - - if iso_match: - sign: Optional[str] - hours: str - minutes: Union[str, int, None] - sign, hours, minutes = iso_match.groups() - seconds = int(hours) * 3600 + int(minutes or 0) * 60 - - if sign == "-": - seconds *= -1 - - tzinfo = tz.tzoffset(None, seconds) - - else: - tzinfo = tz.gettz(tzinfo_string) - - if tzinfo is None: - raise ParserError(f"Could not parse timezone expression {tzinfo_string!r}.") - - return tzinfo diff --git a/.venv/Lib/site-packages/arrow/py.typed b/.venv/Lib/site-packages/arrow/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/Lib/site-packages/arrow/util.py b/.venv/Lib/site-packages/arrow/util.py deleted file mode 100644 index f3eaa21..0000000 --- a/.venv/Lib/site-packages/arrow/util.py +++ /dev/null @@ -1,117 +0,0 @@ -"""Helpful functions used internally within arrow.""" - -import datetime -from typing import Any, Optional, cast - -from dateutil.rrule import WEEKLY, rrule - -from arrow.constants import ( - MAX_ORDINAL, - MAX_TIMESTAMP, - MAX_TIMESTAMP_MS, - MAX_TIMESTAMP_US, - MIN_ORDINAL, -) - - -def next_weekday( - start_date: Optional[datetime.date], weekday: int -) -> datetime.datetime: - """Get next weekday from the specified start date. - - :param start_date: Datetime object representing the start date. - :param weekday: Next weekday to obtain. Can be a value between 0 (Monday) and 6 (Sunday). - :return: Datetime object corresponding to the next weekday after start_date. - - Usage:: - - # Get first Monday after epoch - >>> next_weekday(datetime(1970, 1, 1), 0) - 1970-01-05 00:00:00 - - # Get first Thursday after epoch - >>> next_weekday(datetime(1970, 1, 1), 3) - 1970-01-01 00:00:00 - - # Get first Sunday after epoch - >>> next_weekday(datetime(1970, 1, 1), 6) - 1970-01-04 00:00:00 - """ - if weekday < 0 or weekday > 6: - raise ValueError("Weekday must be between 0 (Monday) and 6 (Sunday).") - return cast( - datetime.datetime, - rrule(freq=WEEKLY, dtstart=start_date, byweekday=weekday, count=1)[0], - ) - - -def is_timestamp(value: Any) -> bool: - """Check if value is a valid timestamp.""" - if isinstance(value, bool): - return False - if not isinstance(value, (int, float, str)): - return False - try: - float(value) - return True - except ValueError: - return False - - -def validate_ordinal(value: Any) -> None: - """Raise an exception if value is an invalid Gregorian ordinal. - - :param value: the input to be checked - - """ - if isinstance(value, bool) or not isinstance(value, int): - raise TypeError(f"Ordinal must be an integer (got type {type(value)}).") - if not (MIN_ORDINAL <= value <= MAX_ORDINAL): - raise ValueError(f"Ordinal {value} is out of range.") - - -def normalize_timestamp(timestamp: float) -> float: - """Normalize millisecond and microsecond timestamps into normal timestamps.""" - if timestamp > MAX_TIMESTAMP: - if timestamp < MAX_TIMESTAMP_MS: - timestamp /= 1000 - elif timestamp < MAX_TIMESTAMP_US: - timestamp /= 1_000_000 - else: - raise ValueError(f"The specified timestamp {timestamp!r} is too large.") - return timestamp - - -# Credit to https://stackoverflow.com/a/1700069 -def iso_to_gregorian(iso_year: int, iso_week: int, iso_day: int) -> datetime.date: - """Converts an ISO week date into a datetime object. - - :param iso_year: the year - :param iso_week: the week number, each year has either 52 or 53 weeks - :param iso_day: the day numbered 1 through 7, beginning with Monday - - """ - - if not 1 <= iso_week <= 53: - raise ValueError("ISO Calendar week value must be between 1-53.") - - if not 1 <= iso_day <= 7: - raise ValueError("ISO Calendar day value must be between 1-7") - - # The first week of the year always contains 4 Jan. - fourth_jan = datetime.date(iso_year, 1, 4) - delta = datetime.timedelta(fourth_jan.isoweekday() - 1) - year_start = fourth_jan - delta - gregorian = year_start + datetime.timedelta(days=iso_day - 1, weeks=iso_week - 1) - - return gregorian - - -def validate_bounds(bounds: str) -> None: - if bounds != "()" and bounds != "(]" and bounds != "[)" and bounds != "[]": - raise ValueError( - "Invalid bounds. Please select between '()', '(]', '[)', or '[]'." - ) - - -__all__ = ["next_weekday", "is_timestamp", "validate_ordinal", "iso_to_gregorian"] diff --git a/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/INSTALLER b/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/LICENSE b/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/LICENSE deleted file mode 100644 index 033c86b..0000000 --- a/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2016-2020 aio-libs collaboration. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/METADATA b/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/METADATA deleted file mode 100644 index e68d234..0000000 --- a/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/METADATA +++ /dev/null @@ -1,133 +0,0 @@ -Metadata-Version: 2.1 -Name: async-timeout -Version: 4.0.2 -Summary: Timeout context manager for asyncio programs -Home-page: https://github.com/aio-libs/async-timeout -Author: Andrew Svetlov -Author-email: andrew.svetlov@gmail.com -License: Apache 2 -Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby -Project-URL: CI: GitHub Actions, https://github.com/aio-libs/async-timeout/actions -Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/async-timeout -Project-URL: GitHub: issues, https://github.com/aio-libs/async-timeout/issues -Project-URL: GitHub: repo, https://github.com/aio-libs/async-timeout -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Topic :: Software Development :: Libraries -Classifier: Framework :: AsyncIO -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Requires-Python: >=3.6 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: typing-extensions (>=3.6.5) ; python_version < "3.8" - -async-timeout -============= -.. image:: https://travis-ci.com/aio-libs/async-timeout.svg?branch=master - :target: https://travis-ci.com/aio-libs/async-timeout -.. image:: https://codecov.io/gh/aio-libs/async-timeout/branch/master/graph/badge.svg - :target: https://codecov.io/gh/aio-libs/async-timeout -.. image:: https://img.shields.io/pypi/v/async-timeout.svg - :target: https://pypi.python.org/pypi/async-timeout -.. image:: https://badges.gitter.im/Join%20Chat.svg - :target: https://gitter.im/aio-libs/Lobby - :alt: Chat on Gitter - -asyncio-compatible timeout context manager. - - -Usage example -------------- - - -The context manager is useful in cases when you want to apply timeout -logic around block of code or in cases when ``asyncio.wait_for()`` is -not suitable. Also it's much faster than ``asyncio.wait_for()`` -because ``timeout`` doesn't create a new task. - -The ``timeout(delay, *, loop=None)`` call returns a context manager -that cancels a block on *timeout* expiring:: - - async with timeout(1.5): - await inner() - -1. If ``inner()`` is executed faster than in ``1.5`` seconds nothing - happens. -2. Otherwise ``inner()`` is cancelled internally by sending - ``asyncio.CancelledError`` into but ``asyncio.TimeoutError`` is - raised outside of context manager scope. - -*timeout* parameter could be ``None`` for skipping timeout functionality. - - -Alternatively, ``timeout_at(when)`` can be used for scheduling -at the absolute time:: - - loop = asyncio.get_event_loop() - now = loop.time() - - async with timeout_at(now + 1.5): - await inner() - - -Please note: it is not POSIX time but a time with -undefined starting base, e.g. the time of the system power on. - - -Context manager has ``.expired`` property for check if timeout happens -exactly in context manager:: - - async with timeout(1.5) as cm: - await inner() - print(cm.expired) - -The property is ``True`` if ``inner()`` execution is cancelled by -timeout context manager. - -If ``inner()`` call explicitly raises ``TimeoutError`` ``cm.expired`` -is ``False``. - -The scheduled deadline time is available as ``.deadline`` property:: - - async with timeout(1.5) as cm: - cm.deadline - -Not finished yet timeout can be rescheduled by ``shift_by()`` -or ``shift_to()`` methods:: - - async with timeout(1.5) as cm: - cm.shift(1) # add another second on waiting - cm.update(loop.time() + 5) # reschedule to now+5 seconds - -Rescheduling is forbidden if the timeout is expired or after exit from ``async with`` -code block. - - -Installation ------------- - -:: - - $ pip install async-timeout - -The library is Python 3 only! - - - -Authors and License -------------------- - -The module is written by Andrew Svetlov. - -It's *Apache 2* licensed and freely available. - - diff --git a/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/RECORD b/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/RECORD deleted file mode 100644 index 60e4fb8..0000000 --- a/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/RECORD +++ /dev/null @@ -1,10 +0,0 @@ -async_timeout-4.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -async_timeout-4.0.2.dist-info/LICENSE,sha256=4Y17uPUT4sRrtYXJS1hb0wcg3TzLId2weG9y0WZY-Sw,568 -async_timeout-4.0.2.dist-info/METADATA,sha256=2pfMxxBst5vQ7SfMy5TDaDU0cRgCSQa7wcD5eI-Ew-8,4193 -async_timeout-4.0.2.dist-info/RECORD,, -async_timeout-4.0.2.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 -async_timeout-4.0.2.dist-info/top_level.txt,sha256=9oM4e7Twq8iD_7_Q3Mz0E6GPIB6vJvRFo-UBwUQtBDU,14 -async_timeout-4.0.2.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 -async_timeout/__init__.py,sha256=N-JUI_VExhHnO0emkF_-h08dl4HBgOje16N4Ci-W-go,7487 -async_timeout/__pycache__/__init__.cpython-38.pyc,, -async_timeout/py.typed,sha256=tyozzRT1fziXETDxokmuyt6jhOmtjUbnVNJdZcG7ik0,12 diff --git a/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/WHEEL b/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/WHEEL deleted file mode 100644 index 5bad85f..0000000 --- a/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/top_level.txt b/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/top_level.txt deleted file mode 100644 index ad29955..0000000 --- a/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -async_timeout diff --git a/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/zip-safe b/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/zip-safe deleted file mode 100644 index 8b13789..0000000 --- a/.venv/Lib/site-packages/async_timeout-4.0.2.dist-info/zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/.venv/Lib/site-packages/async_timeout/__init__.py b/.venv/Lib/site-packages/async_timeout/__init__.py deleted file mode 100644 index 179d1b0..0000000 --- a/.venv/Lib/site-packages/async_timeout/__init__.py +++ /dev/null @@ -1,247 +0,0 @@ -import asyncio -import enum -import sys -import warnings -from types import TracebackType -from typing import Any, Optional, Type - - -if sys.version_info >= (3, 8): - from typing import final -else: - from typing_extensions import final - - -__version__ = "4.0.2" - - -__all__ = ("timeout", "timeout_at", "Timeout") - - -def timeout(delay: Optional[float]) -> "Timeout": - """timeout context manager. - - Useful in cases when you want to apply timeout logic around block - of code or in cases when asyncio.wait_for is not suitable. For example: - - >>> async with timeout(0.001): - ... async with aiohttp.get('https://github.com') as r: - ... await r.text() - - - delay - value in seconds or None to disable timeout logic - """ - loop = _get_running_loop() - if delay is not None: - deadline = loop.time() + delay # type: Optional[float] - else: - deadline = None - return Timeout(deadline, loop) - - -def timeout_at(deadline: Optional[float]) -> "Timeout": - """Schedule the timeout at absolute time. - - deadline argument points on the time in the same clock system - as loop.time(). - - Please note: it is not POSIX time but a time with - undefined starting base, e.g. the time of the system power on. - - >>> async with timeout_at(loop.time() + 10): - ... async with aiohttp.get('https://github.com') as r: - ... await r.text() - - - """ - loop = _get_running_loop() - return Timeout(deadline, loop) - - -class _State(enum.Enum): - INIT = "INIT" - ENTER = "ENTER" - TIMEOUT = "TIMEOUT" - EXIT = "EXIT" - - -@final -class Timeout: - # Internal class, please don't instantiate it directly - # Use timeout() and timeout_at() public factories instead. - # - # Implementation note: `async with timeout()` is preferred - # over `with timeout()`. - # While technically the Timeout class implementation - # doesn't need to be async at all, - # the `async with` statement explicitly points that - # the context manager should be used from async function context. - # - # This design allows to avoid many silly misusages. - # - # TimeoutError is raised immadiatelly when scheduled - # if the deadline is passed. - # The purpose is to time out as sson as possible - # without waiting for the next await expression. - - __slots__ = ("_deadline", "_loop", "_state", "_timeout_handler") - - def __init__( - self, deadline: Optional[float], loop: asyncio.AbstractEventLoop - ) -> None: - self._loop = loop - self._state = _State.INIT - - self._timeout_handler = None # type: Optional[asyncio.Handle] - if deadline is None: - self._deadline = None # type: Optional[float] - else: - self.update(deadline) - - def __enter__(self) -> "Timeout": - warnings.warn( - "with timeout() is deprecated, use async with timeout() instead", - DeprecationWarning, - stacklevel=2, - ) - self._do_enter() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> Optional[bool]: - self._do_exit(exc_type) - return None - - async def __aenter__(self) -> "Timeout": - self._do_enter() - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> Optional[bool]: - self._do_exit(exc_type) - return None - - @property - def expired(self) -> bool: - """Is timeout expired during execution?""" - return self._state == _State.TIMEOUT - - @property - def deadline(self) -> Optional[float]: - return self._deadline - - def reject(self) -> None: - """Reject scheduled timeout if any.""" - # cancel is maybe better name but - # task.cancel() raises CancelledError in asyncio world. - if self._state not in (_State.INIT, _State.ENTER): - raise RuntimeError(f"invalid state {self._state.value}") - self._reject() - - def _reject(self) -> None: - if self._timeout_handler is not None: - self._timeout_handler.cancel() - self._timeout_handler = None - - def shift(self, delay: float) -> None: - """Advance timeout on delay seconds. - - The delay can be negative. - - Raise RuntimeError if shift is called when deadline is not scheduled - """ - deadline = self._deadline - if deadline is None: - raise RuntimeError("cannot shift timeout if deadline is not scheduled") - self.update(deadline + delay) - - def update(self, deadline: float) -> None: - """Set deadline to absolute value. - - deadline argument points on the time in the same clock system - as loop.time(). - - If new deadline is in the past the timeout is raised immediatelly. - - Please note: it is not POSIX time but a time with - undefined starting base, e.g. the time of the system power on. - """ - if self._state == _State.EXIT: - raise RuntimeError("cannot reschedule after exit from context manager") - if self._state == _State.TIMEOUT: - raise RuntimeError("cannot reschedule expired timeout") - if self._timeout_handler is not None: - self._timeout_handler.cancel() - self._deadline = deadline - if self._state != _State.INIT: - self._reschedule() - - def _reschedule(self) -> None: - assert self._state == _State.ENTER - deadline = self._deadline - if deadline is None: - return - - now = self._loop.time() - if self._timeout_handler is not None: - self._timeout_handler.cancel() - - task = _current_task(self._loop) - if deadline <= now: - self._timeout_handler = self._loop.call_soon(self._on_timeout, task) - else: - self._timeout_handler = self._loop.call_at(deadline, self._on_timeout, task) - - def _do_enter(self) -> None: - if self._state != _State.INIT: - raise RuntimeError(f"invalid state {self._state.value}") - self._state = _State.ENTER - self._reschedule() - - def _do_exit(self, exc_type: Optional[Type[BaseException]]) -> None: - if exc_type is asyncio.CancelledError and self._state == _State.TIMEOUT: - self._timeout_handler = None - raise asyncio.TimeoutError - # timeout has not expired - self._state = _State.EXIT - self._reject() - return None - - def _on_timeout(self, task: "asyncio.Task[None]") -> None: - task.cancel() - self._state = _State.TIMEOUT - # drop the reference early - self._timeout_handler = None - - -if sys.version_info >= (3, 7): - - def _current_task(loop: asyncio.AbstractEventLoop) -> "Optional[asyncio.Task[Any]]": - return asyncio.current_task(loop=loop) - -else: - - def _current_task(loop: asyncio.AbstractEventLoop) -> "Optional[asyncio.Task[Any]]": - return asyncio.Task.current_task(loop=loop) - - -if sys.version_info >= (3, 7): - - def _get_running_loop() -> asyncio.AbstractEventLoop: - return asyncio.get_running_loop() - -else: - - def _get_running_loop() -> asyncio.AbstractEventLoop: - loop = asyncio.get_event_loop() - if not loop.is_running(): - raise RuntimeError("no running event loop") - return loop diff --git a/.venv/Lib/site-packages/async_timeout/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/async_timeout/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 84b5027e48814d7e1783307fa4a21f7b5fede4cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6881 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 OrK&MkXj(O+S@;i~uOPMn diff --git a/.venv/Lib/site-packages/async_timeout/py.typed b/.venv/Lib/site-packages/async_timeout/py.typed deleted file mode 100644 index 3b94f91..0000000 --- a/.venv/Lib/site-packages/async_timeout/py.typed +++ /dev/null @@ -1 +0,0 @@ -Placeholder diff --git a/.venv/Lib/site-packages/attr/__init__.py b/.venv/Lib/site-packages/attr/__init__.py deleted file mode 100644 index 386305d..0000000 --- a/.venv/Lib/site-packages/attr/__init__.py +++ /dev/null @@ -1,79 +0,0 @@ -# SPDX-License-Identifier: MIT - - -import sys - -from functools import partial - -from . import converters, exceptions, filters, setters, validators -from ._cmp import cmp_using -from ._config import get_run_validators, set_run_validators -from ._funcs import asdict, assoc, astuple, evolve, has, resolve_types -from ._make import ( - NOTHING, - Attribute, - Factory, - attrib, - attrs, - fields, - fields_dict, - make_class, - validate, -) -from ._version_info import VersionInfo - - -__version__ = "22.1.0" -__version_info__ = VersionInfo._from_version_string(__version__) - -__title__ = "attrs" -__description__ = "Classes Without Boilerplate" -__url__ = "https://www.attrs.org/" -__uri__ = __url__ -__doc__ = __description__ + " <" + __uri__ + ">" - -__author__ = "Hynek Schlawack" -__email__ = "hs@ox.cx" - -__license__ = "MIT" -__copyright__ = "Copyright (c) 2015 Hynek Schlawack" - - -s = attributes = attrs -ib = attr = attrib -dataclass = partial(attrs, auto_attribs=True) # happy Easter ;) - -__all__ = [ - "Attribute", - "Factory", - "NOTHING", - "asdict", - "assoc", - "astuple", - "attr", - "attrib", - "attributes", - "attrs", - "cmp_using", - "converters", - "evolve", - "exceptions", - "fields", - "fields_dict", - "filters", - "get_run_validators", - "has", - "ib", - "make_class", - "resolve_types", - "s", - "set_run_validators", - "setters", - "validate", - "validators", -] - -if sys.version_info[:2] >= (3, 6): - from ._next_gen import define, field, frozen, mutable # noqa: F401 - - __all__.extend(("define", "field", "frozen", "mutable")) diff --git a/.venv/Lib/site-packages/attr/__init__.pyi b/.venv/Lib/site-packages/attr/__init__.pyi deleted file mode 100644 index 03cc4c8..0000000 --- a/.venv/Lib/site-packages/attr/__init__.pyi +++ /dev/null @@ -1,486 +0,0 @@ -import sys - -from typing import ( - Any, - Callable, - ClassVar, - Dict, - Generic, - List, - Mapping, - Optional, - Protocol, - Sequence, - Tuple, - Type, - TypeVar, - Union, - overload, -) - -# `import X as X` is required to make these public -from . import converters as converters -from . import exceptions as exceptions -from . import filters as filters -from . import setters as setters -from . import validators as validators -from ._cmp import cmp_using as cmp_using -from ._version_info import VersionInfo - -__version__: str -__version_info__: VersionInfo -__title__: str -__description__: str -__url__: str -__uri__: str -__author__: str -__email__: str -__license__: str -__copyright__: str - -_T = TypeVar("_T") -_C = TypeVar("_C", bound=type) - -_EqOrderType = Union[bool, Callable[[Any], Any]] -_ValidatorType = Callable[[Any, Attribute[_T], _T], Any] -_ConverterType = Callable[[Any], Any] -_FilterType = Callable[[Attribute[_T], _T], bool] -_ReprType = Callable[[Any], str] -_ReprArgType = Union[bool, _ReprType] -_OnSetAttrType = Callable[[Any, Attribute[Any], Any], Any] -_OnSetAttrArgType = Union[ - _OnSetAttrType, List[_OnSetAttrType], setters._NoOpType -] -_FieldTransformer = Callable[ - [type, List[Attribute[Any]]], List[Attribute[Any]] -] -# FIXME: in reality, if multiple validators are passed they must be in a list -# or tuple, but those are invariant and so would prevent subtypes of -# _ValidatorType from working when passed in a list or tuple. -_ValidatorArgType = Union[_ValidatorType[_T], Sequence[_ValidatorType[_T]]] - -# A protocol to be able to statically accept an attrs class. -class AttrsInstance(Protocol): - __attrs_attrs__: ClassVar[Any] - -# _make -- - -NOTHING: object - -# NOTE: Factory lies about its return type to make this possible: -# `x: List[int] # = Factory(list)` -# Work around mypy issue #4554 in the common case by using an overload. -if sys.version_info >= (3, 8): - from typing import Literal - @overload - def Factory(factory: Callable[[], _T]) -> _T: ... - @overload - def Factory( - factory: Callable[[Any], _T], - takes_self: Literal[True], - ) -> _T: ... - @overload - def Factory( - factory: Callable[[], _T], - takes_self: Literal[False], - ) -> _T: ... - -else: - @overload - def Factory(factory: Callable[[], _T]) -> _T: ... - @overload - def Factory( - factory: Union[Callable[[Any], _T], Callable[[], _T]], - takes_self: bool = ..., - ) -> _T: ... - -# Static type inference support via __dataclass_transform__ implemented as per: -# https://github.com/microsoft/pyright/blob/1.1.135/specs/dataclass_transforms.md -# This annotation must be applied to all overloads of "define" and "attrs" -# -# NOTE: This is a typing construct and does not exist at runtime. Extensions -# wrapping attrs decorators should declare a separate __dataclass_transform__ -# signature in the extension module using the specification linked above to -# provide pyright support. -def __dataclass_transform__( - *, - eq_default: bool = True, - order_default: bool = False, - kw_only_default: bool = False, - field_descriptors: Tuple[Union[type, Callable[..., Any]], ...] = (()), -) -> Callable[[_T], _T]: ... - -class Attribute(Generic[_T]): - name: str - default: Optional[_T] - validator: Optional[_ValidatorType[_T]] - repr: _ReprArgType - cmp: _EqOrderType - eq: _EqOrderType - order: _EqOrderType - hash: Optional[bool] - init: bool - converter: Optional[_ConverterType] - metadata: Dict[Any, Any] - type: Optional[Type[_T]] - kw_only: bool - on_setattr: _OnSetAttrType - def evolve(self, **changes: Any) -> "Attribute[Any]": ... - -# NOTE: We had several choices for the annotation to use for type arg: -# 1) Type[_T] -# - Pros: Handles simple cases correctly -# - Cons: Might produce less informative errors in the case of conflicting -# TypeVars e.g. `attr.ib(default='bad', type=int)` -# 2) Callable[..., _T] -# - Pros: Better error messages than #1 for conflicting TypeVars -# - Cons: Terrible error messages for validator checks. -# e.g. attr.ib(type=int, validator=validate_str) -# -> error: Cannot infer function type argument -# 3) type (and do all of the work in the mypy plugin) -# - Pros: Simple here, and we could customize the plugin with our own errors. -# - Cons: Would need to write mypy plugin code to handle all the cases. -# We chose option #1. - -# `attr` lies about its return type to make the following possible: -# attr() -> Any -# attr(8) -> int -# attr(validator=) -> Whatever the callable expects. -# This makes this type of assignments possible: -# x: int = attr(8) -# -# This form catches explicit None or no default but with no other arguments -# returns Any. -@overload -def attrib( - default: None = ..., - validator: None = ..., - repr: _ReprArgType = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - type: None = ..., - converter: None = ..., - factory: None = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., -) -> Any: ... - -# This form catches an explicit None or no default and infers the type from the -# other arguments. -@overload -def attrib( - default: None = ..., - validator: Optional[_ValidatorArgType[_T]] = ..., - repr: _ReprArgType = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - type: Optional[Type[_T]] = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., -) -> _T: ... - -# This form catches an explicit default argument. -@overload -def attrib( - default: _T, - validator: Optional[_ValidatorArgType[_T]] = ..., - repr: _ReprArgType = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - type: Optional[Type[_T]] = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., -) -> _T: ... - -# This form covers type=non-Type: e.g. forward references (str), Any -@overload -def attrib( - default: Optional[_T] = ..., - validator: Optional[_ValidatorArgType[_T]] = ..., - repr: _ReprArgType = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - type: object = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., -) -> Any: ... -@overload -def field( - *, - default: None = ..., - validator: None = ..., - repr: _ReprArgType = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - converter: None = ..., - factory: None = ..., - kw_only: bool = ..., - eq: Optional[bool] = ..., - order: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., -) -> Any: ... - -# This form catches an explicit None or no default and infers the type from the -# other arguments. -@overload -def field( - *, - default: None = ..., - validator: Optional[_ValidatorArgType[_T]] = ..., - repr: _ReprArgType = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., -) -> _T: ... - -# This form catches an explicit default argument. -@overload -def field( - *, - default: _T, - validator: Optional[_ValidatorArgType[_T]] = ..., - repr: _ReprArgType = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., -) -> _T: ... - -# This form covers type=non-Type: e.g. forward references (str), Any -@overload -def field( - *, - default: Optional[_T] = ..., - validator: Optional[_ValidatorArgType[_T]] = ..., - repr: _ReprArgType = ..., - hash: Optional[bool] = ..., - init: bool = ..., - metadata: Optional[Mapping[Any, Any]] = ..., - converter: Optional[_ConverterType] = ..., - factory: Optional[Callable[[], _T]] = ..., - kw_only: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., -) -> Any: ... -@overload -@__dataclass_transform__(order_default=True, field_descriptors=(attrib, field)) -def attrs( - maybe_cls: _C, - these: Optional[Dict[str, Any]] = ..., - repr_ns: Optional[str] = ..., - repr: bool = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - auto_detect: bool = ..., - collect_by_mro: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., - match_args: bool = ..., -) -> _C: ... -@overload -@__dataclass_transform__(order_default=True, field_descriptors=(attrib, field)) -def attrs( - maybe_cls: None = ..., - these: Optional[Dict[str, Any]] = ..., - repr_ns: Optional[str] = ..., - repr: bool = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - auto_detect: bool = ..., - collect_by_mro: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., - match_args: bool = ..., -) -> Callable[[_C], _C]: ... -@overload -@__dataclass_transform__(field_descriptors=(attrib, field)) -def define( - maybe_cls: _C, - *, - these: Optional[Dict[str, Any]] = ..., - repr: bool = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[bool] = ..., - order: Optional[bool] = ..., - auto_detect: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., - match_args: bool = ..., -) -> _C: ... -@overload -@__dataclass_transform__(field_descriptors=(attrib, field)) -def define( - maybe_cls: None = ..., - *, - these: Optional[Dict[str, Any]] = ..., - repr: bool = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[bool] = ..., - order: Optional[bool] = ..., - auto_detect: bool = ..., - getstate_setstate: Optional[bool] = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., - match_args: bool = ..., -) -> Callable[[_C], _C]: ... - -mutable = define -frozen = define # they differ only in their defaults - -def fields(cls: Type[AttrsInstance]) -> Any: ... -def fields_dict(cls: Type[AttrsInstance]) -> Dict[str, Attribute[Any]]: ... -def validate(inst: AttrsInstance) -> None: ... -def resolve_types( - cls: _C, - globalns: Optional[Dict[str, Any]] = ..., - localns: Optional[Dict[str, Any]] = ..., - attribs: Optional[List[Attribute[Any]]] = ..., -) -> _C: ... - -# TODO: add support for returning a proper attrs class from the mypy plugin -# we use Any instead of _CountingAttr so that e.g. `make_class('Foo', -# [attr.ib()])` is valid -def make_class( - name: str, - attrs: Union[List[str], Tuple[str, ...], Dict[str, Any]], - bases: Tuple[type, ...] = ..., - repr_ns: Optional[str] = ..., - repr: bool = ..., - cmp: Optional[_EqOrderType] = ..., - hash: Optional[bool] = ..., - init: bool = ..., - slots: bool = ..., - frozen: bool = ..., - weakref_slot: bool = ..., - str: bool = ..., - auto_attribs: bool = ..., - kw_only: bool = ..., - cache_hash: bool = ..., - auto_exc: bool = ..., - eq: Optional[_EqOrderType] = ..., - order: Optional[_EqOrderType] = ..., - collect_by_mro: bool = ..., - on_setattr: Optional[_OnSetAttrArgType] = ..., - field_transformer: Optional[_FieldTransformer] = ..., -) -> type: ... - -# _funcs -- - -# TODO: add support for returning TypedDict from the mypy plugin -# FIXME: asdict/astuple do not honor their factory args. Waiting on one of -# these: -# https://github.com/python/mypy/issues/4236 -# https://github.com/python/typing/issues/253 -# XXX: remember to fix attrs.asdict/astuple too! -def asdict( - inst: AttrsInstance, - recurse: bool = ..., - filter: Optional[_FilterType[Any]] = ..., - dict_factory: Type[Mapping[Any, Any]] = ..., - retain_collection_types: bool = ..., - value_serializer: Optional[ - Callable[[type, Attribute[Any], Any], Any] - ] = ..., - tuple_keys: Optional[bool] = ..., -) -> Dict[str, Any]: ... - -# TODO: add support for returning NamedTuple from the mypy plugin -def astuple( - inst: AttrsInstance, - recurse: bool = ..., - filter: Optional[_FilterType[Any]] = ..., - tuple_factory: Type[Sequence[Any]] = ..., - retain_collection_types: bool = ..., -) -> Tuple[Any, ...]: ... -def has(cls: type) -> bool: ... -def assoc(inst: _T, **changes: Any) -> _T: ... -def evolve(inst: _T, **changes: Any) -> _T: ... - -# _config -- - -def set_run_validators(run: bool) -> None: ... -def get_run_validators() -> bool: ... - -# aliases -- - -s = attributes = attrs -ib = attr = attrib -dataclass = attrs # Technically, partial(attrs, auto_attribs=True) ;) diff --git a/.venv/Lib/site-packages/attr/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/attr/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index f6ae9b43a33635d0e10853b158f52157920ef28d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1715 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 diff --git a/.venv/Lib/site-packages/attr/__pycache__/_compat.cpython-38.pyc b/.venv/Lib/site-packages/attr/__pycache__/_compat.cpython-38.pyc deleted file mode 100644 index 087415642ca62ad660322911171be13961d7e4dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4242 zcmbVPO>Y~=8Qz)QC6^RM$+G0wX&NlrAU1(i&R5$saa|j>lNN9l*NT&vP_tg`4y7fR zyUff`vIy!DxoCPw&jot1PJ#bL(PMwYo(lA&YmX^V_jzY2(UR4sEs2?(?|I+n{hWKV zvvrGpTi=iVv}9R-Go5ED8|`Z->d&ZRD`u(HF2AhJOrN*8`PyyUe4VyqzHZyam#39} zwO#FdZI4-kJ+AFrvEAeCy5QZJn8nU-_ysF=dv3cS8tvI*qZN!cMO}?WLw+IV+Vj~w zPOPS9`U~v^oVL)OkG;6|$ZDVcz>4ef%p)tF+2ifSxDn4{bV)4jS?zPee*D6|)jl7y zRjbuJ03X&$ix<^jhJ!(pZ4}n6{+P0Rh!w#mt8? z7E;7FlSoGxI{MK*7v)0~wTMbvT^2LVV;CdMJhR)1)W- z^-v1hE99k?pG!ZCBB2!B7z9xoDis9&c9N!kmTP}Imp%0KrmxamYZ3cqiBQXuxBfBckP}MQmt(c zH*&dlQ>dQK2W#uNUi1fPp7`<5*J!G>qIt=&%6*Hog#4+gk7+z@Il)LLE+qP#x{ z_3~h+sC9=*2SmY3gtyUR<}hw^#{VG~Fm_Bh=vyS9Yba_Nm9R*Ep}P!v%QqOb){Y%$ zjT^gh1>Z_sjXiv;aSdXt7mLC540weE`>lsshLO(Y=(DoFU%eKxiN{)v^n>{!~?PKWpEa+z85k1d+JZ)N;bqlHh{O3N*(NoMq@sNs^# zD3Bz*E$SbK=}_E~GM7c|Bk*LJBv~cWPT?K0W29SFXK0@n1WA_YARvI1hst7{&9enI z`tE7yEg!Cr7_FWBh(jC2aCjAsvDJlu$$T|<>{?y^*xtAH*eH6zih1}e*`Fo(~xbF9usty5t>ZT~UIi4lU`K>j^62xj@R0UHjiYj+(0 zJLykg<)imbgSAxf65am5a$twYe7IB6V6nU z3zDx;b&)D^de2m38}clwS5b_o@|fdRxL5IJ&3J_IqaVeZITSJh0O{wK^=W z;U;f)5{-AAv9o7&&&Q1m)~-9Y#%?^j$8n?Ey%5iW&c70!a9QW!vR;I{`lfVO`a2ct zJ~;if1a`kHSHuLb9tM2KoaE2F4n^k&9a z@Z5-VNoFiQN^^zS>C;~S0o4zDo%;{W+6Se*Kj(r;I;$ihlJ(enY>in5F1QTx5}6bQ zPACrDj+g;8dII-JhZn9n_=J8G^H_=CY)A=c-N$q~8KuQWm-}H)&{@Y;EMG};xMFp6 z`Q*$oJGqQR@G#JM zur7kokS^$^3F*K3FGw$a8!^2VN}M!h?6lL(?Qof|;}%J7uq5YAYLzq*94F8GjA$a; zvXCV>?&z)mgDz?AAc^C8lM_;mdrmiqbE6xSl#D4X8@La(VwM<1CWGWJ(@IjToZ@RZ zkZ)j2Q7J(@b^~c%6~&0tM}xxumsWyc7xOV}aNi}LFlKubZEV>qMFo%`C{3U%T=JEw zXuLnMB#QAZTVBR#C9LnD^@O$0O_A(KAxJuuik9RWw?>qHg<|Z$a*%)_kkH?G>Nv-= zi&T(kH*`~)5g+;t@@?=L8PT4T_MpnIjTwDY_$V9Bg0fkTalf0aVFDiHhi7YP8;Kbf` zo~1j}De({*8W(j;Wu>Pn8fcr>fJ#OJiC`Xd(h$jh6)mEzsF_Blv@)|4GfN6V>a^2I zQb9el&or8J6s2Bil8G!g=cJTwugjkRgu=Ul(@9N>8G6H%ZZeQRrn%a!hmjZ%&nEA0 zRgC?}AJQC;a@j;f{*)@C;3hi1M_uDBmQEGU3g*>qR93~|p6$3^o!b?*$Q-B6>yF17 zNV?!ip8wP6-}zH#q0SpKp4VV?{5{@8dM5AVyw-&>3-ktQsNvuG@+L-$n%-~{rUCP z;Qe6rqr1OY`Czr}V(^XE3n#|owcW_emux^iQj4RzB)u>Um?l3lbQ@3$*C;}}A;o}v z0el#qLI%-kWnlHLl=;(D3MA@PR31C}^Le|0SAoM8Y>!oVgFCiYZ(j0#U1|OczmrD% diff --git a/.venv/Lib/site-packages/attr/__pycache__/_config.cpython-38.pyc b/.venv/Lib/site-packages/attr/__pycache__/_config.cpython-38.pyc deleted file mode 100644 index 984eb4db9514e1cfc1296efdc3b8e96f35fdbc3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 994 zcmd5*O>fjN5Vez~q$?Gq<$%O#Bo1YzV!m!Ggb;-T65`O0OBE^W#M9lV-Z-+It#;KD z<3(XQYCM@I5wG9EwAyq6sB>7(1xk?rL%uW(DP@JBrx^>9LTm8tPFKpKoOQ~xmy|Jzz&Hl(8Rh;mCS%~R!wol7F zAm`Zy^ZYV#BcCXK$v^Q6CR3Hr73uo>5XcVE!}%Qj94#0Njqz}EB}j`vT?l|TD^PeU zJMH&?idWZL!w4e;ZMPOH=}}E4@cfy0A)dl}0uq8p^!YonkLD_kzJxJ}$WE391r?o?Lwh!D(nX#+ixGOT6|}%vHjiO_dJib@jFjc;uW`%+^qp<~LEQgJ!SId$Rlza0fs)Al zh6`NT@Tc9U9D7$so<{`~<`F B4jTXf diff --git a/.venv/Lib/site-packages/attr/__pycache__/_funcs.cpython-38.pyc b/.venv/Lib/site-packages/attr/__pycache__/_funcs.cpython-38.pyc deleted file mode 100644 index b49b1eecba0c8f292c5a64a3f5a2d8bdba7eef1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10278 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%0Ast;jNQKuIO6D+k}uh>W+6zCNJ&%U+3 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%0ATxD!y6HYAnXgwZkWVJ89P_wwj3Xo&bQg>!re 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 diff --git a/.venv/Lib/site-packages/attr/__pycache__/_next_gen.cpython-38.pyc b/.venv/Lib/site-packages/attr/__pycache__/_next_gen.cpython-38.pyc deleted file mode 100644 index 28342144ae88d63a6edb8d69a1b193d5f69fa53d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4968 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 SYZY93rTCQ5|E#~fzWN`~r5O_d diff --git a/.venv/Lib/site-packages/attr/__pycache__/_version_info.cpython-38.pyc b/.venv/Lib/site-packages/attr/__pycache__/_version_info.cpython-38.pyc deleted file mode 100644 index 645c4a983d7e9ef66986d224aafae1570d7e92ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2322 zcmb_d&2Aev5GJ`lTCZg{b&Mh@+JZ>>6B)Kzr$K=jiIE~riU5I8G)bEZ0*JLp*&FRH z6_OHQLB7=KF;CD-a`dGS#A{D}gtPX=Q7bCrR*aFrBIXga7+URR_&wqY zUwDD|!Vx*bN4Qnv=_AxwJOQ7mf$g%9CM%d!T&TR-JHeCTTBgmQUx)^=ab}FlcWva} z`u^iaXo+}kBfrE(x{yZOxU1wyR2}Da_6gw69q76ZLZBArs6{w#1tJs?Cogd;o@%wJ zmVmb4XH&7r10KFW5P98Y^#Zk)c#S9UUgirth4*`W5i+XV#h--IxvU;kU77t3iKG;s zZ|QI{Oy%w~(J|EQXNGpNitY;9k!3$qf>R@@&zH(BEkw0v_UY!v#*MAi``F&zrY`&D z%nsK!Z?4nLb^6shz0%FAthmyk^ww?a$FDd1y2olD{*!}SljY!c^BfPuoZdb^j_Y%A zOt*vu?|8hQ75Yt3Q;W%V?@Zo4OKAOH;+f8$MLcogLufY7&OYN@@U1Pnd9!)lPXY5n zbI=zZ0=zhT99d%MccJTtAjbF=(Ec?(BnFRxzMS-kqGR$33g9&q!WfxgOn7)1=;5_! zs>M!&IdU1fG5~@kqi_7yjuby+N(;KC*JxI8s)QM+ie{9};M<%UTiiTxq1njetXzpG zH*n&DhjIuHM5b(1=9ToXj*_;nL?JQ_Vkio*iFCinjSYZYP*MH9sJIRC$}|ESbP8=T z{D#L!eFQH5dU|)O{X_$8+xvq(soLKO-7~V^-j#-mvR}xY@&PrV>UMJ|s$u(KzT4Kh z5gYxi)64dRZacny$xgY?a;S-B|G=&?DAaN~tf8{2z0YA!y#fM7DX!y`5S${{;=f09 z_DIfKJcpn=kPx~@@F^%`^bAmZhI)xw1q|T=I>d&I0j(pVubA*x%(02wc!&bj!)gmK z#`;c0Fmki725{uT#O60ZbBwzL&45?`rP&v1jpiDloK|y2hgp&H)2ePx z3fghtM~}L*?Mtom-Qs{6l~uYcRS7r3nKwreIRLs8LjlIKzNZ1ezEo$WIJ-K)>U8-V z7EKuA4riwk+XcotMW!`l$_?2x*LkH)R&|7peC+n(jx-MdY*C8J2!2l~sniEx40mz} z;dJ2&b_sjROvJ~|)e;l_JeYU$H4N!x5GbkRgrqnmA3`5pp2Kx^#T=k6IQTYA0KEaq zXl0CE0SK>gn;eqE;Ad1_3X#FRRIOp;njtaz1wBGf(U^>b9)NX>ca8()Sf;Lmu*>tA z9f#^uH}{#FBLm$EA+7T5v|`4@bH?t2k@nwBOz;X`2DXk?=5q07|8o+Mj{3sIc+H75 zCtRVEp{4-UFZ&~j*+s^%2jzQW^O=F=o_&z>xoH}G0gf^=WS?{Ta#3`9kcvN M)kz&+2nay=59<^&00000 diff --git a/.venv/Lib/site-packages/attr/__pycache__/converters.cpython-38.pyc b/.venv/Lib/site-packages/attr/__pycache__/converters.cpython-38.pyc deleted file mode 100644 index 00421ab4dc340711b7c43fbe379341602fa96446..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3547 zcma)9TW{RP73OfcyWI8a5=AItw9 z$;Hg9+*MaEwt>3;p%3+1@v?lhI{S?oe)|5PTSnZyLu{y?_sUyBIV@^5dV2t3<_3$A! zY*YO1&reI$AXGF=lI)qJVM;@#M0`3{oT`kTa$1@0(fjG_V?N8MizUS|>9axHAJ9IO zV4dVjYY2iP3%;NHEd7H)& zjg`?f2(`JBQg3$@ig1X%lO#M%_nUOaEcfnTR)JaAJFAB zY=TE?W}CQy75{pC*gbhHvERvHe3prm-*b7cveC(DrYIkdk}RfdOch?`iFd)%i<58S z(-RpherFW+&%-k=Pjn1Fn(39^Xp(PLar9^M544p!AuZw(hg^P8P4Vs}89XUJ_bSPJ zkyyk0ydk(6i*&akbjtR&&$#lVSV-lYIQR--&Kv0C^elHDmf4?g`2IrdeZRM%7Z$qA zn%%nCfI{(()>;G9a-wouDB~Id#<0Yu?p$;~Lz7$Rto2Uawe=A;%f7FJQ2i=U>8HFv z_sUW_DDO=HFa1;i*$eWV7x9U)UmgWj%Go6IEx9 zo@W4C2iv$;cG@vt&EjjSImZqE0kcffTn9hkMetD)_W2AqWh&Cs3EeAcWsf3lfe@og za0#ZNSw#1uf`s;#AyF>s(m(5*E_n3(klrs&^2=_&p5DRFc$@=xp%==h4I(u0bmD9O2U-QgG58YE0-^+F=3k9vk--A++V~EM5+eW@fThH zyGLR?=imRqWxw_AmRxpp`Qe|&QW>*o;RPC$`GWuo8kB(vyvt91;!KLG1OZc2yTiLY zSWF7-Nj)@6Af4qacc=Fg2(~3UQ$w(?tv7fIU1Q+dZkE=H4!*&(%~EwiCYnd`n=8A` zdG31*&&kogyt^`U&XFqva~0QHuJ<-q!_4y1>cTW_uehl@eIpc%_jA03XbU!heRaK* zw`LhEbP-Vv0Il&@qsuF53pEa99gv z+YJ4)4q^KKXQ2d-6I`XPvJ zS2L#IA&Qh@K~)tPXG%Imk)qiWv%39^@or%7)-5>Z&XUl;b0*qR0On3WKdR>JsGVSC z%7n|M8I!kWWa(R?gH_2vP*`)V$q#VZ^I+BHLb_s6q^B;~6s>NzlV(d3-nKA{-d?o7 zs%F2my5i}1_I6F-hT@NcQ*hf{=$q}@V(spM_nVU79_5a9y3nOVUW0RUGRf^M&B=j4 zf>;mox;bA?qTEiioTPaTw&rAC=+f?z9-8u{sxFI-&6SGW=+eJl9RZW?8|BEVypEb0 zMeQ#j5Wm#Y1`5t$sDM6QMfDmmMhzxCv+1OO;2iNSOnHhXHAt;nZ4_zS__OhBptZ@m z-5|T2yy^Qa>-)aYRVTjs*>DspQ<&v-e~3HS(1hWJ^8XK%VM&4&8mB@-UFgjg447Gw hyZ43}8z=m8Q$A_OIViR|WZMB7=)ZqEu1nWH{x6E2!`=V@ diff --git a/.venv/Lib/site-packages/attr/__pycache__/exceptions.cpython-38.pyc b/.venv/Lib/site-packages/attr/__pycache__/exceptions.cpython-38.pyc deleted file mode 100644 index 3e9195f81574bbcb8e57966e5bad517523548ff8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3146 zcmbuB+iu)M7{~2h?=jgXX-a7+7bAK>SE$>QM4>9EQQD$PD4?e4#j?nm^~@%wUVA$; zPDzLmQjy97@Bna`SMn|QJOEexzp?k!CWU}kp7nn`w&(X9=9{fntLf0OcRBc><~V;? zG1GXszK2u)islPPIKurIr*vMHyDoG|l%dPgg)TvRq5@s9x(r>$OVjF6lXV`_G*Bc%^fb(J)HVI zG}7t1!s(WT+bxSy*OT6k+pUN)p7gSXhblRc@dKq2b?|4C;aFn>+jlJ-4pYPXkz`@4 z4UYrK62-VND(t65vR%F>SzpSS`s8qAq+ljNkA2NB5#b<|qSLhUkzvD-zM`4grN{7e zh}R_pw!Izmp%f+^MN)5Xv;ICybr|p1ff~1%qzBnhYRz}@xARyqo%Vx>Ydds%Z9FZD zvR!<&(_wp3=`e}85K`Q^!){*h+~{1lQ#x1;c>JMZTAC@>ae$M{@Pl<)7#Scc5gS`NmTE?)Xz*Z>h%-D zV5=wznMfI#P4_x`GT!Tb8TNZRH1g_*2hYH%dt~Zs^7}xJ3K=VJ2X%ROr z%`lNZHPa=c(G#SN#5_#WSmf?|o}53|3kSK26=HT1Yq&+#FmjHZg#sH*GZGekg zF^}WKa1@V8ROdGMv9Lkz*B7DLB`2mP@hP~&zW(fqN+sCIAL+O(wJogpWEYVwt@_c6oxNs@dO75SSJqf)*gqS=~?%$y?Hyq4Ug zN+NBMyGlM!L%15Sv3!9X&R=cqSCqe#i9h)_$-Dx>2Q$Q^-ykldlMa0a&1}he=I5fVmsD5V^J5y9+Ps?av`_#L*apYzV-?xE}p|+UV zvUnc%p5nCC-*L~nRrlcH>(=XxzY)-8VSLav71MQ`n#!wj4xR7Zm+q#csM5AeSy>xp z=g@Z51$50+G5UIjEe}Tc{x=Y|FgxzSg=4;M2eoU*7JDL4@6+2_1z;efXbfpdFVYZ; zdlpw4ILDiv+G0i7zIH1+GrwBcO_1FtD5|Sj^C`uEHM*k8qiA`~79Xdv35P{LEm(?j lS5Y{tcc`J)&u~vnpVjZ?8^O=*?u(vUURtgfzs53te*?@R>M;NS diff --git a/.venv/Lib/site-packages/attr/__pycache__/filters.cpython-38.pyc b/.venv/Lib/site-packages/attr/__pycache__/filters.cpython-38.pyc deleted file mode 100644 index c91be75541fbcba2287febb808a7f0bab5e080df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1625 zcmbtU&yUnL6t**&Ux8f~ifBO}{7bp^#J|7+@t*U8X{AJW2F|e zQnFbpjZm7+a>b(980E*Br-_Mt?;V8$CbSy=2;ua&G$O%BJ8%y8$Ud0<4xF(_F35@; zkaK!YVcp}-r}fMM4DRy4V=x{IQ>sj}n3=MWg5@(7%~ZY=nHDC}xK3oOwSbh2Gel+~ zXy0!C3li)IBGG7HgIkf`uD^uySJcpRM>#9{3!&t>!^t68(?=7h@=~2<+QeBRD%YG9 zV(nCp|Dft6Qm=^`Ly`B7_ou-V4b2IjmM6Ii4uqbYya zc$gjsIyK^65hwHbMCbr<-*0;C7iZOY_e5mkMWObtAlLyompH^D%iEzYWNO0SpT@@D zm3b0Nz2|r7|Np|O2Zu}?g&k7ZDut)oE7lI>rY?co0o#Ct)OVD?!bNC*+gDxMfQ^Oh ze$wBeJ0H|GtP`+q;OU5F2&Qj?1ByT@f%AsGA+N|QI&)CW7o(SSML{gRKoq zQx*XWGCr0fs#S*%bV>LJB_qiYic_VRBvIO8(p#MI74!(VUvrI znyK++XS=7qg7s%I^@r`yPcQx}Q=-oNH>TPjz&}vc>fkfD8s;@u!-gw`uTot_XPbuq zfx2^}25Y(uopT)JV#0 z4Fv<{0^48dU($7_{e_+O9-Vq|*Fy;K@rk7PzW2S4e7US2;No%EZ*tTg1m_hGDH~V1zATx@f--cJTr4XJiXAy_?ys3CrmV68Wt<+}Bvr2F+ zZKEr0&*gh}k(G_)YUbw3%vb;^2~yflDqa^9RNJ$Wq6rB(H0sw|iDx>N-h4Y%N$NxYEN zV)CSzPE29tVV&id*_kvGjQGveoEkDQU_+hE? ztTd0}o0}b`k*9~SUGJemka`ErE||{8e{t3LU`T%$>N_xQQHXS+B#xmQl&vKz@;ek4 z=<=3N9Ouupgk&s~lCSv!k#MW{RPwnJ#jKFxHl;h&7;MBkns#2ACM-?UHDrg|K@Mh4 zi&#s8sw06u0J{YllfmvF-v`H%3jll>>b=%`0X4q>6|~HJ;l7wtfwy85)Zvo)Wuw&b zI-T)7!=d2L9}eXrelTAHS`w~+!oK!Z)VkC2gnNJjs9_xF&MaTlbI zJcOS93}#M8JMf^TLgi`N5yyTP$=A88ExaN|qgtHwotPYP?!PWj(+io~q<8u>efsQ1 d(Ek(}J_L<7rF?|qb!G5-Lpo&PK{$ZE|1YgdV;}$k diff --git a/.venv/Lib/site-packages/attr/__pycache__/validators.cpython-38.pyc b/.venv/Lib/site-packages/attr/__pycache__/validators.cpython-38.pyc deleted file mode 100644 index 04e154e2c1be4df8e138eaca68d61317ad353512..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16862 zcmd5@U2GdycAgmyDT<o{A%DLLXDNtDPT zb7yE<6a^Hkpbv|>ed^r?L)=B+5uU?19-0tK4g#{JH@ zGedGHDqbaND|?2VJNNh8bH4L)4?mim%xUy@_xb7{T-CIH;fKE4EWTgC<@tuD32jLe zx-jbclFpyTl7Y`uJ=HLmOkESENY~Si%u=Q?wlv1inR>P{zBJy*E#(>$OB0R!Ql87l z>XVJBr72zO7Y0vp88B%IwYPJQ}{gWnBt_!f2N_Q zBTimCBc8=S>p|)rO*|(~eWr<1I|kkz70-(UsDCW3^8(j-QJhAd(_H7cxFODn!=LF( zPsO!VPjjMxS_Q6kLd=Wf=;`T1otMN})H%y_PKtBl80tKes8bZ@QRh6@c~)EyGpJ*6 z9h$cq>!P@XI+wW4bK+$&i#n$g{k$SxMV(i<&hz3O@tVkC)-NP#eNTKJwZ6}_UKBqR zuZs!PIvv+i6ex)|Q0on@bw(_RLl|#PyeSUivmh>uNqo+WABbsuzLaQtMO;POtK9ai zcuO2XopXsg*Ti+yxz2Tp;%#vhbpS=ThV9y`j{Lcf@`4e}t~!2Mw%u~CQ84Qbl@-ijvV7GQx1+8D z({@EU$k@IwYs*2JK0ORGv)J^n+4Z`;TzB4ij$x=^QaDblT=N}CuYx>3Htbfb z=B@@=QS+!+1jZ`f(VY59{2*0x%fUp=^?ci{I_2gH9=vij949c)p;7mPT*LOOYmQfz zPB7N6@0aV2i!W$QU$V`XUu(K{J;=6X^KMNzUXZ7yMnhGJCea^#hfr(RaCuX>`C3=Y zLqs5;ItXvr5Kk><;qRS#a~V_Fw8D<8rnDTF)?QI!dn=4kOa!ajTjzT!1RI)BzEWTX4 zz_VWbT$gE(s-R1v*yoyj1|MI3bggvfBM+_athHC0^3HX~+whyMJIffsX|(FinkCwn zkFVaH;$6qRd*|KS@*NMna;{}pH^8pm9pbO^JsvH#Hs#akyNJu9ZPKQzbnpM89pv51 z;)}2CVE3?Zdgrfrt{*ynTe_Cbgt2O_s8wyBw(8!RgAI{=1m(S{wxx7jzqiYRwi!f< zc1&`IrFfgH+RE4WQB=DvX|oc0G@8sHuZblwaru0flmKrXZMr#!`L3O%e4KEN5aA90r#Gh%Opta~+otp-N& zJu5_>kWhQDUsy37WPe4=sDxYtwJg=rPGo@ z+N(ExFEH0^Z*7Qp#AsJ=G4UJ?YF=A1oYaoCWRk)MD5phAnE1?yG>Df84wY|)p!NPr zjGa~5z37j=6F^?W<-LL%a3C5#7V*HF(p=1*W? z&^CSf0dEsY^2ZJ-0?W1{e6*@{+w&~HX)U9eUzNT0#i{ z7UUf2^ldinbC5+7z+$<)j3@6HZkn0LW}Ako(?8=E<`|xI<3BqmciW?4)P6`Qq|g;_ z7O@hx2Wnv*oBx26LTa&7ScujHHPr(E3+u6n4lxlg11xFP1w+1s5B`oKLbP2LqxQ$g zOD}_)MvHhna_Xw~VquKvKzmRw2f1>&(G=}Eeb1N6pJJQT8%d(T!^?~GjhL`+20ht% z9xr|q7tbJTWQ^>rq_QCrk(@AzsAtlfJ477a{)b3oUhN|cGmo@uoblTF|@6PKw>nhg5WuT|T1TUyFQY5R^f2jif+fnlI) zTaF|aa|DD1u+RNfdJI{ip{0W=n1Fukj4w&GQ`;6R>AK{avix16dE!qA+~TCnqY8(3^Xi?}0TfLaIi z(ev17d5Lb!E{HDQV#;$gId_$8qIzc&OqU_={nd1bYx>8En%b*k(eo z9SgzsVEH{||9$9;##)k|Yq-1%xOKIMK-)*Uch-l?wr&7v342Z8E#WMXm!7(*9?r@a z(5&)2&@;6AB$ zjQsu2G(QXW(XRsncl1a2x1;|=_s6@MpW89yovto#`x7EVrCn{?bo0LUFyGa>`Xgf- zYM%Pv$jVOFTu*JM-D6y0pyYQ@VxT00PklS>Pj=02dWSs1G5co_AePcmFk9*I*OQ~H z2S<-!mJL6}%`nv9Z&~xq`SXM5$7LnU4#gsDO&lVfYO~R*0mNf&0XC|x>{Xl8C(l0g zfoiUAt<>#RucSWI4DQw7^S~q_ASS44GDfvs;mGpRYf|LxHHCasGy?77-K1?(u>C+-GT;1IO26)6Z|!L_8ePQ*YH4iN(JiW z8$9o5UX{vX(}jx{_ttQ1*Gu$Qv~Ca?mHr}s*n$G^ny#ndJCZ=M$Lja&&EC}dDbGre zI}SGkmLHD_^E}~sTztKFDRl69FO~V&^Zz0yfO>Y>%%pujm)vNjFBUt;&k(75h9wqF zT6Al>*fGvp1NH<_sp5aw;$OSA2 zV_UGh17;7|Jlumfl%2qBh;Oj#Aw}j2Fl#&?in}ls7zkI4$NUmx6srVjo{L<-+*k_) z=6bW{;&oF(I|nI*E@S~OgRu{k%8~Q@6b`{S1}i(wk{G0U7J*5GUz)f}aU51Qp3*Cf zmI=Lb6y5z1E>@M=%&bn{5*g1~J@Yv8*uXzCm&3E6PEhi(I>+~E2u~AguYA z-t+x_3ePIxtH5E8D;Im*H3y+?JB3Qcn)4hep-!{q6yu8A(ZZVVx4hE%^Yku$RU`)j zvk}dzSFAP9JMQ_q?PFT!FIUP5rzUQsJe&A&qg8!@9q$D$@l4&fXovp`!`(5-I@AUK=A!AY&{wT(-@K2nq~v2(_kRx z1)`no-{@qVK1v~O&GAnJX@haBN*xi5bSMnSODMWoL`^y;%0u&b0?eTUGK!J-ux{58 zSM0?}&MZXX_yq23-Gha>O~F;tkd~;}J988+3Sp zy+P*#%;76sy=X{AQrQsbq)-^|4n;$J#P;M7-|*pUl3Va2&4-^E#z_7KvuEZTf})1K zK_L>vtRs&-G(K$@qt;cRO~@#H6<`E{h}@sjU!i#h+kqrDvNvIjScvB%&VtxK$~}a_ zy%n~jBb2I1r-Ar4`di`dsN8EWpNlzZ(EN{!OIH6v=CG}{Rj(nQ*dHD93JN1JUACs+ zNyY-`Hr;daJkc%ivOj#%H&ATHV~`4sQK3PiQncbedp2xzf^qTH;>A4-+>76%*VcSI z(tOXz9bQQo5;2u&W>N)a3rT8F{yNs1sD{E_0ig6qj6&v`^O zZ%0x-U^Wq2kp5$yB#!M&al~2M$ZVT9Xg+3wLvhf2S{*bCecM#W%U#oZ7ZGWSk*J6? zVNEKGl0;?|VT`$WqjP@Hrh=Ue9@|nZ>J7(`dx4R#3L8;{w7iW8D!VB*ggJtOS4Dbt zo^BM&;RZ`N9QH*$B**V-#y(hrADfBoT z3!XzPxZDSC9Ip&#*G~(wsc4;%O~q>-1#hp!tOCm$G2rA>_XalZdT(I+2s5#wLD-s_ zkyJJWY{ZnzL4*{M_T7raG)6wx*^ zihzr^P|RUp#EyAV!^V{A7hQzS=@f*kh7pLc7)VyHH}An#3k&*TD6T^S4@aEBxN!U( zx7{edjT;>QVlnDAv~qeh*iS&$LLirC2_uE0$6p)I4d)o!II(RLb;BkOKkNdMjDm@m zeNli*F@|D3MD*V3aNO)+hsZCjI|#$KUB6bx?%jhj12HLcflmGq`JqS-nsQh>n$+&m z?INs$dt{b{Eh*Sh=f*V`+5@gLt1{vh9OXrQEjx~jz(liw(*|K7?vLP!g7*-%b>?*W zF*rL3(`3q&NGyo$wS%J}nt~LOe;azXfJr_UL_`qq$j5@-HB6YI_Mnq8#fCsS_HECi zM>-bV(Y-l>V^~v&{&BE6g+oEa909@v#RiT8O^lFMVd~)%yhs^7;R&7!Rx`57GnfS8 zDXE6H8acQ@HtJ7Oo>ZS_OEcabp^=ZF&L@)eB~bd1=z9cTG&5@;zQECI0JCNiH2;#$ zyN2mD8lKUc0w{{_sQA!g=jcLT>PQcqFRS^CLfz$f=k<}Zh>$m(^ketN+aF_cA5ix+ z%dC-|kyJ9oU-4pyEhwD<`>fmdQOw-E2iB6kSaj}J9kvg>VlqW1LSXJ^*VDEryrqzm z;`}(=-~Et{J7J7Q1$D1M`qQ{FtLg)%*D@*U@VL&v#&H7TIkFL zt{Dd17?;Ne{l#wTy7tK|jv*+hMqZ>zUgW1wlO%m^FvKiU3R#rY)yp9ZW*Sao*^#}H z5nzx}_4-K2)FXlE67|TkpcAbrBdd3g46Jl_u_tgQ+Ol0jD8!2+hj>cpZXU)fd7{W| zd7y6tEAhmhsYpMdvy;rCoIsn-Bw}76K`E6%53^aY!MVl7#5@D6#OVk07gcw>`64A+2$Ra&1@9SvyUXTuj z?3EZ>=9Ech*9#+k(_O%^FAo4I61KZJ=!heY&#u*Z3`iZF5Xf7&1!*=)IUAFA1suh@ zT%j5Xj>@C#_i0Btc$=R>SbsEx-9Y8tAuNWo48z%2ADm^?@hD(S!C5YZvpfs=dnz$h zp_%*y0}Me}oHRwl?+IZqBq0odW-y?oy5@1M2Wqm6u8<0LAk0hcZEP^P;cWIjPO~QL z6^wwl6j~)oOQQ5AL|RTQ53y}ZhaX2c9xi-$a6_vexRI``znmcqDM(ipM1_lp zgaS&N6t@aVdpK|9)LUx{QzUmBydIxz0GZ@Ex@S8t3cRgRL5*&sY@|PrS4Fm)VQS`A zL#qmrXJRz+^u}TMS)~#8hMyHw`QvD8f}gxTYh))Rl~+@^MSt`?Ru07C1UnyH4Die-Z0I$%P=5em5={04J#dSGK89F%R4>TLJy&<`I`xP( zVwCE|8^3eB(s|Rsay>3!21vluB=+tvX~$WyOb$U46<@*SQHZDqO_ZpqGKlz|3B9wi z&^yb9-q}ofu}xrqdsokl7%0Xb>Yt4!PT729c=H1(n`sCp&Lbh3CS`c2R88fZogRvh zAvm^eZ7nyEd9Ymyg>k!Js(c}%*$UG9E_A*!L7p6Hq#N)tu54f?y|ZG~C>PaewnoPJ zDJM_a4d#@Jgi%;YH-3rG((xoAz7Z@vvk()MkqEg`eJdu+snZ&0Ara;@qk@r`^UpMW zGFvz!5`N;Yla4&I@m*nuNykIEG~V7|vwhkV|4y@cdQAcL;Fh7L8J+cYa#6szwzMTAyA$tfjfn-6Dc|b-4ZxQFaG2IA*H+qf>%#Y zDT$t1_+U=2wGlSl);bO(CLYkx^H%vLGIFVdQ;Z6!{ zCKczr8iO3XAr-ptCj4vrKB-Uq;%ghE;AGnr%7PS1kZ3FKVR*{6Dl9|WQIFzHBT={5CNk%A>fOJA+z+<75A`j#JBywwcY6-iY*F~wcchL;G z@+Ex8`*a&+j-QUVS06RSNH6Z5dBeT$tqt3lz)>29HkQwdCM1;&VLIxlRg$KV&8}? zP>31TdlKo7;q839Vc(KG*4%gZDUUdE9WZ3~DUWYnhCJ5XVR@{%EQfvasD7mRE68Js zs5MF+hgSYgd><)~Z^zrq^0?a+_m)TQeQ$Z(!USHUar)$u z%AQyrzxZF3M{kXCStE<<>je^r6W>T6dxw", "ge": ">="} - - -def cmp_using( - eq=None, - lt=None, - le=None, - gt=None, - ge=None, - require_same_type=True, - class_name="Comparable", -): - """ - Create a class that can be passed into `attr.ib`'s ``eq``, ``order``, and - ``cmp`` arguments to customize field comparison. - - The resulting class will have a full set of ordering methods if - at least one of ``{lt, le, gt, ge}`` and ``eq`` are provided. - - :param Optional[callable] eq: `callable` used to evaluate equality - of two objects. - :param Optional[callable] lt: `callable` used to evaluate whether - one object is less than another object. - :param Optional[callable] le: `callable` used to evaluate whether - one object is less than or equal to another object. - :param Optional[callable] gt: `callable` used to evaluate whether - one object is greater than another object. - :param Optional[callable] ge: `callable` used to evaluate whether - one object is greater than or equal to another object. - - :param bool require_same_type: When `True`, equality and ordering methods - will return `NotImplemented` if objects are not of the same type. - - :param Optional[str] class_name: Name of class. Defaults to 'Comparable'. - - See `comparison` for more details. - - .. versionadded:: 21.1.0 - """ - - body = { - "__slots__": ["value"], - "__init__": _make_init(), - "_requirements": [], - "_is_comparable_to": _is_comparable_to, - } - - # Add operations. - num_order_functions = 0 - has_eq_function = False - - if eq is not None: - has_eq_function = True - body["__eq__"] = _make_operator("eq", eq) - body["__ne__"] = _make_ne() - - if lt is not None: - num_order_functions += 1 - body["__lt__"] = _make_operator("lt", lt) - - if le is not None: - num_order_functions += 1 - body["__le__"] = _make_operator("le", le) - - if gt is not None: - num_order_functions += 1 - body["__gt__"] = _make_operator("gt", gt) - - if ge is not None: - num_order_functions += 1 - body["__ge__"] = _make_operator("ge", ge) - - type_ = types.new_class( - class_name, (object,), {}, lambda ns: ns.update(body) - ) - - # Add same type requirement. - if require_same_type: - type_._requirements.append(_check_same_type) - - # Add total ordering if at least one operation was defined. - if 0 < num_order_functions < 4: - if not has_eq_function: - # functools.total_ordering requires __eq__ to be defined, - # so raise early error here to keep a nice stack. - raise ValueError( - "eq must be define is order to complete ordering from " - "lt, le, gt, ge." - ) - type_ = functools.total_ordering(type_) - - return type_ - - -def _make_init(): - """ - Create __init__ method. - """ - - def __init__(self, value): - """ - Initialize object with *value*. - """ - self.value = value - - return __init__ - - -def _make_operator(name, func): - """ - Create operator method. - """ - - def method(self, other): - if not self._is_comparable_to(other): - return NotImplemented - - result = func(self.value, other.value) - if result is NotImplemented: - return NotImplemented - - return result - - method.__name__ = "__%s__" % (name,) - method.__doc__ = "Return a %s b. Computed by attrs." % ( - _operation_names[name], - ) - - return method - - -def _is_comparable_to(self, other): - """ - Check whether `other` is comparable to `self`. - """ - for func in self._requirements: - if not func(self, other): - return False - return True - - -def _check_same_type(self, other): - """ - Return True if *self* and *other* are of the same type, False otherwise. - """ - return other.value.__class__ is self.value.__class__ diff --git a/.venv/Lib/site-packages/attr/_cmp.pyi b/.venv/Lib/site-packages/attr/_cmp.pyi deleted file mode 100644 index 35437ef..0000000 --- a/.venv/Lib/site-packages/attr/_cmp.pyi +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Any, Callable, Optional, Type - -_CompareWithType = Callable[[Any, Any], bool] - -def cmp_using( - eq: Optional[_CompareWithType], - lt: Optional[_CompareWithType], - le: Optional[_CompareWithType], - gt: Optional[_CompareWithType], - ge: Optional[_CompareWithType], - require_same_type: bool, - class_name: str, -) -> Type: ... diff --git a/.venv/Lib/site-packages/attr/_compat.py b/.venv/Lib/site-packages/attr/_compat.py deleted file mode 100644 index 5826493..0000000 --- a/.venv/Lib/site-packages/attr/_compat.py +++ /dev/null @@ -1,185 +0,0 @@ -# SPDX-License-Identifier: MIT - - -import inspect -import platform -import sys -import threading -import types -import warnings - -from collections.abc import Mapping, Sequence # noqa - - -PYPY = platform.python_implementation() == "PyPy" -PY36 = sys.version_info[:2] >= (3, 6) -HAS_F_STRINGS = PY36 -PY310 = sys.version_info[:2] >= (3, 10) - - -if PYPY or PY36: - ordered_dict = dict -else: - from collections import OrderedDict - - ordered_dict = OrderedDict - - -def just_warn(*args, **kw): - warnings.warn( - "Running interpreter doesn't sufficiently support code object " - "introspection. Some features like bare super() or accessing " - "__class__ will not work with slotted classes.", - RuntimeWarning, - stacklevel=2, - ) - - -class _AnnotationExtractor: - """ - Extract type annotations from a callable, returning None whenever there - is none. - """ - - __slots__ = ["sig"] - - def __init__(self, callable): - try: - self.sig = inspect.signature(callable) - except (ValueError, TypeError): # inspect failed - self.sig = None - - def get_first_param_type(self): - """ - Return the type annotation of the first argument if it's not empty. - """ - if not self.sig: - return None - - params = list(self.sig.parameters.values()) - if params and params[0].annotation is not inspect.Parameter.empty: - return params[0].annotation - - return None - - def get_return_type(self): - """ - Return the return type if it's not empty. - """ - if ( - self.sig - and self.sig.return_annotation is not inspect.Signature.empty - ): - return self.sig.return_annotation - - return None - - -def make_set_closure_cell(): - """Return a function of two arguments (cell, value) which sets - the value stored in the closure cell `cell` to `value`. - """ - # pypy makes this easy. (It also supports the logic below, but - # why not do the easy/fast thing?) - if PYPY: - - def set_closure_cell(cell, value): - cell.__setstate__((value,)) - - return set_closure_cell - - # Otherwise gotta do it the hard way. - - # Create a function that will set its first cellvar to `value`. - def set_first_cellvar_to(value): - x = value - return - - # This function will be eliminated as dead code, but - # not before its reference to `x` forces `x` to be - # represented as a closure cell rather than a local. - def force_x_to_be_a_cell(): # pragma: no cover - return x - - try: - # Extract the code object and make sure our assumptions about - # the closure behavior are correct. - co = set_first_cellvar_to.__code__ - if co.co_cellvars != ("x",) or co.co_freevars != (): - raise AssertionError # pragma: no cover - - # Convert this code object to a code object that sets the - # function's first _freevar_ (not cellvar) to the argument. - if sys.version_info >= (3, 8): - - def set_closure_cell(cell, value): - cell.cell_contents = value - - else: - args = [co.co_argcount] - args.append(co.co_kwonlyargcount) - args.extend( - [ - co.co_nlocals, - co.co_stacksize, - co.co_flags, - co.co_code, - co.co_consts, - co.co_names, - co.co_varnames, - co.co_filename, - co.co_name, - co.co_firstlineno, - co.co_lnotab, - # These two arguments are reversed: - co.co_cellvars, - co.co_freevars, - ] - ) - set_first_freevar_code = types.CodeType(*args) - - def set_closure_cell(cell, value): - # Create a function using the set_first_freevar_code, - # whose first closure cell is `cell`. Calling it will - # change the value of that cell. - setter = types.FunctionType( - set_first_freevar_code, {}, "setter", (), (cell,) - ) - # And call it to set the cell. - setter(value) - - # Make sure it works on this interpreter: - def make_func_with_cell(): - x = None - - def func(): - return x # pragma: no cover - - return func - - cell = make_func_with_cell().__closure__[0] - set_closure_cell(cell, 100) - if cell.cell_contents != 100: - raise AssertionError # pragma: no cover - - except Exception: - return just_warn - else: - return set_closure_cell - - -set_closure_cell = make_set_closure_cell() - -# Thread-local global to track attrs instances which are already being repr'd. -# This is needed because there is no other (thread-safe) way to pass info -# about the instances that are already being repr'd through the call stack -# in order to ensure we don't perform infinite recursion. -# -# For instance, if an instance contains a dict which contains that instance, -# we need to know that we're already repr'ing the outside instance from within -# the dict's repr() call. -# -# This lives here rather than in _make.py so that the functions in _make.py -# don't have a direct reference to the thread-local in their globals dict. -# If they have such a reference, it breaks cloudpickle. -repr_context = threading.local() diff --git a/.venv/Lib/site-packages/attr/_config.py b/.venv/Lib/site-packages/attr/_config.py deleted file mode 100644 index 96d4200..0000000 --- a/.venv/Lib/site-packages/attr/_config.py +++ /dev/null @@ -1,31 +0,0 @@ -# SPDX-License-Identifier: MIT - - -__all__ = ["set_run_validators", "get_run_validators"] - -_run_validators = True - - -def set_run_validators(run): - """ - Set whether or not validators are run. By default, they are run. - - .. deprecated:: 21.3.0 It will not be removed, but it also will not be - moved to new ``attrs`` namespace. Use `attrs.validators.set_disabled()` - instead. - """ - if not isinstance(run, bool): - raise TypeError("'run' must be bool.") - global _run_validators - _run_validators = run - - -def get_run_validators(): - """ - Return whether or not validators are run. - - .. deprecated:: 21.3.0 It will not be removed, but it also will not be - moved to new ``attrs`` namespace. Use `attrs.validators.get_disabled()` - instead. - """ - return _run_validators diff --git a/.venv/Lib/site-packages/attr/_funcs.py b/.venv/Lib/site-packages/attr/_funcs.py deleted file mode 100644 index a982d7c..0000000 --- a/.venv/Lib/site-packages/attr/_funcs.py +++ /dev/null @@ -1,420 +0,0 @@ -# SPDX-License-Identifier: MIT - - -import copy - -from ._make import NOTHING, _obj_setattr, fields -from .exceptions import AttrsAttributeNotFoundError - - -def asdict( - inst, - recurse=True, - filter=None, - dict_factory=dict, - retain_collection_types=False, - value_serializer=None, -): - """ - Return the ``attrs`` attribute values of *inst* as a dict. - - Optionally recurse into other ``attrs``-decorated classes. - - :param inst: Instance of an ``attrs``-decorated class. - :param bool recurse: Recurse into classes that are also - ``attrs``-decorated. - :param callable filter: A callable whose return code determines whether an - attribute or element is included (``True``) or dropped (``False``). Is - called with the `attrs.Attribute` as the first argument and the - value as the second argument. - :param callable dict_factory: A callable to produce dictionaries from. For - example, to produce ordered dictionaries instead of normal Python - dictionaries, pass in ``collections.OrderedDict``. - :param bool retain_collection_types: Do not convert to ``list`` when - encountering an attribute whose type is ``tuple`` or ``set``. Only - meaningful if ``recurse`` is ``True``. - :param Optional[callable] value_serializer: A hook that is called for every - attribute or dict key/value. It receives the current instance, field - and value and must return the (updated) value. The hook is run *after* - the optional *filter* has been applied. - - :rtype: return type of *dict_factory* - - :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` - class. - - .. versionadded:: 16.0.0 *dict_factory* - .. versionadded:: 16.1.0 *retain_collection_types* - .. versionadded:: 20.3.0 *value_serializer* - .. versionadded:: 21.3.0 If a dict has a collection for a key, it is - serialized as a tuple. - """ - attrs = fields(inst.__class__) - rv = dict_factory() - for a in attrs: - v = getattr(inst, a.name) - if filter is not None and not filter(a, v): - continue - - if value_serializer is not None: - v = value_serializer(inst, a, v) - - if recurse is True: - if has(v.__class__): - rv[a.name] = asdict( - v, - recurse=True, - filter=filter, - dict_factory=dict_factory, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ) - elif isinstance(v, (tuple, list, set, frozenset)): - cf = v.__class__ if retain_collection_types is True else list - rv[a.name] = cf( - [ - _asdict_anything( - i, - is_key=False, - filter=filter, - dict_factory=dict_factory, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ) - for i in v - ] - ) - elif isinstance(v, dict): - df = dict_factory - rv[a.name] = df( - ( - _asdict_anything( - kk, - is_key=True, - filter=filter, - dict_factory=df, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ), - _asdict_anything( - vv, - is_key=False, - filter=filter, - dict_factory=df, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ), - ) - for kk, vv in v.items() - ) - else: - rv[a.name] = v - else: - rv[a.name] = v - return rv - - -def _asdict_anything( - val, - is_key, - filter, - dict_factory, - retain_collection_types, - value_serializer, -): - """ - ``asdict`` only works on attrs instances, this works on anything. - """ - if getattr(val.__class__, "__attrs_attrs__", None) is not None: - # Attrs class. - rv = asdict( - val, - recurse=True, - filter=filter, - dict_factory=dict_factory, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ) - elif isinstance(val, (tuple, list, set, frozenset)): - if retain_collection_types is True: - cf = val.__class__ - elif is_key: - cf = tuple - else: - cf = list - - rv = cf( - [ - _asdict_anything( - i, - is_key=False, - filter=filter, - dict_factory=dict_factory, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ) - for i in val - ] - ) - elif isinstance(val, dict): - df = dict_factory - rv = df( - ( - _asdict_anything( - kk, - is_key=True, - filter=filter, - dict_factory=df, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ), - _asdict_anything( - vv, - is_key=False, - filter=filter, - dict_factory=df, - retain_collection_types=retain_collection_types, - value_serializer=value_serializer, - ), - ) - for kk, vv in val.items() - ) - else: - rv = val - if value_serializer is not None: - rv = value_serializer(None, None, rv) - - return rv - - -def astuple( - inst, - recurse=True, - filter=None, - tuple_factory=tuple, - retain_collection_types=False, -): - """ - Return the ``attrs`` attribute values of *inst* as a tuple. - - Optionally recurse into other ``attrs``-decorated classes. - - :param inst: Instance of an ``attrs``-decorated class. - :param bool recurse: Recurse into classes that are also - ``attrs``-decorated. - :param callable filter: A callable whose return code determines whether an - attribute or element is included (``True``) or dropped (``False``). Is - called with the `attrs.Attribute` as the first argument and the - value as the second argument. - :param callable tuple_factory: A callable to produce tuples from. For - example, to produce lists instead of tuples. - :param bool retain_collection_types: Do not convert to ``list`` - or ``dict`` when encountering an attribute which type is - ``tuple``, ``dict`` or ``set``. Only meaningful if ``recurse`` is - ``True``. - - :rtype: return type of *tuple_factory* - - :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` - class. - - .. versionadded:: 16.2.0 - """ - attrs = fields(inst.__class__) - rv = [] - retain = retain_collection_types # Very long. :/ - for a in attrs: - v = getattr(inst, a.name) - if filter is not None and not filter(a, v): - continue - if recurse is True: - if has(v.__class__): - rv.append( - astuple( - v, - recurse=True, - filter=filter, - tuple_factory=tuple_factory, - retain_collection_types=retain, - ) - ) - elif isinstance(v, (tuple, list, set, frozenset)): - cf = v.__class__ if retain is True else list - rv.append( - cf( - [ - astuple( - j, - recurse=True, - filter=filter, - tuple_factory=tuple_factory, - retain_collection_types=retain, - ) - if has(j.__class__) - else j - for j in v - ] - ) - ) - elif isinstance(v, dict): - df = v.__class__ if retain is True else dict - rv.append( - df( - ( - astuple( - kk, - tuple_factory=tuple_factory, - retain_collection_types=retain, - ) - if has(kk.__class__) - else kk, - astuple( - vv, - tuple_factory=tuple_factory, - retain_collection_types=retain, - ) - if has(vv.__class__) - else vv, - ) - for kk, vv in v.items() - ) - ) - else: - rv.append(v) - else: - rv.append(v) - - return rv if tuple_factory is list else tuple_factory(rv) - - -def has(cls): - """ - Check whether *cls* is a class with ``attrs`` attributes. - - :param type cls: Class to introspect. - :raise TypeError: If *cls* is not a class. - - :rtype: bool - """ - return getattr(cls, "__attrs_attrs__", None) is not None - - -def assoc(inst, **changes): - """ - Copy *inst* and apply *changes*. - - :param inst: Instance of a class with ``attrs`` attributes. - :param changes: Keyword changes in the new copy. - - :return: A copy of inst with *changes* incorporated. - - :raise attr.exceptions.AttrsAttributeNotFoundError: If *attr_name* couldn't - be found on *cls*. - :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` - class. - - .. deprecated:: 17.1.0 - Use `attrs.evolve` instead if you can. - This function will not be removed du to the slightly different approach - compared to `attrs.evolve`. - """ - import warnings - - warnings.warn( - "assoc is deprecated and will be removed after 2018/01.", - DeprecationWarning, - stacklevel=2, - ) - new = copy.copy(inst) - attrs = fields(inst.__class__) - for k, v in changes.items(): - a = getattr(attrs, k, NOTHING) - if a is NOTHING: - raise AttrsAttributeNotFoundError( - "{k} is not an attrs attribute on {cl}.".format( - k=k, cl=new.__class__ - ) - ) - _obj_setattr(new, k, v) - return new - - -def evolve(inst, **changes): - """ - Create a new instance, based on *inst* with *changes* applied. - - :param inst: Instance of a class with ``attrs`` attributes. - :param changes: Keyword changes in the new copy. - - :return: A copy of inst with *changes* incorporated. - - :raise TypeError: If *attr_name* couldn't be found in the class - ``__init__``. - :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` - class. - - .. versionadded:: 17.1.0 - """ - cls = inst.__class__ - attrs = fields(cls) - for a in attrs: - if not a.init: - continue - attr_name = a.name # To deal with private attributes. - init_name = attr_name if attr_name[0] != "_" else attr_name[1:] - if init_name not in changes: - changes[init_name] = getattr(inst, attr_name) - - return cls(**changes) - - -def resolve_types(cls, globalns=None, localns=None, attribs=None): - """ - Resolve any strings and forward annotations in type annotations. - - This is only required if you need concrete types in `Attribute`'s *type* - field. In other words, you don't need to resolve your types if you only - use them for static type checking. - - With no arguments, names will be looked up in the module in which the class - was created. If this is not what you want, e.g. if the name only exists - inside a method, you may pass *globalns* or *localns* to specify other - dictionaries in which to look up these names. See the docs of - `typing.get_type_hints` for more details. - - :param type cls: Class to resolve. - :param Optional[dict] globalns: Dictionary containing global variables. - :param Optional[dict] localns: Dictionary containing local variables. - :param Optional[list] attribs: List of attribs for the given class. - This is necessary when calling from inside a ``field_transformer`` - since *cls* is not an ``attrs`` class yet. - - :raise TypeError: If *cls* is not a class. - :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` - class and you didn't pass any attribs. - :raise NameError: If types cannot be resolved because of missing variables. - - :returns: *cls* so you can use this function also as a class decorator. - Please note that you have to apply it **after** `attrs.define`. That - means the decorator has to come in the line **before** `attrs.define`. - - .. versionadded:: 20.1.0 - .. versionadded:: 21.1.0 *attribs* - - """ - # Since calling get_type_hints is expensive we cache whether we've - # done it already. - if getattr(cls, "__attrs_types_resolved__", None) != cls: - import typing - - hints = typing.get_type_hints(cls, globalns=globalns, localns=localns) - for field in fields(cls) if attribs is None else attribs: - if field.name in hints: - # Since fields have been frozen we must work around it. - _obj_setattr(field, "type", hints[field.name]) - # We store the class we resolved so that subclasses know they haven't - # been resolved. - cls.__attrs_types_resolved__ = cls - - # Return the class so you can use it as a decorator too. - return cls diff --git a/.venv/Lib/site-packages/attr/_make.py b/.venv/Lib/site-packages/attr/_make.py deleted file mode 100644 index 4d1afe3..0000000 --- a/.venv/Lib/site-packages/attr/_make.py +++ /dev/null @@ -1,3006 +0,0 @@ -# SPDX-License-Identifier: MIT - -import copy -import linecache -import sys -import types -import typing - -from operator import itemgetter - -# We need to import _compat itself in addition to the _compat members to avoid -# having the thread-local in the globals here. -from . import _compat, _config, setters -from ._compat import ( - HAS_F_STRINGS, - PY310, - PYPY, - _AnnotationExtractor, - ordered_dict, - set_closure_cell, -) -from .exceptions import ( - DefaultAlreadySetError, - FrozenInstanceError, - NotAnAttrsClassError, - UnannotatedAttributeError, -) - - -# This is used at least twice, so cache it here. -_obj_setattr = object.__setattr__ -_init_converter_pat = "__attr_converter_%s" -_init_factory_pat = "__attr_factory_{}" -_tuple_property_pat = ( - " {attr_name} = _attrs_property(_attrs_itemgetter({index}))" -) -_classvar_prefixes = ( - "typing.ClassVar", - "t.ClassVar", - "ClassVar", - "typing_extensions.ClassVar", -) -# we don't use a double-underscore prefix because that triggers -# name mangling when trying to create a slot for the field -# (when slots=True) -_hash_cache_field = "_attrs_cached_hash" - -_empty_metadata_singleton = types.MappingProxyType({}) - -# Unique object for unequivocal getattr() defaults. -_sentinel = object() - -_ng_default_on_setattr = setters.pipe(setters.convert, setters.validate) - - -class _Nothing: - """ - Sentinel class to indicate the lack of a value when ``None`` is ambiguous. - - ``_Nothing`` is a singleton. There is only ever one of it. - - .. versionchanged:: 21.1.0 ``bool(NOTHING)`` is now False. - """ - - _singleton = None - - def __new__(cls): - if _Nothing._singleton is None: - _Nothing._singleton = super().__new__(cls) - return _Nothing._singleton - - def __repr__(self): - return "NOTHING" - - def __bool__(self): - return False - - -NOTHING = _Nothing() -""" -Sentinel to indicate the lack of a value when ``None`` is ambiguous. -""" - - -class _CacheHashWrapper(int): - """ - An integer subclass that pickles / copies as None - - This is used for non-slots classes with ``cache_hash=True``, to avoid - serializing a potentially (even likely) invalid hash value. Since ``None`` - is the default value for uncalculated hashes, whenever this is copied, - the copy's value for the hash should automatically reset. - - See GH #613 for more details. - """ - - def __reduce__(self, _none_constructor=type(None), _args=()): - return _none_constructor, _args - - -def attrib( - default=NOTHING, - validator=None, - repr=True, - cmp=None, - hash=None, - init=True, - metadata=None, - type=None, - converter=None, - factory=None, - kw_only=False, - eq=None, - order=None, - on_setattr=None, -): - """ - Create a new attribute on a class. - - .. warning:: - - Does *not* do anything unless the class is also decorated with - `attr.s`! - - :param default: A value that is used if an ``attrs``-generated ``__init__`` - is used and no value is passed while instantiating or the attribute is - excluded using ``init=False``. - - If the value is an instance of `attrs.Factory`, its callable will be - used to construct a new value (useful for mutable data types like lists - or dicts). - - If a default is not set (or set manually to `attrs.NOTHING`), a value - *must* be supplied when instantiating; otherwise a `TypeError` - will be raised. - - The default can also be set using decorator notation as shown below. - - :type default: Any value - - :param callable factory: Syntactic sugar for - ``default=attr.Factory(factory)``. - - :param validator: `callable` that is called by ``attrs``-generated - ``__init__`` methods after the instance has been initialized. They - receive the initialized instance, the :func:`~attrs.Attribute`, and the - passed value. - - The return value is *not* inspected so the validator has to throw an - exception itself. - - If a `list` is passed, its items are treated as validators and must - all pass. - - Validators can be globally disabled and re-enabled using - `get_run_validators`. - - The validator can also be set using decorator notation as shown below. - - :type validator: `callable` or a `list` of `callable`\\ s. - - :param repr: Include this attribute in the generated ``__repr__`` - method. If ``True``, include the attribute; if ``False``, omit it. By - default, the built-in ``repr()`` function is used. To override how the - attribute value is formatted, pass a ``callable`` that takes a single - value and returns a string. Note that the resulting string is used - as-is, i.e. it will be used directly *instead* of calling ``repr()`` - (the default). - :type repr: a `bool` or a `callable` to use a custom function. - - :param eq: If ``True`` (default), include this attribute in the - generated ``__eq__`` and ``__ne__`` methods that check two instances - for equality. To override how the attribute value is compared, - pass a ``callable`` that takes a single value and returns the value - to be compared. - :type eq: a `bool` or a `callable`. - - :param order: If ``True`` (default), include this attributes in the - generated ``__lt__``, ``__le__``, ``__gt__`` and ``__ge__`` methods. - To override how the attribute value is ordered, - pass a ``callable`` that takes a single value and returns the value - to be ordered. - :type order: a `bool` or a `callable`. - - :param cmp: Setting *cmp* is equivalent to setting *eq* and *order* to the - same value. Must not be mixed with *eq* or *order*. - :type cmp: a `bool` or a `callable`. - - :param Optional[bool] hash: Include this attribute in the generated - ``__hash__`` method. If ``None`` (default), mirror *eq*'s value. This - is the correct behavior according the Python spec. Setting this value - to anything else than ``None`` is *discouraged*. - :param bool init: Include this attribute in the generated ``__init__`` - method. It is possible to set this to ``False`` and set a default - value. In that case this attributed is unconditionally initialized - with the specified default value or factory. - :param callable converter: `callable` that is called by - ``attrs``-generated ``__init__`` methods to convert attribute's value - to the desired format. It is given the passed-in value, and the - returned value will be used as the new value of the attribute. The - value is converted before being passed to the validator, if any. - :param metadata: An arbitrary mapping, to be used by third-party - components. See `extending_metadata`. - :param type: The type of the attribute. In Python 3.6 or greater, the - preferred method to specify the type is using a variable annotation - (see :pep:`526`). - This argument is provided for backward compatibility. - Regardless of the approach used, the type will be stored on - ``Attribute.type``. - - Please note that ``attrs`` doesn't do anything with this metadata by - itself. You can use it as part of your own code or for - `static type checking `. - :param kw_only: Make this attribute keyword-only (Python 3+) - in the generated ``__init__`` (if ``init`` is ``False``, this - parameter is ignored). - :param on_setattr: Allows to overwrite the *on_setattr* setting from - `attr.s`. If left `None`, the *on_setattr* value from `attr.s` is used. - Set to `attrs.setters.NO_OP` to run **no** `setattr` hooks for this - attribute -- regardless of the setting in `attr.s`. - :type on_setattr: `callable`, or a list of callables, or `None`, or - `attrs.setters.NO_OP` - - .. versionadded:: 15.2.0 *convert* - .. versionadded:: 16.3.0 *metadata* - .. versionchanged:: 17.1.0 *validator* can be a ``list`` now. - .. versionchanged:: 17.1.0 - *hash* is ``None`` and therefore mirrors *eq* by default. - .. versionadded:: 17.3.0 *type* - .. deprecated:: 17.4.0 *convert* - .. versionadded:: 17.4.0 *converter* as a replacement for the deprecated - *convert* to achieve consistency with other noun-based arguments. - .. versionadded:: 18.1.0 - ``factory=f`` is syntactic sugar for ``default=attr.Factory(f)``. - .. versionadded:: 18.2.0 *kw_only* - .. versionchanged:: 19.2.0 *convert* keyword argument removed. - .. versionchanged:: 19.2.0 *repr* also accepts a custom callable. - .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. - .. versionadded:: 19.2.0 *eq* and *order* - .. versionadded:: 20.1.0 *on_setattr* - .. versionchanged:: 20.3.0 *kw_only* backported to Python 2 - .. versionchanged:: 21.1.0 - *eq*, *order*, and *cmp* also accept a custom callable - .. versionchanged:: 21.1.0 *cmp* undeprecated - """ - eq, eq_key, order, order_key = _determine_attrib_eq_order( - cmp, eq, order, True - ) - - if hash is not None and hash is not True and hash is not False: - raise TypeError( - "Invalid value for hash. Must be True, False, or None." - ) - - if factory is not None: - if default is not NOTHING: - raise ValueError( - "The `default` and `factory` arguments are mutually " - "exclusive." - ) - if not callable(factory): - raise ValueError("The `factory` argument must be a callable.") - default = Factory(factory) - - if metadata is None: - metadata = {} - - # Apply syntactic sugar by auto-wrapping. - if isinstance(on_setattr, (list, tuple)): - on_setattr = setters.pipe(*on_setattr) - - if validator and isinstance(validator, (list, tuple)): - validator = and_(*validator) - - if converter and isinstance(converter, (list, tuple)): - converter = pipe(*converter) - - return _CountingAttr( - default=default, - validator=validator, - repr=repr, - cmp=None, - hash=hash, - init=init, - converter=converter, - metadata=metadata, - type=type, - kw_only=kw_only, - eq=eq, - eq_key=eq_key, - order=order, - order_key=order_key, - on_setattr=on_setattr, - ) - - -def _compile_and_eval(script, globs, locs=None, filename=""): - """ - "Exec" the script with the given global (globs) and local (locs) variables. - """ - bytecode = compile(script, filename, "exec") - eval(bytecode, globs, locs) - - -def _make_method(name, script, filename, globs): - """ - Create the method with the script given and return the method object. - """ - locs = {} - - # In order of debuggers like PDB being able to step through the code, - # we add a fake linecache entry. - count = 1 - base_filename = filename - while True: - linecache_tuple = ( - len(script), - None, - script.splitlines(True), - filename, - ) - old_val = linecache.cache.setdefault(filename, linecache_tuple) - if old_val == linecache_tuple: - break - else: - filename = "{}-{}>".format(base_filename[:-1], count) - count += 1 - - _compile_and_eval(script, globs, locs, filename) - - return locs[name] - - -def _make_attr_tuple_class(cls_name, attr_names): - """ - Create a tuple subclass to hold `Attribute`s for an `attrs` class. - - The subclass is a bare tuple with properties for names. - - class MyClassAttributes(tuple): - __slots__ = () - x = property(itemgetter(0)) - """ - attr_class_name = "{}Attributes".format(cls_name) - attr_class_template = [ - "class {}(tuple):".format(attr_class_name), - " __slots__ = ()", - ] - if attr_names: - for i, attr_name in enumerate(attr_names): - attr_class_template.append( - _tuple_property_pat.format(index=i, attr_name=attr_name) - ) - else: - attr_class_template.append(" pass") - globs = {"_attrs_itemgetter": itemgetter, "_attrs_property": property} - _compile_and_eval("\n".join(attr_class_template), globs) - return globs[attr_class_name] - - -# Tuple class for extracted attributes from a class definition. -# `base_attrs` is a subset of `attrs`. -_Attributes = _make_attr_tuple_class( - "_Attributes", - [ - # all attributes to build dunder methods for - "attrs", - # attributes that have been inherited - "base_attrs", - # map inherited attributes to their originating classes - "base_attrs_map", - ], -) - - -def _is_class_var(annot): - """ - Check whether *annot* is a typing.ClassVar. - - The string comparison hack is used to avoid evaluating all string - annotations which would put attrs-based classes at a performance - disadvantage compared to plain old classes. - """ - annot = str(annot) - - # Annotation can be quoted. - if annot.startswith(("'", '"')) and annot.endswith(("'", '"')): - annot = annot[1:-1] - - return annot.startswith(_classvar_prefixes) - - -def _has_own_attribute(cls, attrib_name): - """ - Check whether *cls* defines *attrib_name* (and doesn't just inherit it). - - Requires Python 3. - """ - attr = getattr(cls, attrib_name, _sentinel) - if attr is _sentinel: - return False - - for base_cls in cls.__mro__[1:]: - a = getattr(base_cls, attrib_name, None) - if attr is a: - return False - - return True - - -def _get_annotations(cls): - """ - Get annotations for *cls*. - """ - if _has_own_attribute(cls, "__annotations__"): - return cls.__annotations__ - - return {} - - -def _counter_getter(e): - """ - Key function for sorting to avoid re-creating a lambda for every class. - """ - return e[1].counter - - -def _collect_base_attrs(cls, taken_attr_names): - """ - Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. - """ - base_attrs = [] - base_attr_map = {} # A dictionary of base attrs to their classes. - - # Traverse the MRO and collect attributes. - for base_cls in reversed(cls.__mro__[1:-1]): - for a in getattr(base_cls, "__attrs_attrs__", []): - if a.inherited or a.name in taken_attr_names: - continue - - a = a.evolve(inherited=True) - base_attrs.append(a) - base_attr_map[a.name] = base_cls - - # For each name, only keep the freshest definition i.e. the furthest at the - # back. base_attr_map is fine because it gets overwritten with every new - # instance. - filtered = [] - seen = set() - for a in reversed(base_attrs): - if a.name in seen: - continue - filtered.insert(0, a) - seen.add(a.name) - - return filtered, base_attr_map - - -def _collect_base_attrs_broken(cls, taken_attr_names): - """ - Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. - - N.B. *taken_attr_names* will be mutated. - - Adhere to the old incorrect behavior. - - Notably it collects from the front and considers inherited attributes which - leads to the buggy behavior reported in #428. - """ - base_attrs = [] - base_attr_map = {} # A dictionary of base attrs to their classes. - - # Traverse the MRO and collect attributes. - for base_cls in cls.__mro__[1:-1]: - for a in getattr(base_cls, "__attrs_attrs__", []): - if a.name in taken_attr_names: - continue - - a = a.evolve(inherited=True) - taken_attr_names.add(a.name) - base_attrs.append(a) - base_attr_map[a.name] = base_cls - - return base_attrs, base_attr_map - - -def _transform_attrs( - cls, these, auto_attribs, kw_only, collect_by_mro, field_transformer -): - """ - Transform all `_CountingAttr`s on a class into `Attribute`s. - - If *these* is passed, use that and don't look for them on the class. - - *collect_by_mro* is True, collect them in the correct MRO order, otherwise - use the old -- incorrect -- order. See #428. - - Return an `_Attributes`. - """ - cd = cls.__dict__ - anns = _get_annotations(cls) - - if these is not None: - ca_list = [(name, ca) for name, ca in these.items()] - - if not isinstance(these, ordered_dict): - ca_list.sort(key=_counter_getter) - elif auto_attribs is True: - ca_names = { - name - for name, attr in cd.items() - if isinstance(attr, _CountingAttr) - } - ca_list = [] - annot_names = set() - for attr_name, type in anns.items(): - if _is_class_var(type): - continue - annot_names.add(attr_name) - a = cd.get(attr_name, NOTHING) - - if not isinstance(a, _CountingAttr): - if a is NOTHING: - a = attrib() - else: - a = attrib(default=a) - ca_list.append((attr_name, a)) - - unannotated = ca_names - annot_names - if len(unannotated) > 0: - raise UnannotatedAttributeError( - "The following `attr.ib`s lack a type annotation: " - + ", ".join( - sorted(unannotated, key=lambda n: cd.get(n).counter) - ) - + "." - ) - else: - ca_list = sorted( - ( - (name, attr) - for name, attr in cd.items() - if isinstance(attr, _CountingAttr) - ), - key=lambda e: e[1].counter, - ) - - own_attrs = [ - Attribute.from_counting_attr( - name=attr_name, ca=ca, type=anns.get(attr_name) - ) - for attr_name, ca in ca_list - ] - - if collect_by_mro: - base_attrs, base_attr_map = _collect_base_attrs( - cls, {a.name for a in own_attrs} - ) - else: - base_attrs, base_attr_map = _collect_base_attrs_broken( - cls, {a.name for a in own_attrs} - ) - - if kw_only: - own_attrs = [a.evolve(kw_only=True) for a in own_attrs] - base_attrs = [a.evolve(kw_only=True) for a in base_attrs] - - attrs = base_attrs + own_attrs - - # Mandatory vs non-mandatory attr order only matters when they are part of - # the __init__ signature and when they aren't kw_only (which are moved to - # the end and can be mandatory or non-mandatory in any order, as they will - # be specified as keyword args anyway). Check the order of those attrs: - had_default = False - for a in (a for a in attrs if a.init is not False and a.kw_only is False): - if had_default is True and a.default is NOTHING: - raise ValueError( - "No mandatory attributes allowed after an attribute with a " - "default value or factory. Attribute in question: %r" % (a,) - ) - - if had_default is False and a.default is not NOTHING: - had_default = True - - if field_transformer is not None: - attrs = field_transformer(cls, attrs) - - # Create AttrsClass *after* applying the field_transformer since it may - # add or remove attributes! - attr_names = [a.name for a in attrs] - AttrsClass = _make_attr_tuple_class(cls.__name__, attr_names) - - return _Attributes((AttrsClass(attrs), base_attrs, base_attr_map)) - - -if PYPY: - - def _frozen_setattrs(self, name, value): - """ - Attached to frozen classes as __setattr__. - """ - if isinstance(self, BaseException) and name in ( - "__cause__", - "__context__", - ): - BaseException.__setattr__(self, name, value) - return - - raise FrozenInstanceError() - -else: - - def _frozen_setattrs(self, name, value): - """ - Attached to frozen classes as __setattr__. - """ - raise FrozenInstanceError() - - -def _frozen_delattrs(self, name): - """ - Attached to frozen classes as __delattr__. - """ - raise FrozenInstanceError() - - -class _ClassBuilder: - """ - Iteratively build *one* class. - """ - - __slots__ = ( - "_attr_names", - "_attrs", - "_base_attr_map", - "_base_names", - "_cache_hash", - "_cls", - "_cls_dict", - "_delete_attribs", - "_frozen", - "_has_pre_init", - "_has_post_init", - "_is_exc", - "_on_setattr", - "_slots", - "_weakref_slot", - "_wrote_own_setattr", - "_has_custom_setattr", - ) - - def __init__( - self, - cls, - these, - slots, - frozen, - weakref_slot, - getstate_setstate, - auto_attribs, - kw_only, - cache_hash, - is_exc, - collect_by_mro, - on_setattr, - has_custom_setattr, - field_transformer, - ): - attrs, base_attrs, base_map = _transform_attrs( - cls, - these, - auto_attribs, - kw_only, - collect_by_mro, - field_transformer, - ) - - self._cls = cls - self._cls_dict = dict(cls.__dict__) if slots else {} - self._attrs = attrs - self._base_names = {a.name for a in base_attrs} - self._base_attr_map = base_map - self._attr_names = tuple(a.name for a in attrs) - self._slots = slots - self._frozen = frozen - self._weakref_slot = weakref_slot - self._cache_hash = cache_hash - self._has_pre_init = bool(getattr(cls, "__attrs_pre_init__", False)) - self._has_post_init = bool(getattr(cls, "__attrs_post_init__", False)) - self._delete_attribs = not bool(these) - self._is_exc = is_exc - self._on_setattr = on_setattr - - self._has_custom_setattr = has_custom_setattr - self._wrote_own_setattr = False - - self._cls_dict["__attrs_attrs__"] = self._attrs - - if frozen: - self._cls_dict["__setattr__"] = _frozen_setattrs - self._cls_dict["__delattr__"] = _frozen_delattrs - - self._wrote_own_setattr = True - elif on_setattr in ( - _ng_default_on_setattr, - setters.validate, - setters.convert, - ): - has_validator = has_converter = False - for a in attrs: - if a.validator is not None: - has_validator = True - if a.converter is not None: - has_converter = True - - if has_validator and has_converter: - break - if ( - ( - on_setattr == _ng_default_on_setattr - and not (has_validator or has_converter) - ) - or (on_setattr == setters.validate and not has_validator) - or (on_setattr == setters.convert and not has_converter) - ): - # If class-level on_setattr is set to convert + validate, but - # there's no field to convert or validate, pretend like there's - # no on_setattr. - self._on_setattr = None - - if getstate_setstate: - ( - self._cls_dict["__getstate__"], - self._cls_dict["__setstate__"], - ) = self._make_getstate_setstate() - - def __repr__(self): - return "<_ClassBuilder(cls={cls})>".format(cls=self._cls.__name__) - - def build_class(self): - """ - Finalize class based on the accumulated configuration. - - Builder cannot be used after calling this method. - """ - if self._slots is True: - return self._create_slots_class() - else: - return self._patch_original_class() - - def _patch_original_class(self): - """ - Apply accumulated methods and return the class. - """ - cls = self._cls - base_names = self._base_names - - # Clean class of attribute definitions (`attr.ib()`s). - if self._delete_attribs: - for name in self._attr_names: - if ( - name not in base_names - and getattr(cls, name, _sentinel) is not _sentinel - ): - try: - delattr(cls, name) - except AttributeError: - # This can happen if a base class defines a class - # variable and we want to set an attribute with the - # same name by using only a type annotation. - pass - - # Attach our dunder methods. - for name, value in self._cls_dict.items(): - setattr(cls, name, value) - - # If we've inherited an attrs __setattr__ and don't write our own, - # reset it to object's. - if not self._wrote_own_setattr and getattr( - cls, "__attrs_own_setattr__", False - ): - cls.__attrs_own_setattr__ = False - - if not self._has_custom_setattr: - cls.__setattr__ = _obj_setattr - - return cls - - def _create_slots_class(self): - """ - Build and return a new class with a `__slots__` attribute. - """ - cd = { - k: v - for k, v in self._cls_dict.items() - if k not in tuple(self._attr_names) + ("__dict__", "__weakref__") - } - - # If our class doesn't have its own implementation of __setattr__ - # (either from the user or by us), check the bases, if one of them has - # an attrs-made __setattr__, that needs to be reset. We don't walk the - # MRO because we only care about our immediate base classes. - # XXX: This can be confused by subclassing a slotted attrs class with - # XXX: a non-attrs class and subclass the resulting class with an attrs - # XXX: class. See `test_slotted_confused` for details. For now that's - # XXX: OK with us. - if not self._wrote_own_setattr: - cd["__attrs_own_setattr__"] = False - - if not self._has_custom_setattr: - for base_cls in self._cls.__bases__: - if base_cls.__dict__.get("__attrs_own_setattr__", False): - cd["__setattr__"] = _obj_setattr - break - - # Traverse the MRO to collect existing slots - # and check for an existing __weakref__. - existing_slots = dict() - weakref_inherited = False - for base_cls in self._cls.__mro__[1:-1]: - if base_cls.__dict__.get("__weakref__", None) is not None: - weakref_inherited = True - existing_slots.update( - { - name: getattr(base_cls, name) - for name in getattr(base_cls, "__slots__", []) - } - ) - - base_names = set(self._base_names) - - names = self._attr_names - if ( - self._weakref_slot - and "__weakref__" not in getattr(self._cls, "__slots__", ()) - and "__weakref__" not in names - and not weakref_inherited - ): - names += ("__weakref__",) - - # We only add the names of attributes that aren't inherited. - # Setting __slots__ to inherited attributes wastes memory. - slot_names = [name for name in names if name not in base_names] - # There are slots for attributes from current class - # that are defined in parent classes. - # As their descriptors may be overridden by a child class, - # we collect them here and update the class dict - reused_slots = { - slot: slot_descriptor - for slot, slot_descriptor in existing_slots.items() - if slot in slot_names - } - slot_names = [name for name in slot_names if name not in reused_slots] - cd.update(reused_slots) - if self._cache_hash: - slot_names.append(_hash_cache_field) - cd["__slots__"] = tuple(slot_names) - - cd["__qualname__"] = self._cls.__qualname__ - - # Create new class based on old class and our methods. - cls = type(self._cls)(self._cls.__name__, self._cls.__bases__, cd) - - # The following is a fix for - # . On Python 3, - # if a method mentions `__class__` or uses the no-arg super(), the - # compiler will bake a reference to the class in the method itself - # as `method.__closure__`. Since we replace the class with a - # clone, we rewrite these references so it keeps working. - for item in cls.__dict__.values(): - if isinstance(item, (classmethod, staticmethod)): - # Class- and staticmethods hide their functions inside. - # These might need to be rewritten as well. - closure_cells = getattr(item.__func__, "__closure__", None) - elif isinstance(item, property): - # Workaround for property `super()` shortcut (PY3-only). - # There is no universal way for other descriptors. - closure_cells = getattr(item.fget, "__closure__", None) - else: - closure_cells = getattr(item, "__closure__", None) - - if not closure_cells: # Catch None or the empty list. - continue - for cell in closure_cells: - try: - match = cell.cell_contents is self._cls - except ValueError: # ValueError: Cell is empty - pass - else: - if match: - set_closure_cell(cell, cls) - - return cls - - def add_repr(self, ns): - self._cls_dict["__repr__"] = self._add_method_dunders( - _make_repr(self._attrs, ns, self._cls) - ) - return self - - def add_str(self): - repr = self._cls_dict.get("__repr__") - if repr is None: - raise ValueError( - "__str__ can only be generated if a __repr__ exists." - ) - - def __str__(self): - return self.__repr__() - - self._cls_dict["__str__"] = self._add_method_dunders(__str__) - return self - - def _make_getstate_setstate(self): - """ - Create custom __setstate__ and __getstate__ methods. - """ - # __weakref__ is not writable. - state_attr_names = tuple( - an for an in self._attr_names if an != "__weakref__" - ) - - def slots_getstate(self): - """ - Automatically created by attrs. - """ - return tuple(getattr(self, name) for name in state_attr_names) - - hash_caching_enabled = self._cache_hash - - def slots_setstate(self, state): - """ - Automatically created by attrs. - """ - __bound_setattr = _obj_setattr.__get__(self, Attribute) - for name, value in zip(state_attr_names, state): - __bound_setattr(name, value) - - # The hash code cache is not included when the object is - # serialized, but it still needs to be initialized to None to - # indicate that the first call to __hash__ should be a cache - # miss. - if hash_caching_enabled: - __bound_setattr(_hash_cache_field, None) - - return slots_getstate, slots_setstate - - def make_unhashable(self): - self._cls_dict["__hash__"] = None - return self - - def add_hash(self): - self._cls_dict["__hash__"] = self._add_method_dunders( - _make_hash( - self._cls, - self._attrs, - frozen=self._frozen, - cache_hash=self._cache_hash, - ) - ) - - return self - - def add_init(self): - self._cls_dict["__init__"] = self._add_method_dunders( - _make_init( - self._cls, - self._attrs, - self._has_pre_init, - self._has_post_init, - self._frozen, - self._slots, - self._cache_hash, - self._base_attr_map, - self._is_exc, - self._on_setattr, - attrs_init=False, - ) - ) - - return self - - def add_match_args(self): - self._cls_dict["__match_args__"] = tuple( - field.name - for field in self._attrs - if field.init and not field.kw_only - ) - - def add_attrs_init(self): - self._cls_dict["__attrs_init__"] = self._add_method_dunders( - _make_init( - self._cls, - self._attrs, - self._has_pre_init, - self._has_post_init, - self._frozen, - self._slots, - self._cache_hash, - self._base_attr_map, - self._is_exc, - self._on_setattr, - attrs_init=True, - ) - ) - - return self - - def add_eq(self): - cd = self._cls_dict - - cd["__eq__"] = self._add_method_dunders( - _make_eq(self._cls, self._attrs) - ) - cd["__ne__"] = self._add_method_dunders(_make_ne()) - - return self - - def add_order(self): - cd = self._cls_dict - - cd["__lt__"], cd["__le__"], cd["__gt__"], cd["__ge__"] = ( - self._add_method_dunders(meth) - for meth in _make_order(self._cls, self._attrs) - ) - - return self - - def add_setattr(self): - if self._frozen: - return self - - sa_attrs = {} - for a in self._attrs: - on_setattr = a.on_setattr or self._on_setattr - if on_setattr and on_setattr is not setters.NO_OP: - sa_attrs[a.name] = a, on_setattr - - if not sa_attrs: - return self - - if self._has_custom_setattr: - # We need to write a __setattr__ but there already is one! - raise ValueError( - "Can't combine custom __setattr__ with on_setattr hooks." - ) - - # docstring comes from _add_method_dunders - def __setattr__(self, name, val): - try: - a, hook = sa_attrs[name] - except KeyError: - nval = val - else: - nval = hook(self, a, val) - - _obj_setattr(self, name, nval) - - self._cls_dict["__attrs_own_setattr__"] = True - self._cls_dict["__setattr__"] = self._add_method_dunders(__setattr__) - self._wrote_own_setattr = True - - return self - - def _add_method_dunders(self, method): - """ - Add __module__ and __qualname__ to a *method* if possible. - """ - try: - method.__module__ = self._cls.__module__ - except AttributeError: - pass - - try: - method.__qualname__ = ".".join( - (self._cls.__qualname__, method.__name__) - ) - except AttributeError: - pass - - try: - method.__doc__ = "Method generated by attrs for class %s." % ( - self._cls.__qualname__, - ) - except AttributeError: - pass - - return method - - -def _determine_attrs_eq_order(cmp, eq, order, default_eq): - """ - Validate the combination of *cmp*, *eq*, and *order*. Derive the effective - values of eq and order. If *eq* is None, set it to *default_eq*. - """ - if cmp is not None and any((eq is not None, order is not None)): - raise ValueError("Don't mix `cmp` with `eq' and `order`.") - - # cmp takes precedence due to bw-compatibility. - if cmp is not None: - return cmp, cmp - - # If left None, equality is set to the specified default and ordering - # mirrors equality. - if eq is None: - eq = default_eq - - if order is None: - order = eq - - if eq is False and order is True: - raise ValueError("`order` can only be True if `eq` is True too.") - - return eq, order - - -def _determine_attrib_eq_order(cmp, eq, order, default_eq): - """ - Validate the combination of *cmp*, *eq*, and *order*. Derive the effective - values of eq and order. If *eq* is None, set it to *default_eq*. - """ - if cmp is not None and any((eq is not None, order is not None)): - raise ValueError("Don't mix `cmp` with `eq' and `order`.") - - def decide_callable_or_boolean(value): - """ - Decide whether a key function is used. - """ - if callable(value): - value, key = True, value - else: - key = None - return value, key - - # cmp takes precedence due to bw-compatibility. - if cmp is not None: - cmp, cmp_key = decide_callable_or_boolean(cmp) - return cmp, cmp_key, cmp, cmp_key - - # If left None, equality is set to the specified default and ordering - # mirrors equality. - if eq is None: - eq, eq_key = default_eq, None - else: - eq, eq_key = decide_callable_or_boolean(eq) - - if order is None: - order, order_key = eq, eq_key - else: - order, order_key = decide_callable_or_boolean(order) - - if eq is False and order is True: - raise ValueError("`order` can only be True if `eq` is True too.") - - return eq, eq_key, order, order_key - - -def _determine_whether_to_implement( - cls, flag, auto_detect, dunders, default=True -): - """ - Check whether we should implement a set of methods for *cls*. - - *flag* is the argument passed into @attr.s like 'init', *auto_detect* the - same as passed into @attr.s and *dunders* is a tuple of attribute names - whose presence signal that the user has implemented it themselves. - - Return *default* if no reason for either for or against is found. - """ - if flag is True or flag is False: - return flag - - if flag is None and auto_detect is False: - return default - - # Logically, flag is None and auto_detect is True here. - for dunder in dunders: - if _has_own_attribute(cls, dunder): - return False - - return default - - -def attrs( - maybe_cls=None, - these=None, - repr_ns=None, - repr=None, - cmp=None, - hash=None, - init=None, - slots=False, - frozen=False, - weakref_slot=True, - str=False, - auto_attribs=False, - kw_only=False, - cache_hash=False, - auto_exc=False, - eq=None, - order=None, - auto_detect=False, - collect_by_mro=False, - getstate_setstate=None, - on_setattr=None, - field_transformer=None, - match_args=True, -): - r""" - A class decorator that adds `dunder - `_\ -methods according to the - specified attributes using `attr.ib` or the *these* argument. - - :param these: A dictionary of name to `attr.ib` mappings. This is - useful to avoid the definition of your attributes within the class body - because you can't (e.g. if you want to add ``__repr__`` methods to - Django models) or don't want to. - - If *these* is not ``None``, ``attrs`` will *not* search the class body - for attributes and will *not* remove any attributes from it. - - If *these* is an ordered dict (`dict` on Python 3.6+, - `collections.OrderedDict` otherwise), the order is deduced from - the order of the attributes inside *these*. Otherwise the order - of the definition of the attributes is used. - - :type these: `dict` of `str` to `attr.ib` - - :param str repr_ns: When using nested classes, there's no way in Python 2 - to automatically detect that. Therefore it's possible to set the - namespace explicitly for a more meaningful ``repr`` output. - :param bool auto_detect: Instead of setting the *init*, *repr*, *eq*, - *order*, and *hash* arguments explicitly, assume they are set to - ``True`` **unless any** of the involved methods for one of the - arguments is implemented in the *current* class (i.e. it is *not* - inherited from some base class). - - So for example by implementing ``__eq__`` on a class yourself, - ``attrs`` will deduce ``eq=False`` and will create *neither* - ``__eq__`` *nor* ``__ne__`` (but Python classes come with a sensible - ``__ne__`` by default, so it *should* be enough to only implement - ``__eq__`` in most cases). - - .. warning:: - - If you prevent ``attrs`` from creating the ordering methods for you - (``order=False``, e.g. by implementing ``__le__``), it becomes - *your* responsibility to make sure its ordering is sound. The best - way is to use the `functools.total_ordering` decorator. - - - Passing ``True`` or ``False`` to *init*, *repr*, *eq*, *order*, - *cmp*, or *hash* overrides whatever *auto_detect* would determine. - - *auto_detect* requires Python 3. Setting it ``True`` on Python 2 raises - an `attrs.exceptions.PythonTooOldError`. - - :param bool repr: Create a ``__repr__`` method with a human readable - representation of ``attrs`` attributes.. - :param bool str: Create a ``__str__`` method that is identical to - ``__repr__``. This is usually not necessary except for - `Exception`\ s. - :param Optional[bool] eq: If ``True`` or ``None`` (default), add ``__eq__`` - and ``__ne__`` methods that check two instances for equality. - - They compare the instances as if they were tuples of their ``attrs`` - attributes if and only if the types of both classes are *identical*! - :param Optional[bool] order: If ``True``, add ``__lt__``, ``__le__``, - ``__gt__``, and ``__ge__`` methods that behave like *eq* above and - allow instances to be ordered. If ``None`` (default) mirror value of - *eq*. - :param Optional[bool] cmp: Setting *cmp* is equivalent to setting *eq* - and *order* to the same value. Must not be mixed with *eq* or *order*. - :param Optional[bool] hash: If ``None`` (default), the ``__hash__`` method - is generated according how *eq* and *frozen* are set. - - 1. If *both* are True, ``attrs`` will generate a ``__hash__`` for you. - 2. If *eq* is True and *frozen* is False, ``__hash__`` will be set to - None, marking it unhashable (which it is). - 3. If *eq* is False, ``__hash__`` will be left untouched meaning the - ``__hash__`` method of the base class will be used (if base class is - ``object``, this means it will fall back to id-based hashing.). - - Although not recommended, you can decide for yourself and force - ``attrs`` to create one (e.g. if the class is immutable even though you - didn't freeze it programmatically) by passing ``True`` or not. Both of - these cases are rather special and should be used carefully. - - See our documentation on `hashing`, Python's documentation on - `object.__hash__`, and the `GitHub issue that led to the default \ - behavior `_ for more - details. - :param bool init: Create a ``__init__`` method that initializes the - ``attrs`` attributes. Leading underscores are stripped for the argument - name. If a ``__attrs_pre_init__`` method exists on the class, it will - be called before the class is initialized. If a ``__attrs_post_init__`` - method exists on the class, it will be called after the class is fully - initialized. - - If ``init`` is ``False``, an ``__attrs_init__`` method will be - injected instead. This allows you to define a custom ``__init__`` - method that can do pre-init work such as ``super().__init__()``, - and then call ``__attrs_init__()`` and ``__attrs_post_init__()``. - :param bool slots: Create a `slotted class ` that's more - memory-efficient. Slotted classes are generally superior to the default - dict classes, but have some gotchas you should know about, so we - encourage you to read the `glossary entry `. - :param bool frozen: Make instances immutable after initialization. If - someone attempts to modify a frozen instance, - `attr.exceptions.FrozenInstanceError` is raised. - - .. note:: - - 1. This is achieved by installing a custom ``__setattr__`` method - on your class, so you can't implement your own. - - 2. True immutability is impossible in Python. - - 3. This *does* have a minor a runtime performance `impact - ` when initializing new instances. In other words: - ``__init__`` is slightly slower with ``frozen=True``. - - 4. If a class is frozen, you cannot modify ``self`` in - ``__attrs_post_init__`` or a self-written ``__init__``. You can - circumvent that limitation by using - ``object.__setattr__(self, "attribute_name", value)``. - - 5. Subclasses of a frozen class are frozen too. - - :param bool weakref_slot: Make instances weak-referenceable. This has no - effect unless ``slots`` is also enabled. - :param bool auto_attribs: If ``True``, collect :pep:`526`-annotated - attributes (Python 3.6 and later only) from the class body. - - In this case, you **must** annotate every field. If ``attrs`` - encounters a field that is set to an `attr.ib` but lacks a type - annotation, an `attr.exceptions.UnannotatedAttributeError` is - raised. Use ``field_name: typing.Any = attr.ib(...)`` if you don't - want to set a type. - - If you assign a value to those attributes (e.g. ``x: int = 42``), that - value becomes the default value like if it were passed using - ``attr.ib(default=42)``. Passing an instance of `attrs.Factory` also - works as expected in most cases (see warning below). - - Attributes annotated as `typing.ClassVar`, and attributes that are - neither annotated nor set to an `attr.ib` are **ignored**. - - .. warning:: - For features that use the attribute name to create decorators (e.g. - `validators `), you still *must* assign `attr.ib` to - them. Otherwise Python will either not find the name or try to use - the default value to call e.g. ``validator`` on it. - - These errors can be quite confusing and probably the most common bug - report on our bug tracker. - - :param bool kw_only: Make all attributes keyword-only (Python 3+) - in the generated ``__init__`` (if ``init`` is ``False``, this - parameter is ignored). - :param bool cache_hash: Ensure that the object's hash code is computed - only once and stored on the object. If this is set to ``True``, - hashing must be either explicitly or implicitly enabled for this - class. If the hash code is cached, avoid any reassignments of - fields involved in hash code computation or mutations of the objects - those fields point to after object creation. If such changes occur, - the behavior of the object's hash code is undefined. - :param bool auto_exc: If the class subclasses `BaseException` - (which implicitly includes any subclass of any exception), the - following happens to behave like a well-behaved Python exceptions - class: - - - the values for *eq*, *order*, and *hash* are ignored and the - instances compare and hash by the instance's ids (N.B. ``attrs`` will - *not* remove existing implementations of ``__hash__`` or the equality - methods. It just won't add own ones.), - - all attributes that are either passed into ``__init__`` or have a - default value are additionally available as a tuple in the ``args`` - attribute, - - the value of *str* is ignored leaving ``__str__`` to base classes. - :param bool collect_by_mro: Setting this to `True` fixes the way ``attrs`` - collects attributes from base classes. The default behavior is - incorrect in certain cases of multiple inheritance. It should be on by - default but is kept off for backward-compatibility. - - See issue `#428 `_ for - more details. - - :param Optional[bool] getstate_setstate: - .. note:: - This is usually only interesting for slotted classes and you should - probably just set *auto_detect* to `True`. - - If `True`, ``__getstate__`` and - ``__setstate__`` are generated and attached to the class. This is - necessary for slotted classes to be pickleable. If left `None`, it's - `True` by default for slotted classes and ``False`` for dict classes. - - If *auto_detect* is `True`, and *getstate_setstate* is left `None`, - and **either** ``__getstate__`` or ``__setstate__`` is detected directly - on the class (i.e. not inherited), it is set to `False` (this is usually - what you want). - - :param on_setattr: A callable that is run whenever the user attempts to set - an attribute (either by assignment like ``i.x = 42`` or by using - `setattr` like ``setattr(i, "x", 42)``). It receives the same arguments - as validators: the instance, the attribute that is being modified, and - the new value. - - If no exception is raised, the attribute is set to the return value of - the callable. - - If a list of callables is passed, they're automatically wrapped in an - `attrs.setters.pipe`. - :type on_setattr: `callable`, or a list of callables, or `None`, or - `attrs.setters.NO_OP` - - :param Optional[callable] field_transformer: - A function that is called with the original class object and all - fields right before ``attrs`` finalizes the class. You can use - this, e.g., to automatically add converters or validators to - fields based on their types. See `transform-fields` for more details. - - :param bool match_args: - If `True` (default), set ``__match_args__`` on the class to support - :pep:`634` (Structural Pattern Matching). It is a tuple of all - non-keyword-only ``__init__`` parameter names on Python 3.10 and later. - Ignored on older Python versions. - - .. versionadded:: 16.0.0 *slots* - .. versionadded:: 16.1.0 *frozen* - .. versionadded:: 16.3.0 *str* - .. versionadded:: 16.3.0 Support for ``__attrs_post_init__``. - .. versionchanged:: 17.1.0 - *hash* supports ``None`` as value which is also the default now. - .. versionadded:: 17.3.0 *auto_attribs* - .. versionchanged:: 18.1.0 - If *these* is passed, no attributes are deleted from the class body. - .. versionchanged:: 18.1.0 If *these* is ordered, the order is retained. - .. versionadded:: 18.2.0 *weakref_slot* - .. deprecated:: 18.2.0 - ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now raise a - `DeprecationWarning` if the classes compared are subclasses of - each other. ``__eq`` and ``__ne__`` never tried to compared subclasses - to each other. - .. versionchanged:: 19.2.0 - ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now do not consider - subclasses comparable anymore. - .. versionadded:: 18.2.0 *kw_only* - .. versionadded:: 18.2.0 *cache_hash* - .. versionadded:: 19.1.0 *auto_exc* - .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. - .. versionadded:: 19.2.0 *eq* and *order* - .. versionadded:: 20.1.0 *auto_detect* - .. versionadded:: 20.1.0 *collect_by_mro* - .. versionadded:: 20.1.0 *getstate_setstate* - .. versionadded:: 20.1.0 *on_setattr* - .. versionadded:: 20.3.0 *field_transformer* - .. versionchanged:: 21.1.0 - ``init=False`` injects ``__attrs_init__`` - .. versionchanged:: 21.1.0 Support for ``__attrs_pre_init__`` - .. versionchanged:: 21.1.0 *cmp* undeprecated - .. versionadded:: 21.3.0 *match_args* - """ - eq_, order_ = _determine_attrs_eq_order(cmp, eq, order, None) - hash_ = hash # work around the lack of nonlocal - - if isinstance(on_setattr, (list, tuple)): - on_setattr = setters.pipe(*on_setattr) - - def wrap(cls): - is_frozen = frozen or _has_frozen_base_class(cls) - is_exc = auto_exc is True and issubclass(cls, BaseException) - has_own_setattr = auto_detect and _has_own_attribute( - cls, "__setattr__" - ) - - if has_own_setattr and is_frozen: - raise ValueError("Can't freeze a class with a custom __setattr__.") - - builder = _ClassBuilder( - cls, - these, - slots, - is_frozen, - weakref_slot, - _determine_whether_to_implement( - cls, - getstate_setstate, - auto_detect, - ("__getstate__", "__setstate__"), - default=slots, - ), - auto_attribs, - kw_only, - cache_hash, - is_exc, - collect_by_mro, - on_setattr, - has_own_setattr, - field_transformer, - ) - if _determine_whether_to_implement( - cls, repr, auto_detect, ("__repr__",) - ): - builder.add_repr(repr_ns) - if str is True: - builder.add_str() - - eq = _determine_whether_to_implement( - cls, eq_, auto_detect, ("__eq__", "__ne__") - ) - if not is_exc and eq is True: - builder.add_eq() - if not is_exc and _determine_whether_to_implement( - cls, order_, auto_detect, ("__lt__", "__le__", "__gt__", "__ge__") - ): - builder.add_order() - - builder.add_setattr() - - if ( - hash_ is None - and auto_detect is True - and _has_own_attribute(cls, "__hash__") - ): - hash = False - else: - hash = hash_ - if hash is not True and hash is not False and hash is not None: - # Can't use `hash in` because 1 == True for example. - raise TypeError( - "Invalid value for hash. Must be True, False, or None." - ) - elif hash is False or (hash is None and eq is False) or is_exc: - # Don't do anything. Should fall back to __object__'s __hash__ - # which is by id. - if cache_hash: - raise TypeError( - "Invalid value for cache_hash. To use hash caching," - " hashing must be either explicitly or implicitly " - "enabled." - ) - elif hash is True or ( - hash is None and eq is True and is_frozen is True - ): - # Build a __hash__ if told so, or if it's safe. - builder.add_hash() - else: - # Raise TypeError on attempts to hash. - if cache_hash: - raise TypeError( - "Invalid value for cache_hash. To use hash caching," - " hashing must be either explicitly or implicitly " - "enabled." - ) - builder.make_unhashable() - - if _determine_whether_to_implement( - cls, init, auto_detect, ("__init__",) - ): - builder.add_init() - else: - builder.add_attrs_init() - if cache_hash: - raise TypeError( - "Invalid value for cache_hash. To use hash caching," - " init must be True." - ) - - if ( - PY310 - and match_args - and not _has_own_attribute(cls, "__match_args__") - ): - builder.add_match_args() - - return builder.build_class() - - # maybe_cls's type depends on the usage of the decorator. It's a class - # if it's used as `@attrs` but ``None`` if used as `@attrs()`. - if maybe_cls is None: - return wrap - else: - return wrap(maybe_cls) - - -_attrs = attrs -""" -Internal alias so we can use it in functions that take an argument called -*attrs*. -""" - - -def _has_frozen_base_class(cls): - """ - Check whether *cls* has a frozen ancestor by looking at its - __setattr__. - """ - return cls.__setattr__ is _frozen_setattrs - - -def _generate_unique_filename(cls, func_name): - """ - Create a "filename" suitable for a function being generated. - """ - unique_filename = "".format( - func_name, - cls.__module__, - getattr(cls, "__qualname__", cls.__name__), - ) - return unique_filename - - -def _make_hash(cls, attrs, frozen, cache_hash): - attrs = tuple( - a for a in attrs if a.hash is True or (a.hash is None and a.eq is True) - ) - - tab = " " - - unique_filename = _generate_unique_filename(cls, "hash") - type_hash = hash(unique_filename) - # If eq is custom generated, we need to include the functions in globs - globs = {} - - hash_def = "def __hash__(self" - hash_func = "hash((" - closing_braces = "))" - if not cache_hash: - hash_def += "):" - else: - hash_def += ", *" - - hash_def += ( - ", _cache_wrapper=" - + "__import__('attr._make')._make._CacheHashWrapper):" - ) - hash_func = "_cache_wrapper(" + hash_func - closing_braces += ")" - - method_lines = [hash_def] - - def append_hash_computation_lines(prefix, indent): - """ - Generate the code for actually computing the hash code. - Below this will either be returned directly or used to compute - a value which is then cached, depending on the value of cache_hash - """ - - method_lines.extend( - [ - indent + prefix + hash_func, - indent + " %d," % (type_hash,), - ] - ) - - for a in attrs: - if a.eq_key: - cmp_name = "_%s_key" % (a.name,) - globs[cmp_name] = a.eq_key - method_lines.append( - indent + " %s(self.%s)," % (cmp_name, a.name) - ) - else: - method_lines.append(indent + " self.%s," % a.name) - - method_lines.append(indent + " " + closing_braces) - - if cache_hash: - method_lines.append(tab + "if self.%s is None:" % _hash_cache_field) - if frozen: - append_hash_computation_lines( - "object.__setattr__(self, '%s', " % _hash_cache_field, tab * 2 - ) - method_lines.append(tab * 2 + ")") # close __setattr__ - else: - append_hash_computation_lines( - "self.%s = " % _hash_cache_field, tab * 2 - ) - method_lines.append(tab + "return self.%s" % _hash_cache_field) - else: - append_hash_computation_lines("return ", tab) - - script = "\n".join(method_lines) - return _make_method("__hash__", script, unique_filename, globs) - - -def _add_hash(cls, attrs): - """ - Add a hash method to *cls*. - """ - cls.__hash__ = _make_hash(cls, attrs, frozen=False, cache_hash=False) - return cls - - -def _make_ne(): - """ - Create __ne__ method. - """ - - def __ne__(self, other): - """ - Check equality and either forward a NotImplemented or - return the result negated. - """ - result = self.__eq__(other) - if result is NotImplemented: - return NotImplemented - - return not result - - return __ne__ - - -def _make_eq(cls, attrs): - """ - Create __eq__ method for *cls* with *attrs*. - """ - attrs = [a for a in attrs if a.eq] - - unique_filename = _generate_unique_filename(cls, "eq") - lines = [ - "def __eq__(self, other):", - " if other.__class__ is not self.__class__:", - " return NotImplemented", - ] - - # We can't just do a big self.x = other.x and... clause due to - # irregularities like nan == nan is false but (nan,) == (nan,) is true. - globs = {} - if attrs: - lines.append(" return (") - others = [" ) == ("] - for a in attrs: - if a.eq_key: - cmp_name = "_%s_key" % (a.name,) - # Add the key function to the global namespace - # of the evaluated function. - globs[cmp_name] = a.eq_key - lines.append( - " %s(self.%s)," - % ( - cmp_name, - a.name, - ) - ) - others.append( - " %s(other.%s)," - % ( - cmp_name, - a.name, - ) - ) - else: - lines.append(" self.%s," % (a.name,)) - others.append(" other.%s," % (a.name,)) - - lines += others + [" )"] - else: - lines.append(" return True") - - script = "\n".join(lines) - - return _make_method("__eq__", script, unique_filename, globs) - - -def _make_order(cls, attrs): - """ - Create ordering methods for *cls* with *attrs*. - """ - attrs = [a for a in attrs if a.order] - - def attrs_to_tuple(obj): - """ - Save us some typing. - """ - return tuple( - key(value) if key else value - for value, key in ( - (getattr(obj, a.name), a.order_key) for a in attrs - ) - ) - - def __lt__(self, other): - """ - Automatically created by attrs. - """ - if other.__class__ is self.__class__: - return attrs_to_tuple(self) < attrs_to_tuple(other) - - return NotImplemented - - def __le__(self, other): - """ - Automatically created by attrs. - """ - if other.__class__ is self.__class__: - return attrs_to_tuple(self) <= attrs_to_tuple(other) - - return NotImplemented - - def __gt__(self, other): - """ - Automatically created by attrs. - """ - if other.__class__ is self.__class__: - return attrs_to_tuple(self) > attrs_to_tuple(other) - - return NotImplemented - - def __ge__(self, other): - """ - Automatically created by attrs. - """ - if other.__class__ is self.__class__: - return attrs_to_tuple(self) >= attrs_to_tuple(other) - - return NotImplemented - - return __lt__, __le__, __gt__, __ge__ - - -def _add_eq(cls, attrs=None): - """ - Add equality methods to *cls* with *attrs*. - """ - if attrs is None: - attrs = cls.__attrs_attrs__ - - cls.__eq__ = _make_eq(cls, attrs) - cls.__ne__ = _make_ne() - - return cls - - -if HAS_F_STRINGS: - - def _make_repr(attrs, ns, cls): - unique_filename = _generate_unique_filename(cls, "repr") - # Figure out which attributes to include, and which function to use to - # format them. The a.repr value can be either bool or a custom - # callable. - attr_names_with_reprs = tuple( - (a.name, (repr if a.repr is True else a.repr), a.init) - for a in attrs - if a.repr is not False - ) - globs = { - name + "_repr": r - for name, r, _ in attr_names_with_reprs - if r != repr - } - globs["_compat"] = _compat - globs["AttributeError"] = AttributeError - globs["NOTHING"] = NOTHING - attribute_fragments = [] - for name, r, i in attr_names_with_reprs: - accessor = ( - "self." + name - if i - else 'getattr(self, "' + name + '", NOTHING)' - ) - fragment = ( - "%s={%s!r}" % (name, accessor) - if r == repr - else "%s={%s_repr(%s)}" % (name, name, accessor) - ) - attribute_fragments.append(fragment) - repr_fragment = ", ".join(attribute_fragments) - - if ns is None: - cls_name_fragment = ( - '{self.__class__.__qualname__.rsplit(">.", 1)[-1]}' - ) - else: - cls_name_fragment = ns + ".{self.__class__.__name__}" - - lines = [ - "def __repr__(self):", - " try:", - " already_repring = _compat.repr_context.already_repring", - " except AttributeError:", - " already_repring = {id(self),}", - " _compat.repr_context.already_repring = already_repring", - " else:", - " if id(self) in already_repring:", - " return '...'", - " else:", - " already_repring.add(id(self))", - " try:", - " return f'%s(%s)'" % (cls_name_fragment, repr_fragment), - " finally:", - " already_repring.remove(id(self))", - ] - - return _make_method( - "__repr__", "\n".join(lines), unique_filename, globs=globs - ) - -else: - - def _make_repr(attrs, ns, _): - """ - Make a repr method that includes relevant *attrs*, adding *ns* to the - full name. - """ - - # Figure out which attributes to include, and which function to use to - # format them. The a.repr value can be either bool or a custom - # callable. - attr_names_with_reprs = tuple( - (a.name, repr if a.repr is True else a.repr) - for a in attrs - if a.repr is not False - ) - - def __repr__(self): - """ - Automatically created by attrs. - """ - try: - already_repring = _compat.repr_context.already_repring - except AttributeError: - already_repring = set() - _compat.repr_context.already_repring = already_repring - - if id(self) in already_repring: - return "..." - real_cls = self.__class__ - if ns is None: - class_name = real_cls.__qualname__.rsplit(">.", 1)[-1] - else: - class_name = ns + "." + real_cls.__name__ - - # Since 'self' remains on the stack (i.e.: strongly referenced) - # for the duration of this call, it's safe to depend on id(...) - # stability, and not need to track the instance and therefore - # worry about properties like weakref- or hash-ability. - already_repring.add(id(self)) - try: - result = [class_name, "("] - first = True - for name, attr_repr in attr_names_with_reprs: - if first: - first = False - else: - result.append(", ") - result.extend( - (name, "=", attr_repr(getattr(self, name, NOTHING))) - ) - return "".join(result) + ")" - finally: - already_repring.remove(id(self)) - - return __repr__ - - -def _add_repr(cls, ns=None, attrs=None): - """ - Add a repr method to *cls*. - """ - if attrs is None: - attrs = cls.__attrs_attrs__ - - cls.__repr__ = _make_repr(attrs, ns, cls) - return cls - - -def fields(cls): - """ - Return the tuple of ``attrs`` attributes for a class. - - The tuple also allows accessing the fields by their names (see below for - examples). - - :param type cls: Class to introspect. - - :raise TypeError: If *cls* is not a class. - :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` - class. - - :rtype: tuple (with name accessors) of `attrs.Attribute` - - .. versionchanged:: 16.2.0 Returned tuple allows accessing the fields - by name. - """ - if not isinstance(cls, type): - raise TypeError("Passed object must be a class.") - attrs = getattr(cls, "__attrs_attrs__", None) - if attrs is None: - raise NotAnAttrsClassError( - "{cls!r} is not an attrs-decorated class.".format(cls=cls) - ) - return attrs - - -def fields_dict(cls): - """ - Return an ordered dictionary of ``attrs`` attributes for a class, whose - keys are the attribute names. - - :param type cls: Class to introspect. - - :raise TypeError: If *cls* is not a class. - :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` - class. - - :rtype: an ordered dict where keys are attribute names and values are - `attrs.Attribute`\\ s. This will be a `dict` if it's - naturally ordered like on Python 3.6+ or an - :class:`~collections.OrderedDict` otherwise. - - .. versionadded:: 18.1.0 - """ - if not isinstance(cls, type): - raise TypeError("Passed object must be a class.") - attrs = getattr(cls, "__attrs_attrs__", None) - if attrs is None: - raise NotAnAttrsClassError( - "{cls!r} is not an attrs-decorated class.".format(cls=cls) - ) - return ordered_dict((a.name, a) for a in attrs) - - -def validate(inst): - """ - Validate all attributes on *inst* that have a validator. - - Leaves all exceptions through. - - :param inst: Instance of a class with ``attrs`` attributes. - """ - if _config._run_validators is False: - return - - for a in fields(inst.__class__): - v = a.validator - if v is not None: - v(inst, a, getattr(inst, a.name)) - - -def _is_slot_cls(cls): - return "__slots__" in cls.__dict__ - - -def _is_slot_attr(a_name, base_attr_map): - """ - Check if the attribute name comes from a slot class. - """ - return a_name in base_attr_map and _is_slot_cls(base_attr_map[a_name]) - - -def _make_init( - cls, - attrs, - pre_init, - post_init, - frozen, - slots, - cache_hash, - base_attr_map, - is_exc, - cls_on_setattr, - attrs_init, -): - has_cls_on_setattr = ( - cls_on_setattr is not None and cls_on_setattr is not setters.NO_OP - ) - - if frozen and has_cls_on_setattr: - raise ValueError("Frozen classes can't use on_setattr.") - - needs_cached_setattr = cache_hash or frozen - filtered_attrs = [] - attr_dict = {} - for a in attrs: - if not a.init and a.default is NOTHING: - continue - - filtered_attrs.append(a) - attr_dict[a.name] = a - - if a.on_setattr is not None: - if frozen is True: - raise ValueError("Frozen classes can't use on_setattr.") - - needs_cached_setattr = True - elif has_cls_on_setattr and a.on_setattr is not setters.NO_OP: - needs_cached_setattr = True - - unique_filename = _generate_unique_filename(cls, "init") - - script, globs, annotations = _attrs_to_init_script( - filtered_attrs, - frozen, - slots, - pre_init, - post_init, - cache_hash, - base_attr_map, - is_exc, - has_cls_on_setattr, - attrs_init, - ) - if cls.__module__ in sys.modules: - # This makes typing.get_type_hints(CLS.__init__) resolve string types. - globs.update(sys.modules[cls.__module__].__dict__) - - globs.update({"NOTHING": NOTHING, "attr_dict": attr_dict}) - - if needs_cached_setattr: - # Save the lookup overhead in __init__ if we need to circumvent - # setattr hooks. - globs["_setattr"] = _obj_setattr - - init = _make_method( - "__attrs_init__" if attrs_init else "__init__", - script, - unique_filename, - globs, - ) - init.__annotations__ = annotations - - return init - - -def _setattr(attr_name, value_var, has_on_setattr): - """ - Use the cached object.setattr to set *attr_name* to *value_var*. - """ - return "_setattr(self, '%s', %s)" % (attr_name, value_var) - - -def _setattr_with_converter(attr_name, value_var, has_on_setattr): - """ - Use the cached object.setattr to set *attr_name* to *value_var*, but run - its converter first. - """ - return "_setattr(self, '%s', %s(%s))" % ( - attr_name, - _init_converter_pat % (attr_name,), - value_var, - ) - - -def _assign(attr_name, value, has_on_setattr): - """ - Unless *attr_name* has an on_setattr hook, use normal assignment. Otherwise - relegate to _setattr. - """ - if has_on_setattr: - return _setattr(attr_name, value, True) - - return "self.%s = %s" % (attr_name, value) - - -def _assign_with_converter(attr_name, value_var, has_on_setattr): - """ - Unless *attr_name* has an on_setattr hook, use normal assignment after - conversion. Otherwise relegate to _setattr_with_converter. - """ - if has_on_setattr: - return _setattr_with_converter(attr_name, value_var, True) - - return "self.%s = %s(%s)" % ( - attr_name, - _init_converter_pat % (attr_name,), - value_var, - ) - - -def _attrs_to_init_script( - attrs, - frozen, - slots, - pre_init, - post_init, - cache_hash, - base_attr_map, - is_exc, - has_cls_on_setattr, - attrs_init, -): - """ - Return a script of an initializer for *attrs* and a dict of globals. - - The globals are expected by the generated script. - - If *frozen* is True, we cannot set the attributes directly so we use - a cached ``object.__setattr__``. - """ - lines = [] - if pre_init: - lines.append("self.__attrs_pre_init__()") - - if frozen is True: - if slots is True: - fmt_setter = _setattr - fmt_setter_with_converter = _setattr_with_converter - else: - # Dict frozen classes assign directly to __dict__. - # But only if the attribute doesn't come from an ancestor slot - # class. - # Note _inst_dict will be used again below if cache_hash is True - lines.append("_inst_dict = self.__dict__") - - def fmt_setter(attr_name, value_var, has_on_setattr): - if _is_slot_attr(attr_name, base_attr_map): - return _setattr(attr_name, value_var, has_on_setattr) - - return "_inst_dict['%s'] = %s" % (attr_name, value_var) - - def fmt_setter_with_converter( - attr_name, value_var, has_on_setattr - ): - if has_on_setattr or _is_slot_attr(attr_name, base_attr_map): - return _setattr_with_converter( - attr_name, value_var, has_on_setattr - ) - - return "_inst_dict['%s'] = %s(%s)" % ( - attr_name, - _init_converter_pat % (attr_name,), - value_var, - ) - - else: - # Not frozen. - fmt_setter = _assign - fmt_setter_with_converter = _assign_with_converter - - args = [] - kw_only_args = [] - attrs_to_validate = [] - - # This is a dictionary of names to validator and converter callables. - # Injecting this into __init__ globals lets us avoid lookups. - names_for_globals = {} - annotations = {"return": None} - - for a in attrs: - if a.validator: - attrs_to_validate.append(a) - - attr_name = a.name - has_on_setattr = a.on_setattr is not None or ( - a.on_setattr is not setters.NO_OP and has_cls_on_setattr - ) - arg_name = a.name.lstrip("_") - - has_factory = isinstance(a.default, Factory) - if has_factory and a.default.takes_self: - maybe_self = "self" - else: - maybe_self = "" - - if a.init is False: - if has_factory: - init_factory_name = _init_factory_pat.format(a.name) - if a.converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, - init_factory_name + "(%s)" % (maybe_self,), - has_on_setattr, - ) - ) - conv_name = _init_converter_pat % (a.name,) - names_for_globals[conv_name] = a.converter - else: - lines.append( - fmt_setter( - attr_name, - init_factory_name + "(%s)" % (maybe_self,), - has_on_setattr, - ) - ) - names_for_globals[init_factory_name] = a.default.factory - else: - if a.converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, - "attr_dict['%s'].default" % (attr_name,), - has_on_setattr, - ) - ) - conv_name = _init_converter_pat % (a.name,) - names_for_globals[conv_name] = a.converter - else: - lines.append( - fmt_setter( - attr_name, - "attr_dict['%s'].default" % (attr_name,), - has_on_setattr, - ) - ) - elif a.default is not NOTHING and not has_factory: - arg = "%s=attr_dict['%s'].default" % (arg_name, attr_name) - if a.kw_only: - kw_only_args.append(arg) - else: - args.append(arg) - - if a.converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, arg_name, has_on_setattr - ) - ) - names_for_globals[ - _init_converter_pat % (a.name,) - ] = a.converter - else: - lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) - - elif has_factory: - arg = "%s=NOTHING" % (arg_name,) - if a.kw_only: - kw_only_args.append(arg) - else: - args.append(arg) - lines.append("if %s is not NOTHING:" % (arg_name,)) - - init_factory_name = _init_factory_pat.format(a.name) - if a.converter is not None: - lines.append( - " " - + fmt_setter_with_converter( - attr_name, arg_name, has_on_setattr - ) - ) - lines.append("else:") - lines.append( - " " - + fmt_setter_with_converter( - attr_name, - init_factory_name + "(" + maybe_self + ")", - has_on_setattr, - ) - ) - names_for_globals[ - _init_converter_pat % (a.name,) - ] = a.converter - else: - lines.append( - " " + fmt_setter(attr_name, arg_name, has_on_setattr) - ) - lines.append("else:") - lines.append( - " " - + fmt_setter( - attr_name, - init_factory_name + "(" + maybe_self + ")", - has_on_setattr, - ) - ) - names_for_globals[init_factory_name] = a.default.factory - else: - if a.kw_only: - kw_only_args.append(arg_name) - else: - args.append(arg_name) - - if a.converter is not None: - lines.append( - fmt_setter_with_converter( - attr_name, arg_name, has_on_setattr - ) - ) - names_for_globals[ - _init_converter_pat % (a.name,) - ] = a.converter - else: - lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) - - if a.init is True: - if a.type is not None and a.converter is None: - annotations[arg_name] = a.type - elif a.converter is not None: - # Try to get the type from the converter. - t = _AnnotationExtractor(a.converter).get_first_param_type() - if t: - annotations[arg_name] = t - - if attrs_to_validate: # we can skip this if there are no validators. - names_for_globals["_config"] = _config - lines.append("if _config._run_validators is True:") - for a in attrs_to_validate: - val_name = "__attr_validator_" + a.name - attr_name = "__attr_" + a.name - lines.append( - " %s(self, %s, self.%s)" % (val_name, attr_name, a.name) - ) - names_for_globals[val_name] = a.validator - names_for_globals[attr_name] = a - - if post_init: - lines.append("self.__attrs_post_init__()") - - # because this is set only after __attrs_post_init__ is called, a crash - # will result if post-init tries to access the hash code. This seemed - # preferable to setting this beforehand, in which case alteration to - # field values during post-init combined with post-init accessing the - # hash code would result in silent bugs. - if cache_hash: - if frozen: - if slots: - # if frozen and slots, then _setattr defined above - init_hash_cache = "_setattr(self, '%s', %s)" - else: - # if frozen and not slots, then _inst_dict defined above - init_hash_cache = "_inst_dict['%s'] = %s" - else: - init_hash_cache = "self.%s = %s" - lines.append(init_hash_cache % (_hash_cache_field, "None")) - - # For exceptions we rely on BaseException.__init__ for proper - # initialization. - if is_exc: - vals = ",".join("self." + a.name for a in attrs if a.init) - - lines.append("BaseException.__init__(self, %s)" % (vals,)) - - args = ", ".join(args) - if kw_only_args: - args += "%s*, %s" % ( - ", " if args else "", # leading comma - ", ".join(kw_only_args), # kw_only args - ) - return ( - """\ -def {init_name}(self, {args}): - {lines} -""".format( - init_name=("__attrs_init__" if attrs_init else "__init__"), - args=args, - lines="\n ".join(lines) if lines else "pass", - ), - names_for_globals, - annotations, - ) - - -class Attribute: - """ - *Read-only* representation of an attribute. - - The class has *all* arguments of `attr.ib` (except for ``factory`` - which is only syntactic sugar for ``default=Factory(...)`` plus the - following: - - - ``name`` (`str`): The name of the attribute. - - ``inherited`` (`bool`): Whether or not that attribute has been inherited - from a base class. - - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The callables - that are used for comparing and ordering objects by this attribute, - respectively. These are set by passing a callable to `attr.ib`'s ``eq``, - ``order``, or ``cmp`` arguments. See also :ref:`comparison customization - `. - - Instances of this class are frequently used for introspection purposes - like: - - - `fields` returns a tuple of them. - - Validators get them passed as the first argument. - - The :ref:`field transformer ` hook receives a list of - them. - - .. versionadded:: 20.1.0 *inherited* - .. versionadded:: 20.1.0 *on_setattr* - .. versionchanged:: 20.2.0 *inherited* is not taken into account for - equality checks and hashing anymore. - .. versionadded:: 21.1.0 *eq_key* and *order_key* - - For the full version history of the fields, see `attr.ib`. - """ - - __slots__ = ( - "name", - "default", - "validator", - "repr", - "eq", - "eq_key", - "order", - "order_key", - "hash", - "init", - "metadata", - "type", - "converter", - "kw_only", - "inherited", - "on_setattr", - ) - - def __init__( - self, - name, - default, - validator, - repr, - cmp, # XXX: unused, remove along with other cmp code. - hash, - init, - inherited, - metadata=None, - type=None, - converter=None, - kw_only=False, - eq=None, - eq_key=None, - order=None, - order_key=None, - on_setattr=None, - ): - eq, eq_key, order, order_key = _determine_attrib_eq_order( - cmp, eq_key or eq, order_key or order, True - ) - - # Cache this descriptor here to speed things up later. - bound_setattr = _obj_setattr.__get__(self, Attribute) - - # Despite the big red warning, people *do* instantiate `Attribute` - # themselves. - bound_setattr("name", name) - bound_setattr("default", default) - bound_setattr("validator", validator) - bound_setattr("repr", repr) - bound_setattr("eq", eq) - bound_setattr("eq_key", eq_key) - bound_setattr("order", order) - bound_setattr("order_key", order_key) - bound_setattr("hash", hash) - bound_setattr("init", init) - bound_setattr("converter", converter) - bound_setattr( - "metadata", - ( - types.MappingProxyType(dict(metadata)) # Shallow copy - if metadata - else _empty_metadata_singleton - ), - ) - bound_setattr("type", type) - bound_setattr("kw_only", kw_only) - bound_setattr("inherited", inherited) - bound_setattr("on_setattr", on_setattr) - - def __setattr__(self, name, value): - raise FrozenInstanceError() - - @classmethod - def from_counting_attr(cls, name, ca, type=None): - # type holds the annotated value. deal with conflicts: - if type is None: - type = ca.type - elif ca.type is not None: - raise ValueError( - "Type annotation and type argument cannot both be present" - ) - inst_dict = { - k: getattr(ca, k) - for k in Attribute.__slots__ - if k - not in ( - "name", - "validator", - "default", - "type", - "inherited", - ) # exclude methods and deprecated alias - } - return cls( - name=name, - validator=ca._validator, - default=ca._default, - type=type, - cmp=None, - inherited=False, - **inst_dict - ) - - # Don't use attr.evolve since fields(Attribute) doesn't work - def evolve(self, **changes): - """ - Copy *self* and apply *changes*. - - This works similarly to `attr.evolve` but that function does not work - with ``Attribute``. - - It is mainly meant to be used for `transform-fields`. - - .. versionadded:: 20.3.0 - """ - new = copy.copy(self) - - new._setattrs(changes.items()) - - return new - - # Don't use _add_pickle since fields(Attribute) doesn't work - def __getstate__(self): - """ - Play nice with pickle. - """ - return tuple( - getattr(self, name) if name != "metadata" else dict(self.metadata) - for name in self.__slots__ - ) - - def __setstate__(self, state): - """ - Play nice with pickle. - """ - self._setattrs(zip(self.__slots__, state)) - - def _setattrs(self, name_values_pairs): - bound_setattr = _obj_setattr.__get__(self, Attribute) - for name, value in name_values_pairs: - if name != "metadata": - bound_setattr(name, value) - else: - bound_setattr( - name, - types.MappingProxyType(dict(value)) - if value - else _empty_metadata_singleton, - ) - - -_a = [ - Attribute( - name=name, - default=NOTHING, - validator=None, - repr=True, - cmp=None, - eq=True, - order=False, - hash=(name != "metadata"), - init=True, - inherited=False, - ) - for name in Attribute.__slots__ -] - -Attribute = _add_hash( - _add_eq( - _add_repr(Attribute, attrs=_a), - attrs=[a for a in _a if a.name != "inherited"], - ), - attrs=[a for a in _a if a.hash and a.name != "inherited"], -) - - -class _CountingAttr: - """ - Intermediate representation of attributes that uses a counter to preserve - the order in which the attributes have been defined. - - *Internal* data structure of the attrs library. Running into is most - likely the result of a bug like a forgotten `@attr.s` decorator. - """ - - __slots__ = ( - "counter", - "_default", - "repr", - "eq", - "eq_key", - "order", - "order_key", - "hash", - "init", - "metadata", - "_validator", - "converter", - "type", - "kw_only", - "on_setattr", - ) - __attrs_attrs__ = tuple( - Attribute( - name=name, - default=NOTHING, - validator=None, - repr=True, - cmp=None, - hash=True, - init=True, - kw_only=False, - eq=True, - eq_key=None, - order=False, - order_key=None, - inherited=False, - on_setattr=None, - ) - for name in ( - "counter", - "_default", - "repr", - "eq", - "order", - "hash", - "init", - "on_setattr", - ) - ) + ( - Attribute( - name="metadata", - default=None, - validator=None, - repr=True, - cmp=None, - hash=False, - init=True, - kw_only=False, - eq=True, - eq_key=None, - order=False, - order_key=None, - inherited=False, - on_setattr=None, - ), - ) - cls_counter = 0 - - def __init__( - self, - default, - validator, - repr, - cmp, - hash, - init, - converter, - metadata, - type, - kw_only, - eq, - eq_key, - order, - order_key, - on_setattr, - ): - _CountingAttr.cls_counter += 1 - self.counter = _CountingAttr.cls_counter - self._default = default - self._validator = validator - self.converter = converter - self.repr = repr - self.eq = eq - self.eq_key = eq_key - self.order = order - self.order_key = order_key - self.hash = hash - self.init = init - self.metadata = metadata - self.type = type - self.kw_only = kw_only - self.on_setattr = on_setattr - - def validator(self, meth): - """ - Decorator that adds *meth* to the list of validators. - - Returns *meth* unchanged. - - .. versionadded:: 17.1.0 - """ - if self._validator is None: - self._validator = meth - else: - self._validator = and_(self._validator, meth) - return meth - - def default(self, meth): - """ - Decorator that allows to set the default for an attribute. - - Returns *meth* unchanged. - - :raises DefaultAlreadySetError: If default has been set before. - - .. versionadded:: 17.1.0 - """ - if self._default is not NOTHING: - raise DefaultAlreadySetError() - - self._default = Factory(meth, takes_self=True) - - return meth - - -_CountingAttr = _add_eq(_add_repr(_CountingAttr)) - - -class Factory: - """ - Stores a factory callable. - - If passed as the default value to `attrs.field`, the factory is used to - generate a new value. - - :param callable factory: A callable that takes either none or exactly one - mandatory positional argument depending on *takes_self*. - :param bool takes_self: Pass the partially initialized instance that is - being initialized as a positional argument. - - .. versionadded:: 17.1.0 *takes_self* - """ - - __slots__ = ("factory", "takes_self") - - def __init__(self, factory, takes_self=False): - """ - `Factory` is part of the default machinery so if we want a default - value here, we have to implement it ourselves. - """ - self.factory = factory - self.takes_self = takes_self - - def __getstate__(self): - """ - Play nice with pickle. - """ - return tuple(getattr(self, name) for name in self.__slots__) - - def __setstate__(self, state): - """ - Play nice with pickle. - """ - for name, value in zip(self.__slots__, state): - setattr(self, name, value) - - -_f = [ - Attribute( - name=name, - default=NOTHING, - validator=None, - repr=True, - cmp=None, - eq=True, - order=False, - hash=True, - init=True, - inherited=False, - ) - for name in Factory.__slots__ -] - -Factory = _add_hash(_add_eq(_add_repr(Factory, attrs=_f), attrs=_f), attrs=_f) - - -def make_class(name, attrs, bases=(object,), **attributes_arguments): - """ - A quick way to create a new class called *name* with *attrs*. - - :param str name: The name for the new class. - - :param attrs: A list of names or a dictionary of mappings of names to - attributes. - - If *attrs* is a list or an ordered dict (`dict` on Python 3.6+, - `collections.OrderedDict` otherwise), the order is deduced from - the order of the names or attributes inside *attrs*. Otherwise the - order of the definition of the attributes is used. - :type attrs: `list` or `dict` - - :param tuple bases: Classes that the new class will subclass. - - :param attributes_arguments: Passed unmodified to `attr.s`. - - :return: A new class with *attrs*. - :rtype: type - - .. versionadded:: 17.1.0 *bases* - .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained. - """ - if isinstance(attrs, dict): - cls_dict = attrs - elif isinstance(attrs, (list, tuple)): - cls_dict = {a: attrib() for a in attrs} - else: - raise TypeError("attrs argument must be a dict or a list.") - - pre_init = cls_dict.pop("__attrs_pre_init__", None) - post_init = cls_dict.pop("__attrs_post_init__", None) - user_init = cls_dict.pop("__init__", None) - - body = {} - if pre_init is not None: - body["__attrs_pre_init__"] = pre_init - if post_init is not None: - body["__attrs_post_init__"] = post_init - if user_init is not None: - body["__init__"] = user_init - - type_ = types.new_class(name, bases, {}, lambda ns: ns.update(body)) - - # For pickling to work, the __module__ variable needs to be set to the - # frame where the class is created. Bypass this step in environments where - # sys._getframe is not defined (Jython for example) or sys._getframe is not - # defined for arguments greater than 0 (IronPython). - try: - type_.__module__ = sys._getframe(1).f_globals.get( - "__name__", "__main__" - ) - except (AttributeError, ValueError): - pass - - # We do it here for proper warnings with meaningful stacklevel. - cmp = attributes_arguments.pop("cmp", None) - ( - attributes_arguments["eq"], - attributes_arguments["order"], - ) = _determine_attrs_eq_order( - cmp, - attributes_arguments.get("eq"), - attributes_arguments.get("order"), - True, - ) - - return _attrs(these=cls_dict, **attributes_arguments)(type_) - - -# These are required by within this module so we define them here and merely -# import into .validators / .converters. - - -@attrs(slots=True, hash=True) -class _AndValidator: - """ - Compose many validators to a single one. - """ - - _validators = attrib() - - def __call__(self, inst, attr, value): - for v in self._validators: - v(inst, attr, value) - - -def and_(*validators): - """ - A validator that composes multiple validators into one. - - When called on a value, it runs all wrapped validators. - - :param callables validators: Arbitrary number of validators. - - .. versionadded:: 17.1.0 - """ - vals = [] - for validator in validators: - vals.extend( - validator._validators - if isinstance(validator, _AndValidator) - else [validator] - ) - - return _AndValidator(tuple(vals)) - - -def pipe(*converters): - """ - A converter that composes multiple converters into one. - - When called on a value, it runs all wrapped converters, returning the - *last* value. - - Type annotations will be inferred from the wrapped converters', if - they have any. - - :param callables converters: Arbitrary number of converters. - - .. versionadded:: 20.1.0 - """ - - def pipe_converter(val): - for converter in converters: - val = converter(val) - - return val - - if not converters: - # If the converter list is empty, pipe_converter is the identity. - A = typing.TypeVar("A") - pipe_converter.__annotations__ = {"val": A, "return": A} - else: - # Get parameter type from first converter. - t = _AnnotationExtractor(converters[0]).get_first_param_type() - if t: - pipe_converter.__annotations__["val"] = t - - # Get return type from last converter. - rt = _AnnotationExtractor(converters[-1]).get_return_type() - if rt: - pipe_converter.__annotations__["return"] = rt - - return pipe_converter diff --git a/.venv/Lib/site-packages/attr/_next_gen.py b/.venv/Lib/site-packages/attr/_next_gen.py deleted file mode 100644 index 5a06a74..0000000 --- a/.venv/Lib/site-packages/attr/_next_gen.py +++ /dev/null @@ -1,220 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -These are Python 3.6+-only and keyword-only APIs that call `attr.s` and -`attr.ib` with different default values. -""" - - -from functools import partial - -from . import setters -from ._funcs import asdict as _asdict -from ._funcs import astuple as _astuple -from ._make import ( - NOTHING, - _frozen_setattrs, - _ng_default_on_setattr, - attrib, - attrs, -) -from .exceptions import UnannotatedAttributeError - - -def define( - maybe_cls=None, - *, - these=None, - repr=None, - hash=None, - init=None, - slots=True, - frozen=False, - weakref_slot=True, - str=False, - auto_attribs=None, - kw_only=False, - cache_hash=False, - auto_exc=True, - eq=None, - order=False, - auto_detect=True, - getstate_setstate=None, - on_setattr=None, - field_transformer=None, - match_args=True, -): - r""" - Define an ``attrs`` class. - - Differences to the classic `attr.s` that it uses underneath: - - - Automatically detect whether or not *auto_attribs* should be `True` (c.f. - *auto_attribs* parameter). - - If *frozen* is `False`, run converters and validators when setting an - attribute by default. - - *slots=True* - - .. caution:: - - Usually this has only upsides and few visible effects in everyday - programming. But it *can* lead to some suprising behaviors, so please - make sure to read :term:`slotted classes`. - - *auto_exc=True* - - *auto_detect=True* - - *order=False* - - Some options that were only relevant on Python 2 or were kept around for - backwards-compatibility have been removed. - - Please note that these are all defaults and you can change them as you - wish. - - :param Optional[bool] auto_attribs: If set to `True` or `False`, it behaves - exactly like `attr.s`. If left `None`, `attr.s` will try to guess: - - 1. If any attributes are annotated and no unannotated `attrs.fields`\ s - are found, it assumes *auto_attribs=True*. - 2. Otherwise it assumes *auto_attribs=False* and tries to collect - `attrs.fields`\ s. - - For now, please refer to `attr.s` for the rest of the parameters. - - .. versionadded:: 20.1.0 - .. versionchanged:: 21.3.0 Converters are also run ``on_setattr``. - """ - - def do_it(cls, auto_attribs): - return attrs( - maybe_cls=cls, - these=these, - repr=repr, - hash=hash, - init=init, - slots=slots, - frozen=frozen, - weakref_slot=weakref_slot, - str=str, - auto_attribs=auto_attribs, - kw_only=kw_only, - cache_hash=cache_hash, - auto_exc=auto_exc, - eq=eq, - order=order, - auto_detect=auto_detect, - collect_by_mro=True, - getstate_setstate=getstate_setstate, - on_setattr=on_setattr, - field_transformer=field_transformer, - match_args=match_args, - ) - - def wrap(cls): - """ - Making this a wrapper ensures this code runs during class creation. - - We also ensure that frozen-ness of classes is inherited. - """ - nonlocal frozen, on_setattr - - had_on_setattr = on_setattr not in (None, setters.NO_OP) - - # By default, mutable classes convert & validate on setattr. - if frozen is False and on_setattr is None: - on_setattr = _ng_default_on_setattr - - # However, if we subclass a frozen class, we inherit the immutability - # and disable on_setattr. - for base_cls in cls.__bases__: - if base_cls.__setattr__ is _frozen_setattrs: - if had_on_setattr: - raise ValueError( - "Frozen classes can't use on_setattr " - "(frozen-ness was inherited)." - ) - - on_setattr = setters.NO_OP - break - - if auto_attribs is not None: - return do_it(cls, auto_attribs) - - try: - return do_it(cls, True) - except UnannotatedAttributeError: - return do_it(cls, False) - - # maybe_cls's type depends on the usage of the decorator. It's a class - # if it's used as `@attrs` but ``None`` if used as `@attrs()`. - if maybe_cls is None: - return wrap - else: - return wrap(maybe_cls) - - -mutable = define -frozen = partial(define, frozen=True, on_setattr=None) - - -def field( - *, - default=NOTHING, - validator=None, - repr=True, - hash=None, - init=True, - metadata=None, - converter=None, - factory=None, - kw_only=False, - eq=None, - order=None, - on_setattr=None, -): - """ - Identical to `attr.ib`, except keyword-only and with some arguments - removed. - - .. versionadded:: 20.1.0 - """ - return attrib( - default=default, - validator=validator, - repr=repr, - hash=hash, - init=init, - metadata=metadata, - converter=converter, - factory=factory, - kw_only=kw_only, - eq=eq, - order=order, - on_setattr=on_setattr, - ) - - -def asdict(inst, *, recurse=True, filter=None, value_serializer=None): - """ - Same as `attr.asdict`, except that collections types are always retained - and dict is always used as *dict_factory*. - - .. versionadded:: 21.3.0 - """ - return _asdict( - inst=inst, - recurse=recurse, - filter=filter, - value_serializer=value_serializer, - retain_collection_types=True, - ) - - -def astuple(inst, *, recurse=True, filter=None): - """ - Same as `attr.astuple`, except that collections types are always retained - and `tuple` is always used as the *tuple_factory*. - - .. versionadded:: 21.3.0 - """ - return _astuple( - inst=inst, recurse=recurse, filter=filter, retain_collection_types=True - ) diff --git a/.venv/Lib/site-packages/attr/_version_info.py b/.venv/Lib/site-packages/attr/_version_info.py deleted file mode 100644 index 51a1312..0000000 --- a/.venv/Lib/site-packages/attr/_version_info.py +++ /dev/null @@ -1,86 +0,0 @@ -# SPDX-License-Identifier: MIT - - -from functools import total_ordering - -from ._funcs import astuple -from ._make import attrib, attrs - - -@total_ordering -@attrs(eq=False, order=False, slots=True, frozen=True) -class VersionInfo: - """ - A version object that can be compared to tuple of length 1--4: - - >>> attr.VersionInfo(19, 1, 0, "final") <= (19, 2) - True - >>> attr.VersionInfo(19, 1, 0, "final") < (19, 1, 1) - True - >>> vi = attr.VersionInfo(19, 2, 0, "final") - >>> vi < (19, 1, 1) - False - >>> vi < (19,) - False - >>> vi == (19, 2,) - True - >>> vi == (19, 2, 1) - False - - .. versionadded:: 19.2 - """ - - year = attrib(type=int) - minor = attrib(type=int) - micro = attrib(type=int) - releaselevel = attrib(type=str) - - @classmethod - def _from_version_string(cls, s): - """ - Parse *s* and return a _VersionInfo. - """ - v = s.split(".") - if len(v) == 3: - v.append("final") - - return cls( - year=int(v[0]), minor=int(v[1]), micro=int(v[2]), releaselevel=v[3] - ) - - def _ensure_tuple(self, other): - """ - Ensure *other* is a tuple of a valid length. - - Returns a possibly transformed *other* and ourselves as a tuple of - the same length as *other*. - """ - - if self.__class__ is other.__class__: - other = astuple(other) - - if not isinstance(other, tuple): - raise NotImplementedError - - if not (1 <= len(other) <= 4): - raise NotImplementedError - - return astuple(self)[: len(other)], other - - def __eq__(self, other): - try: - us, them = self._ensure_tuple(other) - except NotImplementedError: - return NotImplemented - - return us == them - - def __lt__(self, other): - try: - us, them = self._ensure_tuple(other) - except NotImplementedError: - return NotImplemented - - # Since alphabetically "dev0" < "final" < "post1" < "post2", we don't - # have to do anything special with releaselevel for now. - return us < them diff --git a/.venv/Lib/site-packages/attr/_version_info.pyi b/.venv/Lib/site-packages/attr/_version_info.pyi deleted file mode 100644 index 45ced08..0000000 --- a/.venv/Lib/site-packages/attr/_version_info.pyi +++ /dev/null @@ -1,9 +0,0 @@ -class VersionInfo: - @property - def year(self) -> int: ... - @property - def minor(self) -> int: ... - @property - def micro(self) -> int: ... - @property - def releaselevel(self) -> str: ... diff --git a/.venv/Lib/site-packages/attr/converters.py b/.venv/Lib/site-packages/attr/converters.py deleted file mode 100644 index a73626c..0000000 --- a/.venv/Lib/site-packages/attr/converters.py +++ /dev/null @@ -1,144 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Commonly useful converters. -""" - - -import typing - -from ._compat import _AnnotationExtractor -from ._make import NOTHING, Factory, pipe - - -__all__ = [ - "default_if_none", - "optional", - "pipe", - "to_bool", -] - - -def optional(converter): - """ - A converter that allows an attribute to be optional. An optional attribute - is one which can be set to ``None``. - - Type annotations will be inferred from the wrapped converter's, if it - has any. - - :param callable converter: the converter that is used for non-``None`` - values. - - .. versionadded:: 17.1.0 - """ - - def optional_converter(val): - if val is None: - return None - return converter(val) - - xtr = _AnnotationExtractor(converter) - - t = xtr.get_first_param_type() - if t: - optional_converter.__annotations__["val"] = typing.Optional[t] - - rt = xtr.get_return_type() - if rt: - optional_converter.__annotations__["return"] = typing.Optional[rt] - - return optional_converter - - -def default_if_none(default=NOTHING, factory=None): - """ - A converter that allows to replace ``None`` values by *default* or the - result of *factory*. - - :param default: Value to be used if ``None`` is passed. Passing an instance - of `attrs.Factory` is supported, however the ``takes_self`` option - is *not*. - :param callable factory: A callable that takes no parameters whose result - is used if ``None`` is passed. - - :raises TypeError: If **neither** *default* or *factory* is passed. - :raises TypeError: If **both** *default* and *factory* are passed. - :raises ValueError: If an instance of `attrs.Factory` is passed with - ``takes_self=True``. - - .. versionadded:: 18.2.0 - """ - if default is NOTHING and factory is None: - raise TypeError("Must pass either `default` or `factory`.") - - if default is not NOTHING and factory is not None: - raise TypeError( - "Must pass either `default` or `factory` but not both." - ) - - if factory is not None: - default = Factory(factory) - - if isinstance(default, Factory): - if default.takes_self: - raise ValueError( - "`takes_self` is not supported by default_if_none." - ) - - def default_if_none_converter(val): - if val is not None: - return val - - return default.factory() - - else: - - def default_if_none_converter(val): - if val is not None: - return val - - return default - - return default_if_none_converter - - -def to_bool(val): - """ - Convert "boolean" strings (e.g., from env. vars.) to real booleans. - - Values mapping to :code:`True`: - - - :code:`True` - - :code:`"true"` / :code:`"t"` - - :code:`"yes"` / :code:`"y"` - - :code:`"on"` - - :code:`"1"` - - :code:`1` - - Values mapping to :code:`False`: - - - :code:`False` - - :code:`"false"` / :code:`"f"` - - :code:`"no"` / :code:`"n"` - - :code:`"off"` - - :code:`"0"` - - :code:`0` - - :raises ValueError: for any other value. - - .. versionadded:: 21.3.0 - """ - if isinstance(val, str): - val = val.lower() - truthy = {True, "true", "t", "yes", "y", "on", "1", 1} - falsy = {False, "false", "f", "no", "n", "off", "0", 0} - try: - if val in truthy: - return True - if val in falsy: - return False - except TypeError: - # Raised when "val" is not hashable (e.g., lists) - pass - raise ValueError("Cannot convert value to bool: {}".format(val)) diff --git a/.venv/Lib/site-packages/attr/converters.pyi b/.venv/Lib/site-packages/attr/converters.pyi deleted file mode 100644 index 0f58088..0000000 --- a/.venv/Lib/site-packages/attr/converters.pyi +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Callable, Optional, TypeVar, overload - -from . import _ConverterType - -_T = TypeVar("_T") - -def pipe(*validators: _ConverterType) -> _ConverterType: ... -def optional(converter: _ConverterType) -> _ConverterType: ... -@overload -def default_if_none(default: _T) -> _ConverterType: ... -@overload -def default_if_none(*, factory: Callable[[], _T]) -> _ConverterType: ... -def to_bool(val: str) -> bool: ... diff --git a/.venv/Lib/site-packages/attr/exceptions.py b/.venv/Lib/site-packages/attr/exceptions.py deleted file mode 100644 index 5dc51e0..0000000 --- a/.venv/Lib/site-packages/attr/exceptions.py +++ /dev/null @@ -1,92 +0,0 @@ -# SPDX-License-Identifier: MIT - - -class FrozenError(AttributeError): - """ - A frozen/immutable instance or attribute have been attempted to be - modified. - - It mirrors the behavior of ``namedtuples`` by using the same error message - and subclassing `AttributeError`. - - .. versionadded:: 20.1.0 - """ - - msg = "can't set attribute" - args = [msg] - - -class FrozenInstanceError(FrozenError): - """ - A frozen instance has been attempted to be modified. - - .. versionadded:: 16.1.0 - """ - - -class FrozenAttributeError(FrozenError): - """ - A frozen attribute has been attempted to be modified. - - .. versionadded:: 20.1.0 - """ - - -class AttrsAttributeNotFoundError(ValueError): - """ - An ``attrs`` function couldn't find an attribute that the user asked for. - - .. versionadded:: 16.2.0 - """ - - -class NotAnAttrsClassError(ValueError): - """ - A non-``attrs`` class has been passed into an ``attrs`` function. - - .. versionadded:: 16.2.0 - """ - - -class DefaultAlreadySetError(RuntimeError): - """ - A default has been set using ``attr.ib()`` and is attempted to be reset - using the decorator. - - .. versionadded:: 17.1.0 - """ - - -class UnannotatedAttributeError(RuntimeError): - """ - A class with ``auto_attribs=True`` has an ``attr.ib()`` without a type - annotation. - - .. versionadded:: 17.3.0 - """ - - -class PythonTooOldError(RuntimeError): - """ - It was attempted to use an ``attrs`` feature that requires a newer Python - version. - - .. versionadded:: 18.2.0 - """ - - -class NotCallableError(TypeError): - """ - A ``attr.ib()`` requiring a callable has been set with a value - that is not callable. - - .. versionadded:: 19.2.0 - """ - - def __init__(self, msg, value): - super(TypeError, self).__init__(msg, value) - self.msg = msg - self.value = value - - def __str__(self): - return str(self.msg) diff --git a/.venv/Lib/site-packages/attr/exceptions.pyi b/.venv/Lib/site-packages/attr/exceptions.pyi deleted file mode 100644 index f268011..0000000 --- a/.venv/Lib/site-packages/attr/exceptions.pyi +++ /dev/null @@ -1,17 +0,0 @@ -from typing import Any - -class FrozenError(AttributeError): - msg: str = ... - -class FrozenInstanceError(FrozenError): ... -class FrozenAttributeError(FrozenError): ... -class AttrsAttributeNotFoundError(ValueError): ... -class NotAnAttrsClassError(ValueError): ... -class DefaultAlreadySetError(RuntimeError): ... -class UnannotatedAttributeError(RuntimeError): ... -class PythonTooOldError(RuntimeError): ... - -class NotCallableError(TypeError): - msg: str = ... - value: Any = ... - def __init__(self, msg: str, value: Any) -> None: ... diff --git a/.venv/Lib/site-packages/attr/filters.py b/.venv/Lib/site-packages/attr/filters.py deleted file mode 100644 index baa25e9..0000000 --- a/.venv/Lib/site-packages/attr/filters.py +++ /dev/null @@ -1,51 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Commonly useful filters for `attr.asdict`. -""" - -from ._make import Attribute - - -def _split_what(what): - """ - Returns a tuple of `frozenset`s of classes and attributes. - """ - return ( - frozenset(cls for cls in what if isinstance(cls, type)), - frozenset(cls for cls in what if isinstance(cls, Attribute)), - ) - - -def include(*what): - """ - Include *what*. - - :param what: What to include. - :type what: `list` of `type` or `attrs.Attribute`\\ s - - :rtype: `callable` - """ - cls, attrs = _split_what(what) - - def include_(attribute, value): - return value.__class__ in cls or attribute in attrs - - return include_ - - -def exclude(*what): - """ - Exclude *what*. - - :param what: What to exclude. - :type what: `list` of classes or `attrs.Attribute`\\ s. - - :rtype: `callable` - """ - cls, attrs = _split_what(what) - - def exclude_(attribute, value): - return value.__class__ not in cls and attribute not in attrs - - return exclude_ diff --git a/.venv/Lib/site-packages/attr/filters.pyi b/.venv/Lib/site-packages/attr/filters.pyi deleted file mode 100644 index 9938668..0000000 --- a/.venv/Lib/site-packages/attr/filters.pyi +++ /dev/null @@ -1,6 +0,0 @@ -from typing import Any, Union - -from . import Attribute, _FilterType - -def include(*what: Union[type, Attribute[Any]]) -> _FilterType[Any]: ... -def exclude(*what: Union[type, Attribute[Any]]) -> _FilterType[Any]: ... diff --git a/.venv/Lib/site-packages/attr/py.typed b/.venv/Lib/site-packages/attr/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/Lib/site-packages/attr/setters.py b/.venv/Lib/site-packages/attr/setters.py deleted file mode 100644 index 12ed675..0000000 --- a/.venv/Lib/site-packages/attr/setters.py +++ /dev/null @@ -1,73 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Commonly used hooks for on_setattr. -""" - - -from . import _config -from .exceptions import FrozenAttributeError - - -def pipe(*setters): - """ - Run all *setters* and return the return value of the last one. - - .. versionadded:: 20.1.0 - """ - - def wrapped_pipe(instance, attrib, new_value): - rv = new_value - - for setter in setters: - rv = setter(instance, attrib, rv) - - return rv - - return wrapped_pipe - - -def frozen(_, __, ___): - """ - Prevent an attribute to be modified. - - .. versionadded:: 20.1.0 - """ - raise FrozenAttributeError() - - -def validate(instance, attrib, new_value): - """ - Run *attrib*'s validator on *new_value* if it has one. - - .. versionadded:: 20.1.0 - """ - if _config._run_validators is False: - return new_value - - v = attrib.validator - if not v: - return new_value - - v(instance, attrib, new_value) - - return new_value - - -def convert(instance, attrib, new_value): - """ - Run *attrib*'s converter -- if it has one -- on *new_value* and return the - result. - - .. versionadded:: 20.1.0 - """ - c = attrib.converter - if c: - return c(new_value) - - return new_value - - -# Sentinel for disabling class-wide *on_setattr* hooks for certain attributes. -# autodata stopped working, so the docstring is inlined in the API docs. -NO_OP = object() diff --git a/.venv/Lib/site-packages/attr/setters.pyi b/.venv/Lib/site-packages/attr/setters.pyi deleted file mode 100644 index 3f5603c..0000000 --- a/.venv/Lib/site-packages/attr/setters.pyi +++ /dev/null @@ -1,19 +0,0 @@ -from typing import Any, NewType, NoReturn, TypeVar, cast - -from . import Attribute, _OnSetAttrType - -_T = TypeVar("_T") - -def frozen( - instance: Any, attribute: Attribute[Any], new_value: Any -) -> NoReturn: ... -def pipe(*setters: _OnSetAttrType) -> _OnSetAttrType: ... -def validate(instance: Any, attribute: Attribute[_T], new_value: _T) -> _T: ... - -# convert is allowed to return Any, because they can be chained using pipe. -def convert( - instance: Any, attribute: Attribute[Any], new_value: Any -) -> Any: ... - -_NoOpType = NewType("_NoOpType", object) -NO_OP: _NoOpType diff --git a/.venv/Lib/site-packages/attr/validators.py b/.venv/Lib/site-packages/attr/validators.py deleted file mode 100644 index eece517..0000000 --- a/.venv/Lib/site-packages/attr/validators.py +++ /dev/null @@ -1,594 +0,0 @@ -# SPDX-License-Identifier: MIT - -""" -Commonly useful validators. -""" - - -import operator -import re - -from contextlib import contextmanager - -from ._config import get_run_validators, set_run_validators -from ._make import _AndValidator, and_, attrib, attrs -from .exceptions import NotCallableError - - -try: - Pattern = re.Pattern -except AttributeError: # Python <3.7 lacks a Pattern type. - Pattern = type(re.compile("")) - - -__all__ = [ - "and_", - "deep_iterable", - "deep_mapping", - "disabled", - "ge", - "get_disabled", - "gt", - "in_", - "instance_of", - "is_callable", - "le", - "lt", - "matches_re", - "max_len", - "min_len", - "optional", - "provides", - "set_disabled", -] - - -def set_disabled(disabled): - """ - Globally disable or enable running validators. - - By default, they are run. - - :param disabled: If ``True``, disable running all validators. - :type disabled: bool - - .. warning:: - - This function is not thread-safe! - - .. versionadded:: 21.3.0 - """ - set_run_validators(not disabled) - - -def get_disabled(): - """ - Return a bool indicating whether validators are currently disabled or not. - - :return: ``True`` if validators are currently disabled. - :rtype: bool - - .. versionadded:: 21.3.0 - """ - return not get_run_validators() - - -@contextmanager -def disabled(): - """ - Context manager that disables running validators within its context. - - .. warning:: - - This context manager is not thread-safe! - - .. versionadded:: 21.3.0 - """ - set_run_validators(False) - try: - yield - finally: - set_run_validators(True) - - -@attrs(repr=False, slots=True, hash=True) -class _InstanceOfValidator: - type = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not isinstance(value, self.type): - raise TypeError( - "'{name}' must be {type!r} (got {value!r} that is a " - "{actual!r}).".format( - name=attr.name, - type=self.type, - actual=value.__class__, - value=value, - ), - attr, - self.type, - value, - ) - - def __repr__(self): - return "".format( - type=self.type - ) - - -def instance_of(type): - """ - A validator that raises a `TypeError` if the initializer is called - with a wrong type for this particular attribute (checks are performed using - `isinstance` therefore it's also valid to pass a tuple of types). - - :param type: The type to check for. - :type type: type or tuple of types - - :raises TypeError: With a human readable error message, the attribute - (of type `attrs.Attribute`), the expected type, and the value it - got. - """ - return _InstanceOfValidator(type) - - -@attrs(repr=False, frozen=True, slots=True) -class _MatchesReValidator: - pattern = attrib() - match_func = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not self.match_func(value): - raise ValueError( - "'{name}' must match regex {pattern!r}" - " ({value!r} doesn't)".format( - name=attr.name, pattern=self.pattern.pattern, value=value - ), - attr, - self.pattern, - value, - ) - - def __repr__(self): - return "".format( - pattern=self.pattern - ) - - -def matches_re(regex, flags=0, func=None): - r""" - A validator that raises `ValueError` if the initializer is called - with a string that doesn't match *regex*. - - :param regex: a regex string or precompiled pattern to match against - :param int flags: flags that will be passed to the underlying re function - (default 0) - :param callable func: which underlying `re` function to call. Valid options - are `re.fullmatch`, `re.search`, and `re.match`; the default ``None`` - means `re.fullmatch`. For performance reasons, the pattern is always - precompiled using `re.compile`. - - .. versionadded:: 19.2.0 - .. versionchanged:: 21.3.0 *regex* can be a pre-compiled pattern. - """ - valid_funcs = (re.fullmatch, None, re.search, re.match) - if func not in valid_funcs: - raise ValueError( - "'func' must be one of {}.".format( - ", ".join( - sorted( - e and e.__name__ or "None" for e in set(valid_funcs) - ) - ) - ) - ) - - if isinstance(regex, Pattern): - if flags: - raise TypeError( - "'flags' can only be used with a string pattern; " - "pass flags to re.compile() instead" - ) - pattern = regex - else: - pattern = re.compile(regex, flags) - - if func is re.match: - match_func = pattern.match - elif func is re.search: - match_func = pattern.search - else: - match_func = pattern.fullmatch - - return _MatchesReValidator(pattern, match_func) - - -@attrs(repr=False, slots=True, hash=True) -class _ProvidesValidator: - interface = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not self.interface.providedBy(value): - raise TypeError( - "'{name}' must provide {interface!r} which {value!r} " - "doesn't.".format( - name=attr.name, interface=self.interface, value=value - ), - attr, - self.interface, - value, - ) - - def __repr__(self): - return "".format( - interface=self.interface - ) - - -def provides(interface): - """ - A validator that raises a `TypeError` if the initializer is called - with an object that does not provide the requested *interface* (checks are - performed using ``interface.providedBy(value)`` (see `zope.interface - `_). - - :param interface: The interface to check for. - :type interface: ``zope.interface.Interface`` - - :raises TypeError: With a human readable error message, the attribute - (of type `attrs.Attribute`), the expected interface, and the - value it got. - """ - return _ProvidesValidator(interface) - - -@attrs(repr=False, slots=True, hash=True) -class _OptionalValidator: - validator = attrib() - - def __call__(self, inst, attr, value): - if value is None: - return - - self.validator(inst, attr, value) - - def __repr__(self): - return "".format( - what=repr(self.validator) - ) - - -def optional(validator): - """ - A validator that makes an attribute optional. An optional attribute is one - which can be set to ``None`` in addition to satisfying the requirements of - the sub-validator. - - :param validator: A validator (or a list of validators) that is used for - non-``None`` values. - :type validator: callable or `list` of callables. - - .. versionadded:: 15.1.0 - .. versionchanged:: 17.1.0 *validator* can be a list of validators. - """ - if isinstance(validator, list): - return _OptionalValidator(_AndValidator(validator)) - return _OptionalValidator(validator) - - -@attrs(repr=False, slots=True, hash=True) -class _InValidator: - options = attrib() - - def __call__(self, inst, attr, value): - try: - in_options = value in self.options - except TypeError: # e.g. `1 in "abc"` - in_options = False - - if not in_options: - raise ValueError( - "'{name}' must be in {options!r} (got {value!r})".format( - name=attr.name, options=self.options, value=value - ), - attr, - self.options, - value, - ) - - def __repr__(self): - return "".format( - options=self.options - ) - - -def in_(options): - """ - A validator that raises a `ValueError` if the initializer is called - with a value that does not belong in the options provided. The check is - performed using ``value in options``. - - :param options: Allowed options. - :type options: list, tuple, `enum.Enum`, ... - - :raises ValueError: With a human readable error message, the attribute (of - type `attrs.Attribute`), the expected options, and the value it - got. - - .. versionadded:: 17.1.0 - .. versionchanged:: 22.1.0 - The ValueError was incomplete until now and only contained the human - readable error message. Now it contains all the information that has - been promised since 17.1.0. - """ - return _InValidator(options) - - -@attrs(repr=False, slots=False, hash=True) -class _IsCallableValidator: - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not callable(value): - message = ( - "'{name}' must be callable " - "(got {value!r} that is a {actual!r})." - ) - raise NotCallableError( - msg=message.format( - name=attr.name, value=value, actual=value.__class__ - ), - value=value, - ) - - def __repr__(self): - return "" - - -def is_callable(): - """ - A validator that raises a `attr.exceptions.NotCallableError` if the - initializer is called with a value for this particular attribute - that is not callable. - - .. versionadded:: 19.1.0 - - :raises `attr.exceptions.NotCallableError`: With a human readable error - message containing the attribute (`attrs.Attribute`) name, - and the value it got. - """ - return _IsCallableValidator() - - -@attrs(repr=False, slots=True, hash=True) -class _DeepIterable: - member_validator = attrib(validator=is_callable()) - iterable_validator = attrib( - default=None, validator=optional(is_callable()) - ) - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if self.iterable_validator is not None: - self.iterable_validator(inst, attr, value) - - for member in value: - self.member_validator(inst, attr, member) - - def __repr__(self): - iterable_identifier = ( - "" - if self.iterable_validator is None - else " {iterable!r}".format(iterable=self.iterable_validator) - ) - return ( - "" - ).format( - iterable_identifier=iterable_identifier, - member=self.member_validator, - ) - - -def deep_iterable(member_validator, iterable_validator=None): - """ - A validator that performs deep validation of an iterable. - - :param member_validator: Validator(s) to apply to iterable members - :param iterable_validator: Validator to apply to iterable itself - (optional) - - .. versionadded:: 19.1.0 - - :raises TypeError: if any sub-validators fail - """ - if isinstance(member_validator, (list, tuple)): - member_validator = and_(*member_validator) - return _DeepIterable(member_validator, iterable_validator) - - -@attrs(repr=False, slots=True, hash=True) -class _DeepMapping: - key_validator = attrib(validator=is_callable()) - value_validator = attrib(validator=is_callable()) - mapping_validator = attrib(default=None, validator=optional(is_callable())) - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if self.mapping_validator is not None: - self.mapping_validator(inst, attr, value) - - for key in value: - self.key_validator(inst, attr, key) - self.value_validator(inst, attr, value[key]) - - def __repr__(self): - return ( - "" - ).format(key=self.key_validator, value=self.value_validator) - - -def deep_mapping(key_validator, value_validator, mapping_validator=None): - """ - A validator that performs deep validation of a dictionary. - - :param key_validator: Validator to apply to dictionary keys - :param value_validator: Validator to apply to dictionary values - :param mapping_validator: Validator to apply to top-level mapping - attribute (optional) - - .. versionadded:: 19.1.0 - - :raises TypeError: if any sub-validators fail - """ - return _DeepMapping(key_validator, value_validator, mapping_validator) - - -@attrs(repr=False, frozen=True, slots=True) -class _NumberValidator: - bound = attrib() - compare_op = attrib() - compare_func = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if not self.compare_func(value, self.bound): - raise ValueError( - "'{name}' must be {op} {bound}: {value}".format( - name=attr.name, - op=self.compare_op, - bound=self.bound, - value=value, - ) - ) - - def __repr__(self): - return "".format( - op=self.compare_op, bound=self.bound - ) - - -def lt(val): - """ - A validator that raises `ValueError` if the initializer is called - with a number larger or equal to *val*. - - :param val: Exclusive upper bound for values - - .. versionadded:: 21.3.0 - """ - return _NumberValidator(val, "<", operator.lt) - - -def le(val): - """ - A validator that raises `ValueError` if the initializer is called - with a number greater than *val*. - - :param val: Inclusive upper bound for values - - .. versionadded:: 21.3.0 - """ - return _NumberValidator(val, "<=", operator.le) - - -def ge(val): - """ - A validator that raises `ValueError` if the initializer is called - with a number smaller than *val*. - - :param val: Inclusive lower bound for values - - .. versionadded:: 21.3.0 - """ - return _NumberValidator(val, ">=", operator.ge) - - -def gt(val): - """ - A validator that raises `ValueError` if the initializer is called - with a number smaller or equal to *val*. - - :param val: Exclusive lower bound for values - - .. versionadded:: 21.3.0 - """ - return _NumberValidator(val, ">", operator.gt) - - -@attrs(repr=False, frozen=True, slots=True) -class _MaxLengthValidator: - max_length = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if len(value) > self.max_length: - raise ValueError( - "Length of '{name}' must be <= {max}: {len}".format( - name=attr.name, max=self.max_length, len=len(value) - ) - ) - - def __repr__(self): - return "".format(max=self.max_length) - - -def max_len(length): - """ - A validator that raises `ValueError` if the initializer is called - with a string or iterable that is longer than *length*. - - :param int length: Maximum length of the string or iterable - - .. versionadded:: 21.3.0 - """ - return _MaxLengthValidator(length) - - -@attrs(repr=False, frozen=True, slots=True) -class _MinLengthValidator: - min_length = attrib() - - def __call__(self, inst, attr, value): - """ - We use a callable class to be able to change the ``__repr__``. - """ - if len(value) < self.min_length: - raise ValueError( - "Length of '{name}' must be => {min}: {len}".format( - name=attr.name, min=self.min_length, len=len(value) - ) - ) - - def __repr__(self): - return "".format(min=self.min_length) - - -def min_len(length): - """ - A validator that raises `ValueError` if the initializer is called - with a string or iterable that is shorter than *length*. - - :param int length: Minimum length of the string or iterable - - .. versionadded:: 22.1.0 - """ - return _MinLengthValidator(length) diff --git a/.venv/Lib/site-packages/attr/validators.pyi b/.venv/Lib/site-packages/attr/validators.pyi deleted file mode 100644 index 54b9dba..0000000 --- a/.venv/Lib/site-packages/attr/validators.pyi +++ /dev/null @@ -1,80 +0,0 @@ -from typing import ( - Any, - AnyStr, - Callable, - Container, - ContextManager, - Iterable, - List, - Mapping, - Match, - Optional, - Pattern, - Tuple, - Type, - TypeVar, - Union, - overload, -) - -from . import _ValidatorType -from . import _ValidatorArgType - -_T = TypeVar("_T") -_T1 = TypeVar("_T1") -_T2 = TypeVar("_T2") -_T3 = TypeVar("_T3") -_I = TypeVar("_I", bound=Iterable) -_K = TypeVar("_K") -_V = TypeVar("_V") -_M = TypeVar("_M", bound=Mapping) - -def set_disabled(run: bool) -> None: ... -def get_disabled() -> bool: ... -def disabled() -> ContextManager[None]: ... - -# To be more precise on instance_of use some overloads. -# If there are more than 3 items in the tuple then we fall back to Any -@overload -def instance_of(type: Type[_T]) -> _ValidatorType[_T]: ... -@overload -def instance_of(type: Tuple[Type[_T]]) -> _ValidatorType[_T]: ... -@overload -def instance_of( - type: Tuple[Type[_T1], Type[_T2]] -) -> _ValidatorType[Union[_T1, _T2]]: ... -@overload -def instance_of( - type: Tuple[Type[_T1], Type[_T2], Type[_T3]] -) -> _ValidatorType[Union[_T1, _T2, _T3]]: ... -@overload -def instance_of(type: Tuple[type, ...]) -> _ValidatorType[Any]: ... -def provides(interface: Any) -> _ValidatorType[Any]: ... -def optional( - validator: Union[_ValidatorType[_T], List[_ValidatorType[_T]]] -) -> _ValidatorType[Optional[_T]]: ... -def in_(options: Container[_T]) -> _ValidatorType[_T]: ... -def and_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... -def matches_re( - regex: Union[Pattern[AnyStr], AnyStr], - flags: int = ..., - func: Optional[ - Callable[[AnyStr, AnyStr, int], Optional[Match[AnyStr]]] - ] = ..., -) -> _ValidatorType[AnyStr]: ... -def deep_iterable( - member_validator: _ValidatorArgType[_T], - iterable_validator: Optional[_ValidatorType[_I]] = ..., -) -> _ValidatorType[_I]: ... -def deep_mapping( - key_validator: _ValidatorType[_K], - value_validator: _ValidatorType[_V], - mapping_validator: Optional[_ValidatorType[_M]] = ..., -) -> _ValidatorType[_M]: ... -def is_callable() -> _ValidatorType[_T]: ... -def lt(val: _T) -> _ValidatorType[_T]: ... -def le(val: _T) -> _ValidatorType[_T]: ... -def ge(val: _T) -> _ValidatorType[_T]: ... -def gt(val: _T) -> _ValidatorType[_T]: ... -def max_len(length: int) -> _ValidatorType[_T]: ... -def min_len(length: int) -> _ValidatorType[_T]: ... diff --git a/.venv/Lib/site-packages/attrs-22.1.0.dist-info/AUTHORS.rst b/.venv/Lib/site-packages/attrs-22.1.0.dist-info/AUTHORS.rst deleted file mode 100644 index aa677e8..0000000 --- a/.venv/Lib/site-packages/attrs-22.1.0.dist-info/AUTHORS.rst +++ /dev/null @@ -1,11 +0,0 @@ -Credits -======= - -``attrs`` is written and maintained by `Hynek Schlawack `_. - -The development is kindly supported by `Variomedia AG `_. - -A full list of contributors can be found in `GitHub's overview `_. - -It’s the spiritual successor of `characteristic `_ and aspires to fix some of it clunkiness and unfortunate decisions. -Both were inspired by Twisted’s `FancyEqMixin `_ but both are implemented using class decorators because `subclassing is bad for you `_, m’kay? diff --git a/.venv/Lib/site-packages/attrs-22.1.0.dist-info/INSTALLER b/.venv/Lib/site-packages/attrs-22.1.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/attrs-22.1.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/attrs-22.1.0.dist-info/LICENSE b/.venv/Lib/site-packages/attrs-22.1.0.dist-info/LICENSE deleted file mode 100644 index 2bd6453..0000000 --- a/.venv/Lib/site-packages/attrs-22.1.0.dist-info/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Hynek Schlawack and the attrs contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/.venv/Lib/site-packages/attrs-22.1.0.dist-info/METADATA b/.venv/Lib/site-packages/attrs-22.1.0.dist-info/METADATA deleted file mode 100644 index 60b6653..0000000 --- a/.venv/Lib/site-packages/attrs-22.1.0.dist-info/METADATA +++ /dev/null @@ -1,240 +0,0 @@ -Metadata-Version: 2.1 -Name: attrs -Version: 22.1.0 -Summary: Classes Without Boilerplate -Home-page: https://www.attrs.org/ -Author: Hynek Schlawack -Author-email: hs@ox.cx -Maintainer: Hynek Schlawack -Maintainer-email: hs@ox.cx -License: MIT -Project-URL: Documentation, https://www.attrs.org/ -Project-URL: Changelog, https://www.attrs.org/en/stable/changelog.html -Project-URL: Bug Tracker, https://github.com/python-attrs/attrs/issues -Project-URL: Source Code, https://github.com/python-attrs/attrs -Project-URL: Funding, https://github.com/sponsors/hynek -Project-URL: Tidelift, https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi -Project-URL: Ko-fi, https://ko-fi.com/the_hynek -Keywords: class,attribute,boilerplate -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Natural Language :: English -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Requires-Python: >=3.5 -Description-Content-Type: text/x-rst -License-File: LICENSE -License-File: AUTHORS.rst -Provides-Extra: dev -Requires-Dist: coverage[toml] (>=5.0.2) ; extra == 'dev' -Requires-Dist: hypothesis ; extra == 'dev' -Requires-Dist: pympler ; extra == 'dev' -Requires-Dist: pytest (>=4.3.0) ; extra == 'dev' -Requires-Dist: mypy (!=0.940,>=0.900) ; extra == 'dev' -Requires-Dist: pytest-mypy-plugins ; extra == 'dev' -Requires-Dist: zope.interface ; extra == 'dev' -Requires-Dist: furo ; extra == 'dev' -Requires-Dist: sphinx ; extra == 'dev' -Requires-Dist: sphinx-notfound-page ; extra == 'dev' -Requires-Dist: pre-commit ; extra == 'dev' -Requires-Dist: cloudpickle ; (platform_python_implementation == "CPython") and extra == 'dev' -Provides-Extra: docs -Requires-Dist: furo ; extra == 'docs' -Requires-Dist: sphinx ; extra == 'docs' -Requires-Dist: zope.interface ; extra == 'docs' -Requires-Dist: sphinx-notfound-page ; extra == 'docs' -Provides-Extra: tests -Requires-Dist: coverage[toml] (>=5.0.2) ; extra == 'tests' -Requires-Dist: hypothesis ; extra == 'tests' -Requires-Dist: pympler ; extra == 'tests' -Requires-Dist: pytest (>=4.3.0) ; extra == 'tests' -Requires-Dist: mypy (!=0.940,>=0.900) ; extra == 'tests' -Requires-Dist: pytest-mypy-plugins ; extra == 'tests' -Requires-Dist: zope.interface ; extra == 'tests' -Requires-Dist: cloudpickle ; (platform_python_implementation == "CPython") and extra == 'tests' -Provides-Extra: tests_no_zope -Requires-Dist: coverage[toml] (>=5.0.2) ; extra == 'tests_no_zope' -Requires-Dist: hypothesis ; extra == 'tests_no_zope' -Requires-Dist: pympler ; extra == 'tests_no_zope' -Requires-Dist: pytest (>=4.3.0) ; extra == 'tests_no_zope' -Requires-Dist: mypy (!=0.940,>=0.900) ; extra == 'tests_no_zope' -Requires-Dist: pytest-mypy-plugins ; extra == 'tests_no_zope' -Requires-Dist: cloudpickle ; (platform_python_implementation == "CPython") and extra == 'tests_no_zope' - - -.. image:: https://www.attrs.org/en/stable/_static/attrs_logo.png - :alt: attrs logo - :align: center - - -``attrs`` is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka `dunder methods `_). -`Trusted by NASA `_ for Mars missions since 2020! - -Its main goal is to help you to write **concise** and **correct** software without slowing down your code. - -.. teaser-end - -For that, it gives you a class decorator and a way to declaratively define the attributes on that class: - -.. -code-begin- - -.. code-block:: pycon - - >>> from attrs import asdict, define, make_class, Factory - - >>> @define - ... class SomeClass: - ... a_number: int = 42 - ... list_of_numbers: list[int] = Factory(list) - ... - ... def hard_math(self, another_number): - ... return self.a_number + sum(self.list_of_numbers) * another_number - - - >>> sc = SomeClass(1, [1, 2, 3]) - >>> sc - SomeClass(a_number=1, list_of_numbers=[1, 2, 3]) - - >>> sc.hard_math(3) - 19 - >>> sc == SomeClass(1, [1, 2, 3]) - True - >>> sc != SomeClass(2, [3, 2, 1]) - True - - >>> asdict(sc) - {'a_number': 1, 'list_of_numbers': [1, 2, 3]} - - >>> SomeClass() - SomeClass(a_number=42, list_of_numbers=[]) - - >>> C = make_class("C", ["a", "b"]) - >>> C("foo", "bar") - C(a='foo', b='bar') - - -After *declaring* your attributes, ``attrs`` gives you: - -- a concise and explicit overview of the class's attributes, -- a nice human-readable ``__repr__``, -- equality-checking methods, -- an initializer, -- and much more, - -*without* writing dull boilerplate code again and again and *without* runtime performance penalties. - -**Hate type annotations**!? -No problem! -Types are entirely **optional** with ``attrs``. -Simply assign ``attrs.field()`` to the attributes instead of annotating them with types. - ----- - -This example uses ``attrs``'s modern APIs that have been introduced in version 20.1.0, and the ``attrs`` package import name that has been added in version 21.3.0. -The classic APIs (``@attr.s``, ``attr.ib``, plus their serious-business aliases) and the ``attr`` package import name will remain **indefinitely**. - -Please check out `On The Core API Names `_ for a more in-depth explanation. - - -Data Classes -============ - -On the tin, ``attrs`` might remind you of ``dataclasses`` (and indeed, ``dataclasses`` `are a descendant `_ of ``attrs``). -In practice it does a lot more and is more flexible. -For instance it allows you to define `special handling of NumPy arrays for equality checks `_, or allows more ways to `plug into the initialization process `_. - -For more details, please refer to our `comparison page `_. - -.. -project-information- - -Project Information -=================== - -- **License**: `MIT `_ -- **PyPI**: https://pypi.org/project/attrs/ -- **Source Code**: https://github.com/python-attrs/attrs -- **Documentation**: https://www.attrs.org/ -- **Changelog**: https://www.attrs.org/en/stable/changelog.html -- **Get Help**: please use the ``python-attrs`` tag on `StackOverflow `_ -- **Third-party Extensions**: https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs -- **Supported Python Versions**: 3.5 and later (last 2.7-compatible release is `21.4.0 `_) - -If you'd like to contribute to ``attrs`` you're most welcome and we've written `a little guide `_ to get you started! - - -``attrs`` for Enterprise ------------------------- - -Available as part of the Tidelift Subscription. - -The maintainers of ``attrs`` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. -Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. -`Learn more. `_ - - -Release Information -=================== - -22.1.0 (2022-07-28) -------------------- - -Backwards-incompatible Changes -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -- Python 2.7 is not supported anymore. - - Dealing with Python 2.7 tooling has become too difficult for a volunteer-run project. - - We have supported Python 2 more than 2 years after it was officially discontinued and feel that we have paid our dues. - All version up to 21.4.0 from December 2021 remain fully functional, of course. - `#936 `_ -- The deprecated ``cmp`` attribute of ``attrs.Attribute`` has been removed. - This does not affect the *cmp* argument to ``attr.s`` that can be used as a shortcut to set *eq* and *order* at the same time. - `#939 `_ - - -Changes -^^^^^^^ - -- Instantiation of frozen slotted classes is now faster. - `#898 `_ -- If an ``eq`` key is defined, it is also used before hashing the attribute. - `#909 `_ -- Added ``attrs.validators.min_len()``. - `#916 `_ -- ``attrs.validators.deep_iterable()``'s *member_validator* argument now also accepts a list of validators and wraps them in an ``attrs.validators.and_()``. - `#925 `_ -- Added missing type stub re-imports for ``attrs.converters`` and ``attrs.filters``. - `#931 `_ -- Added missing stub for ``attr(s).cmp_using()``. - `#949 `_ -- ``attrs.validators._in()``'s ``ValueError`` is not missing the attribute, expected options, and the value it got anymore. - `#951 `_ -- Python 3.11 is now officially supported. - `#969 `_ - -`Full changelog `_. - -Credits -======= - -``attrs`` is written and maintained by `Hynek Schlawack `_. - -The development is kindly supported by `Variomedia AG `_. - -A full list of contributors can be found in `GitHub's overview `_. - -It’s the spiritual successor of `characteristic `_ and aspires to fix some of it clunkiness and unfortunate decisions. -Both were inspired by Twisted’s `FancyEqMixin `_ but both are implemented using class decorators because `subclassing is bad for you `_, m’kay? diff --git a/.venv/Lib/site-packages/attrs-22.1.0.dist-info/RECORD b/.venv/Lib/site-packages/attrs-22.1.0.dist-info/RECORD deleted file mode 100644 index efb514e..0000000 --- a/.venv/Lib/site-packages/attrs-22.1.0.dist-info/RECORD +++ /dev/null @@ -1,56 +0,0 @@ -attr/__init__.py,sha256=KZjj88xCd_tH-W59HR1EvHiYAUi4Zd1dzOxx8P77jeI,1602 -attr/__init__.pyi,sha256=t-1r-I1VnyxFrqic__QxIk1HUc3ag53L2b8lv0xDZTw,15137 -attr/__pycache__/__init__.cpython-38.pyc,, -attr/__pycache__/_cmp.cpython-38.pyc,, -attr/__pycache__/_compat.cpython-38.pyc,, -attr/__pycache__/_config.cpython-38.pyc,, -attr/__pycache__/_funcs.cpython-38.pyc,, -attr/__pycache__/_make.cpython-38.pyc,, -attr/__pycache__/_next_gen.cpython-38.pyc,, -attr/__pycache__/_version_info.cpython-38.pyc,, -attr/__pycache__/converters.cpython-38.pyc,, -attr/__pycache__/exceptions.cpython-38.pyc,, -attr/__pycache__/filters.cpython-38.pyc,, -attr/__pycache__/setters.cpython-38.pyc,, -attr/__pycache__/validators.cpython-38.pyc,, -attr/_cmp.py,sha256=Mmqj-6w71g_vx0TTLLkU4pbmv28qz_FyBGcUb1HX9ZE,4102 -attr/_cmp.pyi,sha256=cSlVvIH4As2NlDIoLglPEbSrBMWVVTpwExVDDBH6pn8,357 -attr/_compat.py,sha256=Qr9kZOu95Og7joPaQiXoPb54epKqxNU39Xu0u4QVGZI,5568 -attr/_config.py,sha256=5W8lgRePuIOWu1ZuqF1899e2CmXGc95-ipwTpF1cEU4,826 -attr/_funcs.py,sha256=XTFKZtd5zxsUvWocBw7VAswTxH-nFHk0H8gJ2JQkxD4,14645 -attr/_make.py,sha256=Srxbhb8kB17T6nP9e_dgcXY72zda9xfL5uJzva6LExY,97569 -attr/_next_gen.py,sha256=N0Gb5WdBHfcfQhcUsLAc_2ZYzl0JtAX1NOHuDgvkecE,5882 -attr/_version_info.py,sha256=exSqb3b5E-fMSsgZAlEw9XcLpEgobPORCZpcaEglAM4,2121 -attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209 -attr/converters.py,sha256=TWCfmCAxk8s2tgTSYnyQv9MRDPf1pk8Rj16KO_Xqe1c,3610 -attr/converters.pyi,sha256=MQo7iEzPNVoFpKqD30sVwgVpdNoIeSCF2nsXvoxLZ-Y,416 -attr/exceptions.py,sha256=ZGEMLv0CDY1TOtj49OF84myejOn-LCCXAKGIKalKkVU,1915 -attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539 -attr/filters.py,sha256=aZep54h8-4ZYV5lmZ3Dx2mqeQH4cMx6tuCmCylLNbEU,1038 -attr/filters.pyi,sha256=_Sm80jGySETX_Clzdkon5NHVjQWRl3Y3liQKZX1czXc,215 -attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -attr/setters.py,sha256=pbCZQ-pE6ZxjDqZfWWUhUFefXtpekIU4qS_YDMLPQ50,1400 -attr/setters.pyi,sha256=7dM10rqpQVDW0y-iJUnq8rabdO5Wx2Sbo5LwNa0IXl0,573 -attr/validators.py,sha256=cpOHMNSt02ApbTQtQAwBTMeWZqp0u_sx-e3xH-jTyR4,16793 -attr/validators.pyi,sha256=6ngbvnWnFSkbf5J2dK86pq2xpEtrwzWTKfJ4aUvSIlk,2355 -attrs-22.1.0.dist-info/AUTHORS.rst,sha256=jau5p7JMPbBJeCCpGBWsRj8zpxUVAhpyoHFJRfjM888,743 -attrs-22.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -attrs-22.1.0.dist-info/LICENSE,sha256=iCEVyV38KvHutnFPjsbVy8q_Znyv-HKfQkINpj9xTp8,1109 -attrs-22.1.0.dist-info/METADATA,sha256=vwSMK_BbEgVHrgFWpj3iW0PISTMPHzi6qham9jg7LtA,11015 -attrs-22.1.0.dist-info/RECORD,, -attrs-22.1.0.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110 -attrs-22.1.0.dist-info/top_level.txt,sha256=AGbmKnOtYpdkLRsDRQVSBIwfL32pAQ6BSo1mt-BxI7M,11 -attrs/__init__.py,sha256=CeyxLGVViAEKKsLOLaif8vF3vs1a28vsrRVLv7eMEgM,1109 -attrs/__init__.pyi,sha256=vuFxNbulP9Q7hfpO6Lb5A-_0mbEJOiwYyefjzXMqVfs,2100 -attrs/__pycache__/__init__.cpython-38.pyc,, -attrs/__pycache__/converters.cpython-38.pyc,, -attrs/__pycache__/exceptions.cpython-38.pyc,, -attrs/__pycache__/filters.cpython-38.pyc,, -attrs/__pycache__/setters.cpython-38.pyc,, -attrs/__pycache__/validators.cpython-38.pyc,, -attrs/converters.py,sha256=fCBEdlYWcmI3sCnpUk2pz22GYtXzqTkp6NeOpdI64PY,70 -attrs/exceptions.py,sha256=SlDli6AY77f6ny-H7oy98OkQjsrw-D_supEuErIVYkE,70 -attrs/filters.py,sha256=dc_dNey29kH6KLU1mT2Dakq7tZ3kBfzEGwzOmDzw1F8,67 -attrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -attrs/setters.py,sha256=oKw51C72Hh45wTwYvDHJP9kbicxiMhMR4Y5GvdpKdHQ,67 -attrs/validators.py,sha256=4ag1SyVD2Hm3PYKiNG_NOtR_e7f81Hr6GiNl4YvXo4Q,70 diff --git a/.venv/Lib/site-packages/attrs-22.1.0.dist-info/WHEEL b/.venv/Lib/site-packages/attrs-22.1.0.dist-info/WHEEL deleted file mode 100644 index 0b18a28..0000000 --- a/.venv/Lib/site-packages/attrs-22.1.0.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.1) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/.venv/Lib/site-packages/attrs-22.1.0.dist-info/top_level.txt b/.venv/Lib/site-packages/attrs-22.1.0.dist-info/top_level.txt deleted file mode 100644 index eca8ba9..0000000 --- a/.venv/Lib/site-packages/attrs-22.1.0.dist-info/top_level.txt +++ /dev/null @@ -1,2 +0,0 @@ -attr -attrs diff --git a/.venv/Lib/site-packages/attrs/__init__.py b/.venv/Lib/site-packages/attrs/__init__.py deleted file mode 100644 index a704b8b..0000000 --- a/.venv/Lib/site-packages/attrs/__init__.py +++ /dev/null @@ -1,70 +0,0 @@ -# SPDX-License-Identifier: MIT - -from attr import ( - NOTHING, - Attribute, - Factory, - __author__, - __copyright__, - __description__, - __doc__, - __email__, - __license__, - __title__, - __url__, - __version__, - __version_info__, - assoc, - cmp_using, - define, - evolve, - field, - fields, - fields_dict, - frozen, - has, - make_class, - mutable, - resolve_types, - validate, -) -from attr._next_gen import asdict, astuple - -from . import converters, exceptions, filters, setters, validators - - -__all__ = [ - "__author__", - "__copyright__", - "__description__", - "__doc__", - "__email__", - "__license__", - "__title__", - "__url__", - "__version__", - "__version_info__", - "asdict", - "assoc", - "astuple", - "Attribute", - "cmp_using", - "converters", - "define", - "evolve", - "exceptions", - "Factory", - "field", - "fields_dict", - "fields", - "filters", - "frozen", - "has", - "make_class", - "mutable", - "NOTHING", - "resolve_types", - "setters", - "validate", - "validators", -] diff --git a/.venv/Lib/site-packages/attrs/__init__.pyi b/.venv/Lib/site-packages/attrs/__init__.pyi deleted file mode 100644 index fc44de4..0000000 --- a/.venv/Lib/site-packages/attrs/__init__.pyi +++ /dev/null @@ -1,66 +0,0 @@ -from typing import ( - Any, - Callable, - Dict, - Mapping, - Optional, - Sequence, - Tuple, - Type, -) - -# Because we need to type our own stuff, we have to make everything from -# attr explicitly public too. -from attr import __author__ as __author__ -from attr import __copyright__ as __copyright__ -from attr import __description__ as __description__ -from attr import __email__ as __email__ -from attr import __license__ as __license__ -from attr import __title__ as __title__ -from attr import __url__ as __url__ -from attr import __version__ as __version__ -from attr import __version_info__ as __version_info__ -from attr import _FilterType -from attr import assoc as assoc -from attr import Attribute as Attribute -from attr import cmp_using as cmp_using -from attr import converters as converters -from attr import define as define -from attr import evolve as evolve -from attr import exceptions as exceptions -from attr import Factory as Factory -from attr import field as field -from attr import fields as fields -from attr import fields_dict as fields_dict -from attr import filters as filters -from attr import frozen as frozen -from attr import has as has -from attr import make_class as make_class -from attr import mutable as mutable -from attr import NOTHING as NOTHING -from attr import resolve_types as resolve_types -from attr import setters as setters -from attr import validate as validate -from attr import validators as validators - -# TODO: see definition of attr.asdict/astuple -def asdict( - inst: Any, - recurse: bool = ..., - filter: Optional[_FilterType[Any]] = ..., - dict_factory: Type[Mapping[Any, Any]] = ..., - retain_collection_types: bool = ..., - value_serializer: Optional[ - Callable[[type, Attribute[Any], Any], Any] - ] = ..., - tuple_keys: bool = ..., -) -> Dict[str, Any]: ... - -# TODO: add support for returning NamedTuple from the mypy plugin -def astuple( - inst: Any, - recurse: bool = ..., - filter: Optional[_FilterType[Any]] = ..., - tuple_factory: Type[Sequence[Any]] = ..., - retain_collection_types: bool = ..., -) -> Tuple[Any, ...]: ... diff --git a/.venv/Lib/site-packages/attrs/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/attrs/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index d45d25785fea5b72e7cb3de94ab5e8849bb7fc4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1198 zcmbu7$!^q45XU{MXUQztlgWh4WLT5~;f@djeTYRu;Q+amMrt{(&ZHHWZFRRtgg4@q z`oaMTiC5r6mnWa#zy)E;zpkz>m;Y6+^IoqL@U@)9=k*}?T5f*B)Z5SeW4?J{fR!Ym z3RI{HRjNUa>QJW!G^hzp3L&Hxw5Sbj>OhCO(4{q4qaO6A4}BWIfQB%nby%kj*q}|= zq%GK@ZP=zA*r8q6r9IfAeb}cFj4J%SYH~nh7}Fsf`h5-S$sIa^Bbva3rZA;rIHnoQ z{8V25#aOZsQK_;vVkf2oG?Khj<5%aDr1j#u?tldy6UD z#ryArlLy~@t-;C2g=gj)7Q_A1jtxSkMkmfvW# zxUzmb5CWx%waTr^Qtt@8Ba6M!7D7^_5^r{eNK`CSBUgT_Y{I6GE%a@`QfjlxFcjkd zjY=;wAJ>SC$zs=zDHnxN>B2QpUaC~Ord(#pQo6>ak_ozIxfs`7tpZhSy;EnOWa?^H zk#QZ0uBC_*pV5U>*ytjWuBWBpG{WBG(zw<#N)$#`o>W~kGG&r5GPcMQ`MtvZYPe3E zrCz1=s$EBZjAdEB&v~hm(is|QSEskxGHrCjzpR^#kkMka89bS~%UEOd7=6Z=F<=}r zYK$S{h_TMtU`!Z(ssp{r*k)`oc&hadW0$eV*k@E3BgQe~fHCtpJGtlTkspFpMES)s z@!yLtb(d;?2`%N7%1VuYQdWv$JR{SWK)p&HQvJ)8+iFx|kbf v<-g`kfimS}Hz4&G%t0cUfNTdKF6IFeDGVu$ISe5TDNMl(n#?bOA`F_0w-~kj zG#R7#6H7{p^pf-Q%2JC;Qj3aLG88cb<-x?SFlVcn&|;uyOh##Xeo>4|YH@Z+enCu9 zeu+YAZb43drb0@oLJ5#r9HUp3npYO%lbIA#oLQ2pTacKXotU0l90M}HSRY}5UP0w8 T4x8Nkl+v73JCIeMLGA$nV5B%T diff --git a/.venv/Lib/site-packages/attrs/__pycache__/exceptions.cpython-38.pyc b/.venv/Lib/site-packages/attrs/__pycache__/exceptions.cpython-38.pyc deleted file mode 100644 index f2f04608c5170bc02488f049d55989902f00a364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmWIL<>g`kfimS}Hz4&G%t0cUfNTdKF6IFeDGVu$ISe5TDNMl(n#?bOA`F_0w-~kj zG#R7#6H7{p^inI5QwvHm^Ye;VG88cb<-x?SFlVcn(Bjmh;+Txm^!%b2m(=3ylKg_0 zr2Gg`kfimS}XCU<$%t0cUfNTdKF6IFeDGVu$ISe5TDNMl(n#?bOA`F_0w-~kj zG#R6K5=%;o^wKhON>Yo8S27ea10})4uV81Zn9yRNXiP?FdVW!iOKNd;Nq#|0Qhtd- zYHmSJex^c7sX_^mSsbHRmYP=<bQ=D0ns#}nloSm4SS{ws1yjUMg`kfimS}XCU<$%t0cUfNTdKF6IFeDGVu$ISe5TDNMl(n#?bOA`F_0w-~kj zG#R6K5=%;o^omnUN>Yo8S27ea10})4uV81Zn9yRNXiP?FdVW!iOKNd;Nq#|0Qhtd- zYHmSJex^c7sX_^mSsbHRmYP=<bQ=D0ns#}nloSm4SS{ws1yjUMg`kfimS}Hz4&G%t0cUfNTdKF6IFeDGVu$ISe5TDNMl(n#?bOA`F_0w-~kj zG#R7#6H7{p^vV)*GE)*u@{5XBG88cb<-x?SFlVcn(Bjmh;+Txm^!%b2m(=3ylKg_0 zr2G=3.6.0 -Description-Content-Type: text/markdown -License-File: LICENSE -Provides-Extra: unicode_backport -Requires-Dist: unicodedata2 ; extra == 'unicode_backport' - - -

Charset Detection, for Everyone 👋

- -

- The Real First Universal Charset Detector
- - - - - - - - Download Count Total - -

- -> A library that helps you read text from an unknown charset encoding.
Motivated by `chardet`, -> I'm trying to resolve the issue by taking a new approach. -> All IANA character set names for which the Python core library provides codecs are supported. - -

- >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<< -

- -This project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**. - -| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) | -| ------------- | :-------------: | :------------------: | :------------------: | -| `Fast` | ❌
| ✅
| ✅
| -| `Universal**` | ❌ | ✅ | ❌ | -| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ | -| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ | -| `License` | LGPL-2.1
_restrictive_ | MIT | MPL-1.1
_restrictive_ | -| `Native Python` | ✅ | ✅ | ❌ | -| `Detect spoken language` | ❌ | ✅ | N/A | -| `UnicodeDecodeError Safety` | ❌ | ✅ | ❌ | -| `Whl Size` | 193.6 kB | 39.5 kB | ~200 kB | -| `Supported Encoding` | 33 | :tada: [93](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 - -

-Reading Normalized TextCat Reading Text - -*\*\* : They are clearly using specific code for a specific encoding even if covering most of used one*
-Did you got there because of the logs? See [https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html](https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html) - -## ⭐ Your support - -*Fork, test-it, star-it, submit your ideas! We do listen.* - -## ⚡ Performance - -This package offer better performance than its counterpart Chardet. Here are some numbers. - -| Package | Accuracy | Mean per file (ms) | File per sec (est) | -| ------------- | :-------------: | :------------------: | :------------------: | -| [chardet](https://github.com/chardet/chardet) | 86 % | 200 ms | 5 file/sec | -| charset-normalizer | **98 %** | **39 ms** | 26 file/sec | - -| Package | 99th percentile | 95th percentile | 50th percentile | -| ------------- | :-------------: | :------------------: | :------------------: | -| [chardet](https://github.com/chardet/chardet) | 1200 ms | 287 ms | 23 ms | -| charset-normalizer | 400 ms | 200 ms | 15 ms | - -Chardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload. - -> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows. -> And yes, these results might change at any time. The dataset can be updated to include more files. -> The actual delays heavily depends on your CPU capabilities. The factors should remain the same. -> Keep in mind that the stats are generous and that Chardet accuracy vs our is measured using Chardet initial capability -> (eg. Supported Encoding) Challenge-them if you want. - -[cchardet](https://github.com/PyYoshi/cChardet) is a non-native (cpp binding) and unmaintained faster alternative with -a better accuracy than chardet but lower than this package. If speed is the most important factor, you should try it. - -## ✨ Installation - -Using PyPi for latest stable -```sh -pip install charset-normalizer -U -``` - -If you want a more up-to-date `unicodedata` than the one available in your Python setup. -```sh -pip install charset-normalizer[unicode_backport] -U -``` - -## 🚀 Basic Usage - -### CLI -This package comes with a CLI. - -``` -usage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD] - file [file ...] - -The Real First Universal Charset Detector. Discover originating encoding used -on text file. Normalize text to unicode. - -positional arguments: - files File(s) to be analysed - -optional arguments: - -h, --help show this help message and exit - -v, --verbose Display complementary information about file if any. - Stdout will contain logs about the detection process. - -a, --with-alternative - Output complementary possibilities if any. Top-level - JSON WILL be a list. - -n, --normalize Permit to normalize input file. If not set, program - does not write anything. - -m, --minimal Only output the charset detected to STDOUT. Disabling - JSON output. - -r, --replace Replace file when trying to normalize it instead of - creating a new one. - -f, --force Replace file without asking if you are sure, use this - flag with caution. - -t THRESHOLD, --threshold THRESHOLD - Define a custom maximum amount of chaos allowed in - decoded content. 0. <= chaos <= 1. - --version Show version information and exit. -``` - -```bash -normalizer ./data/sample.1.fr.srt -``` - -:tada: Since version 1.4.0 the CLI produce easily usable stdout result in JSON format. - -```json -{ - "path": "/home/default/projects/charset_normalizer/data/sample.1.fr.srt", - "encoding": "cp1252", - "encoding_aliases": [ - "1252", - "windows_1252" - ], - "alternative_encodings": [ - "cp1254", - "cp1256", - "cp1258", - "iso8859_14", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_9", - "latin_1", - "mbcs" - ], - "language": "French", - "alphabets": [ - "Basic Latin", - "Latin-1 Supplement" - ], - "has_sig_or_bom": false, - "chaos": 0.149, - "coherence": 97.152, - "unicode_path": null, - "is_preferred": true -} -``` - -### Python -*Just print out normalized text* -```python -from charset_normalizer import from_path - -results = from_path('./my_subtitle.srt') - -print(str(results.best())) -``` - -*Normalize any text file* -```python -from charset_normalizer import normalize -try: - normalize('./my_subtitle.srt') # should write to disk my_subtitle-***.srt -except IOError as e: - print('Sadly, we are unable to perform charset normalization.', str(e)) -``` - -*Upgrade your code without effort* -```python -from charset_normalizer import detect -``` - -The above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible. - -See the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/) - -## 😇 Why - -When I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a -reliable alternative using a completely different method. Also! I never back down on a good challenge! - -I **don't care** about the **originating charset** encoding, because **two different tables** can -produce **two identical rendered string.** -What I want is to get readable text, the best I can. - -In a way, **I'm brute forcing text decoding.** How cool is that ? 😎 - -Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode. - -## 🍰 How - - - Discard all charset encoding table that could not fit the binary content. - - Measure chaos, or the mess once opened (by chunks) with a corresponding charset encoding. - - Extract matches with the lowest mess detected. - - Additionally, we measure coherence / probe for a language. - -**Wait a minute**, what is chaos/mess and coherence according to **YOU ?** - -*Chaos :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then -**I established** some ground rules about **what is obvious** when **it seems like** a mess. - I know that my interpretation of what is chaotic is very subjective, feel free to contribute in order to - improve or rewrite it. - -*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought -that intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design. - -## ⚡ Known limitations - - - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters)) - - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content. - -## 👤 Contributing - -Contributions, issues and feature requests are very much welcome.
-Feel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute. - -## 📝 License - -Copyright © 2019 [Ahmed TAHRI @Ousret](https://github.com/Ousret).
-This project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed. - -Characters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/) diff --git a/.venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/RECORD b/.venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/RECORD deleted file mode 100644 index 8d37ffc..0000000 --- a/.venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/RECORD +++ /dev/null @@ -1,33 +0,0 @@ -../../Scripts/normalizer.exe,sha256=h7vWu9IJkkOAxWsdWIUYJMdwQ7Xb1uP1c7kiOROlGD8,106403 -charset_normalizer-2.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -charset_normalizer-2.1.1.dist-info/LICENSE,sha256=6zGgxaT7Cbik4yBV0lweX5w1iidS_vPNcgIT0cz-4kE,1070 -charset_normalizer-2.1.1.dist-info/METADATA,sha256=C99l12g4d1E9_UiW-mqPCWx7v2M_lYGWxy1GTOjXSsA,11942 -charset_normalizer-2.1.1.dist-info/RECORD,, -charset_normalizer-2.1.1.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 -charset_normalizer-2.1.1.dist-info/entry_points.txt,sha256=uYo8aIGLWv8YgWfSna5HnfY_En4pkF1w4bgawNAXzP0,76 -charset_normalizer-2.1.1.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 -charset_normalizer/__init__.py,sha256=jGhhf1IcOgCpZsr593E9fPvjWKnflVqHe_LwkOJjInU,1790 -charset_normalizer/__pycache__/__init__.cpython-38.pyc,, -charset_normalizer/__pycache__/api.cpython-38.pyc,, -charset_normalizer/__pycache__/cd.cpython-38.pyc,, -charset_normalizer/__pycache__/constant.cpython-38.pyc,, -charset_normalizer/__pycache__/legacy.cpython-38.pyc,, -charset_normalizer/__pycache__/md.cpython-38.pyc,, -charset_normalizer/__pycache__/models.cpython-38.pyc,, -charset_normalizer/__pycache__/utils.cpython-38.pyc,, -charset_normalizer/__pycache__/version.cpython-38.pyc,, -charset_normalizer/api.py,sha256=euVPmjAMbjpqhEHPjfKtyy1mK52U0TOUBUQgM_Qy6eE,19191 -charset_normalizer/assets/__init__.py,sha256=r7aakPaRIc2FFG2mw2V8NOTvkl25_euKZ3wPf5SAVa4,15222 -charset_normalizer/assets/__pycache__/__init__.cpython-38.pyc,, -charset_normalizer/cd.py,sha256=Pxdkbn4cy0iZF42KTb1FiWIqqKobuz_fDjGwc6JMNBc,10811 -charset_normalizer/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -charset_normalizer/cli/__pycache__/__init__.cpython-38.pyc,, -charset_normalizer/cli/__pycache__/normalizer.cpython-38.pyc,, -charset_normalizer/cli/normalizer.py,sha256=FmD1RXeMpRBg_mjR0MaJhNUpM2qZ8wz2neAE7AayBeg,9521 -charset_normalizer/constant.py,sha256=NgU-pY8JH2a9lkVT8oKwAFmIUYNKOuSBwZgF9MrlNCM,19157 -charset_normalizer/legacy.py,sha256=XKeZOts_HdYQU_Jb3C9ZfOjY2CiUL132k9_nXer8gig,3384 -charset_normalizer/md.py,sha256=pZP8IVpSC82D8INA9Tf_y0ijJSRI-UIncZvLdfTWEd4,17642 -charset_normalizer/models.py,sha256=i68YdlSLTEI3EEBVXq8TLNAbyyjrLC2OWszc-OBAk9I,13167 -charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -charset_normalizer/utils.py,sha256=ykOznhcAeH-ODLBWJuI7t1nbwa1SAfN_bDYTCJGyh4U,11771 -charset_normalizer/version.py,sha256=_eh2MA3qS__IajlePQxKBmlw6zaBDvPYlLdEgxgIojw,79 diff --git a/.venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/WHEEL b/.venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/WHEEL deleted file mode 100644 index becc9a6..0000000 --- a/.venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/entry_points.txt b/.venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/entry_points.txt deleted file mode 100644 index a06d360..0000000 --- a/.venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[console_scripts] -normalizer = charset_normalizer.cli.normalizer:cli_detect diff --git a/.venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/top_level.txt b/.venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/top_level.txt deleted file mode 100644 index 66958f0..0000000 --- a/.venv/Lib/site-packages/charset_normalizer-2.1.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -charset_normalizer diff --git a/.venv/Lib/site-packages/charset_normalizer/__init__.py b/.venv/Lib/site-packages/charset_normalizer/__init__.py deleted file mode 100644 index 2dcaf56..0000000 --- a/.venv/Lib/site-packages/charset_normalizer/__init__.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Charset-Normalizer -~~~~~~~~~~~~~~ -The Real First Universal Charset Detector. -A library that helps you read text from an unknown charset encoding. -Motivated by chardet, This package is trying to resolve the issue by taking a new approach. -All IANA character set names for which the Python core library provides codecs are supported. - -Basic usage: - >>> from charset_normalizer import from_bytes - >>> results = from_bytes('Bсеки човек има право на образование. Oбразованието!'.encode('utf_8')) - >>> best_guess = results.best() - >>> str(best_guess) - 'Bсеки човек има право на образование. Oбразованието!' - -Others methods and usages are available - see the full documentation -at . -:copyright: (c) 2021 by Ahmed TAHRI -:license: MIT, see LICENSE for more details. -""" -import logging - -from .api import from_bytes, from_fp, from_path, normalize -from .legacy import ( - CharsetDetector, - CharsetDoctor, - CharsetNormalizerMatch, - CharsetNormalizerMatches, - detect, -) -from .models import CharsetMatch, CharsetMatches -from .utils import set_logging_handler -from .version import VERSION, __version__ - -__all__ = ( - "from_fp", - "from_path", - "from_bytes", - "normalize", - "detect", - "CharsetMatch", - "CharsetMatches", - "CharsetNormalizerMatch", - "CharsetNormalizerMatches", - "CharsetDetector", - "CharsetDoctor", - "__version__", - "VERSION", - "set_logging_handler", -) - -# Attach a NullHandler to the top level logger by default -# https://docs.python.org/3.3/howto/logging.html#configuring-logging-for-a-library - -logging.getLogger("charset_normalizer").addHandler(logging.NullHandler()) diff --git a/.venv/Lib/site-packages/charset_normalizer/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/charset_normalizer/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index a8393018a64fd7f650b541ad4fabdb5ee0170ec7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1724 zcmcIkOK%)S5T04@bJnlKCKxG)LLBUs;x)-BS_KQoF^VO7jr`y+T4~ff)7}}mdwSH} zvt~IU$OV2zeB@@3A}j>vFO08q<&?j`0Z~1>exT&aNK@*n>gxLHc{DTQSmqmk;{Q{% ztiKB84k_dLbNtnhNCL~X0y`)%+qHwKpv+2q%AMk6x6CVUg;(9GZK1rvYP{~&dBbgR z$8~tqZSrY%y3keG44-vp`J6jf@HIBi@45GibDiDi3+@76bQh6txF1ma^@G4UvtNIR zr=>IN%tm?Xz-l$qS5ubdY=%TCs#m*0a>Al-sC2&l&*vP56!s}$@I@q*hNCzdQmK%i zn8FLHsjr1>I~%~Fz9e!4IwTrG$`S=5k%FWo08PKva4ZD}5Cje zx|QYUSKnuEvfr``xcVWx%ziNpWEa`***Ro?UVWFHqwEs0KMa4F{ai?XEpDEp@FIKD zhQ0TRuU=)BA1}9y{L_`?R3Cd!ms_oCG<~YHH%O^6fF{t|M!0fwMQOQmd#w=v-*6pg z56dkTaEet5uo7`F&ilA1WJn@L`i#OV7I@qn$0-&+5Pr&Otci|9>|l>R3$;#EXKif| z=`iiLeZklEQYEQgd$(xoZKvalWF(_Os5`LYx8TXAPad0w+Xy*!?BT}C{cWeiBA>>J zc3^k=@KFI^XM1z2d$3jX7&k42O^py$+j)yi!Ro%Xk+#aYW9DPr4|%OPA18UEI3z@e zdE=&oT9tfmGJ)3vn9p1bgqg?u!Gyh??Ome%FkgDVoT|KvuyB@JrF?pFXKXQhm!qm> z=LRhrtO?Ar=e1^~*@3cR2reB<;+nK%(~xOH zW(;W8F0oqVGNx&22}50KB&wc5(F>DDao5% zY`Y2blO-RbO+o%9o1NZ~!W8wwbRcB!1yv_nB)z`SKzYJM1VM^BlP9Xz9@2Q&+ll%; z6=}LUS%a$gZaUUHFN!1WdF^DB*PmfDDWmHp^r{Tp@?yQTWIwFU+tc=Zsl50v3(H-y diff --git a/.venv/Lib/site-packages/charset_normalizer/__pycache__/api.cpython-38.pyc b/.venv/Lib/site-packages/charset_normalizer/__pycache__/api.cpython-38.pyc deleted file mode 100644 index f94236383a4605829be997c657ed60dfff2b4faa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11071 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 BuZ#cy diff --git a/.venv/Lib/site-packages/charset_normalizer/__pycache__/constant.cpython-38.pyc b/.venv/Lib/site-packages/charset_normalizer/__pycache__/constant.cpython-38.pyc deleted file mode 100644 index a8cfadb91f9c7c0eb105b1c0001812b91d434914..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14109 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 diff --git a/.venv/Lib/site-packages/charset_normalizer/__pycache__/legacy.cpython-38.pyc b/.venv/Lib/site-packages/charset_normalizer/__pycache__/legacy.cpython-38.pyc deleted file mode 100644 index 0a87744f4ff532b7ee0293ced89db1e498d22318..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3022 zcmb_e&5si|6d!vglSwvNmW3`LRjmsYNDB*UsfrMyRJ*IT5)FtCRT`}tO~y_#?0f{< z*=1?Ahc4&-1ss+mQvZM+dg`CyYfs#IZdK9uJlPLmi$ujpetFN&_WSwy`RCkiHtP<4 zt0&@1O~?7e8hb<)^lQ-6uOPU?N$Q07OH-23kY;Y^W?twKhr8TME14hqSv9O?K^SDU zux9%!X+4_?r>yR$jjS0qv*~b}IO2eyVn(>a19`AVk2%L2l)U6dybRaPHXlVpm*9W*LaIb ztW9uZsFNa(Qd7B`gYt}kyXBdBPZn9HyRL;YRjc=gre>94qz9&!7cz^|>d zm$w#|?sOJz+`6@N`{s@I;!=BIsYOj=VGv0r^tX|Y2WEP&B^3ArjL=b98ea-Ml6j2r zx4#M~*cPCv-#}<*>}aBCk8V=Mw9Cnsrz>M;lRP1tvzYQ|#Svw2!}A)hEsd z852%dYV!J++zWEb=?0zj44|jR-4$0_4Se2)JMsOnsy`P;l#6 z6k5cZ>49J(j|-mUeOC0W-A`6U&M;vN5(bWW_Kjw0P>fQ}x`Jhe(&;+uM)ArTEPpO8 zGB~QFn~Hh6^wRcvd6WsZmZT}m@K_k03Zg02a<(QDjWO2-A{VPdvSFc=U4xxz7ceH@ z#bwtS7E%iUvCb0Rvcc{Q62*F>JjUu`pmQ;lB93ral=D5XM+&-h!Lp<;!Ohl- z5k!^6JoHS7(R?iJDo?2RNOO|m419@rQ7<{2U$rcs_l z2gA%KH5 zi>^h92edvc=P3qpaDhn52$1&+eVP4mVWVxTck`7Ta%`MFlrnsOeqkyj-RoQmy^c!y za3_Q9GdBUC?vJ9rFm>2_FX0HK)im`)CArcOSf;iU##B&MrgjHlEJ<0weJaynJVYja z2xq*mfNjo#Di47OD^P}oGH$oXBywM?B7yiEL*(utc^G=0I`TdE`Kz;VdHJpqQY{Zg z{X#A;3bmq(;c^$!EV5x*B#e)k230N3L$R(dUr)NrD$(NH5ULV(qn5Gsfe<=7{2|Ym zw_tv_ZhR<1$ZQRQsWTv)`ZS@$BmQ&x+^f_{KpS+Hyi4Z1ITCpObD#R)r+-TZV`H4K z_d_bV22C|U2qz@m38`g43Y1miXm8V)v=r5T3Ww0?U}bkYrrzmf1s|oTH#(jBqbMys zHXVD!`w&2W0OA6MqaXre?N>0l;Jb!{u7KFaB!I{`eFQ`mdZ5GmVf6~=74BQz2ffMz zt5Kq8|Y!MD5`h*fkyJKfeeukIfDQ!Pofx^;BT+$Jn zu>RRnu?05K@ddEAc;^sVB*iONJRS&4p1s|`PxkVGmE`Qx`3vyI1VB?ckc~1PYG!tE z!Vz$Hzbjo5U)`tFc#(u*J`!7By_|R)^BL~WKH$_Nl+u5^%0o+RP-`!pu~74qt^J=o z$IpJYuKgzrIQ@Eh25{+w!H&ro?SZM6h2{OmL+n<*S%vh0j?)4%4HgL1x^Or)RvG HQ#0Pb{w?Wd diff --git a/.venv/Lib/site-packages/charset_normalizer/__pycache__/md.cpython-38.pyc b/.venv/Lib/site-packages/charset_normalizer/__pycache__/md.cpython-38.pyc deleted file mode 100644 index c0b36abbfb67a985fd0e7ac60e26f12b4cb1a4c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14726 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 GlKKA@iYny* diff --git a/.venv/Lib/site-packages/charset_normalizer/__pycache__/utils.cpython-38.pyc b/.venv/Lib/site-packages/charset_normalizer/__pycache__/utils.cpython-38.pyc deleted file mode 100644 index a755d22f75e2f9202559c6301f69991d8f8c828a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9134 zcmcIpTWs7`dgdWHSB<2JEX#L?N$l8@#ELEF;v`;g6lr8nERP&Xc4ETWDK&?Z=;2&+ z$Z;ZtN`sZNH*9uOpm!LBgx=QeQ~TN$eJcv|y$^itzWAvRMN>e{I{p4bYIGR|MGIsG z{CRk8{LeZ6|NR%<>g~-c^t=CD^}o+4%D>5n9i$KCw{dw7G(}m-afLHiG1>b{}pE94S510e>1LgtQo^l842hD>hr+LO5svj~B)eoD8>qpEZ z^`qv|`Z4oZ{kVCYDR$OA&a+=I`-FXx_dHa2j`u#$*O>YAj+PU$rH}W^7Gpu9oBc zglsv})pC+QEnCiZ)^G4<9_VJFtLL-)Iob1tu9j2$v}}2?tL1rqMz*}v)pC{>WXrj( zmKXSovSk=8FWX1gSm$(J!s(pj!?N{!*SMGYdD(J-&)6gOMLRl~k%t<;$X|JoFki8= z{MF7}uVJp&`6W5xRrDW-`r9M(D$er_w7$vT!alqv_vJF4zsIlO`E@=^HTDVqHfA2> z?_lOjsOgt-Fou5Pyoi2ppzehICZ9mBtNa>j-jX#ZWlf2{i<-;)x~<>)9-o}o&~_1X zGJfNs&dYoXvtHr1z}E@;`)E0d{|GL*Cc97eWb+z0z4j^)`NiWyh5D^;tyXjA>X)8Llt7LsA+s@<@KHBkKJgyzB9M%+ud(`%)kxi>?@YXrp8O< ztCbt0)7NLhq0(r1v@&z+=FO?;+2VL*rgWn;IXWFaJzcEaoSK;_y)#*?bjFm*p2T+g@4P=XJ&uvH z6PNJ%4@x&iCo7|qlT*=@wD`L9vFEJV1vSi67cF5`eOrV{Vf$^-sL~R)ekuxSTw}Pr z+aN1_zOv2&WrM8}><#IPPq23?g1tKc#2E#Erv|K+Y|U~lzU%Ql5#N*XJwMUYeX7UFnlgoB9C_@I6mbG| zn?D$P^X@Ir7T(>(_CizK9k;!j-)!BTYx;&=Z@Ep!;BCW4(Yrf*-)`K$JL$~b^&HO(ZwP)9A75h+v5n9hW?!VHCCxC}7?|pv))%TUR;5k*U7s z>w(Hi=e0F;jWkFvZ!$yBp+C-p6cXYvZecHn4%J&tEC^yBCcKvG_@P!^6rtuc{DLNT z&dhFgvw4`HjrQd3MTC|U_ChI}_w9JCFQLklMpn%-o#|>;6=zVlYe}>mTGoyw1Kn{N7IA z3VMWDIeCTVG&88E$mgydiDfcseI2t#JCaDNd6s6_krz?7Ye#nJAszDnMGtYvT6w}u zOafBM;t)oQV?;>IcN|n20_j@5($n zVOv2sBm5CV9K89elra_Rq14ji1rAO*lttoGq8zfDvlC{|&32#|k~DOMAVF8fCDiOXi(M;x6Rmq! z=pBs^S)8O*?OEvv*Rj$>ywW6AIuo)o7Mqv=Yfbq1|fPLYzn6y)Vz>N;(s_(pd01w;JhErrU=u$x~hw4}pM@6a4SfA-AHLrEF8E4bgL8aq^4oWdkZKWjzwQ3*K0Hl-7d+{+*G5a<&Jpyn z;xAgx-|xfE4C`@9%~?D|0113bH=mDSa;wbMnnrb8BjAKXJh91+wk4+j-9O?W z#xXjC!U3reTml~V1yM5I?MA21zhF>g615!5Zu#+Fi@T_QtN^iLBGR6{)Q0zChdrKc ziRxlyrHN2fp1E8X`qD2IUt_p?>mXz`eYU20eZKlb=4+AX;_H5bESH}Q5Pz+ypTo_+ zm*Ohdxc-H@27ehnH6$1kHC0?AOB-nLrOT^&ps%Mll=Tcx^3;a9s{7gX9_eSFho7BT zO$LcT$Cw8}lKkw**A9}hZgFSb(&Eyj^uW_A?@Qmg__0sXrO_tW+8CV~E0xX>$Qu+k zAVN2A_J-H8tIoV*b3=N9)YEB5pMBmDo^LeHQLydB-nc+wP6?CF0)i_05rg|kk(?(Z zm`!#rWR*fL%sP0X=UcS52{}5<%r3X0s4vu9yCD*oMv&zUwYt*?lMzQ@BDR;pZnvInpmGJoOyT4zm?caJ+e13QGY2}WsBEnw?At0;WELXq?L0ex$Gwm~guSSA z&+@N$pZ6??q9bC0FQYP*9etuFa`eRV35pqVxbmuKq1WTjKp?e8aN8d~$aj&VWS|ha zI<1pF1PW22x(;F5fD?ZY!n8)FTw8fh9_4LYIP=Sf;~Cc0iB)$T7**FPF=Ehm8<1mT z4lV^p$#8sw@*gtRl5<_j;LTyC?ax;(yoP-Y6I8qu-Chrq^mK6~x?gxL>UeRaGG}*+ z7$b*Ys(8*qXQnxOGq<(J-tZ@@$izSry!KqxwLCA(I0$Hk?>ci~Z&a+*o4k#=lJgXy z`+~GiD##kFrE#znY(L_w&|0@a7s3L{V#5V{8{+D{_pRd7Vw1{0?!`kj}NZyf!e zTGHeA_YJwtC64R@9h%jEZpErNQ@Z-{J5x7E#TFdoEsQM?iu4Pv+kb!?z@VVeL)b*- zLBcHbN%-DJj=zXTS`~H?a@^SkGf}rh%?ow9?Un8WPRtA)7=q=>T(jN-koHIgv2DnA zWLXjdon?cn_#AcEx;5PPm*EbylP@S`I3?ZAEAj-%_ZRnx(D~skqKY{M2U$TXgRGF@Hw~ohq6~-B zF9@-5=9ASkg`}uaZp&(ob&O_Zr(iThl8Ky-NlhQk0ls4EeM2u53Ue#(`*j^S19!1xx znp4FuX<0}ecGh39c0SB?A3niZN11;vmq#Yq%aby%F$9t@wtMlFmK`H5@Rkr48xR?5 z29vBwv&~i$90u4=@Z=htyANMjO~JgU7BK5-8fH5cq&HZQi0&}a9|SPruPdv`B`T$l zk?>^73t&n9#3#6k-y&iW!44>ozoAkum7ahU(h|7DD%E~UghWOnW0;8276b?49!Mc0 zzNGT+fS8%srdO=(;+&~F92G?8%!Auu7QhznPPN%?_#t!5UcU)+uf&41R}y=neV$Wy zT!g3o^7rZ347^c6x=e>8roTyQlEOejGF8YY8>Haz_tB>+HJN(jM`hB7Fnfd&mgB6K|Tzl^oit)C_On(c^_nzj9qJuF`0>eFbhEJ>~_}{!7y!) z{D8KI%)F8Wpgs|QfRZUQQoFO!D}~c%kx28Mx?S*$z&L%@MY_}_osXaEw&!8N1~IiU_D5SOF@c4A>7Hucy=`tq=O9p+98EPh}CS6 z^LI133v=mmpzN9@7wF>CAR*uMDT0UG zA!Rie9+Ulh{0)9kqeZGE^b`&e$|@E5 z#h+1Gn&CgE(q9nyOCrA_@`%V^5&3H(zXyWPEhI!HzTlB8*$r;ys%^hxgw3I-0Xan< zA3CJ4RjP}%klpJN>z(7!2lIJLSb=v1?@@9xxS)?UEJtRN+*>sdluZMBRlrL!byCf0 z>NmRD_e9qR(F-Ao+9#>_8_WO)>_d5*Eg&m7YUbkn0DY7jiIV6&CFz>Wtbb&B{um>| zBtdS~lh((4YTLDszv@coCd^3eY&Km_&_0K%uw`@?CjI3W07H<#3ksrzJSx%$ktNat zV)jQKJvsF9ZPNcY)0A>X0O?0=FzJnq7UfrplesdjDzlq1g(z-P!+S(18zm?O6bZ^5DpArvI^p6pm0CnTBl0G3LY7&eK+HCdUSJ)MpPHpo7N;^7>$Y guy5eVKu(32slTBZSN^{SO#D~pX{(kcS?;U<0kJkSy8r+H diff --git a/.venv/Lib/site-packages/charset_normalizer/__pycache__/version.cpython-38.pyc b/.venv/Lib/site-packages/charset_normalizer/__pycache__/version.cpython-38.pyc deleted file mode 100644 index 32a66a53c3af4c0490cf334d120449e1f63b5857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272 zcmWIL<>g`kfimS}e<1Z3%t0cUfoumLE*1k4DGX5zDU4B!sf-JlQkWJpMlq)_2Qz50 zR0(joRutqHrz(`C78Pga=W$iB8tED88Qx;l^V4Lx#U3A@lAjzOe~UXl9;yP!VJ$Am z$t=0W9_AVp?CI~flA(wVXa|`1mEdd@6Iu*3EGDBgJ-;Z%CAB!aB)=dgDZfM^HMbxq zKT{#4RG|dOERNADOU)~b@ySezDb6fO)h$R&&Q45EEsjafNGvK&Es4*|FUn2K$*f8( f(uZ2ES5SG2!zMRBr8FnijuGTL79hdG!ommuXn{>{ diff --git a/.venv/Lib/site-packages/charset_normalizer/api.py b/.venv/Lib/site-packages/charset_normalizer/api.py deleted file mode 100644 index 72907f9..0000000 --- a/.venv/Lib/site-packages/charset_normalizer/api.py +++ /dev/null @@ -1,584 +0,0 @@ -import logging -import warnings -from os import PathLike -from os.path import basename, splitext -from typing import Any, BinaryIO, List, Optional, Set - -from .cd import ( - coherence_ratio, - encoding_languages, - mb_encoding_languages, - merge_coherence_ratios, -) -from .constant import IANA_SUPPORTED, TOO_BIG_SEQUENCE, TOO_SMALL_SEQUENCE, TRACE -from .md import mess_ratio -from .models import CharsetMatch, CharsetMatches -from .utils import ( - any_specified_encoding, - cut_sequence_chunks, - iana_name, - identify_sig_or_bom, - is_cp_similar, - is_multi_byte_encoding, - should_strip_sig_or_bom, -) - -# Will most likely be controversial -# logging.addLevelName(TRACE, "TRACE") -logger = logging.getLogger("charset_normalizer") -explain_handler = logging.StreamHandler() -explain_handler.setFormatter( - logging.Formatter("%(asctime)s | %(levelname)s | %(message)s") -) - - -def from_bytes( - sequences: bytes, - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.2, - cp_isolation: Optional[List[str]] = None, - cp_exclusion: Optional[List[str]] = None, - preemptive_behaviour: bool = True, - explain: bool = False, -) -> CharsetMatches: - """ - Given a raw bytes sequence, return the best possibles charset usable to render str objects. - If there is no results, it is a strong indicator that the source is binary/not text. - By default, the process will extract 5 blocs of 512o each to assess the mess and coherence of a given sequence. - And will give up a particular code page after 20% of measured mess. Those criteria are customizable at will. - - The preemptive behavior DOES NOT replace the traditional detection workflow, it prioritize a particular code page - but never take it for granted. Can improve the performance. - - You may want to focus your attention to some code page or/and not others, use cp_isolation and cp_exclusion for that - purpose. - - This function will strip the SIG in the payload/sequence every time except on UTF-16, UTF-32. - By default the library does not setup any handler other than the NullHandler, if you choose to set the 'explain' - toggle to True it will alter the logger configuration to add a StreamHandler that is suitable for debugging. - Custom logging format and handler can be set manually. - """ - - if not isinstance(sequences, (bytearray, bytes)): - raise TypeError( - "Expected object of type bytes or bytearray, got: {0}".format( - type(sequences) - ) - ) - - if explain: - previous_logger_level: int = logger.level - logger.addHandler(explain_handler) - logger.setLevel(TRACE) - - length: int = len(sequences) - - if length == 0: - logger.debug("Encoding detection on empty bytes, assuming utf_8 intention.") - if explain: - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level or logging.WARNING) - return CharsetMatches([CharsetMatch(sequences, "utf_8", 0.0, False, [], "")]) - - if cp_isolation is not None: - logger.log( - TRACE, - "cp_isolation is set. use this flag for debugging purpose. " - "limited list of encoding allowed : %s.", - ", ".join(cp_isolation), - ) - cp_isolation = [iana_name(cp, False) for cp in cp_isolation] - else: - cp_isolation = [] - - if cp_exclusion is not None: - logger.log( - TRACE, - "cp_exclusion is set. use this flag for debugging purpose. " - "limited list of encoding excluded : %s.", - ", ".join(cp_exclusion), - ) - cp_exclusion = [iana_name(cp, False) for cp in cp_exclusion] - else: - cp_exclusion = [] - - if length <= (chunk_size * steps): - logger.log( - TRACE, - "override steps (%i) and chunk_size (%i) as content does not fit (%i byte(s) given) parameters.", - steps, - chunk_size, - length, - ) - steps = 1 - chunk_size = length - - if steps > 1 and length / steps < chunk_size: - chunk_size = int(length / steps) - - is_too_small_sequence: bool = len(sequences) < TOO_SMALL_SEQUENCE - is_too_large_sequence: bool = len(sequences) >= TOO_BIG_SEQUENCE - - if is_too_small_sequence: - logger.log( - TRACE, - "Trying to detect encoding from a tiny portion of ({}) byte(s).".format( - length - ), - ) - elif is_too_large_sequence: - logger.log( - TRACE, - "Using lazy str decoding because the payload is quite large, ({}) byte(s).".format( - length - ), - ) - - prioritized_encodings: List[str] = [] - - specified_encoding: Optional[str] = ( - any_specified_encoding(sequences) if preemptive_behaviour else None - ) - - if specified_encoding is not None: - prioritized_encodings.append(specified_encoding) - logger.log( - TRACE, - "Detected declarative mark in sequence. Priority +1 given for %s.", - specified_encoding, - ) - - tested: Set[str] = set() - tested_but_hard_failure: List[str] = [] - tested_but_soft_failure: List[str] = [] - - fallback_ascii: Optional[CharsetMatch] = None - fallback_u8: Optional[CharsetMatch] = None - fallback_specified: Optional[CharsetMatch] = None - - results: CharsetMatches = CharsetMatches() - - sig_encoding, sig_payload = identify_sig_or_bom(sequences) - - if sig_encoding is not None: - prioritized_encodings.append(sig_encoding) - logger.log( - TRACE, - "Detected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.", - len(sig_payload), - sig_encoding, - ) - - prioritized_encodings.append("ascii") - - if "utf_8" not in prioritized_encodings: - prioritized_encodings.append("utf_8") - - for encoding_iana in prioritized_encodings + IANA_SUPPORTED: - - if cp_isolation and encoding_iana not in cp_isolation: - continue - - if cp_exclusion and encoding_iana in cp_exclusion: - continue - - if encoding_iana in tested: - continue - - tested.add(encoding_iana) - - decoded_payload: Optional[str] = None - bom_or_sig_available: bool = sig_encoding == encoding_iana - strip_sig_or_bom: bool = bom_or_sig_available and should_strip_sig_or_bom( - encoding_iana - ) - - if encoding_iana in {"utf_16", "utf_32"} and not bom_or_sig_available: - logger.log( - TRACE, - "Encoding %s wont be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.", - encoding_iana, - ) - continue - - try: - is_multi_byte_decoder: bool = is_multi_byte_encoding(encoding_iana) - except (ModuleNotFoundError, ImportError): - logger.log( - TRACE, - "Encoding %s does not provide an IncrementalDecoder", - encoding_iana, - ) - continue - - try: - if is_too_large_sequence and is_multi_byte_decoder is False: - str( - sequences[: int(50e4)] - if strip_sig_or_bom is False - else sequences[len(sig_payload) : int(50e4)], - encoding=encoding_iana, - ) - else: - decoded_payload = str( - sequences - if strip_sig_or_bom is False - else sequences[len(sig_payload) :], - encoding=encoding_iana, - ) - except (UnicodeDecodeError, LookupError) as e: - if not isinstance(e, LookupError): - logger.log( - TRACE, - "Code page %s does not fit given bytes sequence at ALL. %s", - encoding_iana, - str(e), - ) - tested_but_hard_failure.append(encoding_iana) - continue - - similar_soft_failure_test: bool = False - - for encoding_soft_failed in tested_but_soft_failure: - if is_cp_similar(encoding_iana, encoding_soft_failed): - similar_soft_failure_test = True - break - - if similar_soft_failure_test: - logger.log( - TRACE, - "%s is deemed too similar to code page %s and was consider unsuited already. Continuing!", - encoding_iana, - encoding_soft_failed, - ) - continue - - r_ = range( - 0 if not bom_or_sig_available else len(sig_payload), - length, - int(length / steps), - ) - - multi_byte_bonus: bool = ( - is_multi_byte_decoder - and decoded_payload is not None - and len(decoded_payload) < length - ) - - if multi_byte_bonus: - logger.log( - TRACE, - "Code page %s is a multi byte encoding table and it appear that at least one character " - "was encoded using n-bytes.", - encoding_iana, - ) - - max_chunk_gave_up: int = int(len(r_) / 4) - - max_chunk_gave_up = max(max_chunk_gave_up, 2) - early_stop_count: int = 0 - lazy_str_hard_failure = False - - md_chunks: List[str] = [] - md_ratios = [] - - try: - for chunk in cut_sequence_chunks( - sequences, - encoding_iana, - r_, - chunk_size, - bom_or_sig_available, - strip_sig_or_bom, - sig_payload, - is_multi_byte_decoder, - decoded_payload, - ): - md_chunks.append(chunk) - - md_ratios.append(mess_ratio(chunk, threshold)) - - if md_ratios[-1] >= threshold: - early_stop_count += 1 - - if (early_stop_count >= max_chunk_gave_up) or ( - bom_or_sig_available and strip_sig_or_bom is False - ): - break - except UnicodeDecodeError as e: # Lazy str loading may have missed something there - logger.log( - TRACE, - "LazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %s", - encoding_iana, - str(e), - ) - early_stop_count = max_chunk_gave_up - lazy_str_hard_failure = True - - # We might want to check the sequence again with the whole content - # Only if initial MD tests passes - if ( - not lazy_str_hard_failure - and is_too_large_sequence - and not is_multi_byte_decoder - ): - try: - sequences[int(50e3) :].decode(encoding_iana, errors="strict") - except UnicodeDecodeError as e: - logger.log( - TRACE, - "LazyStr Loading: After final lookup, code page %s does not fit given bytes sequence at ALL. %s", - encoding_iana, - str(e), - ) - tested_but_hard_failure.append(encoding_iana) - continue - - mean_mess_ratio: float = sum(md_ratios) / len(md_ratios) if md_ratios else 0.0 - if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up: - tested_but_soft_failure.append(encoding_iana) - logger.log( - TRACE, - "%s was excluded because of initial chaos probing. Gave up %i time(s). " - "Computed mean chaos is %f %%.", - encoding_iana, - early_stop_count, - round(mean_mess_ratio * 100, ndigits=3), - ) - # Preparing those fallbacks in case we got nothing. - if ( - encoding_iana in ["ascii", "utf_8", specified_encoding] - and not lazy_str_hard_failure - ): - fallback_entry = CharsetMatch( - sequences, encoding_iana, threshold, False, [], decoded_payload - ) - if encoding_iana == specified_encoding: - fallback_specified = fallback_entry - elif encoding_iana == "ascii": - fallback_ascii = fallback_entry - else: - fallback_u8 = fallback_entry - continue - - logger.log( - TRACE, - "%s passed initial chaos probing. Mean measured chaos is %f %%", - encoding_iana, - round(mean_mess_ratio * 100, ndigits=3), - ) - - if not is_multi_byte_decoder: - target_languages: List[str] = encoding_languages(encoding_iana) - else: - target_languages = mb_encoding_languages(encoding_iana) - - if target_languages: - logger.log( - TRACE, - "{} should target any language(s) of {}".format( - encoding_iana, str(target_languages) - ), - ) - - cd_ratios = [] - - # We shall skip the CD when its about ASCII - # Most of the time its not relevant to run "language-detection" on it. - if encoding_iana != "ascii": - for chunk in md_chunks: - chunk_languages = coherence_ratio( - chunk, 0.1, ",".join(target_languages) if target_languages else None - ) - - cd_ratios.append(chunk_languages) - - cd_ratios_merged = merge_coherence_ratios(cd_ratios) - - if cd_ratios_merged: - logger.log( - TRACE, - "We detected language {} using {}".format( - cd_ratios_merged, encoding_iana - ), - ) - - results.append( - CharsetMatch( - sequences, - encoding_iana, - mean_mess_ratio, - bom_or_sig_available, - cd_ratios_merged, - decoded_payload, - ) - ) - - if ( - encoding_iana in [specified_encoding, "ascii", "utf_8"] - and mean_mess_ratio < 0.1 - ): - logger.debug( - "Encoding detection: %s is most likely the one.", encoding_iana - ) - if explain: - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - return CharsetMatches([results[encoding_iana]]) - - if encoding_iana == sig_encoding: - logger.debug( - "Encoding detection: %s is most likely the one as we detected a BOM or SIG within " - "the beginning of the sequence.", - encoding_iana, - ) - if explain: - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - return CharsetMatches([results[encoding_iana]]) - - if len(results) == 0: - if fallback_u8 or fallback_ascii or fallback_specified: - logger.log( - TRACE, - "Nothing got out of the detection process. Using ASCII/UTF-8/Specified fallback.", - ) - - if fallback_specified: - logger.debug( - "Encoding detection: %s will be used as a fallback match", - fallback_specified.encoding, - ) - results.append(fallback_specified) - elif ( - (fallback_u8 and fallback_ascii is None) - or ( - fallback_u8 - and fallback_ascii - and fallback_u8.fingerprint != fallback_ascii.fingerprint - ) - or (fallback_u8 is not None) - ): - logger.debug("Encoding detection: utf_8 will be used as a fallback match") - results.append(fallback_u8) - elif fallback_ascii: - logger.debug("Encoding detection: ascii will be used as a fallback match") - results.append(fallback_ascii) - - if results: - logger.debug( - "Encoding detection: Found %s as plausible (best-candidate) for content. With %i alternatives.", - results.best().encoding, # type: ignore - len(results) - 1, - ) - else: - logger.debug("Encoding detection: Unable to determine any suitable charset.") - - if explain: - logger.removeHandler(explain_handler) - logger.setLevel(previous_logger_level) - - return results - - -def from_fp( - fp: BinaryIO, - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.20, - cp_isolation: Optional[List[str]] = None, - cp_exclusion: Optional[List[str]] = None, - preemptive_behaviour: bool = True, - explain: bool = False, -) -> CharsetMatches: - """ - Same thing than the function from_bytes but using a file pointer that is already ready. - Will not close the file pointer. - """ - return from_bytes( - fp.read(), - steps, - chunk_size, - threshold, - cp_isolation, - cp_exclusion, - preemptive_behaviour, - explain, - ) - - -def from_path( - path: "PathLike[Any]", - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.20, - cp_isolation: Optional[List[str]] = None, - cp_exclusion: Optional[List[str]] = None, - preemptive_behaviour: bool = True, - explain: bool = False, -) -> CharsetMatches: - """ - Same thing than the function from_bytes but with one extra step. Opening and reading given file path in binary mode. - Can raise IOError. - """ - with open(path, "rb") as fp: - return from_fp( - fp, - steps, - chunk_size, - threshold, - cp_isolation, - cp_exclusion, - preemptive_behaviour, - explain, - ) - - -def normalize( - path: "PathLike[Any]", - steps: int = 5, - chunk_size: int = 512, - threshold: float = 0.20, - cp_isolation: Optional[List[str]] = None, - cp_exclusion: Optional[List[str]] = None, - preemptive_behaviour: bool = True, -) -> CharsetMatch: - """ - Take a (text-based) file path and try to create another file next to it, this time using UTF-8. - """ - warnings.warn( - "normalize is deprecated and will be removed in 3.0", - DeprecationWarning, - ) - - results = from_path( - path, - steps, - chunk_size, - threshold, - cp_isolation, - cp_exclusion, - preemptive_behaviour, - ) - - filename = basename(path) - target_extensions = list(splitext(filename)) - - if len(results) == 0: - raise IOError( - 'Unable to normalize "{}", no encoding charset seems to fit.'.format( - filename - ) - ) - - result = results.best() - - target_extensions[0] += "-" + result.encoding # type: ignore - - with open( - "{}".format(str(path).replace(filename, "".join(target_extensions))), "wb" - ) as fp: - fp.write(result.output()) # type: ignore - - return result # type: ignore diff --git a/.venv/Lib/site-packages/charset_normalizer/assets/__init__.py b/.venv/Lib/site-packages/charset_normalizer/assets/__init__.py deleted file mode 100644 index 3c33ba3..0000000 --- a/.venv/Lib/site-packages/charset_normalizer/assets/__init__.py +++ /dev/null @@ -1,1122 +0,0 @@ -# -*- coding: utf-8 -*- -from typing import Dict, List - -FREQUENCIES: Dict[str, List[str]] = { - "English": [ - "e", - "a", - "t", - "i", - "o", - "n", - "s", - "r", - "h", - "l", - "d", - "c", - "u", - "m", - "f", - "p", - "g", - "w", - "y", - "b", - "v", - "k", - "x", - "j", - "z", - "q", - ], - "German": [ - "e", - "n", - "i", - "r", - "s", - "t", - "a", - "d", - "h", - "u", - "l", - "g", - "o", - "c", - "m", - "b", - "f", - "k", - "w", - "z", - "p", - "v", - "ü", - "ä", - "ö", - "j", - ], - "French": [ - "e", - "a", - "s", - "n", - "i", - "t", - "r", - "l", - "u", - "o", - "d", - "c", - "p", - "m", - "é", - "v", - "g", - "f", - "b", - "h", - "q", - "à", - "x", - "è", - "y", - "j", - ], - "Dutch": [ - "e", - "n", - "a", - "i", - "r", - "t", - "o", - "d", - "s", - "l", - "g", - "h", - "v", - "m", - "u", - "k", - "c", - "p", - "b", - "w", - "j", - "z", - "f", - "y", - "x", - "ë", - ], - "Italian": [ - "e", - "i", - "a", - "o", - "n", - "l", - "t", - "r", - "s", - "c", - "d", - "u", - "p", - "m", - "g", - "v", - "f", - "b", - "z", - "h", - "q", - "è", - "à", - "k", - "y", - "ò", - ], - "Polish": [ - "a", - "i", - "o", - "e", - "n", - "r", - "z", - "w", - "s", - "c", - "t", - "k", - "y", - "d", - "p", - "m", - "u", - "l", - "j", - "ł", - "g", - "b", - "h", - "ą", - "ę", - "ó", - ], - "Spanish": [ - "e", - "a", - "o", - "n", - "s", - "r", - "i", - "l", - "d", - "t", - "c", - "u", - "m", - "p", - "b", - "g", - "v", - "f", - "y", - "ó", - "h", - "q", - "í", - "j", - "z", - "á", - ], - "Russian": [ - "о", - "а", - "е", - "и", - "н", - "с", - "т", - "р", - "в", - "л", - "к", - "м", - "д", - "п", - "у", - "г", - "я", - "ы", - "з", - "б", - "й", - "ь", - "ч", - "х", - "ж", - "ц", - ], - "Japanese": [ - "の", - "に", - "る", - "た", - "は", - "ー", - "と", - "し", - "を", - "で", - "て", - "が", - "い", - "ン", - "れ", - "な", - "年", - "ス", - "っ", - "ル", - "か", - "ら", - "あ", - "さ", - "も", - "り", - ], - "Portuguese": [ - "a", - "e", - "o", - "s", - "i", - "r", - "d", - "n", - "t", - "m", - "u", - "c", - "l", - "p", - "g", - "v", - "b", - "f", - "h", - "ã", - "q", - "é", - "ç", - "á", - "z", - "í", - ], - "Swedish": [ - "e", - "a", - "n", - "r", - "t", - "s", - "i", - "l", - "d", - "o", - "m", - "k", - "g", - "v", - "h", - "f", - "u", - "p", - "ä", - "c", - "b", - "ö", - "å", - "y", - "j", - "x", - ], - "Chinese": [ - "的", - "一", - "是", - "不", - "了", - "在", - "人", - "有", - "我", - "他", - "这", - "个", - "们", - "中", - "来", - "上", - "大", - "为", - "和", - "国", - "地", - "到", - "以", - "说", - "时", - "要", - "就", - "出", - "会", - ], - "Ukrainian": [ - "о", - "а", - "н", - "і", - "и", - "р", - "в", - "т", - "е", - "с", - "к", - "л", - "у", - "д", - "м", - "п", - "з", - "я", - "ь", - "б", - "г", - "й", - "ч", - "х", - "ц", - "ї", - ], - "Norwegian": [ - "e", - "r", - "n", - "t", - "a", - "s", - "i", - "o", - "l", - "d", - "g", - "k", - "m", - "v", - "f", - "p", - "u", - "b", - "h", - "å", - "y", - "j", - "ø", - "c", - "æ", - "w", - ], - "Finnish": [ - "a", - "i", - "n", - "t", - "e", - "s", - "l", - "o", - "u", - "k", - "ä", - "m", - "r", - "v", - "j", - "h", - "p", - "y", - "d", - "ö", - "g", - "c", - "b", - "f", - "w", - "z", - ], - "Vietnamese": [ - "n", - "h", - "t", - "i", - "c", - "g", - "a", - "o", - "u", - "m", - "l", - "r", - "à", - "đ", - "s", - "e", - "v", - "p", - "b", - "y", - "ư", - "d", - "á", - "k", - "ộ", - "ế", - ], - "Czech": [ - "o", - "e", - "a", - "n", - "t", - "s", - "i", - "l", - "v", - "r", - "k", - "d", - "u", - "m", - "p", - "í", - "c", - "h", - "z", - "á", - "y", - "j", - "b", - "ě", - "é", - "ř", - ], - "Hungarian": [ - "e", - "a", - "t", - "l", - "s", - "n", - "k", - "r", - "i", - "o", - "z", - "á", - "é", - "g", - "m", - "b", - "y", - "v", - "d", - "h", - "u", - "p", - "j", - "ö", - "f", - "c", - ], - "Korean": [ - "이", - "다", - "에", - "의", - "는", - "로", - "하", - "을", - "가", - "고", - "지", - "서", - "한", - "은", - "기", - "으", - "년", - "대", - "사", - "시", - "를", - "리", - "도", - "인", - "스", - "일", - ], - "Indonesian": [ - "a", - "n", - "e", - "i", - "r", - "t", - "u", - "s", - "d", - "k", - "m", - "l", - "g", - "p", - "b", - "o", - "h", - "y", - "j", - "c", - "w", - "f", - "v", - "z", - "x", - "q", - ], - "Turkish": [ - "a", - "e", - "i", - "n", - "r", - "l", - "ı", - "k", - "d", - "t", - "s", - "m", - "y", - "u", - "o", - "b", - "ü", - "ş", - "v", - "g", - "z", - "h", - "c", - "p", - "ç", - "ğ", - ], - "Romanian": [ - "e", - "i", - "a", - "r", - "n", - "t", - "u", - "l", - "o", - "c", - "s", - "d", - "p", - "m", - "ă", - "f", - "v", - "î", - "g", - "b", - "ș", - "ț", - "z", - "h", - "â", - "j", - ], - "Farsi": [ - "ا", - "ی", - "ر", - "د", - "ن", - "ه", - "و", - "م", - "ت", - "ب", - "س", - "ل", - "ک", - "ش", - "ز", - "ف", - "گ", - "ع", - "خ", - "ق", - "ج", - "آ", - "پ", - "ح", - "ط", - "ص", - ], - "Arabic": [ - "ا", - "ل", - "ي", - "م", - "و", - "ن", - "ر", - "ت", - "ب", - "ة", - "ع", - "د", - "س", - "ف", - "ه", - "ك", - "ق", - "أ", - "ح", - "ج", - "ش", - "ط", - "ص", - "ى", - "خ", - "إ", - ], - "Danish": [ - "e", - "r", - "n", - "t", - "a", - "i", - "s", - "d", - "l", - "o", - "g", - "m", - "k", - "f", - "v", - "u", - "b", - "h", - "p", - "å", - "y", - "ø", - "æ", - "c", - "j", - "w", - ], - "Serbian": [ - "а", - "и", - "о", - "е", - "н", - "р", - "с", - "у", - "т", - "к", - "ј", - "в", - "д", - "м", - "п", - "л", - "г", - "з", - "б", - "a", - "i", - "e", - "o", - "n", - "ц", - "ш", - ], - "Lithuanian": [ - "i", - "a", - "s", - "o", - "r", - "e", - "t", - "n", - "u", - "k", - "m", - "l", - "p", - "v", - "d", - "j", - "g", - "ė", - "b", - "y", - "ų", - "š", - "ž", - "c", - "ą", - "į", - ], - "Slovene": [ - "e", - "a", - "i", - "o", - "n", - "r", - "s", - "l", - "t", - "j", - "v", - "k", - "d", - "p", - "m", - "u", - "z", - "b", - "g", - "h", - "č", - "c", - "š", - "ž", - "f", - "y", - ], - "Slovak": [ - "o", - "a", - "e", - "n", - "i", - "r", - "v", - "t", - "s", - "l", - "k", - "d", - "m", - "p", - "u", - "c", - "h", - "j", - "b", - "z", - "á", - "y", - "ý", - "í", - "č", - "é", - ], - "Hebrew": [ - "י", - "ו", - "ה", - "ל", - "ר", - "ב", - "ת", - "מ", - "א", - "ש", - "נ", - "ע", - "ם", - "ד", - "ק", - "ח", - "פ", - "ס", - "כ", - "ג", - "ט", - "צ", - "ן", - "ז", - "ך", - ], - "Bulgarian": [ - "а", - "и", - "о", - "е", - "н", - "т", - "р", - "с", - "в", - "л", - "к", - "д", - "п", - "м", - "з", - "г", - "я", - "ъ", - "у", - "б", - "ч", - "ц", - "й", - "ж", - "щ", - "х", - ], - "Croatian": [ - "a", - "i", - "o", - "e", - "n", - "r", - "j", - "s", - "t", - "u", - "k", - "l", - "v", - "d", - "m", - "p", - "g", - "z", - "b", - "c", - "č", - "h", - "š", - "ž", - "ć", - "f", - ], - "Hindi": [ - "क", - "र", - "स", - "न", - "त", - "म", - "ह", - "प", - "य", - "ल", - "व", - "ज", - "द", - "ग", - "ब", - "श", - "ट", - "अ", - "ए", - "थ", - "भ", - "ड", - "च", - "ध", - "ष", - "इ", - ], - "Estonian": [ - "a", - "i", - "e", - "s", - "t", - "l", - "u", - "n", - "o", - "k", - "r", - "d", - "m", - "v", - "g", - "p", - "j", - "h", - "ä", - "b", - "õ", - "ü", - "f", - "c", - "ö", - "y", - ], - "Simple English": [ - "e", - "a", - "t", - "i", - "o", - "n", - "s", - "r", - "h", - "l", - "d", - "c", - "m", - "u", - "f", - "p", - "g", - "w", - "b", - "y", - "v", - "k", - "j", - "x", - "z", - "q", - ], - "Thai": [ - "า", - "น", - "ร", - "อ", - "ก", - "เ", - "ง", - "ม", - "ย", - "ล", - "ว", - "ด", - "ท", - "ส", - "ต", - "ะ", - "ป", - "บ", - "ค", - "ห", - "แ", - "จ", - "พ", - "ช", - "ข", - "ใ", - ], - "Greek": [ - "α", - "τ", - "ο", - "ι", - "ε", - "ν", - "ρ", - "σ", - "κ", - "η", - "π", - "ς", - "υ", - "μ", - "λ", - "ί", - "ό", - "ά", - "γ", - "έ", - "δ", - "ή", - "ω", - "χ", - "θ", - "ύ", - ], - "Tamil": [ - "க", - "த", - "ப", - "ட", - "ர", - "ம", - "ல", - "ன", - "வ", - "ற", - "ய", - "ள", - "ச", - "ந", - "இ", - "ண", - "அ", - "ஆ", - "ழ", - "ங", - "எ", - "உ", - "ஒ", - "ஸ", - ], - "Classical Chinese": [ - "之", - "年", - "為", - "也", - "以", - "一", - "人", - "其", - "者", - "國", - "有", - "二", - "十", - "於", - "曰", - "三", - "不", - "大", - "而", - "子", - "中", - "五", - "四", - ], - "Kazakh": [ - "а", - "ы", - "е", - "н", - "т", - "р", - "л", - "і", - "д", - "с", - "м", - "қ", - "к", - "о", - "б", - "и", - "у", - "ғ", - "ж", - "ң", - "з", - "ш", - "й", - "п", - "г", - "ө", - ], -} diff --git a/.venv/Lib/site-packages/charset_normalizer/assets/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/charset_normalizer/assets/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 422411ee1869c328ab030d701e192efc4923a10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7822 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 List[str]: - """ - Return associated unicode ranges in a single byte code page. - """ - if is_multi_byte_encoding(iana_name): - raise IOError("Function not supported on multi-byte code page") - - decoder = importlib.import_module( - "encodings.{}".format(iana_name) - ).IncrementalDecoder - - p: IncrementalDecoder = decoder(errors="ignore") - seen_ranges: Dict[str, int] = {} - character_count: int = 0 - - for i in range(0x40, 0xFF): - chunk: str = p.decode(bytes([i])) - - if chunk: - character_range: Optional[str] = unicode_range(chunk) - - if character_range is None: - continue - - if is_unicode_range_secondary(character_range) is False: - if character_range not in seen_ranges: - seen_ranges[character_range] = 0 - seen_ranges[character_range] += 1 - character_count += 1 - - return sorted( - [ - character_range - for character_range in seen_ranges - if seen_ranges[character_range] / character_count >= 0.15 - ] - ) - - -def unicode_range_languages(primary_range: str) -> List[str]: - """ - Return inferred languages used with a unicode range. - """ - languages: List[str] = [] - - for language, characters in FREQUENCIES.items(): - for character in characters: - if unicode_range(character) == primary_range: - languages.append(language) - break - - return languages - - -@lru_cache() -def encoding_languages(iana_name: str) -> List[str]: - """ - Single-byte encoding language association. Some code page are heavily linked to particular language(s). - This function does the correspondence. - """ - unicode_ranges: List[str] = encoding_unicode_range(iana_name) - primary_range: Optional[str] = None - - for specified_range in unicode_ranges: - if "Latin" not in specified_range: - primary_range = specified_range - break - - if primary_range is None: - return ["Latin Based"] - - return unicode_range_languages(primary_range) - - -@lru_cache() -def mb_encoding_languages(iana_name: str) -> List[str]: - """ - Multi-byte encoding language association. Some code page are heavily linked to particular language(s). - This function does the correspondence. - """ - if ( - iana_name.startswith("shift_") - or iana_name.startswith("iso2022_jp") - or iana_name.startswith("euc_j") - or iana_name == "cp932" - ): - return ["Japanese"] - if iana_name.startswith("gb") or iana_name in ZH_NAMES: - return ["Chinese", "Classical Chinese"] - if iana_name.startswith("iso2022_kr") or iana_name in KO_NAMES: - return ["Korean"] - - return [] - - -@lru_cache(maxsize=LANGUAGE_SUPPORTED_COUNT) -def get_target_features(language: str) -> Tuple[bool, bool]: - """ - Determine main aspects from a supported language if it contains accents and if is pure Latin. - """ - target_have_accents: bool = False - target_pure_latin: bool = True - - for character in FREQUENCIES[language]: - if not target_have_accents and is_accentuated(character): - target_have_accents = True - if target_pure_latin and is_latin(character) is False: - target_pure_latin = False - - return target_have_accents, target_pure_latin - - -def alphabet_languages( - characters: List[str], ignore_non_latin: bool = False -) -> List[str]: - """ - Return associated languages associated to given characters. - """ - languages: List[Tuple[str, float]] = [] - - source_have_accents = any(is_accentuated(character) for character in characters) - - for language, language_characters in FREQUENCIES.items(): - - target_have_accents, target_pure_latin = get_target_features(language) - - if ignore_non_latin and target_pure_latin is False: - continue - - if target_have_accents is False and source_have_accents: - continue - - character_count: int = len(language_characters) - - character_match_count: int = len( - [c for c in language_characters if c in characters] - ) - - ratio: float = character_match_count / character_count - - if ratio >= 0.2: - languages.append((language, ratio)) - - languages = sorted(languages, key=lambda x: x[1], reverse=True) - - return [compatible_language[0] for compatible_language in languages] - - -def characters_popularity_compare( - language: str, ordered_characters: List[str] -) -> float: - """ - Determine if a ordered characters list (by occurrence from most appearance to rarest) match a particular language. - The result is a ratio between 0. (absolutely no correspondence) and 1. (near perfect fit). - Beware that is function is not strict on the match in order to ease the detection. (Meaning close match is 1.) - """ - if language not in FREQUENCIES: - raise ValueError("{} not available".format(language)) - - character_approved_count: int = 0 - FREQUENCIES_language_set = set(FREQUENCIES[language]) - - for character in ordered_characters: - if character not in FREQUENCIES_language_set: - continue - - characters_before_source: List[str] = FREQUENCIES[language][ - 0 : FREQUENCIES[language].index(character) - ] - characters_after_source: List[str] = FREQUENCIES[language][ - FREQUENCIES[language].index(character) : - ] - characters_before: List[str] = ordered_characters[ - 0 : ordered_characters.index(character) - ] - characters_after: List[str] = ordered_characters[ - ordered_characters.index(character) : - ] - - before_match_count: int = len( - set(characters_before) & set(characters_before_source) - ) - - after_match_count: int = len( - set(characters_after) & set(characters_after_source) - ) - - if len(characters_before_source) == 0 and before_match_count <= 4: - character_approved_count += 1 - continue - - if len(characters_after_source) == 0 and after_match_count <= 4: - character_approved_count += 1 - continue - - if ( - before_match_count / len(characters_before_source) >= 0.4 - or after_match_count / len(characters_after_source) >= 0.4 - ): - character_approved_count += 1 - continue - - return character_approved_count / len(ordered_characters) - - -def alpha_unicode_split(decoded_sequence: str) -> List[str]: - """ - Given a decoded text sequence, return a list of str. Unicode range / alphabet separation. - Ex. a text containing English/Latin with a bit a Hebrew will return two items in the resulting list; - One containing the latin letters and the other hebrew. - """ - layers: Dict[str, str] = {} - - for character in decoded_sequence: - if character.isalpha() is False: - continue - - character_range: Optional[str] = unicode_range(character) - - if character_range is None: - continue - - layer_target_range: Optional[str] = None - - for discovered_range in layers: - if ( - is_suspiciously_successive_range(discovered_range, character_range) - is False - ): - layer_target_range = discovered_range - break - - if layer_target_range is None: - layer_target_range = character_range - - if layer_target_range not in layers: - layers[layer_target_range] = character.lower() - continue - - layers[layer_target_range] += character.lower() - - return list(layers.values()) - - -def merge_coherence_ratios(results: List[CoherenceMatches]) -> CoherenceMatches: - """ - This function merge results previously given by the function coherence_ratio. - The return type is the same as coherence_ratio. - """ - per_language_ratios: Dict[str, List[float]] = {} - for result in results: - for sub_result in result: - language, ratio = sub_result - if language not in per_language_ratios: - per_language_ratios[language] = [ratio] - continue - per_language_ratios[language].append(ratio) - - merge = [ - ( - language, - round( - sum(per_language_ratios[language]) / len(per_language_ratios[language]), - 4, - ), - ) - for language in per_language_ratios - ] - - return sorted(merge, key=lambda x: x[1], reverse=True) - - -@lru_cache(maxsize=2048) -def coherence_ratio( - decoded_sequence: str, threshold: float = 0.1, lg_inclusion: Optional[str] = None -) -> CoherenceMatches: - """ - Detect ANY language that can be identified in given sequence. The sequence will be analysed by layers. - A layer = Character extraction by alphabets/ranges. - """ - - results: List[Tuple[str, float]] = [] - ignore_non_latin: bool = False - - sufficient_match_count: int = 0 - - lg_inclusion_list = lg_inclusion.split(",") if lg_inclusion is not None else [] - if "Latin Based" in lg_inclusion_list: - ignore_non_latin = True - lg_inclusion_list.remove("Latin Based") - - for layer in alpha_unicode_split(decoded_sequence): - sequence_frequencies: TypeCounter[str] = Counter(layer) - most_common = sequence_frequencies.most_common() - - character_count: int = sum(o for c, o in most_common) - - if character_count <= TOO_SMALL_SEQUENCE: - continue - - popular_character_ordered: List[str] = [c for c, o in most_common] - - for language in lg_inclusion_list or alphabet_languages( - popular_character_ordered, ignore_non_latin - ): - ratio: float = characters_popularity_compare( - language, popular_character_ordered - ) - - if ratio < threshold: - continue - elif ratio >= 0.8: - sufficient_match_count += 1 - - results.append((language, round(ratio, 4))) - - if sufficient_match_count >= 3: - break - - return sorted(results, key=lambda x: x[1], reverse=True) diff --git a/.venv/Lib/site-packages/charset_normalizer/cli/__init__.py b/.venv/Lib/site-packages/charset_normalizer/cli/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/Lib/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 29e3c5533b03532124ba6a7bf20b382c62003ac3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmWIL<>g`kfimS}5cL>DAOl7q#{r0oS%5?eLokCTqu)w~B9JhG_?7Bx6%$&VT2vg9 zQJS7#6yuUwoL!P%5R;T&qL7+fkdvROkW#8p0%R7)=#{1BmBsjECdCwImZa(yBqnDk zrl%IiBxfWR6{nWO=j9jWCgx;Tr55QY=Va=~$7kkcmc+;F6;$5hu*uC&Da}c>16ltW Gh#3H32{WJo diff --git a/.venv/Lib/site-packages/charset_normalizer/cli/__pycache__/normalizer.cpython-38.pyc b/.venv/Lib/site-packages/charset_normalizer/cli/__pycache__/normalizer.cpython-38.pyc deleted file mode 100644 index b7b5fe8e27ff673ee2e630ff8ec6b6adad00cd36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6293 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 T#f*}m&7wW_(!@XE bool: - """Ask a yes/no question via input() and return their answer. - - "question" is a string that is presented to the user. - "default" is the presumed answer if the user just hits . - It must be "yes" (the default), "no" or None (meaning - an answer is required of the user). - - The "answer" return value is True for "yes" or False for "no". - - Credit goes to (c) https://stackoverflow.com/questions/3041986/apt-command-line-interface-like-yes-no-input - """ - valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False} - if default is None: - prompt = " [y/n] " - elif default == "yes": - prompt = " [Y/n] " - elif default == "no": - prompt = " [y/N] " - else: - raise ValueError("invalid default answer: '%s'" % default) - - while True: - sys.stdout.write(question + prompt) - choice = input().lower() - if default is not None and choice == "": - return valid[default] - elif choice in valid: - return valid[choice] - else: - sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n") - - -def cli_detect(argv: Optional[List[str]] = None) -> int: - """ - CLI assistant using ARGV and ArgumentParser - :param argv: - :return: 0 if everything is fine, anything else equal trouble - """ - parser = argparse.ArgumentParser( - description="The Real First Universal Charset Detector. " - "Discover originating encoding used on text file. " - "Normalize text to unicode." - ) - - parser.add_argument( - "files", type=argparse.FileType("rb"), nargs="+", help="File(s) to be analysed" - ) - parser.add_argument( - "-v", - "--verbose", - action="store_true", - default=False, - dest="verbose", - help="Display complementary information about file if any. " - "Stdout will contain logs about the detection process.", - ) - parser.add_argument( - "-a", - "--with-alternative", - action="store_true", - default=False, - dest="alternatives", - help="Output complementary possibilities if any. Top-level JSON WILL be a list.", - ) - parser.add_argument( - "-n", - "--normalize", - action="store_true", - default=False, - dest="normalize", - help="Permit to normalize input file. If not set, program does not write anything.", - ) - parser.add_argument( - "-m", - "--minimal", - action="store_true", - default=False, - dest="minimal", - help="Only output the charset detected to STDOUT. Disabling JSON output.", - ) - parser.add_argument( - "-r", - "--replace", - action="store_true", - default=False, - dest="replace", - help="Replace file when trying to normalize it instead of creating a new one.", - ) - parser.add_argument( - "-f", - "--force", - action="store_true", - default=False, - dest="force", - help="Replace file without asking if you are sure, use this flag with caution.", - ) - parser.add_argument( - "-t", - "--threshold", - action="store", - default=0.2, - type=float, - dest="threshold", - help="Define a custom maximum amount of chaos allowed in decoded content. 0. <= chaos <= 1.", - ) - parser.add_argument( - "--version", - action="version", - version="Charset-Normalizer {} - Python {} - Unicode {}".format( - __version__, python_version(), unidata_version - ), - help="Show version information and exit.", - ) - - args = parser.parse_args(argv) - - if args.replace is True and args.normalize is False: - print("Use --replace in addition of --normalize only.", file=sys.stderr) - return 1 - - if args.force is True and args.replace is False: - print("Use --force in addition of --replace only.", file=sys.stderr) - return 1 - - if args.threshold < 0.0 or args.threshold > 1.0: - print("--threshold VALUE should be between 0. AND 1.", file=sys.stderr) - return 1 - - x_ = [] - - for my_file in args.files: - - matches = from_fp(my_file, threshold=args.threshold, explain=args.verbose) - - best_guess = matches.best() - - if best_guess is None: - print( - 'Unable to identify originating encoding for "{}". {}'.format( - my_file.name, - "Maybe try increasing maximum amount of chaos." - if args.threshold < 1.0 - else "", - ), - file=sys.stderr, - ) - x_.append( - CliDetectionResult( - abspath(my_file.name), - None, - [], - [], - "Unknown", - [], - False, - 1.0, - 0.0, - None, - True, - ) - ) - else: - x_.append( - CliDetectionResult( - abspath(my_file.name), - best_guess.encoding, - best_guess.encoding_aliases, - [ - cp - for cp in best_guess.could_be_from_charset - if cp != best_guess.encoding - ], - best_guess.language, - best_guess.alphabets, - best_guess.bom, - best_guess.percent_chaos, - best_guess.percent_coherence, - None, - True, - ) - ) - - if len(matches) > 1 and args.alternatives: - for el in matches: - if el != best_guess: - x_.append( - CliDetectionResult( - abspath(my_file.name), - el.encoding, - el.encoding_aliases, - [ - cp - for cp in el.could_be_from_charset - if cp != el.encoding - ], - el.language, - el.alphabets, - el.bom, - el.percent_chaos, - el.percent_coherence, - None, - False, - ) - ) - - if args.normalize is True: - - if best_guess.encoding.startswith("utf") is True: - print( - '"{}" file does not need to be normalized, as it already came from unicode.'.format( - my_file.name - ), - file=sys.stderr, - ) - if my_file.closed is False: - my_file.close() - continue - - o_: List[str] = my_file.name.split(".") - - if args.replace is False: - o_.insert(-1, best_guess.encoding) - if my_file.closed is False: - my_file.close() - elif ( - args.force is False - and query_yes_no( - 'Are you sure to normalize "{}" by replacing it ?'.format( - my_file.name - ), - "no", - ) - is False - ): - if my_file.closed is False: - my_file.close() - continue - - try: - x_[0].unicode_path = abspath("./{}".format(".".join(o_))) - - with open(x_[0].unicode_path, "w", encoding="utf-8") as fp: - fp.write(str(best_guess)) - except IOError as e: - print(str(e), file=sys.stderr) - if my_file.closed is False: - my_file.close() - return 2 - - if my_file.closed is False: - my_file.close() - - if args.minimal is False: - print( - dumps( - [el.__dict__ for el in x_] if len(x_) > 1 else x_[0].__dict__, - ensure_ascii=True, - indent=4, - ) - ) - else: - for my_file in args.files: - print( - ", ".join( - [ - el.encoding or "undefined" - for el in x_ - if el.path == abspath(my_file.name) - ] - ) - ) - - return 0 - - -if __name__ == "__main__": - cli_detect() diff --git a/.venv/Lib/site-packages/charset_normalizer/constant.py b/.venv/Lib/site-packages/charset_normalizer/constant.py deleted file mode 100644 index ac840c4..0000000 --- a/.venv/Lib/site-packages/charset_normalizer/constant.py +++ /dev/null @@ -1,497 +0,0 @@ -from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE -from encodings.aliases import aliases -from re import IGNORECASE, compile as re_compile -from typing import Dict, List, Set, Union - -from .assets import FREQUENCIES - -# Contain for each eligible encoding a list of/item bytes SIG/BOM -ENCODING_MARKS: Dict[str, Union[bytes, List[bytes]]] = { - "utf_8": BOM_UTF8, - "utf_7": [ - b"\x2b\x2f\x76\x38", - b"\x2b\x2f\x76\x39", - b"\x2b\x2f\x76\x2b", - b"\x2b\x2f\x76\x2f", - b"\x2b\x2f\x76\x38\x2d", - ], - "gb18030": b"\x84\x31\x95\x33", - "utf_32": [BOM_UTF32_BE, BOM_UTF32_LE], - "utf_16": [BOM_UTF16_BE, BOM_UTF16_LE], -} - -TOO_SMALL_SEQUENCE: int = 32 -TOO_BIG_SEQUENCE: int = int(10e6) - -UTF8_MAXIMAL_ALLOCATION: int = 1112064 - -UNICODE_RANGES_COMBINED: Dict[str, range] = { - "Control character": range(31 + 1), - "Basic Latin": range(32, 127 + 1), - "Latin-1 Supplement": range(128, 255 + 1), - "Latin Extended-A": range(256, 383 + 1), - "Latin Extended-B": range(384, 591 + 1), - "IPA Extensions": range(592, 687 + 1), - "Spacing Modifier Letters": range(688, 767 + 1), - "Combining Diacritical Marks": range(768, 879 + 1), - "Greek and Coptic": range(880, 1023 + 1), - "Cyrillic": range(1024, 1279 + 1), - "Cyrillic Supplement": range(1280, 1327 + 1), - "Armenian": range(1328, 1423 + 1), - "Hebrew": range(1424, 1535 + 1), - "Arabic": range(1536, 1791 + 1), - "Syriac": range(1792, 1871 + 1), - "Arabic Supplement": range(1872, 1919 + 1), - "Thaana": range(1920, 1983 + 1), - "NKo": range(1984, 2047 + 1), - "Samaritan": range(2048, 2111 + 1), - "Mandaic": range(2112, 2143 + 1), - "Syriac Supplement": range(2144, 2159 + 1), - "Arabic Extended-A": range(2208, 2303 + 1), - "Devanagari": range(2304, 2431 + 1), - "Bengali": range(2432, 2559 + 1), - "Gurmukhi": range(2560, 2687 + 1), - "Gujarati": range(2688, 2815 + 1), - "Oriya": range(2816, 2943 + 1), - "Tamil": range(2944, 3071 + 1), - "Telugu": range(3072, 3199 + 1), - "Kannada": range(3200, 3327 + 1), - "Malayalam": range(3328, 3455 + 1), - "Sinhala": range(3456, 3583 + 1), - "Thai": range(3584, 3711 + 1), - "Lao": range(3712, 3839 + 1), - "Tibetan": range(3840, 4095 + 1), - "Myanmar": range(4096, 4255 + 1), - "Georgian": range(4256, 4351 + 1), - "Hangul Jamo": range(4352, 4607 + 1), - "Ethiopic": range(4608, 4991 + 1), - "Ethiopic Supplement": range(4992, 5023 + 1), - "Cherokee": range(5024, 5119 + 1), - "Unified Canadian Aboriginal Syllabics": range(5120, 5759 + 1), - "Ogham": range(5760, 5791 + 1), - "Runic": range(5792, 5887 + 1), - "Tagalog": range(5888, 5919 + 1), - "Hanunoo": range(5920, 5951 + 1), - "Buhid": range(5952, 5983 + 1), - "Tagbanwa": range(5984, 6015 + 1), - "Khmer": range(6016, 6143 + 1), - "Mongolian": range(6144, 6319 + 1), - "Unified Canadian Aboriginal Syllabics Extended": range(6320, 6399 + 1), - "Limbu": range(6400, 6479 + 1), - "Tai Le": range(6480, 6527 + 1), - "New Tai Lue": range(6528, 6623 + 1), - "Khmer Symbols": range(6624, 6655 + 1), - "Buginese": range(6656, 6687 + 1), - "Tai Tham": range(6688, 6831 + 1), - "Combining Diacritical Marks Extended": range(6832, 6911 + 1), - "Balinese": range(6912, 7039 + 1), - "Sundanese": range(7040, 7103 + 1), - "Batak": range(7104, 7167 + 1), - "Lepcha": range(7168, 7247 + 1), - "Ol Chiki": range(7248, 7295 + 1), - "Cyrillic Extended C": range(7296, 7311 + 1), - "Sundanese Supplement": range(7360, 7375 + 1), - "Vedic Extensions": range(7376, 7423 + 1), - "Phonetic Extensions": range(7424, 7551 + 1), - "Phonetic Extensions Supplement": range(7552, 7615 + 1), - "Combining Diacritical Marks Supplement": range(7616, 7679 + 1), - "Latin Extended Additional": range(7680, 7935 + 1), - "Greek Extended": range(7936, 8191 + 1), - "General Punctuation": range(8192, 8303 + 1), - "Superscripts and Subscripts": range(8304, 8351 + 1), - "Currency Symbols": range(8352, 8399 + 1), - "Combining Diacritical Marks for Symbols": range(8400, 8447 + 1), - "Letterlike Symbols": range(8448, 8527 + 1), - "Number Forms": range(8528, 8591 + 1), - "Arrows": range(8592, 8703 + 1), - "Mathematical Operators": range(8704, 8959 + 1), - "Miscellaneous Technical": range(8960, 9215 + 1), - "Control Pictures": range(9216, 9279 + 1), - "Optical Character Recognition": range(9280, 9311 + 1), - "Enclosed Alphanumerics": range(9312, 9471 + 1), - "Box Drawing": range(9472, 9599 + 1), - "Block Elements": range(9600, 9631 + 1), - "Geometric Shapes": range(9632, 9727 + 1), - "Miscellaneous Symbols": range(9728, 9983 + 1), - "Dingbats": range(9984, 10175 + 1), - "Miscellaneous Mathematical Symbols-A": range(10176, 10223 + 1), - "Supplemental Arrows-A": range(10224, 10239 + 1), - "Braille Patterns": range(10240, 10495 + 1), - "Supplemental Arrows-B": range(10496, 10623 + 1), - "Miscellaneous Mathematical Symbols-B": range(10624, 10751 + 1), - "Supplemental Mathematical Operators": range(10752, 11007 + 1), - "Miscellaneous Symbols and Arrows": range(11008, 11263 + 1), - "Glagolitic": range(11264, 11359 + 1), - "Latin Extended-C": range(11360, 11391 + 1), - "Coptic": range(11392, 11519 + 1), - "Georgian Supplement": range(11520, 11567 + 1), - "Tifinagh": range(11568, 11647 + 1), - "Ethiopic Extended": range(11648, 11743 + 1), - "Cyrillic Extended-A": range(11744, 11775 + 1), - "Supplemental Punctuation": range(11776, 11903 + 1), - "CJK Radicals Supplement": range(11904, 12031 + 1), - "Kangxi Radicals": range(12032, 12255 + 1), - "Ideographic Description Characters": range(12272, 12287 + 1), - "CJK Symbols and Punctuation": range(12288, 12351 + 1), - "Hiragana": range(12352, 12447 + 1), - "Katakana": range(12448, 12543 + 1), - "Bopomofo": range(12544, 12591 + 1), - "Hangul Compatibility Jamo": range(12592, 12687 + 1), - "Kanbun": range(12688, 12703 + 1), - "Bopomofo Extended": range(12704, 12735 + 1), - "CJK Strokes": range(12736, 12783 + 1), - "Katakana Phonetic Extensions": range(12784, 12799 + 1), - "Enclosed CJK Letters and Months": range(12800, 13055 + 1), - "CJK Compatibility": range(13056, 13311 + 1), - "CJK Unified Ideographs Extension A": range(13312, 19903 + 1), - "Yijing Hexagram Symbols": range(19904, 19967 + 1), - "CJK Unified Ideographs": range(19968, 40959 + 1), - "Yi Syllables": range(40960, 42127 + 1), - "Yi Radicals": range(42128, 42191 + 1), - "Lisu": range(42192, 42239 + 1), - "Vai": range(42240, 42559 + 1), - "Cyrillic Extended-B": range(42560, 42655 + 1), - "Bamum": range(42656, 42751 + 1), - "Modifier Tone Letters": range(42752, 42783 + 1), - "Latin Extended-D": range(42784, 43007 + 1), - "Syloti Nagri": range(43008, 43055 + 1), - "Common Indic Number Forms": range(43056, 43071 + 1), - "Phags-pa": range(43072, 43135 + 1), - "Saurashtra": range(43136, 43231 + 1), - "Devanagari Extended": range(43232, 43263 + 1), - "Kayah Li": range(43264, 43311 + 1), - "Rejang": range(43312, 43359 + 1), - "Hangul Jamo Extended-A": range(43360, 43391 + 1), - "Javanese": range(43392, 43487 + 1), - "Myanmar Extended-B": range(43488, 43519 + 1), - "Cham": range(43520, 43615 + 1), - "Myanmar Extended-A": range(43616, 43647 + 1), - "Tai Viet": range(43648, 43743 + 1), - "Meetei Mayek Extensions": range(43744, 43775 + 1), - "Ethiopic Extended-A": range(43776, 43823 + 1), - "Latin Extended-E": range(43824, 43887 + 1), - "Cherokee Supplement": range(43888, 43967 + 1), - "Meetei Mayek": range(43968, 44031 + 1), - "Hangul Syllables": range(44032, 55215 + 1), - "Hangul Jamo Extended-B": range(55216, 55295 + 1), - "High Surrogates": range(55296, 56191 + 1), - "High Private Use Surrogates": range(56192, 56319 + 1), - "Low Surrogates": range(56320, 57343 + 1), - "Private Use Area": range(57344, 63743 + 1), - "CJK Compatibility Ideographs": range(63744, 64255 + 1), - "Alphabetic Presentation Forms": range(64256, 64335 + 1), - "Arabic Presentation Forms-A": range(64336, 65023 + 1), - "Variation Selectors": range(65024, 65039 + 1), - "Vertical Forms": range(65040, 65055 + 1), - "Combining Half Marks": range(65056, 65071 + 1), - "CJK Compatibility Forms": range(65072, 65103 + 1), - "Small Form Variants": range(65104, 65135 + 1), - "Arabic Presentation Forms-B": range(65136, 65279 + 1), - "Halfwidth and Fullwidth Forms": range(65280, 65519 + 1), - "Specials": range(65520, 65535 + 1), - "Linear B Syllabary": range(65536, 65663 + 1), - "Linear B Ideograms": range(65664, 65791 + 1), - "Aegean Numbers": range(65792, 65855 + 1), - "Ancient Greek Numbers": range(65856, 65935 + 1), - "Ancient Symbols": range(65936, 65999 + 1), - "Phaistos Disc": range(66000, 66047 + 1), - "Lycian": range(66176, 66207 + 1), - "Carian": range(66208, 66271 + 1), - "Coptic Epact Numbers": range(66272, 66303 + 1), - "Old Italic": range(66304, 66351 + 1), - "Gothic": range(66352, 66383 + 1), - "Old Permic": range(66384, 66431 + 1), - "Ugaritic": range(66432, 66463 + 1), - "Old Persian": range(66464, 66527 + 1), - "Deseret": range(66560, 66639 + 1), - "Shavian": range(66640, 66687 + 1), - "Osmanya": range(66688, 66735 + 1), - "Osage": range(66736, 66815 + 1), - "Elbasan": range(66816, 66863 + 1), - "Caucasian Albanian": range(66864, 66927 + 1), - "Linear A": range(67072, 67455 + 1), - "Cypriot Syllabary": range(67584, 67647 + 1), - "Imperial Aramaic": range(67648, 67679 + 1), - "Palmyrene": range(67680, 67711 + 1), - "Nabataean": range(67712, 67759 + 1), - "Hatran": range(67808, 67839 + 1), - "Phoenician": range(67840, 67871 + 1), - "Lydian": range(67872, 67903 + 1), - "Meroitic Hieroglyphs": range(67968, 67999 + 1), - "Meroitic Cursive": range(68000, 68095 + 1), - "Kharoshthi": range(68096, 68191 + 1), - "Old South Arabian": range(68192, 68223 + 1), - "Old North Arabian": range(68224, 68255 + 1), - "Manichaean": range(68288, 68351 + 1), - "Avestan": range(68352, 68415 + 1), - "Inscriptional Parthian": range(68416, 68447 + 1), - "Inscriptional Pahlavi": range(68448, 68479 + 1), - "Psalter Pahlavi": range(68480, 68527 + 1), - "Old Turkic": range(68608, 68687 + 1), - "Old Hungarian": range(68736, 68863 + 1), - "Rumi Numeral Symbols": range(69216, 69247 + 1), - "Brahmi": range(69632, 69759 + 1), - "Kaithi": range(69760, 69839 + 1), - "Sora Sompeng": range(69840, 69887 + 1), - "Chakma": range(69888, 69967 + 1), - "Mahajani": range(69968, 70015 + 1), - "Sharada": range(70016, 70111 + 1), - "Sinhala Archaic Numbers": range(70112, 70143 + 1), - "Khojki": range(70144, 70223 + 1), - "Multani": range(70272, 70319 + 1), - "Khudawadi": range(70320, 70399 + 1), - "Grantha": range(70400, 70527 + 1), - "Newa": range(70656, 70783 + 1), - "Tirhuta": range(70784, 70879 + 1), - "Siddham": range(71040, 71167 + 1), - "Modi": range(71168, 71263 + 1), - "Mongolian Supplement": range(71264, 71295 + 1), - "Takri": range(71296, 71375 + 1), - "Ahom": range(71424, 71487 + 1), - "Warang Citi": range(71840, 71935 + 1), - "Zanabazar Square": range(72192, 72271 + 1), - "Soyombo": range(72272, 72367 + 1), - "Pau Cin Hau": range(72384, 72447 + 1), - "Bhaiksuki": range(72704, 72815 + 1), - "Marchen": range(72816, 72895 + 1), - "Masaram Gondi": range(72960, 73055 + 1), - "Cuneiform": range(73728, 74751 + 1), - "Cuneiform Numbers and Punctuation": range(74752, 74879 + 1), - "Early Dynastic Cuneiform": range(74880, 75087 + 1), - "Egyptian Hieroglyphs": range(77824, 78895 + 1), - "Anatolian Hieroglyphs": range(82944, 83583 + 1), - "Bamum Supplement": range(92160, 92735 + 1), - "Mro": range(92736, 92783 + 1), - "Bassa Vah": range(92880, 92927 + 1), - "Pahawh Hmong": range(92928, 93071 + 1), - "Miao": range(93952, 94111 + 1), - "Ideographic Symbols and Punctuation": range(94176, 94207 + 1), - "Tangut": range(94208, 100351 + 1), - "Tangut Components": range(100352, 101119 + 1), - "Kana Supplement": range(110592, 110847 + 1), - "Kana Extended-A": range(110848, 110895 + 1), - "Nushu": range(110960, 111359 + 1), - "Duployan": range(113664, 113823 + 1), - "Shorthand Format Controls": range(113824, 113839 + 1), - "Byzantine Musical Symbols": range(118784, 119039 + 1), - "Musical Symbols": range(119040, 119295 + 1), - "Ancient Greek Musical Notation": range(119296, 119375 + 1), - "Tai Xuan Jing Symbols": range(119552, 119647 + 1), - "Counting Rod Numerals": range(119648, 119679 + 1), - "Mathematical Alphanumeric Symbols": range(119808, 120831 + 1), - "Sutton SignWriting": range(120832, 121519 + 1), - "Glagolitic Supplement": range(122880, 122927 + 1), - "Mende Kikakui": range(124928, 125151 + 1), - "Adlam": range(125184, 125279 + 1), - "Arabic Mathematical Alphabetic Symbols": range(126464, 126719 + 1), - "Mahjong Tiles": range(126976, 127023 + 1), - "Domino Tiles": range(127024, 127135 + 1), - "Playing Cards": range(127136, 127231 + 1), - "Enclosed Alphanumeric Supplement": range(127232, 127487 + 1), - "Enclosed Ideographic Supplement": range(127488, 127743 + 1), - "Miscellaneous Symbols and Pictographs": range(127744, 128511 + 1), - "Emoticons range(Emoji)": range(128512, 128591 + 1), - "Ornamental Dingbats": range(128592, 128639 + 1), - "Transport and Map Symbols": range(128640, 128767 + 1), - "Alchemical Symbols": range(128768, 128895 + 1), - "Geometric Shapes Extended": range(128896, 129023 + 1), - "Supplemental Arrows-C": range(129024, 129279 + 1), - "Supplemental Symbols and Pictographs": range(129280, 129535 + 1), - "CJK Unified Ideographs Extension B": range(131072, 173791 + 1), - "CJK Unified Ideographs Extension C": range(173824, 177983 + 1), - "CJK Unified Ideographs Extension D": range(177984, 178207 + 1), - "CJK Unified Ideographs Extension E": range(178208, 183983 + 1), - "CJK Unified Ideographs Extension F": range(183984, 191471 + 1), - "CJK Compatibility Ideographs Supplement": range(194560, 195103 + 1), - "Tags": range(917504, 917631 + 1), - "Variation Selectors Supplement": range(917760, 917999 + 1), -} - - -UNICODE_SECONDARY_RANGE_KEYWORD: List[str] = [ - "Supplement", - "Extended", - "Extensions", - "Modifier", - "Marks", - "Punctuation", - "Symbols", - "Forms", - "Operators", - "Miscellaneous", - "Drawing", - "Block", - "Shapes", - "Supplemental", - "Tags", -] - -RE_POSSIBLE_ENCODING_INDICATION = re_compile( - r"(?:(?:encoding)|(?:charset)|(?:coding))(?:[\:= ]{1,10})(?:[\"\']?)([a-zA-Z0-9\-_]+)(?:[\"\']?)", - IGNORECASE, -) - -IANA_SUPPORTED: List[str] = sorted( - filter( - lambda x: x.endswith("_codec") is False - and x not in {"rot_13", "tactis", "mbcs"}, - list(set(aliases.values())), - ) -) - -IANA_SUPPORTED_COUNT: int = len(IANA_SUPPORTED) - -# pre-computed code page that are similar using the function cp_similarity. -IANA_SUPPORTED_SIMILAR: Dict[str, List[str]] = { - "cp037": ["cp1026", "cp1140", "cp273", "cp500"], - "cp1026": ["cp037", "cp1140", "cp273", "cp500"], - "cp1125": ["cp866"], - "cp1140": ["cp037", "cp1026", "cp273", "cp500"], - "cp1250": ["iso8859_2"], - "cp1251": ["kz1048", "ptcp154"], - "cp1252": ["iso8859_15", "iso8859_9", "latin_1"], - "cp1253": ["iso8859_7"], - "cp1254": ["iso8859_15", "iso8859_9", "latin_1"], - "cp1257": ["iso8859_13"], - "cp273": ["cp037", "cp1026", "cp1140", "cp500"], - "cp437": ["cp850", "cp858", "cp860", "cp861", "cp862", "cp863", "cp865"], - "cp500": ["cp037", "cp1026", "cp1140", "cp273"], - "cp850": ["cp437", "cp857", "cp858", "cp865"], - "cp857": ["cp850", "cp858", "cp865"], - "cp858": ["cp437", "cp850", "cp857", "cp865"], - "cp860": ["cp437", "cp861", "cp862", "cp863", "cp865"], - "cp861": ["cp437", "cp860", "cp862", "cp863", "cp865"], - "cp862": ["cp437", "cp860", "cp861", "cp863", "cp865"], - "cp863": ["cp437", "cp860", "cp861", "cp862", "cp865"], - "cp865": ["cp437", "cp850", "cp857", "cp858", "cp860", "cp861", "cp862", "cp863"], - "cp866": ["cp1125"], - "iso8859_10": ["iso8859_14", "iso8859_15", "iso8859_4", "iso8859_9", "latin_1"], - "iso8859_11": ["tis_620"], - "iso8859_13": ["cp1257"], - "iso8859_14": [ - "iso8859_10", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_9", - "latin_1", - ], - "iso8859_15": [ - "cp1252", - "cp1254", - "iso8859_10", - "iso8859_14", - "iso8859_16", - "iso8859_3", - "iso8859_9", - "latin_1", - ], - "iso8859_16": [ - "iso8859_14", - "iso8859_15", - "iso8859_2", - "iso8859_3", - "iso8859_9", - "latin_1", - ], - "iso8859_2": ["cp1250", "iso8859_16", "iso8859_4"], - "iso8859_3": ["iso8859_14", "iso8859_15", "iso8859_16", "iso8859_9", "latin_1"], - "iso8859_4": ["iso8859_10", "iso8859_2", "iso8859_9", "latin_1"], - "iso8859_7": ["cp1253"], - "iso8859_9": [ - "cp1252", - "cp1254", - "cp1258", - "iso8859_10", - "iso8859_14", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_4", - "latin_1", - ], - "kz1048": ["cp1251", "ptcp154"], - "latin_1": [ - "cp1252", - "cp1254", - "cp1258", - "iso8859_10", - "iso8859_14", - "iso8859_15", - "iso8859_16", - "iso8859_3", - "iso8859_4", - "iso8859_9", - ], - "mac_iceland": ["mac_roman", "mac_turkish"], - "mac_roman": ["mac_iceland", "mac_turkish"], - "mac_turkish": ["mac_iceland", "mac_roman"], - "ptcp154": ["cp1251", "kz1048"], - "tis_620": ["iso8859_11"], -} - - -CHARDET_CORRESPONDENCE: Dict[str, str] = { - "iso2022_kr": "ISO-2022-KR", - "iso2022_jp": "ISO-2022-JP", - "euc_kr": "EUC-KR", - "tis_620": "TIS-620", - "utf_32": "UTF-32", - "euc_jp": "EUC-JP", - "koi8_r": "KOI8-R", - "iso8859_1": "ISO-8859-1", - "iso8859_2": "ISO-8859-2", - "iso8859_5": "ISO-8859-5", - "iso8859_6": "ISO-8859-6", - "iso8859_7": "ISO-8859-7", - "iso8859_8": "ISO-8859-8", - "utf_16": "UTF-16", - "cp855": "IBM855", - "mac_cyrillic": "MacCyrillic", - "gb2312": "GB2312", - "gb18030": "GB18030", - "cp932": "CP932", - "cp866": "IBM866", - "utf_8": "utf-8", - "utf_8_sig": "UTF-8-SIG", - "shift_jis": "SHIFT_JIS", - "big5": "Big5", - "cp1250": "windows-1250", - "cp1251": "windows-1251", - "cp1252": "Windows-1252", - "cp1253": "windows-1253", - "cp1255": "windows-1255", - "cp1256": "windows-1256", - "cp1254": "Windows-1254", - "cp949": "CP949", -} - - -COMMON_SAFE_ASCII_CHARACTERS: Set[str] = { - "<", - ">", - "=", - ":", - "/", - "&", - ";", - "{", - "}", - "[", - "]", - ",", - "|", - '"', - "-", -} - - -KO_NAMES: Set[str] = {"johab", "cp949", "euc_kr"} -ZH_NAMES: Set[str] = {"big5", "cp950", "big5hkscs", "hz"} - -NOT_PRINTABLE_PATTERN = re_compile(r"[0-9\W\n\r\t]+") - -LANGUAGE_SUPPORTED_COUNT: int = len(FREQUENCIES) - -# Logging LEVEL bellow DEBUG -TRACE: int = 5 diff --git a/.venv/Lib/site-packages/charset_normalizer/legacy.py b/.venv/Lib/site-packages/charset_normalizer/legacy.py deleted file mode 100644 index cdebe2b..0000000 --- a/.venv/Lib/site-packages/charset_normalizer/legacy.py +++ /dev/null @@ -1,95 +0,0 @@ -import warnings -from typing import Dict, Optional, Union - -from .api import from_bytes, from_fp, from_path, normalize -from .constant import CHARDET_CORRESPONDENCE -from .models import CharsetMatch, CharsetMatches - - -def detect(byte_str: bytes) -> Dict[str, Optional[Union[str, float]]]: - """ - chardet legacy method - Detect the encoding of the given byte string. It should be mostly backward-compatible. - Encoding name will match Chardet own writing whenever possible. (Not on encoding name unsupported by it) - This function is deprecated and should be used to migrate your project easily, consult the documentation for - further information. Not planned for removal. - - :param byte_str: The byte sequence to examine. - """ - if not isinstance(byte_str, (bytearray, bytes)): - raise TypeError( # pragma: nocover - "Expected object of type bytes or bytearray, got: " - "{0}".format(type(byte_str)) - ) - - if isinstance(byte_str, bytearray): - byte_str = bytes(byte_str) - - r = from_bytes(byte_str).best() - - encoding = r.encoding if r is not None else None - language = r.language if r is not None and r.language != "Unknown" else "" - confidence = 1.0 - r.chaos if r is not None else None - - # Note: CharsetNormalizer does not return 'UTF-8-SIG' as the sig get stripped in the detection/normalization process - # but chardet does return 'utf-8-sig' and it is a valid codec name. - if r is not None and encoding == "utf_8" and r.bom: - encoding += "_sig" - - return { - "encoding": encoding - if encoding not in CHARDET_CORRESPONDENCE - else CHARDET_CORRESPONDENCE[encoding], - "language": language, - "confidence": confidence, - } - - -class CharsetNormalizerMatch(CharsetMatch): - pass - - -class CharsetNormalizerMatches(CharsetMatches): - @staticmethod - def from_fp(*args, **kwargs): # type: ignore - warnings.warn( # pragma: nocover - "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " - "and scheduled to be removed in 3.0", - DeprecationWarning, - ) - return from_fp(*args, **kwargs) # pragma: nocover - - @staticmethod - def from_bytes(*args, **kwargs): # type: ignore - warnings.warn( # pragma: nocover - "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " - "and scheduled to be removed in 3.0", - DeprecationWarning, - ) - return from_bytes(*args, **kwargs) # pragma: nocover - - @staticmethod - def from_path(*args, **kwargs): # type: ignore - warnings.warn( # pragma: nocover - "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " - "and scheduled to be removed in 3.0", - DeprecationWarning, - ) - return from_path(*args, **kwargs) # pragma: nocover - - @staticmethod - def normalize(*args, **kwargs): # type: ignore - warnings.warn( # pragma: nocover - "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " - "and scheduled to be removed in 3.0", - DeprecationWarning, - ) - return normalize(*args, **kwargs) # pragma: nocover - - -class CharsetDetector(CharsetNormalizerMatches): - pass - - -class CharsetDoctor(CharsetNormalizerMatches): - pass diff --git a/.venv/Lib/site-packages/charset_normalizer/md.py b/.venv/Lib/site-packages/charset_normalizer/md.py deleted file mode 100644 index 31808af..0000000 --- a/.venv/Lib/site-packages/charset_normalizer/md.py +++ /dev/null @@ -1,553 +0,0 @@ -from functools import lru_cache -from typing import List, Optional - -from .constant import COMMON_SAFE_ASCII_CHARACTERS, UNICODE_SECONDARY_RANGE_KEYWORD -from .utils import ( - is_accentuated, - is_ascii, - is_case_variable, - is_cjk, - is_emoticon, - is_hangul, - is_hiragana, - is_katakana, - is_latin, - is_punctuation, - is_separator, - is_symbol, - is_thai, - is_unprintable, - remove_accent, - unicode_range, -) - - -class MessDetectorPlugin: - """ - Base abstract class used for mess detection plugins. - All detectors MUST extend and implement given methods. - """ - - def eligible(self, character: str) -> bool: - """ - Determine if given character should be fed in. - """ - raise NotImplementedError # pragma: nocover - - def feed(self, character: str) -> None: - """ - The main routine to be executed upon character. - Insert the logic in witch the text would be considered chaotic. - """ - raise NotImplementedError # pragma: nocover - - def reset(self) -> None: # pragma: no cover - """ - Permit to reset the plugin to the initial state. - """ - raise NotImplementedError - - @property - def ratio(self) -> float: - """ - Compute the chaos ratio based on what your feed() has seen. - Must NOT be lower than 0.; No restriction gt 0. - """ - raise NotImplementedError # pragma: nocover - - -class TooManySymbolOrPunctuationPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._punctuation_count: int = 0 - self._symbol_count: int = 0 - self._character_count: int = 0 - - self._last_printable_char: Optional[str] = None - self._frenzy_symbol_in_word: bool = False - - def eligible(self, character: str) -> bool: - return character.isprintable() - - def feed(self, character: str) -> None: - self._character_count += 1 - - if ( - character != self._last_printable_char - and character not in COMMON_SAFE_ASCII_CHARACTERS - ): - if is_punctuation(character): - self._punctuation_count += 1 - elif ( - character.isdigit() is False - and is_symbol(character) - and is_emoticon(character) is False - ): - self._symbol_count += 2 - - self._last_printable_char = character - - def reset(self) -> None: # pragma: no cover - self._punctuation_count = 0 - self._character_count = 0 - self._symbol_count = 0 - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - ratio_of_punctuation: float = ( - self._punctuation_count + self._symbol_count - ) / self._character_count - - return ratio_of_punctuation if ratio_of_punctuation >= 0.3 else 0.0 - - -class TooManyAccentuatedPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._character_count: int = 0 - self._accentuated_count: int = 0 - - def eligible(self, character: str) -> bool: - return character.isalpha() - - def feed(self, character: str) -> None: - self._character_count += 1 - - if is_accentuated(character): - self._accentuated_count += 1 - - def reset(self) -> None: # pragma: no cover - self._character_count = 0 - self._accentuated_count = 0 - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - ratio_of_accentuation: float = self._accentuated_count / self._character_count - return ratio_of_accentuation if ratio_of_accentuation >= 0.35 else 0.0 - - -class UnprintablePlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._unprintable_count: int = 0 - self._character_count: int = 0 - - def eligible(self, character: str) -> bool: - return True - - def feed(self, character: str) -> None: - if is_unprintable(character): - self._unprintable_count += 1 - self._character_count += 1 - - def reset(self) -> None: # pragma: no cover - self._unprintable_count = 0 - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - return (self._unprintable_count * 8) / self._character_count - - -class SuspiciousDuplicateAccentPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._successive_count: int = 0 - self._character_count: int = 0 - - self._last_latin_character: Optional[str] = None - - def eligible(self, character: str) -> bool: - return character.isalpha() and is_latin(character) - - def feed(self, character: str) -> None: - self._character_count += 1 - if ( - self._last_latin_character is not None - and is_accentuated(character) - and is_accentuated(self._last_latin_character) - ): - if character.isupper() and self._last_latin_character.isupper(): - self._successive_count += 1 - # Worse if its the same char duplicated with different accent. - if remove_accent(character) == remove_accent(self._last_latin_character): - self._successive_count += 1 - self._last_latin_character = character - - def reset(self) -> None: # pragma: no cover - self._successive_count = 0 - self._character_count = 0 - self._last_latin_character = None - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - return (self._successive_count * 2) / self._character_count - - -class SuspiciousRange(MessDetectorPlugin): - def __init__(self) -> None: - self._suspicious_successive_range_count: int = 0 - self._character_count: int = 0 - self._last_printable_seen: Optional[str] = None - - def eligible(self, character: str) -> bool: - return character.isprintable() - - def feed(self, character: str) -> None: - self._character_count += 1 - - if ( - character.isspace() - or is_punctuation(character) - or character in COMMON_SAFE_ASCII_CHARACTERS - ): - self._last_printable_seen = None - return - - if self._last_printable_seen is None: - self._last_printable_seen = character - return - - unicode_range_a: Optional[str] = unicode_range(self._last_printable_seen) - unicode_range_b: Optional[str] = unicode_range(character) - - if is_suspiciously_successive_range(unicode_range_a, unicode_range_b): - self._suspicious_successive_range_count += 1 - - self._last_printable_seen = character - - def reset(self) -> None: # pragma: no cover - self._character_count = 0 - self._suspicious_successive_range_count = 0 - self._last_printable_seen = None - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - ratio_of_suspicious_range_usage: float = ( - self._suspicious_successive_range_count * 2 - ) / self._character_count - - if ratio_of_suspicious_range_usage < 0.1: - return 0.0 - - return ratio_of_suspicious_range_usage - - -class SuperWeirdWordPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._word_count: int = 0 - self._bad_word_count: int = 0 - self._foreign_long_count: int = 0 - - self._is_current_word_bad: bool = False - self._foreign_long_watch: bool = False - - self._character_count: int = 0 - self._bad_character_count: int = 0 - - self._buffer: str = "" - self._buffer_accent_count: int = 0 - - def eligible(self, character: str) -> bool: - return True - - def feed(self, character: str) -> None: - if character.isalpha(): - self._buffer += character - if is_accentuated(character): - self._buffer_accent_count += 1 - if ( - self._foreign_long_watch is False - and (is_latin(character) is False or is_accentuated(character)) - and is_cjk(character) is False - and is_hangul(character) is False - and is_katakana(character) is False - and is_hiragana(character) is False - and is_thai(character) is False - ): - self._foreign_long_watch = True - return - if not self._buffer: - return - if ( - character.isspace() or is_punctuation(character) or is_separator(character) - ) and self._buffer: - self._word_count += 1 - buffer_length: int = len(self._buffer) - - self._character_count += buffer_length - - if buffer_length >= 4: - if self._buffer_accent_count / buffer_length > 0.34: - self._is_current_word_bad = True - # Word/Buffer ending with a upper case accentuated letter are so rare, - # that we will consider them all as suspicious. Same weight as foreign_long suspicious. - if is_accentuated(self._buffer[-1]) and self._buffer[-1].isupper(): - self._foreign_long_count += 1 - self._is_current_word_bad = True - if buffer_length >= 24 and self._foreign_long_watch: - self._foreign_long_count += 1 - self._is_current_word_bad = True - - if self._is_current_word_bad: - self._bad_word_count += 1 - self._bad_character_count += len(self._buffer) - self._is_current_word_bad = False - - self._foreign_long_watch = False - self._buffer = "" - self._buffer_accent_count = 0 - elif ( - character not in {"<", ">", "-", "=", "~", "|", "_"} - and character.isdigit() is False - and is_symbol(character) - ): - self._is_current_word_bad = True - self._buffer += character - - def reset(self) -> None: # pragma: no cover - self._buffer = "" - self._is_current_word_bad = False - self._foreign_long_watch = False - self._bad_word_count = 0 - self._word_count = 0 - self._character_count = 0 - self._bad_character_count = 0 - self._foreign_long_count = 0 - - @property - def ratio(self) -> float: - if self._word_count <= 10 and self._foreign_long_count == 0: - return 0.0 - - return self._bad_character_count / self._character_count - - -class CjkInvalidStopPlugin(MessDetectorPlugin): - """ - GB(Chinese) based encoding often render the stop incorrectly when the content does not fit and - can be easily detected. Searching for the overuse of '丅' and '丄'. - """ - - def __init__(self) -> None: - self._wrong_stop_count: int = 0 - self._cjk_character_count: int = 0 - - def eligible(self, character: str) -> bool: - return True - - def feed(self, character: str) -> None: - if character in {"丅", "丄"}: - self._wrong_stop_count += 1 - return - if is_cjk(character): - self._cjk_character_count += 1 - - def reset(self) -> None: # pragma: no cover - self._wrong_stop_count = 0 - self._cjk_character_count = 0 - - @property - def ratio(self) -> float: - if self._cjk_character_count < 16: - return 0.0 - return self._wrong_stop_count / self._cjk_character_count - - -class ArchaicUpperLowerPlugin(MessDetectorPlugin): - def __init__(self) -> None: - self._buf: bool = False - - self._character_count_since_last_sep: int = 0 - - self._successive_upper_lower_count: int = 0 - self._successive_upper_lower_count_final: int = 0 - - self._character_count: int = 0 - - self._last_alpha_seen: Optional[str] = None - self._current_ascii_only: bool = True - - def eligible(self, character: str) -> bool: - return True - - def feed(self, character: str) -> None: - is_concerned = character.isalpha() and is_case_variable(character) - chunk_sep = is_concerned is False - - if chunk_sep and self._character_count_since_last_sep > 0: - if ( - self._character_count_since_last_sep <= 64 - and character.isdigit() is False - and self._current_ascii_only is False - ): - self._successive_upper_lower_count_final += ( - self._successive_upper_lower_count - ) - - self._successive_upper_lower_count = 0 - self._character_count_since_last_sep = 0 - self._last_alpha_seen = None - self._buf = False - self._character_count += 1 - self._current_ascii_only = True - - return - - if self._current_ascii_only is True and is_ascii(character) is False: - self._current_ascii_only = False - - if self._last_alpha_seen is not None: - if (character.isupper() and self._last_alpha_seen.islower()) or ( - character.islower() and self._last_alpha_seen.isupper() - ): - if self._buf is True: - self._successive_upper_lower_count += 2 - self._buf = False - else: - self._buf = True - else: - self._buf = False - - self._character_count += 1 - self._character_count_since_last_sep += 1 - self._last_alpha_seen = character - - def reset(self) -> None: # pragma: no cover - self._character_count = 0 - self._character_count_since_last_sep = 0 - self._successive_upper_lower_count = 0 - self._successive_upper_lower_count_final = 0 - self._last_alpha_seen = None - self._buf = False - self._current_ascii_only = True - - @property - def ratio(self) -> float: - if self._character_count == 0: - return 0.0 - - return self._successive_upper_lower_count_final / self._character_count - - -@lru_cache(maxsize=1024) -def is_suspiciously_successive_range( - unicode_range_a: Optional[str], unicode_range_b: Optional[str] -) -> bool: - """ - Determine if two Unicode range seen next to each other can be considered as suspicious. - """ - if unicode_range_a is None or unicode_range_b is None: - return True - - if unicode_range_a == unicode_range_b: - return False - - if "Latin" in unicode_range_a and "Latin" in unicode_range_b: - return False - - if "Emoticons" in unicode_range_a or "Emoticons" in unicode_range_b: - return False - - # Latin characters can be accompanied with a combining diacritical mark - # eg. Vietnamese. - if ("Latin" in unicode_range_a or "Latin" in unicode_range_b) and ( - "Combining" in unicode_range_a or "Combining" in unicode_range_b - ): - return False - - keywords_range_a, keywords_range_b = unicode_range_a.split( - " " - ), unicode_range_b.split(" ") - - for el in keywords_range_a: - if el in UNICODE_SECONDARY_RANGE_KEYWORD: - continue - if el in keywords_range_b: - return False - - # Japanese Exception - range_a_jp_chars, range_b_jp_chars = ( - unicode_range_a - in ( - "Hiragana", - "Katakana", - ), - unicode_range_b in ("Hiragana", "Katakana"), - ) - if (range_a_jp_chars or range_b_jp_chars) and ( - "CJK" in unicode_range_a or "CJK" in unicode_range_b - ): - return False - if range_a_jp_chars and range_b_jp_chars: - return False - - if "Hangul" in unicode_range_a or "Hangul" in unicode_range_b: - if "CJK" in unicode_range_a or "CJK" in unicode_range_b: - return False - if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": - return False - - # Chinese/Japanese use dedicated range for punctuation and/or separators. - if ("CJK" in unicode_range_a or "CJK" in unicode_range_b) or ( - unicode_range_a in ["Katakana", "Hiragana"] - and unicode_range_b in ["Katakana", "Hiragana"] - ): - if "Punctuation" in unicode_range_a or "Punctuation" in unicode_range_b: - return False - if "Forms" in unicode_range_a or "Forms" in unicode_range_b: - return False - - return True - - -@lru_cache(maxsize=2048) -def mess_ratio( - decoded_sequence: str, maximum_threshold: float = 0.2, debug: bool = False -) -> float: - """ - Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier. - """ - - detectors: List[MessDetectorPlugin] = [ - md_class() for md_class in MessDetectorPlugin.__subclasses__() - ] - - length: int = len(decoded_sequence) + 1 - - mean_mess_ratio: float = 0.0 - - if length < 512: - intermediary_mean_mess_ratio_calc: int = 32 - elif length <= 1024: - intermediary_mean_mess_ratio_calc = 64 - else: - intermediary_mean_mess_ratio_calc = 128 - - for character, index in zip(decoded_sequence + "\n", range(length)): - for detector in detectors: - if detector.eligible(character): - detector.feed(character) - - if ( - index > 0 and index % intermediary_mean_mess_ratio_calc == 0 - ) or index == length - 1: - mean_mess_ratio = sum(dt.ratio for dt in detectors) - - if mean_mess_ratio >= maximum_threshold: - break - - if debug: - for dt in detectors: # pragma: nocover - print(dt.__class__, dt.ratio) - - return round(mean_mess_ratio, 3) diff --git a/.venv/Lib/site-packages/charset_normalizer/models.py b/.venv/Lib/site-packages/charset_normalizer/models.py deleted file mode 100644 index ccb0d47..0000000 --- a/.venv/Lib/site-packages/charset_normalizer/models.py +++ /dev/null @@ -1,401 +0,0 @@ -import warnings -from collections import Counter -from encodings.aliases import aliases -from hashlib import sha256 -from json import dumps -from re import sub -from typing import ( - Any, - Counter as TypeCounter, - Dict, - Iterator, - List, - Optional, - Tuple, - Union, -) - -from .constant import NOT_PRINTABLE_PATTERN, TOO_BIG_SEQUENCE -from .md import mess_ratio -from .utils import iana_name, is_multi_byte_encoding, unicode_range - - -class CharsetMatch: - def __init__( - self, - payload: bytes, - guessed_encoding: str, - mean_mess_ratio: float, - has_sig_or_bom: bool, - languages: "CoherenceMatches", - decoded_payload: Optional[str] = None, - ): - self._payload: bytes = payload - - self._encoding: str = guessed_encoding - self._mean_mess_ratio: float = mean_mess_ratio - self._languages: CoherenceMatches = languages - self._has_sig_or_bom: bool = has_sig_or_bom - self._unicode_ranges: Optional[List[str]] = None - - self._leaves: List[CharsetMatch] = [] - self._mean_coherence_ratio: float = 0.0 - - self._output_payload: Optional[bytes] = None - self._output_encoding: Optional[str] = None - - self._string: Optional[str] = decoded_payload - - def __eq__(self, other: object) -> bool: - if not isinstance(other, CharsetMatch): - raise TypeError( - "__eq__ cannot be invoked on {} and {}.".format( - str(other.__class__), str(self.__class__) - ) - ) - return self.encoding == other.encoding and self.fingerprint == other.fingerprint - - def __lt__(self, other: object) -> bool: - """ - Implemented to make sorted available upon CharsetMatches items. - """ - if not isinstance(other, CharsetMatch): - raise ValueError - - chaos_difference: float = abs(self.chaos - other.chaos) - coherence_difference: float = abs(self.coherence - other.coherence) - - # Bellow 1% difference --> Use Coherence - if chaos_difference < 0.01 and coherence_difference > 0.02: - # When having a tough decision, use the result that decoded as many multi-byte as possible. - if chaos_difference == 0.0 and self.coherence == other.coherence: - return self.multi_byte_usage > other.multi_byte_usage - return self.coherence > other.coherence - - return self.chaos < other.chaos - - @property - def multi_byte_usage(self) -> float: - return 1.0 - len(str(self)) / len(self.raw) - - @property - def chaos_secondary_pass(self) -> float: - """ - Check once again chaos in decoded text, except this time, with full content. - Use with caution, this can be very slow. - Notice: Will be removed in 3.0 - """ - warnings.warn( - "chaos_secondary_pass is deprecated and will be removed in 3.0", - DeprecationWarning, - ) - return mess_ratio(str(self), 1.0) - - @property - def coherence_non_latin(self) -> float: - """ - Coherence ratio on the first non-latin language detected if ANY. - Notice: Will be removed in 3.0 - """ - warnings.warn( - "coherence_non_latin is deprecated and will be removed in 3.0", - DeprecationWarning, - ) - return 0.0 - - @property - def w_counter(self) -> TypeCounter[str]: - """ - Word counter instance on decoded text. - Notice: Will be removed in 3.0 - """ - warnings.warn( - "w_counter is deprecated and will be removed in 3.0", DeprecationWarning - ) - - string_printable_only = sub(NOT_PRINTABLE_PATTERN, " ", str(self).lower()) - - return Counter(string_printable_only.split()) - - def __str__(self) -> str: - # Lazy Str Loading - if self._string is None: - self._string = str(self._payload, self._encoding, "strict") - return self._string - - def __repr__(self) -> str: - return "".format(self.encoding, self.fingerprint) - - def add_submatch(self, other: "CharsetMatch") -> None: - if not isinstance(other, CharsetMatch) or other == self: - raise ValueError( - "Unable to add instance <{}> as a submatch of a CharsetMatch".format( - other.__class__ - ) - ) - - other._string = None # Unload RAM usage; dirty trick. - self._leaves.append(other) - - @property - def encoding(self) -> str: - return self._encoding - - @property - def encoding_aliases(self) -> List[str]: - """ - Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855. - """ - also_known_as: List[str] = [] - for u, p in aliases.items(): - if self.encoding == u: - also_known_as.append(p) - elif self.encoding == p: - also_known_as.append(u) - return also_known_as - - @property - def bom(self) -> bool: - return self._has_sig_or_bom - - @property - def byte_order_mark(self) -> bool: - return self._has_sig_or_bom - - @property - def languages(self) -> List[str]: - """ - Return the complete list of possible languages found in decoded sequence. - Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'. - """ - return [e[0] for e in self._languages] - - @property - def language(self) -> str: - """ - Most probable language found in decoded sequence. If none were detected or inferred, the property will return - "Unknown". - """ - if not self._languages: - # Trying to infer the language based on the given encoding - # Its either English or we should not pronounce ourselves in certain cases. - if "ascii" in self.could_be_from_charset: - return "English" - - # doing it there to avoid circular import - from charset_normalizer.cd import encoding_languages, mb_encoding_languages - - languages = ( - mb_encoding_languages(self.encoding) - if is_multi_byte_encoding(self.encoding) - else encoding_languages(self.encoding) - ) - - if len(languages) == 0 or "Latin Based" in languages: - return "Unknown" - - return languages[0] - - return self._languages[0][0] - - @property - def chaos(self) -> float: - return self._mean_mess_ratio - - @property - def coherence(self) -> float: - if not self._languages: - return 0.0 - return self._languages[0][1] - - @property - def percent_chaos(self) -> float: - return round(self.chaos * 100, ndigits=3) - - @property - def percent_coherence(self) -> float: - return round(self.coherence * 100, ndigits=3) - - @property - def raw(self) -> bytes: - """ - Original untouched bytes. - """ - return self._payload - - @property - def submatch(self) -> List["CharsetMatch"]: - return self._leaves - - @property - def has_submatch(self) -> bool: - return len(self._leaves) > 0 - - @property - def alphabets(self) -> List[str]: - if self._unicode_ranges is not None: - return self._unicode_ranges - # list detected ranges - detected_ranges: List[Optional[str]] = [ - unicode_range(char) for char in str(self) - ] - # filter and sort - self._unicode_ranges = sorted(list({r for r in detected_ranges if r})) - return self._unicode_ranges - - @property - def could_be_from_charset(self) -> List[str]: - """ - The complete list of encoding that output the exact SAME str result and therefore could be the originating - encoding. - This list does include the encoding available in property 'encoding'. - """ - return [self._encoding] + [m.encoding for m in self._leaves] - - def first(self) -> "CharsetMatch": - """ - Kept for BC reasons. Will be removed in 3.0. - """ - return self - - def best(self) -> "CharsetMatch": - """ - Kept for BC reasons. Will be removed in 3.0. - """ - return self - - def output(self, encoding: str = "utf_8") -> bytes: - """ - Method to get re-encoded bytes payload using given target encoding. Default to UTF-8. - Any errors will be simply ignored by the encoder NOT replaced. - """ - if self._output_encoding is None or self._output_encoding != encoding: - self._output_encoding = encoding - self._output_payload = str(self).encode(encoding, "replace") - - return self._output_payload # type: ignore - - @property - def fingerprint(self) -> str: - """ - Retrieve the unique SHA256 computed using the transformed (re-encoded) payload. Not the original one. - """ - return sha256(self.output()).hexdigest() - - -class CharsetMatches: - """ - Container with every CharsetMatch items ordered by default from most probable to the less one. - Act like a list(iterable) but does not implements all related methods. - """ - - def __init__(self, results: Optional[List[CharsetMatch]] = None): - self._results: List[CharsetMatch] = sorted(results) if results else [] - - def __iter__(self) -> Iterator[CharsetMatch]: - yield from self._results - - def __getitem__(self, item: Union[int, str]) -> CharsetMatch: - """ - Retrieve a single item either by its position or encoding name (alias may be used here). - Raise KeyError upon invalid index or encoding not present in results. - """ - if isinstance(item, int): - return self._results[item] - if isinstance(item, str): - item = iana_name(item, False) - for result in self._results: - if item in result.could_be_from_charset: - return result - raise KeyError - - def __len__(self) -> int: - return len(self._results) - - def __bool__(self) -> bool: - return len(self._results) > 0 - - def append(self, item: CharsetMatch) -> None: - """ - Insert a single match. Will be inserted accordingly to preserve sort. - Can be inserted as a submatch. - """ - if not isinstance(item, CharsetMatch): - raise ValueError( - "Cannot append instance '{}' to CharsetMatches".format( - str(item.__class__) - ) - ) - # We should disable the submatch factoring when the input file is too heavy (conserve RAM usage) - if len(item.raw) <= TOO_BIG_SEQUENCE: - for match in self._results: - if match.fingerprint == item.fingerprint and match.chaos == item.chaos: - match.add_submatch(item) - return - self._results.append(item) - self._results = sorted(self._results) - - def best(self) -> Optional["CharsetMatch"]: - """ - Simply return the first match. Strict equivalent to matches[0]. - """ - if not self._results: - return None - return self._results[0] - - def first(self) -> Optional["CharsetMatch"]: - """ - Redundant method, call the method best(). Kept for BC reasons. - """ - return self.best() - - -CoherenceMatch = Tuple[str, float] -CoherenceMatches = List[CoherenceMatch] - - -class CliDetectionResult: - def __init__( - self, - path: str, - encoding: Optional[str], - encoding_aliases: List[str], - alternative_encodings: List[str], - language: str, - alphabets: List[str], - has_sig_or_bom: bool, - chaos: float, - coherence: float, - unicode_path: Optional[str], - is_preferred: bool, - ): - self.path: str = path - self.unicode_path: Optional[str] = unicode_path - self.encoding: Optional[str] = encoding - self.encoding_aliases: List[str] = encoding_aliases - self.alternative_encodings: List[str] = alternative_encodings - self.language: str = language - self.alphabets: List[str] = alphabets - self.has_sig_or_bom: bool = has_sig_or_bom - self.chaos: float = chaos - self.coherence: float = coherence - self.is_preferred: bool = is_preferred - - @property - def __dict__(self) -> Dict[str, Any]: # type: ignore - return { - "path": self.path, - "encoding": self.encoding, - "encoding_aliases": self.encoding_aliases, - "alternative_encodings": self.alternative_encodings, - "language": self.language, - "alphabets": self.alphabets, - "has_sig_or_bom": self.has_sig_or_bom, - "chaos": self.chaos, - "coherence": self.coherence, - "unicode_path": self.unicode_path, - "is_preferred": self.is_preferred, - } - - def to_json(self) -> str: - return dumps(self.__dict__, ensure_ascii=True, indent=4) diff --git a/.venv/Lib/site-packages/charset_normalizer/py.typed b/.venv/Lib/site-packages/charset_normalizer/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/Lib/site-packages/charset_normalizer/utils.py b/.venv/Lib/site-packages/charset_normalizer/utils.py deleted file mode 100644 index 859f212..0000000 --- a/.venv/Lib/site-packages/charset_normalizer/utils.py +++ /dev/null @@ -1,424 +0,0 @@ -try: - # WARNING: unicodedata2 support is going to be removed in 3.0 - # Python is quickly catching up. - import unicodedata2 as unicodedata -except ImportError: - import unicodedata # type: ignore[no-redef] - -import importlib -import logging -from codecs import IncrementalDecoder -from encodings.aliases import aliases -from functools import lru_cache -from re import findall -from typing import Generator, List, Optional, Set, Tuple, Union - -from _multibytecodec import MultibyteIncrementalDecoder - -from .constant import ( - ENCODING_MARKS, - IANA_SUPPORTED_SIMILAR, - RE_POSSIBLE_ENCODING_INDICATION, - UNICODE_RANGES_COMBINED, - UNICODE_SECONDARY_RANGE_KEYWORD, - UTF8_MAXIMAL_ALLOCATION, -) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_accentuated(character: str) -> bool: - try: - description: str = unicodedata.name(character) - except ValueError: - return False - return ( - "WITH GRAVE" in description - or "WITH ACUTE" in description - or "WITH CEDILLA" in description - or "WITH DIAERESIS" in description - or "WITH CIRCUMFLEX" in description - or "WITH TILDE" in description - ) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def remove_accent(character: str) -> str: - decomposed: str = unicodedata.decomposition(character) - if not decomposed: - return character - - codes: List[str] = decomposed.split(" ") - - return chr(int(codes[0], 16)) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def unicode_range(character: str) -> Optional[str]: - """ - Retrieve the Unicode range official name from a single character. - """ - character_ord: int = ord(character) - - for range_name, ord_range in UNICODE_RANGES_COMBINED.items(): - if character_ord in ord_range: - return range_name - - return None - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_latin(character: str) -> bool: - try: - description: str = unicodedata.name(character) - except ValueError: - return False - return "LATIN" in description - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_ascii(character: str) -> bool: - try: - character.encode("ascii") - except UnicodeEncodeError: - return False - return True - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_punctuation(character: str) -> bool: - character_category: str = unicodedata.category(character) - - if "P" in character_category: - return True - - character_range: Optional[str] = unicode_range(character) - - if character_range is None: - return False - - return "Punctuation" in character_range - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_symbol(character: str) -> bool: - character_category: str = unicodedata.category(character) - - if "S" in character_category or "N" in character_category: - return True - - character_range: Optional[str] = unicode_range(character) - - if character_range is None: - return False - - return "Forms" in character_range - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_emoticon(character: str) -> bool: - character_range: Optional[str] = unicode_range(character) - - if character_range is None: - return False - - return "Emoticons" in character_range - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_separator(character: str) -> bool: - if character.isspace() or character in {"|", "+", ",", ";", "<", ">"}: - return True - - character_category: str = unicodedata.category(character) - - return "Z" in character_category - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_case_variable(character: str) -> bool: - return character.islower() != character.isupper() - - -def is_private_use_only(character: str) -> bool: - character_category: str = unicodedata.category(character) - - return character_category == "Co" - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_cjk(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: - return False - - return "CJK" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_hiragana(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: - return False - - return "HIRAGANA" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_katakana(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: - return False - - return "KATAKANA" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_hangul(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: - return False - - return "HANGUL" in character_name - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_thai(character: str) -> bool: - try: - character_name = unicodedata.name(character) - except ValueError: - return False - - return "THAI" in character_name - - -@lru_cache(maxsize=len(UNICODE_RANGES_COMBINED)) -def is_unicode_range_secondary(range_name: str) -> bool: - return any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD) - - -@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) -def is_unprintable(character: str) -> bool: - return ( - character.isspace() is False # includes \n \t \r \v - and character.isprintable() is False - and character != "\x1A" # Why? Its the ASCII substitute character. - and character != "\ufeff" # bug discovered in Python, - # Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space. - ) - - -def any_specified_encoding(sequence: bytes, search_zone: int = 4096) -> Optional[str]: - """ - Extract using ASCII-only decoder any specified encoding in the first n-bytes. - """ - if not isinstance(sequence, bytes): - raise TypeError - - seq_len: int = len(sequence) - - results: List[str] = findall( - RE_POSSIBLE_ENCODING_INDICATION, - sequence[: min(seq_len, search_zone)].decode("ascii", errors="ignore"), - ) - - if len(results) == 0: - return None - - for specified_encoding in results: - specified_encoding = specified_encoding.lower().replace("-", "_") - - encoding_alias: str - encoding_iana: str - - for encoding_alias, encoding_iana in aliases.items(): - if encoding_alias == specified_encoding: - return encoding_iana - if encoding_iana == specified_encoding: - return encoding_iana - - return None - - -@lru_cache(maxsize=128) -def is_multi_byte_encoding(name: str) -> bool: - """ - Verify is a specific encoding is a multi byte one based on it IANA name - """ - return name in { - "utf_8", - "utf_8_sig", - "utf_16", - "utf_16_be", - "utf_16_le", - "utf_32", - "utf_32_le", - "utf_32_be", - "utf_7", - } or issubclass( - importlib.import_module("encodings.{}".format(name)).IncrementalDecoder, - MultibyteIncrementalDecoder, - ) - - -def identify_sig_or_bom(sequence: bytes) -> Tuple[Optional[str], bytes]: - """ - Identify and extract SIG/BOM in given sequence. - """ - - for iana_encoding in ENCODING_MARKS: - marks: Union[bytes, List[bytes]] = ENCODING_MARKS[iana_encoding] - - if isinstance(marks, bytes): - marks = [marks] - - for mark in marks: - if sequence.startswith(mark): - return iana_encoding, mark - - return None, b"" - - -def should_strip_sig_or_bom(iana_encoding: str) -> bool: - return iana_encoding not in {"utf_16", "utf_32"} - - -def iana_name(cp_name: str, strict: bool = True) -> str: - cp_name = cp_name.lower().replace("-", "_") - - encoding_alias: str - encoding_iana: str - - for encoding_alias, encoding_iana in aliases.items(): - if cp_name in [encoding_alias, encoding_iana]: - return encoding_iana - - if strict: - raise ValueError("Unable to retrieve IANA for '{}'".format(cp_name)) - - return cp_name - - -def range_scan(decoded_sequence: str) -> List[str]: - ranges: Set[str] = set() - - for character in decoded_sequence: - character_range: Optional[str] = unicode_range(character) - - if character_range is None: - continue - - ranges.add(character_range) - - return list(ranges) - - -def cp_similarity(iana_name_a: str, iana_name_b: str) -> float: - - if is_multi_byte_encoding(iana_name_a) or is_multi_byte_encoding(iana_name_b): - return 0.0 - - decoder_a = importlib.import_module( - "encodings.{}".format(iana_name_a) - ).IncrementalDecoder - decoder_b = importlib.import_module( - "encodings.{}".format(iana_name_b) - ).IncrementalDecoder - - id_a: IncrementalDecoder = decoder_a(errors="ignore") - id_b: IncrementalDecoder = decoder_b(errors="ignore") - - character_match_count: int = 0 - - for i in range(255): - to_be_decoded: bytes = bytes([i]) - if id_a.decode(to_be_decoded) == id_b.decode(to_be_decoded): - character_match_count += 1 - - return character_match_count / 254 - - -def is_cp_similar(iana_name_a: str, iana_name_b: str) -> bool: - """ - Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using - the function cp_similarity. - """ - return ( - iana_name_a in IANA_SUPPORTED_SIMILAR - and iana_name_b in IANA_SUPPORTED_SIMILAR[iana_name_a] - ) - - -def set_logging_handler( - name: str = "charset_normalizer", - level: int = logging.INFO, - format_string: str = "%(asctime)s | %(levelname)s | %(message)s", -) -> None: - - logger = logging.getLogger(name) - logger.setLevel(level) - - handler = logging.StreamHandler() - handler.setFormatter(logging.Formatter(format_string)) - logger.addHandler(handler) - - -def cut_sequence_chunks( - sequences: bytes, - encoding_iana: str, - offsets: range, - chunk_size: int, - bom_or_sig_available: bool, - strip_sig_or_bom: bool, - sig_payload: bytes, - is_multi_byte_decoder: bool, - decoded_payload: Optional[str] = None, -) -> Generator[str, None, None]: - - if decoded_payload and is_multi_byte_decoder is False: - for i in offsets: - chunk = decoded_payload[i : i + chunk_size] - if not chunk: - break - yield chunk - else: - for i in offsets: - chunk_end = i + chunk_size - if chunk_end > len(sequences) + 8: - continue - - cut_sequence = sequences[i : i + chunk_size] - - if bom_or_sig_available and strip_sig_or_bom is False: - cut_sequence = sig_payload + cut_sequence - - chunk = cut_sequence.decode( - encoding_iana, - errors="ignore" if is_multi_byte_decoder else "strict", - ) - - # multi-byte bad cutting detector and adjustment - # not the cleanest way to perform that fix but clever enough for now. - if is_multi_byte_decoder and i > 0 and sequences[i] >= 0x80: - - chunk_partial_size_chk: int = min(chunk_size, 16) - - if ( - decoded_payload - and chunk[:chunk_partial_size_chk] not in decoded_payload - ): - for j in range(i, i - 4, -1): - cut_sequence = sequences[j:chunk_end] - - if bom_or_sig_available and strip_sig_or_bom is False: - cut_sequence = sig_payload + cut_sequence - - chunk = cut_sequence.decode(encoding_iana, errors="ignore") - - if chunk[:chunk_partial_size_chk] in decoded_payload: - break - - yield chunk diff --git a/.venv/Lib/site-packages/charset_normalizer/version.py b/.venv/Lib/site-packages/charset_normalizer/version.py deleted file mode 100644 index 64c0dbd..0000000 --- a/.venv/Lib/site-packages/charset_normalizer/version.py +++ /dev/null @@ -1,6 +0,0 @@ -""" -Expose version -""" - -__version__ = "2.1.1" -VERSION = __version__.split(".") diff --git a/.venv/Lib/site-packages/dateutil/__init__.py b/.venv/Lib/site-packages/dateutil/__init__.py deleted file mode 100644 index 0defb82..0000000 --- a/.venv/Lib/site-packages/dateutil/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# -*- coding: utf-8 -*- -try: - from ._version import version as __version__ -except ImportError: - __version__ = 'unknown' - -__all__ = ['easter', 'parser', 'relativedelta', 'rrule', 'tz', - 'utils', 'zoneinfo'] diff --git a/.venv/Lib/site-packages/dateutil/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/dateutil/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index e48f1e8ef668f82324e5f4ae383146e9b405b160..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 383 zcmYjL!Ab)$5KYoM~^*tum|g1Lt!EP*&zzWs4Bp5A_-tQymRk=OH zsB1w=a*s4wBGD6lk%)mvMJDz(Y1tR~9hw#&ILb_MNVi~}G&-cMuC#g9*&h`GZ9c8`{WUj`w+@i0A1IJ|+WmtYaZ zBkzcyf}Ih;Bt11eCX7wunxiN7S~3_Uu@fXhI+>Qj31erFMQJ#Uq%%lF7D?T<19;8M zfTC4_4G1LhC=_7=itIDb5I2P(%roklq9*ER#H)#huwbu?rm$geh#O)Kc1z5Q7VJ&I z0M0_u_$Fmv_$LL8I{}s$4~!YiHJEwdPq!8+E`&h=u-49`}tHV@2 zANoPx-X29E&FBLF8-Ac}de{ss^{^UCFgt8t@F!1%4E9 zJ`X32LJ(?GlTG8R60YI1Ah*P~0>S7Z;>#&uH1s`)Da5pIC}#(Hze#pTyl9e?^=Z@?UZb}Xn=gSDVQpkqSVb*X}ic34LjRuYV0q`hn&a0mti03#z z%KYf!2K=t0Bt^gDD-|lJTDV|O)h%4m98+k@&fynOHWg1A|G}abvrVgRSuiUg`kf`~$u16flHavTdI04C`@vj6}9 diff --git a/.venv/Lib/site-packages/dateutil/__pycache__/easter.cpython-38.pyc b/.venv/Lib/site-packages/dateutil/__pycache__/easter.cpython-38.pyc deleted file mode 100644 index 369148a75454ae82141f789b735f97b90f231280..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2194 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 FzW@N-P;vkO diff --git a/.venv/Lib/site-packages/dateutil/__pycache__/tzwin.cpython-38.pyc b/.venv/Lib/site-packages/dateutil/__pycache__/tzwin.cpython-38.pyc deleted file mode 100644 index f241bb8b890bf60b99d06e45320ea7a6601cc943..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmWIL<>g`kf`~$uWNRS(7{oyaOhAqU5Et_Ri4=wu#vFzah7_h?22JLdj6fkx##@Y9 zewvI?Y$a8C<(YXa8H$*J!eHW8h_h8pXmM&$aZE;OdVW!iOKNd;Nq#|0Qhtd-YHmSJ zex^c7sX_^mSsbHRmYP=<bQ=D0ns#}nloSm4SS{##-Sdv;=l9{7lQUx?#ub}c4 ThfQvNN@-529ms8;ftUdR=vOny diff --git a/.venv/Lib/site-packages/dateutil/__pycache__/utils.cpython-38.pyc b/.venv/Lib/site-packages/dateutil/__pycache__/utils.cpython-38.pyc deleted file mode 100644 index 5a7e9533bbd7b1463dfee49657e12af5107ab252..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2266 zcmbVOO>Y}T7~T&%aW_ec#Dz<%QK-}`G{y-a&MVib>O#xw8d^FD7*x3(e=o5z)VLKex+BNJqL|v@C^4oQ>E*h`A_L{gSB7Col z+OZdJUYY1*qzoGuqRb>K1_P-L8_Ha2p0TvZ&tGJBkFi(yFmE%_wR%**V1FA{Ro6Bw+{5ZFBtB{ezjfZDlLTULMZ7o zaZoiD0;(E`d6xQgc|HPsBP8AtK4u4#_1^eX@5aCOu?nXCoAAc7HGwk`ybf*xxES(> z5D_tqU!*NHjOHwvTqbG8jY)b7eLbe-L`x%cOU~GlWNE22woLF##w{Bwk*ndzMow5V z;hK+`y;Aw0NZb+WIKewIoLv<;Rs|kfo{rcq+$&gVq@Y6~;qX||ja5A{!bV~e?QFf3 z`@>x}H*bwE`p;!*Kj_2K#&>*axKzE{xMD+Ab!Vn=l8L+#$}+_n|a>rF_%_K4=Zw(b9F9}|2d{{lwHme z$>FJF7bBUo%c5jlOE%HPxdQkZUy6Z7$^bw$;^)#CB2hZf$aAJ3 zLZ!+w6qbBBUoQdmgqadx;%24xa|_UxGdy=mznL(BEIrU4BR>Uerdw) z&QHfDJ5Si&{w z()%})R_pUt3-kZh^`G_ZwZ0}jPSKoBguN|!qLKyl2#gmah1`QZKvWqAB@=fnp|K+7 zE>^mO^N@35uO3jhdDjFW(%n((14Oy9gSJADQ_d~KtZCT}AckwCt=>k%3_zhowjD74siyPH? zw+oi&cB`n{9hB&kvfI@}t*#X~+IQ6JV(8wzqlj97b_r;FH~UZGke(XKQ*CWC*bbxZ H#;5-PhEj9j diff --git a/.venv/Lib/site-packages/dateutil/_common.py b/.venv/Lib/site-packages/dateutil/_common.py deleted file mode 100644 index 4eb2659..0000000 --- a/.venv/Lib/site-packages/dateutil/_common.py +++ /dev/null @@ -1,43 +0,0 @@ -""" -Common code used in multiple modules. -""" - - -class weekday(object): - __slots__ = ["weekday", "n"] - - def __init__(self, weekday, n=None): - self.weekday = weekday - self.n = n - - def __call__(self, n): - if n == self.n: - return self - else: - return self.__class__(self.weekday, n) - - def __eq__(self, other): - try: - if self.weekday != other.weekday or self.n != other.n: - return False - except AttributeError: - return False - return True - - def __hash__(self): - return hash(( - self.weekday, - self.n, - )) - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday] - if not self.n: - return s - else: - return "%s(%+d)" % (s, self.n) - -# vim:ts=4:sw=4:et diff --git a/.venv/Lib/site-packages/dateutil/_version.py b/.venv/Lib/site-packages/dateutil/_version.py deleted file mode 100644 index b723056..0000000 --- a/.venv/Lib/site-packages/dateutil/_version.py +++ /dev/null @@ -1,5 +0,0 @@ -# coding: utf-8 -# file generated by setuptools_scm -# don't change, don't track in version control -version = '2.8.2' -version_tuple = (2, 8, 2) diff --git a/.venv/Lib/site-packages/dateutil/easter.py b/.venv/Lib/site-packages/dateutil/easter.py deleted file mode 100644 index f74d1f7..0000000 --- a/.venv/Lib/site-packages/dateutil/easter.py +++ /dev/null @@ -1,89 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers a generic Easter computing method for any given year, using -Western, Orthodox or Julian algorithms. -""" - -import datetime - -__all__ = ["easter", "EASTER_JULIAN", "EASTER_ORTHODOX", "EASTER_WESTERN"] - -EASTER_JULIAN = 1 -EASTER_ORTHODOX = 2 -EASTER_WESTERN = 3 - - -def easter(year, method=EASTER_WESTERN): - """ - This method was ported from the work done by GM Arts, - on top of the algorithm by Claus Tondering, which was - based in part on the algorithm of Ouding (1940), as - quoted in "Explanatory Supplement to the Astronomical - Almanac", P. Kenneth Seidelmann, editor. - - This algorithm implements three different Easter - calculation methods: - - 1. Original calculation in Julian calendar, valid in - dates after 326 AD - 2. Original method, with date converted to Gregorian - calendar, valid in years 1583 to 4099 - 3. Revised method, in Gregorian calendar, valid in - years 1583 to 4099 as well - - These methods are represented by the constants: - - * ``EASTER_JULIAN = 1`` - * ``EASTER_ORTHODOX = 2`` - * ``EASTER_WESTERN = 3`` - - The default method is method 3. - - More about the algorithm may be found at: - - `GM Arts: Easter Algorithms `_ - - and - - `The Calendar FAQ: Easter `_ - - """ - - if not (1 <= method <= 3): - raise ValueError("invalid method") - - # g - Golden year - 1 - # c - Century - # h - (23 - Epact) mod 30 - # i - Number of days from March 21 to Paschal Full Moon - # j - Weekday for PFM (0=Sunday, etc) - # p - Number of days from March 21 to Sunday on or before PFM - # (-6 to 28 methods 1 & 3, to 56 for method 2) - # e - Extra days to add for method 2 (converting Julian - # date to Gregorian date) - - y = year - g = y % 19 - e = 0 - if method < 3: - # Old method - i = (19*g + 15) % 30 - j = (y + y//4 + i) % 7 - if method == 2: - # Extra dates to convert Julian to Gregorian date - e = 10 - if y > 1600: - e = e + y//100 - 16 - (y//100 - 16)//4 - else: - # New method - c = y//100 - h = (c - c//4 - (8*c + 13)//25 + 19*g + 15) % 30 - i = h - (h//28)*(1 - (h//28)*(29//(h + 1))*((21 - g)//11)) - j = (y + y//4 + i + 2 - c + c//4) % 7 - - # p can be from -6 to 56 corresponding to dates 22 March to 23 May - # (later dates apply to method 2, although 23 May never actually occurs) - p = i - j + e - d = 1 + (p + 27 + (p + 6)//40) % 31 - m = 3 + (p + 26)//30 - return datetime.date(int(y), int(m), int(d)) diff --git a/.venv/Lib/site-packages/dateutil/parser/__init__.py b/.venv/Lib/site-packages/dateutil/parser/__init__.py deleted file mode 100644 index d174b0e..0000000 --- a/.venv/Lib/site-packages/dateutil/parser/__init__.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: utf-8 -*- -from ._parser import parse, parser, parserinfo, ParserError -from ._parser import DEFAULTPARSER, DEFAULTTZPARSER -from ._parser import UnknownTimezoneWarning - -from ._parser import __doc__ - -from .isoparser import isoparser, isoparse - -__all__ = ['parse', 'parser', 'parserinfo', - 'isoparse', 'isoparser', - 'ParserError', - 'UnknownTimezoneWarning'] - - -### -# Deprecate portions of the private interface so that downstream code that -# is improperly relying on it is given *some* notice. - - -def __deprecated_private_func(f): - from functools import wraps - import warnings - - msg = ('{name} is a private function and may break without warning, ' - 'it will be moved and or renamed in future versions.') - msg = msg.format(name=f.__name__) - - @wraps(f) - def deprecated_func(*args, **kwargs): - warnings.warn(msg, DeprecationWarning) - return f(*args, **kwargs) - - return deprecated_func - -def __deprecate_private_class(c): - import warnings - - msg = ('{name} is a private class and may break without warning, ' - 'it will be moved and or renamed in future versions.') - msg = msg.format(name=c.__name__) - - class private_class(c): - __doc__ = c.__doc__ - - def __init__(self, *args, **kwargs): - warnings.warn(msg, DeprecationWarning) - super(private_class, self).__init__(*args, **kwargs) - - private_class.__name__ = c.__name__ - - return private_class - - -from ._parser import _timelex, _resultbase -from ._parser import _tzparser, _parsetz - -_timelex = __deprecate_private_class(_timelex) -_tzparser = __deprecate_private_class(_tzparser) -_resultbase = __deprecate_private_class(_resultbase) -_parsetz = __deprecated_private_func(_parsetz) diff --git a/.venv/Lib/site-packages/dateutil/parser/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/dateutil/parser/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 727b2c325b2128998bdbd0adecb03f895ff6b962..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2081 zcmb_dOK%)S5bo}o-JSJ5ZHJHq0R!Z~Lb5^JKv9%{4VTD@Vq2imiq?3$cQf`pHr=x} zS=J|8+Vz2)_yKVAAK=II6$vSS0SSq!p7krh0f`xPRdshwbv?eC-flFO2t40Dzuo`6 zOvrCIx%^aM@(_mp6^I~$#w4KuO<2GZCvXxsa4D`cST6;oq#Ts(+<|!|s94zr*$X@? zm*Q$t4XVjfumtn6s0dF~#geFr`mhqzL_;)>Nl+Ip(FWcC%ggX}GiWBQpk*zrz`Px_ zljUHU64{W=BN{Y;w}H2Tw}7`~T`mJ(7OR`2bL|xc=R2+`jY6fRDO;w@Qo*BikeS*O z+*0dGWvatWV{QGbN869Lo;-TGx&G9&7SpYuSm;o5eLLMtvx9UiO5`L<9qjU&6 z70yN0=N!ybBb_Y{^Ug&E&L{_oi=>7Gi=awKJRp7a_v}GUR79@703xW(Ha(<}4=PB^ zPMB~`=$!64bF%9S_eXj{r*uw^=#0$hj13%766Is>h#s;jgN#%*UV$M3&Xx{TIMS2s zhcry&p&w~K^hYY%4|C}c#%Vu~veXY#;V0n>e@Dr1&p(LrXW2OS4~mHI_z}oa9Q!-c zPqKX}tbV3^CDEwxqZCZ#V?sfNNy5D;o?euh%%e$knzZVXr z?g_}!IFI6cMUC%q9;H#vd3W@}w8X+QDL5wbZ43&dBdks*p8`fM_7@4adfoeR)(>O- zpnFLH4RlJTYAcduu~rQ*q;3E)N)UiE`Q%bw`B_b^>la16vV0|_n96hXzYmkSbAkRGk~Aep zY}c96DSL^XPd15agIdQ`%fQqM5L43QkyMC<0*M{RxLU>owTdd&th%XkZoT4My@?++ zt~g~;RX_&OqTU12g;9VPa54GpzsA`;cc-l0!4sD_Pcku%0j;La`SWoY7uZ$Rvm;Go z;bmXOF?fm?K6MT4Tc6c!)InpB)48!{B(K54o&=9Dpum$b;@J$D0+ZR~m zzxTz}`k`Ho@Fa__xK;6(`UvLmC-Qg>cR(z^H#M%L9>@7ks3rdWc|JM&`*SPgla0;_ zToA>odhI5#|9`lIiNagg-ULNH?CpT}1l}#7O$TJE~-NU&5zU^Y5SY}b4D li^EpN3=+svc*{srpv3WWdw diff --git a/.venv/Lib/site-packages/dateutil/parser/__pycache__/_parser.cpython-38.pyc b/.venv/Lib/site-packages/dateutil/parser/__pycache__/_parser.cpython-38.pyc deleted file mode 100644 index 45952daac7731e079b6e291dcfa448fb4784c354..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40806 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 diff --git a/.venv/Lib/site-packages/dateutil/parser/__pycache__/isoparser.cpython-38.pyc b/.venv/Lib/site-packages/dateutil/parser/__pycache__/isoparser.cpython-38.pyc deleted file mode 100644 index 2b94abb789d0b3949825b776b65592a32b68ebe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11282 zcmb_iTWs7`dgg677s;|LE4JhH+RSCM8e5vkPHZP?>RqibiPKm~BRO^^&dyMCC=IO{ zQa}g~dHWQgNWcFa zlEaZ?V~chql85K=pWA=={{Qgyp+gk~zq=2fZ~endit-=ylK&Za`5~^Lj~i3!3R9WZ zQM+ng?P_(ctJn3eQ8!e|*E@xJ0Z*f2c8m3*$SZV8-EzI0lvnB%QE#L^!c10N)#{_H z#LAy3^+T^Ktip<)DXi#>J=E)mox=~6`nWTG|497^(-)QMNc7j0rM4SbU7z(jj^(ec zI6SayYu)C7!>tvcTQ?Wqo_Xcc?0G8)x$CV4mCDV~LKD{u9gjK83Vkc+t*`q$wCqmD z`pE9M%wl%vOk1Jbbu8PHui^z1yLK2@>!2RCoyvgvy3=x3+?E}>zE`VMYPF9r6r^p2 zPUhyU3$@F&*~%`KOsN`ii8>&PahdMS>4bJ{hzx^@7OHBjh0#}PT-f0DdJvb~z!$TM z%V~s++(PAZ<)Qk=%8E++^I7Skx~2A2teU>iqRQ#dM1nT_46Y!; zjT$o9P-8k8>JOElE1~+i5^DGLhZ=83W1lPA1~YclpDTA1?~1-yQ_Sz_R-Ud*4O?*>+4_A(9DI{;Ev5& z7{<_#W_lD?KvVo&SyaAK7rs*XA-rLYOzdsL^~CEpjjMC_Ze#a@d+pw;&+lDxg0;|J zzqjm%meXDD_^!ozR)}P951ZtDbnh*9`Cj0L&dj>qTC-Q3;2v#3FLXOEN=AAyTk_ia zW?Xu$V|SOCedQ#2|1B;hnr?*lniDkapyj%?*E)X7?gUqAD?P6@cuSkb1yL=!IA9*h znpV*EdmU!Ad@rSjA$iD|`&)d|XtbDIP~EpjSmdrjKfxI;M`RhWe})oqYVd z@FMD0HU2Cf{5iVOX7Xp~CPME3z#!fNf zVzsV2;8<4p3_?*aAPr?B(k9YE;UK?=^mo|^8~sehTZtX2m)Tgo;*4yMvco%S{SX^x zN1&R<*aSO@=V3O0sldKFi2 z4Yxi7b*;?jLZlu-WY_dyDul=)t*;e=DU=&)CZ7#82C4cPO15=o?g+8&D-A>RRE&O8 zv69~$xYzDlfwMlBcl*jdQ3G2-8_C zsg_#OD_S%$&>U&CA>~UfOKdHe;LnigE8E!q9rd2JrETeQ`}_Ku!GGLW?rUI>QZUz7 z`+8qz+HvKNw5QSHzP6_E_xc*z>QqK0Or^3N^|G?1d8N=`IiIH&2JU16FrX)h?30#6P<%dZZM5B1oA5-lxzuc8(xMLl5x3>qoormB zq?yebL;9L#7I&^F%|Sc$Rl2ib!M(z!%F0; z(fgps+q3`&_c?QCVGzRnPjSsRYCW=%1y2Xj{JUIz>T{+g}s9|2m;42=L8^q!+5 zG2P~1P)pEXSuaVc1#Phmb>Xche1;xTEwBL!JN_!vh#h3T&ygYA!{s#yKY##Wrp@!* zKG+z+f++_KZwxJZyS-R{ zygU;)kT~#+yXuBPb+AOYT;{o}Z2_L4RSECf9jj$S4PXWq4R)INSFBOO?kTbkETFG; zHj3HVx!GA^UoN~XQiRz#RI3v>fIb33TeKw%opjMlCUEG_%Zq{o2>=v_UI4noC~SbI zZr6qsWS!M&Xaq0^F3+(!*}-HV#PC-LUJ2Df6xLzZJW@G=I*g--A<(kGZvgnW;VVEJ zp)l)(=;iR7l=f+BxhK{O5^S}497ZjKW^zgXyGTPcg~E_DfmsifUcn?0MnwKi;Dj_@ z;e_mCm^y9c($yiE_{YC}FRwuBW z2R#>F9M+eZ8ogLTw`SBx$DR``2n8$AN+R8k>KQ4hj?XRVF%kr9nuC6)bdsbNQ$W4_JlC6 zxY*kq?`Y4#mQf2-mE6U{2}8=j4%QJ+yoR@Pa@9wA=C_ znJtpcj8W6cL)=0%O$32<&-Ho^)?|p7ppzp5p%N#42e2{1YPYz7(0;x(n93nK( z5i7Rav8J5bY7KVa!tD9WGqdOMza;opaxXL|K?DLWSg;{Ft33dD=ohROwl5nt5yfms z>FgPwK{kVGF&=A(6ru@N}HVP1bN-Jq6)RH|zDT>}l2}&7O)raMRq@@nk|4kdEHX$2gbm~cL5seS_YR>w}Gki;WXeK|8 zb(I`I9$IWlQy7~73W#y=0y2|*uNP^#Fn|6swYf+);j|4rw?jjW^{1#2jN+z@jH#oD zUyOZgYSHm@uX$~#_R!W7yU``K{skn`t=~d$i>dIk$U{5L;C(R_UKXBT!ndmG(XX== z8Emt#_rLo#Q}qM4`H6J?pEsHM+PBF%uGhZwLZ#hbdxQ5ZbU7Sy3d)SUAVm}z0 z#9cWF1*ZaQL=N{6k!%343`2)IZ3pTE0c;q$4Imlx7m}Nl*(xbgAPl zYwk(dB#%r6WK)<(UV}^n#drgsn@AtrG8<5{S%=#~e%cfaSF@R$D)QZdTSl}pbW_c` z+XoQ`h^VT@BRO(-9Zd|7*r1eq3*wEF!Pu)-Mx>$;75)z80huIaB6=$2j#QP18owoT zHzV$I0ZG9J_iEE0PJJ*t^XiA^szYjq=#Uf$cAiBd8ch|=9jFsT;Z;Q8&#DUjp+uuV zlBv9pvb%`AFDjhWTUC#r8aAm7Xj?es!hXib_msh{6{SfCjN?RT?~H|3{%7P%8C5mN z=$IOv7|eH==Fp@l`bBD6OzJciLxw-MAfxoRs&DC#R}E(K*${zHVJ0y#gmN{CaN&4C zr^pr4wv4{f*VYRBO+?3x705Rv9eE7KHHnkyYuZ+!U*H|eMPv;1`^E{1fhqh`P&ZTR zqFq6@6Fop{qfJ4yk-hvq==?J632lqi7J2`9K(9Lg8Z~eNgBtsL{sv{`$M#%6&zKLx zXlPE=io{jBq}RTgBqb$P6QmgjS#5-Bh1%UEW{D5$}u3jcfBu*Bgu1->I5H%L{gii*UxsJsOzexY&kf zLSK7?htFf!|B5TPgqs3YU(rekrB12_(k1N}J$0A>LS-ny8xWeI9-~sqS5K(Xna43+ z!stW%M*-U`0vl%hhe)f!C$Te#mjaj($LTVrigPr20|(}~3T1u$IB}HZxrBF^3A_L6 zlyiuR;H+ZGS>Q&46^W~GWM)dv?^AU4pN8qcZh?0Z2iEyt4LGT7*a9a7 zz^~DbG~zDl1mQsl)p&0L8?c1Ay8`o{gSwlnhu`#aM~LxOy5Sy4o#4^I;4-n-8b09DxA{;{5(bmn-mdsGibfQGFOXIj!A@LgNX7!M6zDEZ+nfGr6@Pf*GH(NA(8D~^Y#|%SHYh0xculbbqpqL z42J6@OkDKcoGhZ#J(_38Y*Dm=RHT4SzXZi$*aY*WtQNLlmS9>4^xzB}5?X`0HiSgN z+(6+&UZKQ0{Q?YCnj&*l7&cU_gmdRlC8C5`5O8XTfR_ev0^s#XeLysdFm}HfZYd2H z{{<@xqa;k7cL8-_&iL1T6W5SQ6!mrfZ>eEQ%_CZjh!Nr_Gid>Hn*zW-fh0sygt?-c za5q7TOcepHWV~d4V8*5&T<90Ki>$bVHDaSgV~eN)p0Pu06zho834CorI!01P9$M_c zxKR&ipRU|bG0rhsPpk#G`G?mutmof^CHb8Ia*J$&dbozR4^>g7vZJyEbk*d7oHghP- zI|TBCuigSPWj{iZI`BBreA@4?M@poz~8G%=3_!R}Qp)@rkH89-5< zqwEoaxcu6x<2fI%^D7aF0+|y-(Uj<1j{T(%g$#0YbKlUUErke2&%NRIaMn*soxYX9 zLB)laEquu!j+GD}t*K?X8}H6vUAp=9LgU@*uV23l z+ii!fc3fEHes4Y2@f8Dz&<6ngRl2=Fw=Aj@8#Ga2(qn^;k?Lj-&=zQSIHn;YAaBxy zsXam4G1y^);H_o|yF4l2ts(6*Y_|ZlT17%#)G$>|n@~?77+FD^G3^xY2YXqxXhV?@ z;(-k1V%y*w0pV)FIGz-nIufLI{AdSn_NN# zAAp$%paXS+Ybi~sQ9NHDJ{CMrd>dEDTij%#Y=E-rc=M(AS_LQP()S*n(%OV5-pRwv?Oqrv=E zqrpj^3NJx~LZ#Di3wij~449u{WOAFz0%H1pC*TBS_yf9;{v}fQyalAF``DCctzuC1 zBiF9qn7{qjQUf;Ro%wecufHpoW1xq!S>Pi^xs+FEL;-!tXq4!nV^kZJyQ7yT$3Ia% JQ8rBVe*mcFgZ=;j diff --git a/.venv/Lib/site-packages/dateutil/parser/_parser.py b/.venv/Lib/site-packages/dateutil/parser/_parser.py deleted file mode 100644 index 37d1663..0000000 --- a/.venv/Lib/site-packages/dateutil/parser/_parser.py +++ /dev/null @@ -1,1613 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers a generic date/time string parser which is able to parse -most known formats to represent a date and/or time. - -This module attempts to be forgiving with regards to unlikely input formats, -returning a datetime object even for dates which are ambiguous. If an element -of a date/time stamp is omitted, the following rules are applied: - -- If AM or PM is left unspecified, a 24-hour clock is assumed, however, an hour - on a 12-hour clock (``0 <= hour <= 12``) *must* be specified if AM or PM is - specified. -- If a time zone is omitted, a timezone-naive datetime is returned. - -If any other elements are missing, they are taken from the -:class:`datetime.datetime` object passed to the parameter ``default``. If this -results in a day number exceeding the valid number of days per month, the -value falls back to the end of the month. - -Additional resources about date/time string formats can be found below: - -- `A summary of the international standard date and time notation - `_ -- `W3C Date and Time Formats `_ -- `Time Formats (Planetary Rings Node) `_ -- `CPAN ParseDate module - `_ -- `Java SimpleDateFormat Class - `_ -""" -from __future__ import unicode_literals - -import datetime -import re -import string -import time -import warnings - -from calendar import monthrange -from io import StringIO - -import six -from six import integer_types, text_type - -from decimal import Decimal - -from warnings import warn - -from .. import relativedelta -from .. import tz - -__all__ = ["parse", "parserinfo", "ParserError"] - - -# TODO: pandas.core.tools.datetimes imports this explicitly. Might be worth -# making public and/or figuring out if there is something we can -# take off their plate. -class _timelex(object): - # Fractional seconds are sometimes split by a comma - _split_decimal = re.compile("([.,])") - - def __init__(self, instream): - if isinstance(instream, (bytes, bytearray)): - instream = instream.decode() - - if isinstance(instream, text_type): - instream = StringIO(instream) - elif getattr(instream, 'read', None) is None: - raise TypeError('Parser must be a string or character stream, not ' - '{itype}'.format(itype=instream.__class__.__name__)) - - self.instream = instream - self.charstack = [] - self.tokenstack = [] - self.eof = False - - def get_token(self): - """ - This function breaks the time string into lexical units (tokens), which - can be parsed by the parser. Lexical units are demarcated by changes in - the character set, so any continuous string of letters is considered - one unit, any continuous string of numbers is considered one unit. - - The main complication arises from the fact that dots ('.') can be used - both as separators (e.g. "Sep.20.2009") or decimal points (e.g. - "4:30:21.447"). As such, it is necessary to read the full context of - any dot-separated strings before breaking it into tokens; as such, this - function maintains a "token stack", for when the ambiguous context - demands that multiple tokens be parsed at once. - """ - if self.tokenstack: - return self.tokenstack.pop(0) - - seenletters = False - token = None - state = None - - while not self.eof: - # We only realize that we've reached the end of a token when we - # find a character that's not part of the current token - since - # that character may be part of the next token, it's stored in the - # charstack. - if self.charstack: - nextchar = self.charstack.pop(0) - else: - nextchar = self.instream.read(1) - while nextchar == '\x00': - nextchar = self.instream.read(1) - - if not nextchar: - self.eof = True - break - elif not state: - # First character of the token - determines if we're starting - # to parse a word, a number or something else. - token = nextchar - if self.isword(nextchar): - state = 'a' - elif self.isnum(nextchar): - state = '0' - elif self.isspace(nextchar): - token = ' ' - break # emit token - else: - break # emit token - elif state == 'a': - # If we've already started reading a word, we keep reading - # letters until we find something that's not part of a word. - seenletters = True - if self.isword(nextchar): - token += nextchar - elif nextchar == '.': - token += nextchar - state = 'a.' - else: - self.charstack.append(nextchar) - break # emit token - elif state == '0': - # If we've already started reading a number, we keep reading - # numbers until we find something that doesn't fit. - if self.isnum(nextchar): - token += nextchar - elif nextchar == '.' or (nextchar == ',' and len(token) >= 2): - token += nextchar - state = '0.' - else: - self.charstack.append(nextchar) - break # emit token - elif state == 'a.': - # If we've seen some letters and a dot separator, continue - # parsing, and the tokens will be broken up later. - seenletters = True - if nextchar == '.' or self.isword(nextchar): - token += nextchar - elif self.isnum(nextchar) and token[-1] == '.': - token += nextchar - state = '0.' - else: - self.charstack.append(nextchar) - break # emit token - elif state == '0.': - # If we've seen at least one dot separator, keep going, we'll - # break up the tokens later. - if nextchar == '.' or self.isnum(nextchar): - token += nextchar - elif self.isword(nextchar) and token[-1] == '.': - token += nextchar - state = 'a.' - else: - self.charstack.append(nextchar) - break # emit token - - if (state in ('a.', '0.') and (seenletters or token.count('.') > 1 or - token[-1] in '.,')): - l = self._split_decimal.split(token) - token = l[0] - for tok in l[1:]: - if tok: - self.tokenstack.append(tok) - - if state == '0.' and token.count('.') == 0: - token = token.replace(',', '.') - - return token - - def __iter__(self): - return self - - def __next__(self): - token = self.get_token() - if token is None: - raise StopIteration - - return token - - def next(self): - return self.__next__() # Python 2.x support - - @classmethod - def split(cls, s): - return list(cls(s)) - - @classmethod - def isword(cls, nextchar): - """ Whether or not the next character is part of a word """ - return nextchar.isalpha() - - @classmethod - def isnum(cls, nextchar): - """ Whether the next character is part of a number """ - return nextchar.isdigit() - - @classmethod - def isspace(cls, nextchar): - """ Whether the next character is whitespace """ - return nextchar.isspace() - - -class _resultbase(object): - - def __init__(self): - for attr in self.__slots__: - setattr(self, attr, None) - - def _repr(self, classname): - l = [] - for attr in self.__slots__: - value = getattr(self, attr) - if value is not None: - l.append("%s=%s" % (attr, repr(value))) - return "%s(%s)" % (classname, ", ".join(l)) - - def __len__(self): - return (sum(getattr(self, attr) is not None - for attr in self.__slots__)) - - def __repr__(self): - return self._repr(self.__class__.__name__) - - -class parserinfo(object): - """ - Class which handles what inputs are accepted. Subclass this to customize - the language and acceptable values for each parameter. - - :param dayfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the day (``True``) or month (``False``). If - ``yearfirst`` is set to ``True``, this distinguishes between YDM - and YMD. Default is ``False``. - - :param yearfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the year. If ``True``, the first number is taken - to be the year, otherwise the last number is taken to be the year. - Default is ``False``. - """ - - # m from a.m/p.m, t from ISO T separator - JUMP = [" ", ".", ",", ";", "-", "/", "'", - "at", "on", "and", "ad", "m", "t", "of", - "st", "nd", "rd", "th"] - - WEEKDAYS = [("Mon", "Monday"), - ("Tue", "Tuesday"), # TODO: "Tues" - ("Wed", "Wednesday"), - ("Thu", "Thursday"), # TODO: "Thurs" - ("Fri", "Friday"), - ("Sat", "Saturday"), - ("Sun", "Sunday")] - MONTHS = [("Jan", "January"), - ("Feb", "February"), # TODO: "Febr" - ("Mar", "March"), - ("Apr", "April"), - ("May", "May"), - ("Jun", "June"), - ("Jul", "July"), - ("Aug", "August"), - ("Sep", "Sept", "September"), - ("Oct", "October"), - ("Nov", "November"), - ("Dec", "December")] - HMS = [("h", "hour", "hours"), - ("m", "minute", "minutes"), - ("s", "second", "seconds")] - AMPM = [("am", "a"), - ("pm", "p")] - UTCZONE = ["UTC", "GMT", "Z", "z"] - PERTAIN = ["of"] - TZOFFSET = {} - # TODO: ERA = ["AD", "BC", "CE", "BCE", "Stardate", - # "Anno Domini", "Year of Our Lord"] - - def __init__(self, dayfirst=False, yearfirst=False): - self._jump = self._convert(self.JUMP) - self._weekdays = self._convert(self.WEEKDAYS) - self._months = self._convert(self.MONTHS) - self._hms = self._convert(self.HMS) - self._ampm = self._convert(self.AMPM) - self._utczone = self._convert(self.UTCZONE) - self._pertain = self._convert(self.PERTAIN) - - self.dayfirst = dayfirst - self.yearfirst = yearfirst - - self._year = time.localtime().tm_year - self._century = self._year // 100 * 100 - - def _convert(self, lst): - dct = {} - for i, v in enumerate(lst): - if isinstance(v, tuple): - for v in v: - dct[v.lower()] = i - else: - dct[v.lower()] = i - return dct - - def jump(self, name): - return name.lower() in self._jump - - def weekday(self, name): - try: - return self._weekdays[name.lower()] - except KeyError: - pass - return None - - def month(self, name): - try: - return self._months[name.lower()] + 1 - except KeyError: - pass - return None - - def hms(self, name): - try: - return self._hms[name.lower()] - except KeyError: - return None - - def ampm(self, name): - try: - return self._ampm[name.lower()] - except KeyError: - return None - - def pertain(self, name): - return name.lower() in self._pertain - - def utczone(self, name): - return name.lower() in self._utczone - - def tzoffset(self, name): - if name in self._utczone: - return 0 - - return self.TZOFFSET.get(name) - - def convertyear(self, year, century_specified=False): - """ - Converts two-digit years to year within [-50, 49] - range of self._year (current local time) - """ - - # Function contract is that the year is always positive - assert year >= 0 - - if year < 100 and not century_specified: - # assume current century to start - year += self._century - - if year >= self._year + 50: # if too far in future - year -= 100 - elif year < self._year - 50: # if too far in past - year += 100 - - return year - - def validate(self, res): - # move to info - if res.year is not None: - res.year = self.convertyear(res.year, res.century_specified) - - if ((res.tzoffset == 0 and not res.tzname) or - (res.tzname == 'Z' or res.tzname == 'z')): - res.tzname = "UTC" - res.tzoffset = 0 - elif res.tzoffset != 0 and res.tzname and self.utczone(res.tzname): - res.tzoffset = 0 - return True - - -class _ymd(list): - def __init__(self, *args, **kwargs): - super(self.__class__, self).__init__(*args, **kwargs) - self.century_specified = False - self.dstridx = None - self.mstridx = None - self.ystridx = None - - @property - def has_year(self): - return self.ystridx is not None - - @property - def has_month(self): - return self.mstridx is not None - - @property - def has_day(self): - return self.dstridx is not None - - def could_be_day(self, value): - if self.has_day: - return False - elif not self.has_month: - return 1 <= value <= 31 - elif not self.has_year: - # Be permissive, assume leap year - month = self[self.mstridx] - return 1 <= value <= monthrange(2000, month)[1] - else: - month = self[self.mstridx] - year = self[self.ystridx] - return 1 <= value <= monthrange(year, month)[1] - - def append(self, val, label=None): - if hasattr(val, '__len__'): - if val.isdigit() and len(val) > 2: - self.century_specified = True - if label not in [None, 'Y']: # pragma: no cover - raise ValueError(label) - label = 'Y' - elif val > 100: - self.century_specified = True - if label not in [None, 'Y']: # pragma: no cover - raise ValueError(label) - label = 'Y' - - super(self.__class__, self).append(int(val)) - - if label == 'M': - if self.has_month: - raise ValueError('Month is already set') - self.mstridx = len(self) - 1 - elif label == 'D': - if self.has_day: - raise ValueError('Day is already set') - self.dstridx = len(self) - 1 - elif label == 'Y': - if self.has_year: - raise ValueError('Year is already set') - self.ystridx = len(self) - 1 - - def _resolve_from_stridxs(self, strids): - """ - Try to resolve the identities of year/month/day elements using - ystridx, mstridx, and dstridx, if enough of these are specified. - """ - if len(self) == 3 and len(strids) == 2: - # we can back out the remaining stridx value - missing = [x for x in range(3) if x not in strids.values()] - key = [x for x in ['y', 'm', 'd'] if x not in strids] - assert len(missing) == len(key) == 1 - key = key[0] - val = missing[0] - strids[key] = val - - assert len(self) == len(strids) # otherwise this should not be called - out = {key: self[strids[key]] for key in strids} - return (out.get('y'), out.get('m'), out.get('d')) - - def resolve_ymd(self, yearfirst, dayfirst): - len_ymd = len(self) - year, month, day = (None, None, None) - - strids = (('y', self.ystridx), - ('m', self.mstridx), - ('d', self.dstridx)) - - strids = {key: val for key, val in strids if val is not None} - if (len(self) == len(strids) > 0 or - (len(self) == 3 and len(strids) == 2)): - return self._resolve_from_stridxs(strids) - - mstridx = self.mstridx - - if len_ymd > 3: - raise ValueError("More than three YMD values") - elif len_ymd == 1 or (mstridx is not None and len_ymd == 2): - # One member, or two members with a month string - if mstridx is not None: - month = self[mstridx] - # since mstridx is 0 or 1, self[mstridx-1] always - # looks up the other element - other = self[mstridx - 1] - else: - other = self[0] - - if len_ymd > 1 or mstridx is None: - if other > 31: - year = other - else: - day = other - - elif len_ymd == 2: - # Two members with numbers - if self[0] > 31: - # 99-01 - year, month = self - elif self[1] > 31: - # 01-99 - month, year = self - elif dayfirst and self[1] <= 12: - # 13-01 - day, month = self - else: - # 01-13 - month, day = self - - elif len_ymd == 3: - # Three members - if mstridx == 0: - if self[1] > 31: - # Apr-2003-25 - month, year, day = self - else: - month, day, year = self - elif mstridx == 1: - if self[0] > 31 or (yearfirst and self[2] <= 31): - # 99-Jan-01 - year, month, day = self - else: - # 01-Jan-01 - # Give precedence to day-first, since - # two-digit years is usually hand-written. - day, month, year = self - - elif mstridx == 2: - # WTF!? - if self[1] > 31: - # 01-99-Jan - day, year, month = self - else: - # 99-01-Jan - year, day, month = self - - else: - if (self[0] > 31 or - self.ystridx == 0 or - (yearfirst and self[1] <= 12 and self[2] <= 31)): - # 99-01-01 - if dayfirst and self[2] <= 12: - year, day, month = self - else: - year, month, day = self - elif self[0] > 12 or (dayfirst and self[1] <= 12): - # 13-01-01 - day, month, year = self - else: - # 01-13-01 - month, day, year = self - - return year, month, day - - -class parser(object): - def __init__(self, info=None): - self.info = info or parserinfo() - - def parse(self, timestr, default=None, - ignoretz=False, tzinfos=None, **kwargs): - """ - Parse the date/time string into a :class:`datetime.datetime` object. - - :param timestr: - Any date/time string using the supported formats. - - :param default: - The default datetime object, if this is a datetime object and not - ``None``, elements specified in ``timestr`` replace elements in the - default object. - - :param ignoretz: - If set ``True``, time zones in parsed strings are ignored and a - naive :class:`datetime.datetime` object is returned. - - :param tzinfos: - Additional time zone names / aliases which may be present in the - string. This argument maps time zone names (and optionally offsets - from those time zones) to time zones. This parameter can be a - dictionary with timezone aliases mapping time zone names to time - zones or a function taking two parameters (``tzname`` and - ``tzoffset``) and returning a time zone. - - The timezones to which the names are mapped can be an integer - offset from UTC in seconds or a :class:`tzinfo` object. - - .. doctest:: - :options: +NORMALIZE_WHITESPACE - - >>> from dateutil.parser import parse - >>> from dateutil.tz import gettz - >>> tzinfos = {"BRST": -7200, "CST": gettz("America/Chicago")} - >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -7200)) - >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, - tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) - - This parameter is ignored if ``ignoretz`` is set. - - :param \\*\\*kwargs: - Keyword arguments as passed to ``_parse()``. - - :return: - Returns a :class:`datetime.datetime` object or, if the - ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the - first element being a :class:`datetime.datetime` object, the second - a tuple containing the fuzzy tokens. - - :raises ParserError: - Raised for invalid or unknown string format, if the provided - :class:`tzinfo` is not in a valid format, or if an invalid date - would be created. - - :raises TypeError: - Raised for non-string or character stream input. - - :raises OverflowError: - Raised if the parsed date exceeds the largest valid C integer on - your system. - """ - - if default is None: - default = datetime.datetime.now().replace(hour=0, minute=0, - second=0, microsecond=0) - - res, skipped_tokens = self._parse(timestr, **kwargs) - - if res is None: - raise ParserError("Unknown string format: %s", timestr) - - if len(res) == 0: - raise ParserError("String does not contain a date: %s", timestr) - - try: - ret = self._build_naive(res, default) - except ValueError as e: - six.raise_from(ParserError(str(e) + ": %s", timestr), e) - - if not ignoretz: - ret = self._build_tzaware(ret, res, tzinfos) - - if kwargs.get('fuzzy_with_tokens', False): - return ret, skipped_tokens - else: - return ret - - class _result(_resultbase): - __slots__ = ["year", "month", "day", "weekday", - "hour", "minute", "second", "microsecond", - "tzname", "tzoffset", "ampm","any_unused_tokens"] - - def _parse(self, timestr, dayfirst=None, yearfirst=None, fuzzy=False, - fuzzy_with_tokens=False): - """ - Private method which performs the heavy lifting of parsing, called from - ``parse()``, which passes on its ``kwargs`` to this function. - - :param timestr: - The string to parse. - - :param dayfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the day (``True``) or month (``False``). If - ``yearfirst`` is set to ``True``, this distinguishes between YDM - and YMD. If set to ``None``, this value is retrieved from the - current :class:`parserinfo` object (which itself defaults to - ``False``). - - :param yearfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the year. If ``True``, the first number is taken - to be the year, otherwise the last number is taken to be the year. - If this is set to ``None``, the value is retrieved from the current - :class:`parserinfo` object (which itself defaults to ``False``). - - :param fuzzy: - Whether to allow fuzzy parsing, allowing for string like "Today is - January 1, 2047 at 8:21:00AM". - - :param fuzzy_with_tokens: - If ``True``, ``fuzzy`` is automatically set to True, and the parser - will return a tuple where the first element is the parsed - :class:`datetime.datetime` datetimestamp and the second element is - a tuple containing the portions of the string which were ignored: - - .. doctest:: - - >>> from dateutil.parser import parse - >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) - (datetime.datetime(2047, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) - - """ - if fuzzy_with_tokens: - fuzzy = True - - info = self.info - - if dayfirst is None: - dayfirst = info.dayfirst - - if yearfirst is None: - yearfirst = info.yearfirst - - res = self._result() - l = _timelex.split(timestr) # Splits the timestr into tokens - - skipped_idxs = [] - - # year/month/day list - ymd = _ymd() - - len_l = len(l) - i = 0 - try: - while i < len_l: - - # Check if it's a number - value_repr = l[i] - try: - value = float(value_repr) - except ValueError: - value = None - - if value is not None: - # Numeric token - i = self._parse_numeric_token(l, i, info, ymd, res, fuzzy) - - # Check weekday - elif info.weekday(l[i]) is not None: - value = info.weekday(l[i]) - res.weekday = value - - # Check month name - elif info.month(l[i]) is not None: - value = info.month(l[i]) - ymd.append(value, 'M') - - if i + 1 < len_l: - if l[i + 1] in ('-', '/'): - # Jan-01[-99] - sep = l[i + 1] - ymd.append(l[i + 2]) - - if i + 3 < len_l and l[i + 3] == sep: - # Jan-01-99 - ymd.append(l[i + 4]) - i += 2 - - i += 2 - - elif (i + 4 < len_l and l[i + 1] == l[i + 3] == ' ' and - info.pertain(l[i + 2])): - # Jan of 01 - # In this case, 01 is clearly year - if l[i + 4].isdigit(): - # Convert it here to become unambiguous - value = int(l[i + 4]) - year = str(info.convertyear(value)) - ymd.append(year, 'Y') - else: - # Wrong guess - pass - # TODO: not hit in tests - i += 4 - - # Check am/pm - elif info.ampm(l[i]) is not None: - value = info.ampm(l[i]) - val_is_ampm = self._ampm_valid(res.hour, res.ampm, fuzzy) - - if val_is_ampm: - res.hour = self._adjust_ampm(res.hour, value) - res.ampm = value - - elif fuzzy: - skipped_idxs.append(i) - - # Check for a timezone name - elif self._could_be_tzname(res.hour, res.tzname, res.tzoffset, l[i]): - res.tzname = l[i] - res.tzoffset = info.tzoffset(res.tzname) - - # Check for something like GMT+3, or BRST+3. Notice - # that it doesn't mean "I am 3 hours after GMT", but - # "my time +3 is GMT". If found, we reverse the - # logic so that timezone parsing code will get it - # right. - if i + 1 < len_l and l[i + 1] in ('+', '-'): - l[i + 1] = ('+', '-')[l[i + 1] == '+'] - res.tzoffset = None - if info.utczone(res.tzname): - # With something like GMT+3, the timezone - # is *not* GMT. - res.tzname = None - - # Check for a numbered timezone - elif res.hour is not None and l[i] in ('+', '-'): - signal = (-1, 1)[l[i] == '+'] - len_li = len(l[i + 1]) - - # TODO: check that l[i + 1] is integer? - if len_li == 4: - # -0300 - hour_offset = int(l[i + 1][:2]) - min_offset = int(l[i + 1][2:]) - elif i + 2 < len_l and l[i + 2] == ':': - # -03:00 - hour_offset = int(l[i + 1]) - min_offset = int(l[i + 3]) # TODO: Check that l[i+3] is minute-like? - i += 2 - elif len_li <= 2: - # -[0]3 - hour_offset = int(l[i + 1][:2]) - min_offset = 0 - else: - raise ValueError(timestr) - - res.tzoffset = signal * (hour_offset * 3600 + min_offset * 60) - - # Look for a timezone name between parenthesis - if (i + 5 < len_l and - info.jump(l[i + 2]) and l[i + 3] == '(' and - l[i + 5] == ')' and - 3 <= len(l[i + 4]) and - self._could_be_tzname(res.hour, res.tzname, - None, l[i + 4])): - # -0300 (BRST) - res.tzname = l[i + 4] - i += 4 - - i += 1 - - # Check jumps - elif not (info.jump(l[i]) or fuzzy): - raise ValueError(timestr) - - else: - skipped_idxs.append(i) - i += 1 - - # Process year/month/day - year, month, day = ymd.resolve_ymd(yearfirst, dayfirst) - - res.century_specified = ymd.century_specified - res.year = year - res.month = month - res.day = day - - except (IndexError, ValueError): - return None, None - - if not info.validate(res): - return None, None - - if fuzzy_with_tokens: - skipped_tokens = self._recombine_skipped(l, skipped_idxs) - return res, tuple(skipped_tokens) - else: - return res, None - - def _parse_numeric_token(self, tokens, idx, info, ymd, res, fuzzy): - # Token is a number - value_repr = tokens[idx] - try: - value = self._to_decimal(value_repr) - except Exception as e: - six.raise_from(ValueError('Unknown numeric token'), e) - - len_li = len(value_repr) - - len_l = len(tokens) - - if (len(ymd) == 3 and len_li in (2, 4) and - res.hour is None and - (idx + 1 >= len_l or - (tokens[idx + 1] != ':' and - info.hms(tokens[idx + 1]) is None))): - # 19990101T23[59] - s = tokens[idx] - res.hour = int(s[:2]) - - if len_li == 4: - res.minute = int(s[2:]) - - elif len_li == 6 or (len_li > 6 and tokens[idx].find('.') == 6): - # YYMMDD or HHMMSS[.ss] - s = tokens[idx] - - if not ymd and '.' not in tokens[idx]: - ymd.append(s[:2]) - ymd.append(s[2:4]) - ymd.append(s[4:]) - else: - # 19990101T235959[.59] - - # TODO: Check if res attributes already set. - res.hour = int(s[:2]) - res.minute = int(s[2:4]) - res.second, res.microsecond = self._parsems(s[4:]) - - elif len_li in (8, 12, 14): - # YYYYMMDD - s = tokens[idx] - ymd.append(s[:4], 'Y') - ymd.append(s[4:6]) - ymd.append(s[6:8]) - - if len_li > 8: - res.hour = int(s[8:10]) - res.minute = int(s[10:12]) - - if len_li > 12: - res.second = int(s[12:]) - - elif self._find_hms_idx(idx, tokens, info, allow_jump=True) is not None: - # HH[ ]h or MM[ ]m or SS[.ss][ ]s - hms_idx = self._find_hms_idx(idx, tokens, info, allow_jump=True) - (idx, hms) = self._parse_hms(idx, tokens, info, hms_idx) - if hms is not None: - # TODO: checking that hour/minute/second are not - # already set? - self._assign_hms(res, value_repr, hms) - - elif idx + 2 < len_l and tokens[idx + 1] == ':': - # HH:MM[:SS[.ss]] - res.hour = int(value) - value = self._to_decimal(tokens[idx + 2]) # TODO: try/except for this? - (res.minute, res.second) = self._parse_min_sec(value) - - if idx + 4 < len_l and tokens[idx + 3] == ':': - res.second, res.microsecond = self._parsems(tokens[idx + 4]) - - idx += 2 - - idx += 2 - - elif idx + 1 < len_l and tokens[idx + 1] in ('-', '/', '.'): - sep = tokens[idx + 1] - ymd.append(value_repr) - - if idx + 2 < len_l and not info.jump(tokens[idx + 2]): - if tokens[idx + 2].isdigit(): - # 01-01[-01] - ymd.append(tokens[idx + 2]) - else: - # 01-Jan[-01] - value = info.month(tokens[idx + 2]) - - if value is not None: - ymd.append(value, 'M') - else: - raise ValueError() - - if idx + 3 < len_l and tokens[idx + 3] == sep: - # We have three members - value = info.month(tokens[idx + 4]) - - if value is not None: - ymd.append(value, 'M') - else: - ymd.append(tokens[idx + 4]) - idx += 2 - - idx += 1 - idx += 1 - - elif idx + 1 >= len_l or info.jump(tokens[idx + 1]): - if idx + 2 < len_l and info.ampm(tokens[idx + 2]) is not None: - # 12 am - hour = int(value) - res.hour = self._adjust_ampm(hour, info.ampm(tokens[idx + 2])) - idx += 1 - else: - # Year, month or day - ymd.append(value) - idx += 1 - - elif info.ampm(tokens[idx + 1]) is not None and (0 <= value < 24): - # 12am - hour = int(value) - res.hour = self._adjust_ampm(hour, info.ampm(tokens[idx + 1])) - idx += 1 - - elif ymd.could_be_day(value): - ymd.append(value) - - elif not fuzzy: - raise ValueError() - - return idx - - def _find_hms_idx(self, idx, tokens, info, allow_jump): - len_l = len(tokens) - - if idx+1 < len_l and info.hms(tokens[idx+1]) is not None: - # There is an "h", "m", or "s" label following this token. We take - # assign the upcoming label to the current token. - # e.g. the "12" in 12h" - hms_idx = idx + 1 - - elif (allow_jump and idx+2 < len_l and tokens[idx+1] == ' ' and - info.hms(tokens[idx+2]) is not None): - # There is a space and then an "h", "m", or "s" label. - # e.g. the "12" in "12 h" - hms_idx = idx + 2 - - elif idx > 0 and info.hms(tokens[idx-1]) is not None: - # There is a "h", "m", or "s" preceding this token. Since neither - # of the previous cases was hit, there is no label following this - # token, so we use the previous label. - # e.g. the "04" in "12h04" - hms_idx = idx-1 - - elif (1 < idx == len_l-1 and tokens[idx-1] == ' ' and - info.hms(tokens[idx-2]) is not None): - # If we are looking at the final token, we allow for a - # backward-looking check to skip over a space. - # TODO: Are we sure this is the right condition here? - hms_idx = idx - 2 - - else: - hms_idx = None - - return hms_idx - - def _assign_hms(self, res, value_repr, hms): - # See GH issue #427, fixing float rounding - value = self._to_decimal(value_repr) - - if hms == 0: - # Hour - res.hour = int(value) - if value % 1: - res.minute = int(60*(value % 1)) - - elif hms == 1: - (res.minute, res.second) = self._parse_min_sec(value) - - elif hms == 2: - (res.second, res.microsecond) = self._parsems(value_repr) - - def _could_be_tzname(self, hour, tzname, tzoffset, token): - return (hour is not None and - tzname is None and - tzoffset is None and - len(token) <= 5 and - (all(x in string.ascii_uppercase for x in token) - or token in self.info.UTCZONE)) - - def _ampm_valid(self, hour, ampm, fuzzy): - """ - For fuzzy parsing, 'a' or 'am' (both valid English words) - may erroneously trigger the AM/PM flag. Deal with that - here. - """ - val_is_ampm = True - - # If there's already an AM/PM flag, this one isn't one. - if fuzzy and ampm is not None: - val_is_ampm = False - - # If AM/PM is found and hour is not, raise a ValueError - if hour is None: - if fuzzy: - val_is_ampm = False - else: - raise ValueError('No hour specified with AM or PM flag.') - elif not 0 <= hour <= 12: - # If AM/PM is found, it's a 12 hour clock, so raise - # an error for invalid range - if fuzzy: - val_is_ampm = False - else: - raise ValueError('Invalid hour specified for 12-hour clock.') - - return val_is_ampm - - def _adjust_ampm(self, hour, ampm): - if hour < 12 and ampm == 1: - hour += 12 - elif hour == 12 and ampm == 0: - hour = 0 - return hour - - def _parse_min_sec(self, value): - # TODO: Every usage of this function sets res.second to the return - # value. Are there any cases where second will be returned as None and - # we *don't* want to set res.second = None? - minute = int(value) - second = None - - sec_remainder = value % 1 - if sec_remainder: - second = int(60 * sec_remainder) - return (minute, second) - - def _parse_hms(self, idx, tokens, info, hms_idx): - # TODO: Is this going to admit a lot of false-positives for when we - # just happen to have digits and "h", "m" or "s" characters in non-date - # text? I guess hex hashes won't have that problem, but there's plenty - # of random junk out there. - if hms_idx is None: - hms = None - new_idx = idx - elif hms_idx > idx: - hms = info.hms(tokens[hms_idx]) - new_idx = hms_idx - else: - # Looking backwards, increment one. - hms = info.hms(tokens[hms_idx]) + 1 - new_idx = idx - - return (new_idx, hms) - - # ------------------------------------------------------------------ - # Handling for individual tokens. These are kept as methods instead - # of functions for the sake of customizability via subclassing. - - def _parsems(self, value): - """Parse a I[.F] seconds value into (seconds, microseconds).""" - if "." not in value: - return int(value), 0 - else: - i, f = value.split(".") - return int(i), int(f.ljust(6, "0")[:6]) - - def _to_decimal(self, val): - try: - decimal_value = Decimal(val) - # See GH 662, edge case, infinite value should not be converted - # via `_to_decimal` - if not decimal_value.is_finite(): - raise ValueError("Converted decimal value is infinite or NaN") - except Exception as e: - msg = "Could not convert %s to decimal" % val - six.raise_from(ValueError(msg), e) - else: - return decimal_value - - # ------------------------------------------------------------------ - # Post-Parsing construction of datetime output. These are kept as - # methods instead of functions for the sake of customizability via - # subclassing. - - def _build_tzinfo(self, tzinfos, tzname, tzoffset): - if callable(tzinfos): - tzdata = tzinfos(tzname, tzoffset) - else: - tzdata = tzinfos.get(tzname) - # handle case where tzinfo is paased an options that returns None - # eg tzinfos = {'BRST' : None} - if isinstance(tzdata, datetime.tzinfo) or tzdata is None: - tzinfo = tzdata - elif isinstance(tzdata, text_type): - tzinfo = tz.tzstr(tzdata) - elif isinstance(tzdata, integer_types): - tzinfo = tz.tzoffset(tzname, tzdata) - else: - raise TypeError("Offset must be tzinfo subclass, tz string, " - "or int offset.") - return tzinfo - - def _build_tzaware(self, naive, res, tzinfos): - if (callable(tzinfos) or (tzinfos and res.tzname in tzinfos)): - tzinfo = self._build_tzinfo(tzinfos, res.tzname, res.tzoffset) - aware = naive.replace(tzinfo=tzinfo) - aware = self._assign_tzname(aware, res.tzname) - - elif res.tzname and res.tzname in time.tzname: - aware = naive.replace(tzinfo=tz.tzlocal()) - - # Handle ambiguous local datetime - aware = self._assign_tzname(aware, res.tzname) - - # This is mostly relevant for winter GMT zones parsed in the UK - if (aware.tzname() != res.tzname and - res.tzname in self.info.UTCZONE): - aware = aware.replace(tzinfo=tz.UTC) - - elif res.tzoffset == 0: - aware = naive.replace(tzinfo=tz.UTC) - - elif res.tzoffset: - aware = naive.replace(tzinfo=tz.tzoffset(res.tzname, res.tzoffset)) - - elif not res.tzname and not res.tzoffset: - # i.e. no timezone information was found. - aware = naive - - elif res.tzname: - # tz-like string was parsed but we don't know what to do - # with it - warnings.warn("tzname {tzname} identified but not understood. " - "Pass `tzinfos` argument in order to correctly " - "return a timezone-aware datetime. In a future " - "version, this will raise an " - "exception.".format(tzname=res.tzname), - category=UnknownTimezoneWarning) - aware = naive - - return aware - - def _build_naive(self, res, default): - repl = {} - for attr in ("year", "month", "day", "hour", - "minute", "second", "microsecond"): - value = getattr(res, attr) - if value is not None: - repl[attr] = value - - if 'day' not in repl: - # If the default day exceeds the last day of the month, fall back - # to the end of the month. - cyear = default.year if res.year is None else res.year - cmonth = default.month if res.month is None else res.month - cday = default.day if res.day is None else res.day - - if cday > monthrange(cyear, cmonth)[1]: - repl['day'] = monthrange(cyear, cmonth)[1] - - naive = default.replace(**repl) - - if res.weekday is not None and not res.day: - naive = naive + relativedelta.relativedelta(weekday=res.weekday) - - return naive - - def _assign_tzname(self, dt, tzname): - if dt.tzname() != tzname: - new_dt = tz.enfold(dt, fold=1) - if new_dt.tzname() == tzname: - return new_dt - - return dt - - def _recombine_skipped(self, tokens, skipped_idxs): - """ - >>> tokens = ["foo", " ", "bar", " ", "19June2000", "baz"] - >>> skipped_idxs = [0, 1, 2, 5] - >>> _recombine_skipped(tokens, skipped_idxs) - ["foo bar", "baz"] - """ - skipped_tokens = [] - for i, idx in enumerate(sorted(skipped_idxs)): - if i > 0 and idx - 1 == skipped_idxs[i - 1]: - skipped_tokens[-1] = skipped_tokens[-1] + tokens[idx] - else: - skipped_tokens.append(tokens[idx]) - - return skipped_tokens - - -DEFAULTPARSER = parser() - - -def parse(timestr, parserinfo=None, **kwargs): - """ - - Parse a string in one of the supported formats, using the - ``parserinfo`` parameters. - - :param timestr: - A string containing a date/time stamp. - - :param parserinfo: - A :class:`parserinfo` object containing parameters for the parser. - If ``None``, the default arguments to the :class:`parserinfo` - constructor are used. - - The ``**kwargs`` parameter takes the following keyword arguments: - - :param default: - The default datetime object, if this is a datetime object and not - ``None``, elements specified in ``timestr`` replace elements in the - default object. - - :param ignoretz: - If set ``True``, time zones in parsed strings are ignored and a naive - :class:`datetime` object is returned. - - :param tzinfos: - Additional time zone names / aliases which may be present in the - string. This argument maps time zone names (and optionally offsets - from those time zones) to time zones. This parameter can be a - dictionary with timezone aliases mapping time zone names to time - zones or a function taking two parameters (``tzname`` and - ``tzoffset``) and returning a time zone. - - The timezones to which the names are mapped can be an integer - offset from UTC in seconds or a :class:`tzinfo` object. - - .. doctest:: - :options: +NORMALIZE_WHITESPACE - - >>> from dateutil.parser import parse - >>> from dateutil.tz import gettz - >>> tzinfos = {"BRST": -7200, "CST": gettz("America/Chicago")} - >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -7200)) - >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, - tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) - - This parameter is ignored if ``ignoretz`` is set. - - :param dayfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the day (``True``) or month (``False``). If - ``yearfirst`` is set to ``True``, this distinguishes between YDM and - YMD. If set to ``None``, this value is retrieved from the current - :class:`parserinfo` object (which itself defaults to ``False``). - - :param yearfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the year. If ``True``, the first number is taken to - be the year, otherwise the last number is taken to be the year. If - this is set to ``None``, the value is retrieved from the current - :class:`parserinfo` object (which itself defaults to ``False``). - - :param fuzzy: - Whether to allow fuzzy parsing, allowing for string like "Today is - January 1, 2047 at 8:21:00AM". - - :param fuzzy_with_tokens: - If ``True``, ``fuzzy`` is automatically set to True, and the parser - will return a tuple where the first element is the parsed - :class:`datetime.datetime` datetimestamp and the second element is - a tuple containing the portions of the string which were ignored: - - .. doctest:: - - >>> from dateutil.parser import parse - >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) - (datetime.datetime(2047, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) - - :return: - Returns a :class:`datetime.datetime` object or, if the - ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the - first element being a :class:`datetime.datetime` object, the second - a tuple containing the fuzzy tokens. - - :raises ParserError: - Raised for invalid or unknown string formats, if the provided - :class:`tzinfo` is not in a valid format, or if an invalid date would - be created. - - :raises OverflowError: - Raised if the parsed date exceeds the largest valid C integer on - your system. - """ - if parserinfo: - return parser(parserinfo).parse(timestr, **kwargs) - else: - return DEFAULTPARSER.parse(timestr, **kwargs) - - -class _tzparser(object): - - class _result(_resultbase): - - __slots__ = ["stdabbr", "stdoffset", "dstabbr", "dstoffset", - "start", "end"] - - class _attr(_resultbase): - __slots__ = ["month", "week", "weekday", - "yday", "jyday", "day", "time"] - - def __repr__(self): - return self._repr("") - - def __init__(self): - _resultbase.__init__(self) - self.start = self._attr() - self.end = self._attr() - - def parse(self, tzstr): - res = self._result() - l = [x for x in re.split(r'([,:.]|[a-zA-Z]+|[0-9]+)',tzstr) if x] - used_idxs = list() - try: - - len_l = len(l) - - i = 0 - while i < len_l: - # BRST+3[BRDT[+2]] - j = i - while j < len_l and not [x for x in l[j] - if x in "0123456789:,-+"]: - j += 1 - if j != i: - if not res.stdabbr: - offattr = "stdoffset" - res.stdabbr = "".join(l[i:j]) - else: - offattr = "dstoffset" - res.dstabbr = "".join(l[i:j]) - - for ii in range(j): - used_idxs.append(ii) - i = j - if (i < len_l and (l[i] in ('+', '-') or l[i][0] in - "0123456789")): - if l[i] in ('+', '-'): - # Yes, that's right. See the TZ variable - # documentation. - signal = (1, -1)[l[i] == '+'] - used_idxs.append(i) - i += 1 - else: - signal = -1 - len_li = len(l[i]) - if len_li == 4: - # -0300 - setattr(res, offattr, (int(l[i][:2]) * 3600 + - int(l[i][2:]) * 60) * signal) - elif i + 1 < len_l and l[i + 1] == ':': - # -03:00 - setattr(res, offattr, - (int(l[i]) * 3600 + - int(l[i + 2]) * 60) * signal) - used_idxs.append(i) - i += 2 - elif len_li <= 2: - # -[0]3 - setattr(res, offattr, - int(l[i][:2]) * 3600 * signal) - else: - return None - used_idxs.append(i) - i += 1 - if res.dstabbr: - break - else: - break - - - if i < len_l: - for j in range(i, len_l): - if l[j] == ';': - l[j] = ',' - - assert l[i] == ',' - - i += 1 - - if i >= len_l: - pass - elif (8 <= l.count(',') <= 9 and - not [y for x in l[i:] if x != ',' - for y in x if y not in "0123456789+-"]): - # GMT0BST,3,0,30,3600,10,0,26,7200[,3600] - for x in (res.start, res.end): - x.month = int(l[i]) - used_idxs.append(i) - i += 2 - if l[i] == '-': - value = int(l[i + 1]) * -1 - used_idxs.append(i) - i += 1 - else: - value = int(l[i]) - used_idxs.append(i) - i += 2 - if value: - x.week = value - x.weekday = (int(l[i]) - 1) % 7 - else: - x.day = int(l[i]) - used_idxs.append(i) - i += 2 - x.time = int(l[i]) - used_idxs.append(i) - i += 2 - if i < len_l: - if l[i] in ('-', '+'): - signal = (-1, 1)[l[i] == "+"] - used_idxs.append(i) - i += 1 - else: - signal = 1 - used_idxs.append(i) - res.dstoffset = (res.stdoffset + int(l[i]) * signal) - - # This was a made-up format that is not in normal use - warn(('Parsed time zone "%s"' % tzstr) + - 'is in a non-standard dateutil-specific format, which ' + - 'is now deprecated; support for parsing this format ' + - 'will be removed in future versions. It is recommended ' + - 'that you switch to a standard format like the GNU ' + - 'TZ variable format.', tz.DeprecatedTzFormatWarning) - elif (l.count(',') == 2 and l[i:].count('/') <= 2 and - not [y for x in l[i:] if x not in (',', '/', 'J', 'M', - '.', '-', ':') - for y in x if y not in "0123456789"]): - for x in (res.start, res.end): - if l[i] == 'J': - # non-leap year day (1 based) - used_idxs.append(i) - i += 1 - x.jyday = int(l[i]) - elif l[i] == 'M': - # month[-.]week[-.]weekday - used_idxs.append(i) - i += 1 - x.month = int(l[i]) - used_idxs.append(i) - i += 1 - assert l[i] in ('-', '.') - used_idxs.append(i) - i += 1 - x.week = int(l[i]) - if x.week == 5: - x.week = -1 - used_idxs.append(i) - i += 1 - assert l[i] in ('-', '.') - used_idxs.append(i) - i += 1 - x.weekday = (int(l[i]) - 1) % 7 - else: - # year day (zero based) - x.yday = int(l[i]) + 1 - - used_idxs.append(i) - i += 1 - - if i < len_l and l[i] == '/': - used_idxs.append(i) - i += 1 - # start time - len_li = len(l[i]) - if len_li == 4: - # -0300 - x.time = (int(l[i][:2]) * 3600 + - int(l[i][2:]) * 60) - elif i + 1 < len_l and l[i + 1] == ':': - # -03:00 - x.time = int(l[i]) * 3600 + int(l[i + 2]) * 60 - used_idxs.append(i) - i += 2 - if i + 1 < len_l and l[i + 1] == ':': - used_idxs.append(i) - i += 2 - x.time += int(l[i]) - elif len_li <= 2: - # -[0]3 - x.time = (int(l[i][:2]) * 3600) - else: - return None - used_idxs.append(i) - i += 1 - - assert i == len_l or l[i] == ',' - - i += 1 - - assert i >= len_l - - except (IndexError, ValueError, AssertionError): - return None - - unused_idxs = set(range(len_l)).difference(used_idxs) - res.any_unused_tokens = not {l[n] for n in unused_idxs}.issubset({",",":"}) - return res - - -DEFAULTTZPARSER = _tzparser() - - -def _parsetz(tzstr): - return DEFAULTTZPARSER.parse(tzstr) - - -class ParserError(ValueError): - """Exception subclass used for any failure to parse a datetime string. - - This is a subclass of :py:exc:`ValueError`, and should be raised any time - earlier versions of ``dateutil`` would have raised ``ValueError``. - - .. versionadded:: 2.8.1 - """ - def __str__(self): - try: - return self.args[0] % self.args[1:] - except (TypeError, IndexError): - return super(ParserError, self).__str__() - - def __repr__(self): - args = ", ".join("'%s'" % arg for arg in self.args) - return "%s(%s)" % (self.__class__.__name__, args) - - -class UnknownTimezoneWarning(RuntimeWarning): - """Raised when the parser finds a timezone it cannot parse into a tzinfo. - - .. versionadded:: 2.7.0 - """ -# vim:ts=4:sw=4:et diff --git a/.venv/Lib/site-packages/dateutil/parser/isoparser.py b/.venv/Lib/site-packages/dateutil/parser/isoparser.py deleted file mode 100644 index 5d7bee3..0000000 --- a/.venv/Lib/site-packages/dateutil/parser/isoparser.py +++ /dev/null @@ -1,416 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers a parser for ISO-8601 strings - -It is intended to support all valid date, time and datetime formats per the -ISO-8601 specification. - -..versionadded:: 2.7.0 -""" -from datetime import datetime, timedelta, time, date -import calendar -from dateutil import tz - -from functools import wraps - -import re -import six - -__all__ = ["isoparse", "isoparser"] - - -def _takes_ascii(f): - @wraps(f) - def func(self, str_in, *args, **kwargs): - # If it's a stream, read the whole thing - str_in = getattr(str_in, 'read', lambda: str_in)() - - # If it's unicode, turn it into bytes, since ISO-8601 only covers ASCII - if isinstance(str_in, six.text_type): - # ASCII is the same in UTF-8 - try: - str_in = str_in.encode('ascii') - except UnicodeEncodeError as e: - msg = 'ISO-8601 strings should contain only ASCII characters' - six.raise_from(ValueError(msg), e) - - return f(self, str_in, *args, **kwargs) - - return func - - -class isoparser(object): - def __init__(self, sep=None): - """ - :param sep: - A single character that separates date and time portions. If - ``None``, the parser will accept any single character. - For strict ISO-8601 adherence, pass ``'T'``. - """ - if sep is not None: - if (len(sep) != 1 or ord(sep) >= 128 or sep in '0123456789'): - raise ValueError('Separator must be a single, non-numeric ' + - 'ASCII character') - - sep = sep.encode('ascii') - - self._sep = sep - - @_takes_ascii - def isoparse(self, dt_str): - """ - Parse an ISO-8601 datetime string into a :class:`datetime.datetime`. - - An ISO-8601 datetime string consists of a date portion, followed - optionally by a time portion - the date and time portions are separated - by a single character separator, which is ``T`` in the official - standard. Incomplete date formats (such as ``YYYY-MM``) may *not* be - combined with a time portion. - - Supported date formats are: - - Common: - - - ``YYYY`` - - ``YYYY-MM`` or ``YYYYMM`` - - ``YYYY-MM-DD`` or ``YYYYMMDD`` - - Uncommon: - - - ``YYYY-Www`` or ``YYYYWww`` - ISO week (day defaults to 0) - - ``YYYY-Www-D`` or ``YYYYWwwD`` - ISO week and day - - The ISO week and day numbering follows the same logic as - :func:`datetime.date.isocalendar`. - - Supported time formats are: - - - ``hh`` - - ``hh:mm`` or ``hhmm`` - - ``hh:mm:ss`` or ``hhmmss`` - - ``hh:mm:ss.ssssss`` (Up to 6 sub-second digits) - - Midnight is a special case for `hh`, as the standard supports both - 00:00 and 24:00 as a representation. The decimal separator can be - either a dot or a comma. - - - .. caution:: - - Support for fractional components other than seconds is part of the - ISO-8601 standard, but is not currently implemented in this parser. - - Supported time zone offset formats are: - - - `Z` (UTC) - - `±HH:MM` - - `±HHMM` - - `±HH` - - Offsets will be represented as :class:`dateutil.tz.tzoffset` objects, - with the exception of UTC, which will be represented as - :class:`dateutil.tz.tzutc`. Time zone offsets equivalent to UTC (such - as `+00:00`) will also be represented as :class:`dateutil.tz.tzutc`. - - :param dt_str: - A string or stream containing only an ISO-8601 datetime string - - :return: - Returns a :class:`datetime.datetime` representing the string. - Unspecified components default to their lowest value. - - .. warning:: - - As of version 2.7.0, the strictness of the parser should not be - considered a stable part of the contract. Any valid ISO-8601 string - that parses correctly with the default settings will continue to - parse correctly in future versions, but invalid strings that - currently fail (e.g. ``2017-01-01T00:00+00:00:00``) are not - guaranteed to continue failing in future versions if they encode - a valid date. - - .. versionadded:: 2.7.0 - """ - components, pos = self._parse_isodate(dt_str) - - if len(dt_str) > pos: - if self._sep is None or dt_str[pos:pos + 1] == self._sep: - components += self._parse_isotime(dt_str[pos + 1:]) - else: - raise ValueError('String contains unknown ISO components') - - if len(components) > 3 and components[3] == 24: - components[3] = 0 - return datetime(*components) + timedelta(days=1) - - return datetime(*components) - - @_takes_ascii - def parse_isodate(self, datestr): - """ - Parse the date portion of an ISO string. - - :param datestr: - The string portion of an ISO string, without a separator - - :return: - Returns a :class:`datetime.date` object - """ - components, pos = self._parse_isodate(datestr) - if pos < len(datestr): - raise ValueError('String contains unknown ISO ' + - 'components: {!r}'.format(datestr.decode('ascii'))) - return date(*components) - - @_takes_ascii - def parse_isotime(self, timestr): - """ - Parse the time portion of an ISO string. - - :param timestr: - The time portion of an ISO string, without a separator - - :return: - Returns a :class:`datetime.time` object - """ - components = self._parse_isotime(timestr) - if components[0] == 24: - components[0] = 0 - return time(*components) - - @_takes_ascii - def parse_tzstr(self, tzstr, zero_as_utc=True): - """ - Parse a valid ISO time zone string. - - See :func:`isoparser.isoparse` for details on supported formats. - - :param tzstr: - A string representing an ISO time zone offset - - :param zero_as_utc: - Whether to return :class:`dateutil.tz.tzutc` for zero-offset zones - - :return: - Returns :class:`dateutil.tz.tzoffset` for offsets and - :class:`dateutil.tz.tzutc` for ``Z`` and (if ``zero_as_utc`` is - specified) offsets equivalent to UTC. - """ - return self._parse_tzstr(tzstr, zero_as_utc=zero_as_utc) - - # Constants - _DATE_SEP = b'-' - _TIME_SEP = b':' - _FRACTION_REGEX = re.compile(b'[\\.,]([0-9]+)') - - def _parse_isodate(self, dt_str): - try: - return self._parse_isodate_common(dt_str) - except ValueError: - return self._parse_isodate_uncommon(dt_str) - - def _parse_isodate_common(self, dt_str): - len_str = len(dt_str) - components = [1, 1, 1] - - if len_str < 4: - raise ValueError('ISO string too short') - - # Year - components[0] = int(dt_str[0:4]) - pos = 4 - if pos >= len_str: - return components, pos - - has_sep = dt_str[pos:pos + 1] == self._DATE_SEP - if has_sep: - pos += 1 - - # Month - if len_str - pos < 2: - raise ValueError('Invalid common month') - - components[1] = int(dt_str[pos:pos + 2]) - pos += 2 - - if pos >= len_str: - if has_sep: - return components, pos - else: - raise ValueError('Invalid ISO format') - - if has_sep: - if dt_str[pos:pos + 1] != self._DATE_SEP: - raise ValueError('Invalid separator in ISO string') - pos += 1 - - # Day - if len_str - pos < 2: - raise ValueError('Invalid common day') - components[2] = int(dt_str[pos:pos + 2]) - return components, pos + 2 - - def _parse_isodate_uncommon(self, dt_str): - if len(dt_str) < 4: - raise ValueError('ISO string too short') - - # All ISO formats start with the year - year = int(dt_str[0:4]) - - has_sep = dt_str[4:5] == self._DATE_SEP - - pos = 4 + has_sep # Skip '-' if it's there - if dt_str[pos:pos + 1] == b'W': - # YYYY-?Www-?D? - pos += 1 - weekno = int(dt_str[pos:pos + 2]) - pos += 2 - - dayno = 1 - if len(dt_str) > pos: - if (dt_str[pos:pos + 1] == self._DATE_SEP) != has_sep: - raise ValueError('Inconsistent use of dash separator') - - pos += has_sep - - dayno = int(dt_str[pos:pos + 1]) - pos += 1 - - base_date = self._calculate_weekdate(year, weekno, dayno) - else: - # YYYYDDD or YYYY-DDD - if len(dt_str) - pos < 3: - raise ValueError('Invalid ordinal day') - - ordinal_day = int(dt_str[pos:pos + 3]) - pos += 3 - - if ordinal_day < 1 or ordinal_day > (365 + calendar.isleap(year)): - raise ValueError('Invalid ordinal day' + - ' {} for year {}'.format(ordinal_day, year)) - - base_date = date(year, 1, 1) + timedelta(days=ordinal_day - 1) - - components = [base_date.year, base_date.month, base_date.day] - return components, pos - - def _calculate_weekdate(self, year, week, day): - """ - Calculate the day of corresponding to the ISO year-week-day calendar. - - This function is effectively the inverse of - :func:`datetime.date.isocalendar`. - - :param year: - The year in the ISO calendar - - :param week: - The week in the ISO calendar - range is [1, 53] - - :param day: - The day in the ISO calendar - range is [1 (MON), 7 (SUN)] - - :return: - Returns a :class:`datetime.date` - """ - if not 0 < week < 54: - raise ValueError('Invalid week: {}'.format(week)) - - if not 0 < day < 8: # Range is 1-7 - raise ValueError('Invalid weekday: {}'.format(day)) - - # Get week 1 for the specific year: - jan_4 = date(year, 1, 4) # Week 1 always has January 4th in it - week_1 = jan_4 - timedelta(days=jan_4.isocalendar()[2] - 1) - - # Now add the specific number of weeks and days to get what we want - week_offset = (week - 1) * 7 + (day - 1) - return week_1 + timedelta(days=week_offset) - - def _parse_isotime(self, timestr): - len_str = len(timestr) - components = [0, 0, 0, 0, None] - pos = 0 - comp = -1 - - if len_str < 2: - raise ValueError('ISO time too short') - - has_sep = False - - while pos < len_str and comp < 5: - comp += 1 - - if timestr[pos:pos + 1] in b'-+Zz': - # Detect time zone boundary - components[-1] = self._parse_tzstr(timestr[pos:]) - pos = len_str - break - - if comp == 1 and timestr[pos:pos+1] == self._TIME_SEP: - has_sep = True - pos += 1 - elif comp == 2 and has_sep: - if timestr[pos:pos+1] != self._TIME_SEP: - raise ValueError('Inconsistent use of colon separator') - pos += 1 - - if comp < 3: - # Hour, minute, second - components[comp] = int(timestr[pos:pos + 2]) - pos += 2 - - if comp == 3: - # Fraction of a second - frac = self._FRACTION_REGEX.match(timestr[pos:]) - if not frac: - continue - - us_str = frac.group(1)[:6] # Truncate to microseconds - components[comp] = int(us_str) * 10**(6 - len(us_str)) - pos += len(frac.group()) - - if pos < len_str: - raise ValueError('Unused components in ISO string') - - if components[0] == 24: - # Standard supports 00:00 and 24:00 as representations of midnight - if any(component != 0 for component in components[1:4]): - raise ValueError('Hour may only be 24 at 24:00:00.000') - - return components - - def _parse_tzstr(self, tzstr, zero_as_utc=True): - if tzstr == b'Z' or tzstr == b'z': - return tz.UTC - - if len(tzstr) not in {3, 5, 6}: - raise ValueError('Time zone offset must be 1, 3, 5 or 6 characters') - - if tzstr[0:1] == b'-': - mult = -1 - elif tzstr[0:1] == b'+': - mult = 1 - else: - raise ValueError('Time zone offset requires sign') - - hours = int(tzstr[1:3]) - if len(tzstr) == 3: - minutes = 0 - else: - minutes = int(tzstr[(4 if tzstr[3:4] == self._TIME_SEP else 3):]) - - if zero_as_utc and hours == 0 and minutes == 0: - return tz.UTC - else: - if minutes > 59: - raise ValueError('Invalid minutes in time zone offset') - - if hours > 23: - raise ValueError('Invalid hours in time zone offset') - - return tz.tzoffset(None, mult * (hours * 60 + minutes) * 60) - - -DEFAULT_ISOPARSER = isoparser() -isoparse = DEFAULT_ISOPARSER.isoparse diff --git a/.venv/Lib/site-packages/dateutil/relativedelta.py b/.venv/Lib/site-packages/dateutil/relativedelta.py deleted file mode 100644 index a9e85f7..0000000 --- a/.venv/Lib/site-packages/dateutil/relativedelta.py +++ /dev/null @@ -1,599 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -import calendar - -import operator -from math import copysign - -from six import integer_types -from warnings import warn - -from ._common import weekday - -MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7)) - -__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"] - - -class relativedelta(object): - """ - The relativedelta type is designed to be applied to an existing datetime and - can replace specific components of that datetime, or represents an interval - of time. - - It is based on the specification of the excellent work done by M.-A. Lemburg - in his - `mx.DateTime `_ extension. - However, notice that this type does *NOT* implement the same algorithm as - his work. Do *NOT* expect it to behave like mx.DateTime's counterpart. - - There are two different ways to build a relativedelta instance. The - first one is passing it two date/datetime classes:: - - relativedelta(datetime1, datetime2) - - The second one is passing it any number of the following keyword arguments:: - - relativedelta(arg1=x,arg2=y,arg3=z...) - - year, month, day, hour, minute, second, microsecond: - Absolute information (argument is singular); adding or subtracting a - relativedelta with absolute information does not perform an arithmetic - operation, but rather REPLACES the corresponding value in the - original datetime with the value(s) in relativedelta. - - years, months, weeks, days, hours, minutes, seconds, microseconds: - Relative information, may be negative (argument is plural); adding - or subtracting a relativedelta with relative information performs - the corresponding arithmetic operation on the original datetime value - with the information in the relativedelta. - - weekday: - One of the weekday instances (MO, TU, etc) available in the - relativedelta module. These instances may receive a parameter N, - specifying the Nth weekday, which could be positive or negative - (like MO(+1) or MO(-2)). Not specifying it is the same as specifying - +1. You can also use an integer, where 0=MO. This argument is always - relative e.g. if the calculated date is already Monday, using MO(1) - or MO(-1) won't change the day. To effectively make it absolute, use - it in combination with the day argument (e.g. day=1, MO(1) for first - Monday of the month). - - leapdays: - Will add given days to the date found, if year is a leap - year, and the date found is post 28 of february. - - yearday, nlyearday: - Set the yearday or the non-leap year day (jump leap days). - These are converted to day/month/leapdays information. - - There are relative and absolute forms of the keyword - arguments. The plural is relative, and the singular is - absolute. For each argument in the order below, the absolute form - is applied first (by setting each attribute to that value) and - then the relative form (by adding the value to the attribute). - - The order of attributes considered when this relativedelta is - added to a datetime is: - - 1. Year - 2. Month - 3. Day - 4. Hours - 5. Minutes - 6. Seconds - 7. Microseconds - - Finally, weekday is applied, using the rule described above. - - For example - - >>> from datetime import datetime - >>> from dateutil.relativedelta import relativedelta, MO - >>> dt = datetime(2018, 4, 9, 13, 37, 0) - >>> delta = relativedelta(hours=25, day=1, weekday=MO(1)) - >>> dt + delta - datetime.datetime(2018, 4, 2, 14, 37) - - First, the day is set to 1 (the first of the month), then 25 hours - are added, to get to the 2nd day and 14th hour, finally the - weekday is applied, but since the 2nd is already a Monday there is - no effect. - - """ - - def __init__(self, dt1=None, dt2=None, - years=0, months=0, days=0, leapdays=0, weeks=0, - hours=0, minutes=0, seconds=0, microseconds=0, - year=None, month=None, day=None, weekday=None, - yearday=None, nlyearday=None, - hour=None, minute=None, second=None, microsecond=None): - - if dt1 and dt2: - # datetime is a subclass of date. So both must be date - if not (isinstance(dt1, datetime.date) and - isinstance(dt2, datetime.date)): - raise TypeError("relativedelta only diffs datetime/date") - - # We allow two dates, or two datetimes, so we coerce them to be - # of the same type - if (isinstance(dt1, datetime.datetime) != - isinstance(dt2, datetime.datetime)): - if not isinstance(dt1, datetime.datetime): - dt1 = datetime.datetime.fromordinal(dt1.toordinal()) - elif not isinstance(dt2, datetime.datetime): - dt2 = datetime.datetime.fromordinal(dt2.toordinal()) - - self.years = 0 - self.months = 0 - self.days = 0 - self.leapdays = 0 - self.hours = 0 - self.minutes = 0 - self.seconds = 0 - self.microseconds = 0 - self.year = None - self.month = None - self.day = None - self.weekday = None - self.hour = None - self.minute = None - self.second = None - self.microsecond = None - self._has_time = 0 - - # Get year / month delta between the two - months = (dt1.year - dt2.year) * 12 + (dt1.month - dt2.month) - self._set_months(months) - - # Remove the year/month delta so the timedelta is just well-defined - # time units (seconds, days and microseconds) - dtm = self.__radd__(dt2) - - # If we've overshot our target, make an adjustment - if dt1 < dt2: - compare = operator.gt - increment = 1 - else: - compare = operator.lt - increment = -1 - - while compare(dt1, dtm): - months += increment - self._set_months(months) - dtm = self.__radd__(dt2) - - # Get the timedelta between the "months-adjusted" date and dt1 - delta = dt1 - dtm - self.seconds = delta.seconds + delta.days * 86400 - self.microseconds = delta.microseconds - else: - # Check for non-integer values in integer-only quantities - if any(x is not None and x != int(x) for x in (years, months)): - raise ValueError("Non-integer years and months are " - "ambiguous and not currently supported.") - - # Relative information - self.years = int(years) - self.months = int(months) - self.days = days + weeks * 7 - self.leapdays = leapdays - self.hours = hours - self.minutes = minutes - self.seconds = seconds - self.microseconds = microseconds - - # Absolute information - self.year = year - self.month = month - self.day = day - self.hour = hour - self.minute = minute - self.second = second - self.microsecond = microsecond - - if any(x is not None and int(x) != x - for x in (year, month, day, hour, - minute, second, microsecond)): - # For now we'll deprecate floats - later it'll be an error. - warn("Non-integer value passed as absolute information. " + - "This is not a well-defined condition and will raise " + - "errors in future versions.", DeprecationWarning) - - if isinstance(weekday, integer_types): - self.weekday = weekdays[weekday] - else: - self.weekday = weekday - - yday = 0 - if nlyearday: - yday = nlyearday - elif yearday: - yday = yearday - if yearday > 59: - self.leapdays = -1 - if yday: - ydayidx = [31, 59, 90, 120, 151, 181, 212, - 243, 273, 304, 334, 366] - for idx, ydays in enumerate(ydayidx): - if yday <= ydays: - self.month = idx+1 - if idx == 0: - self.day = yday - else: - self.day = yday-ydayidx[idx-1] - break - else: - raise ValueError("invalid year day (%d)" % yday) - - self._fix() - - def _fix(self): - if abs(self.microseconds) > 999999: - s = _sign(self.microseconds) - div, mod = divmod(self.microseconds * s, 1000000) - self.microseconds = mod * s - self.seconds += div * s - if abs(self.seconds) > 59: - s = _sign(self.seconds) - div, mod = divmod(self.seconds * s, 60) - self.seconds = mod * s - self.minutes += div * s - if abs(self.minutes) > 59: - s = _sign(self.minutes) - div, mod = divmod(self.minutes * s, 60) - self.minutes = mod * s - self.hours += div * s - if abs(self.hours) > 23: - s = _sign(self.hours) - div, mod = divmod(self.hours * s, 24) - self.hours = mod * s - self.days += div * s - if abs(self.months) > 11: - s = _sign(self.months) - div, mod = divmod(self.months * s, 12) - self.months = mod * s - self.years += div * s - if (self.hours or self.minutes or self.seconds or self.microseconds - or self.hour is not None or self.minute is not None or - self.second is not None or self.microsecond is not None): - self._has_time = 1 - else: - self._has_time = 0 - - @property - def weeks(self): - return int(self.days / 7.0) - - @weeks.setter - def weeks(self, value): - self.days = self.days - (self.weeks * 7) + value * 7 - - def _set_months(self, months): - self.months = months - if abs(self.months) > 11: - s = _sign(self.months) - div, mod = divmod(self.months * s, 12) - self.months = mod * s - self.years = div * s - else: - self.years = 0 - - def normalized(self): - """ - Return a version of this object represented entirely using integer - values for the relative attributes. - - >>> relativedelta(days=1.5, hours=2).normalized() - relativedelta(days=+1, hours=+14) - - :return: - Returns a :class:`dateutil.relativedelta.relativedelta` object. - """ - # Cascade remainders down (rounding each to roughly nearest microsecond) - days = int(self.days) - - hours_f = round(self.hours + 24 * (self.days - days), 11) - hours = int(hours_f) - - minutes_f = round(self.minutes + 60 * (hours_f - hours), 10) - minutes = int(minutes_f) - - seconds_f = round(self.seconds + 60 * (minutes_f - minutes), 8) - seconds = int(seconds_f) - - microseconds = round(self.microseconds + 1e6 * (seconds_f - seconds)) - - # Constructor carries overflow back up with call to _fix() - return self.__class__(years=self.years, months=self.months, - days=days, hours=hours, minutes=minutes, - seconds=seconds, microseconds=microseconds, - leapdays=self.leapdays, year=self.year, - month=self.month, day=self.day, - weekday=self.weekday, hour=self.hour, - minute=self.minute, second=self.second, - microsecond=self.microsecond) - - def __add__(self, other): - if isinstance(other, relativedelta): - return self.__class__(years=other.years + self.years, - months=other.months + self.months, - days=other.days + self.days, - hours=other.hours + self.hours, - minutes=other.minutes + self.minutes, - seconds=other.seconds + self.seconds, - microseconds=(other.microseconds + - self.microseconds), - leapdays=other.leapdays or self.leapdays, - year=(other.year if other.year is not None - else self.year), - month=(other.month if other.month is not None - else self.month), - day=(other.day if other.day is not None - else self.day), - weekday=(other.weekday if other.weekday is not None - else self.weekday), - hour=(other.hour if other.hour is not None - else self.hour), - minute=(other.minute if other.minute is not None - else self.minute), - second=(other.second if other.second is not None - else self.second), - microsecond=(other.microsecond if other.microsecond - is not None else - self.microsecond)) - if isinstance(other, datetime.timedelta): - return self.__class__(years=self.years, - months=self.months, - days=self.days + other.days, - hours=self.hours, - minutes=self.minutes, - seconds=self.seconds + other.seconds, - microseconds=self.microseconds + other.microseconds, - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - if not isinstance(other, datetime.date): - return NotImplemented - elif self._has_time and not isinstance(other, datetime.datetime): - other = datetime.datetime.fromordinal(other.toordinal()) - year = (self.year or other.year)+self.years - month = self.month or other.month - if self.months: - assert 1 <= abs(self.months) <= 12 - month += self.months - if month > 12: - year += 1 - month -= 12 - elif month < 1: - year -= 1 - month += 12 - day = min(calendar.monthrange(year, month)[1], - self.day or other.day) - repl = {"year": year, "month": month, "day": day} - for attr in ["hour", "minute", "second", "microsecond"]: - value = getattr(self, attr) - if value is not None: - repl[attr] = value - days = self.days - if self.leapdays and month > 2 and calendar.isleap(year): - days += self.leapdays - ret = (other.replace(**repl) - + datetime.timedelta(days=days, - hours=self.hours, - minutes=self.minutes, - seconds=self.seconds, - microseconds=self.microseconds)) - if self.weekday: - weekday, nth = self.weekday.weekday, self.weekday.n or 1 - jumpdays = (abs(nth) - 1) * 7 - if nth > 0: - jumpdays += (7 - ret.weekday() + weekday) % 7 - else: - jumpdays += (ret.weekday() - weekday) % 7 - jumpdays *= -1 - ret += datetime.timedelta(days=jumpdays) - return ret - - def __radd__(self, other): - return self.__add__(other) - - def __rsub__(self, other): - return self.__neg__().__radd__(other) - - def __sub__(self, other): - if not isinstance(other, relativedelta): - return NotImplemented # In case the other object defines __rsub__ - return self.__class__(years=self.years - other.years, - months=self.months - other.months, - days=self.days - other.days, - hours=self.hours - other.hours, - minutes=self.minutes - other.minutes, - seconds=self.seconds - other.seconds, - microseconds=self.microseconds - other.microseconds, - leapdays=self.leapdays or other.leapdays, - year=(self.year if self.year is not None - else other.year), - month=(self.month if self.month is not None else - other.month), - day=(self.day if self.day is not None else - other.day), - weekday=(self.weekday if self.weekday is not None else - other.weekday), - hour=(self.hour if self.hour is not None else - other.hour), - minute=(self.minute if self.minute is not None else - other.minute), - second=(self.second if self.second is not None else - other.second), - microsecond=(self.microsecond if self.microsecond - is not None else - other.microsecond)) - - def __abs__(self): - return self.__class__(years=abs(self.years), - months=abs(self.months), - days=abs(self.days), - hours=abs(self.hours), - minutes=abs(self.minutes), - seconds=abs(self.seconds), - microseconds=abs(self.microseconds), - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - - def __neg__(self): - return self.__class__(years=-self.years, - months=-self.months, - days=-self.days, - hours=-self.hours, - minutes=-self.minutes, - seconds=-self.seconds, - microseconds=-self.microseconds, - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - - def __bool__(self): - return not (not self.years and - not self.months and - not self.days and - not self.hours and - not self.minutes and - not self.seconds and - not self.microseconds and - not self.leapdays and - self.year is None and - self.month is None and - self.day is None and - self.weekday is None and - self.hour is None and - self.minute is None and - self.second is None and - self.microsecond is None) - # Compatibility with Python 2.x - __nonzero__ = __bool__ - - def __mul__(self, other): - try: - f = float(other) - except TypeError: - return NotImplemented - - return self.__class__(years=int(self.years * f), - months=int(self.months * f), - days=int(self.days * f), - hours=int(self.hours * f), - minutes=int(self.minutes * f), - seconds=int(self.seconds * f), - microseconds=int(self.microseconds * f), - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - - __rmul__ = __mul__ - - def __eq__(self, other): - if not isinstance(other, relativedelta): - return NotImplemented - if self.weekday or other.weekday: - if not self.weekday or not other.weekday: - return False - if self.weekday.weekday != other.weekday.weekday: - return False - n1, n2 = self.weekday.n, other.weekday.n - if n1 != n2 and not ((not n1 or n1 == 1) and (not n2 or n2 == 1)): - return False - return (self.years == other.years and - self.months == other.months and - self.days == other.days and - self.hours == other.hours and - self.minutes == other.minutes and - self.seconds == other.seconds and - self.microseconds == other.microseconds and - self.leapdays == other.leapdays and - self.year == other.year and - self.month == other.month and - self.day == other.day and - self.hour == other.hour and - self.minute == other.minute and - self.second == other.second and - self.microsecond == other.microsecond) - - def __hash__(self): - return hash(( - self.weekday, - self.years, - self.months, - self.days, - self.hours, - self.minutes, - self.seconds, - self.microseconds, - self.leapdays, - self.year, - self.month, - self.day, - self.hour, - self.minute, - self.second, - self.microsecond, - )) - - def __ne__(self, other): - return not self.__eq__(other) - - def __div__(self, other): - try: - reciprocal = 1 / float(other) - except TypeError: - return NotImplemented - - return self.__mul__(reciprocal) - - __truediv__ = __div__ - - def __repr__(self): - l = [] - for attr in ["years", "months", "days", "leapdays", - "hours", "minutes", "seconds", "microseconds"]: - value = getattr(self, attr) - if value: - l.append("{attr}={value:+g}".format(attr=attr, value=value)) - for attr in ["year", "month", "day", "weekday", - "hour", "minute", "second", "microsecond"]: - value = getattr(self, attr) - if value is not None: - l.append("{attr}={value}".format(attr=attr, value=repr(value))) - return "{classname}({attrs})".format(classname=self.__class__.__name__, - attrs=", ".join(l)) - - -def _sign(x): - return int(copysign(1, x)) - -# vim:ts=4:sw=4:et diff --git a/.venv/Lib/site-packages/dateutil/rrule.py b/.venv/Lib/site-packages/dateutil/rrule.py deleted file mode 100644 index b320339..0000000 --- a/.venv/Lib/site-packages/dateutil/rrule.py +++ /dev/null @@ -1,1737 +0,0 @@ -# -*- coding: utf-8 -*- -""" -The rrule module offers a small, complete, and very fast, implementation of -the recurrence rules documented in the -`iCalendar RFC `_, -including support for caching of results. -""" -import calendar -import datetime -import heapq -import itertools -import re -import sys -from functools import wraps -# For warning about deprecation of until and count -from warnings import warn - -from six import advance_iterator, integer_types - -from six.moves import _thread, range - -from ._common import weekday as weekdaybase - -try: - from math import gcd -except ImportError: - from fractions import gcd - -__all__ = ["rrule", "rruleset", "rrulestr", - "YEARLY", "MONTHLY", "WEEKLY", "DAILY", - "HOURLY", "MINUTELY", "SECONDLY", - "MO", "TU", "WE", "TH", "FR", "SA", "SU"] - -# Every mask is 7 days longer to handle cross-year weekly periods. -M366MASK = tuple([1]*31+[2]*29+[3]*31+[4]*30+[5]*31+[6]*30 + - [7]*31+[8]*31+[9]*30+[10]*31+[11]*30+[12]*31+[1]*7) -M365MASK = list(M366MASK) -M29, M30, M31 = list(range(1, 30)), list(range(1, 31)), list(range(1, 32)) -MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) -MDAY365MASK = list(MDAY366MASK) -M29, M30, M31 = list(range(-29, 0)), list(range(-30, 0)), list(range(-31, 0)) -NMDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) -NMDAY365MASK = list(NMDAY366MASK) -M366RANGE = (0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366) -M365RANGE = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365) -WDAYMASK = [0, 1, 2, 3, 4, 5, 6]*55 -del M29, M30, M31, M365MASK[59], MDAY365MASK[59], NMDAY365MASK[31] -MDAY365MASK = tuple(MDAY365MASK) -M365MASK = tuple(M365MASK) - -FREQNAMES = ['YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY', 'MINUTELY', 'SECONDLY'] - -(YEARLY, - MONTHLY, - WEEKLY, - DAILY, - HOURLY, - MINUTELY, - SECONDLY) = list(range(7)) - -# Imported on demand. -easter = None -parser = None - - -class weekday(weekdaybase): - """ - This version of weekday does not allow n = 0. - """ - def __init__(self, wkday, n=None): - if n == 0: - raise ValueError("Can't create weekday with n==0") - - super(weekday, self).__init__(wkday, n) - - -MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7)) - - -def _invalidates_cache(f): - """ - Decorator for rruleset methods which may invalidate the - cached length. - """ - @wraps(f) - def inner_func(self, *args, **kwargs): - rv = f(self, *args, **kwargs) - self._invalidate_cache() - return rv - - return inner_func - - -class rrulebase(object): - def __init__(self, cache=False): - if cache: - self._cache = [] - self._cache_lock = _thread.allocate_lock() - self._invalidate_cache() - else: - self._cache = None - self._cache_complete = False - self._len = None - - def __iter__(self): - if self._cache_complete: - return iter(self._cache) - elif self._cache is None: - return self._iter() - else: - return self._iter_cached() - - def _invalidate_cache(self): - if self._cache is not None: - self._cache = [] - self._cache_complete = False - self._cache_gen = self._iter() - - if self._cache_lock.locked(): - self._cache_lock.release() - - self._len = None - - def _iter_cached(self): - i = 0 - gen = self._cache_gen - cache = self._cache - acquire = self._cache_lock.acquire - release = self._cache_lock.release - while gen: - if i == len(cache): - acquire() - if self._cache_complete: - break - try: - for j in range(10): - cache.append(advance_iterator(gen)) - except StopIteration: - self._cache_gen = gen = None - self._cache_complete = True - break - release() - yield cache[i] - i += 1 - while i < self._len: - yield cache[i] - i += 1 - - def __getitem__(self, item): - if self._cache_complete: - return self._cache[item] - elif isinstance(item, slice): - if item.step and item.step < 0: - return list(iter(self))[item] - else: - return list(itertools.islice(self, - item.start or 0, - item.stop or sys.maxsize, - item.step or 1)) - elif item >= 0: - gen = iter(self) - try: - for i in range(item+1): - res = advance_iterator(gen) - except StopIteration: - raise IndexError - return res - else: - return list(iter(self))[item] - - def __contains__(self, item): - if self._cache_complete: - return item in self._cache - else: - for i in self: - if i == item: - return True - elif i > item: - return False - return False - - # __len__() introduces a large performance penalty. - def count(self): - """ Returns the number of recurrences in this set. It will have go - trough the whole recurrence, if this hasn't been done before. """ - if self._len is None: - for x in self: - pass - return self._len - - def before(self, dt, inc=False): - """ Returns the last recurrence before the given datetime instance. The - inc keyword defines what happens if dt is an occurrence. With - inc=True, if dt itself is an occurrence, it will be returned. """ - if self._cache_complete: - gen = self._cache - else: - gen = self - last = None - if inc: - for i in gen: - if i > dt: - break - last = i - else: - for i in gen: - if i >= dt: - break - last = i - return last - - def after(self, dt, inc=False): - """ Returns the first recurrence after the given datetime instance. The - inc keyword defines what happens if dt is an occurrence. With - inc=True, if dt itself is an occurrence, it will be returned. """ - if self._cache_complete: - gen = self._cache - else: - gen = self - if inc: - for i in gen: - if i >= dt: - return i - else: - for i in gen: - if i > dt: - return i - return None - - def xafter(self, dt, count=None, inc=False): - """ - Generator which yields up to `count` recurrences after the given - datetime instance, equivalent to `after`. - - :param dt: - The datetime at which to start generating recurrences. - - :param count: - The maximum number of recurrences to generate. If `None` (default), - dates are generated until the recurrence rule is exhausted. - - :param inc: - If `dt` is an instance of the rule and `inc` is `True`, it is - included in the output. - - :yields: Yields a sequence of `datetime` objects. - """ - - if self._cache_complete: - gen = self._cache - else: - gen = self - - # Select the comparison function - if inc: - comp = lambda dc, dtc: dc >= dtc - else: - comp = lambda dc, dtc: dc > dtc - - # Generate dates - n = 0 - for d in gen: - if comp(d, dt): - if count is not None: - n += 1 - if n > count: - break - - yield d - - def between(self, after, before, inc=False, count=1): - """ Returns all the occurrences of the rrule between after and before. - The inc keyword defines what happens if after and/or before are - themselves occurrences. With inc=True, they will be included in the - list, if they are found in the recurrence set. """ - if self._cache_complete: - gen = self._cache - else: - gen = self - started = False - l = [] - if inc: - for i in gen: - if i > before: - break - elif not started: - if i >= after: - started = True - l.append(i) - else: - l.append(i) - else: - for i in gen: - if i >= before: - break - elif not started: - if i > after: - started = True - l.append(i) - else: - l.append(i) - return l - - -class rrule(rrulebase): - """ - That's the base of the rrule operation. It accepts all the keywords - defined in the RFC as its constructor parameters (except byday, - which was renamed to byweekday) and more. The constructor prototype is:: - - rrule(freq) - - Where freq must be one of YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, - or SECONDLY. - - .. note:: - Per RFC section 3.3.10, recurrence instances falling on invalid dates - and times are ignored rather than coerced: - - Recurrence rules may generate recurrence instances with an invalid - date (e.g., February 30) or nonexistent local time (e.g., 1:30 AM - on a day where the local time is moved forward by an hour at 1:00 - AM). Such recurrence instances MUST be ignored and MUST NOT be - counted as part of the recurrence set. - - This can lead to possibly surprising behavior when, for example, the - start date occurs at the end of the month: - - >>> from dateutil.rrule import rrule, MONTHLY - >>> from datetime import datetime - >>> start_date = datetime(2014, 12, 31) - >>> list(rrule(freq=MONTHLY, count=4, dtstart=start_date)) - ... # doctest: +NORMALIZE_WHITESPACE - [datetime.datetime(2014, 12, 31, 0, 0), - datetime.datetime(2015, 1, 31, 0, 0), - datetime.datetime(2015, 3, 31, 0, 0), - datetime.datetime(2015, 5, 31, 0, 0)] - - Additionally, it supports the following keyword arguments: - - :param dtstart: - The recurrence start. Besides being the base for the recurrence, - missing parameters in the final recurrence instances will also be - extracted from this date. If not given, datetime.now() will be used - instead. - :param interval: - The interval between each freq iteration. For example, when using - YEARLY, an interval of 2 means once every two years, but with HOURLY, - it means once every two hours. The default interval is 1. - :param wkst: - The week start day. Must be one of the MO, TU, WE constants, or an - integer, specifying the first day of the week. This will affect - recurrences based on weekly periods. The default week start is got - from calendar.firstweekday(), and may be modified by - calendar.setfirstweekday(). - :param count: - If given, this determines how many occurrences will be generated. - - .. note:: - As of version 2.5.0, the use of the keyword ``until`` in conjunction - with ``count`` is deprecated, to make sure ``dateutil`` is fully - compliant with `RFC-5545 Sec. 3.3.10 `_. Therefore, ``until`` and ``count`` - **must not** occur in the same call to ``rrule``. - :param until: - If given, this must be a datetime instance specifying the upper-bound - limit of the recurrence. The last recurrence in the rule is the greatest - datetime that is less than or equal to the value specified in the - ``until`` parameter. - - .. note:: - As of version 2.5.0, the use of the keyword ``until`` in conjunction - with ``count`` is deprecated, to make sure ``dateutil`` is fully - compliant with `RFC-5545 Sec. 3.3.10 `_. Therefore, ``until`` and ``count`` - **must not** occur in the same call to ``rrule``. - :param bysetpos: - If given, it must be either an integer, or a sequence of integers, - positive or negative. Each given integer will specify an occurrence - number, corresponding to the nth occurrence of the rule inside the - frequency period. For example, a bysetpos of -1 if combined with a - MONTHLY frequency, and a byweekday of (MO, TU, WE, TH, FR), will - result in the last work day of every month. - :param bymonth: - If given, it must be either an integer, or a sequence of integers, - meaning the months to apply the recurrence to. - :param bymonthday: - If given, it must be either an integer, or a sequence of integers, - meaning the month days to apply the recurrence to. - :param byyearday: - If given, it must be either an integer, or a sequence of integers, - meaning the year days to apply the recurrence to. - :param byeaster: - If given, it must be either an integer, or a sequence of integers, - positive or negative. Each integer will define an offset from the - Easter Sunday. Passing the offset 0 to byeaster will yield the Easter - Sunday itself. This is an extension to the RFC specification. - :param byweekno: - If given, it must be either an integer, or a sequence of integers, - meaning the week numbers to apply the recurrence to. Week numbers - have the meaning described in ISO8601, that is, the first week of - the year is that containing at least four days of the new year. - :param byweekday: - If given, it must be either an integer (0 == MO), a sequence of - integers, one of the weekday constants (MO, TU, etc), or a sequence - of these constants. When given, these variables will define the - weekdays where the recurrence will be applied. It's also possible to - use an argument n for the weekday instances, which will mean the nth - occurrence of this weekday in the period. For example, with MONTHLY, - or with YEARLY and BYMONTH, using FR(+1) in byweekday will specify the - first friday of the month where the recurrence happens. Notice that in - the RFC documentation, this is specified as BYDAY, but was renamed to - avoid the ambiguity of that keyword. - :param byhour: - If given, it must be either an integer, or a sequence of integers, - meaning the hours to apply the recurrence to. - :param byminute: - If given, it must be either an integer, or a sequence of integers, - meaning the minutes to apply the recurrence to. - :param bysecond: - If given, it must be either an integer, or a sequence of integers, - meaning the seconds to apply the recurrence to. - :param cache: - If given, it must be a boolean value specifying to enable or disable - caching of results. If you will use the same rrule instance multiple - times, enabling caching will improve the performance considerably. - """ - def __init__(self, freq, dtstart=None, - interval=1, wkst=None, count=None, until=None, bysetpos=None, - bymonth=None, bymonthday=None, byyearday=None, byeaster=None, - byweekno=None, byweekday=None, - byhour=None, byminute=None, bysecond=None, - cache=False): - super(rrule, self).__init__(cache) - global easter - if not dtstart: - if until and until.tzinfo: - dtstart = datetime.datetime.now(tz=until.tzinfo).replace(microsecond=0) - else: - dtstart = datetime.datetime.now().replace(microsecond=0) - elif not isinstance(dtstart, datetime.datetime): - dtstart = datetime.datetime.fromordinal(dtstart.toordinal()) - else: - dtstart = dtstart.replace(microsecond=0) - self._dtstart = dtstart - self._tzinfo = dtstart.tzinfo - self._freq = freq - self._interval = interval - self._count = count - - # Cache the original byxxx rules, if they are provided, as the _byxxx - # attributes do not necessarily map to the inputs, and this can be - # a problem in generating the strings. Only store things if they've - # been supplied (the string retrieval will just use .get()) - self._original_rule = {} - - if until and not isinstance(until, datetime.datetime): - until = datetime.datetime.fromordinal(until.toordinal()) - self._until = until - - if self._dtstart and self._until: - if (self._dtstart.tzinfo is not None) != (self._until.tzinfo is not None): - # According to RFC5545 Section 3.3.10: - # https://tools.ietf.org/html/rfc5545#section-3.3.10 - # - # > If the "DTSTART" property is specified as a date with UTC - # > time or a date with local time and time zone reference, - # > then the UNTIL rule part MUST be specified as a date with - # > UTC time. - raise ValueError( - 'RRULE UNTIL values must be specified in UTC when DTSTART ' - 'is timezone-aware' - ) - - if count is not None and until: - warn("Using both 'count' and 'until' is inconsistent with RFC 5545" - " and has been deprecated in dateutil. Future versions will " - "raise an error.", DeprecationWarning) - - if wkst is None: - self._wkst = calendar.firstweekday() - elif isinstance(wkst, integer_types): - self._wkst = wkst - else: - self._wkst = wkst.weekday - - if bysetpos is None: - self._bysetpos = None - elif isinstance(bysetpos, integer_types): - if bysetpos == 0 or not (-366 <= bysetpos <= 366): - raise ValueError("bysetpos must be between 1 and 366, " - "or between -366 and -1") - self._bysetpos = (bysetpos,) - else: - self._bysetpos = tuple(bysetpos) - for pos in self._bysetpos: - if pos == 0 or not (-366 <= pos <= 366): - raise ValueError("bysetpos must be between 1 and 366, " - "or between -366 and -1") - - if self._bysetpos: - self._original_rule['bysetpos'] = self._bysetpos - - if (byweekno is None and byyearday is None and bymonthday is None and - byweekday is None and byeaster is None): - if freq == YEARLY: - if bymonth is None: - bymonth = dtstart.month - self._original_rule['bymonth'] = None - bymonthday = dtstart.day - self._original_rule['bymonthday'] = None - elif freq == MONTHLY: - bymonthday = dtstart.day - self._original_rule['bymonthday'] = None - elif freq == WEEKLY: - byweekday = dtstart.weekday() - self._original_rule['byweekday'] = None - - # bymonth - if bymonth is None: - self._bymonth = None - else: - if isinstance(bymonth, integer_types): - bymonth = (bymonth,) - - self._bymonth = tuple(sorted(set(bymonth))) - - if 'bymonth' not in self._original_rule: - self._original_rule['bymonth'] = self._bymonth - - # byyearday - if byyearday is None: - self._byyearday = None - else: - if isinstance(byyearday, integer_types): - byyearday = (byyearday,) - - self._byyearday = tuple(sorted(set(byyearday))) - self._original_rule['byyearday'] = self._byyearday - - # byeaster - if byeaster is not None: - if not easter: - from dateutil import easter - if isinstance(byeaster, integer_types): - self._byeaster = (byeaster,) - else: - self._byeaster = tuple(sorted(byeaster)) - - self._original_rule['byeaster'] = self._byeaster - else: - self._byeaster = None - - # bymonthday - if bymonthday is None: - self._bymonthday = () - self._bynmonthday = () - else: - if isinstance(bymonthday, integer_types): - bymonthday = (bymonthday,) - - bymonthday = set(bymonthday) # Ensure it's unique - - self._bymonthday = tuple(sorted(x for x in bymonthday if x > 0)) - self._bynmonthday = tuple(sorted(x for x in bymonthday if x < 0)) - - # Storing positive numbers first, then negative numbers - if 'bymonthday' not in self._original_rule: - self._original_rule['bymonthday'] = tuple( - itertools.chain(self._bymonthday, self._bynmonthday)) - - # byweekno - if byweekno is None: - self._byweekno = None - else: - if isinstance(byweekno, integer_types): - byweekno = (byweekno,) - - self._byweekno = tuple(sorted(set(byweekno))) - - self._original_rule['byweekno'] = self._byweekno - - # byweekday / bynweekday - if byweekday is None: - self._byweekday = None - self._bynweekday = None - else: - # If it's one of the valid non-sequence types, convert to a - # single-element sequence before the iterator that builds the - # byweekday set. - if isinstance(byweekday, integer_types) or hasattr(byweekday, "n"): - byweekday = (byweekday,) - - self._byweekday = set() - self._bynweekday = set() - for wday in byweekday: - if isinstance(wday, integer_types): - self._byweekday.add(wday) - elif not wday.n or freq > MONTHLY: - self._byweekday.add(wday.weekday) - else: - self._bynweekday.add((wday.weekday, wday.n)) - - if not self._byweekday: - self._byweekday = None - elif not self._bynweekday: - self._bynweekday = None - - if self._byweekday is not None: - self._byweekday = tuple(sorted(self._byweekday)) - orig_byweekday = [weekday(x) for x in self._byweekday] - else: - orig_byweekday = () - - if self._bynweekday is not None: - self._bynweekday = tuple(sorted(self._bynweekday)) - orig_bynweekday = [weekday(*x) for x in self._bynweekday] - else: - orig_bynweekday = () - - if 'byweekday' not in self._original_rule: - self._original_rule['byweekday'] = tuple(itertools.chain( - orig_byweekday, orig_bynweekday)) - - # byhour - if byhour is None: - if freq < HOURLY: - self._byhour = {dtstart.hour} - else: - self._byhour = None - else: - if isinstance(byhour, integer_types): - byhour = (byhour,) - - if freq == HOURLY: - self._byhour = self.__construct_byset(start=dtstart.hour, - byxxx=byhour, - base=24) - else: - self._byhour = set(byhour) - - self._byhour = tuple(sorted(self._byhour)) - self._original_rule['byhour'] = self._byhour - - # byminute - if byminute is None: - if freq < MINUTELY: - self._byminute = {dtstart.minute} - else: - self._byminute = None - else: - if isinstance(byminute, integer_types): - byminute = (byminute,) - - if freq == MINUTELY: - self._byminute = self.__construct_byset(start=dtstart.minute, - byxxx=byminute, - base=60) - else: - self._byminute = set(byminute) - - self._byminute = tuple(sorted(self._byminute)) - self._original_rule['byminute'] = self._byminute - - # bysecond - if bysecond is None: - if freq < SECONDLY: - self._bysecond = ((dtstart.second,)) - else: - self._bysecond = None - else: - if isinstance(bysecond, integer_types): - bysecond = (bysecond,) - - self._bysecond = set(bysecond) - - if freq == SECONDLY: - self._bysecond = self.__construct_byset(start=dtstart.second, - byxxx=bysecond, - base=60) - else: - self._bysecond = set(bysecond) - - self._bysecond = tuple(sorted(self._bysecond)) - self._original_rule['bysecond'] = self._bysecond - - if self._freq >= HOURLY: - self._timeset = None - else: - self._timeset = [] - for hour in self._byhour: - for minute in self._byminute: - for second in self._bysecond: - self._timeset.append( - datetime.time(hour, minute, second, - tzinfo=self._tzinfo)) - self._timeset.sort() - self._timeset = tuple(self._timeset) - - def __str__(self): - """ - Output a string that would generate this RRULE if passed to rrulestr. - This is mostly compatible with RFC5545, except for the - dateutil-specific extension BYEASTER. - """ - - output = [] - h, m, s = [None] * 3 - if self._dtstart: - output.append(self._dtstart.strftime('DTSTART:%Y%m%dT%H%M%S')) - h, m, s = self._dtstart.timetuple()[3:6] - - parts = ['FREQ=' + FREQNAMES[self._freq]] - if self._interval != 1: - parts.append('INTERVAL=' + str(self._interval)) - - if self._wkst: - parts.append('WKST=' + repr(weekday(self._wkst))[0:2]) - - if self._count is not None: - parts.append('COUNT=' + str(self._count)) - - if self._until: - parts.append(self._until.strftime('UNTIL=%Y%m%dT%H%M%S')) - - if self._original_rule.get('byweekday') is not None: - # The str() method on weekday objects doesn't generate - # RFC5545-compliant strings, so we should modify that. - original_rule = dict(self._original_rule) - wday_strings = [] - for wday in original_rule['byweekday']: - if wday.n: - wday_strings.append('{n:+d}{wday}'.format( - n=wday.n, - wday=repr(wday)[0:2])) - else: - wday_strings.append(repr(wday)) - - original_rule['byweekday'] = wday_strings - else: - original_rule = self._original_rule - - partfmt = '{name}={vals}' - for name, key in [('BYSETPOS', 'bysetpos'), - ('BYMONTH', 'bymonth'), - ('BYMONTHDAY', 'bymonthday'), - ('BYYEARDAY', 'byyearday'), - ('BYWEEKNO', 'byweekno'), - ('BYDAY', 'byweekday'), - ('BYHOUR', 'byhour'), - ('BYMINUTE', 'byminute'), - ('BYSECOND', 'bysecond'), - ('BYEASTER', 'byeaster')]: - value = original_rule.get(key) - if value: - parts.append(partfmt.format(name=name, vals=(','.join(str(v) - for v in value)))) - - output.append('RRULE:' + ';'.join(parts)) - return '\n'.join(output) - - def replace(self, **kwargs): - """Return new rrule with same attributes except for those attributes given new - values by whichever keyword arguments are specified.""" - new_kwargs = {"interval": self._interval, - "count": self._count, - "dtstart": self._dtstart, - "freq": self._freq, - "until": self._until, - "wkst": self._wkst, - "cache": False if self._cache is None else True } - new_kwargs.update(self._original_rule) - new_kwargs.update(kwargs) - return rrule(**new_kwargs) - - def _iter(self): - year, month, day, hour, minute, second, weekday, yearday, _ = \ - self._dtstart.timetuple() - - # Some local variables to speed things up a bit - freq = self._freq - interval = self._interval - wkst = self._wkst - until = self._until - bymonth = self._bymonth - byweekno = self._byweekno - byyearday = self._byyearday - byweekday = self._byweekday - byeaster = self._byeaster - bymonthday = self._bymonthday - bynmonthday = self._bynmonthday - bysetpos = self._bysetpos - byhour = self._byhour - byminute = self._byminute - bysecond = self._bysecond - - ii = _iterinfo(self) - ii.rebuild(year, month) - - getdayset = {YEARLY: ii.ydayset, - MONTHLY: ii.mdayset, - WEEKLY: ii.wdayset, - DAILY: ii.ddayset, - HOURLY: ii.ddayset, - MINUTELY: ii.ddayset, - SECONDLY: ii.ddayset}[freq] - - if freq < HOURLY: - timeset = self._timeset - else: - gettimeset = {HOURLY: ii.htimeset, - MINUTELY: ii.mtimeset, - SECONDLY: ii.stimeset}[freq] - if ((freq >= HOURLY and - self._byhour and hour not in self._byhour) or - (freq >= MINUTELY and - self._byminute and minute not in self._byminute) or - (freq >= SECONDLY and - self._bysecond and second not in self._bysecond)): - timeset = () - else: - timeset = gettimeset(hour, minute, second) - - total = 0 - count = self._count - while True: - # Get dayset with the right frequency - dayset, start, end = getdayset(year, month, day) - - # Do the "hard" work ;-) - filtered = False - for i in dayset[start:end]: - if ((bymonth and ii.mmask[i] not in bymonth) or - (byweekno and not ii.wnomask[i]) or - (byweekday and ii.wdaymask[i] not in byweekday) or - (ii.nwdaymask and not ii.nwdaymask[i]) or - (byeaster and not ii.eastermask[i]) or - ((bymonthday or bynmonthday) and - ii.mdaymask[i] not in bymonthday and - ii.nmdaymask[i] not in bynmonthday) or - (byyearday and - ((i < ii.yearlen and i+1 not in byyearday and - -ii.yearlen+i not in byyearday) or - (i >= ii.yearlen and i+1-ii.yearlen not in byyearday and - -ii.nextyearlen+i-ii.yearlen not in byyearday)))): - dayset[i] = None - filtered = True - - # Output results - if bysetpos and timeset: - poslist = [] - for pos in bysetpos: - if pos < 0: - daypos, timepos = divmod(pos, len(timeset)) - else: - daypos, timepos = divmod(pos-1, len(timeset)) - try: - i = [x for x in dayset[start:end] - if x is not None][daypos] - time = timeset[timepos] - except IndexError: - pass - else: - date = datetime.date.fromordinal(ii.yearordinal+i) - res = datetime.datetime.combine(date, time) - if res not in poslist: - poslist.append(res) - poslist.sort() - for res in poslist: - if until and res > until: - self._len = total - return - elif res >= self._dtstart: - if count is not None: - count -= 1 - if count < 0: - self._len = total - return - total += 1 - yield res - else: - for i in dayset[start:end]: - if i is not None: - date = datetime.date.fromordinal(ii.yearordinal + i) - for time in timeset: - res = datetime.datetime.combine(date, time) - if until and res > until: - self._len = total - return - elif res >= self._dtstart: - if count is not None: - count -= 1 - if count < 0: - self._len = total - return - - total += 1 - yield res - - # Handle frequency and interval - fixday = False - if freq == YEARLY: - year += interval - if year > datetime.MAXYEAR: - self._len = total - return - ii.rebuild(year, month) - elif freq == MONTHLY: - month += interval - if month > 12: - div, mod = divmod(month, 12) - month = mod - year += div - if month == 0: - month = 12 - year -= 1 - if year > datetime.MAXYEAR: - self._len = total - return - ii.rebuild(year, month) - elif freq == WEEKLY: - if wkst > weekday: - day += -(weekday+1+(6-wkst))+self._interval*7 - else: - day += -(weekday-wkst)+self._interval*7 - weekday = wkst - fixday = True - elif freq == DAILY: - day += interval - fixday = True - elif freq == HOURLY: - if filtered: - # Jump to one iteration before next day - hour += ((23-hour)//interval)*interval - - if byhour: - ndays, hour = self.__mod_distance(value=hour, - byxxx=self._byhour, - base=24) - else: - ndays, hour = divmod(hour+interval, 24) - - if ndays: - day += ndays - fixday = True - - timeset = gettimeset(hour, minute, second) - elif freq == MINUTELY: - if filtered: - # Jump to one iteration before next day - minute += ((1439-(hour*60+minute))//interval)*interval - - valid = False - rep_rate = (24*60) - for j in range(rep_rate // gcd(interval, rep_rate)): - if byminute: - nhours, minute = \ - self.__mod_distance(value=minute, - byxxx=self._byminute, - base=60) - else: - nhours, minute = divmod(minute+interval, 60) - - div, hour = divmod(hour+nhours, 24) - if div: - day += div - fixday = True - filtered = False - - if not byhour or hour in byhour: - valid = True - break - - if not valid: - raise ValueError('Invalid combination of interval and ' + - 'byhour resulting in empty rule.') - - timeset = gettimeset(hour, minute, second) - elif freq == SECONDLY: - if filtered: - # Jump to one iteration before next day - second += (((86399 - (hour * 3600 + minute * 60 + second)) - // interval) * interval) - - rep_rate = (24 * 3600) - valid = False - for j in range(0, rep_rate // gcd(interval, rep_rate)): - if bysecond: - nminutes, second = \ - self.__mod_distance(value=second, - byxxx=self._bysecond, - base=60) - else: - nminutes, second = divmod(second+interval, 60) - - div, minute = divmod(minute+nminutes, 60) - if div: - hour += div - div, hour = divmod(hour, 24) - if div: - day += div - fixday = True - - if ((not byhour or hour in byhour) and - (not byminute or minute in byminute) and - (not bysecond or second in bysecond)): - valid = True - break - - if not valid: - raise ValueError('Invalid combination of interval, ' + - 'byhour and byminute resulting in empty' + - ' rule.') - - timeset = gettimeset(hour, minute, second) - - if fixday and day > 28: - daysinmonth = calendar.monthrange(year, month)[1] - if day > daysinmonth: - while day > daysinmonth: - day -= daysinmonth - month += 1 - if month == 13: - month = 1 - year += 1 - if year > datetime.MAXYEAR: - self._len = total - return - daysinmonth = calendar.monthrange(year, month)[1] - ii.rebuild(year, month) - - def __construct_byset(self, start, byxxx, base): - """ - If a `BYXXX` sequence is passed to the constructor at the same level as - `FREQ` (e.g. `FREQ=HOURLY,BYHOUR={2,4,7},INTERVAL=3`), there are some - specifications which cannot be reached given some starting conditions. - - This occurs whenever the interval is not coprime with the base of a - given unit and the difference between the starting position and the - ending position is not coprime with the greatest common denominator - between the interval and the base. For example, with a FREQ of hourly - starting at 17:00 and an interval of 4, the only valid values for - BYHOUR would be {21, 1, 5, 9, 13, 17}, because 4 and 24 are not - coprime. - - :param start: - Specifies the starting position. - :param byxxx: - An iterable containing the list of allowed values. - :param base: - The largest allowable value for the specified frequency (e.g. - 24 hours, 60 minutes). - - This does not preserve the type of the iterable, returning a set, since - the values should be unique and the order is irrelevant, this will - speed up later lookups. - - In the event of an empty set, raises a :exception:`ValueError`, as this - results in an empty rrule. - """ - - cset = set() - - # Support a single byxxx value. - if isinstance(byxxx, integer_types): - byxxx = (byxxx, ) - - for num in byxxx: - i_gcd = gcd(self._interval, base) - # Use divmod rather than % because we need to wrap negative nums. - if i_gcd == 1 or divmod(num - start, i_gcd)[1] == 0: - cset.add(num) - - if len(cset) == 0: - raise ValueError("Invalid rrule byxxx generates an empty set.") - - return cset - - def __mod_distance(self, value, byxxx, base): - """ - Calculates the next value in a sequence where the `FREQ` parameter is - specified along with a `BYXXX` parameter at the same "level" - (e.g. `HOURLY` specified with `BYHOUR`). - - :param value: - The old value of the component. - :param byxxx: - The `BYXXX` set, which should have been generated by - `rrule._construct_byset`, or something else which checks that a - valid rule is present. - :param base: - The largest allowable value for the specified frequency (e.g. - 24 hours, 60 minutes). - - If a valid value is not found after `base` iterations (the maximum - number before the sequence would start to repeat), this raises a - :exception:`ValueError`, as no valid values were found. - - This returns a tuple of `divmod(n*interval, base)`, where `n` is the - smallest number of `interval` repetitions until the next specified - value in `byxxx` is found. - """ - accumulator = 0 - for ii in range(1, base + 1): - # Using divmod() over % to account for negative intervals - div, value = divmod(value + self._interval, base) - accumulator += div - if value in byxxx: - return (accumulator, value) - - -class _iterinfo(object): - __slots__ = ["rrule", "lastyear", "lastmonth", - "yearlen", "nextyearlen", "yearordinal", "yearweekday", - "mmask", "mrange", "mdaymask", "nmdaymask", - "wdaymask", "wnomask", "nwdaymask", "eastermask"] - - def __init__(self, rrule): - for attr in self.__slots__: - setattr(self, attr, None) - self.rrule = rrule - - def rebuild(self, year, month): - # Every mask is 7 days longer to handle cross-year weekly periods. - rr = self.rrule - if year != self.lastyear: - self.yearlen = 365 + calendar.isleap(year) - self.nextyearlen = 365 + calendar.isleap(year + 1) - firstyday = datetime.date(year, 1, 1) - self.yearordinal = firstyday.toordinal() - self.yearweekday = firstyday.weekday() - - wday = datetime.date(year, 1, 1).weekday() - if self.yearlen == 365: - self.mmask = M365MASK - self.mdaymask = MDAY365MASK - self.nmdaymask = NMDAY365MASK - self.wdaymask = WDAYMASK[wday:] - self.mrange = M365RANGE - else: - self.mmask = M366MASK - self.mdaymask = MDAY366MASK - self.nmdaymask = NMDAY366MASK - self.wdaymask = WDAYMASK[wday:] - self.mrange = M366RANGE - - if not rr._byweekno: - self.wnomask = None - else: - self.wnomask = [0]*(self.yearlen+7) - # no1wkst = firstwkst = self.wdaymask.index(rr._wkst) - no1wkst = firstwkst = (7-self.yearweekday+rr._wkst) % 7 - if no1wkst >= 4: - no1wkst = 0 - # Number of days in the year, plus the days we got - # from last year. - wyearlen = self.yearlen+(self.yearweekday-rr._wkst) % 7 - else: - # Number of days in the year, minus the days we - # left in last year. - wyearlen = self.yearlen-no1wkst - div, mod = divmod(wyearlen, 7) - numweeks = div+mod//4 - for n in rr._byweekno: - if n < 0: - n += numweeks+1 - if not (0 < n <= numweeks): - continue - if n > 1: - i = no1wkst+(n-1)*7 - if no1wkst != firstwkst: - i -= 7-firstwkst - else: - i = no1wkst - for j in range(7): - self.wnomask[i] = 1 - i += 1 - if self.wdaymask[i] == rr._wkst: - break - if 1 in rr._byweekno: - # Check week number 1 of next year as well - # TODO: Check -numweeks for next year. - i = no1wkst+numweeks*7 - if no1wkst != firstwkst: - i -= 7-firstwkst - if i < self.yearlen: - # If week starts in next year, we - # don't care about it. - for j in range(7): - self.wnomask[i] = 1 - i += 1 - if self.wdaymask[i] == rr._wkst: - break - if no1wkst: - # Check last week number of last year as - # well. If no1wkst is 0, either the year - # started on week start, or week number 1 - # got days from last year, so there are no - # days from last year's last week number in - # this year. - if -1 not in rr._byweekno: - lyearweekday = datetime.date(year-1, 1, 1).weekday() - lno1wkst = (7-lyearweekday+rr._wkst) % 7 - lyearlen = 365+calendar.isleap(year-1) - if lno1wkst >= 4: - lno1wkst = 0 - lnumweeks = 52+(lyearlen + - (lyearweekday-rr._wkst) % 7) % 7//4 - else: - lnumweeks = 52+(self.yearlen-no1wkst) % 7//4 - else: - lnumweeks = -1 - if lnumweeks in rr._byweekno: - for i in range(no1wkst): - self.wnomask[i] = 1 - - if (rr._bynweekday and (month != self.lastmonth or - year != self.lastyear)): - ranges = [] - if rr._freq == YEARLY: - if rr._bymonth: - for month in rr._bymonth: - ranges.append(self.mrange[month-1:month+1]) - else: - ranges = [(0, self.yearlen)] - elif rr._freq == MONTHLY: - ranges = [self.mrange[month-1:month+1]] - if ranges: - # Weekly frequency won't get here, so we may not - # care about cross-year weekly periods. - self.nwdaymask = [0]*self.yearlen - for first, last in ranges: - last -= 1 - for wday, n in rr._bynweekday: - if n < 0: - i = last+(n+1)*7 - i -= (self.wdaymask[i]-wday) % 7 - else: - i = first+(n-1)*7 - i += (7-self.wdaymask[i]+wday) % 7 - if first <= i <= last: - self.nwdaymask[i] = 1 - - if rr._byeaster: - self.eastermask = [0]*(self.yearlen+7) - eyday = easter.easter(year).toordinal()-self.yearordinal - for offset in rr._byeaster: - self.eastermask[eyday+offset] = 1 - - self.lastyear = year - self.lastmonth = month - - def ydayset(self, year, month, day): - return list(range(self.yearlen)), 0, self.yearlen - - def mdayset(self, year, month, day): - dset = [None]*self.yearlen - start, end = self.mrange[month-1:month+1] - for i in range(start, end): - dset[i] = i - return dset, start, end - - def wdayset(self, year, month, day): - # We need to handle cross-year weeks here. - dset = [None]*(self.yearlen+7) - i = datetime.date(year, month, day).toordinal()-self.yearordinal - start = i - for j in range(7): - dset[i] = i - i += 1 - # if (not (0 <= i < self.yearlen) or - # self.wdaymask[i] == self.rrule._wkst): - # This will cross the year boundary, if necessary. - if self.wdaymask[i] == self.rrule._wkst: - break - return dset, start, i - - def ddayset(self, year, month, day): - dset = [None] * self.yearlen - i = datetime.date(year, month, day).toordinal() - self.yearordinal - dset[i] = i - return dset, i, i + 1 - - def htimeset(self, hour, minute, second): - tset = [] - rr = self.rrule - for minute in rr._byminute: - for second in rr._bysecond: - tset.append(datetime.time(hour, minute, second, - tzinfo=rr._tzinfo)) - tset.sort() - return tset - - def mtimeset(self, hour, minute, second): - tset = [] - rr = self.rrule - for second in rr._bysecond: - tset.append(datetime.time(hour, minute, second, tzinfo=rr._tzinfo)) - tset.sort() - return tset - - def stimeset(self, hour, minute, second): - return (datetime.time(hour, minute, second, - tzinfo=self.rrule._tzinfo),) - - -class rruleset(rrulebase): - """ The rruleset type allows more complex recurrence setups, mixing - multiple rules, dates, exclusion rules, and exclusion dates. The type - constructor takes the following keyword arguments: - - :param cache: If True, caching of results will be enabled, improving - performance of multiple queries considerably. """ - - class _genitem(object): - def __init__(self, genlist, gen): - try: - self.dt = advance_iterator(gen) - genlist.append(self) - except StopIteration: - pass - self.genlist = genlist - self.gen = gen - - def __next__(self): - try: - self.dt = advance_iterator(self.gen) - except StopIteration: - if self.genlist[0] is self: - heapq.heappop(self.genlist) - else: - self.genlist.remove(self) - heapq.heapify(self.genlist) - - next = __next__ - - def __lt__(self, other): - return self.dt < other.dt - - def __gt__(self, other): - return self.dt > other.dt - - def __eq__(self, other): - return self.dt == other.dt - - def __ne__(self, other): - return self.dt != other.dt - - def __init__(self, cache=False): - super(rruleset, self).__init__(cache) - self._rrule = [] - self._rdate = [] - self._exrule = [] - self._exdate = [] - - @_invalidates_cache - def rrule(self, rrule): - """ Include the given :py:class:`rrule` instance in the recurrence set - generation. """ - self._rrule.append(rrule) - - @_invalidates_cache - def rdate(self, rdate): - """ Include the given :py:class:`datetime` instance in the recurrence - set generation. """ - self._rdate.append(rdate) - - @_invalidates_cache - def exrule(self, exrule): - """ Include the given rrule instance in the recurrence set exclusion - list. Dates which are part of the given recurrence rules will not - be generated, even if some inclusive rrule or rdate matches them. - """ - self._exrule.append(exrule) - - @_invalidates_cache - def exdate(self, exdate): - """ Include the given datetime instance in the recurrence set - exclusion list. Dates included that way will not be generated, - even if some inclusive rrule or rdate matches them. """ - self._exdate.append(exdate) - - def _iter(self): - rlist = [] - self._rdate.sort() - self._genitem(rlist, iter(self._rdate)) - for gen in [iter(x) for x in self._rrule]: - self._genitem(rlist, gen) - exlist = [] - self._exdate.sort() - self._genitem(exlist, iter(self._exdate)) - for gen in [iter(x) for x in self._exrule]: - self._genitem(exlist, gen) - lastdt = None - total = 0 - heapq.heapify(rlist) - heapq.heapify(exlist) - while rlist: - ritem = rlist[0] - if not lastdt or lastdt != ritem.dt: - while exlist and exlist[0] < ritem: - exitem = exlist[0] - advance_iterator(exitem) - if exlist and exlist[0] is exitem: - heapq.heapreplace(exlist, exitem) - if not exlist or ritem != exlist[0]: - total += 1 - yield ritem.dt - lastdt = ritem.dt - advance_iterator(ritem) - if rlist and rlist[0] is ritem: - heapq.heapreplace(rlist, ritem) - self._len = total - - - - -class _rrulestr(object): - """ Parses a string representation of a recurrence rule or set of - recurrence rules. - - :param s: - Required, a string defining one or more recurrence rules. - - :param dtstart: - If given, used as the default recurrence start if not specified in the - rule string. - - :param cache: - If set ``True`` caching of results will be enabled, improving - performance of multiple queries considerably. - - :param unfold: - If set ``True`` indicates that a rule string is split over more - than one line and should be joined before processing. - - :param forceset: - If set ``True`` forces a :class:`dateutil.rrule.rruleset` to - be returned. - - :param compatible: - If set ``True`` forces ``unfold`` and ``forceset`` to be ``True``. - - :param ignoretz: - If set ``True``, time zones in parsed strings are ignored and a naive - :class:`datetime.datetime` object is returned. - - :param tzids: - If given, a callable or mapping used to retrieve a - :class:`datetime.tzinfo` from a string representation. - Defaults to :func:`dateutil.tz.gettz`. - - :param tzinfos: - Additional time zone names / aliases which may be present in a string - representation. See :func:`dateutil.parser.parse` for more - information. - - :return: - Returns a :class:`dateutil.rrule.rruleset` or - :class:`dateutil.rrule.rrule` - """ - - _freq_map = {"YEARLY": YEARLY, - "MONTHLY": MONTHLY, - "WEEKLY": WEEKLY, - "DAILY": DAILY, - "HOURLY": HOURLY, - "MINUTELY": MINUTELY, - "SECONDLY": SECONDLY} - - _weekday_map = {"MO": 0, "TU": 1, "WE": 2, "TH": 3, - "FR": 4, "SA": 5, "SU": 6} - - def _handle_int(self, rrkwargs, name, value, **kwargs): - rrkwargs[name.lower()] = int(value) - - def _handle_int_list(self, rrkwargs, name, value, **kwargs): - rrkwargs[name.lower()] = [int(x) for x in value.split(',')] - - _handle_INTERVAL = _handle_int - _handle_COUNT = _handle_int - _handle_BYSETPOS = _handle_int_list - _handle_BYMONTH = _handle_int_list - _handle_BYMONTHDAY = _handle_int_list - _handle_BYYEARDAY = _handle_int_list - _handle_BYEASTER = _handle_int_list - _handle_BYWEEKNO = _handle_int_list - _handle_BYHOUR = _handle_int_list - _handle_BYMINUTE = _handle_int_list - _handle_BYSECOND = _handle_int_list - - def _handle_FREQ(self, rrkwargs, name, value, **kwargs): - rrkwargs["freq"] = self._freq_map[value] - - def _handle_UNTIL(self, rrkwargs, name, value, **kwargs): - global parser - if not parser: - from dateutil import parser - try: - rrkwargs["until"] = parser.parse(value, - ignoretz=kwargs.get("ignoretz"), - tzinfos=kwargs.get("tzinfos")) - except ValueError: - raise ValueError("invalid until date") - - def _handle_WKST(self, rrkwargs, name, value, **kwargs): - rrkwargs["wkst"] = self._weekday_map[value] - - def _handle_BYWEEKDAY(self, rrkwargs, name, value, **kwargs): - """ - Two ways to specify this: +1MO or MO(+1) - """ - l = [] - for wday in value.split(','): - if '(' in wday: - # If it's of the form TH(+1), etc. - splt = wday.split('(') - w = splt[0] - n = int(splt[1][:-1]) - elif len(wday): - # If it's of the form +1MO - for i in range(len(wday)): - if wday[i] not in '+-0123456789': - break - n = wday[:i] or None - w = wday[i:] - if n: - n = int(n) - else: - raise ValueError("Invalid (empty) BYDAY specification.") - - l.append(weekdays[self._weekday_map[w]](n)) - rrkwargs["byweekday"] = l - - _handle_BYDAY = _handle_BYWEEKDAY - - def _parse_rfc_rrule(self, line, - dtstart=None, - cache=False, - ignoretz=False, - tzinfos=None): - if line.find(':') != -1: - name, value = line.split(':') - if name != "RRULE": - raise ValueError("unknown parameter name") - else: - value = line - rrkwargs = {} - for pair in value.split(';'): - name, value = pair.split('=') - name = name.upper() - value = value.upper() - try: - getattr(self, "_handle_"+name)(rrkwargs, name, value, - ignoretz=ignoretz, - tzinfos=tzinfos) - except AttributeError: - raise ValueError("unknown parameter '%s'" % name) - except (KeyError, ValueError): - raise ValueError("invalid '%s': %s" % (name, value)) - return rrule(dtstart=dtstart, cache=cache, **rrkwargs) - - def _parse_date_value(self, date_value, parms, rule_tzids, - ignoretz, tzids, tzinfos): - global parser - if not parser: - from dateutil import parser - - datevals = [] - value_found = False - TZID = None - - for parm in parms: - if parm.startswith("TZID="): - try: - tzkey = rule_tzids[parm.split('TZID=')[-1]] - except KeyError: - continue - if tzids is None: - from . import tz - tzlookup = tz.gettz - elif callable(tzids): - tzlookup = tzids - else: - tzlookup = getattr(tzids, 'get', None) - if tzlookup is None: - msg = ('tzids must be a callable, mapping, or None, ' - 'not %s' % tzids) - raise ValueError(msg) - - TZID = tzlookup(tzkey) - continue - - # RFC 5445 3.8.2.4: The VALUE parameter is optional, but may be found - # only once. - if parm not in {"VALUE=DATE-TIME", "VALUE=DATE"}: - raise ValueError("unsupported parm: " + parm) - else: - if value_found: - msg = ("Duplicate value parameter found in: " + parm) - raise ValueError(msg) - value_found = True - - for datestr in date_value.split(','): - date = parser.parse(datestr, ignoretz=ignoretz, tzinfos=tzinfos) - if TZID is not None: - if date.tzinfo is None: - date = date.replace(tzinfo=TZID) - else: - raise ValueError('DTSTART/EXDATE specifies multiple timezone') - datevals.append(date) - - return datevals - - def _parse_rfc(self, s, - dtstart=None, - cache=False, - unfold=False, - forceset=False, - compatible=False, - ignoretz=False, - tzids=None, - tzinfos=None): - global parser - if compatible: - forceset = True - unfold = True - - TZID_NAMES = dict(map( - lambda x: (x.upper(), x), - re.findall('TZID=(?P[^:]+):', s) - )) - s = s.upper() - if not s.strip(): - raise ValueError("empty string") - if unfold: - lines = s.splitlines() - i = 0 - while i < len(lines): - line = lines[i].rstrip() - if not line: - del lines[i] - elif i > 0 and line[0] == " ": - lines[i-1] += line[1:] - del lines[i] - else: - i += 1 - else: - lines = s.split() - if (not forceset and len(lines) == 1 and (s.find(':') == -1 or - s.startswith('RRULE:'))): - return self._parse_rfc_rrule(lines[0], cache=cache, - dtstart=dtstart, ignoretz=ignoretz, - tzinfos=tzinfos) - else: - rrulevals = [] - rdatevals = [] - exrulevals = [] - exdatevals = [] - for line in lines: - if not line: - continue - if line.find(':') == -1: - name = "RRULE" - value = line - else: - name, value = line.split(':', 1) - parms = name.split(';') - if not parms: - raise ValueError("empty property name") - name = parms[0] - parms = parms[1:] - if name == "RRULE": - for parm in parms: - raise ValueError("unsupported RRULE parm: "+parm) - rrulevals.append(value) - elif name == "RDATE": - for parm in parms: - if parm != "VALUE=DATE-TIME": - raise ValueError("unsupported RDATE parm: "+parm) - rdatevals.append(value) - elif name == "EXRULE": - for parm in parms: - raise ValueError("unsupported EXRULE parm: "+parm) - exrulevals.append(value) - elif name == "EXDATE": - exdatevals.extend( - self._parse_date_value(value, parms, - TZID_NAMES, ignoretz, - tzids, tzinfos) - ) - elif name == "DTSTART": - dtvals = self._parse_date_value(value, parms, TZID_NAMES, - ignoretz, tzids, tzinfos) - if len(dtvals) != 1: - raise ValueError("Multiple DTSTART values specified:" + - value) - dtstart = dtvals[0] - else: - raise ValueError("unsupported property: "+name) - if (forceset or len(rrulevals) > 1 or rdatevals - or exrulevals or exdatevals): - if not parser and (rdatevals or exdatevals): - from dateutil import parser - rset = rruleset(cache=cache) - for value in rrulevals: - rset.rrule(self._parse_rfc_rrule(value, dtstart=dtstart, - ignoretz=ignoretz, - tzinfos=tzinfos)) - for value in rdatevals: - for datestr in value.split(','): - rset.rdate(parser.parse(datestr, - ignoretz=ignoretz, - tzinfos=tzinfos)) - for value in exrulevals: - rset.exrule(self._parse_rfc_rrule(value, dtstart=dtstart, - ignoretz=ignoretz, - tzinfos=tzinfos)) - for value in exdatevals: - rset.exdate(value) - if compatible and dtstart: - rset.rdate(dtstart) - return rset - else: - return self._parse_rfc_rrule(rrulevals[0], - dtstart=dtstart, - cache=cache, - ignoretz=ignoretz, - tzinfos=tzinfos) - - def __call__(self, s, **kwargs): - return self._parse_rfc(s, **kwargs) - - -rrulestr = _rrulestr() - -# vim:ts=4:sw=4:et diff --git a/.venv/Lib/site-packages/dateutil/tz/__init__.py b/.venv/Lib/site-packages/dateutil/tz/__init__.py deleted file mode 100644 index af1352c..0000000 --- a/.venv/Lib/site-packages/dateutil/tz/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -from .tz import * -from .tz import __doc__ - -__all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange", - "tzstr", "tzical", "tzwin", "tzwinlocal", "gettz", - "enfold", "datetime_ambiguous", "datetime_exists", - "resolve_imaginary", "UTC", "DeprecatedTzFormatWarning"] - - -class DeprecatedTzFormatWarning(Warning): - """Warning raised when time zones are parsed from deprecated formats.""" diff --git a/.venv/Lib/site-packages/dateutil/tz/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/dateutil/tz/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 29edc5add822ba628bc6b68d97e3d6318fe97e4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 714 zcmY*W&2H2%5O$LNW4lYY3mmwh9JnkJ?HwUh(F!hAFYF3rMY6n^Nov)JQ`_0nT;XMS z2c9HXPP_sV5_YmGFqX&jgqKm-FA!U)DNfd?>!1DL@a9>O6k;0Tuaf`;!2Jc8v{0!xg(M05a;KakavpROKR z1#R%cu`y$yQpV`eHnmOLiEUJt8MJh48>vz*>Bu&jkmwDXmpS^c#%gaD-tW{~QPOGm z^dZ9>t!?NC%S=h2OW+o*D3I}DEAm>^h92JA@Ut-1&?AjT$sICL@LZH!-?h?ixQmBs2g*LkMUDp#vW2kux`M_tCND!XU)A zS6Ifrxwug!nwV>hE3UmO)2fK!zI>c@)y?tcYS2y?E4f3&+9_j&f?9fc#@J2GW$)3E ztM`p)zv+(sqGzv?jX`aat2$RYIY)DCRh4X&jj^bt5;4@Vb)rd*cUbO{3$aa%u=uj# z={3*MBz|tS74pP3Cya?wSjLX4yAIret7JmQCc))u*oJOnz6ZZ$E~V>lya(U?{@YkD d`RI1?x(D;dr!mjET(fW*gk*nuspr23qdz;b#ytQ4 diff --git a/.venv/Lib/site-packages/dateutil/tz/__pycache__/_common.cpython-38.pyc b/.venv/Lib/site-packages/dateutil/tz/__pycache__/_common.cpython-38.pyc deleted file mode 100644 index cd0ca675c906e834ad505c01c862de30411aa5d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10757 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 b?bO8Z(?E2Hd3MoSIiz!%h?SHp diff --git a/.venv/Lib/site-packages/dateutil/tz/__pycache__/_factories.cpython-38.pyc b/.venv/Lib/site-packages/dateutil/tz/__pycache__/_factories.cpython-38.pyc deleted file mode 100644 index 088f8afedc0bc8caefedfd8766919258f1c164b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2868 zcmb_e&5zqe6rZsj$N4IOZOgWW5@>~LK6Zh&qCyoEwOTIKR2tWl6yC)bIoZU%c z1!_4|JAy|n#>w-KeW=JQ(BUMYj0Dz8(xHqp>xCECrf)L``p!$@ke~#ImUKP5Ki*0P z+bLJsAf|I$;*Qwff+pVs!AMR*qNuWRvS)SeoaWZ=COli@fNuJZK0Ciz7$yU$qCw1c zNsfkGh!Sj~JseL|7#`T#j#H_fNNh{(_MYMU0PY`#aT-YpGsr*f+uyVwNG@c1XSAJ( z_8l&JDjT*RXR5{f!!%1;Y}8WFmF=~seDJh=H+kHaiQ=CRqqrAsbJ=E*;vuS6n zcA{8iBH?mvxGO5)5H^XaC)B0mGxIlCD_mWO3&yC3jckFElP<)j=ZW)0Y$o=;i4|J5 zh;U(&?}#$IgomOCL>#4Q82VJyaP$<4CW^OFyaS>EP2zGwtF(FCy~7P$jOrlj^Dxxa zFzjb+lw!XghEGOOI<=VFnq76{FvKy(^QUK;gN+O3baWAYHKFln-7!wb=*s+KfpQC) zJPo3Noq-$)Y-R(*9PsG=c*BH!cOj5P5bxo7ysaW#nge8W`j>^!g4J|<_4`zDF@PMl z;tT*KMwq~s+KE(4a5WMG*@{{n!R1b?0Gw}WN9_XSa94q>pSvSoPkY5w^jqRBh&5iB zIl5NZ0oGy#tO6&BGbqlXFyWdB6SH^0fOE}$9u=s+K4M6z;}HXblE7g|PFFX+e zpQCidvCbsfAQHR!!t&`eMoWRo(-)7=fCOcO?J$nw9j-6E*&fPd%ms2!H-HIQ3`q{* z)zh`<21Yq4e+J9vVWGsEAUQnhTH|xe=gk<5{uU2n8)<(Vn*0-lBDtmLo+VbXrcJDU z(y^Y~0}nOq0gvs8liQ5!ThE=`F>JqUMoT$ZCoaz1haXr;xBSNqidDgzRKV)&L%r;J zxqXwUD)#muDcxGn5x=6=ts`B2gF5<6s((B&6M8HS)>=M`CCT4<`8*GaL^@ahExcDcYV52_&i^(pZ`QcGNb zbNz~VA6^1|(5nk)93v1?Z0153F0iNd2IGu6;v+lnacoJ=f367#`uL=xwaBqbnEK@uPnkfaQ2N`@pJkYs>b zw{kK`#AR^6uZpkWC9a_GQJ4yS9eY<%e1hUr6xUFE2BLsGl|g-&$>f)Cih8k*GnOj+ z5$eAKqdW_O0M-HZ%ZNV~z(ctEbVGcB8=r*jFTwCNv>CQ>#II`)KV0x*&=B5$O4s5n zO}Q!2(;6I9!1=X)_LNIgNyRFjgGn-fKZYj)H$3TV?cJPyD}0L|H4^{*>u{&KRkxe9 IrrW&uA2No5O#lD@ diff --git a/.venv/Lib/site-packages/dateutil/tz/__pycache__/tz.cpython-38.pyc b/.venv/Lib/site-packages/dateutil/tz/__pycache__/tz.cpython-38.pyc deleted file mode 100644 index 589c6df7b9976c22dc0da7795a52ab7a4d3725d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44891 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

vzJ~sSD;Z3f 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 diff --git a/.venv/Lib/site-packages/dateutil/tz/__pycache__/win.cpython-38.pyc b/.venv/Lib/site-packages/dateutil/tz/__pycache__/win.cpython-38.pyc deleted file mode 100644 index bedb6bad28b1c6cc6ffdb2187502a68efc13f22b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11262 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 QMN^-?jlZ|1f5$5SFEChNdjJ3c diff --git a/.venv/Lib/site-packages/dateutil/tz/_common.py b/.venv/Lib/site-packages/dateutil/tz/_common.py deleted file mode 100644 index e6ac118..0000000 --- a/.venv/Lib/site-packages/dateutil/tz/_common.py +++ /dev/null @@ -1,419 +0,0 @@ -from six import PY2 - -from functools import wraps - -from datetime import datetime, timedelta, tzinfo - - -ZERO = timedelta(0) - -__all__ = ['tzname_in_python2', 'enfold'] - - -def tzname_in_python2(namefunc): - """Change unicode output into bytestrings in Python 2 - - tzname() API changed in Python 3. It used to return bytes, but was changed - to unicode strings - """ - if PY2: - @wraps(namefunc) - def adjust_encoding(*args, **kwargs): - name = namefunc(*args, **kwargs) - if name is not None: - name = name.encode() - - return name - - return adjust_encoding - else: - return namefunc - - -# The following is adapted from Alexander Belopolsky's tz library -# https://github.com/abalkin/tz -if hasattr(datetime, 'fold'): - # This is the pre-python 3.6 fold situation - def enfold(dt, fold=1): - """ - Provides a unified interface for assigning the ``fold`` attribute to - datetimes both before and after the implementation of PEP-495. - - :param fold: - The value for the ``fold`` attribute in the returned datetime. This - should be either 0 or 1. - - :return: - Returns an object for which ``getattr(dt, 'fold', 0)`` returns - ``fold`` for all versions of Python. In versions prior to - Python 3.6, this is a ``_DatetimeWithFold`` object, which is a - subclass of :py:class:`datetime.datetime` with the ``fold`` - attribute added, if ``fold`` is 1. - - .. versionadded:: 2.6.0 - """ - return dt.replace(fold=fold) - -else: - class _DatetimeWithFold(datetime): - """ - This is a class designed to provide a PEP 495-compliant interface for - Python versions before 3.6. It is used only for dates in a fold, so - the ``fold`` attribute is fixed at ``1``. - - .. versionadded:: 2.6.0 - """ - __slots__ = () - - def replace(self, *args, **kwargs): - """ - Return a datetime with the same attributes, except for those - attributes given new values by whichever keyword arguments are - specified. Note that tzinfo=None can be specified to create a naive - datetime from an aware datetime with no conversion of date and time - data. - - This is reimplemented in ``_DatetimeWithFold`` because pypy3 will - return a ``datetime.datetime`` even if ``fold`` is unchanged. - """ - argnames = ( - 'year', 'month', 'day', 'hour', 'minute', 'second', - 'microsecond', 'tzinfo' - ) - - for arg, argname in zip(args, argnames): - if argname in kwargs: - raise TypeError('Duplicate argument: {}'.format(argname)) - - kwargs[argname] = arg - - for argname in argnames: - if argname not in kwargs: - kwargs[argname] = getattr(self, argname) - - dt_class = self.__class__ if kwargs.get('fold', 1) else datetime - - return dt_class(**kwargs) - - @property - def fold(self): - return 1 - - def enfold(dt, fold=1): - """ - Provides a unified interface for assigning the ``fold`` attribute to - datetimes both before and after the implementation of PEP-495. - - :param fold: - The value for the ``fold`` attribute in the returned datetime. This - should be either 0 or 1. - - :return: - Returns an object for which ``getattr(dt, 'fold', 0)`` returns - ``fold`` for all versions of Python. In versions prior to - Python 3.6, this is a ``_DatetimeWithFold`` object, which is a - subclass of :py:class:`datetime.datetime` with the ``fold`` - attribute added, if ``fold`` is 1. - - .. versionadded:: 2.6.0 - """ - if getattr(dt, 'fold', 0) == fold: - return dt - - args = dt.timetuple()[:6] - args += (dt.microsecond, dt.tzinfo) - - if fold: - return _DatetimeWithFold(*args) - else: - return datetime(*args) - - -def _validate_fromutc_inputs(f): - """ - The CPython version of ``fromutc`` checks that the input is a ``datetime`` - object and that ``self`` is attached as its ``tzinfo``. - """ - @wraps(f) - def fromutc(self, dt): - if not isinstance(dt, datetime): - raise TypeError("fromutc() requires a datetime argument") - if dt.tzinfo is not self: - raise ValueError("dt.tzinfo is not self") - - return f(self, dt) - - return fromutc - - -class _tzinfo(tzinfo): - """ - Base class for all ``dateutil`` ``tzinfo`` objects. - """ - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - - dt = dt.replace(tzinfo=self) - - wall_0 = enfold(dt, fold=0) - wall_1 = enfold(dt, fold=1) - - same_offset = wall_0.utcoffset() == wall_1.utcoffset() - same_dt = wall_0.replace(tzinfo=None) == wall_1.replace(tzinfo=None) - - return same_dt and not same_offset - - def _fold_status(self, dt_utc, dt_wall): - """ - Determine the fold status of a "wall" datetime, given a representation - of the same datetime as a (naive) UTC datetime. This is calculated based - on the assumption that ``dt.utcoffset() - dt.dst()`` is constant for all - datetimes, and that this offset is the actual number of hours separating - ``dt_utc`` and ``dt_wall``. - - :param dt_utc: - Representation of the datetime as UTC - - :param dt_wall: - Representation of the datetime as "wall time". This parameter must - either have a `fold` attribute or have a fold-naive - :class:`datetime.tzinfo` attached, otherwise the calculation may - fail. - """ - if self.is_ambiguous(dt_wall): - delta_wall = dt_wall - dt_utc - _fold = int(delta_wall == (dt_utc.utcoffset() - dt_utc.dst())) - else: - _fold = 0 - - return _fold - - def _fold(self, dt): - return getattr(dt, 'fold', 0) - - def _fromutc(self, dt): - """ - Given a timezone-aware datetime in a given timezone, calculates a - timezone-aware datetime in a new timezone. - - Since this is the one time that we *know* we have an unambiguous - datetime object, we take this opportunity to determine whether the - datetime is ambiguous and in a "fold" state (e.g. if it's the first - occurrence, chronologically, of the ambiguous datetime). - - :param dt: - A timezone-aware :class:`datetime.datetime` object. - """ - - # Re-implement the algorithm from Python's datetime.py - dtoff = dt.utcoffset() - if dtoff is None: - raise ValueError("fromutc() requires a non-None utcoffset() " - "result") - - # The original datetime.py code assumes that `dst()` defaults to - # zero during ambiguous times. PEP 495 inverts this presumption, so - # for pre-PEP 495 versions of python, we need to tweak the algorithm. - dtdst = dt.dst() - if dtdst is None: - raise ValueError("fromutc() requires a non-None dst() result") - delta = dtoff - dtdst - - dt += delta - # Set fold=1 so we can default to being in the fold for - # ambiguous dates. - dtdst = enfold(dt, fold=1).dst() - if dtdst is None: - raise ValueError("fromutc(): dt.dst gave inconsistent " - "results; cannot convert") - return dt + dtdst - - @_validate_fromutc_inputs - def fromutc(self, dt): - """ - Given a timezone-aware datetime in a given timezone, calculates a - timezone-aware datetime in a new timezone. - - Since this is the one time that we *know* we have an unambiguous - datetime object, we take this opportunity to determine whether the - datetime is ambiguous and in a "fold" state (e.g. if it's the first - occurrence, chronologically, of the ambiguous datetime). - - :param dt: - A timezone-aware :class:`datetime.datetime` object. - """ - dt_wall = self._fromutc(dt) - - # Calculate the fold status given the two datetimes. - _fold = self._fold_status(dt, dt_wall) - - # Set the default fold value for ambiguous dates - return enfold(dt_wall, fold=_fold) - - -class tzrangebase(_tzinfo): - """ - This is an abstract base class for time zones represented by an annual - transition into and out of DST. Child classes should implement the following - methods: - - * ``__init__(self, *args, **kwargs)`` - * ``transitions(self, year)`` - this is expected to return a tuple of - datetimes representing the DST on and off transitions in standard - time. - - A fully initialized ``tzrangebase`` subclass should also provide the - following attributes: - * ``hasdst``: Boolean whether or not the zone uses DST. - * ``_dst_offset`` / ``_std_offset``: :class:`datetime.timedelta` objects - representing the respective UTC offsets. - * ``_dst_abbr`` / ``_std_abbr``: Strings representing the timezone short - abbreviations in DST and STD, respectively. - * ``_hasdst``: Whether or not the zone has DST. - - .. versionadded:: 2.6.0 - """ - def __init__(self): - raise NotImplementedError('tzrangebase is an abstract base class') - - def utcoffset(self, dt): - isdst = self._isdst(dt) - - if isdst is None: - return None - elif isdst: - return self._dst_offset - else: - return self._std_offset - - def dst(self, dt): - isdst = self._isdst(dt) - - if isdst is None: - return None - elif isdst: - return self._dst_base_offset - else: - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - if self._isdst(dt): - return self._dst_abbr - else: - return self._std_abbr - - def fromutc(self, dt): - """ Given a datetime in UTC, return local time """ - if not isinstance(dt, datetime): - raise TypeError("fromutc() requires a datetime argument") - - if dt.tzinfo is not self: - raise ValueError("dt.tzinfo is not self") - - # Get transitions - if there are none, fixed offset - transitions = self.transitions(dt.year) - if transitions is None: - return dt + self.utcoffset(dt) - - # Get the transition times in UTC - dston, dstoff = transitions - - dston -= self._std_offset - dstoff -= self._std_offset - - utc_transitions = (dston, dstoff) - dt_utc = dt.replace(tzinfo=None) - - isdst = self._naive_isdst(dt_utc, utc_transitions) - - if isdst: - dt_wall = dt + self._dst_offset - else: - dt_wall = dt + self._std_offset - - _fold = int(not isdst and self.is_ambiguous(dt_wall)) - - return enfold(dt_wall, fold=_fold) - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - if not self.hasdst: - return False - - start, end = self.transitions(dt.year) - - dt = dt.replace(tzinfo=None) - return (end <= dt < end + self._dst_base_offset) - - def _isdst(self, dt): - if not self.hasdst: - return False - elif dt is None: - return None - - transitions = self.transitions(dt.year) - - if transitions is None: - return False - - dt = dt.replace(tzinfo=None) - - isdst = self._naive_isdst(dt, transitions) - - # Handle ambiguous dates - if not isdst and self.is_ambiguous(dt): - return not self._fold(dt) - else: - return isdst - - def _naive_isdst(self, dt, transitions): - dston, dstoff = transitions - - dt = dt.replace(tzinfo=None) - - if dston < dstoff: - isdst = dston <= dt < dstoff - else: - isdst = not dstoff <= dt < dston - - return isdst - - @property - def _dst_base_offset(self): - return self._dst_offset - self._std_offset - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s(...)" % self.__class__.__name__ - - __reduce__ = object.__reduce__ diff --git a/.venv/Lib/site-packages/dateutil/tz/_factories.py b/.venv/Lib/site-packages/dateutil/tz/_factories.py deleted file mode 100644 index f8a6589..0000000 --- a/.venv/Lib/site-packages/dateutil/tz/_factories.py +++ /dev/null @@ -1,80 +0,0 @@ -from datetime import timedelta -import weakref -from collections import OrderedDict - -from six.moves import _thread - - -class _TzSingleton(type): - def __init__(cls, *args, **kwargs): - cls.__instance = None - super(_TzSingleton, cls).__init__(*args, **kwargs) - - def __call__(cls): - if cls.__instance is None: - cls.__instance = super(_TzSingleton, cls).__call__() - return cls.__instance - - -class _TzFactory(type): - def instance(cls, *args, **kwargs): - """Alternate constructor that returns a fresh instance""" - return type.__call__(cls, *args, **kwargs) - - -class _TzOffsetFactory(_TzFactory): - def __init__(cls, *args, **kwargs): - cls.__instances = weakref.WeakValueDictionary() - cls.__strong_cache = OrderedDict() - cls.__strong_cache_size = 8 - - cls._cache_lock = _thread.allocate_lock() - - def __call__(cls, name, offset): - if isinstance(offset, timedelta): - key = (name, offset.total_seconds()) - else: - key = (name, offset) - - instance = cls.__instances.get(key, None) - if instance is None: - instance = cls.__instances.setdefault(key, - cls.instance(name, offset)) - - # This lock may not be necessary in Python 3. See GH issue #901 - with cls._cache_lock: - cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance) - - # Remove an item if the strong cache is overpopulated - if len(cls.__strong_cache) > cls.__strong_cache_size: - cls.__strong_cache.popitem(last=False) - - return instance - - -class _TzStrFactory(_TzFactory): - def __init__(cls, *args, **kwargs): - cls.__instances = weakref.WeakValueDictionary() - cls.__strong_cache = OrderedDict() - cls.__strong_cache_size = 8 - - cls.__cache_lock = _thread.allocate_lock() - - def __call__(cls, s, posix_offset=False): - key = (s, posix_offset) - instance = cls.__instances.get(key, None) - - if instance is None: - instance = cls.__instances.setdefault(key, - cls.instance(s, posix_offset)) - - # This lock may not be necessary in Python 3. See GH issue #901 - with cls.__cache_lock: - cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance) - - # Remove an item if the strong cache is overpopulated - if len(cls.__strong_cache) > cls.__strong_cache_size: - cls.__strong_cache.popitem(last=False) - - return instance - diff --git a/.venv/Lib/site-packages/dateutil/tz/tz.py b/.venv/Lib/site-packages/dateutil/tz/tz.py deleted file mode 100644 index c67f56d..0000000 --- a/.venv/Lib/site-packages/dateutil/tz/tz.py +++ /dev/null @@ -1,1849 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers timezone implementations subclassing the abstract -:py:class:`datetime.tzinfo` type. There are classes to handle tzfile format -files (usually are in :file:`/etc/localtime`, :file:`/usr/share/zoneinfo`, -etc), TZ environment string (in all known formats), given ranges (with help -from relative deltas), local machine timezone, fixed offset timezone, and UTC -timezone. -""" -import datetime -import struct -import time -import sys -import os -import bisect -import weakref -from collections import OrderedDict - -import six -from six import string_types -from six.moves import _thread -from ._common import tzname_in_python2, _tzinfo -from ._common import tzrangebase, enfold -from ._common import _validate_fromutc_inputs - -from ._factories import _TzSingleton, _TzOffsetFactory -from ._factories import _TzStrFactory -try: - from .win import tzwin, tzwinlocal -except ImportError: - tzwin = tzwinlocal = None - -# For warning about rounding tzinfo -from warnings import warn - -ZERO = datetime.timedelta(0) -EPOCH = datetime.datetime.utcfromtimestamp(0) -EPOCHORDINAL = EPOCH.toordinal() - - -@six.add_metaclass(_TzSingleton) -class tzutc(datetime.tzinfo): - """ - This is a tzinfo object that represents the UTC time zone. - - **Examples:** - - .. doctest:: - - >>> from datetime import * - >>> from dateutil.tz import * - - >>> datetime.now() - datetime.datetime(2003, 9, 27, 9, 40, 1, 521290) - - >>> datetime.now(tzutc()) - datetime.datetime(2003, 9, 27, 12, 40, 12, 156379, tzinfo=tzutc()) - - >>> datetime.now(tzutc()).tzname() - 'UTC' - - .. versionchanged:: 2.7.0 - ``tzutc()`` is now a singleton, so the result of ``tzutc()`` will - always return the same object. - - .. doctest:: - - >>> from dateutil.tz import tzutc, UTC - >>> tzutc() is tzutc() - True - >>> tzutc() is UTC - True - """ - def utcoffset(self, dt): - return ZERO - - def dst(self, dt): - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return "UTC" - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - return False - - @_validate_fromutc_inputs - def fromutc(self, dt): - """ - Fast track version of fromutc() returns the original ``dt`` object for - any valid :py:class:`datetime.datetime` object. - """ - return dt - - def __eq__(self, other): - if not isinstance(other, (tzutc, tzoffset)): - return NotImplemented - - return (isinstance(other, tzutc) or - (isinstance(other, tzoffset) and other._offset == ZERO)) - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s()" % self.__class__.__name__ - - __reduce__ = object.__reduce__ - - -#: Convenience constant providing a :class:`tzutc()` instance -#: -#: .. versionadded:: 2.7.0 -UTC = tzutc() - - -@six.add_metaclass(_TzOffsetFactory) -class tzoffset(datetime.tzinfo): - """ - A simple class for representing a fixed offset from UTC. - - :param name: - The timezone name, to be returned when ``tzname()`` is called. - :param offset: - The time zone offset in seconds, or (since version 2.6.0, represented - as a :py:class:`datetime.timedelta` object). - """ - def __init__(self, name, offset): - self._name = name - - try: - # Allow a timedelta - offset = offset.total_seconds() - except (TypeError, AttributeError): - pass - - self._offset = datetime.timedelta(seconds=_get_supported_offset(offset)) - - def utcoffset(self, dt): - return self._offset - - def dst(self, dt): - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return self._name - - @_validate_fromutc_inputs - def fromutc(self, dt): - return dt + self._offset - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - return False - - def __eq__(self, other): - if not isinstance(other, tzoffset): - return NotImplemented - - return self._offset == other._offset - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s(%s, %s)" % (self.__class__.__name__, - repr(self._name), - int(self._offset.total_seconds())) - - __reduce__ = object.__reduce__ - - -class tzlocal(_tzinfo): - """ - A :class:`tzinfo` subclass built around the ``time`` timezone functions. - """ - def __init__(self): - super(tzlocal, self).__init__() - - self._std_offset = datetime.timedelta(seconds=-time.timezone) - if time.daylight: - self._dst_offset = datetime.timedelta(seconds=-time.altzone) - else: - self._dst_offset = self._std_offset - - self._dst_saved = self._dst_offset - self._std_offset - self._hasdst = bool(self._dst_saved) - self._tznames = tuple(time.tzname) - - def utcoffset(self, dt): - if dt is None and self._hasdst: - return None - - if self._isdst(dt): - return self._dst_offset - else: - return self._std_offset - - def dst(self, dt): - if dt is None and self._hasdst: - return None - - if self._isdst(dt): - return self._dst_offset - self._std_offset - else: - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return self._tznames[self._isdst(dt)] - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - naive_dst = self._naive_is_dst(dt) - return (not naive_dst and - (naive_dst != self._naive_is_dst(dt - self._dst_saved))) - - def _naive_is_dst(self, dt): - timestamp = _datetime_to_timestamp(dt) - return time.localtime(timestamp + time.timezone).tm_isdst - - def _isdst(self, dt, fold_naive=True): - # We can't use mktime here. It is unstable when deciding if - # the hour near to a change is DST or not. - # - # timestamp = time.mktime((dt.year, dt.month, dt.day, dt.hour, - # dt.minute, dt.second, dt.weekday(), 0, -1)) - # return time.localtime(timestamp).tm_isdst - # - # The code above yields the following result: - # - # >>> import tz, datetime - # >>> t = tz.tzlocal() - # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() - # 'BRDT' - # >>> datetime.datetime(2003,2,16,0,tzinfo=t).tzname() - # 'BRST' - # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() - # 'BRST' - # >>> datetime.datetime(2003,2,15,22,tzinfo=t).tzname() - # 'BRDT' - # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() - # 'BRDT' - # - # Here is a more stable implementation: - # - if not self._hasdst: - return False - - # Check for ambiguous times: - dstval = self._naive_is_dst(dt) - fold = getattr(dt, 'fold', None) - - if self.is_ambiguous(dt): - if fold is not None: - return not self._fold(dt) - else: - return True - - return dstval - - def __eq__(self, other): - if isinstance(other, tzlocal): - return (self._std_offset == other._std_offset and - self._dst_offset == other._dst_offset) - elif isinstance(other, tzutc): - return (not self._hasdst and - self._tznames[0] in {'UTC', 'GMT'} and - self._std_offset == ZERO) - elif isinstance(other, tzoffset): - return (not self._hasdst and - self._tznames[0] == other._name and - self._std_offset == other._offset) - else: - return NotImplemented - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s()" % self.__class__.__name__ - - __reduce__ = object.__reduce__ - - -class _ttinfo(object): - __slots__ = ["offset", "delta", "isdst", "abbr", - "isstd", "isgmt", "dstoffset"] - - def __init__(self): - for attr in self.__slots__: - setattr(self, attr, None) - - def __repr__(self): - l = [] - for attr in self.__slots__: - value = getattr(self, attr) - if value is not None: - l.append("%s=%s" % (attr, repr(value))) - return "%s(%s)" % (self.__class__.__name__, ", ".join(l)) - - def __eq__(self, other): - if not isinstance(other, _ttinfo): - return NotImplemented - - return (self.offset == other.offset and - self.delta == other.delta and - self.isdst == other.isdst and - self.abbr == other.abbr and - self.isstd == other.isstd and - self.isgmt == other.isgmt and - self.dstoffset == other.dstoffset) - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __getstate__(self): - state = {} - for name in self.__slots__: - state[name] = getattr(self, name, None) - return state - - def __setstate__(self, state): - for name in self.__slots__: - if name in state: - setattr(self, name, state[name]) - - -class _tzfile(object): - """ - Lightweight class for holding the relevant transition and time zone - information read from binary tzfiles. - """ - attrs = ['trans_list', 'trans_list_utc', 'trans_idx', 'ttinfo_list', - 'ttinfo_std', 'ttinfo_dst', 'ttinfo_before', 'ttinfo_first'] - - def __init__(self, **kwargs): - for attr in self.attrs: - setattr(self, attr, kwargs.get(attr, None)) - - -class tzfile(_tzinfo): - """ - This is a ``tzinfo`` subclass that allows one to use the ``tzfile(5)`` - format timezone files to extract current and historical zone information. - - :param fileobj: - This can be an opened file stream or a file name that the time zone - information can be read from. - - :param filename: - This is an optional parameter specifying the source of the time zone - information in the event that ``fileobj`` is a file object. If omitted - and ``fileobj`` is a file stream, this parameter will be set either to - ``fileobj``'s ``name`` attribute or to ``repr(fileobj)``. - - See `Sources for Time Zone and Daylight Saving Time Data - `_ for more information. - Time zone files can be compiled from the `IANA Time Zone database files - `_ with the `zic time zone compiler - `_ - - .. note:: - - Only construct a ``tzfile`` directly if you have a specific timezone - file on disk that you want to read into a Python ``tzinfo`` object. - If you want to get a ``tzfile`` representing a specific IANA zone, - (e.g. ``'America/New_York'``), you should call - :func:`dateutil.tz.gettz` with the zone identifier. - - - **Examples:** - - Using the US Eastern time zone as an example, we can see that a ``tzfile`` - provides time zone information for the standard Daylight Saving offsets: - - .. testsetup:: tzfile - - from dateutil.tz import gettz - from datetime import datetime - - .. doctest:: tzfile - - >>> NYC = gettz('America/New_York') - >>> NYC - tzfile('/usr/share/zoneinfo/America/New_York') - - >>> print(datetime(2016, 1, 3, tzinfo=NYC)) # EST - 2016-01-03 00:00:00-05:00 - - >>> print(datetime(2016, 7, 7, tzinfo=NYC)) # EDT - 2016-07-07 00:00:00-04:00 - - - The ``tzfile`` structure contains a fully history of the time zone, - so historical dates will also have the right offsets. For example, before - the adoption of the UTC standards, New York used local solar mean time: - - .. doctest:: tzfile - - >>> print(datetime(1901, 4, 12, tzinfo=NYC)) # LMT - 1901-04-12 00:00:00-04:56 - - And during World War II, New York was on "Eastern War Time", which was a - state of permanent daylight saving time: - - .. doctest:: tzfile - - >>> print(datetime(1944, 2, 7, tzinfo=NYC)) # EWT - 1944-02-07 00:00:00-04:00 - - """ - - def __init__(self, fileobj, filename=None): - super(tzfile, self).__init__() - - file_opened_here = False - if isinstance(fileobj, string_types): - self._filename = fileobj - fileobj = open(fileobj, 'rb') - file_opened_here = True - elif filename is not None: - self._filename = filename - elif hasattr(fileobj, "name"): - self._filename = fileobj.name - else: - self._filename = repr(fileobj) - - if fileobj is not None: - if not file_opened_here: - fileobj = _nullcontext(fileobj) - - with fileobj as file_stream: - tzobj = self._read_tzfile(file_stream) - - self._set_tzdata(tzobj) - - def _set_tzdata(self, tzobj): - """ Set the time zone data of this object from a _tzfile object """ - # Copy the relevant attributes over as private attributes - for attr in _tzfile.attrs: - setattr(self, '_' + attr, getattr(tzobj, attr)) - - def _read_tzfile(self, fileobj): - out = _tzfile() - - # From tzfile(5): - # - # The time zone information files used by tzset(3) - # begin with the magic characters "TZif" to identify - # them as time zone information files, followed by - # sixteen bytes reserved for future use, followed by - # six four-byte values of type long, written in a - # ``standard'' byte order (the high-order byte - # of the value is written first). - if fileobj.read(4).decode() != "TZif": - raise ValueError("magic not found") - - fileobj.read(16) - - ( - # The number of UTC/local indicators stored in the file. - ttisgmtcnt, - - # The number of standard/wall indicators stored in the file. - ttisstdcnt, - - # The number of leap seconds for which data is - # stored in the file. - leapcnt, - - # The number of "transition times" for which data - # is stored in the file. - timecnt, - - # The number of "local time types" for which data - # is stored in the file (must not be zero). - typecnt, - - # The number of characters of "time zone - # abbreviation strings" stored in the file. - charcnt, - - ) = struct.unpack(">6l", fileobj.read(24)) - - # The above header is followed by tzh_timecnt four-byte - # values of type long, sorted in ascending order. - # These values are written in ``standard'' byte order. - # Each is used as a transition time (as returned by - # time(2)) at which the rules for computing local time - # change. - - if timecnt: - out.trans_list_utc = list(struct.unpack(">%dl" % timecnt, - fileobj.read(timecnt*4))) - else: - out.trans_list_utc = [] - - # Next come tzh_timecnt one-byte values of type unsigned - # char; each one tells which of the different types of - # ``local time'' types described in the file is associated - # with the same-indexed transition time. These values - # serve as indices into an array of ttinfo structures that - # appears next in the file. - - if timecnt: - out.trans_idx = struct.unpack(">%dB" % timecnt, - fileobj.read(timecnt)) - else: - out.trans_idx = [] - - # Each ttinfo structure is written as a four-byte value - # for tt_gmtoff of type long, in a standard byte - # order, followed by a one-byte value for tt_isdst - # and a one-byte value for tt_abbrind. In each - # structure, tt_gmtoff gives the number of - # seconds to be added to UTC, tt_isdst tells whether - # tm_isdst should be set by localtime(3), and - # tt_abbrind serves as an index into the array of - # time zone abbreviation characters that follow the - # ttinfo structure(s) in the file. - - ttinfo = [] - - for i in range(typecnt): - ttinfo.append(struct.unpack(">lbb", fileobj.read(6))) - - abbr = fileobj.read(charcnt).decode() - - # Then there are tzh_leapcnt pairs of four-byte - # values, written in standard byte order; the - # first value of each pair gives the time (as - # returned by time(2)) at which a leap second - # occurs; the second gives the total number of - # leap seconds to be applied after the given time. - # The pairs of values are sorted in ascending order - # by time. - - # Not used, for now (but seek for correct file position) - if leapcnt: - fileobj.seek(leapcnt * 8, os.SEEK_CUR) - - # Then there are tzh_ttisstdcnt standard/wall - # indicators, each stored as a one-byte value; - # they tell whether the transition times associated - # with local time types were specified as standard - # time or wall clock time, and are used when - # a time zone file is used in handling POSIX-style - # time zone environment variables. - - if ttisstdcnt: - isstd = struct.unpack(">%db" % ttisstdcnt, - fileobj.read(ttisstdcnt)) - - # Finally, there are tzh_ttisgmtcnt UTC/local - # indicators, each stored as a one-byte value; - # they tell whether the transition times associated - # with local time types were specified as UTC or - # local time, and are used when a time zone file - # is used in handling POSIX-style time zone envi- - # ronment variables. - - if ttisgmtcnt: - isgmt = struct.unpack(">%db" % ttisgmtcnt, - fileobj.read(ttisgmtcnt)) - - # Build ttinfo list - out.ttinfo_list = [] - for i in range(typecnt): - gmtoff, isdst, abbrind = ttinfo[i] - gmtoff = _get_supported_offset(gmtoff) - tti = _ttinfo() - tti.offset = gmtoff - tti.dstoffset = datetime.timedelta(0) - tti.delta = datetime.timedelta(seconds=gmtoff) - tti.isdst = isdst - tti.abbr = abbr[abbrind:abbr.find('\x00', abbrind)] - tti.isstd = (ttisstdcnt > i and isstd[i] != 0) - tti.isgmt = (ttisgmtcnt > i and isgmt[i] != 0) - out.ttinfo_list.append(tti) - - # Replace ttinfo indexes for ttinfo objects. - out.trans_idx = [out.ttinfo_list[idx] for idx in out.trans_idx] - - # Set standard, dst, and before ttinfos. before will be - # used when a given time is before any transitions, - # and will be set to the first non-dst ttinfo, or to - # the first dst, if all of them are dst. - out.ttinfo_std = None - out.ttinfo_dst = None - out.ttinfo_before = None - if out.ttinfo_list: - if not out.trans_list_utc: - out.ttinfo_std = out.ttinfo_first = out.ttinfo_list[0] - else: - for i in range(timecnt-1, -1, -1): - tti = out.trans_idx[i] - if not out.ttinfo_std and not tti.isdst: - out.ttinfo_std = tti - elif not out.ttinfo_dst and tti.isdst: - out.ttinfo_dst = tti - - if out.ttinfo_std and out.ttinfo_dst: - break - else: - if out.ttinfo_dst and not out.ttinfo_std: - out.ttinfo_std = out.ttinfo_dst - - for tti in out.ttinfo_list: - if not tti.isdst: - out.ttinfo_before = tti - break - else: - out.ttinfo_before = out.ttinfo_list[0] - - # Now fix transition times to become relative to wall time. - # - # I'm not sure about this. In my tests, the tz source file - # is setup to wall time, and in the binary file isstd and - # isgmt are off, so it should be in wall time. OTOH, it's - # always in gmt time. Let me know if you have comments - # about this. - lastdst = None - lastoffset = None - lastdstoffset = None - lastbaseoffset = None - out.trans_list = [] - - for i, tti in enumerate(out.trans_idx): - offset = tti.offset - dstoffset = 0 - - if lastdst is not None: - if tti.isdst: - if not lastdst: - dstoffset = offset - lastoffset - - if not dstoffset and lastdstoffset: - dstoffset = lastdstoffset - - tti.dstoffset = datetime.timedelta(seconds=dstoffset) - lastdstoffset = dstoffset - - # If a time zone changes its base offset during a DST transition, - # then you need to adjust by the previous base offset to get the - # transition time in local time. Otherwise you use the current - # base offset. Ideally, I would have some mathematical proof of - # why this is true, but I haven't really thought about it enough. - baseoffset = offset - dstoffset - adjustment = baseoffset - if (lastbaseoffset is not None and baseoffset != lastbaseoffset - and tti.isdst != lastdst): - # The base DST has changed - adjustment = lastbaseoffset - - lastdst = tti.isdst - lastoffset = offset - lastbaseoffset = baseoffset - - out.trans_list.append(out.trans_list_utc[i] + adjustment) - - out.trans_idx = tuple(out.trans_idx) - out.trans_list = tuple(out.trans_list) - out.trans_list_utc = tuple(out.trans_list_utc) - - return out - - def _find_last_transition(self, dt, in_utc=False): - # If there's no list, there are no transitions to find - if not self._trans_list: - return None - - timestamp = _datetime_to_timestamp(dt) - - # Find where the timestamp fits in the transition list - if the - # timestamp is a transition time, it's part of the "after" period. - trans_list = self._trans_list_utc if in_utc else self._trans_list - idx = bisect.bisect_right(trans_list, timestamp) - - # We want to know when the previous transition was, so subtract off 1 - return idx - 1 - - def _get_ttinfo(self, idx): - # For no list or after the last transition, default to _ttinfo_std - if idx is None or (idx + 1) >= len(self._trans_list): - return self._ttinfo_std - - # If there is a list and the time is before it, return _ttinfo_before - if idx < 0: - return self._ttinfo_before - - return self._trans_idx[idx] - - def _find_ttinfo(self, dt): - idx = self._resolve_ambiguous_time(dt) - - return self._get_ttinfo(idx) - - def fromutc(self, dt): - """ - The ``tzfile`` implementation of :py:func:`datetime.tzinfo.fromutc`. - - :param dt: - A :py:class:`datetime.datetime` object. - - :raises TypeError: - Raised if ``dt`` is not a :py:class:`datetime.datetime` object. - - :raises ValueError: - Raised if this is called with a ``dt`` which does not have this - ``tzinfo`` attached. - - :return: - Returns a :py:class:`datetime.datetime` object representing the - wall time in ``self``'s time zone. - """ - # These isinstance checks are in datetime.tzinfo, so we'll preserve - # them, even if we don't care about duck typing. - if not isinstance(dt, datetime.datetime): - raise TypeError("fromutc() requires a datetime argument") - - if dt.tzinfo is not self: - raise ValueError("dt.tzinfo is not self") - - # First treat UTC as wall time and get the transition we're in. - idx = self._find_last_transition(dt, in_utc=True) - tti = self._get_ttinfo(idx) - - dt_out = dt + datetime.timedelta(seconds=tti.offset) - - fold = self.is_ambiguous(dt_out, idx=idx) - - return enfold(dt_out, fold=int(fold)) - - def is_ambiguous(self, dt, idx=None): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - if idx is None: - idx = self._find_last_transition(dt) - - # Calculate the difference in offsets from current to previous - timestamp = _datetime_to_timestamp(dt) - tti = self._get_ttinfo(idx) - - if idx is None or idx <= 0: - return False - - od = self._get_ttinfo(idx - 1).offset - tti.offset - tt = self._trans_list[idx] # Transition time - - return timestamp < tt + od - - def _resolve_ambiguous_time(self, dt): - idx = self._find_last_transition(dt) - - # If we have no transitions, return the index - _fold = self._fold(dt) - if idx is None or idx == 0: - return idx - - # If it's ambiguous and we're in a fold, shift to a different index. - idx_offset = int(not _fold and self.is_ambiguous(dt, idx)) - - return idx - idx_offset - - def utcoffset(self, dt): - if dt is None: - return None - - if not self._ttinfo_std: - return ZERO - - return self._find_ttinfo(dt).delta - - def dst(self, dt): - if dt is None: - return None - - if not self._ttinfo_dst: - return ZERO - - tti = self._find_ttinfo(dt) - - if not tti.isdst: - return ZERO - - # The documentation says that utcoffset()-dst() must - # be constant for every dt. - return tti.dstoffset - - @tzname_in_python2 - def tzname(self, dt): - if not self._ttinfo_std or dt is None: - return None - return self._find_ttinfo(dt).abbr - - def __eq__(self, other): - if not isinstance(other, tzfile): - return NotImplemented - return (self._trans_list == other._trans_list and - self._trans_idx == other._trans_idx and - self._ttinfo_list == other._ttinfo_list) - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, repr(self._filename)) - - def __reduce__(self): - return self.__reduce_ex__(None) - - def __reduce_ex__(self, protocol): - return (self.__class__, (None, self._filename), self.__dict__) - - -class tzrange(tzrangebase): - """ - The ``tzrange`` object is a time zone specified by a set of offsets and - abbreviations, equivalent to the way the ``TZ`` variable can be specified - in POSIX-like systems, but using Python delta objects to specify DST - start, end and offsets. - - :param stdabbr: - The abbreviation for standard time (e.g. ``'EST'``). - - :param stdoffset: - An integer or :class:`datetime.timedelta` object or equivalent - specifying the base offset from UTC. - - If unspecified, +00:00 is used. - - :param dstabbr: - The abbreviation for DST / "Summer" time (e.g. ``'EDT'``). - - If specified, with no other DST information, DST is assumed to occur - and the default behavior or ``dstoffset``, ``start`` and ``end`` is - used. If unspecified and no other DST information is specified, it - is assumed that this zone has no DST. - - If this is unspecified and other DST information is *is* specified, - DST occurs in the zone but the time zone abbreviation is left - unchanged. - - :param dstoffset: - A an integer or :class:`datetime.timedelta` object or equivalent - specifying the UTC offset during DST. If unspecified and any other DST - information is specified, it is assumed to be the STD offset +1 hour. - - :param start: - A :class:`relativedelta.relativedelta` object or equivalent specifying - the time and time of year that daylight savings time starts. To - specify, for example, that DST starts at 2AM on the 2nd Sunday in - March, pass: - - ``relativedelta(hours=2, month=3, day=1, weekday=SU(+2))`` - - If unspecified and any other DST information is specified, the default - value is 2 AM on the first Sunday in April. - - :param end: - A :class:`relativedelta.relativedelta` object or equivalent - representing the time and time of year that daylight savings time - ends, with the same specification method as in ``start``. One note is - that this should point to the first time in the *standard* zone, so if - a transition occurs at 2AM in the DST zone and the clocks are set back - 1 hour to 1AM, set the ``hours`` parameter to +1. - - - **Examples:** - - .. testsetup:: tzrange - - from dateutil.tz import tzrange, tzstr - - .. doctest:: tzrange - - >>> tzstr('EST5EDT') == tzrange("EST", -18000, "EDT") - True - - >>> from dateutil.relativedelta import * - >>> range1 = tzrange("EST", -18000, "EDT") - >>> range2 = tzrange("EST", -18000, "EDT", -14400, - ... relativedelta(hours=+2, month=4, day=1, - ... weekday=SU(+1)), - ... relativedelta(hours=+1, month=10, day=31, - ... weekday=SU(-1))) - >>> tzstr('EST5EDT') == range1 == range2 - True - - """ - def __init__(self, stdabbr, stdoffset=None, - dstabbr=None, dstoffset=None, - start=None, end=None): - - global relativedelta - from dateutil import relativedelta - - self._std_abbr = stdabbr - self._dst_abbr = dstabbr - - try: - stdoffset = stdoffset.total_seconds() - except (TypeError, AttributeError): - pass - - try: - dstoffset = dstoffset.total_seconds() - except (TypeError, AttributeError): - pass - - if stdoffset is not None: - self._std_offset = datetime.timedelta(seconds=stdoffset) - else: - self._std_offset = ZERO - - if dstoffset is not None: - self._dst_offset = datetime.timedelta(seconds=dstoffset) - elif dstabbr and stdoffset is not None: - self._dst_offset = self._std_offset + datetime.timedelta(hours=+1) - else: - self._dst_offset = ZERO - - if dstabbr and start is None: - self._start_delta = relativedelta.relativedelta( - hours=+2, month=4, day=1, weekday=relativedelta.SU(+1)) - else: - self._start_delta = start - - if dstabbr and end is None: - self._end_delta = relativedelta.relativedelta( - hours=+1, month=10, day=31, weekday=relativedelta.SU(-1)) - else: - self._end_delta = end - - self._dst_base_offset_ = self._dst_offset - self._std_offset - self.hasdst = bool(self._start_delta) - - def transitions(self, year): - """ - For a given year, get the DST on and off transition times, expressed - always on the standard time side. For zones with no transitions, this - function returns ``None``. - - :param year: - The year whose transitions you would like to query. - - :return: - Returns a :class:`tuple` of :class:`datetime.datetime` objects, - ``(dston, dstoff)`` for zones with an annual DST transition, or - ``None`` for fixed offset zones. - """ - if not self.hasdst: - return None - - base_year = datetime.datetime(year, 1, 1) - - start = base_year + self._start_delta - end = base_year + self._end_delta - - return (start, end) - - def __eq__(self, other): - if not isinstance(other, tzrange): - return NotImplemented - - return (self._std_abbr == other._std_abbr and - self._dst_abbr == other._dst_abbr and - self._std_offset == other._std_offset and - self._dst_offset == other._dst_offset and - self._start_delta == other._start_delta and - self._end_delta == other._end_delta) - - @property - def _dst_base_offset(self): - return self._dst_base_offset_ - - -@six.add_metaclass(_TzStrFactory) -class tzstr(tzrange): - """ - ``tzstr`` objects are time zone objects specified by a time-zone string as - it would be passed to a ``TZ`` variable on POSIX-style systems (see - the `GNU C Library: TZ Variable`_ for more details). - - There is one notable exception, which is that POSIX-style time zones use an - inverted offset format, so normally ``GMT+3`` would be parsed as an offset - 3 hours *behind* GMT. The ``tzstr`` time zone object will parse this as an - offset 3 hours *ahead* of GMT. If you would like to maintain the POSIX - behavior, pass a ``True`` value to ``posix_offset``. - - The :class:`tzrange` object provides the same functionality, but is - specified using :class:`relativedelta.relativedelta` objects. rather than - strings. - - :param s: - A time zone string in ``TZ`` variable format. This can be a - :class:`bytes` (2.x: :class:`str`), :class:`str` (2.x: - :class:`unicode`) or a stream emitting unicode characters - (e.g. :class:`StringIO`). - - :param posix_offset: - Optional. If set to ``True``, interpret strings such as ``GMT+3`` or - ``UTC+3`` as being 3 hours *behind* UTC rather than ahead, per the - POSIX standard. - - .. caution:: - - Prior to version 2.7.0, this function also supported time zones - in the format: - - * ``EST5EDT,4,0,6,7200,10,0,26,7200,3600`` - * ``EST5EDT,4,1,0,7200,10,-1,0,7200,3600`` - - This format is non-standard and has been deprecated; this function - will raise a :class:`DeprecatedTZFormatWarning` until - support is removed in a future version. - - .. _`GNU C Library: TZ Variable`: - https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html - """ - def __init__(self, s, posix_offset=False): - global parser - from dateutil.parser import _parser as parser - - self._s = s - - res = parser._parsetz(s) - if res is None or res.any_unused_tokens: - raise ValueError("unknown string format") - - # Here we break the compatibility with the TZ variable handling. - # GMT-3 actually *means* the timezone -3. - if res.stdabbr in ("GMT", "UTC") and not posix_offset: - res.stdoffset *= -1 - - # We must initialize it first, since _delta() needs - # _std_offset and _dst_offset set. Use False in start/end - # to avoid building it two times. - tzrange.__init__(self, res.stdabbr, res.stdoffset, - res.dstabbr, res.dstoffset, - start=False, end=False) - - if not res.dstabbr: - self._start_delta = None - self._end_delta = None - else: - self._start_delta = self._delta(res.start) - if self._start_delta: - self._end_delta = self._delta(res.end, isend=1) - - self.hasdst = bool(self._start_delta) - - def _delta(self, x, isend=0): - from dateutil import relativedelta - kwargs = {} - if x.month is not None: - kwargs["month"] = x.month - if x.weekday is not None: - kwargs["weekday"] = relativedelta.weekday(x.weekday, x.week) - if x.week > 0: - kwargs["day"] = 1 - else: - kwargs["day"] = 31 - elif x.day: - kwargs["day"] = x.day - elif x.yday is not None: - kwargs["yearday"] = x.yday - elif x.jyday is not None: - kwargs["nlyearday"] = x.jyday - if not kwargs: - # Default is to start on first sunday of april, and end - # on last sunday of october. - if not isend: - kwargs["month"] = 4 - kwargs["day"] = 1 - kwargs["weekday"] = relativedelta.SU(+1) - else: - kwargs["month"] = 10 - kwargs["day"] = 31 - kwargs["weekday"] = relativedelta.SU(-1) - if x.time is not None: - kwargs["seconds"] = x.time - else: - # Default is 2AM. - kwargs["seconds"] = 7200 - if isend: - # Convert to standard time, to follow the documented way - # of working with the extra hour. See the documentation - # of the tzinfo class. - delta = self._dst_offset - self._std_offset - kwargs["seconds"] -= delta.seconds + delta.days * 86400 - return relativedelta.relativedelta(**kwargs) - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, repr(self._s)) - - -class _tzicalvtzcomp(object): - def __init__(self, tzoffsetfrom, tzoffsetto, isdst, - tzname=None, rrule=None): - self.tzoffsetfrom = datetime.timedelta(seconds=tzoffsetfrom) - self.tzoffsetto = datetime.timedelta(seconds=tzoffsetto) - self.tzoffsetdiff = self.tzoffsetto - self.tzoffsetfrom - self.isdst = isdst - self.tzname = tzname - self.rrule = rrule - - -class _tzicalvtz(_tzinfo): - def __init__(self, tzid, comps=[]): - super(_tzicalvtz, self).__init__() - - self._tzid = tzid - self._comps = comps - self._cachedate = [] - self._cachecomp = [] - self._cache_lock = _thread.allocate_lock() - - def _find_comp(self, dt): - if len(self._comps) == 1: - return self._comps[0] - - dt = dt.replace(tzinfo=None) - - try: - with self._cache_lock: - return self._cachecomp[self._cachedate.index( - (dt, self._fold(dt)))] - except ValueError: - pass - - lastcompdt = None - lastcomp = None - - for comp in self._comps: - compdt = self._find_compdt(comp, dt) - - if compdt and (not lastcompdt or lastcompdt < compdt): - lastcompdt = compdt - lastcomp = comp - - if not lastcomp: - # RFC says nothing about what to do when a given - # time is before the first onset date. We'll look for the - # first standard component, or the first component, if - # none is found. - for comp in self._comps: - if not comp.isdst: - lastcomp = comp - break - else: - lastcomp = comp[0] - - with self._cache_lock: - self._cachedate.insert(0, (dt, self._fold(dt))) - self._cachecomp.insert(0, lastcomp) - - if len(self._cachedate) > 10: - self._cachedate.pop() - self._cachecomp.pop() - - return lastcomp - - def _find_compdt(self, comp, dt): - if comp.tzoffsetdiff < ZERO and self._fold(dt): - dt -= comp.tzoffsetdiff - - compdt = comp.rrule.before(dt, inc=True) - - return compdt - - def utcoffset(self, dt): - if dt is None: - return None - - return self._find_comp(dt).tzoffsetto - - def dst(self, dt): - comp = self._find_comp(dt) - if comp.isdst: - return comp.tzoffsetdiff - else: - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return self._find_comp(dt).tzname - - def __repr__(self): - return "" % repr(self._tzid) - - __reduce__ = object.__reduce__ - - -class tzical(object): - """ - This object is designed to parse an iCalendar-style ``VTIMEZONE`` structure - as set out in `RFC 5545`_ Section 4.6.5 into one or more `tzinfo` objects. - - :param `fileobj`: - A file or stream in iCalendar format, which should be UTF-8 encoded - with CRLF endings. - - .. _`RFC 5545`: https://tools.ietf.org/html/rfc5545 - """ - def __init__(self, fileobj): - global rrule - from dateutil import rrule - - if isinstance(fileobj, string_types): - self._s = fileobj - # ical should be encoded in UTF-8 with CRLF - fileobj = open(fileobj, 'r') - else: - self._s = getattr(fileobj, 'name', repr(fileobj)) - fileobj = _nullcontext(fileobj) - - self._vtz = {} - - with fileobj as fobj: - self._parse_rfc(fobj.read()) - - def keys(self): - """ - Retrieves the available time zones as a list. - """ - return list(self._vtz.keys()) - - def get(self, tzid=None): - """ - Retrieve a :py:class:`datetime.tzinfo` object by its ``tzid``. - - :param tzid: - If there is exactly one time zone available, omitting ``tzid`` - or passing :py:const:`None` value returns it. Otherwise a valid - key (which can be retrieved from :func:`keys`) is required. - - :raises ValueError: - Raised if ``tzid`` is not specified but there are either more - or fewer than 1 zone defined. - - :returns: - Returns either a :py:class:`datetime.tzinfo` object representing - the relevant time zone or :py:const:`None` if the ``tzid`` was - not found. - """ - if tzid is None: - if len(self._vtz) == 0: - raise ValueError("no timezones defined") - elif len(self._vtz) > 1: - raise ValueError("more than one timezone available") - tzid = next(iter(self._vtz)) - - return self._vtz.get(tzid) - - def _parse_offset(self, s): - s = s.strip() - if not s: - raise ValueError("empty offset") - if s[0] in ('+', '-'): - signal = (-1, +1)[s[0] == '+'] - s = s[1:] - else: - signal = +1 - if len(s) == 4: - return (int(s[:2]) * 3600 + int(s[2:]) * 60) * signal - elif len(s) == 6: - return (int(s[:2]) * 3600 + int(s[2:4]) * 60 + int(s[4:])) * signal - else: - raise ValueError("invalid offset: " + s) - - def _parse_rfc(self, s): - lines = s.splitlines() - if not lines: - raise ValueError("empty string") - - # Unfold - i = 0 - while i < len(lines): - line = lines[i].rstrip() - if not line: - del lines[i] - elif i > 0 and line[0] == " ": - lines[i-1] += line[1:] - del lines[i] - else: - i += 1 - - tzid = None - comps = [] - invtz = False - comptype = None - for line in lines: - if not line: - continue - name, value = line.split(':', 1) - parms = name.split(';') - if not parms: - raise ValueError("empty property name") - name = parms[0].upper() - parms = parms[1:] - if invtz: - if name == "BEGIN": - if value in ("STANDARD", "DAYLIGHT"): - # Process component - pass - else: - raise ValueError("unknown component: "+value) - comptype = value - founddtstart = False - tzoffsetfrom = None - tzoffsetto = None - rrulelines = [] - tzname = None - elif name == "END": - if value == "VTIMEZONE": - if comptype: - raise ValueError("component not closed: "+comptype) - if not tzid: - raise ValueError("mandatory TZID not found") - if not comps: - raise ValueError( - "at least one component is needed") - # Process vtimezone - self._vtz[tzid] = _tzicalvtz(tzid, comps) - invtz = False - elif value == comptype: - if not founddtstart: - raise ValueError("mandatory DTSTART not found") - if tzoffsetfrom is None: - raise ValueError( - "mandatory TZOFFSETFROM not found") - if tzoffsetto is None: - raise ValueError( - "mandatory TZOFFSETFROM not found") - # Process component - rr = None - if rrulelines: - rr = rrule.rrulestr("\n".join(rrulelines), - compatible=True, - ignoretz=True, - cache=True) - comp = _tzicalvtzcomp(tzoffsetfrom, tzoffsetto, - (comptype == "DAYLIGHT"), - tzname, rr) - comps.append(comp) - comptype = None - else: - raise ValueError("invalid component end: "+value) - elif comptype: - if name == "DTSTART": - # DTSTART in VTIMEZONE takes a subset of valid RRULE - # values under RFC 5545. - for parm in parms: - if parm != 'VALUE=DATE-TIME': - msg = ('Unsupported DTSTART param in ' + - 'VTIMEZONE: ' + parm) - raise ValueError(msg) - rrulelines.append(line) - founddtstart = True - elif name in ("RRULE", "RDATE", "EXRULE", "EXDATE"): - rrulelines.append(line) - elif name == "TZOFFSETFROM": - if parms: - raise ValueError( - "unsupported %s parm: %s " % (name, parms[0])) - tzoffsetfrom = self._parse_offset(value) - elif name == "TZOFFSETTO": - if parms: - raise ValueError( - "unsupported TZOFFSETTO parm: "+parms[0]) - tzoffsetto = self._parse_offset(value) - elif name == "TZNAME": - if parms: - raise ValueError( - "unsupported TZNAME parm: "+parms[0]) - tzname = value - elif name == "COMMENT": - pass - else: - raise ValueError("unsupported property: "+name) - else: - if name == "TZID": - if parms: - raise ValueError( - "unsupported TZID parm: "+parms[0]) - tzid = value - elif name in ("TZURL", "LAST-MODIFIED", "COMMENT"): - pass - else: - raise ValueError("unsupported property: "+name) - elif name == "BEGIN" and value == "VTIMEZONE": - tzid = None - comps = [] - invtz = True - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, repr(self._s)) - - -if sys.platform != "win32": - TZFILES = ["/etc/localtime", "localtime"] - TZPATHS = ["/usr/share/zoneinfo", - "/usr/lib/zoneinfo", - "/usr/share/lib/zoneinfo", - "/etc/zoneinfo"] -else: - TZFILES = [] - TZPATHS = [] - - -def __get_gettz(): - tzlocal_classes = (tzlocal,) - if tzwinlocal is not None: - tzlocal_classes += (tzwinlocal,) - - class GettzFunc(object): - """ - Retrieve a time zone object from a string representation - - This function is intended to retrieve the :py:class:`tzinfo` subclass - that best represents the time zone that would be used if a POSIX - `TZ variable`_ were set to the same value. - - If no argument or an empty string is passed to ``gettz``, local time - is returned: - - .. code-block:: python3 - - >>> gettz() - tzfile('/etc/localtime') - - This function is also the preferred way to map IANA tz database keys - to :class:`tzfile` objects: - - .. code-block:: python3 - - >>> gettz('Pacific/Kiritimati') - tzfile('/usr/share/zoneinfo/Pacific/Kiritimati') - - On Windows, the standard is extended to include the Windows-specific - zone names provided by the operating system: - - .. code-block:: python3 - - >>> gettz('Egypt Standard Time') - tzwin('Egypt Standard Time') - - Passing a GNU ``TZ`` style string time zone specification returns a - :class:`tzstr` object: - - .. code-block:: python3 - - >>> gettz('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3') - tzstr('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3') - - :param name: - A time zone name (IANA, or, on Windows, Windows keys), location of - a ``tzfile(5)`` zoneinfo file or ``TZ`` variable style time zone - specifier. An empty string, no argument or ``None`` is interpreted - as local time. - - :return: - Returns an instance of one of ``dateutil``'s :py:class:`tzinfo` - subclasses. - - .. versionchanged:: 2.7.0 - - After version 2.7.0, any two calls to ``gettz`` using the same - input strings will return the same object: - - .. code-block:: python3 - - >>> tz.gettz('America/Chicago') is tz.gettz('America/Chicago') - True - - In addition to improving performance, this ensures that - `"same zone" semantics`_ are used for datetimes in the same zone. - - - .. _`TZ variable`: - https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html - - .. _`"same zone" semantics`: - https://blog.ganssle.io/articles/2018/02/aware-datetime-arithmetic.html - """ - def __init__(self): - - self.__instances = weakref.WeakValueDictionary() - self.__strong_cache_size = 8 - self.__strong_cache = OrderedDict() - self._cache_lock = _thread.allocate_lock() - - def __call__(self, name=None): - with self._cache_lock: - rv = self.__instances.get(name, None) - - if rv is None: - rv = self.nocache(name=name) - if not (name is None - or isinstance(rv, tzlocal_classes) - or rv is None): - # tzlocal is slightly more complicated than the other - # time zone providers because it depends on environment - # at construction time, so don't cache that. - # - # We also cannot store weak references to None, so we - # will also not store that. - self.__instances[name] = rv - else: - # No need for strong caching, return immediately - return rv - - self.__strong_cache[name] = self.__strong_cache.pop(name, rv) - - if len(self.__strong_cache) > self.__strong_cache_size: - self.__strong_cache.popitem(last=False) - - return rv - - def set_cache_size(self, size): - with self._cache_lock: - self.__strong_cache_size = size - while len(self.__strong_cache) > size: - self.__strong_cache.popitem(last=False) - - def cache_clear(self): - with self._cache_lock: - self.__instances = weakref.WeakValueDictionary() - self.__strong_cache.clear() - - @staticmethod - def nocache(name=None): - """A non-cached version of gettz""" - tz = None - if not name: - try: - name = os.environ["TZ"] - except KeyError: - pass - if name is None or name in ("", ":"): - for filepath in TZFILES: - if not os.path.isabs(filepath): - filename = filepath - for path in TZPATHS: - filepath = os.path.join(path, filename) - if os.path.isfile(filepath): - break - else: - continue - if os.path.isfile(filepath): - try: - tz = tzfile(filepath) - break - except (IOError, OSError, ValueError): - pass - else: - tz = tzlocal() - else: - try: - if name.startswith(":"): - name = name[1:] - except TypeError as e: - if isinstance(name, bytes): - new_msg = "gettz argument should be str, not bytes" - six.raise_from(TypeError(new_msg), e) - else: - raise - if os.path.isabs(name): - if os.path.isfile(name): - tz = tzfile(name) - else: - tz = None - else: - for path in TZPATHS: - filepath = os.path.join(path, name) - if not os.path.isfile(filepath): - filepath = filepath.replace(' ', '_') - if not os.path.isfile(filepath): - continue - try: - tz = tzfile(filepath) - break - except (IOError, OSError, ValueError): - pass - else: - tz = None - if tzwin is not None: - try: - tz = tzwin(name) - except (WindowsError, UnicodeEncodeError): - # UnicodeEncodeError is for Python 2.7 compat - tz = None - - if not tz: - from dateutil.zoneinfo import get_zonefile_instance - tz = get_zonefile_instance().get(name) - - if not tz: - for c in name: - # name is not a tzstr unless it has at least - # one offset. For short values of "name", an - # explicit for loop seems to be the fastest way - # To determine if a string contains a digit - if c in "0123456789": - try: - tz = tzstr(name) - except ValueError: - pass - break - else: - if name in ("GMT", "UTC"): - tz = UTC - elif name in time.tzname: - tz = tzlocal() - return tz - - return GettzFunc() - - -gettz = __get_gettz() -del __get_gettz - - -def datetime_exists(dt, tz=None): - """ - Given a datetime and a time zone, determine whether or not a given datetime - would fall in a gap. - - :param dt: - A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` - is provided.) - - :param tz: - A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If - ``None`` or not provided, the datetime's own time zone will be used. - - :return: - Returns a boolean value whether or not the "wall time" exists in - ``tz``. - - .. versionadded:: 2.7.0 - """ - if tz is None: - if dt.tzinfo is None: - raise ValueError('Datetime is naive and no time zone provided.') - tz = dt.tzinfo - - dt = dt.replace(tzinfo=None) - - # This is essentially a test of whether or not the datetime can survive - # a round trip to UTC. - dt_rt = dt.replace(tzinfo=tz).astimezone(UTC).astimezone(tz) - dt_rt = dt_rt.replace(tzinfo=None) - - return dt == dt_rt - - -def datetime_ambiguous(dt, tz=None): - """ - Given a datetime and a time zone, determine whether or not a given datetime - is ambiguous (i.e if there are two times differentiated only by their DST - status). - - :param dt: - A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` - is provided.) - - :param tz: - A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If - ``None`` or not provided, the datetime's own time zone will be used. - - :return: - Returns a boolean value whether or not the "wall time" is ambiguous in - ``tz``. - - .. versionadded:: 2.6.0 - """ - if tz is None: - if dt.tzinfo is None: - raise ValueError('Datetime is naive and no time zone provided.') - - tz = dt.tzinfo - - # If a time zone defines its own "is_ambiguous" function, we'll use that. - is_ambiguous_fn = getattr(tz, 'is_ambiguous', None) - if is_ambiguous_fn is not None: - try: - return tz.is_ambiguous(dt) - except Exception: - pass - - # If it doesn't come out and tell us it's ambiguous, we'll just check if - # the fold attribute has any effect on this particular date and time. - dt = dt.replace(tzinfo=tz) - wall_0 = enfold(dt, fold=0) - wall_1 = enfold(dt, fold=1) - - same_offset = wall_0.utcoffset() == wall_1.utcoffset() - same_dst = wall_0.dst() == wall_1.dst() - - return not (same_offset and same_dst) - - -def resolve_imaginary(dt): - """ - Given a datetime that may be imaginary, return an existing datetime. - - This function assumes that an imaginary datetime represents what the - wall time would be in a zone had the offset transition not occurred, so - it will always fall forward by the transition's change in offset. - - .. doctest:: - - >>> from dateutil import tz - >>> from datetime import datetime - >>> NYC = tz.gettz('America/New_York') - >>> print(tz.resolve_imaginary(datetime(2017, 3, 12, 2, 30, tzinfo=NYC))) - 2017-03-12 03:30:00-04:00 - - >>> KIR = tz.gettz('Pacific/Kiritimati') - >>> print(tz.resolve_imaginary(datetime(1995, 1, 1, 12, 30, tzinfo=KIR))) - 1995-01-02 12:30:00+14:00 - - As a note, :func:`datetime.astimezone` is guaranteed to produce a valid, - existing datetime, so a round-trip to and from UTC is sufficient to get - an extant datetime, however, this generally "falls back" to an earlier time - rather than falling forward to the STD side (though no guarantees are made - about this behavior). - - :param dt: - A :class:`datetime.datetime` which may or may not exist. - - :return: - Returns an existing :class:`datetime.datetime`. If ``dt`` was not - imaginary, the datetime returned is guaranteed to be the same object - passed to the function. - - .. versionadded:: 2.7.0 - """ - if dt.tzinfo is not None and not datetime_exists(dt): - - curr_offset = (dt + datetime.timedelta(hours=24)).utcoffset() - old_offset = (dt - datetime.timedelta(hours=24)).utcoffset() - - dt += curr_offset - old_offset - - return dt - - -def _datetime_to_timestamp(dt): - """ - Convert a :class:`datetime.datetime` object to an epoch timestamp in - seconds since January 1, 1970, ignoring the time zone. - """ - return (dt.replace(tzinfo=None) - EPOCH).total_seconds() - - -if sys.version_info >= (3, 6): - def _get_supported_offset(second_offset): - return second_offset -else: - def _get_supported_offset(second_offset): - # For python pre-3.6, round to full-minutes if that's not the case. - # Python's datetime doesn't accept sub-minute timezones. Check - # http://python.org/sf/1447945 or https://bugs.python.org/issue5288 - # for some information. - old_offset = second_offset - calculated_offset = 60 * ((second_offset + 30) // 60) - return calculated_offset - - -try: - # Python 3.7 feature - from contextlib import nullcontext as _nullcontext -except ImportError: - class _nullcontext(object): - """ - Class for wrapping contexts so that they are passed through in a - with statement. - """ - def __init__(self, context): - self.context = context - - def __enter__(self): - return self.context - - def __exit__(*args, **kwargs): - pass - -# vim:ts=4:sw=4:et diff --git a/.venv/Lib/site-packages/dateutil/tz/win.py b/.venv/Lib/site-packages/dateutil/tz/win.py deleted file mode 100644 index cde07ba..0000000 --- a/.venv/Lib/site-packages/dateutil/tz/win.py +++ /dev/null @@ -1,370 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module provides an interface to the native time zone data on Windows, -including :py:class:`datetime.tzinfo` implementations. - -Attempting to import this module on a non-Windows platform will raise an -:py:obj:`ImportError`. -""" -# This code was originally contributed by Jeffrey Harris. -import datetime -import struct - -from six.moves import winreg -from six import text_type - -try: - import ctypes - from ctypes import wintypes -except ValueError: - # ValueError is raised on non-Windows systems for some horrible reason. - raise ImportError("Running tzwin on non-Windows system") - -from ._common import tzrangebase - -__all__ = ["tzwin", "tzwinlocal", "tzres"] - -ONEWEEK = datetime.timedelta(7) - -TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" -TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones" -TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" - - -def _settzkeyname(): - handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) - try: - winreg.OpenKey(handle, TZKEYNAMENT).Close() - TZKEYNAME = TZKEYNAMENT - except WindowsError: - TZKEYNAME = TZKEYNAME9X - handle.Close() - return TZKEYNAME - - -TZKEYNAME = _settzkeyname() - - -class tzres(object): - """ - Class for accessing ``tzres.dll``, which contains timezone name related - resources. - - .. versionadded:: 2.5.0 - """ - p_wchar = ctypes.POINTER(wintypes.WCHAR) # Pointer to a wide char - - def __init__(self, tzres_loc='tzres.dll'): - # Load the user32 DLL so we can load strings from tzres - user32 = ctypes.WinDLL('user32') - - # Specify the LoadStringW function - user32.LoadStringW.argtypes = (wintypes.HINSTANCE, - wintypes.UINT, - wintypes.LPWSTR, - ctypes.c_int) - - self.LoadStringW = user32.LoadStringW - self._tzres = ctypes.WinDLL(tzres_loc) - self.tzres_loc = tzres_loc - - def load_name(self, offset): - """ - Load a timezone name from a DLL offset (integer). - - >>> from dateutil.tzwin import tzres - >>> tzr = tzres() - >>> print(tzr.load_name(112)) - 'Eastern Standard Time' - - :param offset: - A positive integer value referring to a string from the tzres dll. - - .. note:: - - Offsets found in the registry are generally of the form - ``@tzres.dll,-114``. The offset in this case is 114, not -114. - - """ - resource = self.p_wchar() - lpBuffer = ctypes.cast(ctypes.byref(resource), wintypes.LPWSTR) - nchar = self.LoadStringW(self._tzres._handle, offset, lpBuffer, 0) - return resource[:nchar] - - def name_from_string(self, tzname_str): - """ - Parse strings as returned from the Windows registry into the time zone - name as defined in the registry. - - >>> from dateutil.tzwin import tzres - >>> tzr = tzres() - >>> print(tzr.name_from_string('@tzres.dll,-251')) - 'Dateline Daylight Time' - >>> print(tzr.name_from_string('Eastern Standard Time')) - 'Eastern Standard Time' - - :param tzname_str: - A timezone name string as returned from a Windows registry key. - - :return: - Returns the localized timezone string from tzres.dll if the string - is of the form `@tzres.dll,-offset`, else returns the input string. - """ - if not tzname_str.startswith('@'): - return tzname_str - - name_splt = tzname_str.split(',-') - try: - offset = int(name_splt[1]) - except: - raise ValueError("Malformed timezone string.") - - return self.load_name(offset) - - -class tzwinbase(tzrangebase): - """tzinfo class based on win32's timezones available in the registry.""" - def __init__(self): - raise NotImplementedError('tzwinbase is an abstract base class') - - def __eq__(self, other): - # Compare on all relevant dimensions, including name. - if not isinstance(other, tzwinbase): - return NotImplemented - - return (self._std_offset == other._std_offset and - self._dst_offset == other._dst_offset and - self._stddayofweek == other._stddayofweek and - self._dstdayofweek == other._dstdayofweek and - self._stdweeknumber == other._stdweeknumber and - self._dstweeknumber == other._dstweeknumber and - self._stdhour == other._stdhour and - self._dsthour == other._dsthour and - self._stdminute == other._stdminute and - self._dstminute == other._dstminute and - self._std_abbr == other._std_abbr and - self._dst_abbr == other._dst_abbr) - - @staticmethod - def list(): - """Return a list of all time zones known to the system.""" - with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: - with winreg.OpenKey(handle, TZKEYNAME) as tzkey: - result = [winreg.EnumKey(tzkey, i) - for i in range(winreg.QueryInfoKey(tzkey)[0])] - return result - - def display(self): - """ - Return the display name of the time zone. - """ - return self._display - - def transitions(self, year): - """ - For a given year, get the DST on and off transition times, expressed - always on the standard time side. For zones with no transitions, this - function returns ``None``. - - :param year: - The year whose transitions you would like to query. - - :return: - Returns a :class:`tuple` of :class:`datetime.datetime` objects, - ``(dston, dstoff)`` for zones with an annual DST transition, or - ``None`` for fixed offset zones. - """ - - if not self.hasdst: - return None - - dston = picknthweekday(year, self._dstmonth, self._dstdayofweek, - self._dsthour, self._dstminute, - self._dstweeknumber) - - dstoff = picknthweekday(year, self._stdmonth, self._stddayofweek, - self._stdhour, self._stdminute, - self._stdweeknumber) - - # Ambiguous dates default to the STD side - dstoff -= self._dst_base_offset - - return dston, dstoff - - def _get_hasdst(self): - return self._dstmonth != 0 - - @property - def _dst_base_offset(self): - return self._dst_base_offset_ - - -class tzwin(tzwinbase): - """ - Time zone object created from the zone info in the Windows registry - - These are similar to :py:class:`dateutil.tz.tzrange` objects in that - the time zone data is provided in the format of a single offset rule - for either 0 or 2 time zone transitions per year. - - :param: name - The name of a Windows time zone key, e.g. "Eastern Standard Time". - The full list of keys can be retrieved with :func:`tzwin.list`. - """ - - def __init__(self, name): - self._name = name - - with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: - tzkeyname = text_type("{kn}\\{name}").format(kn=TZKEYNAME, name=name) - with winreg.OpenKey(handle, tzkeyname) as tzkey: - keydict = valuestodict(tzkey) - - self._std_abbr = keydict["Std"] - self._dst_abbr = keydict["Dlt"] - - self._display = keydict["Display"] - - # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm - tup = struct.unpack("=3l16h", keydict["TZI"]) - stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1 - dstoffset = stdoffset-tup[2] # + DaylightBias * -1 - self._std_offset = datetime.timedelta(minutes=stdoffset) - self._dst_offset = datetime.timedelta(minutes=dstoffset) - - # for the meaning see the win32 TIME_ZONE_INFORMATION structure docs - # http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx - (self._stdmonth, - self._stddayofweek, # Sunday = 0 - self._stdweeknumber, # Last = 5 - self._stdhour, - self._stdminute) = tup[4:9] - - (self._dstmonth, - self._dstdayofweek, # Sunday = 0 - self._dstweeknumber, # Last = 5 - self._dsthour, - self._dstminute) = tup[12:17] - - self._dst_base_offset_ = self._dst_offset - self._std_offset - self.hasdst = self._get_hasdst() - - def __repr__(self): - return "tzwin(%s)" % repr(self._name) - - def __reduce__(self): - return (self.__class__, (self._name,)) - - -class tzwinlocal(tzwinbase): - """ - Class representing the local time zone information in the Windows registry - - While :class:`dateutil.tz.tzlocal` makes system calls (via the :mod:`time` - module) to retrieve time zone information, ``tzwinlocal`` retrieves the - rules directly from the Windows registry and creates an object like - :class:`dateutil.tz.tzwin`. - - Because Windows does not have an equivalent of :func:`time.tzset`, on - Windows, :class:`dateutil.tz.tzlocal` instances will always reflect the - time zone settings *at the time that the process was started*, meaning - changes to the machine's time zone settings during the run of a program - on Windows will **not** be reflected by :class:`dateutil.tz.tzlocal`. - Because ``tzwinlocal`` reads the registry directly, it is unaffected by - this issue. - """ - def __init__(self): - with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: - with winreg.OpenKey(handle, TZLOCALKEYNAME) as tzlocalkey: - keydict = valuestodict(tzlocalkey) - - self._std_abbr = keydict["StandardName"] - self._dst_abbr = keydict["DaylightName"] - - try: - tzkeyname = text_type('{kn}\\{sn}').format(kn=TZKEYNAME, - sn=self._std_abbr) - with winreg.OpenKey(handle, tzkeyname) as tzkey: - _keydict = valuestodict(tzkey) - self._display = _keydict["Display"] - except OSError: - self._display = None - - stdoffset = -keydict["Bias"]-keydict["StandardBias"] - dstoffset = stdoffset-keydict["DaylightBias"] - - self._std_offset = datetime.timedelta(minutes=stdoffset) - self._dst_offset = datetime.timedelta(minutes=dstoffset) - - # For reasons unclear, in this particular key, the day of week has been - # moved to the END of the SYSTEMTIME structure. - tup = struct.unpack("=8h", keydict["StandardStart"]) - - (self._stdmonth, - self._stdweeknumber, # Last = 5 - self._stdhour, - self._stdminute) = tup[1:5] - - self._stddayofweek = tup[7] - - tup = struct.unpack("=8h", keydict["DaylightStart"]) - - (self._dstmonth, - self._dstweeknumber, # Last = 5 - self._dsthour, - self._dstminute) = tup[1:5] - - self._dstdayofweek = tup[7] - - self._dst_base_offset_ = self._dst_offset - self._std_offset - self.hasdst = self._get_hasdst() - - def __repr__(self): - return "tzwinlocal()" - - def __str__(self): - # str will return the standard name, not the daylight name. - return "tzwinlocal(%s)" % repr(self._std_abbr) - - def __reduce__(self): - return (self.__class__, ()) - - -def picknthweekday(year, month, dayofweek, hour, minute, whichweek): - """ dayofweek == 0 means Sunday, whichweek 5 means last instance """ - first = datetime.datetime(year, month, 1, hour, minute) - - # This will work if dayofweek is ISO weekday (1-7) or Microsoft-style (0-6), - # Because 7 % 7 = 0 - weekdayone = first.replace(day=((dayofweek - first.isoweekday()) % 7) + 1) - wd = weekdayone + ((whichweek - 1) * ONEWEEK) - if (wd.month != month): - wd -= ONEWEEK - - return wd - - -def valuestodict(key): - """Convert a registry key's values to a dictionary.""" - dout = {} - size = winreg.QueryInfoKey(key)[1] - tz_res = None - - for i in range(size): - key_name, value, dtype = winreg.EnumValue(key, i) - if dtype == winreg.REG_DWORD or dtype == winreg.REG_DWORD_LITTLE_ENDIAN: - # If it's a DWORD (32-bit integer), it's stored as unsigned - convert - # that to a proper signed integer - if value & (1 << 31): - value = value - (1 << 32) - elif dtype == winreg.REG_SZ: - # If it's a reference to the tzres DLL, load the actual string - if value.startswith('@tzres'): - tz_res = tz_res or tzres() - value = tz_res.name_from_string(value) - - value = value.rstrip('\x00') # Remove trailing nulls - - dout[key_name] = value - - return dout diff --git a/.venv/Lib/site-packages/dateutil/tzwin.py b/.venv/Lib/site-packages/dateutil/tzwin.py deleted file mode 100644 index cebc673..0000000 --- a/.venv/Lib/site-packages/dateutil/tzwin.py +++ /dev/null @@ -1,2 +0,0 @@ -# tzwin has moved to dateutil.tz.win -from .tz.win import * diff --git a/.venv/Lib/site-packages/dateutil/utils.py b/.venv/Lib/site-packages/dateutil/utils.py deleted file mode 100644 index dd2d245..0000000 --- a/.venv/Lib/site-packages/dateutil/utils.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers general convenience and utility functions for dealing with -datetimes. - -.. versionadded:: 2.7.0 -""" -from __future__ import unicode_literals - -from datetime import datetime, time - - -def today(tzinfo=None): - """ - Returns a :py:class:`datetime` representing the current day at midnight - - :param tzinfo: - The time zone to attach (also used to determine the current day). - - :return: - A :py:class:`datetime.datetime` object representing the current day - at midnight. - """ - - dt = datetime.now(tzinfo) - return datetime.combine(dt.date(), time(0, tzinfo=tzinfo)) - - -def default_tzinfo(dt, tzinfo): - """ - Sets the ``tzinfo`` parameter on naive datetimes only - - This is useful for example when you are provided a datetime that may have - either an implicit or explicit time zone, such as when parsing a time zone - string. - - .. doctest:: - - >>> from dateutil.tz import tzoffset - >>> from dateutil.parser import parse - >>> from dateutil.utils import default_tzinfo - >>> dflt_tz = tzoffset("EST", -18000) - >>> print(default_tzinfo(parse('2014-01-01 12:30 UTC'), dflt_tz)) - 2014-01-01 12:30:00+00:00 - >>> print(default_tzinfo(parse('2014-01-01 12:30'), dflt_tz)) - 2014-01-01 12:30:00-05:00 - - :param dt: - The datetime on which to replace the time zone - - :param tzinfo: - The :py:class:`datetime.tzinfo` subclass instance to assign to - ``dt`` if (and only if) it is naive. - - :return: - Returns an aware :py:class:`datetime.datetime`. - """ - if dt.tzinfo is not None: - return dt - else: - return dt.replace(tzinfo=tzinfo) - - -def within_delta(dt1, dt2, delta): - """ - Useful for comparing two datetimes that may have a negligible difference - to be considered equal. - """ - delta = abs(delta) - difference = dt1 - dt2 - return -delta <= difference <= delta diff --git a/.venv/Lib/site-packages/dateutil/zoneinfo/__init__.py b/.venv/Lib/site-packages/dateutil/zoneinfo/__init__.py deleted file mode 100644 index 34f11ad..0000000 --- a/.venv/Lib/site-packages/dateutil/zoneinfo/__init__.py +++ /dev/null @@ -1,167 +0,0 @@ -# -*- coding: utf-8 -*- -import warnings -import json - -from tarfile import TarFile -from pkgutil import get_data -from io import BytesIO - -from dateutil.tz import tzfile as _tzfile - -__all__ = ["get_zonefile_instance", "gettz", "gettz_db_metadata"] - -ZONEFILENAME = "dateutil-zoneinfo.tar.gz" -METADATA_FN = 'METADATA' - - -class tzfile(_tzfile): - def __reduce__(self): - return (gettz, (self._filename,)) - - -def getzoneinfofile_stream(): - try: - return BytesIO(get_data(__name__, ZONEFILENAME)) - except IOError as e: # TODO switch to FileNotFoundError? - warnings.warn("I/O error({0}): {1}".format(e.errno, e.strerror)) - return None - - -class ZoneInfoFile(object): - def __init__(self, zonefile_stream=None): - if zonefile_stream is not None: - with TarFile.open(fileobj=zonefile_stream) as tf: - self.zones = {zf.name: tzfile(tf.extractfile(zf), filename=zf.name) - for zf in tf.getmembers() - if zf.isfile() and zf.name != METADATA_FN} - # deal with links: They'll point to their parent object. Less - # waste of memory - links = {zl.name: self.zones[zl.linkname] - for zl in tf.getmembers() if - zl.islnk() or zl.issym()} - self.zones.update(links) - try: - metadata_json = tf.extractfile(tf.getmember(METADATA_FN)) - metadata_str = metadata_json.read().decode('UTF-8') - self.metadata = json.loads(metadata_str) - except KeyError: - # no metadata in tar file - self.metadata = None - else: - self.zones = {} - self.metadata = None - - def get(self, name, default=None): - """ - Wrapper for :func:`ZoneInfoFile.zones.get`. This is a convenience method - for retrieving zones from the zone dictionary. - - :param name: - The name of the zone to retrieve. (Generally IANA zone names) - - :param default: - The value to return in the event of a missing key. - - .. versionadded:: 2.6.0 - - """ - return self.zones.get(name, default) - - -# The current API has gettz as a module function, although in fact it taps into -# a stateful class. So as a workaround for now, without changing the API, we -# will create a new "global" class instance the first time a user requests a -# timezone. Ugly, but adheres to the api. -# -# TODO: Remove after deprecation period. -_CLASS_ZONE_INSTANCE = [] - - -def get_zonefile_instance(new_instance=False): - """ - This is a convenience function which provides a :class:`ZoneInfoFile` - instance using the data provided by the ``dateutil`` package. By default, it - caches a single instance of the ZoneInfoFile object and returns that. - - :param new_instance: - If ``True``, a new instance of :class:`ZoneInfoFile` is instantiated and - used as the cached instance for the next call. Otherwise, new instances - are created only as necessary. - - :return: - Returns a :class:`ZoneInfoFile` object. - - .. versionadded:: 2.6 - """ - if new_instance: - zif = None - else: - zif = getattr(get_zonefile_instance, '_cached_instance', None) - - if zif is None: - zif = ZoneInfoFile(getzoneinfofile_stream()) - - get_zonefile_instance._cached_instance = zif - - return zif - - -def gettz(name): - """ - This retrieves a time zone from the local zoneinfo tarball that is packaged - with dateutil. - - :param name: - An IANA-style time zone name, as found in the zoneinfo file. - - :return: - Returns a :class:`dateutil.tz.tzfile` time zone object. - - .. warning:: - It is generally inadvisable to use this function, and it is only - provided for API compatibility with earlier versions. This is *not* - equivalent to ``dateutil.tz.gettz()``, which selects an appropriate - time zone based on the inputs, favoring system zoneinfo. This is ONLY - for accessing the dateutil-specific zoneinfo (which may be out of - date compared to the system zoneinfo). - - .. deprecated:: 2.6 - If you need to use a specific zoneinfofile over the system zoneinfo, - instantiate a :class:`dateutil.zoneinfo.ZoneInfoFile` object and call - :func:`dateutil.zoneinfo.ZoneInfoFile.get(name)` instead. - - Use :func:`get_zonefile_instance` to retrieve an instance of the - dateutil-provided zoneinfo. - """ - warnings.warn("zoneinfo.gettz() will be removed in future versions, " - "to use the dateutil-provided zoneinfo files, instantiate a " - "ZoneInfoFile object and use ZoneInfoFile.zones.get() " - "instead. See the documentation for details.", - DeprecationWarning) - - if len(_CLASS_ZONE_INSTANCE) == 0: - _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) - return _CLASS_ZONE_INSTANCE[0].zones.get(name) - - -def gettz_db_metadata(): - """ Get the zonefile metadata - - See `zonefile_metadata`_ - - :returns: - A dictionary with the database metadata - - .. deprecated:: 2.6 - See deprecation warning in :func:`zoneinfo.gettz`. To get metadata, - query the attribute ``zoneinfo.ZoneInfoFile.metadata``. - """ - warnings.warn("zoneinfo.gettz_db_metadata() will be removed in future " - "versions, to use the dateutil-provided zoneinfo files, " - "ZoneInfoFile object and query the 'metadata' attribute " - "instead. See the documentation for details.", - DeprecationWarning) - - if len(_CLASS_ZONE_INSTANCE) == 0: - _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) - return _CLASS_ZONE_INSTANCE[0].metadata diff --git a/.venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 0d92d5c25e635b7c7cf9d1ce3db64d4dcf72c3d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5696 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 G8~+70C&|SC diff --git a/.venv/Lib/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz b/.venv/Lib/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz deleted file mode 100644 index 524c48e12db7dfe159f282e4664f71ce249e1970..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174394 zcmZ^~bwE_l*FP?Zq{spyN-is{fJk?D3DT(`UDC}`%2FbYq;z-Zs-$!`taO8P?%v<> zet(|N^L+pK{lPHz%wD*Wd+B)Z2sf|0ncS-g>naNBXCS)@Z&(%SCHQeoSx8BUA>U+Uv-_+PcJ^N@S}Uy< zw%H&`>L$i&>!{*oBfc0-zD`WkUjal9$uAh)4%v{15TC&{MmSgKi}7!VeoKdb8zKnq zbDKS~H5dgA1t}SI9Q}IV23tK;#?cY+1KQesBf8Wsii)*wjK?wPt6VFjzdjp_Yr49g z{mj@y7-hXo`e%35^1|Bm!rHE(MQQ5%gI!rHHhmA_-@Zvi;P*$h^AefjEgtUPh=K=H z0IFSdDRwX;=}62~+;l8Jf>R+Zc=a=?27X})MVU17)Sn{80I?l-W*(rHjPj6IhEWrf zCQLx3l_kqNp#g9JJ_dz~(Za>h7a}7%)n1$Cw_;h>w4*N^z8@kT$%n4H&)uhXNhpxX z2TqbHs6{2k>$#8So8Qil%RiBwF48t6UbOCVv=|pXKU87mINUYSMVS|=h{3-H`z|A& z9CuAq_9uOw{yHd8?JF>*(oW(m(@x@;z_WJlt@?RHr=PeP`x!5c?v zBN>Ocn~^jN*IyRu|4e(!mu0SfjVM^Jyfs*>T-h%8 z3qr7Fk2XrYH)$NVj8@D}%L9+Rr9(k&2A{roU&x-F9Za{K^*Y^24h`wN8n#Dg)A&cns~@#SS2R0KKK`bG%OI83zUToSr8AQ zf>qup_6GkVlEw|fl>%kqLZ~D{=wX#u#3|rkaSC+dz>^Rb*qaB$C(!#xkO_$pA=p;k?%0v-RP$HSm|t{h7Oa>kU@ z5bwpuwZ@?10MlcK3;-(K0Uh6$3=;1J#pU9LP;n~6iuaP>T4U0w zf$8x>lmoxAf}9^nR*UyO!QEcrmO6eQ`AfX_Xn`G`QRM>7ZbGP{_leuaY3=UU~&Ax(IMCafooxS9#Fu-!+)AiXdk^$=4FS zjJVrabeUlK$03o&d%?MnL(*O=Xh`(3#^sWQv<7|E1-&Maw2|m#!~Ok$u4N4Pe$YH_ zkRf{6A-n7!wI9_+`RT?p*jRhebP~`;0+~gCUzx7AM*W}0+~frmHBZWbxtVQ0EyFV3I z2k%Xu>t@=Q-82`2rRu@-F^v=*xvIg7nfC@G-(&25a`2^P%HO1CQZZW^oYq+1oR)ab zuT)&jCJr208SGFk8}j~~ufH`)a``m(v+1?K|rW+&HgM&rkId*W0IW z@;C5p+s}{MMeLXK1`k#EGw#NsvW#crLK z&R2`@hdK}k_0+THEhk&WE<>4#@eR-3x(h}#d=iW%Qm9Yg8vEh(TGAuqnC(D#(X?t` zIpMm##{7Ajr6XAl(s%R0d=oAEjK9Fxq&uocq@Lh~qacTWZ<^7%;D#NSW-Q`4av#jPSy}?9(t@UIQ zn+M+9q5a)Ix9q!FVA-2di~3(njx+dx;iR_amj*JG;o7EDYWps2P4_1rUh|5|&HFE# zN+ZiA2;|a_aiY@mgdE)ypV0|r9$(Gq@g9fAwIwhL%@`EvItBjKc4(z*O)xw8)KG1n z{a4$9ka($Y=Hqgiv=^RZo{>*_TLN~*UfF~P2SaN@CI^Az`Y!U9fnKA&=L^yTy`?_r zjDb^slD(-(;k!WKug>T%8JggV77xd%&rs)@cxeX77zziOH_VM>mR_+}ZZSR;MT&ns zav>{B;bFX|)Us!tE~nHaG)@({y~V7a7ZM?VPetek4z^BbcKwsnsYqlQ!=B>?V$sEd zLr6k&gFwolY&=PR2^bSD#sj)+WfBdLDZb+h)p*J4xtFq4F=hPvI!*{C18BG7&vq* z;1H^iD^h`DabQ@#hG-aw-Orh0Dr@9^hop-rGVkrF zYrMCNCLs{=i8q{?&B5wGL!O}_qj!+cXbAt_miib*jAwGZuQ)vzq<||8!HkI%r>F0{ z7fS-`#DWL}%D=G-(}*?I$i|E*O^&bR|G{h>C~pXkC5K^QL&5^(KTxg24~WxqyF*xt zsz?>WqSECR9R$+k6`g0(<>_0fRM(>ToCRazZ=LyL;;~%N#lySe@m)c6SJ2-TFKdKi z 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 z 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

oF5%wc?0lVIdiCvTMwKQ}m1M4pzSU2C#ISwFq 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
oHJaZa%&cRgbKqQScY`o5It4F}rqGD>-kDeG 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 diff --git a/.venv/Lib/site-packages/dateutil/zoneinfo/rebuild.py b/.venv/Lib/site-packages/dateutil/zoneinfo/rebuild.py deleted file mode 100644 index 684c658..0000000 --- a/.venv/Lib/site-packages/dateutil/zoneinfo/rebuild.py +++ /dev/null @@ -1,75 +0,0 @@ -import logging -import os -import tempfile -import shutil -import json -from subprocess import check_call, check_output -from tarfile import TarFile - -from dateutil.zoneinfo import METADATA_FN, ZONEFILENAME - - -def rebuild(filename, tag=None, format="gz", zonegroups=[], metadata=None): - """Rebuild the internal timezone info in dateutil/zoneinfo/zoneinfo*tar* - - filename is the timezone tarball from ``ftp.iana.org/tz``. - - """ - tmpdir = tempfile.mkdtemp() - zonedir = os.path.join(tmpdir, "zoneinfo") - moduledir = os.path.dirname(__file__) - try: - with TarFile.open(filename) as tf: - for name in zonegroups: - tf.extract(name, tmpdir) - filepaths = [os.path.join(tmpdir, n) for n in zonegroups] - - _run_zic(zonedir, filepaths) - - # write metadata file - with open(os.path.join(zonedir, METADATA_FN), 'w') as f: - json.dump(metadata, f, indent=4, sort_keys=True) - target = os.path.join(moduledir, ZONEFILENAME) - with TarFile.open(target, "w:%s" % format) as tf: - for entry in os.listdir(zonedir): - entrypath = os.path.join(zonedir, entry) - tf.add(entrypath, entry) - finally: - shutil.rmtree(tmpdir) - - -def _run_zic(zonedir, filepaths): - """Calls the ``zic`` compiler in a compatible way to get a "fat" binary. - - Recent versions of ``zic`` default to ``-b slim``, while older versions - don't even have the ``-b`` option (but default to "fat" binaries). The - current version of dateutil does not support Version 2+ TZif files, which - causes problems when used in conjunction with "slim" binaries, so this - function is used to ensure that we always get a "fat" binary. - """ - - try: - help_text = check_output(["zic", "--help"]) - except OSError as e: - _print_on_nosuchfile(e) - raise - - if b"-b " in help_text: - bloat_args = ["-b", "fat"] - else: - bloat_args = [] - - check_call(["zic"] + bloat_args + ["-d", zonedir] + filepaths) - - -def _print_on_nosuchfile(e): - """Print helpful troubleshooting message - - e is an exception raised by subprocess.check_call() - - """ - if e.errno == 2: - logging.error( - "Could not find zic. Perhaps you need to install " - "libc-bin or some other package that provides it, " - "or it's not in your PATH?") diff --git a/.venv/Lib/site-packages/discord-2.0.0.dist-info/INSTALLER b/.venv/Lib/site-packages/discord-2.0.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/discord-2.0.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/discord-2.0.0.dist-info/METADATA b/.venv/Lib/site-packages/discord-2.0.0.dist-info/METADATA deleted file mode 100644 index 4265415..0000000 --- a/.venv/Lib/site-packages/discord-2.0.0.dist-info/METADATA +++ /dev/null @@ -1,16 +0,0 @@ -Metadata-Version: 2.1 -Name: discord -Version: 2.0.0 -Summary: A mirror package for discord.py. Please install that instead. -Home-page: https://github.com/Rapptz/discord.py -Author: Rapptz -License: UNKNOWN -Platform: UNKNOWN -Description-Content-Type: text/markdown -Requires-Dist: discord.py (>=2.0.0) - -### This is a mirror package! - -It is recommended to install `discord.py` instead. - - diff --git a/.venv/Lib/site-packages/discord-2.0.0.dist-info/RECORD b/.venv/Lib/site-packages/discord-2.0.0.dist-info/RECORD deleted file mode 100644 index 378127f..0000000 --- a/.venv/Lib/site-packages/discord-2.0.0.dist-info/RECORD +++ /dev/null @@ -1,6 +0,0 @@ -discord-2.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -discord-2.0.0.dist-info/METADATA,sha256=CyOiXiFd1qwUt1pTOVoRgm_4EqwJk6yeRkTZ7oboB_w,381 -discord-2.0.0.dist-info/RECORD,, -discord-2.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -discord-2.0.0.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 -discord-2.0.0.dist-info/top_level.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 diff --git a/.venv/Lib/site-packages/discord-2.0.0.dist-info/REQUESTED b/.venv/Lib/site-packages/discord-2.0.0.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/Lib/site-packages/discord-2.0.0.dist-info/WHEEL b/.venv/Lib/site-packages/discord-2.0.0.dist-info/WHEEL deleted file mode 100644 index becc9a6..0000000 --- a/.venv/Lib/site-packages/discord-2.0.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/Lib/site-packages/discord-2.0.0.dist-info/top_level.txt b/.venv/Lib/site-packages/discord-2.0.0.dist-info/top_level.txt deleted file mode 100644 index 8b13789..0000000 --- a/.venv/Lib/site-packages/discord-2.0.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/INSTALLER b/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/LICENSE b/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/LICENSE deleted file mode 100644 index 700c21b..0000000 --- a/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/METADATA b/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/METADATA deleted file mode 100644 index 3b096b2..0000000 --- a/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/METADATA +++ /dev/null @@ -1,166 +0,0 @@ -Metadata-Version: 2.1 -Name: discord.py -Version: 2.0.1 -Summary: A Python wrapper for the Discord API -Home-page: https://github.com/Rapptz/discord.py -Author: Rapptz -License: MIT -Project-URL: Documentation, https://discordpy.readthedocs.io/en/latest/ -Project-URL: Issue tracker, https://github.com/Rapptz/discord.py/issues -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: MIT License -Classifier: Intended Audience :: Developers -Classifier: Natural Language :: English -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Topic :: Internet -Classifier: Topic :: Software Development :: Libraries -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Utilities -Classifier: Typing :: Typed -Requires-Python: >=3.8.0 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: aiohttp (<4,>=3.7.4) -Provides-Extra: docs -Requires-Dist: sphinx (==4.4.0) ; extra == 'docs' -Requires-Dist: sphinxcontrib-trio (==1.1.2) ; extra == 'docs' -Requires-Dist: sphinxcontrib-websupport ; extra == 'docs' -Requires-Dist: typing-extensions (<5,>=4.3) ; extra == 'docs' -Provides-Extra: speed -Requires-Dist: orjson (>=3.5.4) ; extra == 'speed' -Requires-Dist: aiodns (>=1.1) ; extra == 'speed' -Requires-Dist: Brotli ; extra == 'speed' -Requires-Dist: cchardet (==2.1.7) ; (python_version < "3.10") and extra == 'speed' -Provides-Extra: test -Requires-Dist: coverage[toml] ; extra == 'test' -Requires-Dist: pytest ; extra == 'test' -Requires-Dist: pytest-asyncio ; extra == 'test' -Requires-Dist: pytest-cov ; extra == 'test' -Requires-Dist: pytest-mock ; extra == 'test' -Requires-Dist: typing-extensions (<5,>=4.3) ; extra == 'test' -Provides-Extra: voice -Requires-Dist: PyNaCl (<1.6,>=1.3.0) ; extra == 'voice' - -discord.py -========== - -.. image:: https://discord.com/api/guilds/336642139381301249/embed.png - :target: https://discord.gg/r3sSKJJ - :alt: Discord server invite -.. image:: https://img.shields.io/pypi/v/discord.py.svg - :target: https://pypi.python.org/pypi/discord.py - :alt: PyPI version info -.. image:: https://img.shields.io/pypi/pyversions/discord.py.svg - :target: https://pypi.python.org/pypi/discord.py - :alt: PyPI supported Python versions - -A modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python. - -Key Features -------------- - -- Modern Pythonic API using ``async`` and ``await``. -- Proper rate limit handling. -- Optimised in both speed and memory. - -Installing ----------- - -**Python 3.8 or higher is required** - -To install the library without full voice support, you can just run the following command: - -.. code:: sh - - # Linux/macOS - python3 -m pip install -U discord.py - - # Windows - py -3 -m pip install -U discord.py - -Otherwise to get voice support you should run the following command: - -.. code:: sh - - # Linux/macOS - python3 -m pip install -U "discord.py[voice]" - - # Windows - py -3 -m pip install -U discord.py[voice] - - -To install the development version, do the following: - -.. code:: sh - - $ git clone https://github.com/Rapptz/discord.py - $ cd discord.py - $ python3 -m pip install -U .[voice] - - -Optional Packages -~~~~~~~~~~~~~~~~~~ - -* `PyNaCl `__ (for voice support) - -Please note that when installing voice support on Linux, you must install the following packages via your favourite package manager (e.g. ``apt``, ``dnf``, etc) before running the above commands: - -* libffi-dev (or ``libffi-devel`` on some systems) -* python-dev (e.g. ``python3.8-dev`` for Python 3.8) - -Quick Example --------------- - -.. code:: py - - import discord - - class MyClient(discord.Client): - async def on_ready(self): - print('Logged on as', self.user) - - async def on_message(self, message): - # don't respond to ourselves - if message.author == self.user: - return - - if message.content == 'ping': - await message.channel.send('pong') - - intents = discord.Intents.default() - intents.message_content = True - client = MyClient(intents=intents) - client.run('token') - -Bot Example -~~~~~~~~~~~~~ - -.. code:: py - - import discord - from discord.ext import commands - - intents = discord.Intents.default() - intents.message_content = True - bot = commands.Bot(command_prefix='>', intents=intents) - - @bot.command() - async def ping(ctx): - await ctx.send('pong') - - bot.run('token') - -You can find more examples in the examples directory. - -Links ------- - -- `Documentation `_ -- `Official Discord Server `_ -- `Discord API `_ - - diff --git a/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/RECORD b/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/RECORD deleted file mode 100644 index f4b73d4..0000000 --- a/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/RECORD +++ /dev/null @@ -1,239 +0,0 @@ -discord.py-2.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -discord.py-2.0.1.dist-info/LICENSE,sha256=IRr8eHptwl13Oez9dujx-pRmN028VYOGiW2Yzf7lEn0,1081 -discord.py-2.0.1.dist-info/METADATA,sha256=lM-OaObD1h1WPSUkC_SbXzCMpANuXHRgDhUoNm8EwPo,4897 -discord.py-2.0.1.dist-info/RECORD,, -discord.py-2.0.1.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 -discord.py-2.0.1.dist-info/top_level.txt,sha256=fJkrNbR-_8ubMBUcDEJBcfkpECrvSEmMrNKgvLlQFoM,8 -discord/__init__.py,sha256=EdW8LQxeIwXUMh_R5cDwj0qkC5KnRHMnfAT0U6PvP4s,1886 -discord/__main__.py,sha256=DEe4CqYJGe53oxJsZAQVXNRQUEUILXpo1r5iwp5wIW8,11051 -discord/__pycache__/__init__.cpython-38.pyc,, -discord/__pycache__/__main__.cpython-38.pyc,, -discord/__pycache__/abc.cpython-38.pyc,, -discord/__pycache__/activity.cpython-38.pyc,, -discord/__pycache__/appinfo.cpython-38.pyc,, -discord/__pycache__/asset.cpython-38.pyc,, -discord/__pycache__/audit_logs.cpython-38.pyc,, -discord/__pycache__/automod.cpython-38.pyc,, -discord/__pycache__/backoff.cpython-38.pyc,, -discord/__pycache__/channel.cpython-38.pyc,, -discord/__pycache__/client.cpython-38.pyc,, -discord/__pycache__/colour.cpython-38.pyc,, -discord/__pycache__/components.cpython-38.pyc,, -discord/__pycache__/context_managers.cpython-38.pyc,, -discord/__pycache__/embeds.cpython-38.pyc,, -discord/__pycache__/emoji.cpython-38.pyc,, -discord/__pycache__/enums.cpython-38.pyc,, -discord/__pycache__/errors.cpython-38.pyc,, -discord/__pycache__/file.cpython-38.pyc,, -discord/__pycache__/flags.cpython-38.pyc,, -discord/__pycache__/gateway.cpython-38.pyc,, -discord/__pycache__/guild.cpython-38.pyc,, -discord/__pycache__/http.cpython-38.pyc,, -discord/__pycache__/integrations.cpython-38.pyc,, -discord/__pycache__/interactions.cpython-38.pyc,, -discord/__pycache__/invite.cpython-38.pyc,, -discord/__pycache__/member.cpython-38.pyc,, -discord/__pycache__/mentions.cpython-38.pyc,, -discord/__pycache__/message.cpython-38.pyc,, -discord/__pycache__/mixins.cpython-38.pyc,, -discord/__pycache__/object.cpython-38.pyc,, -discord/__pycache__/oggparse.cpython-38.pyc,, -discord/__pycache__/opus.cpython-38.pyc,, -discord/__pycache__/partial_emoji.cpython-38.pyc,, -discord/__pycache__/permissions.cpython-38.pyc,, -discord/__pycache__/player.cpython-38.pyc,, -discord/__pycache__/raw_models.cpython-38.pyc,, -discord/__pycache__/reaction.cpython-38.pyc,, -discord/__pycache__/role.cpython-38.pyc,, -discord/__pycache__/scheduled_event.cpython-38.pyc,, -discord/__pycache__/shard.cpython-38.pyc,, -discord/__pycache__/stage_instance.cpython-38.pyc,, -discord/__pycache__/state.cpython-38.pyc,, -discord/__pycache__/sticker.cpython-38.pyc,, -discord/__pycache__/team.cpython-38.pyc,, -discord/__pycache__/template.cpython-38.pyc,, -discord/__pycache__/threads.cpython-38.pyc,, -discord/__pycache__/user.cpython-38.pyc,, -discord/__pycache__/utils.cpython-38.pyc,, -discord/__pycache__/voice_client.cpython-38.pyc,, -discord/__pycache__/welcome_screen.cpython-38.pyc,, -discord/__pycache__/widget.cpython-38.pyc,, -discord/abc.py,sha256=QuVHNg3fe0u7x0CEYnFfq095xuHvSyK68UNSUj0KbLI,64890 -discord/activity.py,sha256=cz9uCNNECyS0KKF3qfjEux5Hb6vu0fPk0Lya3EwZKSM,26864 -discord/app_commands/__init__.py,sha256=xaANFF28sifxXO__x6eSd7r5r7UjpO-tMQirjaKiNSc,424 -discord/app_commands/__pycache__/__init__.cpython-38.pyc,, -discord/app_commands/__pycache__/checks.cpython-38.pyc,, -discord/app_commands/__pycache__/commands.cpython-38.pyc,, -discord/app_commands/__pycache__/errors.cpython-38.pyc,, -discord/app_commands/__pycache__/models.cpython-38.pyc,, -discord/app_commands/__pycache__/namespace.cpython-38.pyc,, -discord/app_commands/__pycache__/transformers.cpython-38.pyc,, -discord/app_commands/__pycache__/translator.cpython-38.pyc,, -discord/app_commands/__pycache__/tree.cpython-38.pyc,, -discord/app_commands/checks.py,sha256=StiwzVre5UJFyxA8v6lPV6Ww9rOvkpAc6hmUlDWVlDs,18067 -discord/app_commands/commands.py,sha256=78trKnwbq14Oe0-ol7fRHh32S118Pg4QacWSxScBTJ4,95518 -discord/app_commands/errors.py,sha256=6Y9ZNwnQGlGo6v2zSt5_sbdpMRAFirjFTR6G2iBO4GA,18649 -discord/app_commands/models.py,sha256=fXKPuveZsXDZUSDouqx2e9-uU8wCHKdZPiCFgaaPuoU,38427 -discord/app_commands/namespace.py,sha256=cy8tjG_6EPD_XTR5tkEPN1UDwZz_lX76Etav3nyraEg,12929 -discord/app_commands/transformers.py,sha256=oHVFWLffQ6bbD2S0WKE3LbDB2vb7OQ4irsjiTQhqBjQ,32137 -discord/app_commands/translator.py,sha256=m9ENDO7GGCJXiSuhCCvXi1jW4ccHOBEM0Hk9qomS6I0,10686 -discord/app_commands/tree.py,sha256=LX4Zmf5sAc7HliE9g-uCFlgVFFD0qbbg4_PycbJ3ux4,47763 -discord/appinfo.py,sha256=lOeC9UKG5mJW0VGAoqH62Y4acVtEuOjIbws8xnJRLUs,10504 -discord/asset.py,sha256=SuZBQ9mgz092zUpXem2gco0WOOAOiW9pJpWpbfJtsUI,15837 -discord/audit_logs.py,sha256=-6EXQyH13GH43ZAie4gsfY7Ey9N_GBda0912IGm3Pio,30936 -discord/automod.py,sha256=1d_AlvA077OWDyimQvMHnApOg0pA562mu9Wmu77dV3M,21151 -discord/backoff.py,sha256=3yQ0uJbQ3ij7Tmdzv7GdhqfHjbNVO4eTB3Eu0VCxuvM,3751 -discord/bin/libopus-0.x64.dll,sha256=yE2oNujZJCGsMFhCz-WnJImO0J00DUaxKeIQvclEgTE,441856 -discord/bin/libopus-0.x86.dll,sha256=O1v-EpUPNQQ-110rb6kCyTbWelBxYL92NY1nx2wdveg,366080 -discord/channel.py,sha256=2LGmfbOMVlB1rrZvwfT7XEiG1EDvaeQaCnKDzVsGQok,98359 -discord/client.py,sha256=swA5TOBMPqWhlRLikiNOKKVtxSO10AOXXrEG_84Q6qU,66619 -discord/colour.py,sha256=SuXXAS3EfPFQC8-qDmrTD7l-__prZNUB2SkzZcB4gYM,12306 -discord/components.py,sha256=Hb93_kgw4nl02DWcqoZBn-sHKgq9iWzh0xJLkKZncDE,16416 -discord/context_managers.py,sha256=hloaEAAhLcDB-QfyoCPEpH_vsc3y4WLs1Ujs352tLbQ,3032 -discord/embeds.py,sha256=sijnFNm84KCoo_IUPUUC1bzX1IWyMfPcBPFXFocq50g,22722 -discord/emoji.py,sha256=Wov7TktazUyDVbnnUXw8o6x0c06uU_kWV_Ou5DKqmhA,8627 -discord/enums.py,sha256=gf8mCPvLG5fKvrClX_CqkvNFrV1zgYTCHia0Rg7n8sc,21355 -discord/errors.py,sha256=h0BHhp-UjoWTvoxqlLjtOziM9nxVFR8qMHZmEt8m5oc,8952 -discord/ext/commands/__init__.py,sha256=ZQPvApylgqC07qrj80DDkT4Dbd7j_OVy5Xw4RiYZJRc,437 -discord/ext/commands/__pycache__/__init__.cpython-38.pyc,, -discord/ext/commands/__pycache__/_types.cpython-38.pyc,, -discord/ext/commands/__pycache__/bot.cpython-38.pyc,, -discord/ext/commands/__pycache__/cog.cpython-38.pyc,, -discord/ext/commands/__pycache__/context.cpython-38.pyc,, -discord/ext/commands/__pycache__/converter.cpython-38.pyc,, -discord/ext/commands/__pycache__/cooldowns.cpython-38.pyc,, -discord/ext/commands/__pycache__/core.cpython-38.pyc,, -discord/ext/commands/__pycache__/errors.cpython-38.pyc,, -discord/ext/commands/__pycache__/flags.cpython-38.pyc,, -discord/ext/commands/__pycache__/help.cpython-38.pyc,, -discord/ext/commands/__pycache__/hybrid.cpython-38.pyc,, -discord/ext/commands/__pycache__/parameters.cpython-38.pyc,, -discord/ext/commands/__pycache__/view.cpython-38.pyc,, -discord/ext/commands/_types.py,sha256=ULLyGU6nLcITfnS-yTrlRU0N3e0zXETo2w8dBWKMrf4,2638 -discord/ext/commands/bot.py,sha256=e9d3ASPWxyP9iz5SA8szPC3mgbKtn2HgO6vZ1Nij78s,51674 -discord/ext/commands/cog.py,sha256=v0-Eqfe8E3sCpW6HUFbp_zOF6PqRLCV4BL9Z2EvR3MU,28650 -discord/ext/commands/context.py,sha256=9ILOPVb_GdTmZnTdUVGK2u7iyfgwONr0WLmUBJVazfE,34232 -discord/ext/commands/converter.py,sha256=cW87gMOfug7fee2qi-AXmdYQSpgJ1ok9hYYOni6lszQ,44592 -discord/ext/commands/cooldowns.py,sha256=0TrIBTDYLz2PhVx7yE9RDNoCENFRlLDEw1e8nvabm1k,9716 -discord/ext/commands/core.py,sha256=ss-j3b-dmQncfoWLunycmeK9IhjGMSkPqvH59KxJ2Mw,87933 -discord/ext/commands/errors.py,sha256=1dnfxbweQJ7VW7Wtm0cMtI5V4zl8MsJU4gp8wJOWgKQ,36151 -discord/ext/commands/flags.py,sha256=sNpJlJ8Q9959Esrvx1IRXjcpyzJna7KCTT5RL-i9Fs0,22324 -discord/ext/commands/help.py,sha256=4_i3CSfckbRt2YkE15skQ0MQuqMq4_tAOsPaOEjDK4s,57412 -discord/ext/commands/hybrid.py,sha256=bEVdP9Efi9tkv5C_0Ha7R1cbclgrlMYNQgmj5uQR0II,36161 -discord/ext/commands/parameters.py,sha256=tgWZMa3Zw7DH_nbe9Hp3Zhiul6psaw7dILeOnPECPm0,8344 -discord/ext/commands/view.py,sha256=lwRVmdXEkTIyzLLacr7Wz6jFY0s7KEbzuFgzx8Wgjog,6247 -discord/ext/tasks/__init__.py,sha256=60L9gRLI-Bip_EPS_U959jNgAh6M7Sh8jCIUNJUkXDw,29153 -discord/ext/tasks/__pycache__/__init__.cpython-38.pyc,, -discord/file.py,sha256=qZ9uJPn0SIQpT7NR_luyGAWC3HMH4YnL37JnAdPOZy4,5438 -discord/flags.py,sha256=kBx_cqy_-HbQxJwvVAXlAtTLwKa4iR5ne0X_6OtI2qs,48309 -discord/gateway.py,sha256=314HVjxAm5SmfGXo5fWpTpgESVzuFBnTTGQ02XaSTmE,34879 -discord/guild.py,sha256=grFnq088q6pAPqIkCXdtXrpfNHTujZSUNC_PxkiU2XE,137757 -discord/http.py,sha256=FQKPICAV_DbLgjPFo0nygA0x570IJuKl_TWLGJDcbQ0,89059 -discord/integrations.py,sha256=YEg76wjlp_l55H-mOBBghbJqlz1XZGFW1i5PhIOCZR0,13403 -discord/interactions.py,sha256=CNM7gE7FzV60WM0vq5tdCy_aR5dxcncT0tWk6sTAQTM,39900 -discord/invite.py,sha256=dA2npDEeeH-9HG-OEwAgglmxA16qvyB5xJv2io3-Q9o,20564 -discord/member.py,sha256=jboLS0PDEbd-xFNIilOnumNtrvTXrtu_DL8M3jCbDe0,39605 -discord/mentions.py,sha256=2DZE_Uh2sDIoext6-bAXkdyWAjRVSAV3GrMYxKFIL14,5592 -discord/message.py,sha256=8DLQiP9XmVNm6dpwqxf4b-iv0M-sDYrb8EW7zdn_0Lg,78313 -discord/mixins.py,sha256=_mKBOfdhQKNwlVx2m4jbJmOvtWxkuWSBEbnhxNDd4qo,1485 -discord/object.py,sha256=H2M4THLbeH5Kbi0ZodHDGp1k1qQZc2bTfBvNsDVDb9Y,3695 -discord/oggparse.py,sha256=F_wjGRC2TWeq0tMltNukivWSP-YUdP8WAIOy-oVqNmU,3646 -discord/opus.py,sha256=zo1FUdkAp1xbZXXBiDlk2Nrw68fMNTzUFkhmnRzohgg,15065 -discord/partial_emoji.py,sha256=ybHYXLIv6kUCw_YXFFLMFNO_hLvwGI8TTJ6ErX8aYHQ,7634 -discord/permissions.py,sha256=kGqBVd64cMnGMrEJZkdmnAExTBc_nU4oOoSvDi8KCtY,28151 -discord/player.py,sha256=RDn3VwzAA_ixPk5b4qBnDnkG9QELwq17VZK3mU4ZrCU,26456 -discord/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -discord/raw_models.py,sha256=fZfp5OKQb31IutyW2OyyOBU_WLdnTfiD-mvQmLR-erA,16822 -discord/reaction.py,sha256=wFaaxPn7CXiM8axCpy3f3pfAFe5KohQuUP9tJRJK0GM,8255 -discord/role.py,sha256=3e0chFAUbC1CvSBDtfsMi_uY7VY76BJLbbhqgN77EA0,17038 -discord/scheduled_event.py,sha256=m0VGD7RcIy7iLg-vWGaZ-jideJsMYuTXTX4iHwf3IRw,20717 -discord/shard.py,sha256=tGmBD1mJKtUybeC2dgAwwqftEZVFHqXfEIqL-_N4c20,20061 -discord/stage_instance.py,sha256=nddKhrkcjA4M_YjxpnblCfVBbY0E27QCeoCe2iKaSC0,6546 -discord/state.py,sha256=L8gP-7-Lsz-pmiDfPUyuhdPnXqciEfpJWPwGv0qkEyk,72733 -discord/sticker.py,sha256=hdCSl2j4ettxJiJECJCukrQTmAvpNkX5mkIEot15QT8,16063 -discord/team.py,sha256=elrIodKl_OcyOBt6iaqYq-T-FhtvU2xHB0pJG6Qn0v8,4607 -discord/template.py,sha256=yzlrlL2hrPUSDLyT6N0DDxYdLqKudRw3jYma8T1Bym0,9581 -discord/threads.py,sha256=llT7ZmmfaKN0xreQtxNQsCN4r3uvIc4zDQn4-Ar7ecA,28293 -discord/types/__init__.py,sha256=7kT6hLaDiMVwuJvp4Os08kxqu9bxX3Yr9FFcOGYd6YQ,149 -discord/types/__pycache__/__init__.cpython-38.pyc,, -discord/types/__pycache__/activity.cpython-38.pyc,, -discord/types/__pycache__/appinfo.cpython-38.pyc,, -discord/types/__pycache__/audit_log.cpython-38.pyc,, -discord/types/__pycache__/automod.cpython-38.pyc,, -discord/types/__pycache__/channel.cpython-38.pyc,, -discord/types/__pycache__/command.cpython-38.pyc,, -discord/types/__pycache__/components.cpython-38.pyc,, -discord/types/__pycache__/embed.cpython-38.pyc,, -discord/types/__pycache__/emoji.cpython-38.pyc,, -discord/types/__pycache__/gateway.cpython-38.pyc,, -discord/types/__pycache__/guild.cpython-38.pyc,, -discord/types/__pycache__/integration.cpython-38.pyc,, -discord/types/__pycache__/interactions.cpython-38.pyc,, -discord/types/__pycache__/invite.cpython-38.pyc,, -discord/types/__pycache__/member.cpython-38.pyc,, -discord/types/__pycache__/message.cpython-38.pyc,, -discord/types/__pycache__/role.cpython-38.pyc,, -discord/types/__pycache__/scheduled_event.cpython-38.pyc,, -discord/types/__pycache__/snowflake.cpython-38.pyc,, -discord/types/__pycache__/sticker.cpython-38.pyc,, -discord/types/__pycache__/team.cpython-38.pyc,, -discord/types/__pycache__/template.cpython-38.pyc,, -discord/types/__pycache__/threads.cpython-38.pyc,, -discord/types/__pycache__/user.cpython-38.pyc,, -discord/types/__pycache__/voice.cpython-38.pyc,, -discord/types/__pycache__/webhook.cpython-38.pyc,, -discord/types/__pycache__/welcome_screen.cpython-38.pyc,, -discord/types/__pycache__/widget.cpython-38.pyc,, -discord/types/activity.py,sha256=k7tqp11m_t77Lu9D5T8pAMw1dnQcs7CtLJ5NV-4CgzQ,2707 -discord/types/appinfo.py,sha256=APP2OKoT1VvUX_OO7oZe4HuLeGZBGShGn9KVWQG4dt0,2330 -discord/types/audit_log.py,sha256=8ceXkxHhUlZrlooAgHC0_VqCnA9KZYPPl2yZ0YmcJ0g,7468 -discord/types/automod.py,sha256=O5AZiZn9Cz5RE8NzAO6Kte6HZaijWUxcN-r9e5jAtqc,3842 -discord/types/channel.py,sha256=9X2XxyevV8U58pUJEv32umfyqeVKAbPKm8cl0YKlres,4012 -discord/types/command.py,sha256=1hcNoTUcJmpQy29ILcevQSxT8X2nxCngwubshVdgtyI,6266 -discord/types/components.py,sha256=jLxNOpxIFLSqM5ne1qg6f96lLs8UDy1EsVj4CSnQUZg,2465 -discord/types/embed.py,sha256=VnYSZqjPIYXAGA87P-JhjXs_mGhswaMpOd81mzF5iPc,2329 -discord/types/emoji.py,sha256=JfwRzhcs7KRLKVtl8bCrvbgBTl9Ww8MboNoUcEf2EkM,1528 -discord/types/gateway.py,sha256=s99Fs9jUT5wRZF2egtQOZ984iAhgKZQaWwFCgMRo5BQ,8328 -discord/types/guild.py,sha256=HRsRBXna0z-DCRojbyMtDZHPeREVsQ70BhRjZtp2bX8,4944 -discord/types/integration.py,sha256=COkepHL3jhihFBFVkKn8h54LNRfObQC81uGVwESER30,2266 -discord/types/interactions.py,sha256=jVbOrL860jcnrbeGfjhwm35bVJf8OR9tzLxrLgoqsjg,6871 -discord/types/invite.py,sha256=sLmvX0Imw5qtV-h78BYVf928Q0YIfGWVuz9XxY8Ctqg,2704 -discord/types/member.py,sha256=2rieSLJfsCImyrD1AnXuds5ELuBJHWgdjOaWidH_bh8,1883 -discord/types/message.py,sha256=7GApqs0wSSgMyLzTHt9UtJtNvLVp9ZuJXsnXED9lVH8,3881 -discord/types/role.py,sha256=jg_P1LBnxmQ70L2ukAYjVjgcH5a3dCCHGSliMFbUwxA,1646 -discord/types/scheduled_event.py,sha256=WwSiBISWsOD81CVxBc2dwfnLSCaRPsZUdYFWyW8ouJI,3294 -discord/types/snowflake.py,sha256=x_L3OXauewQagDr6jPzj7uCw1MNqijsy-Uo9vvkwvF0,1182 -discord/types/sticker.py,sha256=cT717cduRvGAvjF5NFwR6vDkaHLDij6xgwYxs4jUdGA,2244 -discord/types/team.py,sha256=rOgj3_h4UGMTSx9dgyBrYTX-1MQZdvPqpJgZKtnOOF4,1499 -discord/types/template.py,sha256=EO4tA2WypntCGQ9sWud5VS_uI8n12iVVHVPcNgCtZvM,1609 -discord/types/threads.py,sha256=h8BRUDGXMEYX1OhjewbaLmWwnJxzOk2AAgTRe--bH4E,2407 -discord/types/user.py,sha256=fmJShIs-vFsqyuGnnse_0WSJyw7QVk1RnVIwEQMt84Q,1540 -discord/types/voice.py,sha256=wFQLiPZaQuXBKE1dM_bdWNpkglpGFC7kEtghwCHBDQM,2268 -discord/types/webhook.py,sha256=iqBUgbz38o0_mWp-gcVI0_urpgZ_dq2EfOOXACg47u8,1978 -discord/types/welcome_screen.py,sha256=ukQMefZLHpgyg0_5IoAzN0UX40VayhF2vnJzNJNMZzA,1460 -discord/types/widget.py,sha256=YRkhDoBHbCEtkmYTVOSoHM8Y3mH9GIdowthoz8ISJYU,1883 -discord/ui/__init__.py,sha256=zsTlMLSiy6RzXzNVl1i5WDiM5piE_bgzCTLYU93axYM,285 -discord/ui/__pycache__/__init__.cpython-38.pyc,, -discord/ui/__pycache__/button.cpython-38.pyc,, -discord/ui/__pycache__/item.cpython-38.pyc,, -discord/ui/__pycache__/modal.cpython-38.pyc,, -discord/ui/__pycache__/select.cpython-38.pyc,, -discord/ui/__pycache__/text_input.cpython-38.pyc,, -discord/ui/__pycache__/view.cpython-38.pyc,, -discord/ui/button.py,sha256=Q1R4gPQTJjzlnBn9Hi2Y5YpgR5gCgK8eLKomysL-7hc,10595 -discord/ui/item.py,sha256=lWH_s8Rw4Sn85ZmbwgFXFGXyfsFPkitq4KTI9rAjfkc,4298 -discord/ui/modal.py,sha256=X7FnvkJgu4FMqRacN80Q-Wl0iuRqCwuQT2vtv7gKHtg,6900 -discord/ui/select.py,sha256=9IP6MytrLXu6VOV3pe_jiUNjdj4rp_myDkLm1VME9SA,13057 -discord/ui/text_input.py,sha256=7pto9tAGJylFITQcxpFiY6D06h10fYShp54fJcgpzGk,7982 -discord/ui/view.py,sha256=Og2bqBZidoa1IndoOs17vA60lSQCM3L-O6nC8z-4Pkw,22744 -discord/user.py,sha256=fxkZMlFmGj_6el79aLLzFGJUj0bRgI9vpoVPUAvPKCg,15392 -discord/utils.py,sha256=JsJ8QoU78VGNKGiNYEyWzVizcguw4JExApwNKFtEnJ0,39409 -discord/voice_client.py,sha256=0dUM5VSzJZsOoNwhwzHkH4swIbSujkQhApIxYqhAOfY,24968 -discord/webhook/__init__.py,sha256=5lx7IcCFf9DAjdX7CVen3-8DjHAfGvS1rSDY3DyVnqM,182 -discord/webhook/__pycache__/__init__.cpython-38.pyc,, -discord/webhook/__pycache__/async_.cpython-38.pyc,, -discord/webhook/__pycache__/sync.cpython-38.pyc,, -discord/webhook/async_.py,sha256=PhKmzTiVAkUo9r2AxNMxz4xFZ6XsvSd2pXgtiou842s,66670 -discord/webhook/sync.py,sha256=zf5rUCobpk6R4wP91dMvhY2PXnXKHcJUEop5nRGtUws,42014 -discord/welcome_screen.py,sha256=PFqkBWbZBgD1bzjZgge7hjcjWU0qTwmDt2gOkw2K0To,7562 -discord/widget.py,sha256=RaDGOudb-3_lmusAxfi2pJWfZ0SuXOjscnHuBcIWvsQ,10160 diff --git a/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/WHEEL b/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/WHEEL deleted file mode 100644 index becc9a6..0000000 --- a/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/top_level.txt b/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/top_level.txt deleted file mode 100644 index e46fba2..0000000 --- a/.venv/Lib/site-packages/discord.py-2.0.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -discord diff --git a/.venv/Lib/site-packages/discord/__init__.py b/.venv/Lib/site-packages/discord/__init__.py deleted file mode 100644 index c48558c..0000000 --- a/.venv/Lib/site-packages/discord/__init__.py +++ /dev/null @@ -1,85 +0,0 @@ -""" -Discord API Wrapper -~~~~~~~~~~~~~~~~~~~ - -A basic wrapper for the Discord API. - -:copyright: (c) 2015-present Rapptz -:license: MIT, see LICENSE for more details. - -""" - -__title__ = 'discord' -__author__ = 'Rapptz' -__license__ = 'MIT' -__copyright__ = 'Copyright 2015-present Rapptz' -__version__ = '2.0.1' - -__path__ = __import__('pkgutil').extend_path(__path__, __name__) - -import logging -from typing import NamedTuple, Literal - -from .client import * -from .appinfo import * -from .user import * -from .emoji import * -from .partial_emoji import * -from .activity import * -from .channel import * -from .guild import * -from .flags import * -from .member import * -from .message import * -from .asset import * -from .errors import * -from .permissions import * -from .role import * -from .file import * -from .colour import * -from .integrations import * -from .invite import * -from .template import * -from .welcome_screen import * -from .widget import * -from .object import * -from .reaction import * -from . import ( - utils as utils, - opus as opus, - abc as abc, - ui as ui, - app_commands as app_commands, -) -from .enums import * -from .embeds import * -from .mentions import * -from .shard import * -from .player import * -from .webhook import * -from .voice_client import * -from .audit_logs import * -from .raw_models import * -from .team import * -from .sticker import * -from .stage_instance import * -from .scheduled_event import * -from .interactions import * -from .components import * -from .threads import * -from .automod import * - - -class VersionInfo(NamedTuple): - major: int - minor: int - micro: int - releaselevel: Literal["alpha", "beta", "candidate", "final"] - serial: int - - -version_info: VersionInfo = VersionInfo(major=2, minor=0, micro=1, releaselevel='final', serial=0) - -logging.getLogger(__name__).addHandler(logging.NullHandler()) - -del logging, NamedTuple, Literal, VersionInfo diff --git a/.venv/Lib/site-packages/discord/__main__.py b/.venv/Lib/site-packages/discord/__main__.py deleted file mode 100644 index 6e34be5..0000000 --- a/.venv/Lib/site-packages/discord/__main__.py +++ /dev/null @@ -1,351 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -from typing import Optional, Tuple, Dict - -import argparse -import sys -from pathlib import Path - -import discord -import importlib.metadata -import aiohttp -import platform - - -def show_version() -> None: - entries = [] - - entries.append('- Python v{0.major}.{0.minor}.{0.micro}-{0.releaselevel}'.format(sys.version_info)) - version_info = discord.version_info - entries.append('- discord.py v{0.major}.{0.minor}.{0.micro}-{0.releaselevel}'.format(version_info)) - if version_info.releaselevel != 'final': - version = importlib.metadata.version('discord.py') - if version: - entries.append(f' - discord.py metadata: v{version}') - - entries.append(f'- aiohttp v{aiohttp.__version__}') - uname = platform.uname() - entries.append('- system info: {0.system} {0.release} {0.version}'.format(uname)) - print('\n'.join(entries)) - - -def core(parser: argparse.ArgumentParser, args: argparse.Namespace) -> None: - if args.version: - show_version() - else: - parser.print_help() - - -_bot_template = """#!/usr/bin/env python3 - -from discord.ext import commands -import discord -import config - -class Bot(commands.{base}): - def __init__(self, intents: discord.Intents, **kwargs): - super().__init__(command_prefix=commands.when_mentioned_or('{prefix}'), intents=intents, **kwargs) - - async def setup_hook(self): - for cog in config.cogs: - try: - await self.load_extension(cog) - except Exception as exc: - print(f'Could not load extension {{cog}} due to {{exc.__class__.__name__}}: {{exc}}') - - async def on_ready(self): - print(f'Logged on as {{self.user}} (ID: {{self.user.id}})') - - -intents = discord.Intents.default() -intents.message_content = True -bot = Bot(intents=intents) - -# write general commands here - -bot.run(config.token) -""" - -_gitignore_template = """# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - -# Our configuration files -config.py -""" - -_cog_template = '''from discord.ext import commands -import discord - -class {name}(commands.Cog{attrs}): - """The description for {name} goes here.""" - - def __init__(self, bot): - self.bot = bot -{extra} -async def setup(bot): - await bot.add_cog({name}(bot)) -''' - -_cog_extras = ''' - async def cog_load(self): - # loading logic goes here - pass - - async def cog_unload(self): - # clean up logic goes here - pass - - async def cog_check(self, ctx): - # checks that apply to every command in here - return True - - async def bot_check(self, ctx): - # checks that apply to every command to the bot - return True - - async def bot_check_once(self, ctx): - # check that apply to every command but is guaranteed to be called only once - return True - - async def cog_command_error(self, ctx, error): - # error handling to every command in here - pass - - async def cog_app_command_error(self, interaction, error): - # error handling to every application command in here - pass - - async def cog_before_invoke(self, ctx): - # called before a command is called here - pass - - async def cog_after_invoke(self, ctx): - # called after a command is called here - pass - -''' - - -# certain file names and directory names are forbidden -# see: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx -# although some of this doesn't apply to Linux, we might as well be consistent -_base_table: Dict[str, Optional[str]] = { - '<': '-', - '>': '-', - ':': '-', - '"': '-', - # '/': '-', these are fine - # '\\': '-', - '|': '-', - '?': '-', - '*': '-', -} - -# NUL (0) and 1-31 are disallowed -_base_table.update((chr(i), None) for i in range(32)) - -_translation_table = str.maketrans(_base_table) - - -def to_path(parser: argparse.ArgumentParser, name: str, *, replace_spaces: bool = False) -> Path: - if isinstance(name, Path): - return name - - if sys.platform == 'win32': - forbidden = ( - 'CON', - 'PRN', - 'AUX', - 'NUL', - 'COM1', - 'COM2', - 'COM3', - 'COM4', - 'COM5', - 'COM6', - 'COM7', - 'COM8', - 'COM9', - 'LPT1', - 'LPT2', - 'LPT3', - 'LPT4', - 'LPT5', - 'LPT6', - 'LPT7', - 'LPT8', - 'LPT9', - ) - if len(name) <= 4 and name.upper() in forbidden: - parser.error('invalid directory name given, use a different one') - - name = name.translate(_translation_table) - if replace_spaces: - name = name.replace(' ', '-') - return Path(name) - - -def newbot(parser: argparse.ArgumentParser, args: argparse.Namespace) -> None: - new_directory = to_path(parser, args.directory) / to_path(parser, args.name) - - # as a note exist_ok for Path is a 3.5+ only feature - # since we already checked above that we're >3.5 - try: - new_directory.mkdir(exist_ok=True, parents=True) - except OSError as exc: - parser.error(f'could not create our bot directory ({exc})') - - cogs = new_directory / 'cogs' - - try: - cogs.mkdir(exist_ok=True) - init = cogs / '__init__.py' - init.touch() - except OSError as exc: - print(f'warning: could not create cogs directory ({exc})') - - try: - with open(str(new_directory / 'config.py'), 'w', encoding='utf-8') as fp: - fp.write('token = "place your token here"\ncogs = []\n') - except OSError as exc: - parser.error(f'could not create config file ({exc})') - - try: - with open(str(new_directory / 'bot.py'), 'w', encoding='utf-8') as fp: - base = 'Bot' if not args.sharded else 'AutoShardedBot' - fp.write(_bot_template.format(base=base, prefix=args.prefix)) - except OSError as exc: - parser.error(f'could not create bot file ({exc})') - - if not args.no_git: - try: - with open(str(new_directory / '.gitignore'), 'w', encoding='utf-8') as fp: - fp.write(_gitignore_template) - except OSError as exc: - print(f'warning: could not create .gitignore file ({exc})') - - print('successfully made bot at', new_directory) - - -def newcog(parser: argparse.ArgumentParser, args: argparse.Namespace) -> None: - cog_dir = to_path(parser, args.directory) - try: - cog_dir.mkdir(exist_ok=True) - except OSError as exc: - print(f'warning: could not create cogs directory ({exc})') - - directory = cog_dir / to_path(parser, args.name) - directory = directory.with_suffix('.py') - try: - with open(str(directory), 'w', encoding='utf-8') as fp: - attrs = '' - extra = _cog_extras if args.full else '' - if args.class_name: - name = args.class_name - else: - name = str(directory.stem) - if '-' in name or '_' in name: - translation = str.maketrans('-_', ' ') - name = name.translate(translation).title().replace(' ', '') - else: - name = name.title() - - if args.display_name: - attrs += f', name="{args.display_name}"' - if args.hide_commands: - attrs += ', command_attrs=dict(hidden=True)' - fp.write(_cog_template.format(name=name, extra=extra, attrs=attrs)) - except OSError as exc: - parser.error(f'could not create cog file ({exc})') - else: - print('successfully made cog at', directory) - - -def add_newbot_args(subparser: argparse._SubParsersAction[argparse.ArgumentParser]) -> None: - parser = subparser.add_parser('newbot', help='creates a command bot project quickly') - parser.set_defaults(func=newbot) - - parser.add_argument('name', help='the bot project name') - parser.add_argument('directory', help='the directory to place it in (default: .)', nargs='?', default=Path.cwd()) - parser.add_argument('--prefix', help='the bot prefix (default: $)', default='$', metavar='') - parser.add_argument('--sharded', help='whether to use AutoShardedBot', action='store_true') - parser.add_argument('--no-git', help='do not create a .gitignore file', action='store_true', dest='no_git') - - -def add_newcog_args(subparser: argparse._SubParsersAction[argparse.ArgumentParser]) -> None: - parser = subparser.add_parser('newcog', help='creates a new cog template quickly') - parser.set_defaults(func=newcog) - - parser.add_argument('name', help='the cog name') - parser.add_argument('directory', help='the directory to place it in (default: cogs)', nargs='?', default=Path('cogs')) - parser.add_argument('--class-name', help='the class name of the cog (default: )', dest='class_name') - parser.add_argument('--display-name', help='the cog name (default: )') - parser.add_argument('--hide-commands', help='whether to hide all commands in the cog', action='store_true') - parser.add_argument('--full', help='add all special methods as well', action='store_true') - - -def parse_args() -> Tuple[argparse.ArgumentParser, argparse.Namespace]: - parser = argparse.ArgumentParser(prog='discord', description='Tools for helping with discord.py') - parser.add_argument('-v', '--version', action='store_true', help='shows the library version') - parser.set_defaults(func=core) - - subparser = parser.add_subparsers(dest='subcommand', title='subcommands') - add_newbot_args(subparser) - add_newcog_args(subparser) - return parser, parser.parse_args() - - -def main() -> None: - parser, args = parse_args() - args.func(parser, args) - - -if __name__ == '__main__': - main() diff --git a/.venv/Lib/site-packages/discord/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 50be9b0b79fb3de567edf0f6cd0e5428f522d59a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2042 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/abc.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/abc.cpython-38.pyc deleted file mode 100644 index d02e022c5a12eb2e939cae970dc52beb92c479d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57947 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/activity.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/activity.cpython-38.pyc deleted file mode 100644 index 95763de3390ca4733c7c525a26e04d1585e360d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26147 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/appinfo.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/appinfo.cpython-38.pyc deleted file mode 100644 index d965315e580fe35fc2f4ba4ed86b5ed301cc0c2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9724 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/asset.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/asset.cpython-38.pyc deleted file mode 100644 index bd4cba61682a84fa03c685c7d547dd1c0e4aeb3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15591 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/automod.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/automod.cpython-38.pyc deleted file mode 100644 index f7b8ec7df0b53a35e6af6bfa634cc3aa0aa4f09d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19927 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 C8((7p diff --git a/.venv/Lib/site-packages/discord/__pycache__/backoff.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/backoff.cpython-38.pyc deleted file mode 100644 index 96c151cf0fdceba82f32f3c0d3903a849ff2c461..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4152 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/channel.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/channel.cpython-38.pyc deleted file mode 100644 index e9353c0c114625a5a22bfa1bed4243c582caf999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96784 zcmeFa37A~hbskt-?<@9|WD(rZWTOdiXN#oRYyf0SKm!6ApjaeSRbB5jx*D}KUsVI_ zO2d{#%95PWk?o9~&xU4zc#<*VS-ef`OfoaFl(C)o8{3)0GntBK65H|Einqv)B@1?> z`Tuj5w^a3lg|Zy8fqwngd(XZ1+;h)<&kPLo#_$urcwgb^kH=%b$&27m4=!HB^V&y~ zv6vIf#GJU3D8sh(^>Aybd|d^-Q}K4Pq{bKTkgyBmHRXO z<$=sVc`!3r9?A@rhcm0WbDx~|mhLY< zka<$RztQhqq|u$&K;9x0DzM&*2{bf7$z8I$wj(xc^r znS(grlsV)Mem3Df0Z2EO9xFedd0gJuQhK8NWaddZ-&%UA{B-7NIp0=#ru=N?SvlWc z8ZUn!^MUenndjtsN9p`F-(#z#nGOx(_-qKY0LzxfB`CX+CmyczRm5*nR%k|x*>GFxp2|2%~bh7-B%ty+n zGN;O?GpFTVx-?ThlQ~m9n|W2P?=5|_{95KUIp0^xlwZ%hQ9hUXSUH=?mGha|av|fC z-OOD1d}h8}%q+-z_mwV`OPNwU=5BKCcb|4oyU)6t@%IDnvvbK^v9~)i<(Fg51I~l* z#GD7+{X*N-{}aedH!o65Mjd&qeVcOMJfE#mIu&J(!%gf5ZrcmhcQ z&z^Li!n3DZp4IT|Y3CU{dqzLI50KQIXPxmYapwchbMK@wOZw`0=LK9{)K?#LUc}WU zeKp~{gsZol)alsBWPUsqi}lXTyXoUoGwEZ+f?KJ%>HWAE>Fu4YE-rh;^Yiue{=!K5 zv4e-6Jh14wHMdevpUN*T)*HROCta^xtksIuO1fA}&%2&GyPQ7n?U@4P#ju2<9f%5r+q^=kN_I$O^dE5*wBbiTKMs`zGo9>vtEbM;Gk&&A75I$x_* z3&lLjOFPxVQW>@9>#T3CSaNIW{dK^;@3j76-^ge$DskL=DP63fG&gM?r7soh^VOw# z8ZD@M#RAJ1#Y=_Kl0z8G<5IC)R5kSSb7_B#kT2EH0>U|(E?1r69RIq~ti`3-Qn5Ba zns$mTdUmOfH*35p-8tHec05}3(lxhKVhKgSEp7Fo8y~C~bqstFeZN@sq`qh~$58((N7AQH z9G!V};?$A!)amreQzy<&9X@h6y>H?)uJ?_mU!9tH<;0npG~PHhF+KBI`oz)n#Pn7D(=Xw>=@Y=@DWEV4ojH+a zg}SJzBd1x|@gt`uUqQ(eFHIernt5%s_vqBjG|EgLMWGYvlM|dv|dFIr~ z6Q_@$`ok!8dTRRUDb#Z0_>t+EG1Q8C=_6-xkv{#(#Ia+ns(0cHpg)CrPNgSLoP6!n z)XT5Tq+dC4?C=rXeCY@vn|SHi5mgl$HF<1e>iB5-@WkeT5Yqv?rLQ>OuH@6l5yP&~U6U$D=n z`Q7vpRSLUWI>?R)USWrwL8C1!hmTAgLs=M}>Cnq#ytmQU&8}lbzFKN_9S3az+BSQq z^JUkWSz5$5-6s}_P!Ao7b^5$R|7}PT~K|1I<$I+jpf!ERFue!7I)#?R4ovdP1Wi>Dr_P@MTEIFq^ z5-$LlK79goEfeaaSawE|&0aM?XKHvQCCBcU@->%d0H;HWXsVKQKk?(UMfcK3w|74f zvDr86UaIM5-UGPfJ;=jDJnZKSgVM`(P`nY`L?M1B$h;Y_82e#&d8UAOLOB7vGqz*3)izu~aRlouxGTezEq(7^dsRH;xr&->6}N9$3s5E&$tWZ(!Li zR6Xa>f|{XY;96cm1@ri=fxU_K#=GNkr=@p>@DxAs+K(mt-f`j?^i3w^pl2u%TuC}z zPB(a_4yVWI1+UfT^y8{io(?#Jcs}F|<4%{eNuFb2*nBPS+~wTu+;b)Isn}c`4A8yr^rM{3 z_-dbgb)R#;e691n9djO)w|BTZor7|R z{3>DHg*)I<(b^s0NC%v!(8{OrtkXVw9M7Zwp1IP8w|nq!2Ws38j&p}IPTtgsInQ6| zcU~|hI3JXjQ5T>M+Ju6x`dbUWWad^ zPo|s?p@coohuyvM9lt$>-{V)hooVNUb5j0&1W-NcoN`WI>2YS9Gx*{z=d85+Rp+DV zo4e)P*HCAVlfj#>J8xV`Ip>^@;mv#Sj6Fgg{dFgcI&)4Q_tR+QtW&@@j^mh1 zr7IoIMduRUxc^hJR4nrV=IdKRNb;ZTjKxm5nlrDZ^XbECKBUi+j$!V+RVN3|#S8pb z8b4!WS|Zmy*E=B7>jiZoX4WN|1AhCtjqkIa_iuc!9jx+)~$aC5(-|`oxm5- z5rI~MdEa0$q-?sFiMnR_Yf}9I|3|L*=6HI%P=XvYoH~Ez7TVOrzKPVNkQT!x-;AYmx#?=f&E;4uge0fx z)+!GHJKh2VsS01LVrjrCzefAbD@H&xU_*qfkELhW68z7n!OwviLDTZ}GL^Nt5JoS8M|DgU3eXz(B&^|X)^SVuqRgYZufs3p-DbJ3?3#iL<;I!qJ!fTSI|tzNL2acvD`UW9UdDyD1A9H&`gn#H4{ar*&$@A z*&$Q6*_p)@f>4!Wk2U)OG^g2Z=1X(Xbgn|cW?z=Fn@D4|W=FP8$!jPwo0@m6**)Gk z*gJ0mhsFVs2VW0JLnrgg6bwhx0Zv@sJ9j=2N>)A+cVa`N?jfdV9dlK3TK$=^w` zk7GDliLb=6v3h(Z>BOOeM)h?Ji+6I`JB6>BDK=}Q!#l%^ zBnDA#d$04dE4#Fairwp}W(vxqIWLR50+5&EnPsEBlYAY_IP_`tZ1%@-RqMtf7VnG? z#(U$9t$}8bnb(?0(A?_~Bt2OxZS(jco7jb4X-xU5P z@wbCbyv8>=ai?Q0alZ3%-08a7>2y0i@1T1Qqf@TMFDIN{JnvfQ{-K!DwUWTG?{kzs z`c;Q`A3JHWrV)nQ-E# zW7iXnjt6SbKj2MEe_c;B6JrOP@p`oPdY(J)R@}E1y%#=@vP5u5#S*c`L*cITz-eW( zW6zbUg?y>@!kGQ)M*O)O@fSvV)c8eO(N(NvZ9|%=1rX(CPc|!TK{o4s7&Tr`dM^Gn zJ4n51%}&1KI#DPw#tMR;CXkzPh$Xrq-|!#goExd`tu3RiK4_-6c%l{}w8Ebv&I%l9 z^TTtC)Zc{*h14tPNI~OxJ#jUOtHd>6K^6#owZlnXBdT}eZc5(4nBp$vCV8h@t{^|j zRgYXjiju2dx#|Np^vQLfF1=r_`hiaaD~W4yJz)l>1vQ#I&~8AK2fO0U074&CjyAV| zwz*l+;AX+oX1OMKoV4CK9KLk517~?&zJbHYpy~-3sk?BaxhZ?z1(~g7Yevl=c-Ktg zcBC%vH5S8CWu{7j&EYI`(xm{=(nA{P@$iiG3Mk-<_!ac!WbMUt?dLHuh_hk*HnxQD zPZ0!f6d#2q16#>olol7+7~9@jV@7u1U4QopoUFNy!0U~o#s;*Fi5D%mOerN$## zOZWPu;?1bn8mmLX7==7w^Z!ovGhrQvMzw8Tu6As_4q>KGzjNH5>y~@Yyspv=1L>LsUB$47tOudno);lq0Pj^qMoe2EX(b` z3Ba~L4BP4--Pod5TBXe!O;gWz&Le>a?M+r^7d)Xm#0J4P{3WbO^&77}jFWoo?by}$ zimVr;3fE$nL3dKIh15!NAvF{`j!#K{Oy754wO+!QHHUD}7O7emjE&Tb;h@^n`wU9H zo>Ft+Z{oa}nuX2|njE)Mbe-#QZwWV5S8+l0z88nz#IIUQ6aC5V_~v+ckRsLH=%-Td zb=CCN!Le;*Z-`C@R_%AXKaG`jLDoky28|<9hM5MctlYWrv=M1(cTw!NW{wNs?Q1Z# z1;wzj5bCm{LH%M|IQ{nGS_X?VqGhmF;tMh03aMszurMqu_&`_>Jw)CVZ}>A_I`0Q@ z@2mJ-b#!z?+KrCp9KdDjmzteIgi*V3vxJLW4md z#~g1QFmpmAt?{4=%3mEQX-%I#`sx_wGdajWAILHw*ed)OM3Jvq@DgG0$gkmf3t()@ zBq!0J28^rMLh=GA5deI8qX0s^fF;ss4aS0tms+++s@g&B)$rgy;nyq~A@)FXnKw4s zrQ*2KA+(LN>bNnjV``9(0KY8boM1CAC2I29FSR6=h+;m7cG3SYO+85&~ zITrF*9Rj$|wcDsJ%HmK!`4`q?rG$X^*;Y%TKM52B*)#8ys}ORi;~_;X6{!$NA9d@H zZ!71mOwUQB2Lo;irNz0Wk}tyYAq-mSJj8i|Q(A^eA9_pA6bIwkeAS`WWlk5&mWK)t z_5%F^Dm9q?Jg6b4>u_N}!NoYs8P7qb1Pkc0uNq+es9ryoDh!3qDHR6$S*s-?0&ln! z$_nCe5a=YmOju~GM$+D~*kRCBV@W{&Mi4n{!DdF40&GK2CC5RXt1eXn>X~U!4Kmvz z-ewfTsfV>4b~pQjt&M{UC^X*^W=VrDHMZH-1Q?W7d?!WuA}1~>>jwCulnbAU?G}PW zm_g)25EzQidHAy27_dMFT>} zR}W8n96JmUOK)~n#WY_F!${bOV&t}dk@)rmPDoRs{fRsAcN0@FC-Dl|S?Go?^mqqJ zb@5BO%X`UpAqF{IPEz?lg^%P4Oq5PfXB1Ja17nno2+@nYq`Vkuvs{~8D))@`(c^B-DL zJp^PqlnzZar?om*=5-nstyt_1b4wNRM8FyV79UE8w3jbp7{=YV3gbD-+DAOE>V=fo zgjzj6OXazKp$In-0KpY3mz%1{Iy>Q=7x%ebE&v8cM}*a*OKU!4aR06c;go}UH0>$JUsXr(Je=7^vjpE#A(mh(wa{qHX`#N=9AcnS(Z%J&AlBv~1{Ibs)Cye* zT{J;@(cGdx_1QysEOqBE=8NL6NAwb74#xo|Q0+Rv!9ViqY0zNwwXRI8)njuoAuYkp zHqc9oO=^RQVXH6epFtO?*JXG~X~|NDbQ|f@^HqpXON#(i`ZNzG-Z}{Od4IJ1CCDEh z&9a1tX2J*xIrCUXhc3(TeAcXdKJ7t`#ffQ5og?U%@Mvfwe;WoU$3CPXe3>Ui0zKb- zaMv_r`7LOfBY{W+ud3M zuPLESL@YLxKNMfsSleK#4C_!4*J1mcOT3+^ZHI|F{&xIwypBe{4Uq=g$OkE~=xgZ0 zypK}U*#&Jq#2nay7do$Y;V*Re*R=Qpo1Xtg>O#sZ)w`XJx8t9PJDpCKu@+yZZ5dxL z^vKuH_dDIv#SoxW2_rrEDS#Rkk`B8i@U(PGp>mm2%QV^d@Tq}=DCLDM(~20a1sQ|; z3%>Rj32@)=!luX3>{96hD6J~I45y4DoYVcXeJO2%b=SzhAR3|oBZIg?k?{NE$$&(n zc2I3j*o4y+Pt^n@GmN0z~nuTB5d0YCrTu+Q~12>nKI*+ORBZ z>d6I|>)`UdL0OhUnT3*sD3`M(qi7>4v1cfpnRO{&645rW;PG3oU%8y(WNuDST~j9W zg)#%$I2^z9G&j^dKU)~HQ$9k@ClIQo-w#d<WlpvvY!s zX8kfP7+Z^Xft!L0_(X!RYVAj{ibekVOKmsWPR7AbK2XcTEM2O z^`lgl+8cxv(_GJD^{t+kffAJ3q=XT0mNod8HvE=9tMd(qNwuOKZ#f6`bviAk^l1;4 zr`VSq9Bv$>q$f*y01<3!$bq95gVVmi6~z3Q%Gn1BKj6iU5pk=abbXWnnV{R zOKwF0AYNFh`FedZGZ-$}OQZVcQ21u;dWTXs{%?4ww1T~Qq~V`}5M*V2!Fes(tY5|# zpJ20Se~IlM1WVE%PvN&WzEl2o!v!R4YmU_I{Tx1=x!&FE5Mdas0X?#towF`jQ^Z5% z=P=Eioq5FSRGel%DJ~pQ=ZYR0p5kZ*I~sL|I>4$X(~0&-PmEd zMoU{5hjZ@6pnafT91ydq`TTm1_b&jcM~@5dS9$n9dHBD0_*Xpq-#iEt7t;39!=eYj zefYJ!mvXsSp<@!f=~hxJ9V?wHT`S$ttoA6)Dm16b{B?X7WeQF%L85EN6L1-#w=Kjy zPBb{ZqvMMC^mzmjQ!~z3N36h2Vlu zwpUs0rAGk-mOwR}{`@x)s0?TEz?@V>@Cd9bH>KXys0Vr9CrZI3QPu9xWcq%HGylB1 zEZ{9ym%McKQpG1OGw22_=!X=_q(x=|W{t5cSZzSV03{XVA=i~|q0&fM77ZL}{du6( z?Uc?f3pGKzwZ-@Sau zho11Ml6BJMF*xMTgE>M-MM0wc#;C%ImP8)YNk5;?i!-%R7c3Ho_se{L9#j{GN6z`@ zrP7g5jp6U;guQ?6A!!JT{c9k2`!)WJTs95bUmJNS5Jj;;Hbj7FquHUR!uRKA2XK(u zFT*vL{>hjppjGGReIA{hCMJ*mD%8FJPmfnHe??~wHHB^#S56j2wjDex6c|1tOQ*qo zKu4s$ZlfJE$;yG`8CFX4xvlN6s(P}>Tmz*{iFYvFnXUl<1mO5E`4F%>ra*J3TB#$n z5#+;EXkeh9I88k@>YXg_=@+5Me4yi%*Oe(I%mVuDp+9jQRC~;vy>)*KS`UD5Zv` z23Dh7ZpK@JHDHt?Tu@j8tL@f(g(?u&S`M_p2Tuu6yp|E}a6l##xW-WVdGG_IgIF94 zt}9Ch(<|r&;-s|#*G%k%A)8n)VG^Mp$iT>{8>(TBi{&ihJ2|sL3^8YzDM*$n_M6fE zAr1{8Cl>+=zgrhnNNJ<&@@>c|zSwqK0)3%_OK-W*{r8U6$@U zt_LpC#cLa8CBsrgvqQ@IM`XC^dl{SRj3=W1z8cn{$rm>iFRKH_!)_%;x_O(@%~L2; zaumhN@y|dz^=a`7yPCq^j%#tSrb!t6tog&N`QCVf%9P0w4gul!c_t2!-R8|<0waF#oBI>nBe5gq zCA72?_CQ2IDw%P}7xpx~Ct>Rn~w^_Cc2disu|u{JGJq3wevw(RuILh&E^D*p5L;L@e>UK>p?iZ~2jKdA zimb-E9Sg(Zj?6vSPa!Xt$8(FzhtRH-^~!##)%D-zr{EZ)b?An*d@*y~rQWcuuc~#&w}%iKuJO`Wz+lr$7V`pR)|l3O zqVPMI_Sbv8Kg1tJ#u$5**_IX5$s)v+F&R%ik!8fC&{U5kt~sb`GZap#>&~-~e~-g; zIAZcVLV$z<=lCGZ4tRfxdk>NFi4pDIe#FrACicY}yMx3yT;oWx*+&hU*2}b^a9l+? z^si931zaGCEp{zdLzI&P`t=D|(O^qU!j3jtPa&2P+`&TU55+#05Zf1MTM2m#FDF3_ zV+%bCy$g(v>&ILDppG44`|1QA!6=vkD8J}9*t0O`bkS*Wq&r`Qj?|9AQAq$sg_m9( zv~zMhWH>?BJi3RNcX1*@GYF+hpA(=!pluM$kr%>8CW8_h6|}B{xS>4RtTGJH)TETe z+WBNVfMdRp7eLE4^H4b*rJ=DyEICyULV(f3YVd?%^r`Eu%S3)kInqF*lWH;E1X`dR zhp@g_f*BY#c9}mmCYt=v*c1NHt;30~PEr-}8=7h+fN_*y&HULIO=V+!C8}7(6ln<3 zRaGF;qJ$H7h44d&rXDP@A=XhsaMt;Qw7RECuy;+nY+?1FJ6WI`RWcL{Obd&B>$JXc zU$9l8(1OA%(yYeaN8W-loEpslCWA^8TQ-&?pK`cAcd{)v+ zOt!`^;Z-_uatez~DUv9tg^)kxqp?pchz834yu}n?ZT7$$DAKIvbbYJ+I-Ip_jcz*1 z_X%`czdX}N%#Z^OvEju4l4Qv=k72G0P{q~wGJl0wWoRvYBt@K*k$QaMBGU~*tVX>* z16~<{@k2b9`$>iLf|tAzVWFB^7#FUqFxH>%B;FHWV>|j2jeCOF-sbJbuoWX`B){A_ z%Fc1Xnj}8+C`xDRq4rF@WeQEF+Ql`RJl5l0tW7;FzQ>$_^ zm;#pN$d@kBJ;gJoDxFG&k{d?UsR^Tk3Y6K5CJVgE+*&$|3X`TnKtl3LTQ5gQ1<9q) z(7&J7gz=p5o<%5|p?!3&T|Jz@ESaG>ur?N35NtQEgTo4UwSi`1m}={=!)q{hMtUqF zKN3~ZW60Kp9@B#+j--CFCw6KivTQ^L3-=PS)K|DAbh;C05W!Zj3-_)OJBdTFt&Qzb z+|)&MdYl2xZEch7sN@k`0h&F<%0=V}hHssOEj6~-wp!cxxf_0H+N4_bxiFpc_Mre| zffQLq=36%b&f~6HU3z%=8ZTuA;7Wd&js<3I`TZi-gOB54B?Sk(Zf}rwafk&-)PbwR zm=_32g~J`(=O82`7e{f{31vx_vX{eCu?s4cI7Er=%ES8YZh1SQzxbGZ(XrBn^`+Ci zTc;x))3+pGaZicR(UJco09#$*q6bvuX3VO3dj@4DNFF6~vc`l_S%7>;Fr(Jgn&Oal zQxRBbjhT7bL@5Wf0^s&Q78aSh6%hmqFc`+PqI9hi)hD({SxS@*`@Nc;8&KZx74cNZ z{85eZDZE}<+GudXcEPaXej;5nnNKhyBWfG7TKOv(iK-r6F8F@!ByVDbGBX%S(O^xI z=}k|F$QZCY)z}3r87$*)D8NM(=GW48impS=+NHlzW=?;>05mL`e&1wINY*8HmLp0- zi2ty@VD2ybkm&Z3N*SLIaojQ@667DN>S~{i%eY#yB>vPTs>IS1Lq7v#qzw_}M+zah zF8M5n^-s}5Nb_QNL_}MTwOoaQS^7;#@MiIR1r9~XlLdj?E~|RLqU<0$Ppy|2<={jP z_ts1FU6ZtCz#x31N@MZi=}8V$Ucfsh*vKyl%|!66Kjdvg%hXFUc2bLQq7pKpCryj| z8jw}l1N^bn-mk3H?rH+PD%HvX=Fvl-QWZJrs7S#|O`aN8m_Giz8B2@e#ZQsQ$Kf6b z7&8e-cuFV(s^1|dM#^OHYeAq^r;PU^$ciia`XN;501_bD(!d^w?+PPgJ4~=|tfMH{ zn4rI!kRPS4tE(MOGf||`I%wKxlny?u8KJ*vHc&or5%6l$nq{!w5Rb$C6~+bwLXdPZVqZp)a#zFjLqzY7o}&|uB?{!j1Ztyv*%dk zXK={uYI)hdNlr*AN7^)D-8R4z<@illo!cBxJ)!~qY4Ujw5qorW$?T+(^ ze_tEy<+-|t>l^(&ja@;0FjU&nkrd)e6bInF#mfH$4|HT~9Iz8iIp0{`4|_pG{cO&i zYitXp#D854?>VR!2FdY-%MSB?l&L82(0DeP0Pi=0FIJE|Yb6fVGB`O=A15w%AUGpc zPb?r%!+QzOpQ$J7Frk4{$s0e%3^%WH=^5$2hq#-1%OMEt7dx;RhceK|TX0}H3 z%a8ER$fo=_I@wB*2yIlxtvq9Q;h$EiF3~Sb5qHG((e+GSLPO2aF>&;?EQ6Y&_=0vL zEMh_acht^YJcZi>zJ*tt;}ZSo^g>MvB(Ai|1c>jstW(^C$|dlYW?&UIjp>@R^zp*P zD=#8i91D(j2_bj^$v5mvYIxwFuK+7E6V>Yva%rk{d+ZKjvp6<( znvyV6c`bTrGm7@r*NSe*iH0P%s#s@M;lNDQraB)#8e@|RGc2^K?kLda%ju)s7-Sx4 zs0v2WgEd~_FsZ5nXBMw1RVO1VnNApsRB}2qq#6neUC+~0p4p^f@+rS?Nl^3VP)?L% z>VB@2FV8yp7hX=rVth*+9>nj}FF!`J? z@8)g7y$=HjZ!;hM9ARZge2J}xMvr`!;<)|}&-(b%7Mx|ek;@-jj(F~uzJZ^SE!Z~3 zCO{EmP_x_cV4nC1h@ZhA*F`_UEA)8SZA^l^g>6L+YNG*>epH;XZ!y{am%+kVXKl@hcV#WJ7Te}a35uMSf4Ud=^R%F*7^2~rr z5SvvGun9@Uk=$y{Zi9~s9oU(fUN3*iF!$k6X%0t0>%|b&4&$rX0h+WJsg#Oug=ved zbbn$PY<7Plg{whcCwayv!-?&9vpc>WxijS-qMA~P#@-;i9j$8QK}m@09YbZ_aU75c zJB!WVu(J$uCPPlF*N_Eyj!&0)DDdz}zSpf{^Xtn>oBCaR@Hcqi*dzB9c5h=r-mmlC zZ}9LE56tuFF|nk_Zt?yu4>cZsgon*MT<75nJp3{b+)c;(cRYNV2fCAZU+1BN_(^56 zH^9SPI5Y=zqUQqke*@rtPk%qZ5VyelaaP7}jUc1n9#0K#?i}pjJUEz4#D_ca%fHFN z`1Wr6P2sm|Fg3`(TX{bb-<`yeDDftI{Nsl=?L0OZ-`lbCxybXc>^n2KWADh$r-t_o z?+!fsYWl3cx*_&dc5mpXLtVvdbj&e(3aMRl)Sfw4k`l$8!X7%v{e30w^g4am2c^U5 zm#YD15Lcb@E_Tkr+nb!txYOl!J6q(9tb8*qB{oZlA_%h1Ox`t%j0E6vn!VKQsI=2cM*b+@$?)(h4$WS#UO?9F z^T=7)+{}ous%($MB)g&}k_366k#-mD>4DQrrGu1=CaNca+Wm45kjs#1MF-^r{ zOo?%liw9AQjzTTD>0?ag?PsL-wg6Y*!zsjW79S}&UM82rOCN6qWjX&Es7*PKN}~D3 z?v}o@$>tkFvOnAF&_H3ULL|xa=23tJ8|QY-6R_2q$Go@>Jf<-+iRosyq@jUn5cYBz z2N{uf@M#3N<~B)fEm?n&Y=K*;Ws!x9uA#~R6mLA#22_&f=r{u&Mid~JVt4rx{)!gu0C zAp*@rDxW(tuqPb&-AcxFpaZT_lFvO=@2DfEJFX>@``d6e$ifHrDl)h`T`GIKzEYXp z`*6QU%A}`Subd%!yVECUgYbeI3gmJ}u7A<=oCQcnJ?xH)eb0E{!mcve%AAmSbUz

*tnGf|21~CK^~o%oinEes{y?l1F}Y;tl>x!vIF)p`Fl>S)^CkyZRj5g)GB=+aejVv5nhvDl&bRS<|uP)ZJF9hl1&g z5wCI9t(8PO|5;%FDW&pG!*2-95p@ycxMYW=sl#xzp06rFO?8;+7ppYWT84o7s#O;h z_4tHv-o`@}Lt-O0aZbk!*%eakeAxa7*`=_fC&g6QKbiE=n1^-mgq<%hQL9A>S+}IX zyvMYdEmdsxv;fe$6RZr{;)Q22s+##oYmFbd>5oPm+h4nGWi#>`1*J!QDK$hHIFy`I zpuQ^mei5|c+&;`B#$Y5CV#qd*;{uY!o803oiSP4M#e48YgG{P2!zZ!MMhO|`X|wk^ z#Lue)@&6DtisyA_qBGtZ8~i$wIy}}&(t>j&Ab;9oP^EAI2T;9-Ez^V4MwkMrw?A0S zkFaJEzu2bUMDN!dcduP*W2=yY@P@H#%mpqP(Yaug$uEV-O1R7@d9iykP<>c|Qyuld zLQys{7lLFsG}2r?>`3p$h1mvR)y(qn$m-Qq(j|)w7liT({xmxTv;c({w(tk>=;ur? z>kR;&YVBp)K(*;a+q@m9h~tYa#+X*JVXuBUP^TSd?`a^w=UK6=k)4fw>sRW%i{fR6 z2=BXbR^XTNHU6@j_=^(bwHI&_+>!#*AyFHzC%NH~EHxeQ%fwa=?}}F@wyEgE!qcg@ zsQ?>=WhFU11K-x6$UbD5etm=41#4Iyz6UjlJPKD=wKJ`PkNiQiQ}YVc8|9(E%QVkK zxE4`aB1`jXsK+I+VQ0USb_eiG{ks=`_hGwF2%*@rmH)71E56w8j9lq)9(EqV7lY2I)O5fZL%Bop z<)f%4iOo{?IM|}~N{XAa;>}@q)78!HmW8bg+ZMJ%xMdwr;>|ty7t@=zJ|i2ZZg+P8 zDz@=iXIxse6L&r!5O2ZTd!6S1@$-1bEnd~L58!$9-wW8{H3^8f=zkx?7Os1o390WT zZ1Fm2N&qD6jXlm`ZrX~nU*?kxAjE8VMRq*S?}O{uDdT8F?~lWwtxFX%5T%) z_xCPED1h0a6%zGd!M#h@O6d%999c7sJ><%6VgE(TtF$U6I{nyhoawTpFFKv{)(C1PcipnN~M${pO|RBOW407(x6JmKJ0 zIETOrI0Mqps+!i{5>}kzIn3Z{TT#WX`pUHp6)*N(VV8WO)Et zMmS+#sJ67KH2sk}OLgZ*upKnCoyXx57e>?q91cAU17AvW(`dZ4YF|pML7}*aV3c6g zZENGr%q;z7*m&1Y+|}Em*d?)HwdhR2Fo{F>B-tLaYnr?hYv09}hT zLilThouX6w4LrRP9;rT{i6p>03g5Vhd-s4-m$(zzv2*`f&caDWPN9IND|6c|JH0nq zo`(Zm-cIpcbc<^@qt5r1c=#|67kTjcSpkVwsjUQwjq>;B)E2NmP4!}r&TVah+~CHJ zYwzhNwy=GyUxXRa_5?eGYHm&QyuS_rLxY0h5=Fcq6eVS!?Q@k zX={7HR-9;zgc})=n$SyISntGrDZBk;k@{hhcA2z_;GI|%c9$wHWHz}ge& z8d5;-@8Ok}E+L*ul{;}lJ>n|cWxa+jho0wKX1lC53fdsWd4D%8vjFn1UGoBK>uO3n z-&e%?fSQ%@xC)I7@O>k)82mr>X=;jF@IfOi@ zKC_4cWz0<>ps6#`_ZB`=eWV_r5mk1#I0jTyxn7cI$jH+|-|5|Ogjhx-iETlQXF7yu z;@hHHV_Zk4CHt=TMZE9*w>*fY@}J;LFb{uaxuIQ$zj!ZRqYm*~I_LcVj`l}G-c)W) zDltm$=bTqbI4N|$pL5!2X^duKiBww zCb`DFe+%}^`%NAqEabn#z3(9lDXRNd+GYvg9AY3PO}O`4_|9^JI2S*nB>uile)%b! z7**QMCI`>I4W&zzKYaNwE;;x*LTuY`MqgQabd7y7{|e*|_kJ6g;C+dQ-{s-=dGNKk zRDAt8u@Ap++=p9a*n*-nBes`~{(xou2V0;NExO?^QTP4kR*!*P5_5O&T z|3@C4<>60ouvkrOW(oZLBC(o<8?3&A3A_)ZqA0%mie?R}wh}|Zq}Askjj3#laC!~7Oq_Pe)TI-n8uj93c19gOL#!Njw=KXhg$5v$eV6BS&dwdXW z3@aM*D}qyk_#>ROw0UCO4fn(Ft{!W9X>w%Q zxfr)V3Hlq~R=k$WtrSreKilBsVBWy#(??&WhXcGC{Ib?{?Q9PdKZ9bt%sl}327ipp ztM7T()&d`HocYKvhDn~XfxrmAxYg7B!JNd;LMh^z5-r#T91HX-Isopk2i&({AqIP6 zp=S$>U+`EY$DhfBVqZ2dw$b`b!lB@N)mxrazHe4$eZ~2bv!f&(!Mz1Bry?_B5#oaC=}1QG0L;0hYlZpThYA zrGx0gj1u;!(ImkgFeVQA8uJN%Zp{^# zUlJwmggY?HYK1Z6*V9%-VVht{xxK?8bu@ub8hqTt0t1g7ri%rlVx^$t7PQzZ6$$Yh z>kW(G&sypa`LNyIX`CKGV&WIKdMYQb&uU6p9>u0@ve2yN+h$*AnaX29rmH=9@fZDz zL1%c$7RPBUts&bXy9O8%97&Fj7r8;CpFg;jYfv2u)Aip6Z#OMTFuZ?=Q}2J`p$#i} zn5?9zK#p!j2Ah#x(RjDJ!8WR(H#+c&7p)3)qg$)WC_^_pmE+}?dDbosjN~4;mqqNtBGLMBXP3mSnWQh#gf4p}+Ae`;ySowd zb`K)WnEHiLY+LZ{KKT~Wc2fRUcN^Y*Kw{}0#QP69`w>ew;yjGVwC%WJeB2|>D5CCm zxI58GUP}}nO524yk2(i&=McW^K@?sRQFvoglX~_jo(KOufr!4O^CaFsx`Q(0T0W(8KR(a($2cS$g*)|IDLyYk)Hq*nFFr3+;CmgPM{sYAA(jzYD>g3L z4sq?inb^3IxHp4UMP){u$C=fgkrMz55~CV;lDe~tIJw=ZGQ^C<7P=8#)`RG>-m5(l zXdjF&8^Ckyc8IvLUWqOnl<2adV04+lyLN2W1%MiANCG$5nA;CA`&Dv})G4YEv(te@ zY#R(Q>kovOZJ;f6)U|;)vwups#NSa8o$DAgm22^X@^0f(uA?N(}uq6c^KF))*{S!R!~H6bn`r(Tc&4D}D;;LwTh?mnDI+Lzr(oE4YkJ~(oNYox=%mZEBtYcYwy zCi8uGySYtQ>mrS5H7m7d^Y!a04~%yRO$|shBFNB?{hRDbI>yqF-3ik{3@vUKOG0q8$b9Z!{lWLs1YfFpV^{3`N z&oO;rm4W?T_Ar-+&O`#~o4RBDUyn=`X&~^n-FSK*WU=i=v)g?3TdY7N_0G;j>gy2- zX5I>Q!A8dJt(zJlgSn4ked_SZ8;f52D9kk5_|2XWa{B=(BtPUyP;Hu&@S<`5*}TF}^GHKg)zN^=*j{ldN$R$wbm$esW$Y|)1!@=$UESLB^+*uspNAyg=H z#8EKtu!$=1y(YMB7#g+lSCkFd=nOzVJjqe&P}#da4j?7>n!zqpOHJ{xZK=0;r_c6T zXM}Q_H;`0rKoX=Ema~#@QSEz3F4nsj2k?x-B)$TW)T59i0%;2B@Z&{uxZpUiz_x!S z!EF%h%9fw~)2mAs$ z>_&&3D@Yh78y$A#nX|OLV_G^N8I6F2`J3kt5abiA3V&@!HT#-YzZk@$G0Hxp981It zBb?R0*!Mz1>gyU#GTD7$`4}^6ZlF+IipsvcH5$1|!y;e+Js(31#|EJo^j}k|O<=aF*GoAj`_s@P$hfF`=K> zk@nY^N&S73Nc|^M#;{6 zkxbZroRCm1#IGWu_d@a-2_AQWjn~y)v5JVoGY<<=GQWgAjS@WTd2W`W_5&FpfUQ=D z^{uhK!}xTyezb~km=??kQzKgKwY?pNjU|jY&9KPx6-lA7I&!07)?ykd`_^~xlVO_D zT)}$8&&Owthn)dT+YC>ID4I#iB8zJQ-*3yrGzaHgZYOQ<=_TTm@O@jh#~XV>SQLIU zgharDwcP&NGIBI>e$=u8i3lS{EAW^K=bgoicg}zE4ZlikD(E{RZoq5uhY83}^6*nU zi0fqU%@q;iQ+iMe#boxLOh0yf*xz)dH?Z&FSv>YO0B4wHh&4H9TRj+clMIgWd*~*4 z1Dc*Ft)LUax00J=P=R6=m|RX+pU}E1iv|4&K|i=_)x~1oIB`ZuEqD$~n0z`%LexIZ zp6ZeJ-6sDsxlI}u6`!LGS9P(H?n-}^a&y1gV?biTfJ4ZwZ`ZzerVN+>1>2-)BqE6e79pzGZirwY# z9Q(@QId_!X1Xsnlv)S1q4uCzlvsLaGmqYFyK z#oKBF03JuKuq~TV^TSf^BUd`H34neRHL{F*=!)n(iZTxJ2}Io z$7N@`ZD`#S0@IVuQ_{Naxbw8!dB%BG?(D#wak&E*M7gsQcb=C!FE}5RJJ@#*<-h1m zp!S!XN%YHZxpP?VAi+QG?2$V!%bi!8Dcr%{eE8}^a_7U&G2FRJ+#2tOdf~W7ZAAWS z$yMAMtu(Kr6*Q*}8jYwMa?l6^nOl;*dd_>*r9~tD(=7}UN#~J9y98B0nKZi0Jydi7 zAk2TYJRf!cVF^Yi@A(ah*(mKt%_F( z1S*L>*Jrh5A4Xqs!jI$)hbjnw+4A<+2RDh{f)tR*+xq;qC??4clQ-60EUN$1@HoJzvGCxF?k+peb$RWj)- zX-6ibzqbM-y+%33xC@$RlKJQj-E1_TYTHP+Qm=?23kGq$rJv|mMG=zWy;pe{=V1be z=JrUGlW|-67#>=!6{w21yjZ*2{kXB=Z7{w4Tp=BN5>e2~b~wLb*KoD#<<1B|cF)UI zyz5Z5pR=8-pz^MR?;Dk}@gKrQFZjzG>r~1n@wel1J)oGK(~YgqMe0fyo#$_K%KUl0 z(QA?C`3CO6tM_@8-8>a=J(GSFRnt3d+Q-O;-)8%$H;%;{ZQ7>NsjuTDHpw;oFp7xo zI9X3{+ffHTW7ts=mb$AQ+y_>!uu+oJA^SxlC;ip#z~j+X&yOlmf^_EwhPu#hEMaYoa*I&;Xyd{RBJX zM|q$wA7;2!pNCZTw3HD$iK<^D32U84#-z7ufsrA&j-rMvsJ)_|S5}7iEM>ton((cz zi~lQ?vfyU&2UNX~&PU}J@D)OqgQCOFH#4b#CW;Uv!dV3jzq$(7OuZGk?qJ|K$}nHu zqJG>^=+!a{7zdCRkE-@j*4h;WvAPnTs=Ns?Xl5;2(+h+x7hFxau$91(t2enqlwo39-fYB?K)-P=7Om zt2Ivf;H~Z}Kr^0kIW;(P3qCL{*f|zip4U@u+PbwU`xmd@+{2ZQD`@O7(QhW2ofj@4 z%|gu!t+RZA5(bx7FtYL5{W!r^+>DZlF`T3xe;XnYob%%1ln1BHxbU+KDxGB)twC?@*J&L-yI;;Ldw zlAgF!aln-j7grmfhuJ3VIxMO?dNhB`a!>I_i-2OmdahK3#;^9mnEzo2K!a{uh;HPv zH?a4yQaw;Rab0hE94`dqC>!dMH&{bW(4wMsu+Sns(q_c54gxY~hqF5b5DXtf*qjt+El1Z0Qd=Muxig&B% z39~;r{C?x~`;B_(r~L5@AmK;YsnVa)vvyGDO{c0s?Ts}KMTrJmVYX6h8|)H-9rXy& zlPN-V1LZvYA{IhV4q%yxFoJP$@01;GAF@rjR|I6&)&syPs9murwa2GkmkH||=q&c?7+?&(JV&2HZIm zdjO?*tD#u61;rkVcCIwzPU4vNDpBC0JcLQEN7P!hsC97TkVJ9Id(D<^=~Qzt+>%lR ztL|RAI*nFA%kP~;tIHv@3f2-utB^f;9klWnozxw1 zKJht3rL4rD$xG-66J(yGdv)UvqB@$1bZs6>eqo851lH%P5-h5BLl73xczOrvv*aC9 zZi#8QDe5$5GyeKcje)Rn1uNlLd25vnQ1*Gd;_O2stZCLlt>TQGSXja~hYBReXBUNU zXP#HAf3fBk?MWGI3Roanll)$eP^fdDE0;NP((%2G`=UgnO`$5`(d~`Ymv4EbLPW3q zP@N6z)OaVxDpcN`8LX|kUqh|&K4z)B&z@v)?=yiBx_^}s3YSDGWw!&wxp1I2HJS3m zsQ8vgDKy#JkJ4#I+i8w@tx;-E>FqFVbi#$IvtQrVj5C86YHZs<%%Ly;3pl3?lSIOXc>1hd`;N@+}QsI8;Sa*S78kYRAWr%TRsx>1~Z(zn+59%C@7H zN9X-;VAS@mGWDc{k$YBmJe$KndXfUKz_T>U74xKWLCf>r-{oO#pEK$Jbf!BNKrz+J z@bEehZ}32J?vY}6#5j))@K$w3qqopM=mhQ8&S)d4#O98{AZKtsln7LS@6Dg zci+yZ2jk+rHh?cW^>5GSe*7C0UnI6R^us3LCtmwKK=v2qjOO-VMaH`YaX^EU7qZ|v zd$p4n9MQzdYZKhH?h$t_X1+_oxok7?-dRU9!tjKzqp{-+SF`9lFsD<~KlA z*sL7clAB7%KMnH9&gCiWO9E8xBF(< zV3$N8FDi9attdVNb^6lM6lB2sa{6J+#fQ;a^f3KenZRBr52wBDV!l*_kf_SSwXRW> zQiJ-Q89%bvST(=A#$fqIx|$2WJ%{^_s{Gd~Z2D3jSrup9`XweZ5;jEHzSwa-GbBQ$ z-&?_Gj)OVm*rdCm)|W_<#aPtrTB@0cM*8lK`$#Nn`8h@!dueR3aA6-uW*?JrA(axmV+%0C>{C@Z z?p%JURL|y@kVh-;73PZDTbg6L-uvcy^8l-zRg+(Ex}2O?Sxr zD!E=P)nL^+nKo`)5SsP8F_ZX=-%gUzW1}~k>+pOBav65Qf03~WFjUgscMTRl$#sa_ zBJkUUM=C3bEQ)uEd0v9qv+zKL`;FdCHb zNU3ql_RJT?7jZ8IvyhlQRo=o#&nREcKzgC`ZpD3T(R;yrljV6hz(<$nh^PaVz+LBq zB_2M^!$lqOx5_wRgYXDwY6OJYERWZx$1*QYJb2ZwLj>QDwD?!=~3@8V3QrS)in7wUUJr8 z+EMqVy0V?WYPcXz=A6tlnRDO4Z$H69q>l@@*Tr$(iWB3*+7BPrLH)0>HQdiCkz!+a zJO9l&&g8Ie9nud_PEQfe6`fx(;Jn%FknaL^G#?G~_+kse6D1r{I)#7{-_2RP5}E*^ zD)DXDrPlj2?zFAzyYOJAtt-*k8>%b&Uir}O4OBT2sd9A(TJK#pgVWplZX84dW)zjw zevty;H(sM1)}-4ci6LrU#>X>S}M~Y zYXk1eV-~DL1gx9(RlXmsG&XGfm6S5bz?F>pEPMY8`{aM+;b(b>kgqS`-eZKS7bmeq zDn1NUPJE-WIn-%)&QtlBKo5jz(R<;h{G4B#_dl@pKgq)Z9(M5XQ#|~SI9MF-!v);~ zNCUq}94E3zocaF&Zbkd?I_|w_YirprE!dmyVIq)$o>oP?N_#=MM=&*@rFgHiqpg|# z%xY%W2veh?WCnoKe^pJhu>0#q5~ta3t(0wRHgfDL%zsPmx9vKs+OV46>>W=mA=LqB zb^*kqZ^_-S6i(jO-d9GFTvOKOV4hxd3q_>j9cjHTs7C(!00kg5h-9NLP!#p3L!v^1eY@mO{m%3sVEOH?>ek0Odct&IRs^*nkP z+YKFg^>j{*d%7}Zbf1G$^AcqFKp!cG@pZSWV53Mp)ax>|Tw<($xyHQH^VLhWG(wpF zvhH-I+F`r>R@5A(t4JvBh`OVol!f8Ra-5zC$m&$B2*T!aPaVwVMltkPy#kzOr~IikQ**_V3lSX0TC*E_OBOCbf!Z8~TvfekZ?6> zrY;uUOU)sZ_dTo1Q-O0$vY1cc&=@)mYmkdw6J9^UYR`Gk^X{O%dldDaL$-1A)|m<_ zdtHdwnH)WQ~!z;rJ@ynZ5pyxqC{N44$<;|5ry-7o_ z`0j6B8SswQlPd!be2HsEkwZAOGO*C`Ly6C+T*8CiEHz1`&T`k~E%5H&a<$v(f_T2Q zl0s=)S5lsbJi;)?Rv@q=D=|F47C(-&_ zE4!Ud?Nz~b95{n#F(0OBz2=Olg3M$*_ zDyf<@FrQvrnuY1gd}hrj#R@1T;uVY;0(dwx&ek=PlicNP!)GOxkYMAO2!> zGZq4~bha}H%(@_Q$d_VzmmLlx0t2eF5ldMU9AQq1m3*OIyjZL+`;f476eym`>@ru zfjz*nTg+fjN!|=}GX8^~1e-zTfe-kjN%)4@M*Y6Q5i=2p=D<$h&=^G?tPnl}AKuQ5 zU`$mU3_j!l;4+KTxk8z_uH(efo`&rNXb~+sq`AB_b>; z2n)d1owbcs&?1weW+8*+bf1 z%zof<*`@(p&068-%YoAEnDYLrAWKoJK`dVeid-My=yKi$_zAV*AJ+?hxE+&VA+W`< zl06MifZ^saV{R8f?GP_!=(ffR9aAVcZClOmqX|{h0_9&^on3GX+>-&Twfuv zo1r1`%H>){J22d2L49xx8CfchoyCJN0#5{j7t?&q>4W@={6iQG%Gxe5tnhd`!kij) zx}`2bZWR(?%ku#Lnmf1Jls46^JF6e}$0fph`#sS*Ft5%dDuAJ%SOD}+O^T!%!@u7H zm_WcaE)!<93nwFMMiub|`O32S6pH{69EIj`Gu~2Y#WH#h(;aR1g$QUjtanIWG=6$v zO0S{dutU{Wu=e>W$aS+t2W}+x1Cj}`VfmWsFtn`#nWlVRy`Vm3UJVp*7Bu*Wj|=G*8P7t%{AYpkBg;@d%9VEQ^^f*{r67*`;EZBr=9ugX&wM?^M zHnk8+NX+tJ62+cI&3@hYN9oD)B?9p!8kMlGj)c~ToP8NLygUxma7*yzZC}dvC2xw_ znO)G`a}};-qr_ZE;TQ0dh~m&guv+Y8p>$T+#r!fkGVU=%AdnJ3nov{XdLO_05FaGH zEMfXH9&)^q@TPb!54U>sPEt}oqpO--@ImD&?u5@)}<6H$3Fv;C-;L}NM23hZ^t!mPm<*JBzng<|QrB7<1W1$m&yXxrBx1pMXQY!UsN_RLm z$y(@vVv5_7b;$N)o%sh)(dtSc4XPIIK&Opb)z_Syf_@OY;`w@)kiw;$uRzt3HBH7o zNC9n(U&z|(7oB#L>%|5XFuE?9CqYqt?f|ADZ~<+^^x0)d&5;FdB0UaTTprIYE|1Ie z1Et~xBV6QQ`r(e66vrURaM|}OwQ3Wo&ad9Cc2#tN$mum$21|Jl(hRsX9T56$N{~7O zc6*E}>i|b>xV9F>%DUN)EdM5s&l=P~_9KxE!MZF_M~)=BSVt|hu?_>bI?FW)c%$9Z z!gJjo|7ThffOey?T(7FR9Tr4_T#PN7D@rlcy;@)E< z1LFR2x9szj*oWPD+R;>9*~s3T3*XAK-tXe!Z}4yz5BGBA_;sHB1`jXsK;JNNUQ!WW zU*IL#AQi~Pb=TuU;*oTD1bp>)tr0x^2|9k#M-|D#pGXZOUaJpeE7aXC@??GIWCjMZ}??7Zys4%j*w;7wH%LCcJ<%HOI7#ciM zbW7epgu-h;DOUjy7Zw(g%BoA}=Vh@vkLBl59_|}lxh$wqE`d{4N!cv< zXS50j2ioI&3EyDsjmL#r+R6cCtG{;nbk#O5uwX)R^=fWuPL;4`TJQEvMqrQn7P8MN zOp#`fZACKyHRT!H^IqU#oKJ@jAD>iGiwOfN=YMOD5Go49AV=c0|@}Ib_(C#*lb(t2T6>w;CUQuL*)y8 zh2Jl-p=|LAK$m=8s-|~vD_Z9#aqknXGl7#>ysRkrJ9;O0))#)VFsu-gYqzvIA&6lDLof%U@|O2evhe!5d^pwZRHe zl>C70@nmDrhll=hH-;>)EsEqd;wRYajNQS8&;P`JWRz&~F+Jl+49_nWVT}_yefYRp zvq4`=)yjEVy2jEIiqQI&MoW!F{R^sIhG!d%Alh;(;+Z7Ks~2aBB^Y{PefQv$L}OqD zA!SJYkM>|?3o!PrDJ_B<=}oUr0jNH?Vmqz7G30lew5??V*;&u=Hxr2S{d%I|nLeTr zGoCiV#`*M_Q^(Lr%AP_$IxbZOF)~qFT39MC@~_-AE@8Ht)^6I3d*|!*#oG9zj~c54 zy6#a;w`z~RSau)vegTlS!ma<>! zF|01|w!cOsiZ{-helcI$VgkLy*0*0E!38OykG_Whf@pANW^xP*pGXP2I3r|g|Nre> zU2I%O72dmlws+Ug+DV+Gahgr@L+mDL(@K$W(vsk`Ng=UP5+u4pY_?h3@lWh9yKa)D zX`t>;3L=422muNtg$F7j1VTbW;sx;lFOhge`v|W{JcE$n`_9b0GxzRY+bN0oQEYiU zclPf5&zW<+Ip<8wvVfOH%5FIIsWyHZG!y0ycA)JGC{qN{gcY zd0>gYo6x#BcC6E29_NIPX+()fYyEizcYg1)`PJmTs8I^+*7}tF7y|NW|xB5F10c>zHmlqA3^)3e)w#V?*KxXM=baZ77kf2k`R3}iZhU$ zLdGs!5N!eFF~6p#=7AW8uPnwLIi*?7g=ME56htlRMK~I5)~>+ZNx0(4j877rSz!5W zzge<=$nZNw+93z{&Xw9)Q>k63IB$Gt{6^m7G7fL#f*$-LAOoA5n=Bb{au9>E1N{0w z5rmB1Nawgej*-pWh)4iq!X+?y>({+nig2XjPOef60C2WdB!jd+up-PXv7wM`Zn0G% z?8*;#dsh0&z7l@~{AdTi92OfE5~@-6Or>K#75$KVzpStX~x zEc`>k{T0@A2O_{pO7Lrw?MwB+w@uPp*JIEU{^vz&>47aG>Yu~Qp&z#NFuU!Kh^zwN z&{wA=Yx!CMC`J}YL?3*lm}}E;5gDK4(zG(KP~($e8|9vf9FPq@`^ZKfDVrq4M>Yyb z8IlxwsG&caUZiZ56yHNlA5wI_z&8xmv4a=~kPYA)s8bP`3dVes{l75gUqHq zWNaZ+VgM;Xnw*F`CFsyJ&7|T>nnexesp+m{DBeqa0^a6WMP3QKm2}E1*upyVxB7Ub zO#mTt9UhfXJPMKvj7zl*k$c8-ryHT zUeuS6Rlo`RI|KiZk<5v_Drif?U@d~F7@P%?ETq-Do^~3qpq-t-9WhestH?n!w5$n) zPi+iek#?##kmitSIj19dvL4`k0G{+gDs8TJ>um9pCSJzgd6uP2BM7-QB!^3o0Il%q zd{cON_y@h4yq>6_?srnS8OuW)+Tw_#1&C+Fw%VM1A~ib&7x~ms$7k8=*a>l>iSN&J z&2-Nu)fX7UCq45Uk$X-#msn_e=@fsd^#D}XPps_k}{1T#=8fZ zBBfpi-iim-S{eCXY=2czn*%{@;2y+n***&3Y6(qi>nWt^c}8kt5Vha6ZD^ekHK|V^ z=Kqg@Y6pYv>TV8%x=V1irbQ!{c*;;wsgS9FWTECjqrX zjN4;r6?w=0|ykaL;gouz3I_L8Jzv#>3k)m+ctO)?934WdbvDK@ zXnAzdVzUnqv=c~?gqKyZ2;Lc-Ad`tuUj=O_7k&GW30QSpfnl2EipvFe$Z%#j!EfDU z@GS-r?tyUDDF~rv^)>ByVv5X&Gk>7gKwWq0MzBA`fSacNMk_*Ir!E7gpT?)LMZp#V zt|lkuT;I7LS(S}d^A-K1v^G7qaVR3lz9t&T`8l@5$etn~#O!pfjJ)+mK)`z=o4$O! zGJ;9rLcNXdwlHQCwB(+uK}&%zIn?UAOtW)9Vj`@J;M2blxg-+-60%VGi8We>4S z(efg0NnhL4`06U|6!`8OUJw0n13%2UKmjp?U2fwYQ#7)!b-_zBjHaOhm9FJ#dEkPD zS}$-xC{f6h*3HUJbk&OT++Q0IRIwW=`u(-Fb&}G96c|(^hr!wgNy$OSY9lbr$ACS; zyEe+mqf}s*cot2pazPXhwyP&m!Rk*icSGo-L6iMc4&TX06~0;JNQquSIV;R5hGkDG6B8myYtN%ILzFIZl*JUW0y(oJhc?zo8bP>L7DkAZdNTg@pkX9-}I1 zOzvWUZ&n40qkj{=w*+bpEFpzW*{P%*E)rjcI}5 z3_gv3kA7?T#Z|XQ{9$Wv0eWI{X^4(7l<$i}An@ly9}PP(nmY3o{=4(Q=!mUs`hPsqeuv>g_IwcbReV z`Pxj2PEwX?AQMI%Ded@pm8P+)VkH|Q3%?BZsZKT5_(B^?fI+x#pz2pnVO!(6$%U(y zP(oX&WJJce`Sc+|MkJ(NG1eyXb^;V)78XhI^!z?>RNV0)+OjgTbfAIOp$B<(`0Joi zspiI*MoAWJ4IvC74H+>F5t)9_U`Gj2o8yotF!Yq{F%@o8uFo_-Q-hwT9BHF41#3xq4B{*_&7=OcRUz&!YyU_{Ox-LFr za>^<@?3<^v42PFTk83kW>tcSd{RxVDq`%?F*kHnV8pM9ds_2J=CvZ49TYKSoW)L}?6+T3}`$E*eI=N@ zwpen4Dg4P6`z9g{InY{4(m0%;IRNw_cng!;d?h7~lzokilafWs;YOE}(v6hQguc~- zlv*R_ypu=DYmI_V;S~V9FWB;&y=oI`qn!!A%h(PE?=#rR;O7i@T&`vqyvUK<#aNB8 zVZ=ZyZZrNKQ^QoEHK-XDUt7O22@g>V>dN2PtK^9ja5JBS(QwRPQhgt}hB}cQ7_iib z@W5Nbm%PuT6M0p->Bh&=AxSn;QrL}8qZ@S!;O21ivr>v~zNl|gp-O$5?HNG~daTm6 zuXJi)G1{~|Oy#u#I?i5Avy$pgTvGy;>*?60pgAf0r6*IfS+zUb1fxYSIqT{dP)4g) zyF)Wp>8(7SoSFyq1e^8)wj?r2o6H-~#Puhz8L0Jajg}?~u=?os)DIt8OE}!NCF(98 zKVZhTzG-+^I&d33p;^`P1 zJ}R}K>Z*hXb%2boTipdCFv$Jjp@h;`N{7(2{BHh?3HeG);rDDs$t zAe6h{I*5)k#J{B9O0z12HkJpdVQs$RUsiLJnGK9%u|+;04K1&AFIDxwB1H5c+b$%h z$(YdDPc!xctN0DZNMaSqV0n%1^16STpkCxh#~2((P|lyU5`H;9wm?3l!M#&$=hypA zscG1X``3^Pebc*_tUQt^S>1|@#32zvEKZ?-R`(&?2(>sj@jPBg)Zamn-dIQ;$0ds0 zAa+G>NEA+}bYgy!={&5T0Pyp-h+l^O6A22RcIV&>B2~-`T}#;C1N diff --git a/.venv/Lib/site-packages/discord/__pycache__/client.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/client.cpython-38.pyc deleted file mode 100644 index 7eb2bff51f02e6a5deee9c486ef343c19a9855c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62844 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/colour.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/colour.cpython-38.pyc deleted file mode 100644 index 5ca12c370807c5a6c0a49c4c0e3c2c7c9f4e6f8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14961 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/context_managers.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/context_managers.cpython-38.pyc deleted file mode 100644 index 1b3dce78878bbe3fdcc914711171fe5f1bbc2154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3621 zcmZu!-E!N;6$U`?52C0aJGSE{?bc~CW`~iJwz=_iGNC9)!jvL4BxOgmTolBvM93t- zEI`ZRC|Ak!u5aKA>C(^9m+0WOSAKmkkAv`uYp^ zze|epKO$~EI*9MF9{vjxuJjbHa&4%Nw4SEYJTuJnGWgYp`Y7AWj&i-+DBsJE3cbRp z*ej}v$jX26EYA&%(Nb?|RO*$IbNS)&sN5@Ky~qnAIN@Z&e0k`N zyi|ih#}ofUvV0Q41G2NqMgjMZ=~pCfjVJw~7Y?e7dnCF)iLf&yW&&r`fFDl+$wDz4 zk^~QSC%#@=S516{7GMMYGl&wsXMCn4jkCt7c;=1*Ygcx&E0`_ zlYST>@E))q2Qtz3p_?1fziYBiYrFfr);5{dVf*dYGi%G-VvlMa(2uI@xz*im9dsFX zv}?`oA!}{3TJw${L#+q4>1_poYgTiqsPvTX>hvHe=RYt;`LwKm&7Xz#Z=Ce&|1 zY}0CPx1q({Gn?HFXa$d%&p@!wZmrQERYvUq*0-Uj&FZcF!?v}v+hx10#+C`@rU}bx zn+-En1*htbnzdJDTeZE~4q4Y`El6n_v@NxcJ>NBnMfz&^t9PwdliaAcn%y?YD!goW z7e}949ka@6ZL0%QjqP>|;t5WiAk3O{u4$%H20H6Q5&}0~1L< zEj!`4?|Q+;_9U7}5$nys7f_Hnou(unfka~cYGHYUvN`O08ljN zdn&42g_?JYypNw>|51N>bP%F69t|cZfjrt0;j1VZAN7NXiP3l%c#Kb2glTxR@mlz= zj~ZV8DD)!n)fiX+v+xK7$PFZaf*T)+H<3MZeDGzsF+Pt!v7-bTn*#{j#pNXk$A=CtPy4K zB~V$kBBGXg8B}hzw!&9Iij-`0A7)Qie~jtmZ4lyjN}Ri z%9hb}w#YT`Tn)qgp*g)tL?2>up`I$I>V;yf7c^>I!I+`=$#pCvf;k&CEJC&ngJ3M_ zOq@seN-|H2byV=LPhlQL^-{Z1EF{~mqLbOmPjF&xct(DX6REu=`$RS<42H%i!>z>>)^fAt-wJf^!}W!Gcn*e4vR!7fk<7tRIe6hYx0la$3@$A&KwFfVwfQN0jLx? z6K_cJ6m_~fhjV`JmSPI{BIw_N_!yR_nV+;szsz#=8qW(2_~w3I;QQkPLb#$e-_uR4 zh3B8TU$9(%RPmt)@%N%y*uaqmgqXlpZm&M4qQg3F_(nlR6r{rfC;w4uK++#a( z!dLQ7#L;OQuQ{CGE`UkB`)JA;h&8@8g|zK`NLcuOPhD51Yu9m|?U}C6TiXk)i5HvZ z%a_yAf(LSXe?i@9VJ}g53TPb!w1_j9#l>jeP@#V(6yI(azD{ZCer~Ns7w~&FET5f=bejkU1Li7~+i6che?9r8v$K=%K`a zY)ZVm>4aj@pCwfS(uGzD`P3KF4)hVLvV=ubn8Iteq;H(lvM38F{1^PUEdn=MdgHC6qkPmkhVn5fpGEn&a{}cPQhovDlg=rWPf6KE`Ly#K%Fh9+6HaPHn>bUN0%EMy zE!Vz2ziKa3%5L3v?ei#1Sk_FVx$9N#Yz6lD@`U}`#aG|B(DYp2tq1mUso4x#mbK)1 zwTkao8g;wk+gq;ZZtU83yiz@Iok@Gsb6vZ!X_vQ3-W_++4jOi;zH2vK&&Lamji6Mi zSL%1{l2yh~Y#D5!8^5s`JScfC8asB$_Z#I(3H{klqr6kY=%s+;ZC0wTZ=VkU`?;0q zjdK%|76x(LQq`{1(VJ_>kL(APV5_kc*qA}!Rm$vR5{=5$9fvT)kE@khMU7zbb(z0U z$aj3qfN)OQwT4sK^Yy1JS?kh9)T&00{H+pT-*6*@VcbgHVpTjH%x-7H z53ukR;J(@LWW3&K<}m)XIeTUC>gs#b%X9YpioLYFcyoSsZq`0Gy@K+&N&CI|)oY74 zR&BIcp3bk{vKOz~)A?KWyYuD+Xp1;1dFh7U7`TWenjoJD9JNDan zFTV&%o(Bn|)73?r14doV&#kbt>vPL9*UE-zqfNEV`UPSjqC*B~= z@_a8pr+Oi(1wqM*pa~In1Cvf*nVp+nKwns%d{^U~^#>HO6M8sQs)JC3Fa7+)V3?Y& z?}p|qxGXdmz!c%YbqEa5VwhcQk}^uwFuUY6f=0Pf4M$dQEzK2YuFcJ0iQfqaR(G53 z&5{?UZ`9HB4`9oMVuj$3sg7 z$0Q!^wnjPC55W9De0_I~pjAt|u2(iX;9{Pj%@DLPWcIXe?Gt@Zf2?Cu&{ni3dVazP zv&Eu=-ipOAv(t1S_)up;bZmNu@y-*?JC3hUS7)Yf-|!(wZ*T3~X?VA1UH@*-Xx`pv z1h!jiRvQ)D*|7s;{oA?wZvFo4h04ZlzY@3?nx*pH(jC{o4RKX&c+M*>vFPWTyBr%5 z8Dmdi3}1lPTSwXx&Bf2dRHYs~!CH8308v!t8pVIi^HrHAcjbUH)gS3Anm3Lj=98+r zb?*rBPjv4XzGO}+Ie}t0P%NTFu{eoB490jD81gtw0p(p|bKEpOGWJ)Har93#$8b^~ z2@IbYkF{Ct5itHCw)#E&x3GZJLAF2 zcig)Bu<2d7$T2fAct*3d)>pdb?YT{_Sj=6nHp-={e8E>_U$qF$e4{ReSqcKrdk#(akvefH%fOyU z-m>^IXat9M0Z)3N7%CR;xDX`)rulU|kC*>=dwQV4q)C`*Y;e~L&5cH*`osv+4Qze~ zfW##gkjO%yNN|yR6C|Dv4;Q7gtBpqBdLjou9f_qoW#L+A2JXWk%vPX)6nDI8{)y=k zKi)T(d=p7{s95aSIzWK^CU_Ywr|}V*wDhd*vF2dt$@iZHJ!X@}EHaqIKsXl7qT*H^ znS}QyUJp&KM3}x`s_wWRSu)I2>eWi!&3kX5)ECaT@n8-g;aVP-}42OeF?ngv+$67#CuZ5W{m#Tc2eo%3OtPR!CAWx@u7N-Y4L`0Nm?9FT71L#CR&_8i*HFEQ_e3)i<79iEH!UBSES|?YQ8Ns zZ#mOab6OyL8{^DGFwTB#I&;od!1!DQ<2%kZ^nV8L&da;M=)5cMKJP3z*MaXD{5yfR zdAzykEaA#B1Dz1mo_5$7hxf6sXzC2VunK5mIgaaK;;-c{wrAZv^h5j2H|^c_Q+6=J zdHI}G@Sve^fC1r*ajBm?`)F5zBew)+5pkHf;P%u%tKcpRQ-Z93Y2Q7iQN#c%CjBIs++1mBJ2g`Xa-pi+Yiv{Y;M z8It}6KF`IO^OGr%g!no8b3)sR9pV{E)umCitH| zV>my_1C2UZIb!*^vxIDu_h?m%Y!q`CtW|ScU|Ka8TuY#qj!B9;>4TUvl^1D!GT{uU z$?I#~(^Xvn8mEV2?dfU-!c8R7`Z}9=5GWAM58&f%&-HUK&BREU7SSL|CQK*VXjU;< zEciqeG{|g<$rWabl^Ps5Y_+vh+W=0hsH5WA2nUPM|3rsH`;zF2e34d;9}acUdA?wh z(_sl^qW;q|9d8l3o<|j1Y32pw!odWb)|o`qDYOE6llF|Dd~L1OHU#Mp^QQ1}>$&8O zc>NM8TT47I187OZ1Nx;h)qe$w1}Vzh zs_k0=YUy;6cG|WnJ=~O9Xq!>nl+;$GHYK&Gy#c9f?G2z!Ch=QL40s;^l73k6Uf_c@ zBokTX&61Y44{FYq9rmNx@HF`U6+ZrHB--$}o>Bh{OCL@?S-mwnCpu8vE{{EV3S@X_pPpWp+B7`<9Ly`+zUV_=mf==D-cNy&^#aGc>; zIx402jBR+mus-hx8RmgUzHb2MtgTBeac*FJjBUJ!+K;3*Ew$;^(O>{;oH+#(_j_!Y zeNU?&HML;yuI2q39ey<(7E0ZCUqegllOeRto&wBhIo#3m_d8oUgR|P&4b^w!ai7o<|FD)qS%TW1f@$3Z{(DvL(#g`*b$vz zv%;McCs;VXK^jn3h~ z02o6CVv?s28hzuB;iI3>TQA3k5iATI{52k6x#9!b*f4^Fd9YX%y&ZnLDtZbBf`-h& zdmg185f_^5;!`|O?op$q4p4He_D-R`3(PJ#_3!Xh9U?R>2QppqM)NrHC$tas0K0)> z+|eGT!1FdG8Ct;Ue+sUC$(hWZ(7u7T_s+LQF=f+9Lnfpk6HY=Vq=U?+0a??Gr9yr5 zeY%IS&pgukR?EUW10q8xm(pnaang1?Y75T?$6@{=BP4{2VAhYnm>2@nq)=-M_`VVgTJ zcV6tq+t@+3v-k|+L;MZlGrT$6J_s5KQ!r%}9>o18EGN6CgU*G;)r{6z++^Z1**@_!!Y%}|Ng}IaeG%)uX(Sc=Y8iHDOAe5e+L=NTOA(!Hs%C+ zo1I~_2&J%{?r(@{3)Zw&5n6>Y@Rx&pC z0?|yf-k1Y1TGZ-S0&sp{JTkm<&^lN%DK#n7Oa-75M~8mH`lA7~Bdk+;JA)I%)b}B0 zeid`T49vV&M9;0S&xuw58zVA}a|#;_T7jw!bDI7M8__24UzA9;0pc<@fgnne3pVs7l?#$*-fr&inuZQt;|0-PGq;IrOYXsM~kB8!1>v;K0lR+nV0 zOsqf}C%53l?E$O+&To?yNab6TZRGb_#0loxSkJ~-hh!(Oh1uA`2{S>fQr~QZ793cS zbt+1N_mHSamcZL(u?P1=%DZjcgRA6B32R`e6EHkW{+Q>cDI$vddZ2;yz!()U21V|K z(fYk)U$4i`uqB=st*^r&$w(i#GvRK8R>>nhs%QbMdbp7iU2X*dT~qMjZNXLN29Y7U zF3z21?D3H^GoOArQCmx8IBYumfCGSoP(u=jn)u=B4O`yhBLb&aPGu%R5Foj=as<}37lXiW?|*bA)1g#fS`7JYx~UJMb+Igw370XwDHT zR0pDX3ElCGS_~0U)Y#)D4lV1!1wYuWx(U|cGLvY#j^3Y9xu;^$R_^JdO*-XrthOnJ zEpv7sx8%jwzq!vZ$#>)9si$<`;rEIV#}{+bP8LUq(=jj1iL-E5zDrCUU}`y4VYC|2uQWc=z-N6#ec zD9mJ`IKB0+XR0o26GdG(qKI(^fkYz|##je2e6gg4gNHun5`t1BF)BUGtl$0+jwly> zBye_#K}I`hS%Vma8XH9^<+|FbQ|p+U*`E2QNXZgh12}(TSd;iMqf>*vf>P|sesVH# ze7byJ-Ibe!%1Vw7hT1>z@uRxzNii1gj76UnSPgsg5W zirl{AExD(is_t$Y?dUx%rM82(e)=8#CRgjg9leC7|DCHP5@ICY(Petxbv*pMtJ3;! z&$uM9&%WQP(7=!|hYn>*&QEG`ISJ<_%Ep8P1WFa~&e+X$9LM6kB+{yWrZ{}>GjX_q zr~fCx;b81sj3?;PVez@q_^g(@I`HU+#2(9CHT)a5-08(WnEc9k`oj*?MQ%X_YphXz zn_bW%pD^1&nPSLy8}DpFFA=|IAVPfFW)6M&u@VU*UCtt3Mx8R(apDPc9jBf!;-^px z#|eyhTos6n_;e`^&PX=02-{!oF7}KY4te4!RyLc&aUE)EeQo(ZAx7LOpT47Y>atP) z$zJ>U9RU&Yzbr?9&|Y2{IV4GtCv{?VPGc%>0LU&nxD=x8QIW+Zpk`r!s^m(LHm)?| zer^HPbf4%*jHz=NEjFU$^!!=f0x>54R=5Q^6)@mb1coRZeJs$#Eud!b0SB{|(AIX82lTt^G;#D}2ChLIx1PhmZjY zEflS%uS-GB^qwNX5!$IjdH$y5cNg&i+ah4$1k?SaDBOWnzBY{GSP`+mZrsB?5z!1M zbaffU@Loc*Pf(1 zp`hvX+kY_|jZFIU>@#vq@RXfQ9VLL%h{*#-c=h6IulM&#i@&%%29Jf?jyZ02?{&mw zt7Y?XxxDHy5*NpHP2T=wJTY$!wH5s*DMengFOb?md9rCRNFdDMimY3AJW9Lhq`xC@ zfQ0G=OnSDF!9*H-i-azA)?tI;V}G5=7&z-k2uTtclC(u^3T^>9?!(?8y3RaP7%ziQ zLi*QG*fSN;BZYn>q@Qk$N2IUsr61!L6*`Fj?TGl(eTcsbi0AQ(1GpfW(Eo-DeF`eQ z?ISk40^|~p0F*}@31j^2;E1*Z0eF>g^H+1Pwf(Qp$S^XyHnA}bHBpO5Yczip20+lb z5CG%=6*%Vw+Byh4dFOL#dIz#czgTj@^LLm5z3+g2yO~bmQJC&YMyYN81dV#xq95lS zQtzs*xL68qCj57-&41&H|Bk7Rtmloc{S+HPo6&M8NT3p8vmQek0Yfo(kwHr56+>~i zEk&JFd?tx?%v~7j?GS=8d*vud64$Jc>=J^5FMs&kLMm~)qthS|Yl;=8| zLF1Iw?~;O83UP-fakF3J;tcb6cTazlOT!p4#C=E%S#oT_cvZD9r4@{xtWC7fBM5Y# zjO!3F00Kon>ldIMyl`lS=xdd9;_`vQfJUr4Fr2951M zkRZO~@)Yskjr)V~{*#?7WAzbFfO}VMX~;pbZQ`bfTg4p%_*7$!2R|7j)5H(Nbc#9_ z$5xV{K^ zPb4S>12SLvp7(Krus~?dbC;CR9#FBIMhhwTs0+iY6U7$aNx0%TgGd<<7;{Buvn2W^ z1;VF3Kt`IO+JBRrz<5e<0^%vt;DvLF7lPC#Ro{zBSOo}-V0?{IeFMaS!?S`&@XH$V z^s=PI^J3z=?Q8k3fbKefYKK3V6BA3P7J#1+;@$rau31e8s76v~;s+3fN=n?dz&*HC zc)@)LiXi=c#?BX!TvyLuq_q6PNk{!;QJZxBzml*|OHcTCxm5Apwiu1#-IK>{K1-@7 z+otgoSdolYLi+)(14Ulnj^L%%NyW~pO(e?kgIRan9+d+o0Jk|6DE4d2i5o=hg@4Lo zFJtq}Mf!#+^4nx=#z$$VxZNRQ+!zLf;|58z>2)@aeidRCG5lQ$39WEy{@{Au|3hTH zqisUphZ`jOU2r^qNClD6h&JU-5#AsH_cJ=0N(urj`49X)hF#F`uHxngVq?kO(Hm*J z!T9U=jjiO3D|jR2{mx!$+w}e!QbcEO4{T?h%=h$91|LJx@HTw?B%WB&6WkhUKLKn* z-oIyxmf6c1a>L&5F-3V$$|K(Iql}nY$CC1>_rFlaOq?NjdKoM?-1_QFeCeaDJw*Zs z3k@+;k{b=VE|dZ7A|Q_tWtUK3wAfmX0pX5@>n-|S!-M(sT?~R?MFa@*w`u;7aSG~# zs{0M`nm|RRHt5+*7%Idc1{%QCU!H(S$QwlbOQ;W1cir6%?ME&XSeJR#LcA&eB^L0! zFEFfGKf({nyr@*sC|1A2sgk^8!MHfTBJ@hF8n`rkZi9^L>GN+pl#xJOOI8)DLAGQ#8oCZkArwFjCn z`lcu>99G>H5u}KpIYjiEFPG&CL%eJ0=fplzVe-Gh9vGbD{Q{HAOx|X4l?jih~n=|?7xh}JUNU&ze$SWl$jYFH(`N{8Che@97~U7@G-{*{x9_N%zpp? diff --git a/.venv/Lib/site-packages/discord/__pycache__/emoji.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/emoji.cpython-38.pyc deleted file mode 100644 index 76a82b1ec2771cdc53d324edb467a4d1fedd9d48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9521 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 DF_?oJ diff --git a/.venv/Lib/site-packages/discord/__pycache__/enums.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/enums.cpython-38.pyc deleted file mode 100644 index 4a147c12ebedf51116a7eead7afeeae5e0a7f1e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22371 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 JERz^X{9mv{74rZ9 diff --git a/.venv/Lib/site-packages/discord/__pycache__/errors.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/errors.cpython-38.pyc deleted file mode 100644 index aa2c743bae9a9ca30298c553d54982ea9828d504..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9933 zcmb_i-ESMmcHdntDTU`l*vVM7W7Air72mkGR|ta85^b}QDP4++V_qB7iZhhf zUhdMfOUdG;+6M@$&e1PQypvIN$u=Nlp7NY7BqUXnc<6{#UxDajmX#og0qcHtL2> z_bDgUHtS|PT~D_&^-O!DKGM$Cv+dFPXggQW>6#dk4#t_zq4rpPtUX>ISMQ~r!|fyW zBY2(@W8z55IIYzuc!rNSN888h$1o;af9JNwM|tjRjpxMiXQ}$TXdmKZXpf0^(LRCp zI6sW`Vbwm#f5j*GQGSfS^L>gR=kI=M*FmCzlZjF{C%|F z7pFnuY56H@#?-W2ZC$XtXib7uLz*R(CrW87IZ@R1TAHVL8lpK~1pa5!(q1ftlR~_45pJLo5(yQG7BYo;r;+)EX zk87S}zHl6(U}N2i*PYc(DPA!PWP|x*5vh4M*S$7zk{fUW5w*I~#gq^VvFkx(YQ{&R z8BhI{) zlT++oxprq^xyCS}TCCLWvxQr%Sh>%>C|BmDSm~?9YH4XHw@_u}yNmPX68g%O+4<$U za^*I=iT5fC(Bv{y7({Cej3$gpl}k%R>~5(#dk2(@H_P+o+Wo2At#Yjbn(P*c7TIF4 zS}V^k&ljs~ak;v_>Z_Qi z%4Qc9?^nyW@6_0xh55M>I&YS+vf|D8QZyBqnw>9}?@qC~;@#qHT3wYbfJ!w-!=lx( zdv{9IMe`N$Z?;xms1O^o3zb?G%_(qMtqoqiS6(Vjv0}Bngr(+gRTn^>#ECaZW)*s` zQi`aMsFi>QJAxr3uw^hkSj$|gI1gIbp31Jlh1`z>*?B!YWVuijWtV<_BsAw>U!ge< za|p8w9a06$3CC;q7fX%VJEd9dMFvM zQTv`)UGkcb#oz(v%qD|=gojXzCyspc`@jJEJ;?DC!RXm?3KoC3}z2(VOn{(lY*})6P;z^c-+z_%Pr6%vCC?5yMYpn7^y+8aQ!HNk25Zs1qNlddiC==cyn z5wBeECP{qwL(G3pj&cGwLaXa=mIl}BDQ*DZQ}PJ9d*9r&0P7-=1Zz5gRUm{U$RZ&X zI$OCM!>3Hx>1;8-Bdo^&4}dlyLeuLyob118b;%(BW7dIc4uQtj4q=~3%LZFOeg#^1 z)3H~jCASKSdgTW*%r+XX)fSCLm}@kEq+N&Z#~O_%UCW7|j5Hbm`$ppjO`gO0)#az! z?978@AHL(kdUwr}59WmbIPf|TR=t3UcE|B-#=9)Qt^c5~A>54z^Y-ckADefzV>KUJ zYr=mJvwKa@PWj+k$>#><@ZkuxtZt@N&s&R`q~H68f$BhNR&Z$`j?H!9LQ>2FvPRx3 z_D(ZuCuUY6&0JwED2fl1q^+o}!`CwMgIyn@!KToL4K@+Z0drs*IvwGXckGJTO-X=r zryIl~muC_Q?#NOie~@-c8jE5cXzkK=~x z+j^iq)1K>n{e_MIPQxmUN^ctS8%zLwg%>2#Qw}pydbVl#j3!dE6aYVIzl$9r6-8hY zG#cnK;k8@gNL%)vtMSvipN%BlSBe)sGca~)P95-v)w$ay~YcI4p?cv`(Ft$_MW?z>V z`a0K7YW>tn%{BU|?R22`&A@nO$iL~0^-YeTdOLGZb1$1(kb0bxEnTC(zVX})(tWd^ zer6C&+O7NAlW)JGCz*blr=E{+lc&Gd`k6WH8FsT}(3mG<(eu8Uv;(7WJkznynM$Y^ z!jVQ~&p+vGpRQ0M;S)da;ij)WJhlxzc@8b%`U~Srtm=soBjraJAb*8R1>PmKCIalf zQJ4<(r+W-19Q||+Cik=>KdTdULJm_iwBARJmSY7#@n}5_jvXm{>Ud4d@jojJUdm^~ zG*GGShdJA~U5c8TA~b1qnEgU*MQ$V`o`Mn&-#LJ2m{C^GL-UbmyZI4$mDXOM%WrTA z^~a&UQ6F)|W&?XIKc)u*AdU3sQ}iw1>z}}dG(&OO| zaf^@cU&eJ94hRak`MsfFAAly?hp5p-u-+y|>WgUgH2sj1g|2u6eb#_hEDOJoL_908hX|k|J1oM$ck@G! z6JC^o6xeLy$Kj0NC<8cpNYY)4d<8Ty==wVpZ8z9WF&Y3U% za2SIR0UdqOr~Choo4(%H8n`~9Uwi>p_!7(nDZtua6Le7p;sxNakyb6}`U?P}x=+8* z0gNV|W%{Q4%V4B$K0^=BJkRnGo&}(p&qoPF3DmaJ{S?mtKGXPWjog!O`ziW$C;CR` z?>JG(aWxMg-OdDu`r4!1GhO~uKf`ms0k8&RaCYPU%=5!|0t%1PG~z{S;QS6%LX$Q@ zlHXL!D_9FN5lV)7ZXZgLa1=@s8UQ5^ZzGQE>nF4rAqi`Z-YAs!BJ|^;Ur}(9H{>T6 zAL_wgbon!M{}s_3U}Jt)Xg%T zBJ~krCBe{Kg~7@>wCf}5!s)cSPMB)719^#tC~%#mJE8(fY6>1TJ)hL zHF?}&sLsfDF!+^FO?Ik+xM4u}5!O}TvTTktFw~bgAaHMdAUS3&2e*-bIP<5F`Ol)O^bu5W2f~X;sPEa=vqXz+W z1l1Jc#gQlP656pf$6H02Vn8QFgHG?BI zDNYJVdMlV<$EX2Q%9vH} z0p|Jwqm>S03zAq)ZMRCXh>ZP=^^74F;*6@$`CYX|z)brM?y!&%l`Q(>nh1T%TyI7%~w`PUB zVegyQ?ux~3Oiu$%+%xzwv)uxbeE3qjmnv5W6FidfuAdlf>@o z%h(-c?Quzm2^VD{s=4{B>pph9%_t;>Z?K~Z7~?2`MYW(f>Wg6F6*@>u_}3v$Oi4X& z&B-a^X574wdRqgXy}eLZ^hTvJR>l;33=cx&%0?xMjCHlFB)(3Gaov z9m?LQ>Z1%!!Mz6{l?*2%&4}S$@$4(Or)B@!5cg?GJ^Q#P{KQB1r*Yly)hUO@U*`Li z^6wOY9v(`?M&)U|W^DqJUMrxaKob{F;F93Sm0+5xeyJ)qQGgb^kf>4^mv5pPAsrS# zOHc!LPzO|Rzub>S#9y64sJVA#A)8_q$3!R)NAiwVwBrHyrAE;J_;PQ1L%5xOl1Z)il)Bb1<5{7i;$3NktvV`8~60uF3^iHxt;XUDoj>%X) zQ_m^x8Y<10#r#xHqA*?l4vit#Yeuejk$Tl58hlX9{GaIev$$xf2_r*}`1I_aV)+|* zW76#ZAWCsqJg#(op8@^6u$U@H)_=c^*&zCh0~U%pJA+ccG6>ZAl?LIwFo_>kH4cn((orI*{#7=EikF;ODM!Q# zZP8wZM~LbM`<_PU$4&9F=W&@8dZoy%yb)R?X7Y>MsiXoKY?TyuV1BqKvr{IBU)`rd zZWP3#6m3L-EDR6H^T5E2iuF6_&A_rQsuI#GRRcm-)qNb)MqrAh0wqV_h)r7(ZR0^& zf}>ZlZx<$dc#!PUpokD{tpi$ zs6hg5{K?4lCSQ6A_Xe0lu<$=bGRB+n9 z`v`M?1H~oX$|jVMx{gcgq2Pp0LGtG%!w;R(wz@bf!YQpJNrahTs{`AVBoawFFDV|C z6plzLs!HPA62=OJ&?DSCy3IsoY1U4Jvw85r8sD#okb*@*EAGq}j5cMhDTKK^mGr pg^PJ=OuvBY+=M=6(4Tp9VibSb-t|B1C+rsx7dx+M;;A-mmk%&vU4~ zl@&|Fr60dLy#2bS{ev3kuM8TWVLbBjz_p&nb#8e2*ytHLJ!ibk*zB3(Y%e>`^>X8U zFF!8y3Tn*smU>H=V|rH4;#r>amdC|j5o7t@3NP>_Zap*jGA}+gd#iUfzQR|ZYJByH z(YwUWj#j$lR838@x`%@8G`eit9ST1Z>?Rr|%UTb@6X_lt#_Z;>#6J4q!;f!;QbfX! zS=$N2_|&p?g&ez4G-kWWj2yRuwcZ7hmJfDWflj_@lRMNWP}C5 zAa-2e^$(b14WWu=#)l9S1*7z4{ zubn|~ER-+l_WD5#Q&SUY1C$ZzuFi&{LkG4G#4KRY>-rXT&E0`_lR*??<6Xo)45ZTc zvYQp?->S1tYqNW=)~>TghwZjopEow@8|+4{gZ7OwyVvM$wf4FUGupLg_daWFvRd;# z`&Fa4QD*gD@3!lmj@4?j#?J0`qmI5tbA5YnqtU#}?qFTBg-mWBg(0-tVx({;s!{Kd zu$_8)eG8IncN*J`?)|d0+2}SQlWjt1jqTRj-NyRfcCF2J_u9LyP95quAhy|PZnmMN zzEf{@E6|EQR{tCg*4e6UZ<8vkwg>Cm(9>q?t=;?W#@($h+iGoZ)X{mT4$EqHw(F@X zIJLfAYwVQSMs25dm#k~E7NoQ-nwDC}?rqhni}cm-zus-Mn&ifMtJ!U%S%#PG?qcb^ zMyFn8wRWQeQ?1Q*3*sr9SV1vs(z<3nl|rFb0b1+`rcl84;Pk?lje2bxvamhP3zI9> zcLZc5Jy~{qB#NrbsFY1IHUA_rH&A3rp%qdlI9`(NPC`#4**zca=68C!GQZR4kf9J_ zZla=-3`*#9P0jrRk7YIp0`Eb|ND5T&zB3j{PKp@$KO_x86bJWRF6`c!`o z1bv~)>r-GV*S<2|K<}64RG(@OGmi~?8zTcam}w@3&Tgx*U2ogp6|frSSjc7>M}!Nd zj4YxvDNuQbq2NhA3ImuUzt!Zc82P@vUfth|fNT4QlY>C+Z;0q&9EAIWAZB75dV$OM zgvEG__AAH2Ki=PV2m6s5i(8>HeCQmAXdmb?3?zS_{H%m0$*Qf?*)vr)p(jeI#MCW) zRWIlge4-8Uxp3vt`i#Qx2RsO^r-M`suJwd~f)+p*JdaP|nMp+PG~dgK zJdwpST@i)(MDG zCVz`x$LNpv+h`Yg27zXhJaGPot*Wumk=V{yNKk=7EvGK%hgo$)(`HSM3%C>R_BEM4$M9GoqOs#(Y>LO&38>TVFPgOIQT7Yq&I zGZ_jtOiey^9oFwtqu-|`ioqAkNEEpevG?TQJr;q@Jx<$1n{>_!n%4!BLi#)c+=(3` zZ$EN5(rrQ+McmZyQ*2LS5j9%<{!GTK-l~iE69T1aN22c?A~zv~Tyo;r86MJ^guHOr zY$>>5#5^&I*~E`RF?2^R9fxQ|6-#8b|65AO3Ppqh->22&#llzQAE(L~yFNJgEPfZ& zsObpE5U4~bTV->!U1Ss>@N+=Ym(O?4!yD%BWI4F-BpsWY1lcmr?i0@;SZ9iXGtiffV)ZFo=?z z9X#@dO!D^73jn3flA#vKYgl>uNm?i=BhZGG*|}o*0)+Dbr@5C4<-zI7A|hD&ATen# zOQyU6nF`a-R1ASh>N0RA48_SfrIWwnA=ajPtRERq47mYX$-K~rRGynJw5S|sIjH7O z1~>kkd7}Rw&r{9LVKn~&G-MZe2KOcZT5N%a%qIqo@~j%k(a2Og${j7^sR%qSJjI%$ zoV`2+VLdF!Z0lgJ-YOKZ3;r$Hy&pn8-6i<1rmYXPe5kz<*D%mBarjze8 zzlPO+ndTm6rlkM%sfqg)t^tLYo2NxeKsHdY!cN}?uthP|QY6Gf!diuigcsD6YF!wn~1uU zfmFMmm@$sw@(rk#Z{n7igf~exO}e+Jdzrcoq@)=FjFT*C!;O>tfxrnTmWp)cRhqa& zH%e@kqsVy^NBq$bC0C-`y|sBQ%o+V$gwo*5gV2V^i1=PB6!kUys9+Y&s0tpvRNwis%-s`ksR0BvgO|Bt*wIls1HjloMAjaw6 z=j1~GQe|`CP&7f{lmZ5OL?DfGUEnAx#>hr`im5E1OrbyU4gbWi2cQsz>v&^~fkPt) zl&W5I`u$N@QE=F2;3c3Q^?(W7ls*Z30kNP|uoJK}eZRw;Ig0l25{Flknaufn&}@Oy zduEkfh4*uWq0RhOm+#~2r9Dv?af1Gc!lvbBfu5^O%x2&V98R;xlx1na)l8a=i=GKr zRKRJIshVe1N+^LE?`ZOE4B(7Or@1t-D5qeYGU#X2ONY$#MnaTTzr#anmC>csGv)s2 zS_+e{A1@Bh@?%yekA!g zusN*!8j~Vgsu_lE{yUeobjwJAyfT|o(wn7~q+r`rMz)<;wv7|h#G~h;ZGSm&yxB>N$-P6sem6Q0NIS0TPyqrCrm%~ diff --git a/.venv/Lib/site-packages/discord/__pycache__/flags.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/flags.cpython-38.pyc deleted file mode 100644 index 89fae899939b45726c1e7b42fbfa64e60d5500cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55475 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 R%aVQ+*D8K55A~(u{~yQnRTuyO diff --git a/.venv/Lib/site-packages/discord/__pycache__/gateway.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/gateway.cpython-38.pyc deleted file mode 100644 index 4fc6d2dad993649a3aff0916a2fbaec5e7ae5d3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29526 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ℑ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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/guild.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/guild.cpython-38.pyc deleted file mode 100644 index ef32504a5251f64dc296f3674ba2c83039f08763..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126116 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/http.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/http.cpython-38.pyc deleted file mode 100644 index 352c2163684e38c1edee3fa60be358313660fdfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68501 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/integrations.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/integrations.cpython-38.pyc deleted file mode 100644 index d3bfc01ca473985d5083cf48e7dd70b8961c3a46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13431 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 N!G9Cp--E;B{|`Z8YvTX_ diff --git a/.venv/Lib/site-packages/discord/__pycache__/invite.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/invite.cpython-38.pyc deleted file mode 100644 index 97775466f4db3a06728745fad1164b5ef3fee82a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18953 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 Qp}HxUsoCVz;?%?c0jWgN2LJ#7 diff --git a/.venv/Lib/site-packages/discord/__pycache__/member.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/member.cpython-38.pyc deleted file mode 100644 index c67ffecdf5a3e2a67d91fa5e28f915d65f0a34a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37264 zcmeHw33Oc7dEUI)F&HcaNsywpXKEoKL$Ijb3?&N$K@k!OG9ajBL}u_X?*SNa7Vy3q zQk;O=rO~+ZAq)S@&G)|kg=QL@OIz4^obV<@QCp|t*)23;vrg6XT zzi*oXxX6;7p3{Pyx7>H%UHHFtLIQur`FkqA^r=MR4|o&*%i`u4Ja=~{ z6A3#}O4x>-tQqxWDQWOJRZEppa!!}ha?X@8IHzmbdajg{JegX)-dF0Y7fOYCf2qG- zEEVemrGffjX|O(28mbSMhU;5OTk0dFk^0usR=?bBrR{ds&ecZiJ4!o{mbLS>o%P#F zx5;&1ZAX1qX_s6VYPZ+#DBV%Nvvgra%Pkn0__C+i<9eNe7< z*7n!Gu5_UOROuXW5|^{LV!N!wMMt{*NPmh0PV&!TrnxW?fLrA(owm-t9GnDTbh;YyKBemCrT&e+N^zjeXew}K3_UzB%H0zqt0VX$=ed8 z7oJVn@3VKmmaunUPL}3zcaME9?(W6ii#B>|-}h$HzTe*STDtU-^Aeu#wa4&$%-Oy= zv-+}g*X8tOqcmx!PA0}4u=b}DiNgGfV;-BCH;+~;PQ!J~y|@`G6sDSM7gcq6rDg7| zjF}HVwC}M8*OcQrjg~oQt*x~>g~AC()vK;sZ8prRYpyuTS-fa2E346R>~V8RIgZ&} zGAk>VT6V_GR@1Z^7tJ+Cxp<+u*s`jPYGc{73KdkvoUIiU<2ILC7cAuKY1sUHb2`(FrD%vf5jaoM@eMK#R4eIwnB=ufcY1Y}3Lf8|4XsN9l zs1iV7cbfp2)VS(YT1;WfmzuR&^8&k8X*TRC`|Iv6$XHv8&GU}*MGtSI*+Nrw6F30U z2tBI)BX`9@+ZP=lV5qm+C@?AL4tm#KbXyqsDqz3XR8n7WHz!d4k!kbf@x${kPR>o6 zGbhaxbH`tpIW&F9+&y^`_q)f<7iZ>=96vR0BFEh1?EK5-@x$ii?91l!GqZ=r&FPm; z%uSy>SvWpt&Kx^&bY>c9GqY1iPaT?>ebzjP_hyd+lV^a!D0Kd~$qN0VW~NWFuw&D6 zQ%6wpdN2hgF=+xBF$(dv0=Ap@Blh3ksbLMfBGFM#-FA;3hTGrWGQ0YnkHbZ2p2uv#sUMyuthv3@T#*|_NSO< zl#rXhxaPcIDKB%XfqZ{#=w@Wvt!m9h{h3MEby~Q{9h*5xIETtfBTnbyh3rZ6w(WZPmbzGW8tpo=3{BOl z;7-%8Rvc+PlCtPuv#oe_e38V7R|_vRL2P{A@v_I9`XX9n%p*%?vDt3exJaLLYD;Kw z-=SkuD}bz1^NR9Pc!#%_9sdq544n{W!~PtuS<3=}XWP}9jp~ZJRepQ7pRhogR_%oF z@rrY5%|<&=*Pw36i(ry0M%@jFdV{=Vl75JqMx|JNtKXeIk3NqXYMUN{zLSmSg{7Kx z)?vG*nrOWYuk;s5xnqv&qVc#)&oyfffiGo7P*HcGs0w~ve~?pJp*eyJCs8t>)Ff>K zN=y<8Ov+BbY1kPm9uR(cyYICu)S2MEVE029X6>RqfLw$25bkm!0EeYA>r0tLV$Sh} zn`>I;p{iSHDw|AS?QzZX95U18n1O|v_?rZR3#WJG_QBYnBtQf$?Kk&VYLH+17Z#h% z+JdC>-5Ids3W{>gDkYvHwNQRm+DZYMwTqNsOHKo97UGmSmN}XeQbHZ#Tj^@OKc^(Q4*_CZO_Wu3mzKKUPl1PWoS8b>HE?TmvnwDL$+?H+(3iF}aUL(S~ z@3?5!e-UV~q@Y{4YmRjmh5MMzJ{@lW2chDDp@|Lx%wLAWpqY^y%eYzRpU|CG&bc;J zEypgmnq{e@Y_;~A0cU?DpbavhR<#Zt-M?5k6H>|~5J)t^;2D%gt>dg%EjGMTU6Lk( zM3_aZFer@L->La2&<^sEfa=0%!-B)cQCpJ6L7umu1Zpj3VPUq}a26JP0tGCfjY7gf zd6Z6ZD1sNmGNIbmo5%-EZ^eRswdgp4|Bwa%b&x#t_N<+!=6#&{=I{S`sAmTK> znml><`CxnryB?n7k9=(OMDB)T7?(~9<00Dv(+|be!kK7T=P@9frTPU&<3xtr%?hEt zQicc!C(NFa5!M-w09YsosjG8VcTJjhpp+C`&<=>UT(!M4nUa?#_w)KfM(Fj+rRD_8 z4+bg3?B|h}Qh>gf^Sj|~5AiCF^jnBRWv$VBalr5IV$XB@W*RNbKT>Q;6nG_2n{xkK-9m-g>ca+mS%(sGye?=o_i^Y5~9m-p{-T{-iuzAFVu>AR}o+`rD6ivr=o zta=P>I;@_=Q9aJX6FeN?;ZYtQ!NJ?*<57e~k zS6H)@>y%lD`Z{JJ5~@iaIE4Ceh*!_x@NxWH>T?NWu;<^1(HV)4fW{3k1tPfyC098R zj*SolSp>%;hac)O+;6~z4ZK@TEG2C~W!1nrg>w?;G|nlUGdQPl&f=U|N-k$F8Fuap z%t+AcFq(%FmjTyHNxOjOxz+rq6LxMriDUm;8Q^eHLpTN+fo<69w+*waeF2rYY~Lu_ zx1KmNh#FDTXyS#0kvIn}^JL;$vXi;bed<0nE5N#z^pX<~c}A-TeqP^!W$10MuBoSg z0%Zx_ra_6F`{Ph6E9jc#^2C7}N!fjRB7Es>Q1?QEu{{kVlTrPnCoS#V4kYCk;tuE@D|%RfX|UG+q(JQZMr=!Z^7Sw4=&Dho4)- zA#bD~NDn2yye&IiyvbzXD6)4?2JF;p2}}smb_S|GrUOv*Gq?lt*o8M!cE4TZRKUsE z1Nb+H$-+?4ND;*G6&{|)p{pIYNNtMas^M@fyo#{p1k!#5zlglXdZBS$3R7Rt0*Py5xlP-AlF#RP zAgZeuc#x{2`iaKBh@U%%Lr6M*na+Z2HjImIiMKV5RlZdB(o{1cZnGN0v}}D2Wr|2k zv2^_L%pV$HxD&X5&<0kmC$AX3C{N0DQp9>nu2XWI7CcMO_KeF|M)zCpU5YV8#epGQ)NjYR`ud3z81wOmlUkrB$tKt(JgJ{>9PATfbI{%!1F;tEKHTz=hH zg@yuM#aKlr%e+Si%aGNpX`Jx`Z#HJfGUPlB=K|Qx0!r-dFf^J<%~e%CI>lgl9cVKz8Rh`eG zdgV$8oKo?#_yx=_na>RtMsi6*@yS?H)%d1BjSMFEBR%)w2k05@6nrC*C#| zU@=NTv~0>wwg!|z5WLPV>ITB+g$5dpqBIw3AMajAw}?n+P_RUxUe)8y(dIkg z_g3vc;l>pTFgj1dVg_SrLjxjI3v^D{C70R_v7$v9gI~y|&A*$?r&Mo&h~mxn8?K=1 zB-D8xF7gmz;y2>U4qm);#Ow_>>*EyZ#6ati2;`+;dyDvmDT2K z^(~S_2xz!{6YiCCv>5NgZzI{=g+szHlLaH0!Y^F_tGp{)9LiIxPO6XKX@yzhfBm?5 zh69*RN2<*!$ZKusbTaCrcFM`x=>wohoU=IdK8JH2=RW^jz_}myMVtq49>jSF=V6?; z;5>r!R-CutydCFJoOj^76KCeT4d-1r-|nC9!1+%5F8glVgc?N$q}WjHd!T0BYu|@E z@D91tuE##O9rN}W6s!mA_v2|HydSq8#C<=kvwU~L{s8WZ&Vc=pz0ZEwegvgIYCk3_ z*&tFLx1T^6Pud?ut|8>wFKzfb`@oxN`ziZr$v2Gjhw<-2$oY&tDQR2mgHryKeF$%k z*wcPVhwW!^ztuis&)Cn|&!e`Z_A#VvllxheaNItD`|ZxC{q<79oPAPC+<_F`!+HCZ zr0jHdtloxPkJ~Tcy%%Ho^qVi)FH62%VOb^n6-l{0OgU|zk(4_CEyCj)>@sS<6VDgq z-m(|v`CVa3#kM8oZlpMpXUSfc6cZ^cl2Wx-CFOlc(QQ6!*Cb_km{PYJl5!7H2IQ@# zy(TI5B4tQY&e=**?n8sNy=sWHA#8D{q6RL?e9Rj8T)nnar-+lLVv^lF4*(Ok^T`t zh^cSj`A6;VM(Tq-sUNdHj?@X~1Mz>z^F43o@n&BBeZu~v{k^#RKKuLM?6ZHs{z1I) z5K1NdKV^R!z1ioN`bnwnO|;=H`-hP0VL$zcCH)H0ui8I?^hc2XqxO%XRX;AZJZ}F4 z@bf3_&*0gkn?Ac{e-_UkLoa{I{v6)>Y5QkT@8doe{H*9>Foe|4i!;W`L;auI z%txVZCX|>~Xn7O!(1LGkoTpE>3QLSb?>XHYn3x5w*?^Z@HTb=l7}#YgcY_jO=7kxK z?s`YTz)g0koqgKWOOr9OV0u)6Q^Y}zSIwuMGA~9?nPY0jshrh5j|)xTAdAMpVhW?G zRnwL^X5`;&6V_bcdW+UyXezu)F5cZf*eb!`8x=8A!!RD20(+bDzIV_Z+7Q3$O@b_1 z+50M@EOdYMaZcRH> z0rGF^9mH6~-8DdV;4J8_8=DTb#itN?Gbc~Xm{EKSVon18=1JWec8)6{}1%44BQp;>rTX1RAkm7W|529|E`yPH$qJmH%4964Z zNdyY*M<7w#*}t&wiASDXK=_J6oDG;mwSmjJup1vym+1_RTppU&g>9sBL2^V8^f6-5 zVRPuv(nHs%R^T}a?dk#J14+ePP*HKdyQyOGJs~GQh(~5GQvaF**KT7uYFoGC_r(>= z1mWKx!uf3i8u~85R5(yNvlqxs4d3+Sj_DJ&r`MWj4rUK$)-+n0%{r3kTd>x)LxL%rq#T1IE$o_NTm& z?ysTr)v%Lu%^oR4c>nmFtY^#B#N z+$i+R^#);HW<*P1w`pT)f_iDILI_S71Bbbl7#vX^#EX}zHd2si1>!C}Y$XRyAllOIEwq@@wi0g{UpzJ!ibEZbD~k_#lj!IfDsD zz3lttI=h32qgP%zgV?Ab66uvF`x&p#j{&mloqh%(y&`<&4B}neEvP4DfuO7IXUmEb z@>eNi#<%R2vWpDTQJvwi89MCeOsR}O3By>@t|#yJIp@i zZba_#^4`{U_)a<_Qd%EMV_UYpm}u-uCtBOj7S!hrJg480=`SZ5$(Isgiwb^=M#X&D zKkKE*V%0~{NA=w}cp1Tc^$8|?4-SXbRVMexvGjnlb}X%JlHq78`i^3zLYf!EwD=U2t<2~wijK7WlRiQu*|6c~6sQ za)q!gm(Q|UzA4KOBty0GD8yL2j^R!u2Jn*#*<0;}SfzE5-az;PKdt?NuubBM9zpm5 z#n%9@15)S{%;KDTYXCE&{A{QHfbOPQwV&!_O|qe_pw4>ES7Keb8s#m?Jc*GY+qX;w_>xeB{c&5JQGk* z%%lf?U3Siu%dOZD4TPA%Clwhuyu`n*))bL|7y-2Bs!qGrb9yZq1fJ^Yg zrgibj25ew`((_Hx&r5UeqX~190iel`8DK(=)fnNuex^QvIy}G60h8U0G+H;|RA)3| z%<+Pf++oWm|}R zuv4L=$je)BIf*RjlRHFU%3UEWBj=aeFT6cJ8*z2@8Pp!J%fsrkxF0KCmm8~}V*bzZ z5b@xM+mf>egdtt;f#fznu%!#2mkChfeZpt0WUHOq1F&khR@WQeb_#C_ah=J>u+A1e z4dladOmAvSXE4Ch4&f)l;bkxagiE1PB3mfZ$$LA403+BWTw!Sl&$}Qz4G2%HZQ(y4 zA`tJYkxje|@_Y&CxsG5KK}tBr)>C$h2c_MLbunj_QQ6*D}-VyNmI8m3}0GjYXHSqPN3yKK~rAUAk--k?)3at0c!a7vefnpc3Dt5igiWuWD1AI?C?RXDTC2+mnW zNKP4Q&T0|oBF+Oi58ynAGa$Y?g!2&2!#G3XS>1v&enQ*`)h_i_-Li`{4vsxGqRz4d zbRB4f6jdNp8MIO$u0Lu9n%pBK6%B!yDtdwFBw9_NNP;g`ID$avATxCXT|A24M_Av5 zhjgZl_^Ln{%Atcg(tv(3fIi(D>K^3pV#Z{5{C$D&rtgUGzM9YuuS;MEfe13xkKifB zjScdWm6e`GVGaRLNuYUuj;-T3GL$I7fLIPSj)xmKQb+{U?nngGXQ3%3Km^--BG|2o zK@>zDA1f}ApTpz&r~K}y=^N;#w;f(u?xL_dU_4XA>*vRWS& za>~s{j7n5eVOE-hT}6`-r6q$*(h?1|my1!273FVJE+(4d-(!}Z5q}10KS!9-JDKpQ zE1T3*mc{r}9qfcUnD2%kLtd|+tSI14Q8b}%vl2GN9B0k|?SxN>5EB-aVrBjxugRux zHr%7QXeGqCDy~*74;Z0!8D7&eeyhnVAWzOGG(;I|*aCC9jNqKJX?5gvND@RK0=;~= zZoo=n&m*ji-ZTVfja)LQBB5v~Nq&G><5$_*0v;udJB-m}(I^<59oK0y`W=lNNjmtWl+WRZ$_%%G z3u@Phut+k(g3%R>tU%;l8XAtKH;k!_8)Upt0D`KnCh53QEs4RI`c0;&e7MOrE| zQnkQa!7#x!IS4TjlfOt92&$wy!Q_DUhPJz*o9rrHHYEHXGhzNU&6A7>R zlRi?Ylh@FAv5J@xqOm^_(=+3+H7M^O%acL{xN-;~{QF^RQX4>;3aX>njWB0z&<2A8 zaFd;91K@6sJ$k5US+!s?XJjH=ap$pON!wSsj6)U}Oeh;QY{ZR4wtN%Z@CI~gK1Ba0 z>O(lu=*sXF^z6A??HO&xe)y%St&+FcIqQ0zgLP5j)cxLlDb_pRGB?qk<16Ui;djzK z1e3nAu2rtrwE~LryY;8BZUtlzJ>Afy5cN3+(&TL$XZr*TOF?JEsj=Uj#Cq=WPibZJLSgfJ(?a#wbAv({e z?f7%W(A%!Qk;Xzgd))6EHUda~J0u(w3Mjaj4MfU~iaZ40R-=@ON$8Fz6X!;0nY@at zv6MA}x&uIHGcVZPq#48zX&7j6Lq12#Z(9KT4*Wyrar_ z6~if!nue9e2uh^^^|A7WGbFwsr3SanLOg~=vS^Zw#t6Q}&<`weCLusVC*M+4AsE2X z0W&&M2C!%GLL0RU);g6*r;W-5rK9FFVC4YbHdCBSAE0wihh%HYMQmcoO6(wu{_6x zJIyney&T`c(l_-*Jm@7nlH?AKJQb2eJ`KgVfPZNy#w5WI6QnPlXey~KUeN5|V&nSz zGu@~`vCyPI-W#Ax*R?*nHp$r4r8JX!NABO^$rwkD;yaP2M<|PND@0;4UT7ELl5K{gL&Z1l zn|Vv@+MVfu(6o{tL@QZ=HZSypc}(+yYhG+(%^$7Ovq%iAAhm+(UiL)(V`XhR=D_8(|4Yg{L$Cn^7Q^Y#-JI5EXU%mKo?>U#rD%7{PLl`6d(ehUmu90fH}!@Z5x5On)J^^2cz?)0GyiI_L~7h z5TKe~Vj$JN`s)By=iU^o`n`7oRQ-mg%A12Ugz1eb6rP--ga8C_546x~GsYEOZ8ivl z0g!czj)cQd=!8=YpU8EN4Ff?PW{T78y|~c)@@!sVW_S`71_)93N%2d=><#}YpI=Rj zuKqJ2m+T%RFvMVxpe}Yl^HseddP=t_gibW33`i8^wB0}+9lJCB?${qSN3r;9K{rby z+QHHVZF9_TjM8HS2NFdg!NjqEY?T8x@p z@h@iK&GK~(Mgukc6;!Tto0$Fe=J@*aMUdc`9x ze3e4YE5_gOQrOp|G$8W@KOGxjX>C-n5)9Ipe$tLV#O*n@LuTy*yNop473oL;jhC$+ zLgp?Yk?V#S9n2BF)3>I>XJnjBs$BqCguRFt0`|hz9%660^QmA+=P=8Gc_t8fkqm=g zvVxrr8S>4Z#jr&JH-Y6~UrX(p$i$`Ua$Bs`2zCXUg(fZ7T^lyEz-Yb};#4?qW0W(% z9zGDJ(ADKGyr3f&cri-6xB_y%YOHNTcQ;^0QvECBRR06&_@qYZqNV8#XIKNomXP%gbw(N+K)_6wU(Fqd ztS;xy-3vC>r=APmfe*WIHKFWv$%)kdtBGTh)3+%+f%XQtaw6Qy(!Czah!zps9WlNW zlHg5~`zE!p`5Cc-9143bV*4k(SVpAch9W}D;AWSM1g;}YTALhTh{K{CxUk|?a(f|e zqN!ug!?*oN*H}(*DqT=m3khwF6PSGuJ#-%g8#D;+loW+ZMrByF3Z^)muZ^3Kf>^mg zG6*b))?#JiS%%(E>1}5wq9WWf=F7oiAu>OKhTY_{96)0;U}!*K_6*UmQe6`<8@9x< z87PHWCYPsZDCjUwy-z0S5TqP8mXamkIE0!2T9)m(;`45{RnvpKj`(YBoMEeJiRm4~ zh>#JOL{cl|r3*Br2m>X0gJsrg2#JQir6=s-6}raU16@7yim+OTG1%~Q@|q#;b;~{L z8%Pm6jdAdd4V!pu5eUWuwm(7YqpF%19yGXoy#PmMR<1^pot-}2Z+NYckgdwZ#0_PFno-y4h=6Mg z0fw^@vSy57ke}q(a$e;SgVq?KDVy1H)=68st~{(ThTQ=<)_qroX7~Zg@$Gmm7hpAa zUUe$6(O#VQ2aODN34=jZ2eN$2Bp0?8CI?ty5X)@)oztd$akj#gA1v(( z_7gnh?{CNzK_D_sOn@$8rq|f+m_WSow3wco?*%>xUyligPy%_|0?5Wu^%sb$GEXbY zJS~W@+bnNqTZm23COR9@lX6642#r@nM}#qo3!cFxuvQ!iO9^l?Dvf63O_c=NYA;LvF17R<~9T}?gUs00!Z#>BKfC?1jrTJ9-54613^!yh{^J2Z}_lJ!yAhPEZeC1K*$#UO3r=fQzqpQIi z&~)VUQympYfOXzC6>bmw3QTFTlPI;2a23WG^%V0(E{F}Qiq6DV<>(fj!PYHdYt;Y5 z`%zQW+r0fG4>Dq17)HI8ZqAUTei>s!Mzd;M!d@qg_PIn`Gwg9Vrp_iW^;Z*@5MJ8K zob6LDtQ%_&*#;EYel@$^x0+o?jNv-=kP|XYkqjG{g|8R6v%`8y-dRGNRngAiJ}LL- zLAXWk_^_VlJvOt)N{IDz)wnc(8gq6E^?Z(3tJsSnx`vH#z|Qk6_m}asPkkP{ybN%s z2(;yQ*STL^VSV5#=|i_;967(#>R-ivE>{y*1`zA6bN5{tL{8cq2dqw85bFG_tG|H*;Ykj*`K6YIW>0nf27#d^+v-dShc^XN|rEyFIo2NDf)J-0gS zr#4z!?7_>%w;Ag>X^rGqFCzah0FooRP1rGRXgyyA1ixSJ)PmMs8fQ6qpC{sv2%jELl2(2ad>@uG{>qk_#_fq2L` zB;NB83FlmTHQ@DHAv5<_OWuSHY=%ZGnO8}!n^f96ZJx)p2OF-z;GrXAY5gS)aVpNn z1bsmUE;S^kYSL}xwMvk)ULz+c6#?Hnw}rs<~Lcu=mRDm39omhW3PL-$sqOA6}= zZlkJ#ZHV7pWkD&Z2=i+gK{wwToZyL&H`*KB-yWQgh0W|YkHXRuZY4cOlkH6glj4(e za(Un1HsArw=W7<6GY{zLJh@%e^DZ)oVNkcj?gdWJrnGe{7EFSu+fBEzW*3NPQh2y~ zHc%==D4!yN4JY^l|4u+v=)yrENnl`I@5t_xqs|O(+Pm8NfTggNRE-5RAzk>^CI+z( zS@jkM8gRF9B$2IF2OZVLk{caAAQ`i<~&T1R39@qw87^3 zT9ef~R`lQ=BnZu0!HyNtK*xl~b^L7)hV_Ofj9{cDj)~;hgzPsHFuhU)*p2ZMslyHW zwc#tQjGcswFxbxrp9`qLXJf&S6DaI%yRt$%*}_7=*%o5+UoWBO^?J_u2&aae#>$-0 zEBJF(nt$nk4QK7R7Hb485-!az+i(HLPLWILR)c+|;nvVQNgBa2ZgKDZXXNdjUempI zCWXRi-w^lST^eW;#NthSINI|3S>*1#-ZO|1wZbyk^?8L2#_wmWe>KoA?^3PRrA4@*}}XwxMNq8B(_M&ty!|se`#y11!X@` zuL$cl6M1R2;`eA-nL}}jd9Ljogh!RkiPe4yW5TjCF)J8i4B6#B zFZ$07F;K`ehCd-l;Q;`pcM3nJ877$*!V)Zm2l&SN@GBBN$;KE~^c@cRtMKCWR2oPk zaJ~)uZ25IklxQhJ8v<5BkjV(A1dr8gR>-Aj8PJ>DcJV0G>(9r8q8BI|@U;mR8fQ$J zQ60vv@ea9ESj0vlxo;w-Y28F(P02n#n@bhSt)M4xpoHJzfUFl34iukA()`~k|7JTM z!aRxN;S1FWM=q>z%@iNqu!FEW|0SqEIQ?M}09fW5@uS=MOsxM{od$`xE{3k z9T?pAvx3N=Nuk6))F?iJ&}1Gs_PE*cMuWNanN8^J80Jn8r@`D0SZr}t*o_+UmBx#q z*olBFarR>|G$yi%E*YvwK2dyAmzAQ+KCl)#?lGbvLC|qc#V%I3=m|=6H_@?NSni

Y4C8w|hxy92bcu76 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/mentions.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/mentions.cpython-38.pyc deleted file mode 100644 index 42c1c87c29c1e8d2fbdc12a1e860506e03922588..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5848 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 HB$NINm<*l; diff --git a/.venv/Lib/site-packages/discord/__pycache__/mixins.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/mixins.cpython-38.pyc deleted file mode 100644 index e9888b8be7dc0cea074a274d55c65c369060059f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2061 zcmZWq&2HO95GJXgILu$uLy-bSyKsAm3fgH4^b!PZXofn76gVb|iuo5rM(wntj$M*JA6X1L(&*bUi0 zBs^D~J;bJCnq9fNEX3KOWDk=L`{{=tf8JXaT=BeQLA+X(uS|2ui=|LX$eanq7QEoI zOLkVodC60Y%?r+%oU>#R7iZjJrDSn_$yU5jP>{1S7P-jJSZpSMqMPLcW|W+l7jeOH zIc2d@G7&NCu~a7OCD7xN@a7`piajjh`|jvUW4B|O07-eAF_FU>XWJuoAsieCeHb{Sk?9A_Jsu8R2Qt^|4#qv#J7NdW^L$jY zixP&>&}RgAWy*C%WbD`px_wx-58Qzpo?7Oi8+x$G4q?=0LpuoF?s#AaY&Z^v{>TA* z4`w~rI}Cv096MgP4^+sQ^9&m{>f3_>L7Da#-Uq-5Sl1t(2JTTmWPN|ob09o$;F*0e za5hjN)g9RGvBi4!v3*3|109#0p_tE8jvtv}B zJ1^I9Cd$jMT(06Go@Kn+>BlG-tP-@Nk46K#r+Df{#kGl!W@U`2T{U=Ikya*-6uP~L`YyGwMTz_K} z4_@of4Xlk9#z-q0Xn?xcX;!9CBB$C-cy%+1k_%pdV%p>CMJZR)nJgKHx)dy3vl2@+-9P8~`E(#=Qzc5i zw~CV&@flZBbdN+9>7%9i1McjvE~|DF@t0Bb9bi-&lcwLs->WbGAM*XpO|Nsa+KHk( zUh*ia%qT*qT4%Jr9YvIL}@u;scZS%g#dTPAW(?;5S+nlu07IM-qD2Fvv zM=ywXLO9z&Yr0S;m_Cb0C<^FT4XTFs&liwDjgp5SI{(CJ3eW=e8AW?IRAfriU)|r9 zEF!r%_29@IQol>nJ(@nF={`+_@`2sD5bB7KIr<1Ia$pA$smV~4-H0N5zz|z3&^b|H d#N<8K56qFJYUjx&dB4!LI>5~b&Gy|}{{iaMDvbaD diff --git a/.venv/Lib/site-packages/discord/__pycache__/object.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/object.cpython-38.pyc deleted file mode 100644 index 5af13892879c0d079dd5c6bb454defb9d81df332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4250 zcmb7HTXWmS6$U_xq9E$xICh*)JF|5mm(w( zU=|C>(zq|RU)w*BV4aCN-aU&DGyEQxh-M|?8Oe{S^e@}>T#FAZ+< zQy z6avVtb-k9ZqICrq*arM(CenP*NAZ|6v9C0NiH50+z!F9wbz_)Jb375gq7{;S7>8ke zPOABF!~@bd*|4>*y+M2?v@V%@qgX-IOayX(79#WNY%3XgkbNL#1_R$9vT13q4zx=L ziGt$;*nSdA&F^D1tKh%WVBPk1?{%%yU{06qb=t3-t;QC6SnFc`u)efzzTN9Ix?Q{7Vb1Pe(`jJMY1NziTTbgG+r+(A89s(UZG&iy?bSLxr@r5;b=cm1XRqCDfc+N8 zww%^>2V5GvjaIJ;u2^G@SD3KwPOaG_R(5S4(s#h8!|Lt5gO2lZr^j~M&8-F&Hye0MoY?Q|OzR_i!jh-znuRuG1y)%K7PX zH=R(pBu=EJE4_oghFjlh)Zy%x(|qq@BBl%b5n{ImHaTzLzFT!;t7yf z*!+$@^$EZGA^+a&FY`}qPgB2H=IO99MdkH$bqPo+{k(lpKhos`H#fP2bgngH-5 z80wqnNI<$i(PSfbk|qjy&77?&+l?_ErjdreM3Yk^569saLQ9V&6X6F#$bU^*<6=gE z`5@$l3E*XRL!-5pKvVO`1R4ec1q=kuLq&n>4dxWlt zA+mxdmYEI!56w_C%FOdsip>jm?3~I|ws0;6 zs4AyIF%n2YZtO_mi{MOf%^vpHKw(S8#t|^xi;m$l$%SOko__t}NJAy)MNrot&54Xq z6cGSC^F*A68L1iFOyA7m(u2|xE3hc3pXqkP>{W^u#0l9&OQ(erZgb9#OpL^s*Qj}}5?2M>*if6pqSYAc_@3n$wMSeGy);Dh>5BbP9FrLE8%zeD-L{8=W(%q1MLuF9i)xr=7WHFL z3??CBYBE6sLIAAANh;LAP=cZvLyQg(S@XmpUh`*&Mn$~!#voB)gIJBOY_}`M10l26 zpIc==(JPc!=|I~!>uu)yWHo)}b_C5}%;Q{eMC8-zSK6My_B@$>x^|-|)V)Mq-qpUi z<%2grSyLh(Og%qLr|?tIXBItQygBe z{A9@c*!`tf-#8>=CWoW+IF^T7A~{v@A(iznn$;qxu&r@od~b0Jzb1ZjKQ6$E`PSv~vy3ha`18wxj?m}7m@niSZvAA+ zd-%~xXRpsNB|#;Mt?LTR67BJu;$?f&LZ;a?KZxTHt;YgFSV;LB+_{Ppj19U^k)mb& zEd~@LB;|WcKESVqsIX40uAy>}*leLyv4douciL0hL(^4MH;2-NK1~EKTbb|-BtO=m z0NKBD-4V8u0$v8pTrw|Lu1rk3mv>No1+_`l`QX2dOu}oy>C+Q}lh`JSdFjkEZ+`cR z$k7J738YsY8L(708)z#SaYgL1{a(EaMaY*~7?OcL*2d0y6z+N|#&+hB+~u8_HrKnY za*3Q5A!S^5YP&8#G7V{5a$PDfvz-h&It7NWQ4;J%g N(JWc(xqM;0{vU#zy`}&F diff --git a/.venv/Lib/site-packages/discord/__pycache__/oggparse.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/oggparse.cpython-38.pyc deleted file mode 100644 index 20c916c287ae17a878c9704cd9bb563041481074..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4005 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/permissions.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/permissions.cpython-38.pyc deleted file mode 100644 index e237eea59843f09925de51a4a0b172f958b30ebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30100 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/player.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/player.cpython-38.pyc deleted file mode 100644 index 1699943b4295fc0d52cd283e4cd15dfeefe21cc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25665 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/raw_models.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/raw_models.cpython-38.pyc deleted file mode 100644 index 467959425e1035efb90d30bea00635d2698d89f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17252 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/reaction.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/reaction.cpython-38.pyc deleted file mode 100644 index 2e848c23c73711d2815de7ff59a362800289162d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8617 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/role.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/role.cpython-38.pyc deleted file mode 100644 index 316be445008bc816daf6c1036c02c4543a834e4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16775 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/scheduled_event.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/scheduled_event.cpython-38.pyc deleted file mode 100644 index 3b7ac7d9c9614e926797017201304dd17f570634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18663 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/shard.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/shard.cpython-38.pyc deleted file mode 100644 index e1ef25c76490df8a4cfe9bf2f3467ea7f4376748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19931 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/stage_instance.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/stage_instance.cpython-38.pyc deleted file mode 100644 index fe2306f2d447b62ad7ed160165f46f2065ba9a65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6579 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 BKOz7C diff --git a/.venv/Lib/site-packages/discord/__pycache__/sticker.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/sticker.cpython-38.pyc deleted file mode 100644 index ff587cff973bea3b4d2fdb2af5258990110db3e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17401 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 Aw*UYD diff --git a/.venv/Lib/site-packages/discord/__pycache__/team.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/team.cpython-38.pyc deleted file mode 100644 index b53f60d47d082d69176481eb5f5105df372bd415..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5298 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/template.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/template.cpython-38.pyc deleted file mode 100644 index ad09c71c7d620994601af59b51ef65759fb9c2df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10628 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/threads.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/threads.cpython-38.pyc deleted file mode 100644 index a8b1864595912648805d309f719fd48774c9bbf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28544 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�Y$ol)F9bOeY#&yd>$NR)hlD}? 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/user.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/user.cpython-38.pyc deleted file mode 100644 index 1d6a980745265abe316e9c21c0d7d7afdfd09bb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16825 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/voice_client.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/voice_client.cpython-38.pyc deleted file mode 100644 index 68009664c404d1dc3ae3d012bf70bb4c5c251215..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22843 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/welcome_screen.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/welcome_screen.cpython-38.pyc deleted file mode 100644 index 05d53ddb9ee0fc740380e5d512e8398edea93446..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7672 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 diff --git a/.venv/Lib/site-packages/discord/__pycache__/widget.cpython-38.pyc b/.venv/Lib/site-packages/discord/__pycache__/widget.cpython-38.pyc deleted file mode 100644 index fac2797bbb96db1d366a8e7113cbf40adf0370b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10710 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 diff --git a/.venv/Lib/site-packages/discord/abc.py b/.venv/Lib/site-packages/discord/abc.py deleted file mode 100644 index 5b0e7df..0000000 --- a/.venv/Lib/site-packages/discord/abc.py +++ /dev/null @@ -1,1888 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -import copy -import time -import asyncio -from datetime import datetime -from typing import ( - Any, - AsyncIterator, - Callable, - Dict, - Iterable, - List, - Optional, - TYPE_CHECKING, - Protocol, - Sequence, - Tuple, - TypeVar, - Union, - overload, - runtime_checkable, -) - -from .object import OLDEST_OBJECT, Object -from .context_managers import Typing -from .enums import ChannelType -from .errors import ClientException -from .mentions import AllowedMentions -from .permissions import PermissionOverwrite, Permissions -from .role import Role -from .invite import Invite -from .file import File -from .http import handle_message_parameters -from .voice_client import VoiceClient, VoiceProtocol -from .sticker import GuildSticker, StickerItem -from . import utils - -__all__ = ( - 'Snowflake', - 'User', - 'PrivateChannel', - 'GuildChannel', - 'Messageable', - 'Connectable', -) - -T = TypeVar('T', bound=VoiceProtocol) - -if TYPE_CHECKING: - from typing_extensions import Self - - from .client import Client - from .user import ClientUser - from .asset import Asset - from .state import ConnectionState - from .guild import Guild - from .member import Member - from .channel import CategoryChannel - from .embeds import Embed - from .message import Message, MessageReference, PartialMessage - from .channel import TextChannel, DMChannel, GroupChannel, PartialMessageable, VoiceChannel - from .threads import Thread - from .enums import InviteTarget - from .ui.view import View - from .types.channel import ( - PermissionOverwrite as PermissionOverwritePayload, - Channel as ChannelPayload, - GuildChannel as GuildChannelPayload, - OverwriteType, - ) - from .types.snowflake import ( - SnowflakeList, - ) - - PartialMessageableChannel = Union[TextChannel, VoiceChannel, Thread, DMChannel, PartialMessageable] - MessageableChannel = Union[PartialMessageableChannel, GroupChannel] - SnowflakeTime = Union["Snowflake", datetime] - -MISSING = utils.MISSING - - -class _Undefined: - def __repr__(self) -> str: - return 'see-below' - - -_undefined: Any = _Undefined() - - -async def _single_delete_strategy(messages: Iterable[Message], *, reason: Optional[str] = None): - for m in messages: - await m.delete() - - -async def _purge_helper( - channel: Union[Thread, TextChannel, VoiceChannel], - *, - limit: Optional[int] = 100, - check: Callable[[Message], bool] = MISSING, - before: Optional[SnowflakeTime] = None, - after: Optional[SnowflakeTime] = None, - around: Optional[SnowflakeTime] = None, - oldest_first: Optional[bool] = None, - bulk: bool = True, - reason: Optional[str] = None, -) -> List[Message]: - if check is MISSING: - check = lambda m: True - - iterator = channel.history(limit=limit, before=before, after=after, oldest_first=oldest_first, around=around) - ret: List[Message] = [] - count = 0 - - minimum_time = int((time.time() - 14 * 24 * 60 * 60) * 1000.0 - 1420070400000) << 22 - strategy = channel.delete_messages if bulk else _single_delete_strategy - - async for message in iterator: - if count == 100: - to_delete = ret[-100:] - await strategy(to_delete, reason=reason) - count = 0 - await asyncio.sleep(1) - - if not check(message): - continue - - if message.id < minimum_time: - # older than 14 days old - if count == 1: - await ret[-1].delete() - elif count >= 2: - to_delete = ret[-count:] - await strategy(to_delete, reason=reason) - - count = 0 - strategy = _single_delete_strategy - - count += 1 - ret.append(message) - - # Some messages remaining to poll - if count >= 2: - # more than 2 messages -> bulk delete - to_delete = ret[-count:] - await strategy(to_delete, reason=reason) - elif count == 1: - # delete a single message - await ret[-1].delete() - - return ret - - -@runtime_checkable -class Snowflake(Protocol): - """An ABC that details the common operations on a Discord model. - - Almost all :ref:`Discord models ` meet this - abstract base class. - - If you want to create a snowflake on your own, consider using - :class:`.Object`. - - Attributes - ----------- - id: :class:`int` - The model's unique ID. - """ - - id: int - - -@runtime_checkable -class User(Snowflake, Protocol): - """An ABC that details the common operations on a Discord user. - - The following implement this ABC: - - - :class:`~discord.User` - - :class:`~discord.ClientUser` - - :class:`~discord.Member` - - This ABC must also implement :class:`~discord.abc.Snowflake`. - - Attributes - ----------- - name: :class:`str` - The user's username. - discriminator: :class:`str` - The user's discriminator. - bot: :class:`bool` - If the user is a bot account. - system: :class:`bool` - If the user is a system account. - """ - - name: str - discriminator: str - bot: bool - system: bool - - @property - def display_name(self) -> str: - """:class:`str`: Returns the user's display name.""" - raise NotImplementedError - - @property - def mention(self) -> str: - """:class:`str`: Returns a string that allows you to mention the given user.""" - raise NotImplementedError - - @property - def avatar(self) -> Optional[Asset]: - """Optional[:class:`~discord.Asset`]: Returns an Asset that represents the user's avatar, if present.""" - raise NotImplementedError - - @property - def default_avatar(self) -> Asset: - """:class:`~discord.Asset`: Returns the default avatar for a given user. This is calculated by the user's discriminator.""" - raise NotImplementedError - - @property - def display_avatar(self) -> Asset: - """:class:`~discord.Asset`: Returns the user's display avatar. - - For regular users this is just their default avatar or uploaded avatar. - - .. versionadded:: 2.0 - """ - raise NotImplementedError - - def mentioned_in(self, message: Message) -> bool: - """Checks if the user is mentioned in the specified message. - - Parameters - ----------- - message: :class:`~discord.Message` - The message to check if you're mentioned in. - - Returns - ------- - :class:`bool` - Indicates if the user is mentioned in the message. - """ - raise NotImplementedError - - -class PrivateChannel: - """An ABC that details the common operations on a private Discord channel. - - The following implement this ABC: - - - :class:`~discord.DMChannel` - - :class:`~discord.GroupChannel` - - This ABC must also implement :class:`~discord.abc.Snowflake`. - - Attributes - ----------- - me: :class:`~discord.ClientUser` - The user presenting yourself. - """ - - __slots__ = () - - id: int - me: ClientUser - - -class _Overwrites: - __slots__ = ('id', 'allow', 'deny', 'type') - - ROLE = 0 - MEMBER = 1 - - def __init__(self, data: PermissionOverwritePayload) -> None: - self.id: int = int(data['id']) - self.allow: int = int(data.get('allow', 0)) - self.deny: int = int(data.get('deny', 0)) - self.type: OverwriteType = data['type'] - - def _asdict(self) -> PermissionOverwritePayload: - return { - 'id': self.id, - 'allow': str(self.allow), - 'deny': str(self.deny), - 'type': self.type, - } - - def is_role(self) -> bool: - return self.type == 0 - - def is_member(self) -> bool: - return self.type == 1 - - -class GuildChannel: - """An ABC that details the common operations on a Discord guild channel. - - The following implement this ABC: - - - :class:`~discord.TextChannel` - - :class:`~discord.VoiceChannel` - - :class:`~discord.CategoryChannel` - - :class:`~discord.StageChannel` - - :class:`~discord.ForumChannel` - - This ABC must also implement :class:`~discord.abc.Snowflake`. - - Attributes - ----------- - name: :class:`str` - The channel name. - guild: :class:`~discord.Guild` - The guild the channel belongs to. - position: :class:`int` - The position in the channel list. This is a number that starts at 0. - e.g. the top channel is position 0. - """ - - __slots__ = () - - id: int - name: str - guild: Guild - type: ChannelType - position: int - category_id: Optional[int] - _state: ConnectionState - _overwrites: List[_Overwrites] - - if TYPE_CHECKING: - - def __init__(self, *, state: ConnectionState, guild: Guild, data: GuildChannelPayload): - ... - - def __str__(self) -> str: - return self.name - - @property - def _sorting_bucket(self) -> int: - raise NotImplementedError - - def _update(self, guild: Guild, data: Dict[str, Any]) -> None: - raise NotImplementedError - - async def _move( - self, - position: int, - parent_id: Optional[Any] = None, - lock_permissions: bool = False, - *, - reason: Optional[str], - ) -> None: - if position < 0: - raise ValueError('Channel position cannot be less than 0.') - - http = self._state.http - bucket = self._sorting_bucket - channels: List[GuildChannel] = [c for c in self.guild.channels if c._sorting_bucket == bucket] - - channels.sort(key=lambda c: c.position) - - try: - # remove ourselves from the channel list - channels.remove(self) - except ValueError: - # not there somehow lol - return - else: - index = next((i for i, c in enumerate(channels) if c.position >= position), len(channels)) - # add ourselves at our designated position - channels.insert(index, self) - - payload = [] - for index, c in enumerate(channels): - d: Dict[str, Any] = {'id': c.id, 'position': index} - if parent_id is not _undefined and c.id == self.id: - d.update(parent_id=parent_id, lock_permissions=lock_permissions) - payload.append(d) - - await http.bulk_channel_update(self.guild.id, payload, reason=reason) - - async def _edit(self, options: Dict[str, Any], reason: Optional[str]) -> Optional[ChannelPayload]: - try: - parent = options.pop('category') - except KeyError: - parent_id = _undefined - else: - parent_id = parent and parent.id - - try: - options['rate_limit_per_user'] = options.pop('slowmode_delay') - except KeyError: - pass - - try: - rtc_region = options.pop('rtc_region') - except KeyError: - pass - else: - options['rtc_region'] = None if rtc_region is None else str(rtc_region) - - try: - video_quality_mode = options.pop('video_quality_mode') - except KeyError: - pass - else: - options['video_quality_mode'] = int(video_quality_mode) - - lock_permissions = options.pop('sync_permissions', False) - - try: - position = options.pop('position') - except KeyError: - if parent_id is not _undefined: - if lock_permissions: - category = self.guild.get_channel(parent_id) - if category: - options['permission_overwrites'] = [c._asdict() for c in category._overwrites] - options['parent_id'] = parent_id - elif lock_permissions and self.category_id is not None: - # if we're syncing permissions on a pre-existing channel category without changing it - # we need to update the permissions to point to the pre-existing category - category = self.guild.get_channel(self.category_id) - if category: - options['permission_overwrites'] = [c._asdict() for c in category._overwrites] - else: - await self._move(position, parent_id=parent_id, lock_permissions=lock_permissions, reason=reason) - - overwrites = options.get('overwrites', None) - if overwrites is not None: - perms = [] - for target, perm in overwrites.items(): - if not isinstance(perm, PermissionOverwrite): - raise TypeError(f'Expected PermissionOverwrite received {perm.__class__.__name__}') - - allow, deny = perm.pair() - payload = { - 'allow': allow.value, - 'deny': deny.value, - 'id': target.id, - } - - if isinstance(target, Role): - payload['type'] = _Overwrites.ROLE - elif isinstance(target, Object): - payload['type'] = _Overwrites.ROLE if target.type is Role else _Overwrites.MEMBER - else: - payload['type'] = _Overwrites.MEMBER - - perms.append(payload) - options['permission_overwrites'] = perms - - try: - ch_type = options['type'] - except KeyError: - pass - else: - if not isinstance(ch_type, ChannelType): - raise TypeError('type field must be of type ChannelType') - options['type'] = ch_type.value - - if options: - return await self._state.http.edit_channel(self.id, reason=reason, **options) - - def _fill_overwrites(self, data: GuildChannelPayload) -> None: - self._overwrites = [] - everyone_index = 0 - everyone_id = self.guild.id - - for index, overridden in enumerate(data.get('permission_overwrites', [])): - overwrite = _Overwrites(overridden) - self._overwrites.append(overwrite) - - if overwrite.type == _Overwrites.MEMBER: - continue - - if overwrite.id == everyone_id: - # the @everyone role is not guaranteed to be the first one - # in the list of permission overwrites, however the permission - # resolution code kind of requires that it is the first one in - # the list since it is special. So we need the index so we can - # swap it to be the first one. - everyone_index = index - - # do the swap - tmp = self._overwrites - if tmp: - tmp[everyone_index], tmp[0] = tmp[0], tmp[everyone_index] - - @property - def changed_roles(self) -> List[Role]: - """List[:class:`~discord.Role`]: Returns a list of roles that have been overridden from - their default values in the :attr:`~discord.Guild.roles` attribute.""" - ret = [] - g = self.guild - for overwrite in filter(lambda o: o.is_role(), self._overwrites): - role = g.get_role(overwrite.id) - if role is None: - continue - - role = copy.copy(role) - role.permissions.handle_overwrite(overwrite.allow, overwrite.deny) - ret.append(role) - return ret - - @property - def mention(self) -> str: - """:class:`str`: The string that allows you to mention the channel.""" - return f'<#{self.id}>' - - @property - def jump_url(self) -> str: - """:class:`str`: Returns a URL that allows the client to jump to the channel. - - .. versionadded:: 2.0 - """ - return f'https://discord.com/channels/{self.guild.id}/{self.id}' - - @property - def created_at(self) -> datetime: - """:class:`datetime.datetime`: Returns the channel's creation time in UTC.""" - return utils.snowflake_time(self.id) - - def overwrites_for(self, obj: Union[Role, User, Object]) -> PermissionOverwrite: - """Returns the channel-specific overwrites for a member or a role. - - Parameters - ----------- - obj: Union[:class:`~discord.Role`, :class:`~discord.abc.User`, :class:`~discord.Object`] - The role or user denoting whose overwrite to get. - - Returns - --------- - :class:`~discord.PermissionOverwrite` - The permission overwrites for this object. - """ - - if isinstance(obj, User): - predicate = lambda p: p.is_member() - elif isinstance(obj, Role): - predicate = lambda p: p.is_role() - else: - predicate = lambda p: True - - for overwrite in filter(predicate, self._overwrites): - if overwrite.id == obj.id: - allow = Permissions(overwrite.allow) - deny = Permissions(overwrite.deny) - return PermissionOverwrite.from_pair(allow, deny) - - return PermissionOverwrite() - - @property - def overwrites(self) -> Dict[Union[Role, Member, Object], PermissionOverwrite]: - """Returns all of the channel's overwrites. - - This is returned as a dictionary where the key contains the target which - can be either a :class:`~discord.Role` or a :class:`~discord.Member` and the value is the - overwrite as a :class:`~discord.PermissionOverwrite`. - - .. versionchanged:: 2.0 - Overwrites can now be type-aware :class:`~discord.Object` in case of cache lookup failure - - Returns - -------- - Dict[Union[:class:`~discord.Role`, :class:`~discord.Member`, :class:`~discord.Object`], :class:`~discord.PermissionOverwrite`] - The channel's permission overwrites. - """ - ret = {} - for ow in self._overwrites: - allow = Permissions(ow.allow) - deny = Permissions(ow.deny) - overwrite = PermissionOverwrite.from_pair(allow, deny) - target = None - - if ow.is_role(): - target = self.guild.get_role(ow.id) - elif ow.is_member(): - target = self.guild.get_member(ow.id) - - if target is None: - target_type = Role if ow.is_role() else User - target = Object(id=ow.id, type=target_type) # type: ignore - - ret[target] = overwrite - return ret - - @property - def category(self) -> Optional[CategoryChannel]: - """Optional[:class:`~discord.CategoryChannel`]: The category this channel belongs to. - - If there is no category then this is ``None``. - """ - return self.guild.get_channel(self.category_id) # type: ignore # These are coerced into CategoryChannel - - @property - def permissions_synced(self) -> bool: - """:class:`bool`: Whether or not the permissions for this channel are synced with the - category it belongs to. - - If there is no category then this is ``False``. - - .. versionadded:: 1.3 - """ - if self.category_id is None: - return False - - category = self.guild.get_channel(self.category_id) - return bool(category and category.overwrites == self.overwrites) - - def permissions_for(self, obj: Union[Member, Role], /) -> Permissions: - """Handles permission resolution for the :class:`~discord.Member` - or :class:`~discord.Role`. - - This function takes into consideration the following cases: - - - Guild owner - - Guild roles - - Channel overrides - - Member overrides - - Member timeout - - If a :class:`~discord.Role` is passed, then it checks the permissions - someone with that role would have, which is essentially: - - - The default role permissions - - The permissions of the role used as a parameter - - The default role permission overwrites - - The permission overwrites of the role used as a parameter - - .. versionchanged:: 2.0 - The object passed in can now be a role object. - - .. versionchanged:: 2.0 - ``obj`` parameter is now positional-only. - - Parameters - ---------- - obj: Union[:class:`~discord.Member`, :class:`~discord.Role`] - The object to resolve permissions for. This could be either - a member or a role. If it's a role then member overwrites - are not computed. - - Returns - ------- - :class:`~discord.Permissions` - The resolved permissions for the member or role. - """ - - # The current cases can be explained as: - # Guild owner get all permissions -- no questions asked. Otherwise... - # The @everyone role gets the first application. - # After that, the applied roles that the user has in the channel - # (or otherwise) are then OR'd together. - # After the role permissions are resolved, the member permissions - # have to take into effect. - # After all that is done.. you have to do the following: - - # If manage permissions is True, then all permissions are set to True. - - # The operation first takes into consideration the denied - # and then the allowed. - - if self.guild.owner_id == obj.id: - return Permissions.all() - - default = self.guild.default_role - base = Permissions(default.permissions.value) - - # Handle the role case first - if isinstance(obj, Role): - base.value |= obj._permissions - - if base.administrator: - return Permissions.all() - - # Apply @everyone allow/deny first since it's special - try: - maybe_everyone = self._overwrites[0] - if maybe_everyone.id == self.guild.id: - base.handle_overwrite(allow=maybe_everyone.allow, deny=maybe_everyone.deny) - except IndexError: - pass - - if obj.is_default(): - return base - - overwrite = utils.get(self._overwrites, type=_Overwrites.ROLE, id=obj.id) - if overwrite is not None: - base.handle_overwrite(overwrite.allow, overwrite.deny) - - return base - - roles = obj._roles - get_role = self.guild.get_role - - # Apply guild roles that the member has. - for role_id in roles: - role = get_role(role_id) - if role is not None: - base.value |= role._permissions - - # Guild-wide Administrator -> True for everything - # Bypass all channel-specific overrides - if base.administrator: - return Permissions.all() - - # Apply @everyone allow/deny first since it's special - try: - maybe_everyone = self._overwrites[0] - if maybe_everyone.id == self.guild.id: - base.handle_overwrite(allow=maybe_everyone.allow, deny=maybe_everyone.deny) - remaining_overwrites = self._overwrites[1:] - else: - remaining_overwrites = self._overwrites - except IndexError: - remaining_overwrites = self._overwrites - - denies = 0 - allows = 0 - - # Apply channel specific role permission overwrites - for overwrite in remaining_overwrites: - if overwrite.is_role() and roles.has(overwrite.id): - denies |= overwrite.deny - allows |= overwrite.allow - - base.handle_overwrite(allow=allows, deny=denies) - - # Apply member specific permission overwrites - for overwrite in remaining_overwrites: - if overwrite.is_member() and overwrite.id == obj.id: - base.handle_overwrite(allow=overwrite.allow, deny=overwrite.deny) - break - - # if you can't send a message in a channel then you can't have certain - # permissions as well - if not base.send_messages: - base.send_tts_messages = False - base.mention_everyone = False - base.embed_links = False - base.attach_files = False - - # if you can't read a channel then you have no permissions there - if not base.read_messages: - denied = Permissions.all_channel() - base.value &= ~denied.value - - if obj.is_timed_out(): - # Timeout leads to every permission except VIEW_CHANNEL and READ_MESSAGE_HISTORY - # being explicitly denied - # N.B.: This *must* come last, because it's a conclusive mask - base.value &= Permissions._timeout_mask() - - return base - - async def delete(self, *, reason: Optional[str] = None) -> None: - """|coro| - - Deletes the channel. - - You must have :attr:`~discord.Permissions.manage_channels` permission to use this. - - Parameters - ----------- - reason: Optional[:class:`str`] - The reason for deleting this channel. - Shows up on the audit log. - - Raises - ------- - ~discord.Forbidden - You do not have proper permissions to delete the channel. - ~discord.NotFound - The channel was not found or was already deleted. - ~discord.HTTPException - Deleting the channel failed. - """ - await self._state.http.delete_channel(self.id, reason=reason) - - @overload - async def set_permissions( - self, - target: Union[Member, Role], - *, - overwrite: Optional[Union[PermissionOverwrite, _Undefined]] = ..., - reason: Optional[str] = ..., - ) -> None: - ... - - @overload - async def set_permissions( - self, - target: Union[Member, Role], - *, - reason: Optional[str] = ..., - **permissions: Optional[bool], - ) -> None: - ... - - async def set_permissions( - self, - target: Union[Member, Role], - *, - overwrite: Any = _undefined, - reason: Optional[str] = None, - **permissions: Optional[bool], - ) -> None: - r"""|coro| - - Sets the channel specific permission overwrites for a target in the - channel. - - The ``target`` parameter should either be a :class:`~discord.Member` or a - :class:`~discord.Role` that belongs to guild. - - The ``overwrite`` parameter, if given, must either be ``None`` or - :class:`~discord.PermissionOverwrite`. For convenience, you can pass in - keyword arguments denoting :class:`~discord.Permissions` attributes. If this is - done, then you cannot mix the keyword arguments with the ``overwrite`` - parameter. - - If the ``overwrite`` parameter is ``None``, then the permission - overwrites are deleted. - - You must have the :attr:`~discord.Permissions.manage_roles` permission to use this. - - .. note:: - - This method *replaces* the old overwrites with the ones given. - - Examples - ---------- - - Setting allow and deny: :: - - await message.channel.set_permissions(message.author, read_messages=True, - send_messages=False) - - Deleting overwrites :: - - await channel.set_permissions(member, overwrite=None) - - Using :class:`~discord.PermissionOverwrite` :: - - overwrite = discord.PermissionOverwrite() - overwrite.send_messages = False - overwrite.read_messages = True - await channel.set_permissions(member, overwrite=overwrite) - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` instead of - ``InvalidArgument``. - - - Parameters - ----------- - target: Union[:class:`~discord.Member`, :class:`~discord.Role`] - The member or role to overwrite permissions for. - overwrite: Optional[:class:`~discord.PermissionOverwrite`] - The permissions to allow and deny to the target, or ``None`` to - delete the overwrite. - \*\*permissions - A keyword argument list of permissions to set for ease of use. - Cannot be mixed with ``overwrite``. - reason: Optional[:class:`str`] - The reason for doing this action. Shows up on the audit log. - - Raises - ------- - ~discord.Forbidden - You do not have permissions to edit channel specific permissions. - ~discord.HTTPException - Editing channel specific permissions failed. - ~discord.NotFound - The role or member being edited is not part of the guild. - TypeError - The ``overwrite`` parameter was invalid or the target type was not - :class:`~discord.Role` or :class:`~discord.Member`. - ValueError - The ``overwrite`` parameter and ``positions`` parameters were both - unset. - """ - - http = self._state.http - - if isinstance(target, User): - perm_type = _Overwrites.MEMBER - elif isinstance(target, Role): - perm_type = _Overwrites.ROLE - else: - raise ValueError('target parameter must be either Member or Role') - - if overwrite is _undefined: - if len(permissions) == 0: - raise ValueError('No overwrite provided.') - try: - overwrite = PermissionOverwrite(**permissions) - except (ValueError, TypeError): - raise TypeError('Invalid permissions given to keyword arguments.') - else: - if len(permissions) > 0: - raise TypeError('Cannot mix overwrite and keyword arguments.') - - # TODO: wait for event - - if overwrite is None: - await http.delete_channel_permissions(self.id, target.id, reason=reason) - elif isinstance(overwrite, PermissionOverwrite): - (allow, deny) = overwrite.pair() - await http.edit_channel_permissions( - self.id, target.id, str(allow.value), str(deny.value), perm_type, reason=reason - ) - else: - raise TypeError('Invalid overwrite type provided.') - - async def _clone_impl( - self, - base_attrs: Dict[str, Any], - *, - name: Optional[str] = None, - reason: Optional[str] = None, - ) -> Self: - base_attrs['permission_overwrites'] = [x._asdict() for x in self._overwrites] - base_attrs['parent_id'] = self.category_id - base_attrs['name'] = name or self.name - guild_id = self.guild.id - cls = self.__class__ - data = await self._state.http.create_channel(guild_id, self.type.value, reason=reason, **base_attrs) - obj = cls(state=self._state, guild=self.guild, data=data) - - # temporarily add it to the cache - self.guild._channels[obj.id] = obj # type: ignore # obj is a GuildChannel - return obj - - async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> Self: - """|coro| - - Clones this channel. This creates a channel with the same properties - as this channel. - - You must have the :attr:`~discord.Permissions.manage_channels` permission to - do this. - - .. versionadded:: 1.1 - - Parameters - ------------ - name: Optional[:class:`str`] - The name of the new channel. If not provided, defaults to this - channel name. - reason: Optional[:class:`str`] - The reason for cloning this channel. Shows up on the audit log. - - Raises - ------- - ~discord.Forbidden - You do not have the proper permissions to create this channel. - ~discord.HTTPException - Creating the channel failed. - - Returns - -------- - :class:`.abc.GuildChannel` - The channel that was created. - """ - raise NotImplementedError - - @overload - async def move( - self, - *, - beginning: bool, - offset: int = MISSING, - category: Optional[Snowflake] = MISSING, - sync_permissions: bool = MISSING, - reason: Optional[str] = MISSING, - ) -> None: - ... - - @overload - async def move( - self, - *, - end: bool, - offset: int = MISSING, - category: Optional[Snowflake] = MISSING, - sync_permissions: bool = MISSING, - reason: str = MISSING, - ) -> None: - ... - - @overload - async def move( - self, - *, - before: Snowflake, - offset: int = MISSING, - category: Optional[Snowflake] = MISSING, - sync_permissions: bool = MISSING, - reason: str = MISSING, - ) -> None: - ... - - @overload - async def move( - self, - *, - after: Snowflake, - offset: int = MISSING, - category: Optional[Snowflake] = MISSING, - sync_permissions: bool = MISSING, - reason: str = MISSING, - ) -> None: - ... - - async def move(self, **kwargs: Any) -> None: - """|coro| - - A rich interface to help move a channel relative to other channels. - - If exact position movement is required, ``edit`` should be used instead. - - You must have the :attr:`~discord.Permissions.manage_channels` permission to - do this. - - .. note:: - - Voice channels will always be sorted below text channels. - This is a Discord limitation. - - .. versionadded:: 1.7 - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` or - :exc:`ValueError` instead of ``InvalidArgument``. - - Parameters - ------------ - beginning: :class:`bool` - Whether to move the channel to the beginning of the - channel list (or category if given). - This is mutually exclusive with ``end``, ``before``, and ``after``. - end: :class:`bool` - Whether to move the channel to the end of the - channel list (or category if given). - This is mutually exclusive with ``beginning``, ``before``, and ``after``. - before: :class:`~discord.abc.Snowflake` - The channel that should be before our current channel. - This is mutually exclusive with ``beginning``, ``end``, and ``after``. - after: :class:`~discord.abc.Snowflake` - The channel that should be after our current channel. - This is mutually exclusive with ``beginning``, ``end``, and ``before``. - offset: :class:`int` - The number of channels to offset the move by. For example, - an offset of ``2`` with ``beginning=True`` would move - it 2 after the beginning. A positive number moves it below - while a negative number moves it above. Note that this - number is relative and computed after the ``beginning``, - ``end``, ``before``, and ``after`` parameters. - category: Optional[:class:`~discord.abc.Snowflake`] - The category to move this channel under. - If ``None`` is given then it moves it out of the category. - This parameter is ignored if moving a category channel. - sync_permissions: :class:`bool` - Whether to sync the permissions with the category (if given). - reason: :class:`str` - The reason for the move. - - Raises - ------- - ValueError - An invalid position was given. - TypeError - A bad mix of arguments were passed. - Forbidden - You do not have permissions to move the channel. - HTTPException - Moving the channel failed. - """ - - if not kwargs: - return - - beginning, end = kwargs.get('beginning'), kwargs.get('end') - before, after = kwargs.get('before'), kwargs.get('after') - offset = kwargs.get('offset', 0) - if sum(bool(a) for a in (beginning, end, before, after)) > 1: - raise TypeError('Only one of [before, after, end, beginning] can be used.') - - bucket = self._sorting_bucket - parent_id = kwargs.get('category', MISSING) - # fmt: off - channels: List[GuildChannel] - if parent_id not in (MISSING, None): - parent_id = parent_id.id - channels = [ - ch - for ch in self.guild.channels - if ch._sorting_bucket == bucket - and ch.category_id == parent_id - ] - else: - channels = [ - ch - for ch in self.guild.channels - if ch._sorting_bucket == bucket - and ch.category_id == self.category_id - ] - # fmt: on - - channels.sort(key=lambda c: (c.position, c.id)) - - try: - # Try to remove ourselves from the channel list - channels.remove(self) - except ValueError: - # If we're not there then it's probably due to not being in the category - pass - - index = None - if beginning: - index = 0 - elif end: - index = len(channels) - elif before: - index = next((i for i, c in enumerate(channels) if c.id == before.id), None) - elif after: - index = next((i + 1 for i, c in enumerate(channels) if c.id == after.id), None) - - if index is None: - raise ValueError('Could not resolve appropriate move position') - - channels.insert(max((index + offset), 0), self) - payload = [] - lock_permissions = kwargs.get('sync_permissions', False) - reason = kwargs.get('reason') - for index, channel in enumerate(channels): - d = {'id': channel.id, 'position': index} - if parent_id is not MISSING and channel.id == self.id: - d.update(parent_id=parent_id, lock_permissions=lock_permissions) - payload.append(d) - - await self._state.http.bulk_channel_update(self.guild.id, payload, reason=reason) - - async def create_invite( - self, - *, - reason: Optional[str] = None, - max_age: int = 0, - max_uses: int = 0, - temporary: bool = False, - unique: bool = True, - target_type: Optional[InviteTarget] = None, - target_user: Optional[User] = None, - target_application_id: Optional[int] = None, - ) -> Invite: - """|coro| - - Creates an instant invite from a text or voice channel. - - You must have the :attr:`~discord.Permissions.create_instant_invite` permission to - do this. - - Parameters - ------------ - max_age: :class:`int` - How long the invite should last in seconds. If it's 0 then the invite - doesn't expire. Defaults to ``0``. - max_uses: :class:`int` - How many uses the invite could be used for. If it's 0 then there - are unlimited uses. Defaults to ``0``. - temporary: :class:`bool` - Denotes that the invite grants temporary membership - (i.e. they get kicked after they disconnect). Defaults to ``False``. - unique: :class:`bool` - Indicates if a unique invite URL should be created. Defaults to True. - If this is set to ``False`` then it will return a previously created - invite. - reason: Optional[:class:`str`] - The reason for creating this invite. Shows up on the audit log. - target_type: Optional[:class:`.InviteTarget`] - The type of target for the voice channel invite, if any. - - .. versionadded:: 2.0 - - target_user: Optional[:class:`User`] - The user whose stream to display for this invite, required if `target_type` is `TargetType.stream`. The user must be streaming in the channel. - - .. versionadded:: 2.0 - - target_application_id:: Optional[:class:`int`] - The id of the embedded application for the invite, required if `target_type` is `TargetType.embedded_application`. - - .. versionadded:: 2.0 - - Raises - ------- - ~discord.HTTPException - Invite creation failed. - - ~discord.NotFound - The channel that was passed is a category or an invalid channel. - - Returns - -------- - :class:`~discord.Invite` - The invite that was created. - """ - - data = await self._state.http.create_invite( - self.id, - reason=reason, - max_age=max_age, - max_uses=max_uses, - temporary=temporary, - unique=unique, - target_type=target_type.value if target_type else None, - target_user_id=target_user.id if target_user else None, - target_application_id=target_application_id, - ) - return Invite.from_incomplete(data=data, state=self._state) - - async def invites(self) -> List[Invite]: - """|coro| - - Returns a list of all active instant invites from this channel. - - You must have :attr:`~discord.Permissions.manage_channels` to get this information. - - Raises - ------- - ~discord.Forbidden - You do not have proper permissions to get the information. - ~discord.HTTPException - An error occurred while fetching the information. - - Returns - ------- - List[:class:`~discord.Invite`] - The list of invites that are currently active. - """ - - state = self._state - data = await state.http.invites_from_channel(self.id) - guild = self.guild - return [Invite(state=state, data=invite, channel=self, guild=guild) for invite in data] - - -class Messageable: - """An ABC that details the common operations on a model that can send messages. - - The following classes implement this ABC: - - - :class:`~discord.TextChannel` - - :class:`~discord.VoiceChannel` - - :class:`~discord.DMChannel` - - :class:`~discord.GroupChannel` - - :class:`~discord.PartialMessageable` - - :class:`~discord.User` - - :class:`~discord.Member` - - :class:`~discord.ext.commands.Context` - - :class:`~discord.Thread` - """ - - __slots__ = () - _state: ConnectionState - - async def _get_channel(self) -> MessageableChannel: - raise NotImplementedError - - @overload - async def send( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embed: Embed = ..., - file: File = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - ) -> Message: - ... - - @overload - async def send( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embed: Embed = ..., - files: Sequence[File] = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - ) -> Message: - ... - - @overload - async def send( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embeds: Sequence[Embed] = ..., - file: File = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - ) -> Message: - ... - - @overload - async def send( - self, - content: Optional[str] = ..., - *, - tts: bool = ..., - embeds: Sequence[Embed] = ..., - files: Sequence[File] = ..., - stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., - delete_after: float = ..., - nonce: Union[str, int] = ..., - allowed_mentions: AllowedMentions = ..., - reference: Union[Message, MessageReference, PartialMessage] = ..., - mention_author: bool = ..., - view: View = ..., - suppress_embeds: bool = ..., - ) -> Message: - ... - - async def send( - self, - content: Optional[str] = None, - *, - tts: bool = False, - embed: Optional[Embed] = None, - embeds: Optional[Sequence[Embed]] = None, - file: Optional[File] = None, - files: Optional[Sequence[File]] = None, - stickers: Optional[Sequence[Union[GuildSticker, StickerItem]]] = None, - delete_after: Optional[float] = None, - nonce: Optional[Union[str, int]] = None, - allowed_mentions: Optional[AllowedMentions] = None, - reference: Optional[Union[Message, MessageReference, PartialMessage]] = None, - mention_author: Optional[bool] = None, - view: Optional[View] = None, - suppress_embeds: bool = False, - ) -> Message: - """|coro| - - Sends a message to the destination with the content given. - - The content must be a type that can convert to a string through ``str(content)``. - If the content is set to ``None`` (the default), then the ``embed`` parameter must - be provided. - - To upload a single file, the ``file`` parameter should be used with a - single :class:`~discord.File` object. To upload multiple files, the ``files`` - parameter should be used with a :class:`list` of :class:`~discord.File` objects. - **Specifying both parameters will lead to an exception**. - - To upload a single embed, the ``embed`` parameter should be used with a - single :class:`~discord.Embed` object. To upload multiple embeds, the ``embeds`` - parameter should be used with a :class:`list` of :class:`~discord.Embed` objects. - **Specifying both parameters will lead to an exception**. - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` or - :exc:`ValueError` instead of ``InvalidArgument``. - - Parameters - ------------ - content: Optional[:class:`str`] - The content of the message to send. - tts: :class:`bool` - Indicates if the message should be sent using text-to-speech. - embed: :class:`~discord.Embed` - The rich embed for the content. - embeds: List[:class:`~discord.Embed`] - A list of embeds to upload. Must be a maximum of 10. - - .. versionadded:: 2.0 - file: :class:`~discord.File` - The file to upload. - files: List[:class:`~discord.File`] - A list of files to upload. Must be a maximum of 10. - nonce: :class:`int` - The nonce to use for sending this message. If the message was successfully sent, - then the message will have a nonce with this value. - delete_after: :class:`float` - If provided, the number of seconds to wait in the background - before deleting the message we just sent. If the deletion fails, - then it is silently ignored. - allowed_mentions: :class:`~discord.AllowedMentions` - Controls the mentions being processed in this message. If this is - passed, then the object is merged with :attr:`~discord.Client.allowed_mentions`. - The merging behaviour only overrides attributes that have been explicitly passed - to the object, otherwise it uses the attributes set in :attr:`~discord.Client.allowed_mentions`. - If no object is passed at all then the defaults given by :attr:`~discord.Client.allowed_mentions` - are used instead. - - .. versionadded:: 1.4 - - reference: Union[:class:`~discord.Message`, :class:`~discord.MessageReference`, :class:`~discord.PartialMessage`] - A reference to the :class:`~discord.Message` to which you are replying, this can be created using - :meth:`~discord.Message.to_reference` or passed directly as a :class:`~discord.Message`. You can control - whether this mentions the author of the referenced message using the :attr:`~discord.AllowedMentions.replied_user` - attribute of ``allowed_mentions`` or by setting ``mention_author``. - - .. versionadded:: 1.6 - - mention_author: Optional[:class:`bool`] - If set, overrides the :attr:`~discord.AllowedMentions.replied_user` attribute of ``allowed_mentions``. - - .. versionadded:: 1.6 - view: :class:`discord.ui.View` - A Discord UI View to add to the message. - - .. versionadded:: 2.0 - stickers: Sequence[Union[:class:`~discord.GuildSticker`, :class:`~discord.StickerItem`]] - A list of stickers to upload. Must be a maximum of 3. - - .. versionadded:: 2.0 - suppress_embeds: :class:`bool` - Whether to suppress embeds for the message. This sends the message without any embeds if set to ``True``. - - .. versionadded:: 2.0 - - Raises - -------- - ~discord.HTTPException - Sending the message failed. - ~discord.Forbidden - You do not have the proper permissions to send the message. - ValueError - The ``files`` or ``embeds`` list is not of the appropriate size. - TypeError - You specified both ``file`` and ``files``, - or you specified both ``embed`` and ``embeds``, - or the ``reference`` object is not a :class:`~discord.Message`, - :class:`~discord.MessageReference` or :class:`~discord.PartialMessage`. - - Returns - --------- - :class:`~discord.Message` - The message that was sent. - """ - - channel = await self._get_channel() - state = self._state - content = str(content) if content is not None else None - previous_allowed_mention = state.allowed_mentions - - if stickers is not None: - sticker_ids: SnowflakeList = [sticker.id for sticker in stickers] - else: - sticker_ids = MISSING - - if reference is not None: - try: - reference_dict = reference.to_message_reference_dict() - except AttributeError: - raise TypeError('reference parameter must be Message, MessageReference, or PartialMessage') from None - else: - reference_dict = MISSING - - if view and not hasattr(view, '__discord_ui_view__'): - raise TypeError(f'view parameter must be View not {view.__class__!r}') - - if suppress_embeds: - from .message import MessageFlags # circular import - - flags = MessageFlags._from_value(4) - else: - flags = MISSING - - with handle_message_parameters( - content=content, - tts=tts, - file=file if file is not None else MISSING, - files=files if files is not None else MISSING, - embed=embed if embed is not None else MISSING, - embeds=embeds if embeds is not None else MISSING, - nonce=nonce, - allowed_mentions=allowed_mentions, - message_reference=reference_dict, - previous_allowed_mentions=previous_allowed_mention, - mention_author=mention_author, - stickers=sticker_ids, - view=view, - flags=flags, - ) as params: - data = await state.http.send_message(channel.id, params=params) - - ret = state.create_message(channel=channel, data=data) - if view: - state.store_view(view, ret.id) - - if delete_after is not None: - await ret.delete(delay=delete_after) - return ret - - def typing(self) -> Typing: - """Returns an asynchronous context manager that allows you to send a typing indicator to - the destination for an indefinite period of time, or 10 seconds if the context manager - is called using ``await``. - - Example Usage: :: - - async with channel.typing(): - # simulate something heavy - await asyncio.sleep(20) - - await channel.send('Done!') - - Example Usage: :: - - await channel.typing() - # Do some computational magic for about 10 seconds - await channel.send('Done!') - - .. versionchanged:: 2.0 - This no longer works with the ``with`` syntax, ``async with`` must be used instead. - - .. versionchanged:: 2.0 - Added functionality to ``await`` the context manager to send a typing indicator for 10 seconds. - """ - return Typing(self) - - async def fetch_message(self, id: int, /) -> Message: - """|coro| - - Retrieves a single :class:`~discord.Message` from the destination. - - Parameters - ------------ - id: :class:`int` - The message ID to look for. - - Raises - -------- - ~discord.NotFound - The specified message was not found. - ~discord.Forbidden - You do not have the permissions required to get a message. - ~discord.HTTPException - Retrieving the message failed. - - Returns - -------- - :class:`~discord.Message` - The message asked for. - """ - - channel = await self._get_channel() - data = await self._state.http.get_message(channel.id, id) - return self._state.create_message(channel=channel, data=data) - - async def pins(self) -> List[Message]: - """|coro| - - Retrieves all messages that are currently pinned in the channel. - - .. note:: - - Due to a limitation with the Discord API, the :class:`.Message` - objects returned by this method do not contain complete - :attr:`.Message.reactions` data. - - Raises - ------- - ~discord.Forbidden - You do not have the permission to retrieve pinned messages. - ~discord.HTTPException - Retrieving the pinned messages failed. - - Returns - -------- - List[:class:`~discord.Message`] - The messages that are currently pinned. - """ - - channel = await self._get_channel() - state = self._state - data = await state.http.pins_from(channel.id) - return [state.create_message(channel=channel, data=m) for m in data] - - async def history( - self, - *, - limit: Optional[int] = 100, - before: Optional[SnowflakeTime] = None, - after: Optional[SnowflakeTime] = None, - around: Optional[SnowflakeTime] = None, - oldest_first: Optional[bool] = None, - ) -> AsyncIterator[Message]: - """Returns an :term:`asynchronous iterator` that enables receiving the destination's message history. - - You must have :attr:`~discord.Permissions.read_message_history` permissions to use this. - - Examples - --------- - - Usage :: - - counter = 0 - async for message in channel.history(limit=200): - if message.author == client.user: - counter += 1 - - Flattening into a list: :: - - messages = [message async for message in channel.history(limit=123)] - # messages is now a list of Message... - - All parameters are optional. - - Parameters - ----------- - limit: Optional[:class:`int`] - The number of messages to retrieve. - If ``None``, retrieves every message in the channel. Note, however, - that this would make it a slow operation. - before: Optional[Union[:class:`~discord.abc.Snowflake`, :class:`datetime.datetime`]] - Retrieve messages before this date or message. - If a datetime is provided, it is recommended to use a UTC aware datetime. - If the datetime is naive, it is assumed to be local time. - after: Optional[Union[:class:`~discord.abc.Snowflake`, :class:`datetime.datetime`]] - Retrieve messages after this date or message. - If a datetime is provided, it is recommended to use a UTC aware datetime. - If the datetime is naive, it is assumed to be local time. - around: Optional[Union[:class:`~discord.abc.Snowflake`, :class:`datetime.datetime`]] - Retrieve messages around this date or message. - If a datetime is provided, it is recommended to use a UTC aware datetime. - If the datetime is naive, it is assumed to be local time. - When using this argument, the maximum limit is 101. Note that if the limit is an - even number then this will return at most limit + 1 messages. - oldest_first: Optional[:class:`bool`] - If set to ``True``, return messages in oldest->newest order. Defaults to ``True`` if - ``after`` is specified, otherwise ``False``. - - Raises - ------ - ~discord.Forbidden - You do not have permissions to get channel message history. - ~discord.HTTPException - The request to get message history failed. - - Yields - ------- - :class:`~discord.Message` - The message with the message data parsed. - """ - - async def _around_strategy(retrieve: int, around: Optional[Snowflake], limit: Optional[int]): - if not around: - return [] - - around_id = around.id if around else None - data = await self._state.http.logs_from(channel.id, retrieve, around=around_id) - - return data, None, limit - - async def _after_strategy(retrieve: int, after: Optional[Snowflake], limit: Optional[int]): - after_id = after.id if after else None - data = await self._state.http.logs_from(channel.id, retrieve, after=after_id) - - if data: - if limit is not None: - limit -= len(data) - - after = Object(id=int(data[0]['id'])) - - return data, after, limit - - async def _before_strategy(retrieve: int, before: Optional[Snowflake], limit: Optional[int]): - before_id = before.id if before else None - data = await self._state.http.logs_from(channel.id, retrieve, before=before_id) - - if data: - if limit is not None: - limit -= len(data) - - before = Object(id=int(data[-1]['id'])) - - return data, before, limit - - if isinstance(before, datetime): - before = Object(id=utils.time_snowflake(before, high=False)) - if isinstance(after, datetime): - after = Object(id=utils.time_snowflake(after, high=True)) - if isinstance(around, datetime): - around = Object(id=utils.time_snowflake(around)) - - if oldest_first is None: - reverse = after is not None - else: - reverse = oldest_first - - after = after or OLDEST_OBJECT - predicate = None - - if around: - if limit is None: - raise ValueError('history does not support around with limit=None') - if limit > 101: - raise ValueError("history max limit 101 when specifying around parameter") - - # Strange Discord quirk - limit = 100 if limit == 101 else limit - - strategy, state = _around_strategy, around - - if before and after: - predicate = lambda m: after.id < int(m['id']) < before.id - elif before: - predicate = lambda m: int(m['id']) < before.id - elif after: - predicate = lambda m: after.id < int(m['id']) - elif reverse: - strategy, state = _after_strategy, after - if before: - predicate = lambda m: int(m['id']) < before.id - else: - strategy, state = _before_strategy, before - if after and after != OLDEST_OBJECT: - predicate = lambda m: int(m['id']) > after.id - - channel = await self._get_channel() - - while True: - retrieve = min(100 if limit is None else limit, 100) - if retrieve < 1: - return - - data, state, limit = await strategy(retrieve, state, limit) - - # Terminate loop on next iteration; there's no data left after this - if len(data) < 100: - limit = 0 - - if reverse: - data = reversed(data) - if predicate: - data = filter(predicate, data) - - for raw_message in data: - yield self._state.create_message(channel=channel, data=raw_message) - - -class Connectable(Protocol): - """An ABC that details the common operations on a channel that can - connect to a voice server. - - The following implement this ABC: - - - :class:`~discord.VoiceChannel` - - :class:`~discord.StageChannel` - """ - - __slots__ = () - _state: ConnectionState - - def _get_voice_client_key(self) -> Tuple[int, str]: - raise NotImplementedError - - def _get_voice_state_pair(self) -> Tuple[int, int]: - raise NotImplementedError - - async def connect( - self, - *, - timeout: float = 60.0, - reconnect: bool = True, - cls: Callable[[Client, Connectable], T] = VoiceClient, - self_deaf: bool = False, - self_mute: bool = False, - ) -> T: - """|coro| - - Connects to voice and creates a :class:`~discord.VoiceClient` to establish - your connection to the voice server. - - This requires :attr:`~discord.Intents.voice_states`. - - Parameters - ----------- - timeout: :class:`float` - The timeout in seconds to wait for the voice endpoint. - reconnect: :class:`bool` - Whether the bot should automatically attempt - a reconnect if a part of the handshake fails - or the gateway goes down. - cls: Type[:class:`~discord.VoiceProtocol`] - A type that subclasses :class:`~discord.VoiceProtocol` to connect with. - Defaults to :class:`~discord.VoiceClient`. - self_mute: :class:`bool` - Indicates if the client should be self-muted. - - .. versionadded:: 2.0 - self_deaf: :class:`bool` - Indicates if the client should be self-deafened. - - .. versionadded:: 2.0 - - Raises - ------- - asyncio.TimeoutError - Could not connect to the voice channel in time. - ~discord.ClientException - You are already connected to a voice channel. - ~discord.opus.OpusNotLoaded - The opus library has not been loaded. - - Returns - -------- - :class:`~discord.VoiceProtocol` - A voice client that is fully connected to the voice server. - """ - - key_id, _ = self._get_voice_client_key() - state = self._state - - if state._get_voice_client(key_id): - raise ClientException('Already connected to a voice channel.') - - client = state._get_client() - voice: T = cls(client, self) - - if not isinstance(voice, VoiceProtocol): - raise TypeError('Type must meet VoiceProtocol abstract base class.') - - state._add_voice_client(key_id, voice) - - try: - await voice.connect(timeout=timeout, reconnect=reconnect, self_deaf=self_deaf, self_mute=self_mute) - except asyncio.TimeoutError: - try: - await voice.disconnect(force=True) - except Exception: - # we don't care if disconnect failed because connection failed - pass - raise # re-raise - - return voice diff --git a/.venv/Lib/site-packages/discord/activity.py b/.venv/Lib/site-packages/discord/activity.py deleted file mode 100644 index 5e97300..0000000 --- a/.venv/Lib/site-packages/discord/activity.py +++ /dev/null @@ -1,842 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -import datetime -from typing import Any, Dict, List, Optional, TYPE_CHECKING, Union, overload - -from .asset import Asset -from .enums import ActivityType, try_enum -from .colour import Colour -from .partial_emoji import PartialEmoji -from .utils import _get_as_snowflake - -__all__ = ( - 'BaseActivity', - 'Activity', - 'Streaming', - 'Game', - 'Spotify', - 'CustomActivity', -) - -"""If curious, this is the current schema for an activity. - -It's fairly long so I will document it here: - -All keys are optional. - -state: str (max: 128), -details: str (max: 128) -timestamps: dict - start: int (min: 1) - end: int (min: 1) -assets: dict - large_image: str (max: 32) - large_text: str (max: 128) - small_image: str (max: 32) - small_text: str (max: 128) -party: dict - id: str (max: 128), - size: List[int] (max-length: 2) - elem: int (min: 1) -secrets: dict - match: str (max: 128) - join: str (max: 128) - spectate: str (max: 128) -instance: bool -application_id: str -name: str (max: 128) -url: str -type: int -sync_id: str -session_id: str -flags: int -buttons: list[str (max: 32)] - -There are also activity flags which are mostly uninteresting for the library atm. - -t.ActivityFlags = { - INSTANCE: 1, - JOIN: 2, - SPECTATE: 4, - JOIN_REQUEST: 8, - SYNC: 16, - PLAY: 32 -} -""" - -if TYPE_CHECKING: - from .types.activity import ( - Activity as ActivityPayload, - ActivityTimestamps, - ActivityParty, - ActivityAssets, - ) - - from .state import ConnectionState - - -class BaseActivity: - """The base activity that all user-settable activities inherit from. - A user-settable activity is one that can be used in :meth:`Client.change_presence`. - - The following types currently count as user-settable: - - - :class:`Activity` - - :class:`Game` - - :class:`Streaming` - - :class:`CustomActivity` - - Note that although these types are considered user-settable by the library, - Discord typically ignores certain combinations of activity depending on - what is currently set. This behaviour may change in the future so there are - no guarantees on whether Discord will actually let you set these types. - - .. versionadded:: 1.3 - """ - - __slots__ = ('_created_at',) - - def __init__(self, **kwargs: Any) -> None: - self._created_at: Optional[float] = kwargs.pop('created_at', None) - - @property - def created_at(self) -> Optional[datetime.datetime]: - """Optional[:class:`datetime.datetime`]: When the user started doing this activity in UTC. - - .. versionadded:: 1.3 - """ - if self._created_at is not None: - return datetime.datetime.fromtimestamp(self._created_at / 1000, tz=datetime.timezone.utc) - - def to_dict(self) -> ActivityPayload: - raise NotImplementedError - - -class Activity(BaseActivity): - """Represents an activity in Discord. - - This could be an activity such as streaming, playing, listening - or watching. - - For memory optimisation purposes, some activities are offered in slimmed - down versions: - - - :class:`Game` - - :class:`Streaming` - - Attributes - ------------ - application_id: Optional[:class:`int`] - The application ID of the game. - name: Optional[:class:`str`] - The name of the activity. - url: Optional[:class:`str`] - A stream URL that the activity could be doing. - type: :class:`ActivityType` - The type of activity currently being done. - state: Optional[:class:`str`] - The user's current state. For example, "In Game". - details: Optional[:class:`str`] - The detail of the user's current activity. - timestamps: :class:`dict` - A dictionary of timestamps. It contains the following optional keys: - - - ``start``: Corresponds to when the user started doing the - activity in milliseconds since Unix epoch. - - ``end``: Corresponds to when the user will finish doing the - activity in milliseconds since Unix epoch. - - assets: :class:`dict` - A dictionary representing the images and their hover text of an activity. - It contains the following optional keys: - - - ``large_image``: A string representing the ID for the large image asset. - - ``large_text``: A string representing the text when hovering over the large image asset. - - ``small_image``: A string representing the ID for the small image asset. - - ``small_text``: A string representing the text when hovering over the small image asset. - - party: :class:`dict` - A dictionary representing the activity party. It contains the following optional keys: - - - ``id``: A string representing the party ID. - - ``size``: A list of up to two integer elements denoting (current_size, maximum_size). - buttons: List[:class:`str`] - A list of strings representing the labels of custom buttons shown in a rich presence. - - .. versionadded:: 2.0 - - emoji: Optional[:class:`PartialEmoji`] - The emoji that belongs to this activity. - """ - - __slots__ = ( - 'state', - 'details', - 'timestamps', - 'assets', - 'party', - 'flags', - 'sync_id', - 'session_id', - 'type', - 'name', - 'url', - 'application_id', - 'emoji', - 'buttons', - ) - - def __init__(self, **kwargs: Any) -> None: - super().__init__(**kwargs) - self.state: Optional[str] = kwargs.pop('state', None) - self.details: Optional[str] = kwargs.pop('details', None) - self.timestamps: ActivityTimestamps = kwargs.pop('timestamps', {}) - self.assets: ActivityAssets = kwargs.pop('assets', {}) - self.party: ActivityParty = kwargs.pop('party', {}) - self.application_id: Optional[int] = _get_as_snowflake(kwargs, 'application_id') - self.name: Optional[str] = kwargs.pop('name', None) - self.url: Optional[str] = kwargs.pop('url', None) - self.flags: int = kwargs.pop('flags', 0) - self.sync_id: Optional[str] = kwargs.pop('sync_id', None) - self.session_id: Optional[str] = kwargs.pop('session_id', None) - self.buttons: List[str] = kwargs.pop('buttons', []) - - activity_type = kwargs.pop('type', -1) - self.type: ActivityType = ( - activity_type if isinstance(activity_type, ActivityType) else try_enum(ActivityType, activity_type) - ) - - emoji = kwargs.pop('emoji', None) - self.emoji: Optional[PartialEmoji] = PartialEmoji.from_dict(emoji) if emoji is not None else None - - def __repr__(self) -> str: - attrs = ( - ('type', self.type), - ('name', self.name), - ('url', self.url), - ('details', self.details), - ('application_id', self.application_id), - ('session_id', self.session_id), - ('emoji', self.emoji), - ) - inner = ' '.join('%s=%r' % t for t in attrs) - return f'' - - def to_dict(self) -> Dict[str, Any]: - ret: Dict[str, Any] = {} - for attr in self.__slots__: - value = getattr(self, attr, None) - if value is None: - continue - - if isinstance(value, dict) and len(value) == 0: - continue - - ret[attr] = value - ret['type'] = int(self.type) - if self.emoji: - ret['emoji'] = self.emoji.to_dict() - return ret - - @property - def start(self) -> Optional[datetime.datetime]: - """Optional[:class:`datetime.datetime`]: When the user started doing this activity in UTC, if applicable.""" - try: - timestamp = self.timestamps['start'] / 1000 - except KeyError: - return None - else: - return datetime.datetime.fromtimestamp(timestamp, tz=datetime.timezone.utc) - - @property - def end(self) -> Optional[datetime.datetime]: - """Optional[:class:`datetime.datetime`]: When the user will stop doing this activity in UTC, if applicable.""" - try: - timestamp = self.timestamps['end'] / 1000 - except KeyError: - return None - else: - return datetime.datetime.fromtimestamp(timestamp, tz=datetime.timezone.utc) - - @property - def large_image_url(self) -> Optional[str]: - """Optional[:class:`str`]: Returns a URL pointing to the large image asset of this activity, if applicable.""" - try: - large_image = self.assets['large_image'] - except KeyError: - return None - else: - return self._image_url(large_image) - - @property - def small_image_url(self) -> Optional[str]: - """Optional[:class:`str`]: Returns a URL pointing to the small image asset of this activity, if applicable.""" - try: - small_image = self.assets['small_image'] - except KeyError: - return None - else: - return self._image_url(small_image) - - def _image_url(self, image: str) -> Optional[str]: - if image.startswith('mp:'): - return f'https://media.discordapp.net/{image[3:]}' - elif self.application_id is not None: - return Asset.BASE + f'/app-assets/{self.application_id}/{image}.png' - - @property - def large_image_text(self) -> Optional[str]: - """Optional[:class:`str`]: Returns the large image asset hover text of this activity, if applicable.""" - return self.assets.get('large_text', None) - - @property - def small_image_text(self) -> Optional[str]: - """Optional[:class:`str`]: Returns the small image asset hover text of this activity, if applicable.""" - return self.assets.get('small_text', None) - - -class Game(BaseActivity): - """A slimmed down version of :class:`Activity` that represents a Discord game. - - This is typically displayed via **Playing** on the official Discord client. - - .. container:: operations - - .. describe:: x == y - - Checks if two games are equal. - - .. describe:: x != y - - Checks if two games are not equal. - - .. describe:: hash(x) - - Returns the game's hash. - - .. describe:: str(x) - - Returns the game's name. - - Parameters - ----------- - name: :class:`str` - The game's name. - - Attributes - ----------- - name: :class:`str` - The game's name. - """ - - __slots__ = ('name', '_end', '_start') - - def __init__(self, name: str, **extra: Any) -> None: - super().__init__(**extra) - self.name: str = name - - try: - timestamps: ActivityTimestamps = extra['timestamps'] - except KeyError: - self._start = 0 - self._end = 0 - else: - self._start = timestamps.get('start', 0) - self._end = timestamps.get('end', 0) - - @property - def type(self) -> ActivityType: - """:class:`ActivityType`: Returns the game's type. This is for compatibility with :class:`Activity`. - - It always returns :attr:`ActivityType.playing`. - """ - return ActivityType.playing - - @property - def start(self) -> Optional[datetime.datetime]: - """Optional[:class:`datetime.datetime`]: When the user started playing this game in UTC, if applicable.""" - if self._start: - return datetime.datetime.fromtimestamp(self._start / 1000, tz=datetime.timezone.utc) - return None - - @property - def end(self) -> Optional[datetime.datetime]: - """Optional[:class:`datetime.datetime`]: When the user will stop playing this game in UTC, if applicable.""" - if self._end: - return datetime.datetime.fromtimestamp(self._end / 1000, tz=datetime.timezone.utc) - return None - - def __str__(self) -> str: - return str(self.name) - - def __repr__(self) -> str: - return f'' - - def to_dict(self) -> Dict[str, Any]: - timestamps: Dict[str, Any] = {} - if self._start: - timestamps['start'] = self._start - - if self._end: - timestamps['end'] = self._end - - return { - 'type': ActivityType.playing.value, - 'name': str(self.name), - 'timestamps': timestamps, - } - - def __eq__(self, other: object) -> bool: - return isinstance(other, Game) and other.name == self.name - - def __ne__(self, other: object) -> bool: - return not self.__eq__(other) - - def __hash__(self) -> int: - return hash(self.name) - - -class Streaming(BaseActivity): - """A slimmed down version of :class:`Activity` that represents a Discord streaming status. - - This is typically displayed via **Streaming** on the official Discord client. - - .. container:: operations - - .. describe:: x == y - - Checks if two streams are equal. - - .. describe:: x != y - - Checks if two streams are not equal. - - .. describe:: hash(x) - - Returns the stream's hash. - - .. describe:: str(x) - - Returns the stream's name. - - Attributes - ----------- - platform: Optional[:class:`str`] - Where the user is streaming from (ie. YouTube, Twitch). - - .. versionadded:: 1.3 - - name: Optional[:class:`str`] - The stream's name. - details: Optional[:class:`str`] - An alias for :attr:`name` - game: Optional[:class:`str`] - The game being streamed. - - .. versionadded:: 1.3 - - url: :class:`str` - The stream's URL. - assets: :class:`dict` - A dictionary comprising of similar keys than those in :attr:`Activity.assets`. - """ - - __slots__ = ('platform', 'name', 'game', 'url', 'details', 'assets') - - def __init__(self, *, name: Optional[str], url: str, **extra: Any) -> None: - super().__init__(**extra) - self.platform: Optional[str] = name - self.name: Optional[str] = extra.pop('details', name) - self.game: Optional[str] = extra.pop('state', None) - self.url: str = url - self.details: Optional[str] = extra.pop('details', self.name) # compatibility - self.assets: ActivityAssets = extra.pop('assets', {}) - - @property - def type(self) -> ActivityType: - """:class:`ActivityType`: Returns the game's type. This is for compatibility with :class:`Activity`. - - It always returns :attr:`ActivityType.streaming`. - """ - return ActivityType.streaming - - def __str__(self) -> str: - return str(self.name) - - def __repr__(self) -> str: - return f'' - - @property - def twitch_name(self) -> Optional[str]: - """Optional[:class:`str`]: If provided, the twitch name of the user streaming. - - This corresponds to the ``large_image`` key of the :attr:`Streaming.assets` - dictionary if it starts with ``twitch:``. Typically set by the Discord client. - """ - - try: - name = self.assets['large_image'] - except KeyError: - return None - else: - return name[7:] if name[:7] == 'twitch:' else None - - def to_dict(self) -> Dict[str, Any]: - ret: Dict[str, Any] = { - 'type': ActivityType.streaming.value, - 'name': str(self.name), - 'url': str(self.url), - 'assets': self.assets, - } - if self.details: - ret['details'] = self.details - return ret - - def __eq__(self, other: object) -> bool: - return isinstance(other, Streaming) and other.name == self.name and other.url == self.url - - def __ne__(self, other: object) -> bool: - return not self.__eq__(other) - - def __hash__(self) -> int: - return hash(self.name) - - -class Spotify: - """Represents a Spotify listening activity from Discord. This is a special case of - :class:`Activity` that makes it easier to work with the Spotify integration. - - .. container:: operations - - .. describe:: x == y - - Checks if two activities are equal. - - .. describe:: x != y - - Checks if two activities are not equal. - - .. describe:: hash(x) - - Returns the activity's hash. - - .. describe:: str(x) - - Returns the string 'Spotify'. - """ - - __slots__ = ('_state', '_details', '_timestamps', '_assets', '_party', '_sync_id', '_session_id', '_created_at') - - def __init__(self, **data: Any) -> None: - self._state: str = data.pop('state', '') - self._details: str = data.pop('details', '') - self._timestamps: ActivityTimestamps = data.pop('timestamps', {}) - self._assets: ActivityAssets = data.pop('assets', {}) - self._party: ActivityParty = data.pop('party', {}) - self._sync_id: str = data.pop('sync_id', '') - self._session_id: Optional[str] = data.pop('session_id') - self._created_at: Optional[float] = data.pop('created_at', None) - - @property - def type(self) -> ActivityType: - """:class:`ActivityType`: Returns the activity's type. This is for compatibility with :class:`Activity`. - - It always returns :attr:`ActivityType.listening`. - """ - return ActivityType.listening - - @property - def created_at(self) -> Optional[datetime.datetime]: - """Optional[:class:`datetime.datetime`]: When the user started listening in UTC. - - .. versionadded:: 1.3 - """ - if self._created_at is not None: - return datetime.datetime.fromtimestamp(self._created_at / 1000, tz=datetime.timezone.utc) - - @property - def colour(self) -> Colour: - """:class:`Colour`: Returns the Spotify integration colour, as a :class:`Colour`. - - There is an alias for this named :attr:`color`""" - return Colour(0x1DB954) - - @property - def color(self) -> Colour: - """:class:`Colour`: Returns the Spotify integration colour, as a :class:`Colour`. - - There is an alias for this named :attr:`colour`""" - return self.colour - - def to_dict(self) -> Dict[str, Any]: - return { - 'flags': 48, # SYNC | PLAY - 'name': 'Spotify', - 'assets': self._assets, - 'party': self._party, - 'sync_id': self._sync_id, - 'session_id': self._session_id, - 'timestamps': self._timestamps, - 'details': self._details, - 'state': self._state, - } - - @property - def name(self) -> str: - """:class:`str`: The activity's name. This will always return "Spotify".""" - return 'Spotify' - - def __eq__(self, other: object) -> bool: - return ( - isinstance(other, Spotify) - and other._session_id == self._session_id - and other._sync_id == self._sync_id - and other.start == self.start - ) - - def __ne__(self, other: object) -> bool: - return not self.__eq__(other) - - def __hash__(self) -> int: - return hash(self._session_id) - - def __str__(self) -> str: - return 'Spotify' - - def __repr__(self) -> str: - return f'' - - @property - def title(self) -> str: - """:class:`str`: The title of the song being played.""" - return self._details - - @property - def artists(self) -> List[str]: - """List[:class:`str`]: The artists of the song being played.""" - return self._state.split('; ') - - @property - def artist(self) -> str: - """:class:`str`: The artist of the song being played. - - This does not attempt to split the artist information into - multiple artists. Useful if there's only a single artist. - """ - return self._state - - @property - def album(self) -> str: - """:class:`str`: The album that the song being played belongs to.""" - return self._assets.get('large_text', '') - - @property - def album_cover_url(self) -> str: - """:class:`str`: The album cover image URL from Spotify's CDN.""" - large_image = self._assets.get('large_image', '') - if large_image[:8] != 'spotify:': - return '' - album_image_id = large_image[8:] - return 'https://i.scdn.co/image/' + album_image_id - - @property - def track_id(self) -> str: - """:class:`str`: The track ID used by Spotify to identify this song.""" - return self._sync_id - - @property - def track_url(self) -> str: - """:class:`str`: The track URL to listen on Spotify. - - .. versionadded:: 2.0 - """ - return f'https://open.spotify.com/track/{self.track_id}' - - @property - def start(self) -> datetime.datetime: - """:class:`datetime.datetime`: When the user started playing this song in UTC.""" - # the start key will be present here - return datetime.datetime.fromtimestamp(self._timestamps['start'] / 1000, tz=datetime.timezone.utc) # type: ignore - - @property - def end(self) -> datetime.datetime: - """:class:`datetime.datetime`: When the user will stop playing this song in UTC.""" - # the end key will be present here - return datetime.datetime.fromtimestamp(self._timestamps['end'] / 1000, tz=datetime.timezone.utc) # type: ignore - - @property - def duration(self) -> datetime.timedelta: - """:class:`datetime.timedelta`: The duration of the song being played.""" - return self.end - self.start - - @property - def party_id(self) -> str: - """:class:`str`: The party ID of the listening party.""" - return self._party.get('id', '') - - -class CustomActivity(BaseActivity): - """Represents a custom activity from Discord. - - .. container:: operations - - .. describe:: x == y - - Checks if two activities are equal. - - .. describe:: x != y - - Checks if two activities are not equal. - - .. describe:: hash(x) - - Returns the activity's hash. - - .. describe:: str(x) - - Returns the custom status text. - - .. versionadded:: 1.3 - - Attributes - ----------- - name: Optional[:class:`str`] - The custom activity's name. - emoji: Optional[:class:`PartialEmoji`] - The emoji to pass to the activity, if any. - """ - - __slots__ = ('name', 'emoji', 'state') - - def __init__(self, name: Optional[str], *, emoji: Optional[PartialEmoji] = None, **extra: Any) -> None: - super().__init__(**extra) - self.name: Optional[str] = name - self.state: Optional[str] = extra.pop('state', None) - if self.name == 'Custom Status': - self.name = self.state - - self.emoji: Optional[PartialEmoji] - if emoji is None: - self.emoji = emoji - elif isinstance(emoji, dict): - self.emoji = PartialEmoji.from_dict(emoji) - elif isinstance(emoji, str): - self.emoji = PartialEmoji(name=emoji) - elif isinstance(emoji, PartialEmoji): - self.emoji = emoji - else: - raise TypeError(f'Expected str, PartialEmoji, or None, received {type(emoji)!r} instead.') - - @property - def type(self) -> ActivityType: - """:class:`ActivityType`: Returns the activity's type. This is for compatibility with :class:`Activity`. - - It always returns :attr:`ActivityType.custom`. - """ - return ActivityType.custom - - def to_dict(self) -> Dict[str, Any]: - if self.name == self.state: - o = { - 'type': ActivityType.custom.value, - 'state': self.name, - 'name': 'Custom Status', - } - else: - o = { - 'type': ActivityType.custom.value, - 'name': self.name, - } - - if self.emoji: - o['emoji'] = self.emoji.to_dict() - return o - - def __eq__(self, other: object) -> bool: - return isinstance(other, CustomActivity) and other.name == self.name and other.emoji == self.emoji - - def __ne__(self, other: object) -> bool: - return not self.__eq__(other) - - def __hash__(self) -> int: - return hash((self.name, str(self.emoji))) - - def __str__(self) -> str: - if self.emoji: - if self.name: - return f'{self.emoji} {self.name}' - return str(self.emoji) - else: - return str(self.name) - - def __repr__(self) -> str: - return f'' - - -ActivityTypes = Union[Activity, Game, CustomActivity, Streaming, Spotify] - - -@overload -def create_activity(data: ActivityPayload, state: ConnectionState) -> ActivityTypes: - ... - - -@overload -def create_activity(data: None, state: ConnectionState) -> None: - ... - - -def create_activity(data: Optional[ActivityPayload], state: ConnectionState) -> Optional[ActivityTypes]: - if not data: - return None - - game_type = try_enum(ActivityType, data.get('type', -1)) - if game_type is ActivityType.playing: - if 'application_id' in data or 'session_id' in data: - return Activity(**data) - return Game(**data) - elif game_type is ActivityType.custom: - try: - name = data.pop('name') # type: ignore - except KeyError: - ret = Activity(**data) - else: - # we removed the name key from data already - ret = CustomActivity(name=name, **data) # type: ignore - elif game_type is ActivityType.streaming: - if 'url' in data: - # the url won't be None here - return Streaming(**data) # type: ignore - return Activity(**data) - elif game_type is ActivityType.listening and 'sync_id' in data and 'session_id' in data: - return Spotify(**data) - else: - ret = Activity(**data) - - if isinstance(ret.emoji, PartialEmoji): - ret.emoji._state = state - return ret diff --git a/.venv/Lib/site-packages/discord/app_commands/__init__.py b/.venv/Lib/site-packages/discord/app_commands/__init__.py deleted file mode 100644 index 9714617..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -""" -discord.app_commands -~~~~~~~~~~~~~~~~~~~~~ - -Application commands support for the Discord API - -:copyright: (c) 2015-present Rapptz -:license: MIT, see LICENSE for more details. - -""" - -from .commands import * -from .errors import * -from .models import * -from .tree import * -from .namespace import * -from .transformers import * -from .translator import * -from . import checks as checks -from .checks import Cooldown as Cooldown diff --git a/.venv/Lib/site-packages/discord/app_commands/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/discord/app_commands/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index bdb9c1d3e159378fe50c2cf9aafec99ccf7363dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 590 zcmZut&1xGl5Z<*no3-Lx`UHYr>e4uEp_iqU1SbbW8cLHuSQdmLO>JTAN@!%4!K^2GKc*A8#Ybq)KEe2Rgle z^-||ow&8QlsU2djF4XH@fdsoRMfA~$LLSdYoa%-6|O~YG>nj3GS6?=~FDlwYA21`pr1%mq5=R3)0gsb3#gC?7dTqr7!6#F`@6@zWZ=w9U!!x zevLi-11V!oXc0>Kd4BzdA^^RZ&(1He&bKui5G#zT zm>Hv``QBbm4#GZT(g?;v@ib+~!8zkFTR%GjG z?u`qH8^)F{i|{LP<4$+*Pt3~t24i%+TrZ5P&j456*!s?R3XRo9QMsl*O01_FXgBqR xx~oxnIEo!td;wVZ*FWC9{xM^!Ri3e_y${95IPhA-r*3V05g|J$(%m;s{{ywruMGeI diff --git a/.venv/Lib/site-packages/discord/app_commands/__pycache__/checks.cpython-38.pyc b/.venv/Lib/site-packages/discord/app_commands/__pycache__/checks.cpython-38.pyc deleted file mode 100644 index 92a1d6fd166d8fb2d9deecb450d7aec71ae57ca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18660 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 C_T&@* diff --git a/.venv/Lib/site-packages/discord/app_commands/__pycache__/namespace.cpython-38.pyc b/.venv/Lib/site-packages/discord/app_commands/__pycache__/namespace.cpython-38.pyc deleted file mode 100644 index 717a1c5272a2365391c053ca90f0bac23011c76f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11309 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 DS)&^m diff --git a/.venv/Lib/site-packages/discord/app_commands/__pycache__/transformers.cpython-38.pyc b/.venv/Lib/site-packages/discord/app_commands/__pycache__/transformers.cpython-38.pyc deleted file mode 100644 index b6baade7e1e7bcd713d3bb1f142466788afbf686..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29723 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 diff --git a/.venv/Lib/site-packages/discord/app_commands/__pycache__/translator.cpython-38.pyc b/.venv/Lib/site-packages/discord/app_commands/__pycache__/translator.cpython-38.pyc deleted file mode 100644 index 87ab2cb5100d1d12fb27b85181a9f12a1accbba9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11308 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 diff --git a/.venv/Lib/site-packages/discord/app_commands/__pycache__/tree.cpython-38.pyc b/.venv/Lib/site-packages/discord/app_commands/__pycache__/tree.cpython-38.pyc deleted file mode 100644 index a91e233014d65dc66f488340a97322d69c33fa5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38137 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 HeDMDP+3ju) diff --git a/.venv/Lib/site-packages/discord/app_commands/checks.py b/.venv/Lib/site-packages/discord/app_commands/checks.py deleted file mode 100644 index 29cfe89..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/checks.py +++ /dev/null @@ -1,537 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -from typing import ( - Any, - Coroutine, - Dict, - Hashable, - Union, - Callable, - TypeVar, - Optional, - TYPE_CHECKING, -) - -import time - -from .commands import check -from .errors import ( - NoPrivateMessage, - MissingRole, - MissingAnyRole, - MissingPermissions, - BotMissingPermissions, - CommandOnCooldown, -) - -from ..user import User -from ..permissions import Permissions -from ..utils import get as utils_get, MISSING, maybe_coroutine - -T = TypeVar('T') - -if TYPE_CHECKING: - from typing_extensions import Self - from ..interactions import Interaction - - CooldownFunction = Union[ - Callable[[Interaction], Coroutine[Any, Any, T]], - Callable[[Interaction], T], - ] - -__all__ = ( - 'has_role', - 'has_any_role', - 'has_permissions', - 'bot_has_permissions', - 'cooldown', - 'dynamic_cooldown', -) - - -class Cooldown: - """Represents a cooldown for a command. - - .. versionadded:: 2.0 - - Attributes - ----------- - rate: :class:`float` - The total number of tokens available per :attr:`per` seconds. - per: :class:`float` - The length of the cooldown period in seconds. - """ - - __slots__ = ('rate', 'per', '_window', '_tokens', '_last') - - def __init__(self, rate: float, per: float) -> None: - self.rate: int = int(rate) - self.per: float = float(per) - self._window: float = 0.0 - self._tokens: int = self.rate - self._last: float = 0.0 - - def get_tokens(self, current: Optional[float] = None) -> int: - """Returns the number of available tokens before rate limiting is applied. - - Parameters - ------------ - current: Optional[:class:`float`] - The time in seconds since Unix epoch to calculate tokens at. - If not supplied then :func:`time.time()` is used. - - Returns - -------- - :class:`int` - The number of tokens available before the cooldown is to be applied. - """ - if not current: - current = time.time() - - # the calculated tokens should be non-negative - tokens = max(self._tokens, 0) - - if current > self._window + self.per: - tokens = self.rate - return tokens - - def get_retry_after(self, current: Optional[float] = None) -> float: - """Returns the time in seconds until the cooldown will be reset. - - Parameters - ------------- - current: Optional[:class:`float`] - The current time in seconds since Unix epoch. - If not supplied, then :func:`time.time()` is used. - - Returns - ------- - :class:`float` - The number of seconds to wait before this cooldown will be reset. - """ - current = current or time.time() - tokens = self.get_tokens(current) - - if tokens == 0: - return self.per - (current - self._window) - - return 0.0 - - def update_rate_limit(self, current: Optional[float] = None, *, tokens: int = 1) -> Optional[float]: - """Updates the cooldown rate limit. - - Parameters - ------------- - current: Optional[:class:`float`] - The time in seconds since Unix epoch to update the rate limit at. - If not supplied, then :func:`time.time()` is used. - tokens: :class:`int` - The amount of tokens to deduct from the rate limit. - - Returns - ------- - Optional[:class:`float`] - The retry-after time in seconds if rate limited. - """ - current = current or time.time() - self._last = current - - self._tokens = self.get_tokens(current) - - # first token used means that we start a new rate limit window - if self._tokens == self.rate: - self._window = current - - # decrement tokens by specified number - self._tokens -= tokens - - # check if we are rate limited and return retry-after - if self._tokens < 0: - return self.per - (current - self._window) - - def reset(self) -> None: - """Reset the cooldown to its initial state.""" - self._tokens = self.rate - self._last = 0.0 - - def copy(self) -> Self: - """Creates a copy of this cooldown. - - Returns - -------- - :class:`Cooldown` - A new instance of this cooldown. - """ - return Cooldown(self.rate, self.per) - - def __repr__(self) -> str: - return f'' - - -def has_role(item: Union[int, str], /) -> Callable[[T], T]: - """A :func:`~discord.app_commands.check` that is added that checks if the member invoking the - command has the role specified via the name or ID specified. - - If a string is specified, you must give the exact name of the role, including - caps and spelling. - - If an integer is specified, you must give the exact snowflake ID of the role. - - This check raises one of two special exceptions, :exc:`~discord.app_commands.MissingRole` - if the user is missing a role, or :exc:`~discord.app_commands.NoPrivateMessage` if - it is used in a private message. Both inherit from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - .. note:: - - This is different from the permission system that Discord provides for application - commands. This is done entirely locally in the program rather than being handled - by Discord. - - Parameters - ----------- - item: Union[:class:`int`, :class:`str`] - The name or ID of the role to check. - """ - - def predicate(interaction: Interaction) -> bool: - if isinstance(interaction.user, User): - raise NoPrivateMessage() - - if isinstance(item, int): - role = interaction.user.get_role(item) - else: - role = utils_get(interaction.user.roles, name=item) - - if role is None: - raise MissingRole(item) - return True - - return check(predicate) - - -def has_any_role(*items: Union[int, str]) -> Callable[[T], T]: - r"""A :func:`~discord.app_commands.check` that is added that checks if the member - invoking the command has **any** of the roles specified. This means that if they have - one out of the three roles specified, then this check will return ``True``. - - Similar to :func:`has_role`\, the names or IDs passed in must be exact. - - This check raises one of two special exceptions, :exc:`~discord.app_commands.MissingAnyRole` - if the user is missing all roles, or :exc:`~discord.app_commands.NoPrivateMessage` if - it is used in a private message. Both inherit from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - .. note:: - - This is different from the permission system that Discord provides for application - commands. This is done entirely locally in the program rather than being handled - by Discord. - - Parameters - ----------- - items: List[Union[:class:`str`, :class:`int`]] - An argument list of names or IDs to check that the member has roles wise. - - Example - -------- - - .. code-block:: python3 - - @tree.command() - @app_commands.checks.has_any_role('Library Devs', 'Moderators', 492212595072434186) - async def cool(interaction: discord.Interaction): - await interaction.response.send_message('You are cool indeed') - """ - - def predicate(interaction: Interaction) -> bool: - if isinstance(interaction.user, User): - raise NoPrivateMessage() - - if any( - interaction.user.get_role(item) is not None - if isinstance(item, int) - else utils_get(interaction.user.roles, name=item) is not None - for item in items - ): - return True - raise MissingAnyRole(list(items)) - - return check(predicate) - - -def has_permissions(**perms: bool) -> Callable[[T], T]: - r"""A :func:`~discord.app_commands.check` that is added that checks if the member - has all of the permissions necessary. - - Note that this check operates on the permissions given by - :attr:`discord.Interaction.permissions`. - - The permissions passed in must be exactly like the properties shown under - :class:`discord.Permissions`. - - This check raises a special exception, :exc:`~discord.app_commands.MissingPermissions` - that is inherited from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - .. note:: - - This is different from the permission system that Discord provides for application - commands. This is done entirely locally in the program rather than being handled - by Discord. - - Parameters - ------------ - \*\*perms: :class:`bool` - Keyword arguments denoting the permissions to check for. - - Example - --------- - - .. code-block:: python3 - - @tree.command() - @app_commands.checks.has_permissions(manage_messages=True) - async def test(interaction: discord.Interaction): - await interaction.response.send_message('You can manage messages.') - - """ - - invalid = perms.keys() - Permissions.VALID_FLAGS.keys() - if invalid: - raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") - - def predicate(interaction: Interaction) -> bool: - permissions = interaction.permissions - - missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] - - if not missing: - return True - - raise MissingPermissions(missing) - - return check(predicate) - - -def bot_has_permissions(**perms: bool) -> Callable[[T], T]: - """Similar to :func:`has_permissions` except checks if the bot itself has - the permissions listed. This relies on :attr:`discord.Interaction.app_permissions`. - - This check raises a special exception, :exc:`~discord.app_commands.BotMissingPermissions` - that is inherited from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - """ - - invalid = set(perms) - set(Permissions.VALID_FLAGS) - if invalid: - raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") - - def predicate(interaction: Interaction) -> bool: - permissions = interaction.app_permissions - missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] - - if not missing: - return True - - raise BotMissingPermissions(missing) - - return check(predicate) - - -def _create_cooldown_decorator( - key: CooldownFunction[Hashable], factory: CooldownFunction[Optional[Cooldown]] -) -> Callable[[T], T]: - - mapping: Dict[Any, Cooldown] = {} - - async def get_bucket( - interaction: Interaction, - *, - mapping: Dict[Any, Cooldown] = mapping, - key: CooldownFunction[Hashable] = key, - factory: CooldownFunction[Optional[Cooldown]] = factory, - ) -> Optional[Cooldown]: - current = interaction.created_at.timestamp() - dead_keys = [k for k, v in mapping.items() if current > v._last + v.per] - for k in dead_keys: - del mapping[k] - - k = await maybe_coroutine(key, interaction) - if k not in mapping: - bucket: Optional[Cooldown] = await maybe_coroutine(factory, interaction) - if bucket is not None: - mapping[k] = bucket - else: - bucket = mapping[k] - - return bucket - - async def predicate(interaction: Interaction) -> bool: - bucket = await get_bucket(interaction) - if bucket is None: - return True - - retry_after = bucket.update_rate_limit(interaction.created_at.timestamp()) - if retry_after is None: - return True - - raise CommandOnCooldown(bucket, retry_after) - - return check(predicate) - - -def cooldown( - rate: float, - per: float, - *, - key: Optional[CooldownFunction[Hashable]] = MISSING, -) -> Callable[[T], T]: - """A decorator that adds a cooldown to a command. - - A cooldown allows a command to only be used a specific amount - of times in a specific time frame. These cooldowns are based off - of the ``key`` function provided. If a ``key`` is not provided - then it defaults to a user-level cooldown. The ``key`` function - must take a single parameter, the :class:`discord.Interaction` and - return a value that is used as a key to the internal cooldown mapping. - - The ``key`` function can optionally be a coroutine. - - If a cooldown is triggered, then :exc:`~discord.app_commands.CommandOnCooldown` is - raised to the error handlers. - - Examples - --------- - - Setting a one per 5 seconds per member cooldown on a command: - - .. code-block:: python3 - - @tree.command() - @app_commands.checks.cooldown(1, 5.0, key=lambda i: (i.guild_id, i.user.id)) - async def test(interaction: discord.Interaction): - await interaction.response.send_message('Hello') - - @test.error - async def on_test_error(interaction: discord.Interaction, error: app_commands.AppCommandError): - if isinstance(error, app_commands.CommandOnCooldown): - await interaction.response.send_message(str(error), ephemeral=True) - - Parameters - ------------ - rate: :class:`int` - The number of times a command can be used before triggering a cooldown. - per: :class:`float` - The amount of seconds to wait for a cooldown when it's been triggered. - key: Optional[Callable[[:class:`discord.Interaction`], :class:`collections.abc.Hashable`]] - A function that returns a key to the mapping denoting the type of cooldown. - Can optionally be a coroutine. If not given then defaults to a user-level - cooldown. If ``None`` is passed then it is interpreted as a "global" cooldown. - """ - - if key is MISSING: - key_func = lambda interaction: interaction.user.id - elif key is None: - key_func = lambda i: None - else: - key_func = key - - factory = lambda interaction: Cooldown(rate, per) - - return _create_cooldown_decorator(key_func, factory) - - -def dynamic_cooldown( - factory: CooldownFunction[Optional[Cooldown]], - *, - key: Optional[CooldownFunction[Hashable]] = MISSING, -) -> Callable[[T], T]: - """A decorator that adds a dynamic cooldown to a command. - - A cooldown allows a command to only be used a specific amount - of times in a specific time frame. These cooldowns are based off - of the ``key`` function provided. If a ``key`` is not provided - then it defaults to a user-level cooldown. The ``key`` function - must take a single parameter, the :class:`discord.Interaction` and - return a value that is used as a key to the internal cooldown mapping. - - If a ``factory`` function is given, it must be a function that - accepts a single parameter of type :class:`discord.Interaction` and must - return a :class:`~discord.app_commands.Cooldown` or ``None``. - If ``None`` is returned then that cooldown is effectively bypassed. - - Both ``key`` and ``factory`` can optionally be coroutines. - - If a cooldown is triggered, then :exc:`~discord.app_commands.CommandOnCooldown` is - raised to the error handlers. - - Examples - --------- - - Setting a cooldown for everyone but the owner. - - .. code-block:: python3 - - def cooldown_for_everyone_but_me(interaction: discord.Interaction) -> Optional[app_commands.Cooldown]: - if interaction.user.id == 80088516616269824: - return None - return app_commands.Cooldown(1, 10.0) - - @tree.command() - @app_commands.checks.dynamic_cooldown(cooldown_for_everyone_but_me) - async def test(interaction: discord.Interaction): - await interaction.response.send_message('Hello') - - @test.error - async def on_test_error(interaction: discord.Interaction, error: app_commands.AppCommandError): - if isinstance(error, app_commands.CommandOnCooldown): - await interaction.response.send_message(str(error), ephemeral=True) - - Parameters - ------------ - factory: Optional[Callable[[:class:`discord.Interaction`], Optional[:class:`~discord.app_commands.Cooldown`]]] - A function that takes an interaction and returns a cooldown that will apply to that interaction - or ``None`` if the interaction should not have a cooldown. - key: Optional[Callable[[:class:`discord.Interaction`], :class:`collections.abc.Hashable`]] - A function that returns a key to the mapping denoting the type of cooldown. - Can optionally be a coroutine. If not given then defaults to a user-level - cooldown. If ``None`` is passed then it is interpreted as a "global" cooldown. - """ - - if key is MISSING: - key_func = lambda interaction: interaction.user.id - elif key is None: - key_func = lambda i: None - else: - key_func = key - - return _create_cooldown_decorator(key_func, factory) diff --git a/.venv/Lib/site-packages/discord/app_commands/commands.py b/.venv/Lib/site-packages/discord/app_commands/commands.py deleted file mode 100644 index c4f9163..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/commands.py +++ /dev/null @@ -1,2509 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -import inspect - -from typing import ( - Any, - Callable, - ClassVar, - Coroutine, - Dict, - Generator, - Generic, - List, - MutableMapping, - Optional, - Set, - TYPE_CHECKING, - Tuple, - Type, - TypeVar, - Union, - overload, -) -from textwrap import TextWrapper - -import re - -from ..enums import AppCommandOptionType, AppCommandType, ChannelType, Locale -from .models import Choice -from .transformers import annotation_to_parameter, CommandParameter, NoneType -from .errors import AppCommandError, CheckFailure, CommandInvokeError, CommandSignatureMismatch, CommandAlreadyRegistered -from .translator import TranslationContextLocation, TranslationContext, Translator, locale_str -from ..message import Message -from ..user import User -from ..member import Member -from ..permissions import Permissions -from ..utils import resolve_annotation, MISSING, is_inside_class, maybe_coroutine, async_all - -if TYPE_CHECKING: - from typing_extensions import ParamSpec, Concatenate - from ..interactions import Interaction - from ..abc import Snowflake - from .namespace import Namespace - from .models import ChoiceT - - # Generally, these two libraries are supposed to be separate from each other. - # However, for type hinting purposes it's unfortunately necessary for one to - # reference the other to prevent type checking errors in callbacks - from discord.ext.commands import Cog - - ErrorFunc = Callable[[Interaction, AppCommandError], Coroutine[Any, Any, None]] - -__all__ = ( - 'Command', - 'ContextMenu', - 'Group', - 'Parameter', - 'context_menu', - 'command', - 'describe', - 'check', - 'rename', - 'choices', - 'autocomplete', - 'guilds', - 'guild_only', - 'default_permissions', -) - -if TYPE_CHECKING: - P = ParamSpec('P') -else: - P = TypeVar('P') - -T = TypeVar('T') -F = TypeVar('F', bound=Callable[..., Any]) -GroupT = TypeVar('GroupT', bound='Binding') -Coro = Coroutine[Any, Any, T] -UnboundError = Callable[['Interaction', AppCommandError], Coro[Any]] -Error = Union[ - Callable[[GroupT, 'Interaction', AppCommandError], Coro[Any]], - UnboundError, -] -Check = Callable[['Interaction'], Union[bool, Coro[bool]]] -Binding = Union['Group', 'Cog'] - - -if TYPE_CHECKING: - CommandCallback = Union[ - Callable[Concatenate[GroupT, 'Interaction', P], Coro[T]], - Callable[Concatenate['Interaction', P], Coro[T]], - ] - - ContextMenuCallback = Union[ - # If groups end up support context menus these would be uncommented - # Callable[[GroupT, 'Interaction', Member], Coro[Any]], - # Callable[[GroupT, 'Interaction', User], Coro[Any]], - # Callable[[GroupT, 'Interaction', Message], Coro[Any]], - # Callable[[GroupT, 'Interaction', Union[Member, User]], Coro[Any]], - Callable[['Interaction', Member], Coro[Any]], - Callable[['Interaction', User], Coro[Any]], - Callable[['Interaction', Message], Coro[Any]], - Callable[['Interaction', Union[Member, User]], Coro[Any]], - ] - - AutocompleteCallback = Union[ - Callable[[GroupT, 'Interaction', ChoiceT], Coro[List[Choice[ChoiceT]]]], - Callable[['Interaction', ChoiceT], Coro[List[Choice[ChoiceT]]]], - ] -else: - CommandCallback = Callable[..., Coro[T]] - ContextMenuCallback = Callable[..., Coro[T]] - AutocompleteCallback = Callable[..., Coro[T]] - - -CheckInputParameter = Union['Command[Any, ..., Any]', 'ContextMenu', 'CommandCallback[Any, ..., Any]', ContextMenuCallback] - -# The re module doesn't support \p{} so we have to list characters from Thai and Devanagari manually. -THAI_COMBINING = r'\u0e31-\u0e3a\u0e47-\u0e4e' -DEVANAGARI_COMBINING = r'\u0900-\u0903\u093a\u093b\u093c\u093e\u093f\u0940-\u094f\u0955\u0956\u0957\u0962\u0963' -VALID_SLASH_COMMAND_NAME = re.compile(r'^[-_\w' + THAI_COMBINING + DEVANAGARI_COMBINING + r']{1,32}$') - -CAMEL_CASE_REGEX = re.compile(r'(?\w+)' - -ARG_DESCRIPTION_SUBREGEX = r'(?P(?:.|\n)+?(?:\Z|\r?\n(?=[\S\r\n])))' - -ARG_TYPE_SUBREGEX = r'(?:.+)' - -GOOGLE_DOCSTRING_ARG_REGEX = re.compile( - rf'^{ARG_NAME_SUBREGEX}[ \t]*(?:\({ARG_TYPE_SUBREGEX}\))?[ \t]*:[ \t]*{ARG_DESCRIPTION_SUBREGEX}', - re.MULTILINE, -) - -SPHINX_DOCSTRING_ARG_REGEX = re.compile( - rf'^:param {ARG_NAME_SUBREGEX}:[ \t]+{ARG_DESCRIPTION_SUBREGEX}', - re.MULTILINE, -) - -NUMPY_DOCSTRING_ARG_REGEX = re.compile( - rf'^{ARG_NAME_SUBREGEX}(?:[ \t]*:)?(?:[ \t]+{ARG_TYPE_SUBREGEX})?[ \t]*\r?\n[ \t]+{ARG_DESCRIPTION_SUBREGEX}', - re.MULTILINE, -) - - -def _shorten( - input: str, - *, - _wrapper: TextWrapper = TextWrapper(width=100, max_lines=1, replace_whitespace=True, placeholder='…'), -) -> str: - try: - # split on the first double newline since arguments may appear after that - input, _ = re.split(r'\n\s*\n', input, maxsplit=1) - except ValueError: - pass - return _wrapper.fill(' '.join(input.strip().split())) - - -def _parse_args_from_docstring(func: Callable[..., Any], params: Dict[str, CommandParameter]) -> Dict[str, str]: - docstring = inspect.getdoc(func) - - if docstring is None: - return {} - - # Extract the arguments - # Note: These are loose regexes, but they are good enough for our purposes - # For Google-style, look only at the lines that are indented - section_lines = inspect.cleandoc('\n'.join(line for line in docstring.splitlines() if line.startswith(' '))) - docstring_styles = ( - GOOGLE_DOCSTRING_ARG_REGEX.finditer(section_lines), - SPHINX_DOCSTRING_ARG_REGEX.finditer(docstring), - NUMPY_DOCSTRING_ARG_REGEX.finditer(docstring), - ) - - return { - m.group('name'): m.group('description') for matches in docstring_styles for m in matches if m.group('name') in params - } - - -def _to_kebab_case(text: str) -> str: - return CAMEL_CASE_REGEX.sub('-', text).lower() - - -def validate_name(name: str) -> str: - match = VALID_SLASH_COMMAND_NAME.match(name) - if match is None: - raise ValueError( - f'{name!r} must be between 1-32 characters and contain only lower-case letters, numbers, hyphens, or underscores.' - ) - - # Ideally, name.islower() would work instead but since certain characters - # are Lo (e.g. CJK) those don't pass the test. I'd use `casefold` instead as - # well, but chances are the server-side check is probably something similar to - # this code anyway. - if name.lower() != name: - raise ValueError(f'{name!r} must be all lower-case') - return name - - -def validate_context_menu_name(name: str) -> str: - if not name or len(name) > 32: - raise ValueError('context menu names must be between 1-32 characters') - return name - - -def _validate_auto_complete_callback( - callback: AutocompleteCallback[GroupT, ChoiceT] -) -> AutocompleteCallback[GroupT, ChoiceT]: - # This function needs to ensure the following is true: - # If self.foo is passed then don't pass command.binding to the callback - # If Class.foo is passed then it is assumed command.binding has to be passed - # If free_function_foo is passed then no binding should be passed at all - # Passing command.binding is mandated by pass_command_binding - - binding = getattr(callback, '__self__', None) - pass_command_binding = binding is None and is_inside_class(callback) - - # 'method' objects can't have dynamic attributes - if binding is None: - callback.pass_command_binding = pass_command_binding - - required_parameters = 2 + pass_command_binding - params = inspect.signature(callback).parameters - if len(params) != required_parameters: - raise TypeError(f'autocomplete callback {callback.__qualname__!r} requires either 2 or 3 parameters to be passed') - - return callback - - -def _context_menu_annotation(annotation: Any, *, _none: type = NoneType) -> AppCommandType: - if annotation is Message: - return AppCommandType.message - - supported_types: Set[Any] = {Member, User} - if annotation in supported_types: - return AppCommandType.user - - # Check if there's an origin - origin = getattr(annotation, '__origin__', None) - if origin is not Union: - # Only Union is supported so bail early - msg = ( - f'unsupported type annotation {annotation!r}, must be either discord.Member, ' - 'discord.User, discord.Message, or a typing.Union of discord.Member and discord.User' - ) - raise TypeError(msg) - - # Only Union[Member, User] is supported - if not all(arg in supported_types for arg in annotation.__args__): - raise TypeError(f'unsupported types given inside {annotation!r}') - - return AppCommandType.user - - -def _populate_descriptions(params: Dict[str, CommandParameter], descriptions: Dict[str, Any]) -> None: - for name, param in params.items(): - description = descriptions.pop(name, MISSING) - if description is MISSING: - param.description = '…' - continue - - if not isinstance(description, (str, locale_str)): - raise TypeError('description must be a string') - - if isinstance(description, str): - param.description = _shorten(description) - else: - param.description = description - - if descriptions: - first = next(iter(descriptions)) - raise TypeError(f'unknown parameter given: {first}') - - -def _populate_renames(params: Dict[str, CommandParameter], renames: Dict[str, Union[str, locale_str]]) -> None: - rename_map: Dict[str, Union[str, locale_str]] = {} - - # original name to renamed name - - for name in params.keys(): - new_name = renames.pop(name, MISSING) - - if new_name is MISSING: - rename_map[name] = name - continue - - if name in rename_map: - raise ValueError(f'{new_name} is already used') - - if isinstance(new_name, str): - new_name = validate_name(new_name) - else: - validate_name(new_name.message) - - rename_map[name] = new_name - params[name]._rename = new_name - - if renames: - first = next(iter(renames)) - raise ValueError(f'unknown parameter given: {first}') - - -def _populate_choices(params: Dict[str, CommandParameter], all_choices: Dict[str, List[Choice]]) -> None: - for name, param in params.items(): - choices = all_choices.pop(name, MISSING) - if choices is MISSING: - continue - - if not isinstance(choices, list): - raise TypeError('choices must be a list of Choice') - - if not all(isinstance(choice, Choice) for choice in choices): - raise TypeError('choices must be a list of Choice') - - if param.type not in (AppCommandOptionType.string, AppCommandOptionType.number, AppCommandOptionType.integer): - raise TypeError('choices are only supported for integer, string, or number option types') - - if not all(param.type == choice._option_type for choice in choices): - raise TypeError('choices must all have the same inner option type as the parameter choice type') - - param.choices = choices - - if all_choices: - first = next(iter(all_choices)) - raise TypeError(f'unknown parameter given: {first}') - - -def _populate_autocomplete(params: Dict[str, CommandParameter], autocomplete: Dict[str, Any]) -> None: - for name, param in params.items(): - callback = autocomplete.pop(name, MISSING) - if callback is MISSING: - continue - - if not inspect.iscoroutinefunction(callback): - raise TypeError('autocomplete callback must be a coroutine function') - - if param.type not in (AppCommandOptionType.string, AppCommandOptionType.number, AppCommandOptionType.integer): - raise TypeError('autocomplete is only supported for integer, string, or number option types') - - if param.is_choice_annotation(): - raise TypeError( - 'Choice annotation unsupported for autocomplete parameters, consider using a regular annotation instead' - ) - - param.autocomplete = _validate_auto_complete_callback(callback) - - if autocomplete: - first = next(iter(autocomplete)) - raise TypeError(f'unknown parameter given: {first}') - - -def _extract_parameters_from_callback(func: Callable[..., Any], globalns: Dict[str, Any]) -> Dict[str, CommandParameter]: - params = inspect.signature(func).parameters - cache = {} - required_params = is_inside_class(func) + 1 - if len(params) < required_params: - raise TypeError(f'callback {func.__qualname__!r} must have more than {required_params - 1} parameter(s)') - - iterator = iter(params.values()) - for _ in range(0, required_params): - next(iterator) - - parameters: List[CommandParameter] = [] - for parameter in iterator: - if parameter.annotation is parameter.empty: - raise TypeError(f'parameter {parameter.name!r} is missing a type annotation in callback {func.__qualname__!r}') - - resolved = resolve_annotation(parameter.annotation, globalns, globalns, cache) - param = annotation_to_parameter(resolved, parameter) - parameters.append(param) - - values = sorted(parameters, key=lambda a: a.required, reverse=True) - result = {v.name: v for v in values} - - descriptions = _parse_args_from_docstring(func, result) - - try: - descriptions.update(func.__discord_app_commands_param_description__) - except AttributeError: - for param in values: - if param.description is MISSING: - param.description = '…' - if descriptions: - _populate_descriptions(result, descriptions) - - try: - renames = func.__discord_app_commands_param_rename__ - except AttributeError: - pass - else: - _populate_renames(result, renames.copy()) - - try: - choices = func.__discord_app_commands_param_choices__ - except AttributeError: - pass - else: - _populate_choices(result, choices.copy()) - - try: - autocomplete = func.__discord_app_commands_param_autocomplete__ - except AttributeError: - pass - else: - _populate_autocomplete(result, autocomplete.copy()) - - return result - - -def _get_context_menu_parameter(func: ContextMenuCallback) -> Tuple[str, Any, AppCommandType]: - params = inspect.signature(func).parameters - if len(params) != 2: - msg = ( - f'context menu callback {func.__qualname__!r} requires 2 parameters, ' - 'the first one being the interaction and the other one explicitly ' - 'annotated with either discord.Message, discord.User, discord.Member, ' - 'or a typing.Union of discord.Member and discord.User' - ) - raise TypeError(msg) - - iterator = iter(params.values()) - next(iterator) # skip interaction - parameter = next(iterator) - if parameter.annotation is parameter.empty: - msg = ( - f'second parameter of context menu callback {func.__qualname__!r} must be explicitly ' - 'annotated with either discord.Message, discord.User, discord.Member, or ' - 'a typing.Union of discord.Member and discord.User' - ) - raise TypeError(msg) - - resolved = resolve_annotation(parameter.annotation, func.__globals__, func.__globals__, {}) - type = _context_menu_annotation(resolved) - return (parameter.name, resolved, type) - - -class Parameter: - """A class that contains the parameter information of a :class:`Command` callback. - - .. versionadded:: 2.0 - - Attributes - ----------- - name: :class:`str` - The name of the parameter. This is the Python identifier for the parameter. - display_name: :class:`str` - The displayed name of the parameter on Discord. - description: :class:`str` - The description of the parameter. - autocomplete: :class:`bool` - Whether the parameter has an autocomplete handler. - locale_name: Optional[:class:`locale_str`] - The display name's locale string, if available. - locale_description: Optional[:class:`locale_str`] - The description's locale string, if available. - required: :class:`bool` - Whether the parameter is required - choices: List[:class:`~discord.app_commands.Choice`] - A list of choices this parameter takes, if any. - type: :class:`~discord.AppCommandOptionType` - The underlying type of this parameter. - channel_types: List[:class:`~discord.ChannelType`] - The channel types that are allowed for this parameter. - min_value: Optional[Union[:class:`int`, :class:`float`]] - The minimum supported value for this parameter. - max_value: Optional[Union[:class:`int`, :class:`float`]] - The maximum supported value for this parameter. - default: Any - The default value of the parameter, if given. - If not given then this is :data:`~discord.utils.MISSING`. - command: :class:`Command` - The command this parameter is attached to. - """ - - def __init__(self, parent: CommandParameter, command: Command[Any, ..., Any]) -> None: - self.__parent: CommandParameter = parent - self.__command: Command[Any, ..., Any] = command - - @property - def command(self) -> Command[Any, ..., Any]: - return self.__command - - @property - def name(self) -> str: - return self.__parent.name - - @property - def display_name(self) -> str: - return self.__parent.display_name - - @property - def required(self) -> bool: - return self.__parent.required - - @property - def description(self) -> str: - return str(self.__parent.description) - - @property - def locale_name(self) -> Optional[locale_str]: - if isinstance(self.__parent._rename, locale_str): - return self.__parent._rename - return None - - @property - def locale_description(self) -> Optional[locale_str]: - if isinstance(self.__parent.description, locale_str): - return self.__parent.description - return None - - @property - def autocomplete(self) -> bool: - return self.__parent.autocomplete is not None - - @property - def default(self) -> Any: - return self.__parent.default - - @property - def type(self) -> AppCommandOptionType: - return self.__parent.type - - @property - def choices(self) -> List[Choice[Union[int, float, str]]]: - choices = self.__parent.choices - if choices is MISSING: - return [] - return choices.copy() - - @property - def channel_types(self) -> List[ChannelType]: - channel_types = self.__parent.channel_types - if channel_types is MISSING: - return [] - return channel_types.copy() - - @property - def min_value(self) -> Optional[Union[int, float]]: - return self.__parent.min_value - - @property - def max_value(self) -> Optional[Union[int, float]]: - return self.__parent.max_value - - -class Command(Generic[GroupT, P, T]): - """A class that implements an application command. - - These are usually not created manually, instead they are created using - one of the following decorators: - - - :func:`~discord.app_commands.command` - - :meth:`Group.command ` - - :meth:`CommandTree.command ` - - .. versionadded:: 2.0 - - Parameters - ----------- - name: Union[:class:`str`, :class:`locale_str`] - The name of the application command. - description: Union[:class:`str`, :class:`locale_str`] - The description of the application command. This shows up in the UI to describe - the application command. - callback: :ref:`coroutine ` - The coroutine that is executed when the command is called. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. - Defaults to ``False``. - - Due to a Discord limitation, this does not work on subcommands. - parent: Optional[:class:`Group`] - The parent application command. ``None`` if there isn't one. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - - Attributes - ------------ - name: :class:`str` - The name of the application command. - description: :class:`str` - The description of the application command. This shows up in the UI to describe - the application command. - checks - A list of predicates that take a :class:`~discord.Interaction` parameter - to indicate whether the command callback should be executed. If an exception - is necessary to be thrown to signal failure, then one inherited from - :exc:`AppCommandError` should be used. If all the checks fail without - propagating an exception, :exc:`CheckFailure` is raised. - default_permissions: Optional[:class:`~discord.Permissions`] - The default permissions that can execute this command on Discord. Note - that server administrators can override this value in the client. - Setting an empty permissions field will disallow anyone except server - administrators from using the command in a guild. - - Due to a Discord limitation, this does not work on subcommands. - guild_only: :class:`bool` - Whether the command should only be usable in guild contexts. - - Due to a Discord limitation, this does not work on subcommands. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. - - Due to a Discord limitation, this does not work on subcommands. - parent: Optional[:class:`Group`] - The parent application command. ``None`` if there isn't one. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - def __init__( - self, - *, - name: Union[str, locale_str], - description: Union[str, locale_str], - callback: CommandCallback[GroupT, P, T], - nsfw: bool = False, - parent: Optional[Group] = None, - guild_ids: Optional[List[int]] = None, - auto_locale_strings: bool = True, - extras: Dict[Any, Any] = MISSING, - ): - name, locale = (name.message, name) if isinstance(name, locale_str) else (name, None) - self.name: str = validate_name(name) - self._locale_name: Optional[locale_str] = locale - description, locale = ( - (description.message, description) if isinstance(description, locale_str) else (description, None) - ) - self.description: str = description - self._locale_description: Optional[locale_str] = locale - self._attr: Optional[str] = None - self._callback: CommandCallback[GroupT, P, T] = callback - self.parent: Optional[Group] = parent - self.binding: Optional[GroupT] = None - self.on_error: Optional[Error[GroupT]] = None - self.module: Optional[str] = callback.__module__ - - # Unwrap __self__ for bound methods - try: - self.binding = callback.__self__ - self._callback = callback = callback.__func__ - except AttributeError: - pass - - self._params: Dict[str, CommandParameter] = _extract_parameters_from_callback(callback, callback.__globals__) - self.checks: List[Check] = getattr(callback, '__discord_app_commands_checks__', []) - self._guild_ids: Optional[List[int]] = guild_ids or getattr( - callback, '__discord_app_commands_default_guilds__', None - ) - self.default_permissions: Optional[Permissions] = getattr( - callback, '__discord_app_commands_default_permissions__', None - ) - self.guild_only: bool = getattr(callback, '__discord_app_commands_guild_only__', False) - self.nsfw: bool = nsfw - self.extras: Dict[Any, Any] = extras or {} - - if self._guild_ids is not None and self.parent is not None: - raise ValueError('child commands cannot have default guilds set, consider setting them in the parent instead') - - if auto_locale_strings: - self._convert_to_locale_strings() - - def _convert_to_locale_strings(self) -> None: - if self._locale_name is None: - self._locale_name = locale_str(self.name) - if self._locale_description is None: - self._locale_description = locale_str(self.description) - - for param in self._params.values(): - param._convert_to_locale_strings() - - def __set_name__(self, owner: Type[Any], name: str) -> None: - self._attr = name - - @property - def callback(self) -> CommandCallback[GroupT, P, T]: - """:ref:`coroutine `: The coroutine that is executed when the command is called.""" - return self._callback - - def _copy_with( - self, - *, - parent: Optional[Group], - binding: GroupT, - bindings: MutableMapping[GroupT, GroupT] = MISSING, - set_on_binding: bool = True, - ) -> Command: - bindings = {} if bindings is MISSING else bindings - - cls = self.__class__ - copy = cls.__new__(cls) - copy.name = self.name - copy._locale_name = self._locale_name - copy._guild_ids = self._guild_ids - copy.checks = self.checks - copy.description = self.description - copy._locale_description = self._locale_description - copy.default_permissions = self.default_permissions - copy.guild_only = self.guild_only - copy.nsfw = self.nsfw - copy._attr = self._attr - copy._callback = self._callback - copy.on_error = self.on_error - copy._params = self._params.copy() - copy.module = self.module - copy.parent = parent - copy.binding = bindings.get(self.binding) if self.binding is not None else binding - copy.extras = self.extras - - if copy._attr and set_on_binding: - setattr(copy.binding, copy._attr, copy) - - return copy - - async def get_translated_payload(self, translator: Translator) -> Dict[str, Any]: - base = self.to_dict() - name_localizations: Dict[str, str] = {} - description_localizations: Dict[str, str] = {} - - # Prevent creating these objects in a heavy loop - name_context = TranslationContext(location=TranslationContextLocation.command_name, data=self) - description_context = TranslationContext(location=TranslationContextLocation.command_description, data=self) - - for locale in Locale: - if self._locale_name: - translation = await translator._checked_translate(self._locale_name, locale, name_context) - if translation is not None: - name_localizations[locale.value] = translation - - if self._locale_description: - translation = await translator._checked_translate(self._locale_description, locale, description_context) - if translation is not None: - description_localizations[locale.value] = translation - - base['name_localizations'] = name_localizations - base['description_localizations'] = description_localizations - base['options'] = [ - await param.get_translated_payload(translator, Parameter(param, self)) for param in self._params.values() - ] - return base - - def to_dict(self) -> Dict[str, Any]: - # If we have a parent then our type is a subcommand - # Otherwise, the type falls back to the specific command type (e.g. slash command or context menu) - option_type = AppCommandType.chat_input.value if self.parent is None else AppCommandOptionType.subcommand.value - base: Dict[str, Any] = { - 'name': self.name, - 'description': self.description, - 'type': option_type, - 'options': [param.to_dict() for param in self._params.values()], - } - - if self.parent is None: - base['nsfw'] = self.nsfw - base['dm_permission'] = not self.guild_only - base['default_member_permissions'] = None if self.default_permissions is None else self.default_permissions.value - - return base - - async def _invoke_error_handlers(self, interaction: Interaction, error: AppCommandError) -> None: - # These type ignores are because the type checker can't narrow this type properly. - if self.on_error is not None: - if self.binding is not None: - await self.on_error(self.binding, interaction, error) # type: ignore - else: - await self.on_error(interaction, error) # type: ignore - - parent = self.parent - if parent is not None: - await parent.on_error(interaction, error) - - if parent.parent is not None: - await parent.parent.on_error(interaction, error) - - binding_error_handler = getattr(self.binding, '__discord_app_commands_error_handler__', None) - if binding_error_handler is not None: - await binding_error_handler(interaction, error) - - def _has_any_error_handlers(self) -> bool: - if self.on_error is not None: - return True - - parent = self.parent - if parent is not None: - # Check if the on_error is overridden - if parent.__class__.on_error is not Group.on_error: - return True - - if parent.parent is not None: - parent_cls = parent.parent.__class__ - if parent_cls.on_error is not Group.on_error: - return True - - return False - - async def _transform_arguments(self, interaction: Interaction, namespace: Namespace) -> Dict[str, Any]: - values = namespace.__dict__ - transformed_values = {} - - for param in self._params.values(): - try: - value = values[param.display_name] - except KeyError: - if not param.required: - transformed_values[param.name] = param.default - else: - raise CommandSignatureMismatch(self) from None - else: - transformed_values[param.name] = await param.transform(interaction, value) - - return transformed_values - - async def _do_call(self, interaction: Interaction, params: Dict[str, Any]) -> T: - # These type ignores are because the type checker doesn't quite understand the narrowing here - # Likewise, it thinks we're missing positional arguments when there aren't any. - try: - if self.binding is not None: - return await self._callback(self.binding, interaction, **params) # type: ignore - return await self._callback(interaction, **params) # type: ignore - except TypeError as e: - # In order to detect mismatch from the provided signature and the Discord data, - # there are many ways it can go wrong yet all of them eventually lead to a TypeError - # from the Python compiler showcasing that the signature is incorrect. This lovely - # piece of code essentially checks the last frame of the caller and checks if the - # locals contains our `self` reference. - # - # This is because there is a possibility that a TypeError is raised within the body - # of the function, and in that case the locals wouldn't contain a reference to - # the command object under the name `self`. - frame = inspect.trace()[-1].frame - if frame.f_locals.get('self') is self: - raise CommandSignatureMismatch(self) from None - raise CommandInvokeError(self, e) from e - except AppCommandError: - raise - except Exception as e: - raise CommandInvokeError(self, e) from e - - async def _invoke_with_namespace(self, interaction: Interaction, namespace: Namespace) -> T: - if not await self._check_can_run(interaction): - raise CheckFailure(f'The check functions for command {self.name!r} failed.') - - transformed_values = await self._transform_arguments(interaction, namespace) - return await self._do_call(interaction, transformed_values) - - async def _invoke_autocomplete(self, interaction: Interaction, name: str, namespace: Namespace): - # The namespace contains the Discord provided names so this will be fine - # even if the name is renamed - value = namespace.__dict__[name] - - try: - param = self._params[name] - except KeyError: - # Slow case, it might be a rename - params = {param.display_name: param for param in self._params.values()} - try: - param = params[name] - except KeyError: - raise CommandSignatureMismatch(self) from None - - if param.autocomplete is None: - raise CommandSignatureMismatch(self) - - predicates = getattr(param.autocomplete, '__discord_app_commands_checks__', []) - if predicates: - try: - if not await async_all(f(interaction) for f in predicates): - if not interaction.response.is_done(): - await interaction.response.autocomplete([]) - return - except Exception: - if not interaction.response.is_done(): - await interaction.response.autocomplete([]) - return - - if getattr(param.autocomplete, 'pass_command_binding', False): - binding = self.binding - if binding is not None: - choices = await param.autocomplete(binding, interaction, value) - else: - raise TypeError('autocomplete parameter expected a bound self parameter but one was not provided') - else: - choices = await param.autocomplete(interaction, value) - - if interaction.response.is_done(): - return - - await interaction.response.autocomplete(choices) - - def _get_internal_command(self, name: str) -> Optional[Union[Command, Group]]: - return None - - @property - def parameters(self) -> List[Parameter]: - """Returns a list of parameters for this command. - - This does not include the ``self`` or ``interaction`` parameters. - - Returns - -------- - List[:class:`Parameter`] - The parameters of this command. - """ - return [Parameter(p, self) for p in self._params.values()] - - def get_parameter(self, name: str) -> Optional[Parameter]: - """Retrieves a parameter by its name. - - The name must be the Python identifier rather than the renamed - one for display on Discord. - - Parameters - ----------- - name: :class:`str` - The parameter name in the callback function. - - Returns - -------- - Optional[:class:`Parameter`] - The parameter or ``None`` if not found. - """ - - parent = self._params.get(name) - if parent is not None: - return Parameter(parent, self) - return None - - @property - def root_parent(self) -> Optional[Group]: - """Optional[:class:`Group`]: The root parent of this command.""" - if self.parent is None: - return None - parent = self.parent - return parent.parent or parent - - @property - def qualified_name(self) -> str: - """:class:`str`: Returns the fully qualified command name. - - The qualified name includes the parent name as well. For example, - in a command like ``/foo bar`` the qualified name is ``foo bar``. - """ - # A B C - # ^ self - # ^ parent - # ^ grandparent - if self.parent is None: - return self.name - - names = [self.name, self.parent.name] - grandparent = self.parent.parent - if grandparent is not None: - names.append(grandparent.name) - - return ' '.join(reversed(names)) - - async def _check_can_run(self, interaction: Interaction) -> bool: - if self.parent is not None and self.parent is not self.binding: - # For commands with a parent which isn't the binding, i.e. - # - # - # - # The parent check needs to be called first - if not await maybe_coroutine(self.parent.interaction_check, interaction): - return False - - if self.binding is not None: - check: Optional[Check] = getattr(self.binding, 'interaction_check', None) - if check: - ret = await maybe_coroutine(check, interaction) - if not ret: - return False - - predicates = self.checks - if not predicates: - return True - - return await async_all(f(interaction) for f in predicates) - - def error(self, coro: Error[GroupT]) -> Error[GroupT]: - """A decorator that registers a coroutine as a local error handler. - - The local error handler is called whenever an exception is raised in the body - of the command or during handling of the command. The error handler must take - 2 parameters, the interaction and the error. - - The error passed will be derived from :exc:`AppCommandError`. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the local error handler. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine. - """ - - if not inspect.iscoroutinefunction(coro): - raise TypeError('The error handler must be a coroutine.') - - self.on_error = coro - return coro - - def autocomplete( - self, name: str - ) -> Callable[[AutocompleteCallback[GroupT, ChoiceT]], AutocompleteCallback[GroupT, ChoiceT]]: - """A decorator that registers a coroutine as an autocomplete prompt for a parameter. - - The coroutine callback must have 2 parameters, the :class:`~discord.Interaction`, - and the current value by the user (usually either a :class:`str`, :class:`int`, or :class:`float`, - depending on the type of the parameter being marked as autocomplete). - - To get the values from other parameters that may be filled in, accessing - :attr:`.Interaction.namespace` will give a :class:`Namespace` object with those - values. - - Parent :func:`checks ` are ignored within an autocomplete. However, checks can be added - to the autocomplete callback and the ones added will be called. If the checks fail for any reason - then an empty list is sent as the interaction response. - - The coroutine decorator **must** return a list of :class:`~discord.app_commands.Choice` objects. - Only up to 25 objects are supported. - - Example: - - .. code-block:: python3 - - @app_commands.command() - async def fruits(interaction: discord.Interaction, fruit: str): - await interaction.response.send_message(f'Your favourite fruit seems to be {fruit}') - - @fruits.autocomplete('fruit') - async def fruits_autocomplete( - interaction: discord.Interaction, - current: str, - ) -> List[app_commands.Choice[str]]: - fruits = ['Banana', 'Pineapple', 'Apple', 'Watermelon', 'Melon', 'Cherry'] - return [ - app_commands.Choice(name=fruit, value=fruit) - for fruit in fruits if current.lower() in fruit.lower() - ] - - - Parameters - ----------- - name: :class:`str` - The parameter name to register as autocomplete. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine or - the parameter is not found or of an invalid type. - """ - - def decorator(coro: AutocompleteCallback[GroupT, ChoiceT]) -> AutocompleteCallback[GroupT, ChoiceT]: - if not inspect.iscoroutinefunction(coro): - raise TypeError('The error handler must be a coroutine.') - - try: - param = self._params[name] - except KeyError: - raise TypeError(f'unknown parameter: {name!r}') from None - - if param.type not in (AppCommandOptionType.string, AppCommandOptionType.number, AppCommandOptionType.integer): - raise TypeError('autocomplete is only supported for integer, string, or number option types') - - if param.is_choice_annotation(): - raise TypeError( - 'Choice annotation unsupported for autocomplete parameters, consider using a regular annotation instead' - ) - - param.autocomplete = _validate_auto_complete_callback(coro) - return coro - - return decorator - - def add_check(self, func: Check, /) -> None: - """Adds a check to the command. - - This is the non-decorator interface to :func:`check`. - - Parameters - ----------- - func - The function that will be used as a check. - """ - - self.checks.append(func) - - def remove_check(self, func: Check, /) -> None: - """Removes a check from the command. - - This function is idempotent and will not raise an exception - if the function is not in the command's checks. - - Parameters - ----------- - func - The function to remove from the checks. - """ - - try: - self.checks.remove(func) - except ValueError: - pass - - -class ContextMenu: - """A class that implements a context menu application command. - - These are usually not created manually, instead they are created using - one of the following decorators: - - - :func:`~discord.app_commands.context_menu` - - :meth:`CommandTree.command ` - - .. versionadded:: 2.0 - - Parameters - ----------- - name: Union[:class:`str`, :class:`locale_str`] - The name of the context menu. - callback: :ref:`coroutine ` - The coroutine that is executed when the command is called. - type: :class:`.AppCommandType` - The type of context menu application command. By default, this is inferred - by the parameter of the callback. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. - Defaults to ``False``. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - - Attributes - ------------ - name: :class:`str` - The name of the context menu. - type: :class:`.AppCommandType` - The type of context menu application command. By default, this is inferred - by the parameter of the callback. - default_permissions: Optional[:class:`~discord.Permissions`] - The default permissions that can execute this command on Discord. Note - that server administrators can override this value in the client. - Setting an empty permissions field will disallow anyone except server - administrators from using the command in a guild. - guild_only: :class:`bool` - Whether the command should only be usable in guild contexts. - Defaults to ``False``. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. - Defaults to ``False``. - checks - A list of predicates that take a :class:`~discord.Interaction` parameter - to indicate whether the command callback should be executed. If an exception - is necessary to be thrown to signal failure, then one inherited from - :exc:`AppCommandError` should be used. If all the checks fail without - propagating an exception, :exc:`CheckFailure` is raised. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - def __init__( - self, - *, - name: Union[str, locale_str], - callback: ContextMenuCallback, - type: AppCommandType = MISSING, - nsfw: bool = False, - guild_ids: Optional[List[int]] = None, - auto_locale_strings: bool = True, - extras: Dict[Any, Any] = MISSING, - ): - name, locale = (name.message, name) if isinstance(name, locale_str) else (name, None) - self.name: str = validate_context_menu_name(name) - self._locale_name: Optional[locale_str] = locale - self._callback: ContextMenuCallback = callback - (param, annotation, actual_type) = _get_context_menu_parameter(callback) - if type is MISSING: - type = actual_type - - if actual_type != type: - raise ValueError(f'context menu callback implies a type of {actual_type} but {type} was passed.') - - self.type: AppCommandType = type - self._param_name = param - self._annotation = annotation - self.module: Optional[str] = callback.__module__ - self._guild_ids = guild_ids or getattr(callback, '__discord_app_commands_default_guilds__', None) - self.on_error: Optional[UnboundError] = None - self.default_permissions: Optional[Permissions] = getattr( - callback, '__discord_app_commands_default_permissions__', None - ) - self.nsfw: bool = nsfw - self.guild_only: bool = getattr(callback, '__discord_app_commands_guild_only__', False) - self.checks: List[Check] = getattr(callback, '__discord_app_commands_checks__', []) - self.extras: Dict[Any, Any] = extras or {} - - if auto_locale_strings: - if self._locale_name is None: - self._locale_name = locale_str(self.name) - - @property - def callback(self) -> ContextMenuCallback: - """:ref:`coroutine `: The coroutine that is executed when the context menu is called.""" - return self._callback - - @property - def qualified_name(self) -> str: - """:class:`str`: Returns the fully qualified command name.""" - return self.name - - async def get_translated_payload(self, translator: Translator) -> Dict[str, Any]: - base = self.to_dict() - context = TranslationContext(location=TranslationContextLocation.command_name, data=self) - if self._locale_name: - name_localizations: Dict[str, str] = {} - for locale in Locale: - translation = await translator._checked_translate(self._locale_name, locale, context) - if translation is not None: - name_localizations[locale.value] = translation - - base['name_localizations'] = name_localizations - return base - - def to_dict(self) -> Dict[str, Any]: - return { - 'name': self.name, - 'type': self.type.value, - 'dm_permission': not self.guild_only, - 'default_member_permissions': None if self.default_permissions is None else self.default_permissions.value, - 'nsfw': self.nsfw, - } - - async def _check_can_run(self, interaction: Interaction) -> bool: - predicates = self.checks - if not predicates: - return True - - return await async_all(f(interaction) for f in predicates) - - def _has_any_error_handlers(self) -> bool: - return self.on_error is not None - - async def _invoke(self, interaction: Interaction, arg: Any): - try: - if not await self._check_can_run(interaction): - raise CheckFailure(f'The check functions for context menu {self.name!r} failed.') - - await self._callback(interaction, arg) - except AppCommandError: - raise - except Exception as e: - raise CommandInvokeError(self, e) from e - - def error(self, coro: UnboundError) -> UnboundError: - """A decorator that registers a coroutine as a local error handler. - - The local error handler is called whenever an exception is raised in the body - of the command or during handling of the command. The error handler must take - 2 parameters, the interaction and the error. - - The error passed will be derived from :exc:`AppCommandError`. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the local error handler. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine. - """ - - if not inspect.iscoroutinefunction(coro): - raise TypeError('The error handler must be a coroutine.') - - self.on_error = coro - return coro - - def add_check(self, func: Check, /) -> None: - """Adds a check to the command. - - This is the non-decorator interface to :func:`check`. - - Parameters - ----------- - func - The function that will be used as a check. - """ - - self.checks.append(func) - - def remove_check(self, func: Check, /) -> None: - """Removes a check from the command. - - This function is idempotent and will not raise an exception - if the function is not in the command's checks. - - Parameters - ----------- - func - The function to remove from the checks. - """ - - try: - self.checks.remove(func) - except ValueError: - pass - - -class Group: - """A class that implements an application command group. - - These are usually inherited rather than created manually. - - Decorators such as :func:`guild_only`, :func:`guilds`, and :func:`default_permissions` - will apply to the group if used on top of a subclass. For example: - - .. code-block:: python3 - - from discord import app_commands - - @app_commands.guild_only() - class MyGroup(app_commands.Group): - pass - - .. versionadded:: 2.0 - - Parameters - ----------- - name: Union[:class:`str`, :class:`locale_str`] - The name of the group. If not given, it defaults to a lower-case - kebab-case version of the class name. - description: Union[:class:`str`, :class:`locale_str`] - The description of the group. This shows up in the UI to describe - the group. If not given, it defaults to the docstring of the - class shortened to 100 characters. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - default_permissions: Optional[:class:`~discord.Permissions`] - The default permissions that can execute this group on Discord. Note - that server administrators can override this value in the client. - Setting an empty permissions field will disallow anyone except server - administrators from using the command in a guild. - - Due to a Discord limitation, this does not work on subcommands. - guild_only: :class:`bool` - Whether the group should only be usable in guild contexts. - Defaults to ``False``. - - Due to a Discord limitation, this does not work on subcommands. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. - Defaults to ``False``. - - Due to a Discord limitation, this does not work on subcommands. - parent: Optional[:class:`Group`] - The parent application command. ``None`` if there isn't one. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - - Attributes - ------------ - name: :class:`str` - The name of the group. - description: :class:`str` - The description of the group. This shows up in the UI to describe - the group. - default_permissions: Optional[:class:`~discord.Permissions`] - The default permissions that can execute this group on Discord. Note - that server administrators can override this value in the client. - Setting an empty permissions field will disallow anyone except server - administrators from using the command in a guild. - - Due to a Discord limitation, this does not work on subcommands. - guild_only: :class:`bool` - Whether the group should only be usable in guild contexts. - - Due to a Discord limitation, this does not work on subcommands. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. - - Due to a Discord limitation, this does not work on subcommands. - parent: Optional[:class:`Group`] - The parent group. ``None`` if there isn't one. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - __discord_app_commands_group_children__: ClassVar[List[Union[Command[Any, ..., Any], Group]]] = [] - __discord_app_commands_skip_init_binding__: bool = False - __discord_app_commands_group_name__: str = MISSING - __discord_app_commands_group_description__: str = MISSING - __discord_app_commands_group_locale_name__: Optional[locale_str] = None - __discord_app_commands_group_locale_description__: Optional[locale_str] = None - __discord_app_commands_group_nsfw__: bool = False - __discord_app_commands_guild_only__: bool = MISSING - __discord_app_commands_default_permissions__: Optional[Permissions] = MISSING - __discord_app_commands_has_module__: bool = False - __discord_app_commands_error_handler__: Optional[ - Callable[[Interaction, AppCommandError], Coroutine[Any, Any, None]] - ] = None - - def __init_subclass__( - cls, - *, - name: Union[str, locale_str] = MISSING, - description: Union[str, locale_str] = MISSING, - guild_only: bool = MISSING, - nsfw: bool = False, - default_permissions: Optional[Permissions] = MISSING, - ) -> None: - if not cls.__discord_app_commands_group_children__: - children: List[Union[Command[Any, ..., Any], Group]] = [ - member for member in cls.__dict__.values() if isinstance(member, (Group, Command)) and member.parent is None - ] - - cls.__discord_app_commands_group_children__ = children - - found = set() - for child in children: - if child.name in found: - raise TypeError(f'Command {child.name!r} is a duplicate') - found.add(child.name) - - if len(children) > 25: - raise TypeError('groups cannot have more than 25 commands') - - if name is MISSING: - cls.__discord_app_commands_group_name__ = validate_name(_to_kebab_case(cls.__name__)) - elif isinstance(name, str): - cls.__discord_app_commands_group_name__ = validate_name(name) - else: - cls.__discord_app_commands_group_name__ = validate_name(name.message) - cls.__discord_app_commands_group_locale_name__ = name - - if description is MISSING: - if cls.__doc__ is None: - cls.__discord_app_commands_group_description__ = '…' - else: - cls.__discord_app_commands_group_description__ = _shorten(cls.__doc__) - elif isinstance(description, str): - cls.__discord_app_commands_group_description__ = description - else: - cls.__discord_app_commands_group_description__ = description.message - cls.__discord_app_commands_group_locale_description__ = description - - if guild_only is not MISSING: - cls.__discord_app_commands_guild_only__ = guild_only - - if default_permissions is not MISSING: - cls.__discord_app_commands_default_permissions__ = default_permissions - - if cls.__module__ != __name__: - cls.__discord_app_commands_has_module__ = True - cls.__discord_app_commands_group_nsfw__ = nsfw - - def __init__( - self, - *, - name: Union[str, locale_str] = MISSING, - description: Union[str, locale_str] = MISSING, - parent: Optional[Group] = None, - guild_ids: Optional[List[int]] = None, - guild_only: bool = MISSING, - nsfw: bool = MISSING, - auto_locale_strings: bool = True, - default_permissions: Optional[Permissions] = MISSING, - extras: Dict[Any, Any] = MISSING, - ): - cls = self.__class__ - - if name is MISSING: - name, locale = cls.__discord_app_commands_group_name__, cls.__discord_app_commands_group_locale_name__ - elif isinstance(name, str): - name, locale = validate_name(name), None - else: - name, locale = validate_name(name.message), name - self.name: str = name - self._locale_name: Optional[locale_str] = locale - - if description is MISSING: - description, locale = ( - cls.__discord_app_commands_group_description__, - cls.__discord_app_commands_group_locale_description__, - ) - elif isinstance(description, str): - description, locale = description, None - else: - description, locale = description.message, description - self.description: str = description - self._locale_description: Optional[locale_str] = locale - - self._attr: Optional[str] = None - self._owner_cls: Optional[Type[Any]] = None - self._guild_ids: Optional[List[int]] = guild_ids or getattr(cls, '__discord_app_commands_default_guilds__', None) - - if default_permissions is MISSING: - if cls.__discord_app_commands_default_permissions__ is MISSING: - default_permissions = None - else: - default_permissions = cls.__discord_app_commands_default_permissions__ - - self.default_permissions: Optional[Permissions] = default_permissions - - if guild_only is MISSING: - if cls.__discord_app_commands_guild_only__ is MISSING: - guild_only = False - else: - guild_only = cls.__discord_app_commands_guild_only__ - - self.guild_only: bool = guild_only - - if nsfw is MISSING: - nsfw = cls.__discord_app_commands_group_nsfw__ - - self.nsfw: bool = nsfw - - if not self.description: - raise TypeError('groups must have a description') - - self.parent: Optional[Group] = parent - self.module: Optional[str] - if cls.__discord_app_commands_has_module__: - self.module = cls.__module__ - else: - try: - # This is pretty hacky - # It allows the module to be fetched if someone just constructs a bare Group object though. - self.module = inspect.currentframe().f_back.f_globals['__name__'] # type: ignore - except (AttributeError, IndexError): - self.module = None - - self._children: Dict[str, Union[Command, Group]] = {} - self.extras: Dict[Any, Any] = extras or {} - - bindings: Dict[Group, Group] = {} - - for child in self.__discord_app_commands_group_children__: - # commands and groups created directly in this class (no parent) - copy = ( - child._copy_with(parent=self, binding=self, bindings=bindings, set_on_binding=False) - if not cls.__discord_app_commands_skip_init_binding__ - else child - ) - - self._children[copy.name] = copy - if copy._attr and not cls.__discord_app_commands_skip_init_binding__: - setattr(self, copy._attr, copy) - - if parent is not None: - if parent.parent is not None: - raise ValueError('groups can only be nested at most one level') - parent.add_command(self) - - if auto_locale_strings: - self._convert_to_locale_strings() - - def _convert_to_locale_strings(self) -> None: - if self._locale_name is None: - self._locale_name = locale_str(self.name) - if self._locale_description is None: - self._locale_description = locale_str(self.description) - - # I don't know if propagating to the children is the right behaviour here. - - def __set_name__(self, owner: Type[Any], name: str) -> None: - self._attr = name - self.module = owner.__module__ - self._owner_cls = owner - - def _copy_with( - self, - *, - parent: Optional[Group], - binding: Binding, - bindings: MutableMapping[Group, Group] = MISSING, - set_on_binding: bool = True, - ) -> Group: - bindings = {} if bindings is MISSING else bindings - - cls = self.__class__ - copy = cls.__new__(cls) - copy.name = self.name - copy._locale_name = self._locale_name - copy._guild_ids = self._guild_ids - copy.description = self.description - copy._locale_description = self._locale_description - copy.parent = parent - copy.module = self.module - copy.default_permissions = self.default_permissions - copy.guild_only = self.guild_only - copy.nsfw = self.nsfw - copy._attr = self._attr - copy._owner_cls = self._owner_cls - copy._children = {} - copy.extras = self.extras - - bindings[self] = copy - - for child in self._children.values(): - child_copy = child._copy_with(parent=copy, binding=binding, bindings=bindings) - child_copy.parent = copy - copy._children[child_copy.name] = child_copy - - if isinstance(child_copy, Group) and child_copy._attr and set_on_binding: - if binding.__class__ is child_copy._owner_cls: - setattr(binding, child_copy._attr, child_copy) - elif child_copy._owner_cls is copy.__class__: - setattr(copy, child_copy._attr, child_copy) - - if copy._attr and set_on_binding: - setattr(parent or binding, copy._attr, copy) - - return copy - - async def get_translated_payload(self, translator: Translator) -> Dict[str, Any]: - base = self.to_dict() - name_localizations: Dict[str, str] = {} - description_localizations: Dict[str, str] = {} - - # Prevent creating these objects in a heavy loop - name_context = TranslationContext(location=TranslationContextLocation.group_name, data=self) - description_context = TranslationContext(location=TranslationContextLocation.group_description, data=self) - for locale in Locale: - if self._locale_name: - translation = await translator._checked_translate(self._locale_name, locale, name_context) - if translation is not None: - name_localizations[locale.value] = translation - - if self._locale_description: - translation = await translator._checked_translate(self._locale_description, locale, description_context) - if translation is not None: - description_localizations[locale.value] = translation - - base['name_localizations'] = name_localizations - base['description_localizations'] = description_localizations - base['options'] = [await child.get_translated_payload(translator) for child in self._children.values()] - return base - - def to_dict(self) -> Dict[str, Any]: - # If this has a parent command then it's part of a subcommand group - # Otherwise, it's just a regular command - option_type = 1 if self.parent is None else AppCommandOptionType.subcommand_group.value - base: Dict[str, Any] = { - 'name': self.name, - 'description': self.description, - 'type': option_type, - 'options': [child.to_dict() for child in self._children.values()], - } - - if self.parent is None: - base['nsfw'] = self.nsfw - base['dm_permission'] = not self.guild_only - base['default_member_permissions'] = None if self.default_permissions is None else self.default_permissions.value - - return base - - @property - def root_parent(self) -> Optional[Group]: - """Optional[:class:`Group`]: The parent of this group.""" - return self.parent - - @property - def qualified_name(self) -> str: - """:class:`str`: Returns the fully qualified group name. - - The qualified name includes the parent name as well. For example, - in a group like ``/foo bar`` the qualified name is ``foo bar``. - """ - - if self.parent is None: - return self.name - return f'{self.parent.name} {self.name}' - - def _get_internal_command(self, name: str) -> Optional[Union[Command[Any, ..., Any], Group]]: - return self._children.get(name) - - @property - def commands(self) -> List[Union[Command[Any, ..., Any], Group]]: - """List[Union[:class:`Command`, :class:`Group`]]: The commands that this group contains.""" - return list(self._children.values()) - - def walk_commands(self) -> Generator[Union[Command[Any, ..., Any], Group], None, None]: - """An iterator that recursively walks through all commands that this group contains. - - Yields - --------- - Union[:class:`Command`, :class:`Group`] - The commands in this group. - """ - - for command in self._children.values(): - yield command - if isinstance(command, Group): - yield from command.walk_commands() - - async def on_error(self, interaction: Interaction, error: AppCommandError, /) -> None: - """|coro| - - A callback that is called when a child's command raises an :exc:`AppCommandError`. - - To get the command that failed, :attr:`discord.Interaction.command` should be used. - - The default implementation does nothing. - - Parameters - ----------- - interaction: :class:`~discord.Interaction` - The interaction that is being handled. - error: :exc:`AppCommandError` - The exception that was raised. - """ - - pass - - def error(self, coro: ErrorFunc) -> ErrorFunc: - """A decorator that registers a coroutine as a local error handler. - - The local error handler is called whenever an exception is raised in a child command. - The error handler must take 2 parameters, the interaction and the error. - - The error passed will be derived from :exc:`AppCommandError`. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the local error handler. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine, or is an invalid coroutine. - """ - - if not inspect.iscoroutinefunction(coro): - raise TypeError('The error handler must be a coroutine.') - - params = inspect.signature(coro).parameters - if len(params) != 2: - raise TypeError('The error handler must have 2 parameters.') - - self.on_error = coro - return coro - - async def interaction_check(self, interaction: Interaction, /) -> bool: - """|coro| - - A callback that is called when an interaction happens within the group - that checks whether a command inside the group should be executed. - - This is useful to override if, for example, you want to ensure that the - interaction author is a given user. - - The default implementation of this returns ``True``. - - .. note:: - - If an exception occurs within the body then the check - is considered a failure and error handlers such as - :meth:`on_error` is called. See :exc:`AppCommandError` - for more information. - - Parameters - ----------- - interaction: :class:`~discord.Interaction` - The interaction that occurred. - - Returns - --------- - :class:`bool` - Whether the view children's callbacks should be called. - """ - - return True - - def add_command(self, command: Union[Command[Any, ..., Any], Group], /, *, override: bool = False) -> None: - """Adds a command or group to this group's internal list of commands. - - Parameters - ----------- - command: Union[:class:`Command`, :class:`Group`] - The command or group to add. - override: :class:`bool` - Whether to override a pre-existing command or group with the same name. - If ``False`` then an exception is raised. - - Raises - ------- - CommandAlreadyRegistered - The command or group is already registered. Note that the :attr:`CommandAlreadyRegistered.guild_id` - attribute will always be ``None`` in this case. - ValueError - There are too many commands already registered or the group is too - deeply nested. - TypeError - The wrong command type was passed. - """ - - if not isinstance(command, (Command, Group)): - raise TypeError(f'expected Command or Group not {command.__class__!r}') - - if isinstance(command, Group) and self.parent is not None: - # In a tree like so: - # - # - # - # this needs to be forbidden - raise ValueError(f'{command.name!r} is too nested, groups can only be nested at most one level') - - if not override and command.name in self._children: - raise CommandAlreadyRegistered(command.name, guild_id=None) - - self._children[command.name] = command - command.parent = self - if len(self._children) > 25: - raise ValueError('maximum number of child commands exceeded') - - def remove_command(self, name: str, /) -> Optional[Union[Command[Any, ..., Any], Group]]: - """Removes a command or group from the internal list of commands. - - Parameters - ----------- - name: :class:`str` - The name of the command or group to remove. - - Returns - -------- - Optional[Union[:class:`~discord.app_commands.Command`, :class:`~discord.app_commands.Group`]] - The command that was removed. If nothing was removed - then ``None`` is returned instead. - """ - - self._children.pop(name, None) - - def get_command(self, name: str, /) -> Optional[Union[Command[Any, ..., Any], Group]]: - """Retrieves a command or group from its name. - - Parameters - ----------- - name: :class:`str` - The name of the command or group to retrieve. - - Returns - -------- - Optional[Union[:class:`~discord.app_commands.Command`, :class:`~discord.app_commands.Group`]] - The command or group that was retrieved. If nothing was found - then ``None`` is returned instead. - """ - return self._children.get(name) - - def command( - self, - *, - name: Union[str, locale_str] = MISSING, - description: Union[str, locale_str] = MISSING, - nsfw: bool = False, - auto_locale_strings: bool = True, - extras: Dict[Any, Any] = MISSING, - ) -> Callable[[CommandCallback[GroupT, P, T]], Command[GroupT, P, T]]: - """A decorator that creates an application command from a regular function under this group. - - Parameters - ------------ - name: Union[:class:`str`, :class:`locale_str`] - The name of the application command. If not given, it defaults to a lower-case - version of the callback name. - description: Union[:class:`str`, :class:`locale_str`] - The description of the application command. This shows up in the UI to describe - the application command. If not given, it defaults to the first line of the docstring - of the callback shortened to 100 characters. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. Defaults to ``False``. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - def decorator(func: CommandCallback[GroupT, P, T]) -> Command[GroupT, P, T]: - if not inspect.iscoroutinefunction(func): - raise TypeError('command function must be a coroutine function') - - if description is MISSING: - if func.__doc__ is None: - desc = '…' - else: - desc = _shorten(func.__doc__) - else: - desc = description - - command = Command( - name=name if name is not MISSING else func.__name__, - description=desc, - callback=func, - nsfw=nsfw, - parent=self, - auto_locale_strings=auto_locale_strings, - extras=extras, - ) - self.add_command(command) - return command - - return decorator - - -def command( - *, - name: Union[str, locale_str] = MISSING, - description: Union[str, locale_str] = MISSING, - nsfw: bool = False, - auto_locale_strings: bool = True, - extras: Dict[Any, Any] = MISSING, -) -> Callable[[CommandCallback[GroupT, P, T]], Command[GroupT, P, T]]: - """Creates an application command from a regular function. - - Parameters - ------------ - name: :class:`str` - The name of the application command. If not given, it defaults to a lower-case - version of the callback name. - description: :class:`str` - The description of the application command. This shows up in the UI to describe - the application command. If not given, it defaults to the first line of the docstring - of the callback shortened to 100 characters. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. Defaults to ``False``. - - Due to a Discord limitation, this does not work on subcommands. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - def decorator(func: CommandCallback[GroupT, P, T]) -> Command[GroupT, P, T]: - if not inspect.iscoroutinefunction(func): - raise TypeError('command function must be a coroutine function') - - if description is MISSING: - if func.__doc__ is None: - desc = '…' - else: - desc = _shorten(func.__doc__) - else: - desc = description - - return Command( - name=name if name is not MISSING else func.__name__, - description=desc, - callback=func, - parent=None, - nsfw=nsfw, - auto_locale_strings=auto_locale_strings, - extras=extras, - ) - - return decorator - - -def context_menu( - *, - name: Union[str, locale_str] = MISSING, - nsfw: bool = False, - auto_locale_strings: bool = True, - extras: Dict[Any, Any] = MISSING, -) -> Callable[[ContextMenuCallback], ContextMenu]: - """Creates an application command context menu from a regular function. - - This function must have a signature of :class:`~discord.Interaction` as its first parameter - and taking either a :class:`~discord.Member`, :class:`~discord.User`, or :class:`~discord.Message`, - or a :obj:`typing.Union` of ``Member`` and ``User`` as its second parameter. - - Examples - --------- - - .. code-block:: python3 - - @app_commands.context_menu() - async def react(interaction: discord.Interaction, message: discord.Message): - await interaction.response.send_message('Very cool message!', ephemeral=True) - - @app_commands.context_menu() - async def ban(interaction: discord.Interaction, user: discord.Member): - await interaction.response.send_message(f'Should I actually ban {user}...', ephemeral=True) - - Parameters - ------------ - name: Union[:class:`str`, :class:`locale_str`] - The name of the context menu command. If not given, it defaults to a title-case - version of the callback name. Note that unlike regular slash commands this can - have spaces and upper case characters in the name. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. Defaults to ``False``. - - Due to a Discord limitation, this does not work on subcommands. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - def decorator(func: ContextMenuCallback) -> ContextMenu: - if not inspect.iscoroutinefunction(func): - raise TypeError('context menu function must be a coroutine function') - - actual_name = func.__name__.title() if name is MISSING else name - return ContextMenu( - name=actual_name, - nsfw=nsfw, - callback=func, - auto_locale_strings=auto_locale_strings, - extras=extras, - ) - - return decorator - - -def describe(**parameters: Union[str, locale_str]) -> Callable[[T], T]: - r'''Describes the given parameters by their name using the key of the keyword argument - as the name. - - Example: - - .. code-block:: python3 - - @app_commands.command(description='Bans a member') - @app_commands.describe(member='the member to ban') - async def ban(interaction: discord.Interaction, member: discord.Member): - await interaction.response.send_message(f'Banned {member}') - - Alternatively, you can describe parameters using Google, Sphinx, or Numpy style docstrings. - - Example: - - .. code-block:: python3 - - @app_commands.command() - async def ban(interaction: discord.Interaction, member: discord.Member): - """Bans a member - - Parameters - ----------- - member: discord.Member - the member to ban - """ - await interaction.response.send_message(f'Banned {member}') - - Parameters - ----------- - \*\*parameters: Union[:class:`str`, :class:`locale_str`] - The description of the parameters. - - Raises - -------- - TypeError - The parameter name is not found. - ''' - - def decorator(inner: T) -> T: - if isinstance(inner, Command): - _populate_descriptions(inner._params, parameters) - else: - try: - inner.__discord_app_commands_param_description__.update(parameters) # type: ignore # Runtime attribute access - except AttributeError: - inner.__discord_app_commands_param_description__ = parameters # type: ignore # Runtime attribute assignment - - return inner - - return decorator - - -def rename(**parameters: Union[str, locale_str]) -> Callable[[T], T]: - r"""Renames the given parameters by their name using the key of the keyword argument - as the name. - - This renames the parameter within the Discord UI. When referring to the parameter in other - decorators, the parameter name used in the function is used instead of the renamed one. - - Example: - - .. code-block:: python3 - - @app_commands.command() - @app_commands.rename(the_member_to_ban='member') - async def ban(interaction: discord.Interaction, the_member_to_ban: discord.Member): - await interaction.response.send_message(f'Banned {the_member_to_ban}') - - Parameters - ----------- - \*\*parameters: Union[:class:`str`, :class:`locale_str`] - The name of the parameters. - - Raises - -------- - ValueError - The parameter name is already used by another parameter. - TypeError - The parameter name is not found. - """ - - def decorator(inner: T) -> T: - if isinstance(inner, Command): - _populate_renames(inner._params, parameters) - else: - try: - inner.__discord_app_commands_param_rename__.update(parameters) # type: ignore # Runtime attribute access - except AttributeError: - inner.__discord_app_commands_param_rename__ = parameters # type: ignore # Runtime attribute assignment - - return inner - - return decorator - - -def choices(**parameters: List[Choice[ChoiceT]]) -> Callable[[T], T]: - r"""Instructs the given parameters by their name to use the given choices for their choices. - - Example: - - .. code-block:: python3 - - @app_commands.command() - @app_commands.describe(fruits='fruits to choose from') - @app_commands.choices(fruits=[ - Choice(name='apple', value=1), - Choice(name='banana', value=2), - Choice(name='cherry', value=3), - ]) - async def fruit(interaction: discord.Interaction, fruits: Choice[int]): - await interaction.response.send_message(f'Your favourite fruit is {fruits.name}.') - - .. note:: - - This is not the only way to provide choices to a command. There are two more ergonomic ways - of doing this. The first one is to use a :obj:`typing.Literal` annotation: - - .. code-block:: python3 - - @app_commands.command() - @app_commands.describe(fruits='fruits to choose from') - async def fruit(interaction: discord.Interaction, fruits: Literal['apple', 'banana', 'cherry']): - await interaction.response.send_message(f'Your favourite fruit is {fruits}.') - - The second way is to use an :class:`enum.Enum`: - - .. code-block:: python3 - - class Fruits(enum.Enum): - apple = 1 - banana = 2 - cherry = 3 - - @app_commands.command() - @app_commands.describe(fruits='fruits to choose from') - async def fruit(interaction: discord.Interaction, fruits: Fruits): - await interaction.response.send_message(f'Your favourite fruit is {fruits}.') - - - Parameters - ----------- - \*\*parameters - The choices of the parameters. - - Raises - -------- - TypeError - The parameter name is not found or the parameter type was incorrect. - """ - - def decorator(inner: T) -> T: - if isinstance(inner, Command): - _populate_choices(inner._params, parameters) - else: - try: - inner.__discord_app_commands_param_choices__.update(parameters) # type: ignore # Runtime attribute access - except AttributeError: - inner.__discord_app_commands_param_choices__ = parameters # type: ignore # Runtime attribute assignment - - return inner - - return decorator - - -def autocomplete(**parameters: AutocompleteCallback[GroupT, ChoiceT]) -> Callable[[T], T]: - r"""Associates the given parameters with the given autocomplete callback. - - Autocomplete is only supported on types that have :class:`str`, :class:`int`, or :class:`float` - values. - - :func:`Checks ` are supported, however they must be attached to the autocomplete - callback in order to work. Checks attached to the command are ignored when invoking the autocomplete - callback. - - For more information, see the :meth:`Command.autocomplete` documentation. - - Example: - - .. code-block:: python3 - - async def fruit_autocomplete( - interaction: discord.Interaction, - current: str, - ) -> List[app_commands.Choice[str]]: - fruits = ['Banana', 'Pineapple', 'Apple', 'Watermelon', 'Melon', 'Cherry'] - return [ - app_commands.Choice(name=fruit, value=fruit) - for fruit in fruits if current.lower() in fruit.lower() - ] - - @app_commands.command() - @app_commands.autocomplete(fruit=fruit_autocomplete) - async def fruits(interaction: discord.Interaction, fruit: str): - await interaction.response.send_message(f'Your favourite fruit seems to be {fruit}') - - Parameters - ----------- - \*\*parameters - The parameters to mark as autocomplete. - - Raises - -------- - TypeError - The parameter name is not found or the parameter type was incorrect. - """ - - def decorator(inner: T) -> T: - if isinstance(inner, Command): - _populate_autocomplete(inner._params, parameters) - else: - try: - inner.__discord_app_commands_param_autocomplete__.update(parameters) # type: ignore # Runtime attribute access - except AttributeError: - inner.__discord_app_commands_param_autocomplete__ = parameters # type: ignore # Runtime attribute assignment - - return inner - - return decorator - - -def guilds(*guild_ids: Union[Snowflake, int]) -> Callable[[T], T]: - r"""Associates the given guilds with the command. - - When the command instance is added to a :class:`CommandTree`, the guilds that are - specified by this decorator become the default guilds that it's added to rather - than being a global command. - - .. note:: - - Due to an implementation quirk and Python limitation, if this is used in conjunction - with the :meth:`CommandTree.command` or :meth:`CommandTree.context_menu` decorator - then this must go below that decorator. - - Example: - - .. code-block:: python3 - - MY_GUILD_ID = discord.Object(...) # Guild ID here - - @app_commands.command() - @app_commands.guilds(MY_GUILD_ID) - async def bonk(interaction: discord.Interaction): - await interaction.response.send_message('Bonk', ephemeral=True) - - Parameters - ----------- - \*guild_ids: Union[:class:`int`, :class:`~discord.abc.Snowflake`] - The guilds to associate this command with. The command tree will - use this as the default when added rather than adding it as a global - command. - """ - - defaults: List[int] = [g if isinstance(g, int) else g.id for g in guild_ids] - - def decorator(inner: T) -> T: - if isinstance(inner, (Group, ContextMenu)): - inner._guild_ids = defaults - elif isinstance(inner, Command): - if inner.parent is not None: - raise ValueError('child commands of a group cannot have default guilds set') - - inner._guild_ids = defaults - else: - # Runtime attribute assignment - inner.__discord_app_commands_default_guilds__ = defaults # type: ignore - - return inner - - return decorator - - -def check(predicate: Check) -> Callable[[T], T]: - r"""A decorator that adds a check to an application command. - - These checks should be predicates that take in a single parameter taking - a :class:`~discord.Interaction`. If the check returns a ``False``\-like value then - during invocation a :exc:`CheckFailure` exception is raised and sent to - the appropriate error handlers. - - These checks can be either a coroutine or not. - - Examples - --------- - - Creating a basic check to see if the command invoker is you. - - .. code-block:: python3 - - def check_if_it_is_me(interaction: discord.Interaction) -> bool: - return interaction.user.id == 85309593344815104 - - @tree.command() - @app_commands.check(check_if_it_is_me) - async def only_for_me(interaction: discord.Interaction): - await interaction.response.send_message('I know you!', ephemeral=True) - - Transforming common checks into its own decorator: - - .. code-block:: python3 - - def is_me(): - def predicate(interaction: discord.Interaction) -> bool: - return interaction.user.id == 85309593344815104 - return app_commands.check(predicate) - - @tree.command() - @is_me() - async def only_me(interaction: discord.Interaction): - await interaction.response.send_message('Only you!') - - Parameters - ----------- - predicate: Callable[[:class:`~discord.Interaction`], :class:`bool`] - The predicate to check if the command should be invoked. - """ - - def decorator(func: CheckInputParameter) -> CheckInputParameter: - if isinstance(func, (Command, ContextMenu)): - func.checks.append(predicate) - else: - if not hasattr(func, '__discord_app_commands_checks__'): - func.__discord_app_commands_checks__ = [] - - func.__discord_app_commands_checks__.append(predicate) - - return func - - return decorator # type: ignore - - -@overload -def guild_only(func: None = ...) -> Callable[[T], T]: - ... - - -@overload -def guild_only(func: T) -> T: - ... - - -def guild_only(func: Optional[T] = None) -> Union[T, Callable[[T], T]]: - """A decorator that indicates this command can only be used in a guild context. - - This is **not** implemented as a :func:`check`, and is instead verified by Discord server side. - Therefore, there is no error handler called when a command is used within a private message. - - This decorator can be called with or without parentheses. - - Due to a Discord limitation, this decorator does nothing in subcommands and is ignored. - - Examples - --------- - - .. code-block:: python3 - - @app_commands.command() - @app_commands.guild_only() - async def my_guild_only_command(interaction: discord.Interaction) -> None: - await interaction.response.send_message('I am only available in guilds!') - """ - - def inner(f: T) -> T: - if isinstance(f, (Command, Group, ContextMenu)): - f.guild_only = True - else: - f.__discord_app_commands_guild_only__ = True # type: ignore # Runtime attribute assignment - return f - - # Check if called with parentheses or not - if func is None: - # Called with parentheses - return inner - else: - return inner(func) - - -def default_permissions(**perms: bool) -> Callable[[T], T]: - r"""A decorator that sets the default permissions needed to execute this command. - - When this decorator is used, by default users must have these permissions to execute the command. - However, an administrator can change the permissions needed to execute this command using the official - client. Therefore, this only serves as a hint. - - Setting an empty permissions field, including via calling this with no arguments, will disallow anyone - except server administrators from using the command in a guild. - - This is sent to Discord server side, and is not a :func:`check`. Therefore, error handlers are not called. - - Due to a Discord limitation, this decorator does nothing in subcommands and is ignored. - - .. warning:: - - This serves as a *hint* and members are *not* required to have the permissions given to actually - execute this command. If you want to ensure that members have the permissions needed, consider using - :func:`~discord.app_commands.checks.has_permissions` instead. - - Parameters - ----------- - \*\*perms: :class:`bool` - Keyword arguments denoting the permissions to set as the default. - - Example - --------- - - .. code-block:: python3 - - @app_commands.command() - @app_commands.default_permissions(manage_messages=True) - async def test(interaction: discord.Interaction): - await interaction.response.send_message('You may or may not have manage messages.') - """ - - permissions = Permissions(**perms) - - def decorator(func: T) -> T: - if isinstance(func, (Command, Group, ContextMenu)): - func.default_permissions = permissions - else: - func.__discord_app_commands_default_permissions__ = permissions # type: ignore # Runtime attribute assignment - - return func - - return decorator diff --git a/.venv/Lib/site-packages/discord/app_commands/errors.py b/.venv/Lib/site-packages/discord/app_commands/errors.py deleted file mode 100644 index 69c40c8..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/errors.py +++ /dev/null @@ -1,528 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -from typing import Any, TYPE_CHECKING, List, Optional, Sequence, Union - -from ..enums import AppCommandOptionType, AppCommandType, Locale -from ..errors import DiscordException, HTTPException, _flatten_error_dict - -__all__ = ( - 'AppCommandError', - 'CommandInvokeError', - 'TransformerError', - 'TranslationError', - 'CheckFailure', - 'CommandAlreadyRegistered', - 'CommandSignatureMismatch', - 'CommandNotFound', - 'CommandLimitReached', - 'NoPrivateMessage', - 'MissingRole', - 'MissingAnyRole', - 'MissingPermissions', - 'BotMissingPermissions', - 'CommandOnCooldown', - 'MissingApplicationID', - 'CommandSyncFailure', -) - -if TYPE_CHECKING: - from .commands import Command, Group, ContextMenu, Parameter - from .transformers import Transformer - from .translator import TranslationContextTypes, locale_str - from ..types.snowflake import Snowflake, SnowflakeList - from .checks import Cooldown - - CommandTypes = Union[Command[Any, ..., Any], Group, ContextMenu] - -APP_ID_NOT_FOUND = ( - 'Client does not have an application_id set. Either the function was called before on_ready ' - 'was called or application_id was not passed to the Client constructor.' -) - - -class AppCommandError(DiscordException): - """The base exception type for all application command related errors. - - This inherits from :exc:`discord.DiscordException`. - - This exception and exceptions inherited from it are handled - in a special way as they are caught and passed into various error handlers - in this order: - - - :meth:`Command.error ` - - :meth:`Group.on_error ` - - :meth:`CommandTree.on_error ` - - .. versionadded:: 2.0 - """ - - pass - - -class CommandInvokeError(AppCommandError): - """An exception raised when the command being invoked raised an exception. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - .. versionadded:: 2.0 - - Attributes - ----------- - original: :exc:`Exception` - The original exception that was raised. You can also get this via - the ``__cause__`` attribute. - command: Union[:class:`Command`, :class:`ContextMenu`] - The command that failed. - """ - - def __init__(self, command: Union[Command[Any, ..., Any], ContextMenu], e: Exception) -> None: - self.original: Exception = e - self.command: Union[Command[Any, ..., Any], ContextMenu] = command - super().__init__(f'Command {command.name!r} raised an exception: {e.__class__.__name__}: {e}') - - -class TransformerError(AppCommandError): - """An exception raised when a :class:`Transformer` or type annotation fails to - convert to its target type. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - If an exception occurs while converting that does not subclass - :exc:`AppCommandError` then the exception is wrapped into this exception. - The original exception can be retrieved using the ``__cause__`` attribute. - Otherwise if the exception derives from :exc:`AppCommandError` then it will - be propagated as-is. - - .. versionadded:: 2.0 - - Attributes - ----------- - value: Any - The value that failed to convert. - type: :class:`~discord.AppCommandOptionType` - The type of argument that failed to convert. - transformer: :class:`Transformer` - The transformer that failed the conversion. - """ - - def __init__(self, value: Any, opt_type: AppCommandOptionType, transformer: Transformer): - self.value: Any = value - self.type: AppCommandOptionType = opt_type - self.transformer: Transformer = transformer - - super().__init__(f'Failed to convert {value} to {transformer._error_display_name!s}') - - -class TranslationError(AppCommandError): - """An exception raised when the library fails to translate a string. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - If an exception occurs while calling :meth:`Translator.translate` that does - not subclass this then the exception is wrapped into this exception. - The original exception can be retrieved using the ``__cause__`` attribute. - Otherwise it will be propagated as-is. - - .. versionadded:: 2.0 - - Attributes - ----------- - string: Optional[Union[:class:`str`, :class:`locale_str`]] - The string that caused the error, if any. - locale: Optional[:class:`~discord.Locale`] - The locale that caused the error, if any. - context: :class:`~discord.app_commands.TranslationContext` - The context of the translation that triggered the error. - """ - - def __init__( - self, - *msg: str, - string: Optional[Union[str, locale_str]] = None, - locale: Optional[Locale] = None, - context: TranslationContextTypes, - ) -> None: - self.string: Optional[Union[str, locale_str]] = string - self.locale: Optional[Locale] = locale - self.context: TranslationContextTypes = context - - if msg: - super().__init__(*msg) - else: - ctx = context.location.name.replace('_', ' ') - fmt = f'Failed to translate {self.string!r} in a {ctx}' - if self.locale is not None: - fmt = f'{fmt} in the {self.locale.value} locale' - - super().__init__(fmt) - - -class CheckFailure(AppCommandError): - """An exception raised when check predicates in a command have failed. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - .. versionadded:: 2.0 - """ - - pass - - -class NoPrivateMessage(CheckFailure): - """An exception raised when a command does not work in a direct message. - - This inherits from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - """ - - def __init__(self, message: Optional[str] = None) -> None: - super().__init__(message or 'This command cannot be used in direct messages.') - - -class MissingRole(CheckFailure): - """An exception raised when the command invoker lacks a role to run a command. - - This inherits from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - Attributes - ----------- - missing_role: Union[:class:`str`, :class:`int`] - The required role that is missing. - This is the parameter passed to :func:`~discord.app_commands.checks.has_role`. - """ - - def __init__(self, missing_role: Snowflake) -> None: - self.missing_role: Snowflake = missing_role - message = f'Role {missing_role!r} is required to run this command.' - super().__init__(message) - - -class MissingAnyRole(CheckFailure): - """An exception raised when the command invoker lacks any of the roles - specified to run a command. - - This inherits from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - Attributes - ----------- - missing_roles: List[Union[:class:`str`, :class:`int`]] - The roles that the invoker is missing. - These are the parameters passed to :func:`~discord.app_commands.checks.has_any_role`. - """ - - def __init__(self, missing_roles: SnowflakeList) -> None: - self.missing_roles: SnowflakeList = missing_roles - - missing = [f"'{role}'" for role in missing_roles] - - if len(missing) > 2: - fmt = '{}, or {}'.format(', '.join(missing[:-1]), missing[-1]) - else: - fmt = ' or '.join(missing) - - message = f'You are missing at least one of the required roles: {fmt}' - super().__init__(message) - - -class MissingPermissions(CheckFailure): - """An exception raised when the command invoker lacks permissions to run a - command. - - This inherits from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - Attributes - ----------- - missing_permissions: List[:class:`str`] - The required permissions that are missing. - """ - - def __init__(self, missing_permissions: List[str], *args: Any) -> None: - self.missing_permissions: List[str] = missing_permissions - - missing = [perm.replace('_', ' ').replace('guild', 'server').title() for perm in missing_permissions] - - if len(missing) > 2: - fmt = '{}, and {}'.format(", ".join(missing[:-1]), missing[-1]) - else: - fmt = ' and '.join(missing) - message = f'You are missing {fmt} permission(s) to run this command.' - super().__init__(message, *args) - - -class BotMissingPermissions(CheckFailure): - """An exception raised when the bot's member lacks permissions to run a - command. - - This inherits from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - Attributes - ----------- - missing_permissions: List[:class:`str`] - The required permissions that are missing. - """ - - def __init__(self, missing_permissions: List[str], *args: Any) -> None: - self.missing_permissions: List[str] = missing_permissions - - missing = [perm.replace('_', ' ').replace('guild', 'server').title() for perm in missing_permissions] - - if len(missing) > 2: - fmt = '{}, and {}'.format(", ".join(missing[:-1]), missing[-1]) - else: - fmt = ' and '.join(missing) - message = f'Bot requires {fmt} permission(s) to run this command.' - super().__init__(message, *args) - - -class CommandOnCooldown(CheckFailure): - """An exception raised when the command being invoked is on cooldown. - - This inherits from :exc:`~discord.app_commands.CheckFailure`. - - .. versionadded:: 2.0 - - Attributes - ----------- - cooldown: :class:`~discord.app_commands.Cooldown` - The cooldown that was triggered. - retry_after: :class:`float` - The amount of seconds to wait before you can retry again. - """ - - def __init__(self, cooldown: Cooldown, retry_after: float) -> None: - self.cooldown: Cooldown = cooldown - self.retry_after: float = retry_after - super().__init__(f'You are on cooldown. Try again in {retry_after:.2f}s') - - -class CommandAlreadyRegistered(AppCommandError): - """An exception raised when a command is already registered. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - .. versionadded:: 2.0 - - Attributes - ----------- - name: :class:`str` - The name of the command already registered. - guild_id: Optional[:class:`int`] - The guild ID this command was already registered at. - If ``None`` then it was a global command. - """ - - def __init__(self, name: str, guild_id: Optional[int]): - self.name: str = name - self.guild_id: Optional[int] = guild_id - super().__init__(f'Command {name!r} already registered.') - - -class CommandNotFound(AppCommandError): - """An exception raised when an application command could not be found. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - .. versionadded:: 2.0 - - Attributes - ------------ - name: :class:`str` - The name of the application command not found. - parents: List[:class:`str`] - A list of parent command names that were previously found - prior to the application command not being found. - type: :class:`~discord.AppCommandType` - The type of command that was not found. - """ - - def __init__(self, name: str, parents: List[str], type: AppCommandType = AppCommandType.chat_input): - self.name: str = name - self.parents: List[str] = parents - self.type: AppCommandType = type - super().__init__(f'Application command {name!r} not found') - - -class CommandLimitReached(AppCommandError): - """An exception raised when the maximum number of application commands was reached - either globally or in a guild. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - .. versionadded:: 2.0 - - Attributes - ------------ - type: :class:`~discord.AppCommandType` - The type of command that reached the limit. - guild_id: Optional[:class:`int`] - The guild ID that reached the limit or ``None`` if it was global. - limit: :class:`int` - The limit that was hit. - """ - - def __init__(self, guild_id: Optional[int], limit: int, type: AppCommandType = AppCommandType.chat_input): - self.guild_id: Optional[int] = guild_id - self.limit: int = limit - self.type: AppCommandType = type - - lookup = { - AppCommandType.chat_input: 'slash commands', - AppCommandType.message: 'message context menu commands', - AppCommandType.user: 'user context menu commands', - } - desc = lookup.get(type, 'application commands') - ns = 'globally' if self.guild_id is None else f'for guild ID {self.guild_id}' - super().__init__(f'maximum number of {desc} exceeded {limit} {ns}') - - -class CommandSignatureMismatch(AppCommandError): - """An exception raised when an application command from Discord has a different signature - from the one provided in the code. This happens because your command definition differs - from the command definition you provided Discord. Either your code is out of date or the - data from Discord is out of sync. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - .. versionadded:: 2.0 - - Attributes - ------------ - command: Union[:class:`~.app_commands.Command`, :class:`~.app_commands.ContextMenu`, :class:`~.app_commands.Group`] - The command that had the signature mismatch. - """ - - def __init__(self, command: Union[Command[Any, ..., Any], ContextMenu, Group]): - self.command: Union[Command[Any, ..., Any], ContextMenu, Group] = command - msg = ( - f'The signature for command {command.name!r} is different from the one provided by Discord. ' - 'This can happen because either your code is out of date or you have not synced the ' - 'commands with Discord, causing the mismatch in data. It is recommended to sync the ' - 'command tree to fix this issue.' - ) - super().__init__(msg) - - -class MissingApplicationID(AppCommandError): - """An exception raised when the client does not have an application ID set. - An application ID is required for syncing application commands. - - This inherits from :exc:`~discord.app_commands.AppCommandError`. - - .. versionadded:: 2.0 - """ - - def __init__(self, message: Optional[str] = None): - super().__init__(message or APP_ID_NOT_FOUND) - - -def _get_command_error( - index: str, - inner: Any, - objects: Sequence[Union[Parameter, CommandTypes]], - messages: List[str], - indent: int = 0, -) -> None: - # Import these here to avoid circular imports - from .commands import Command, Group, ContextMenu - - indentation = ' ' * indent - - # Top level errors are: - # : { : } - # The dicts could be nested, e.g. - # : { : { : } } - # Luckily, this is already handled by the flatten_error_dict utility - if not index.isdigit(): - errors = _flatten_error_dict(inner, index) - messages.extend(f'In {k}: {v}' for k, v in errors.items()) - return - - idx = int(index) - try: - obj = objects[idx] - except IndexError: - dedent_one_level = ' ' * (indent - 2) - errors = _flatten_error_dict(inner, index) - messages.extend(f'{dedent_one_level}In {k}: {v}' for k, v in errors.items()) - return - - children: Sequence[Union[Parameter, CommandTypes]] = [] - if isinstance(obj, Command): - messages.append(f'{indentation}In command {obj.qualified_name!r} defined in function {obj.callback.__qualname__!r}') - children = obj.parameters - elif isinstance(obj, Group): - messages.append(f'{indentation}In group {obj.qualified_name!r} defined in module {obj.module!r}') - children = obj.commands - elif isinstance(obj, ContextMenu): - messages.append( - f'{indentation}In context menu {obj.qualified_name!r} defined in function {obj.callback.__qualname__!r}' - ) - else: - messages.append(f'{indentation}In parameter {obj.name!r}') - - for key, remaining in inner.items(): - # Special case the 'options' key since they have well defined meanings - if key == 'options': - for index, d in remaining.items(): - _get_command_error(index, d, children, messages, indent=indent + 2) - else: - errors = _flatten_error_dict(remaining, key=key) - messages.extend(f'{indentation} {k}: {v}' for k, v in errors.items()) - - -class CommandSyncFailure(AppCommandError, HTTPException): - """An exception raised when :meth:`CommandTree.sync` failed. - - This provides syncing failures in a slightly more readable format. - - This inherits from :exc:`~discord.app_commands.AppCommandError` - and :exc:`~discord.HTTPException`. - - .. versionadded:: 2.0 - """ - - def __init__(self, child: HTTPException, commands: List[CommandTypes]) -> None: - # Consume the child exception and make it seem as if we are that exception - self.__dict__.update(child.__dict__) - - messages = [f'Failed to upload commands to Discord (HTTP status {self.status}, error code {self.code})'] - - if self._errors: - for index, inner in self._errors.items(): - _get_command_error(index, inner, commands, messages) - - # Equivalent to super().__init__(...) but skips other constructors - self.args = ('\n'.join(messages),) diff --git a/.venv/Lib/site-packages/discord/app_commands/models.py b/.venv/Lib/site-packages/discord/app_commands/models.py deleted file mode 100644 index 9deffff..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/models.py +++ /dev/null @@ -1,1091 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -from datetime import datetime - -from .errors import MissingApplicationID -from .translator import TranslationContextLocation, TranslationContext, locale_str, Translator -from ..permissions import Permissions -from ..enums import AppCommandOptionType, AppCommandType, AppCommandPermissionType, ChannelType, Locale, try_enum -from ..mixins import Hashable -from ..utils import _get_as_snowflake, parse_time, snowflake_time, MISSING -from ..object import Object -from ..role import Role -from ..member import Member - -from typing import Any, Dict, Generic, List, TYPE_CHECKING, Optional, TypeVar, Union - -__all__ = ( - 'AppCommand', - 'AppCommandGroup', - 'AppCommandChannel', - 'AppCommandThread', - 'AppCommandPermissions', - 'GuildAppCommandPermissions', - 'Argument', - 'Choice', - 'AllChannels', -) - -ChoiceT = TypeVar('ChoiceT', str, int, float, Union[str, int, float]) - - -def is_app_command_argument_type(value: int) -> bool: - return 11 >= value >= 3 - - -if TYPE_CHECKING: - from ..types.command import ( - ApplicationCommand as ApplicationCommandPayload, - ApplicationCommandOption, - ApplicationCommandOptionChoice, - ApplicationCommandPermissions, - GuildApplicationCommandPermissions, - ) - from ..types.interactions import ( - PartialChannel, - PartialThread, - ) - from ..types.threads import ( - ThreadMetadata, - ThreadArchiveDuration, - ) - - from ..abc import Snowflake - from ..state import ConnectionState - from ..guild import GuildChannel, Guild - from ..channel import TextChannel - from ..threads import Thread - from ..user import User - - ApplicationCommandParent = Union['AppCommand', 'AppCommandGroup'] - - -class AllChannels: - """Represents all channels for application command permissions. - - .. versionadded:: 2.0 - - Attributes - ----------- - guild: :class:`~discord.Guild` - The guild the application command permission is for. - """ - - __slots__ = ('guild',) - - def __init__(self, guild: Guild): - self.guild: Guild = guild - - @property - def id(self) -> int: - """:class:`int`: The ID sentinel used to represent all channels. Equivalent to the guild's ID minus 1.""" - return self.guild.id - 1 - - def __repr__(self) -> str: - return f'' - - -def _to_locale_dict(data: Dict[str, str]) -> Dict[Locale, str]: - return {try_enum(Locale, key): value for key, value in data.items()} - - -class AppCommand(Hashable): - """Represents an application command. - - In common parlance this is referred to as a "Slash Command" or a - "Context Menu Command". - - .. versionadded:: 2.0 - - .. container:: operations - - .. describe:: x == y - - Checks if two application commands are equal. - - .. describe:: x != y - - Checks if two application commands are not equal. - - .. describe:: hash(x) - - Returns the application command's hash. - - .. describe:: str(x) - - Returns the application command's name. - - Attributes - ----------- - id: :class:`int` - The application command's ID. - application_id: :class:`int` - The application command's application's ID. - type: :class:`~discord.AppCommandType` - The application command's type. - name: :class:`str` - The application command's name. - description: :class:`str` - The application command's description. - name_localizations: Dict[:class:`~discord.Locale`, :class:`str`] - The localised names of the application command. Used for display purposes. - description_localizations: Dict[:class:`~discord.Locale`, :class:`str`] - The localised descriptions of the application command. Used for display purposes. - options: List[Union[:class:`Argument`, :class:`AppCommandGroup`]] - A list of options. - default_member_permissions: Optional[:class:`~discord.Permissions`] - The default member permissions that can run this command. - dm_permission: :class:`bool` - A boolean that indicates whether this command can be run in direct messages. - guild_id: Optional[:class:`int`] - The ID of the guild this command is registered in. A value of ``None`` - denotes that it is a global command. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. - """ - - __slots__ = ( - 'id', - 'type', - 'application_id', - 'name', - 'description', - 'name_localizations', - 'description_localizations', - 'guild_id', - 'options', - 'default_member_permissions', - 'dm_permission', - 'nsfw', - '_state', - ) - - def __init__(self, *, data: ApplicationCommandPayload, state: ConnectionState) -> None: - self._state: ConnectionState = state - self._from_data(data) - - def _from_data(self, data: ApplicationCommandPayload) -> None: - self.id: int = int(data['id']) - self.application_id: int = int(data['application_id']) - self.name: str = data['name'] - self.description: str = data['description'] - self.guild_id: Optional[int] = _get_as_snowflake(data, 'guild_id') - self.type: AppCommandType = try_enum(AppCommandType, data.get('type', 1)) - self.options: List[Union[Argument, AppCommandGroup]] = [ - app_command_option_factory(data=d, parent=self, state=self._state) for d in data.get('options', []) - ] - self.default_member_permissions: Optional[Permissions] - permissions = data.get('default_member_permissions') - if permissions is None: - self.default_member_permissions = None - else: - self.default_member_permissions = Permissions(int(permissions)) - - dm_permission = data.get('dm_permission') - # For some reason this field can be explicit null and mean True - if dm_permission is None: - dm_permission = True - - self.dm_permission: bool = dm_permission - self.nsfw: bool = data.get('nsfw', False) - self.name_localizations: Dict[Locale, str] = _to_locale_dict(data.get('name_localizations') or {}) - self.description_localizations: Dict[Locale, str] = _to_locale_dict(data.get('description_localizations') or {}) - - def to_dict(self) -> ApplicationCommandPayload: - return { - 'id': self.id, - 'type': self.type.value, - 'application_id': self.application_id, - 'name': self.name, - 'description': self.description, - 'name_localizations': {str(k): v for k, v in self.name_localizations.items()}, - 'description_localizations': {str(k): v for k, v in self.description_localizations.items()}, - 'options': [opt.to_dict() for opt in self.options], - } # type: ignore # Type checker does not understand this literal. - - def __str__(self) -> str: - return self.name - - def __repr__(self) -> str: - return f'<{self.__class__.__name__} id={self.id!r} name={self.name!r} type={self.type!r}>' - - @property - def mention(self) -> str: - """:class:`str`: Returns a string that allows you to mention the given AppCommand.""" - return f'' - - @property - def guild(self) -> Optional[Guild]: - """Optional[:class:`~discord.Guild`]: Returns the guild this command is registered to - if it exists. - """ - return self._state._get_guild(self.guild_id) - - async def delete(self) -> None: - """|coro| - - Deletes the application command. - - Raises - ------- - NotFound - The application command was not found. - Forbidden - You do not have permission to delete this application command. - HTTPException - Deleting the application command failed. - MissingApplicationID - The client does not have an application ID. - """ - state = self._state - if not state.application_id: - raise MissingApplicationID - - if self.guild_id: - await state.http.delete_guild_command( - state.application_id, - self.guild_id, - self.id, - ) - else: - await state.http.delete_global_command( - state.application_id, - self.id, - ) - - async def edit( - self, - *, - name: str = MISSING, - description: str = MISSING, - default_member_permissions: Optional[Permissions] = MISSING, - dm_permission: bool = MISSING, - options: List[Union[Argument, AppCommandGroup]] = MISSING, - ) -> AppCommand: - """|coro| - - Edits the application command. - - Parameters - ----------- - name: :class:`str` - The new name for the application command. - description: :class:`str` - The new description for the application command. - default_member_permissions: Optional[:class:`~discord.Permissions`] - The new default permissions needed to use this application command. - Pass value of ``None`` to remove any permission requirements. - dm_permission: :class:`bool` - Indicates if the application command can be used in DMs. - options: List[Union[:class:`Argument`, :class:`AppCommandGroup`]] - List of new options for this application command. - - Raises - ------- - NotFound - The application command was not found. - Forbidden - You do not have permission to edit this application command. - HTTPException - Editing the application command failed. - MissingApplicationID - The client does not have an application ID. - - Returns - -------- - :class:`AppCommand` - The newly edited application command. - """ - state = self._state - if not state.application_id: - raise MissingApplicationID - - payload = {} - - if name is not MISSING: - payload['name'] = name - - if description is not MISSING: - payload['description'] = description - - if default_member_permissions is not MISSING: - if default_member_permissions is not None: - payload['default_member_permissions'] = default_member_permissions.value - else: - payload['default_member_permissions'] = None - - if self.guild_id is None and dm_permission is not MISSING: - payload['dm_permission'] = dm_permission - - if options is not MISSING: - payload['options'] = [option.to_dict() for option in options] - - if not payload: - return self - - if self.guild_id: - data = await state.http.edit_guild_command( - state.application_id, - self.guild_id, - self.id, - payload, - ) - else: - data = await state.http.edit_global_command( - state.application_id, - self.id, - payload, - ) - return AppCommand(data=data, state=state) - - async def fetch_permissions(self, guild: Snowflake) -> GuildAppCommandPermissions: - """|coro| - - Retrieves this command's permission in the guild. - - Parameters - ----------- - guild: :class:`~discord.abc.Snowflake` - The guild to retrieve the permissions from. - - Raises - ------- - Forbidden - You do not have permission to fetch the application command's permissions. - HTTPException - Fetching the application command's permissions failed. - MissingApplicationID - The client does not have an application ID. - NotFound - The application command's permissions could not be found. - This can also indicate that the permissions are synced with the guild - (i.e. they are unchanged from the default). - - Returns - -------- - :class:`GuildAppCommandPermissions` - An object representing the application command's permissions in the guild. - """ - state = self._state - if not state.application_id: - raise MissingApplicationID - - data = await state.http.get_application_command_permissions( - state.application_id, - guild.id, - self.id, - ) - return GuildAppCommandPermissions(data=data, state=state, command=self) - - -class Choice(Generic[ChoiceT]): - """Represents an application command argument choice. - - .. versionadded:: 2.0 - - .. container:: operations - - .. describe:: x == y - - Checks if two choices are equal. - - .. describe:: x != y - - Checks if two choices are not equal. - - .. describe:: hash(x) - - Returns the choice's hash. - - Parameters - ----------- - name: Union[:class:`str`, :class:`locale_str`] - The name of the choice. Used for display purposes. - Can only be up to 100 characters. - name_localizations: Dict[:class:`~discord.Locale`, :class:`str`] - The localised names of the choice. Used for display purposes. - value: Union[:class:`int`, :class:`str`, :class:`float`] - The value of the choice. If it's a string, it can only be - up to 100 characters long. - """ - - __slots__ = ('name', 'value', '_locale_name', 'name_localizations') - - def __init__(self, *, name: Union[str, locale_str], value: ChoiceT): - name, locale = (name.message, name) if isinstance(name, locale_str) else (name, None) - self.name: str = name - self._locale_name: Optional[locale_str] = locale - self.value: ChoiceT = value - self.name_localizations: Dict[Locale, str] = {} - - @classmethod - def from_dict(cls, data: ApplicationCommandOptionChoice) -> Choice[ChoiceT]: - self = cls.__new__(cls) - self.name = data['name'] - self.value = data['value'] - self.name_localizations = _to_locale_dict(data.get('name_localizations') or {}) - return self - - def __eq__(self, o: object) -> bool: - return isinstance(o, Choice) and self.name == o.name and self.value == o.value - - def __hash__(self) -> int: - return hash((self.name, self.value)) - - def __repr__(self) -> str: - return f'{self.__class__.__name__}(name={self.name!r}, value={self.value!r})' - - @property - def _option_type(self) -> AppCommandOptionType: - if isinstance(self.value, int): - return AppCommandOptionType.integer - elif isinstance(self.value, float): - return AppCommandOptionType.number - elif isinstance(self.value, str): - return AppCommandOptionType.string - else: - raise TypeError( - f'invalid Choice value type given, expected int, str, or float but received {self.value.__class__!r}' - ) - - async def get_translated_payload(self, translator: Translator) -> Dict[str, Any]: - base = self.to_dict() - name_localizations: Dict[str, str] = {} - context = TranslationContext(location=TranslationContextLocation.choice_name, data=self) - if self._locale_name: - for locale in Locale: - translation = await translator._checked_translate(self._locale_name, locale, context) - if translation is not None: - name_localizations[locale.value] = translation - - if name_localizations: - base['name_localizations'] = name_localizations - - return base - - async def get_translated_payload_for_locale(self, translator: Translator, locale: Locale) -> Dict[str, Any]: - base = self.to_dict() - if self._locale_name: - context = TranslationContext(location=TranslationContextLocation.choice_name, data=self) - translation = await translator._checked_translate(self._locale_name, locale, context) - if translation is not None: - base['name'] = translation - - return base - - def to_dict(self) -> Dict[str, Any]: - base = { - 'name': self.name, - 'value': self.value, - } - if self.name_localizations: - base['name_localizations'] = {str(k): v for k, v in self.name_localizations.items()} - return base - - -class AppCommandChannel(Hashable): - """Represents an application command partially resolved channel object. - - .. versionadded:: 2.0 - - .. container:: operations - - .. describe:: x == y - - Checks if two channels are equal. - - .. describe:: x != y - - Checks if two channels are not equal. - - .. describe:: hash(x) - - Returns the channel's hash. - - .. describe:: str(x) - - Returns the channel's name. - - Attributes - ----------- - id: :class:`int` - The ID of the channel. - type: :class:`~discord.ChannelType` - The type of channel. - name: :class:`str` - The name of the channel. - permissions: :class:`~discord.Permissions` - The resolved permissions of the user who invoked - the application command in that channel. - guild_id: :class:`int` - The guild ID this channel belongs to. - """ - - __slots__ = ( - 'id', - 'type', - 'name', - 'permissions', - 'guild_id', - '_state', - ) - - def __init__( - self, - *, - state: ConnectionState, - data: PartialChannel, - guild_id: int, - ): - self._state: ConnectionState = state - self.guild_id: int = guild_id - self.id: int = int(data['id']) - self.type: ChannelType = try_enum(ChannelType, data['type']) - self.name: str = data['name'] - self.permissions: Permissions = Permissions(int(data['permissions'])) - - def __str__(self) -> str: - return self.name - - def __repr__(self) -> str: - return f'<{self.__class__.__name__} id={self.id!r} name={self.name!r} type={self.type!r}>' - - @property - def guild(self) -> Optional[Guild]: - """Optional[:class:`~discord.Guild`]: The channel's guild, from cache, if found.""" - return self._state._get_guild(self.guild_id) - - def resolve(self) -> Optional[GuildChannel]: - """Resolves the application command channel to the appropriate channel - from cache if found. - - Returns - -------- - Optional[:class:`.abc.GuildChannel`] - The resolved guild channel or ``None`` if not found in cache. - """ - guild = self._state._get_guild(self.guild_id) - if guild is not None: - return guild.get_channel(self.id) - return None - - async def fetch(self) -> GuildChannel: - """|coro| - - Fetches the partial channel to a full :class:`.abc.GuildChannel`. - - Raises - -------- - NotFound - The channel was not found. - Forbidden - You do not have the permissions required to get a channel. - HTTPException - Retrieving the channel failed. - - Returns - -------- - :class:`.abc.GuildChannel` - The full channel. - """ - client = self._state._get_client() - return await client.fetch_channel(self.id) # type: ignore # This is explicit narrowing - - @property - def mention(self) -> str: - """:class:`str`: The string that allows you to mention the channel.""" - return f'<#{self.id}>' - - @property - def created_at(self) -> datetime: - """:class:`datetime.datetime`: An aware timestamp of when this channel was created in UTC.""" - return snowflake_time(self.id) - - -class AppCommandThread(Hashable): - """Represents an application command partially resolved thread object. - - .. versionadded:: 2.0 - - .. container:: operations - - .. describe:: x == y - - Checks if two thread are equal. - - .. describe:: x != y - - Checks if two thread are not equal. - - .. describe:: hash(x) - - Returns the thread's hash. - - .. describe:: str(x) - - Returns the thread's name. - - Attributes - ----------- - id: :class:`int` - The ID of the thread. - type: :class:`~discord.ChannelType` - The type of thread. - name: :class:`str` - The name of the thread. - parent_id: :class:`int` - The parent text channel ID this thread belongs to. - permissions: :class:`~discord.Permissions` - The resolved permissions of the user who invoked - the application command in that thread. - guild_id: :class:`int` - The guild ID this thread belongs to. - archived: :class:`bool` - Whether the thread is archived. - locked: :class:`bool` - Whether the thread is locked. - invitable: :class:`bool` - Whether non-moderators can add other non-moderators to this thread. - This is always ``True`` for public threads. - archiver_id: Optional[:class:`int`] - The user's ID that archived this thread. - auto_archive_duration: :class:`int` - The duration in minutes until the thread is automatically archived due to inactivity. - Usually a value of 60, 1440, 4320 and 10080. - archive_timestamp: :class:`datetime.datetime` - An aware timestamp of when the thread's archived status was last updated in UTC. - """ - - __slots__ = ( - 'id', - 'type', - 'name', - 'permissions', - 'guild_id', - 'parent_id', - 'archived', - 'archiver_id', - 'auto_archive_duration', - 'archive_timestamp', - 'locked', - 'invitable', - '_created_at', - '_state', - ) - - def __init__( - self, - *, - state: ConnectionState, - data: PartialThread, - guild_id: int, - ): - self._state: ConnectionState = state - self.guild_id: int = guild_id - self.id: int = int(data['id']) - self.parent_id: int = int(data['parent_id']) - self.type: ChannelType = try_enum(ChannelType, data['type']) - self.name: str = data['name'] - self.permissions: Permissions = Permissions(int(data['permissions'])) - self._unroll_metadata(data['thread_metadata']) - - def __str__(self) -> str: - return self.name - - def __repr__(self) -> str: - return f'<{self.__class__.__name__} id={self.id!r} name={self.name!r} archived={self.archived} type={self.type!r}>' - - @property - def guild(self) -> Optional[Guild]: - """Optional[:class:`~discord.Guild`]: The channel's guild, from cache, if found.""" - return self._state._get_guild(self.guild_id) - - def _unroll_metadata(self, data: ThreadMetadata) -> None: - self.archived: bool = data['archived'] - self.archiver_id: Optional[int] = _get_as_snowflake(data, 'archiver_id') - self.auto_archive_duration: ThreadArchiveDuration = data['auto_archive_duration'] - self.archive_timestamp: datetime = parse_time(data['archive_timestamp']) - self.locked: bool = data.get('locked', False) - self.invitable: bool = data.get('invitable', True) - self._created_at: Optional[datetime] = parse_time(data.get('create_timestamp')) - - @property - def parent(self) -> Optional[TextChannel]: - """Optional[:class:`~discord.TextChannel`]: The parent channel this thread belongs to.""" - return self.guild.get_channel(self.parent_id) # type: ignore - - @property - def mention(self) -> str: - """:class:`str`: The string that allows you to mention the thread.""" - return f'<#{self.id}>' - - @property - def created_at(self) -> Optional[datetime]: - """An aware timestamp of when the thread was created in UTC. - - .. note:: - - This timestamp only exists for threads created after 9 January 2022, otherwise returns ``None``. - """ - return self._created_at - - def resolve(self) -> Optional[Thread]: - """Resolves the application command channel to the appropriate channel - from cache if found. - - Returns - -------- - Optional[:class:`.abc.GuildChannel`] - The resolved guild channel or ``None`` if not found in cache. - """ - guild = self._state._get_guild(self.guild_id) - if guild is not None: - return guild.get_thread(self.id) - return None - - async def fetch(self) -> Thread: - """|coro| - - Fetches the partial channel to a full :class:`~discord.Thread`. - - Raises - -------- - NotFound - The thread was not found. - Forbidden - You do not have the permissions required to get a thread. - HTTPException - Retrieving the thread failed. - - Returns - -------- - :class:`~discord.Thread` - The full thread. - """ - client = self._state._get_client() - return await client.fetch_channel(self.id) # type: ignore # This is explicit narrowing - - -class Argument: - """Represents an application command argument. - - .. versionadded:: 2.0 - - Attributes - ------------ - type: :class:`~discord.AppCommandOptionType` - The type of argument. - name: :class:`str` - The name of the argument. - description: :class:`str` - The description of the argument. - name_localizations: Dict[:class:`~discord.Locale`, :class:`str`] - The localised names of the argument. Used for display purposes. - description_localizations: Dict[:class:`~discord.Locale`, :class:`str`] - The localised descriptions of the argument. Used for display purposes. - required: :class:`bool` - Whether the argument is required. - choices: List[:class:`Choice`] - A list of choices for the command to choose from for this argument. - parent: Union[:class:`AppCommand`, :class:`AppCommandGroup`] - The parent application command that has this argument. - channel_types: List[:class:`~discord.ChannelType`] - The channel types that are allowed for this parameter. - min_value: Optional[Union[:class:`int`, :class:`float`]] - The minimum supported value for this parameter. - max_value: Optional[Union[:class:`int`, :class:`float`]] - The maximum supported value for this parameter. - min_length: Optional[:class:`int`] - The minimum allowed length for this parameter. - max_length: Optional[:class:`int`] - The maximum allowed length for this parameter. - autocomplete: :class:`bool` - Whether the argument has autocomplete. - """ - - __slots__ = ( - 'type', - 'name', - 'description', - 'name_localizations', - 'description_localizations', - 'required', - 'choices', - 'channel_types', - 'min_value', - 'max_value', - 'min_length', - 'max_length', - 'autocomplete', - 'parent', - '_state', - ) - - def __init__( - self, *, parent: ApplicationCommandParent, data: ApplicationCommandOption, state: Optional[ConnectionState] = None - ) -> None: - self._state: Optional[ConnectionState] = state - self.parent: ApplicationCommandParent = parent - self._from_data(data) - - def __repr__(self) -> str: - return f'<{self.__class__.__name__} name={self.name!r} type={self.type!r} required={self.required}>' - - def _from_data(self, data: ApplicationCommandOption) -> None: - self.type: AppCommandOptionType = try_enum(AppCommandOptionType, data['type']) - self.name: str = data['name'] - self.description: str = data['description'] - self.required: bool = data.get('required', False) - self.min_value: Optional[Union[int, float]] = data.get('min_value') - self.max_value: Optional[Union[int, float]] = data.get('max_value') - self.min_length: Optional[int] = data.get('min_length') - self.max_length: Optional[int] = data.get('max_length') - self.autocomplete: bool = data.get('autocomplete', False) - self.channel_types: List[ChannelType] = [try_enum(ChannelType, d) for d in data.get('channel_types', [])] - self.choices: List[Choice[Union[int, float, str]]] = [Choice.from_dict(d) for d in data.get('choices', [])] - self.name_localizations: Dict[Locale, str] = _to_locale_dict(data.get('name_localizations') or {}) - self.description_localizations: Dict[Locale, str] = _to_locale_dict(data.get('description_localizations') or {}) - - def to_dict(self) -> ApplicationCommandOption: - return { - 'name': self.name, - 'type': self.type.value, - 'description': self.description, - 'required': self.required, - 'choices': [choice.to_dict() for choice in self.choices], - 'channel_types': [channel_type.value for channel_type in self.channel_types], - 'min_value': self.min_value, - 'max_value': self.max_value, - 'min_length': self.min_length, - 'max_length': self.max_length, - 'autocomplete': self.autocomplete, - 'options': [], - 'name_localizations': {str(k): v for k, v in self.name_localizations.items()}, - 'description_localizations': {str(k): v for k, v in self.description_localizations.items()}, - } # type: ignore # Type checker does not understand this literal. - - -class AppCommandGroup: - """Represents an application command subcommand. - - .. versionadded:: 2.0 - - Attributes - ------------ - type: :class:`~discord.AppCommandOptionType` - The type of subcommand. - name: :class:`str` - The name of the subcommand. - description: :class:`str` - The description of the subcommand. - name_localizations: Dict[:class:`~discord.Locale`, :class:`str`] - The localised names of the subcommand. Used for display purposes. - description_localizations: Dict[:class:`~discord.Locale`, :class:`str`] - The localised descriptions of the subcommand. Used for display purposes. - options: List[Union[:class:`Argument`, :class:`AppCommandGroup`]] - A list of options. - parent: Union[:class:`AppCommand`, :class:`AppCommandGroup`] - The parent application command. - """ - - __slots__ = ( - 'type', - 'name', - 'description', - 'name_localizations', - 'description_localizations', - 'options', - 'parent', - '_state', - ) - - def __init__( - self, *, parent: ApplicationCommandParent, data: ApplicationCommandOption, state: Optional[ConnectionState] = None - ) -> None: - self.parent: ApplicationCommandParent = parent - self._state: Optional[ConnectionState] = state - self._from_data(data) - - def __repr__(self) -> str: - return f'<{self.__class__.__name__} name={self.name!r} type={self.type!r}>' - - @property - def qualified_name(self) -> str: - """:class:`str`: Returns the fully qualified command name. - - The qualified name includes the parent name as well. For example, - in a command like ``/foo bar`` the qualified name is ``foo bar``. - """ - # A B C - # ^ self - # ^ parent - # ^ grandparent - names = [self.name, self.parent.name] - if isinstance(self.parent, AppCommandGroup): - names.append(self.parent.parent.name) - - return ' '.join(reversed(names)) - - @property - def mention(self) -> str: - """:class:`str`: Returns a string that allows you to mention the given AppCommandGroup.""" - if isinstance(self.parent, AppCommand): - base_command = self.parent - else: - base_command = self.parent.parent - return f'' # type: ignore - - def _from_data(self, data: ApplicationCommandOption) -> None: - self.type: AppCommandOptionType = try_enum(AppCommandOptionType, data['type']) - self.name: str = data['name'] - self.description: str = data['description'] - self.options: List[Union[Argument, AppCommandGroup]] = [ - app_command_option_factory(data=d, parent=self, state=self._state) for d in data.get('options', []) - ] - self.name_localizations: Dict[Locale, str] = _to_locale_dict(data.get('name_localizations') or {}) - self.description_localizations: Dict[Locale, str] = _to_locale_dict(data.get('description_localizations') or {}) - - def to_dict(self) -> 'ApplicationCommandOption': - return { - 'name': self.name, - 'type': self.type.value, - 'description': self.description, - 'options': [arg.to_dict() for arg in self.options], - 'name_localizations': {str(k): v for k, v in self.name_localizations.items()}, - 'description_localizations': {str(k): v for k, v in self.description_localizations.items()}, - } # type: ignore # Type checker does not understand this literal. - - -class AppCommandPermissions: - """Represents the permissions for an application command. - - .. versionadded:: 2.0 - - Attributes - ----------- - guild: :class:`~discord.Guild` - The guild associated with this permission. - id: :class:`int` - The ID of the permission target, such as a role, channel, or guild. - The special ``guild_id - 1`` sentinel is used to represent "all channels". - target: Any - The role, user, or channel associated with this permission. This could also be the :class:`AllChannels` sentinel type. - Falls back to :class:`~discord.Object` if the target could not be found in the cache. - type: :class:`.AppCommandPermissionType` - The type of permission. - permission: :class:`bool` - The permission value. ``True`` for allow, ``False`` for deny. - """ - - __slots__ = ('id', 'type', 'permission', 'target', 'guild', '_state') - - def __init__(self, *, data: ApplicationCommandPermissions, guild: Guild, state: ConnectionState) -> None: - self._state: ConnectionState = state - self.guild: Guild = guild - - self.id: int = int(data['id']) - self.type: AppCommandPermissionType = try_enum(AppCommandPermissionType, data['type']) - self.permission: bool = data['permission'] - - _object = None - _type = MISSING - - if self.type is AppCommandPermissionType.user: - _object = guild.get_member(self.id) or self._state.get_user(self.id) - _type = Member - elif self.type is AppCommandPermissionType.channel: - if self.id == (guild.id - 1): - _object = AllChannels(guild) - else: - _object = guild.get_channel(self.id) - elif self.type is AppCommandPermissionType.role: - _object = guild.get_role(self.id) - _type = Role - - if _object is None: - _object = Object(id=self.id, type=_type) - - self.target: Union[Object, User, Member, Role, AllChannels, GuildChannel] = _object - - def to_dict(self) -> ApplicationCommandPermissions: - return { - 'id': self.target.id, - 'type': self.type.value, - 'permission': self.permission, - } - - -class GuildAppCommandPermissions: - """Represents the permissions for an application command in a guild. - - .. versionadded:: 2.0 - - Attributes - ----------- - application_id: :class:`int` - The application ID. - command: :class:`.AppCommand` - The application command associated with the permissions. - id: :class:`int` - ID of the command or the application ID. - When this is the application ID instead of a command ID, - the permissions apply to all commands that do not contain explicit overwrites. - guild_id: :class:`int` - The guild ID associated with the permissions. - permissions: List[:class:`AppCommandPermissions`] - The permissions, this is a max of 100. - """ - - __slots__ = ('id', 'application_id', 'command', 'guild_id', 'permissions', '_state') - - def __init__(self, *, data: GuildApplicationCommandPermissions, state: ConnectionState, command: AppCommand) -> None: - self._state: ConnectionState = state - self.command: AppCommand = command - - self.id: int = int(data['id']) - self.application_id: int = int(data['application_id']) - self.guild_id: int = int(data['guild_id']) - guild = self.guild - self.permissions: List[AppCommandPermissions] = [ - AppCommandPermissions(data=value, guild=guild, state=self._state) for value in data['permissions'] - ] - - def to_dict(self) -> Dict[str, Any]: - return {'permissions': [p.to_dict() for p in self.permissions]} - - @property - def guild(self) -> Guild: - """:class:`~discord.Guild`: The guild associated with the permissions.""" - return self._state._get_or_create_unavailable_guild(self.guild_id) - - -def app_command_option_factory( - parent: ApplicationCommandParent, data: ApplicationCommandOption, *, state: Optional[ConnectionState] = None -) -> Union[Argument, AppCommandGroup]: - if is_app_command_argument_type(data['type']): - return Argument(parent=parent, data=data, state=state) - else: - return AppCommandGroup(parent=parent, data=data, state=state) diff --git a/.venv/Lib/site-packages/discord/app_commands/namespace.py b/.venv/Lib/site-packages/discord/app_commands/namespace.py deleted file mode 100644 index a56d8aa..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/namespace.py +++ /dev/null @@ -1,258 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Dict, Iterable, Iterator, List, NamedTuple, Tuple -from ..member import Member -from ..object import Object -from ..role import Role -from ..message import Message, Attachment -from ..channel import PartialMessageable -from ..enums import AppCommandOptionType -from .models import AppCommandChannel, AppCommandThread - -if TYPE_CHECKING: - from ..interactions import Interaction - from ..types.interactions import ResolvedData, ApplicationCommandInteractionDataOption - -__all__ = ('Namespace',) - - -class ResolveKey(NamedTuple): - id: str - # CommandOptionType does not use 0 or negative numbers so those can be safe for library - # internal use, if necessary. Likewise, only 6, 7, 8, and 11 are actually in use. - type: int - - @classmethod - def any_with(cls, id: str) -> ResolveKey: - return ResolveKey(id=id, type=-1) - - def __eq__(self, o: object) -> bool: - if not isinstance(o, ResolveKey): - return NotImplemented - if self.type == -1 or o.type == -1: - return self.id == o.id - return (self.id, self.type) == (o.id, o.type) - - def __hash__(self) -> int: - # Most of the time an ID lookup is all that is necessary - # In case of collision then we look up both the ID and the type. - return hash(self.id) - - -class Namespace: - """An object that holds the parameters being passed to a command in a mostly raw state. - - This class is deliberately simple and just holds the option name and resolved value as a simple - key-pair mapping. These attributes can be accessed using dot notation. For example, an option - with the name of ``example`` can be accessed using ``ns.example``. If an attribute is not found, - then ``None`` is returned rather than an attribute error. - - .. versionadded:: 2.0 - - .. container:: operations - - .. describe:: x == y - - Checks if two namespaces are equal by checking if all attributes are equal. - .. describe:: x != y - - Checks if two namespaces are not equal. - .. describe:: x[key] - - Returns an attribute if it is found, otherwise raises - a :exc:`KeyError`. - .. describe:: key in x - - Checks if the attribute is in the namespace. - .. describe:: iter(x) - - Returns an iterator of ``(name, value)`` pairs. This allows it - to be, for example, constructed as a dict or a list of pairs. - - This namespace object converts resolved objects into their appropriate form depending on their - type. Consult the table below for conversion information. - - +-------------------------------------------+-------------------------------------------------------------------------------+ - | Option Type | Resolved Type | - +===========================================+===============================================================================+ - | :attr:`.AppCommandOptionType.string` | :class:`str` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.integer` | :class:`int` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.boolean` | :class:`bool` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.number` | :class:`float` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.user` | :class:`~discord.User` or :class:`~discord.Member` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.channel` | :class:`.AppCommandChannel` or :class:`.AppCommandThread` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.role` | :class:`~discord.Role` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.mentionable` | :class:`~discord.User` or :class:`~discord.Member`, or :class:`~discord.Role` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - | :attr:`.AppCommandOptionType.attachment` | :class:`~discord.Attachment` | - +-------------------------------------------+-------------------------------------------------------------------------------+ - - .. note:: - - In autocomplete interactions, the namespace might not be validated or filled in. Discord does not - send the resolved data as well, so this means that certain fields end up just as IDs rather than - the resolved data. In these cases, a :class:`discord.Object` is returned instead. - - This is a Discord limitation. - """ - - def __init__( - self, - interaction: Interaction, - resolved: ResolvedData, - options: List[ApplicationCommandInteractionDataOption], - ): - completed = self._get_resolved_items(interaction, resolved) - for option in options: - opt_type = option['type'] - name = option['name'] - focused = option.get('focused', False) - if opt_type in (3, 4, 5): # string, integer, boolean - value = option['value'] # type: ignore # Key is there - self.__dict__[name] = value - elif opt_type == 10: # number - value = option['value'] # type: ignore # Key is there - # This condition is written this way because 0 can be a valid float - if value is None or value == '': - self.__dict__[name] = float('nan') - else: - if not focused: - self.__dict__[name] = float(value) - else: - # Autocomplete focused values tend to be garbage in - self.__dict__[name] = value - elif opt_type in (6, 7, 8, 9, 11): - # Remaining ones should be snowflake based ones with resolved data - snowflake: str = option['value'] # type: ignore # Key is there - if opt_type == 9: # Mentionable - # Mentionable is User | Role, these do not cause any conflict - key = ResolveKey.any_with(snowflake) - else: - # The remaining keys can conflict, for example, a role and a channel - # could end up with the same ID in very old guilds since they used to default - # to sharing the guild ID. Old general channels no longer exist, but some old - # servers will still have them so this needs to be handled. - key = ResolveKey(id=snowflake, type=opt_type) - - value = completed.get(key) or Object(id=int(snowflake)) - self.__dict__[name] = value - - @classmethod - def _get_resolved_items(cls, interaction: Interaction, resolved: ResolvedData) -> Dict[ResolveKey, Any]: - completed: Dict[ResolveKey, Any] = {} - state = interaction._state - members = resolved.get('members', {}) - guild_id = interaction.guild_id - guild = state._get_or_create_unavailable_guild(guild_id) if guild_id is not None else None - type = AppCommandOptionType.user.value - for (user_id, user_data) in resolved.get('users', {}).items(): - try: - member_data = members[user_id] - except KeyError: - completed[ResolveKey(id=user_id, type=type)] = state.create_user(user_data) - else: - member_data['user'] = user_data - # Guild ID can't be None in this case. - # There's a type mismatch here that I don't actually care about - member = Member(state=state, guild=guild, data=member_data) # type: ignore - completed[ResolveKey(id=user_id, type=type)] = member - - type = AppCommandOptionType.role.value - completed.update( - { - # The guild ID can't be None in this case. - ResolveKey(id=role_id, type=type): Role(guild=guild, state=state, data=role_data) # type: ignore - for role_id, role_data in resolved.get('roles', {}).items() - } - ) - - type = AppCommandOptionType.channel.value - for (channel_id, channel_data) in resolved.get('channels', {}).items(): - key = ResolveKey(id=channel_id, type=type) - if channel_data['type'] in (10, 11, 12): - # The guild ID can't be none in this case - completed[key] = AppCommandThread(state=state, data=channel_data, guild_id=guild_id) # type: ignore - else: - # The guild ID can't be none in this case - completed[key] = AppCommandChannel(state=state, data=channel_data, guild_id=guild_id) # type: ignore - - type = AppCommandOptionType.attachment.value - completed.update( - { - ResolveKey(id=attachment_id, type=type): Attachment(data=attachment_data, state=state) - for attachment_id, attachment_data in resolved.get('attachments', {}).items() - } - ) - - guild = state._get_guild(guild_id) - for (message_id, message_data) in resolved.get('messages', {}).items(): - channel_id = int(message_data['channel_id']) - if guild is None: - channel = PartialMessageable(state=state, guild_id=guild_id, id=channel_id) - else: - channel = guild.get_channel_or_thread(channel_id) or PartialMessageable( - state=state, guild_id=guild_id, id=channel_id - ) - - # Type checker doesn't understand this due to failure to narrow - message = Message(state=state, channel=channel, data=message_data) # type: ignore - key = ResolveKey(id=message_id, type=-1) - completed[key] = message - - return completed - - def __repr__(self) -> str: - items = (f'{k}={v!r}' for k, v in self.__dict__.items()) - return '<{} {}>'.format(self.__class__.__name__, ' '.join(items)) - - def __eq__(self, other: object) -> bool: - if isinstance(self, Namespace) and isinstance(other, Namespace): - return self.__dict__ == other.__dict__ - return NotImplemented - - def __getitem__(self, key: str) -> Any: - return self.__dict__[key] - - def __contains__(self, key: str) -> Any: - return key in self.__dict__ - - def __getattr__(self, attr: str) -> Any: - return None - - def __iter__(self) -> Iterator[Tuple[str, Any]]: - yield from self.__dict__.items() - - def _update_with_defaults(self, defaults: Iterable[Tuple[str, Any]]) -> None: - for key, value in defaults: - self.__dict__.setdefault(key, value) diff --git a/.venv/Lib/site-packages/discord/app_commands/transformers.py b/.venv/Lib/site-packages/discord/app_commands/transformers.py deleted file mode 100644 index 84c44ec..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/transformers.py +++ /dev/null @@ -1,871 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -import inspect - -from dataclasses import dataclass -from enum import Enum -from typing import ( - TYPE_CHECKING, - Any, - Callable, - ClassVar, - Coroutine, - Dict, - List, - Literal, - Optional, - Set, - Tuple, - Type, - TypeVar, - Union, -) - -from .errors import AppCommandError, TransformerError -from .models import AppCommandChannel, AppCommandThread, Choice -from .translator import TranslationContextLocation, TranslationContext, Translator, locale_str -from ..channel import StageChannel, VoiceChannel, TextChannel, CategoryChannel -from ..abc import GuildChannel -from ..threads import Thread -from ..enums import Enum as InternalEnum, AppCommandOptionType, ChannelType, Locale -from ..utils import MISSING, maybe_coroutine -from ..user import User -from ..role import Role -from ..member import Member -from ..message import Attachment - -__all__ = ( - 'Transformer', - 'Transform', - 'Range', -) - -T = TypeVar('T') -FuncT = TypeVar('FuncT', bound=Callable[..., Any]) -ChoiceT = TypeVar('ChoiceT', str, int, float, Union[str, int, float]) -NoneType = type(None) - -if TYPE_CHECKING: - from ..interactions import Interaction - from .commands import Parameter - - -@dataclass -class CommandParameter: - # The name of the parameter is *always* the parameter name in the code - # Therefore, it can't be Union[str, locale_str] - name: str = MISSING - description: Union[str, locale_str] = MISSING - required: bool = MISSING - default: Any = MISSING - choices: List[Choice[Union[str, int, float]]] = MISSING - type: AppCommandOptionType = MISSING - channel_types: List[ChannelType] = MISSING - min_value: Optional[Union[int, float]] = None - max_value: Optional[Union[int, float]] = None - autocomplete: Optional[Callable[..., Coroutine[Any, Any, Any]]] = None - _rename: Union[str, locale_str] = MISSING - _annotation: Any = MISSING - - async def get_translated_payload(self, translator: Translator, data: Parameter) -> Dict[str, Any]: - base = self.to_dict() - - rename = self._rename - description = self.description - needs_name_translations = isinstance(rename, locale_str) - needs_description_translations = isinstance(description, locale_str) - name_localizations: Dict[str, str] = {} - description_localizations: Dict[str, str] = {} - - # Prevent creating these objects in a heavy loop - name_context = TranslationContext(location=TranslationContextLocation.parameter_name, data=data) - description_context = TranslationContext(location=TranslationContextLocation.parameter_description, data=data) - for locale in Locale: - if needs_name_translations: - translation = await translator._checked_translate(rename, locale, name_context) - if translation is not None: - name_localizations[locale.value] = translation - - if needs_description_translations: - translation = await translator._checked_translate(description, locale, description_context) - if translation is not None: - description_localizations[locale.value] = translation - - if self.choices: - base['choices'] = [await choice.get_translated_payload(translator) for choice in self.choices] - - if name_localizations: - base['name_localizations'] = name_localizations - - if description_localizations: - base['description_localizations'] = description_localizations - - return base - - def to_dict(self) -> Dict[str, Any]: - base = { - 'type': self.type.value, - 'name': self.display_name, - 'description': str(self.description), - 'required': self.required, - } - - if self.choices: - base['choices'] = [choice.to_dict() for choice in self.choices] - if self.channel_types: - base['channel_types'] = [t.value for t in self.channel_types] - if self.autocomplete: - base['autocomplete'] = True - - min_key, max_key = ( - ('min_value', 'max_value') if self.type is not AppCommandOptionType.string else ('min_length', 'max_length') - ) - if self.min_value is not None: - base[min_key] = self.min_value - if self.max_value is not None: - base[max_key] = self.max_value - - return base - - def _convert_to_locale_strings(self) -> None: - if self._rename is MISSING: - self._rename = locale_str(self.name) - elif isinstance(self._rename, str): - self._rename = locale_str(self._rename) - - if isinstance(self.description, str): - self.description = locale_str(self.description) - - if self.choices: - for choice in self.choices: - if choice._locale_name is None: - choice._locale_name = locale_str(choice.name) - - def is_choice_annotation(self) -> bool: - return getattr(self._annotation, '__discord_app_commands_is_choice__', False) - - async def transform(self, interaction: Interaction, value: Any, /) -> Any: - if hasattr(self._annotation, '__discord_app_commands_transformer__'): - # This one needs special handling for type safety reasons - if self._annotation.__discord_app_commands_is_choice__: - choice = next((c for c in self.choices if c.value == value), None) - if choice is None: - raise TransformerError(value, self.type, self._annotation) - return choice - - try: - # ParamSpec doesn't understand that transform is a callable since it's unbound - return await maybe_coroutine(self._annotation.transform, interaction, value) # type: ignore - except AppCommandError: - raise - except Exception as e: - raise TransformerError(value, self.type, self._annotation) from e - - return value - - @property - def display_name(self) -> str: - """:class:`str`: The name of the parameter as it should be displayed to the user.""" - return self.name if self._rename is MISSING else str(self._rename) - - -class Transformer: - """The base class that allows a type annotation in an application command parameter - to map into a :class:`~discord.AppCommandOptionType` and transform the raw value into one - from this type. - - This class is customisable through the overriding of methods and properties in the class - and by using it as the second type parameter of the :class:`~discord.app_commands.Transform` - class. For example, to convert a string into a custom pair type: - - .. code-block:: python3 - - class Point(typing.NamedTuple): - x: int - y: int - - class PointTransformer(app_commands.Transformer): - async def transform(self, interaction: discord.Interaction, value: str) -> Point: - (x, _, y) = value.partition(',') - return Point(x=int(x.strip()), y=int(y.strip())) - - @app_commands.command() - async def graph( - interaction: discord.Interaction, - point: app_commands.Transform[Point, PointTransformer], - ): - await interaction.response.send_message(str(point)) - - If a class is passed instead of an instance to the second type parameter, then it is - constructed with no arguments passed to the ``__init__`` method. - - .. versionadded:: 2.0 - """ - - __discord_app_commands_transformer__: ClassVar[bool] = True - __discord_app_commands_is_choice__: ClassVar[bool] = False - - # This is needed to pass typing's type checks. - # e.g. Optional[MyTransformer] - def __call__(self) -> None: - pass - - def __or__(self, rhs: Any) -> Any: - return Union[self, rhs] # type: ignore - - @property - def type(self) -> AppCommandOptionType: - """:class:`~discord.AppCommandOptionType`: The option type associated with this transformer. - - This must be a :obj:`property`. - - Defaults to :attr:`~discord.AppCommandOptionType.string`. - """ - return AppCommandOptionType.string - - @property - def channel_types(self) -> List[ChannelType]: - """List[:class:`~discord.ChannelType`]: A list of channel types that are allowed to this parameter. - - Only valid if the :meth:`type` returns :attr:`~discord.AppCommandOptionType.channel`. - - This must be a :obj:`property`. - - Defaults to an empty list. - """ - return [] - - @property - def min_value(self) -> Optional[Union[int, float]]: - """Optional[:class:`int`]: The minimum supported value for this parameter. - - Only valid if the :meth:`type` returns :attr:`~discord.AppCommandOptionType.number` - :attr:`~discord.AppCommandOptionType.integer`, or :attr:`~discord.AppCommandOptionType.string`. - - This must be a :obj:`property`. - - Defaults to ``None``. - """ - return None - - @property - def max_value(self) -> Optional[Union[int, float]]: - """Optional[:class:`int`]: The maximum supported value for this parameter. - - Only valid if the :meth:`type` returns :attr:`~discord.AppCommandOptionType.number` - :attr:`~discord.AppCommandOptionType.integer`, or :attr:`~discord.AppCommandOptionType.string`. - - This must be a :obj:`property`. - - Defaults to ``None``. - """ - return None - - @property - def choices(self) -> Optional[List[Choice[Union[int, float, str]]]]: - """Optional[List[:class:`~discord.app_commands.Choice`]]: A list of choices that are allowed to this parameter. - - Only valid if the :meth:`type` returns :attr:`~discord.AppCommandOptionType.number` - :attr:`~discord.AppCommandOptionType.integer`, or :attr:`~discord.AppCommandOptionType.string`. - - This must be a :obj:`property`. - - Defaults to ``None``. - """ - return None - - @property - def _error_display_name(self) -> str: - name = self.__class__.__name__ - if name.endswith('Transformer'): - return name[:-11] - else: - return name - - async def transform(self, interaction: Interaction, value: Any, /) -> Any: - """|maybecoro| - - Transforms the converted option value into another value. - - The value passed into this transform function is the same as the - one in the :class:`conversion table `. - - Parameters - ----------- - interaction: :class:`~discord.Interaction` - The interaction being handled. - value: Any - The value of the given argument after being resolved. - See the :class:`conversion table ` - for how certain option types correspond to certain values. - """ - raise NotImplementedError('Derived classes need to implement this.') - - async def autocomplete( - self, interaction: Interaction, value: Union[int, float, str], / - ) -> List[Choice[Union[int, float, str]]]: - """|coro| - - An autocomplete prompt handler to be automatically used by options using this transformer. - - .. note:: - - Autocomplete is only supported for options with a :meth:`~discord.app_commands.Transformer.type` - of :attr:`~discord.AppCommandOptionType.string`, :attr:`~discord.AppCommandOptionType.integer`, - or :attr:`~discord.AppCommandOptionType.number`. - - Parameters - ----------- - interaction: :class:`~discord.Interaction` - The autocomplete interaction being handled. - value: Union[:class:`str`, :class:`int`, :class:`float`] - The current value entered by the user. - - Returns - -------- - List[:class:`~discord.app_commands.Choice`] - A list of choices to be displayed to the user, a maximum of 25. - - """ - raise NotImplementedError('Derived classes can implement this.') - - -class IdentityTransformer(Transformer): - def __init__(self, type: AppCommandOptionType) -> None: - self._type = type - - @property - def type(self) -> AppCommandOptionType: - return self._type - - async def transform(self, interaction: Interaction, value: Any, /) -> Any: - return value - - -class RangeTransformer(IdentityTransformer): - def __init__( - self, - opt_type: AppCommandOptionType, - *, - min: Optional[Union[int, float]] = None, - max: Optional[Union[int, float]] = None, - ) -> None: - if min and max and min > max: - raise TypeError('minimum cannot be larger than maximum') - - self._min: Optional[Union[int, float]] = min - self._max: Optional[Union[int, float]] = max - super().__init__(opt_type) - - @property - def min_value(self) -> Optional[Union[int, float]]: - return self._min - - @property - def max_value(self) -> Optional[Union[int, float]]: - return self._max - - -class LiteralTransformer(IdentityTransformer): - def __init__(self, values: Tuple[Any, ...]) -> None: - first = type(values[0]) - if first is int: - opt_type = AppCommandOptionType.integer - elif first is float: - opt_type = AppCommandOptionType.number - elif first is str: - opt_type = AppCommandOptionType.string - else: - raise TypeError(f'expected int, str, or float values not {first!r}') - - self._choices = [Choice(name=str(v), value=v) for v in values] - super().__init__(opt_type) - - @property - def choices(self): - return self._choices - - -class ChoiceTransformer(IdentityTransformer): - __discord_app_commands_is_choice__: ClassVar[bool] = True - - def __init__(self, inner_type: Any) -> None: - if inner_type is int: - opt_type = AppCommandOptionType.integer - elif inner_type is float: - opt_type = AppCommandOptionType.number - elif inner_type is str: - opt_type = AppCommandOptionType.string - else: - raise TypeError(f'expected int, str, or float values not {inner_type!r}') - - super().__init__(opt_type) - - -class EnumValueTransformer(Transformer): - def __init__(self, enum: Any) -> None: - super().__init__() - - values = list(enum) - if len(values) < 2: - raise TypeError(f'enum.Enum requires at least two values.') - - first = type(values[0].value) - if first is int: - opt_type = AppCommandOptionType.integer - elif first is float: - opt_type = AppCommandOptionType.number - elif first is str: - opt_type = AppCommandOptionType.string - else: - raise TypeError(f'expected int, str, or float values not {first!r}') - - self._type: AppCommandOptionType = opt_type - self._enum: Any = enum - self._choices = [Choice(name=v.name, value=v.value) for v in values] - - @property - def _error_display_name(self) -> str: - return self._enum.__name__ - - @property - def type(self) -> AppCommandOptionType: - return self._type - - @property - def choices(self): - return self._choices - - async def transform(self, interaction: Interaction, value: Any, /) -> Any: - return self._enum(value) - - -class EnumNameTransformer(Transformer): - def __init__(self, enum: Any) -> None: - super().__init__() - - values = list(enum) - if len(values) < 2: - raise TypeError(f'enum.Enum requires at least two values.') - - self._enum: Any = enum - self._choices = [Choice(name=v.name, value=v.name) for v in values] - - @property - def _error_display_name(self) -> str: - return self._enum.__name__ - - @property - def type(self) -> AppCommandOptionType: - return AppCommandOptionType.string - - @property - def choices(self): - return self._choices - - async def transform(self, interaction: Interaction, value: Any, /) -> Any: - return self._enum[value] - - -class InlineTransformer(Transformer): - def __init__(self, annotation: Any) -> None: - super().__init__() - self.annotation: Any = annotation - - @property - def _error_display_name(self) -> str: - return self.annotation.__name__ - - @property - def type(self) -> AppCommandOptionType: - return AppCommandOptionType.string - - async def transform(self, interaction: Interaction, value: Any, /) -> Any: - return await self.annotation.transform(interaction, value) - - -if TYPE_CHECKING: - from typing_extensions import Annotated as Transform - from typing_extensions import Annotated as Range -else: - - class Transform: - """A type annotation that can be applied to a parameter to customise the behaviour of - an option type by transforming with the given :class:`Transformer`. This requires - the usage of two generic parameters, the first one is the type you're converting to and the second - one is the type of the :class:`Transformer` actually doing the transformation. - - During type checking time this is equivalent to :obj:`typing.Annotated` so type checkers understand - the intent of the code. - - For example usage, check :class:`Transformer`. - - .. versionadded:: 2.0 - """ - - def __class_getitem__(cls, items) -> _TransformMetadata: - if not isinstance(items, tuple): - raise TypeError(f'expected tuple for arguments, received {items.__class__!r} instead') - - if len(items) != 2: - raise TypeError(f'Transform only accepts exactly two arguments') - - _, transformer = items - - if inspect.isclass(transformer): - if not issubclass(transformer, Transformer): - raise TypeError(f'second argument of Transform must be a Transformer class not {transformer!r}') - transformer = transformer() - elif not isinstance(transformer, Transformer): - raise TypeError(f'second argument of Transform must be a Transformer not {transformer.__class__!r}') - - return transformer - - class Range: - """A type annotation that can be applied to a parameter to require a numeric or string - type to fit within the range provided. - - During type checking time this is equivalent to :obj:`typing.Annotated` so type checkers understand - the intent of the code. - - Some example ranges: - - - ``Range[int, 10]`` means the minimum is 10 with no maximum. - - ``Range[int, None, 10]`` means the maximum is 10 with no minimum. - - ``Range[int, 1, 10]`` means the minimum is 1 and the maximum is 10. - - .. versionadded:: 2.0 - - Examples - ---------- - - .. code-block:: python3 - - @app_commands.command() - async def range(interaction: discord.Interaction, value: app_commands.Range[int, 10, 12]): - await interaction.response.send_message(f'Your value is {value}', ephemeral=True) - """ - - def __class_getitem__(cls, obj) -> _TransformMetadata: - if not isinstance(obj, tuple): - raise TypeError(f'expected tuple for arguments, received {obj.__class__!r} instead') - - if len(obj) == 2: - obj = (*obj, None) - elif len(obj) != 3: - raise TypeError('Range accepts either two or three arguments with the first being the type of range.') - - obj_type, min, max = obj - - if min is None and max is None: - raise TypeError('Range must not be empty') - - if min is not None and max is not None: - # At this point max and min are both not none - if type(min) != type(max): - raise TypeError('Both min and max in Range must be the same type') - - if obj_type is int: - opt_type = AppCommandOptionType.integer - elif obj_type is float: - opt_type = AppCommandOptionType.number - elif obj_type is str: - opt_type = AppCommandOptionType.string - else: - raise TypeError(f'expected int, float, or str as range type, received {obj_type!r} instead') - - if obj_type in (str, int): - cast = int - else: - cast = float - - transformer = RangeTransformer( - opt_type, - min=cast(min) if min is not None else None, - max=cast(max) if max is not None else None, - ) - return transformer - - -class MemberTransformer(Transformer): - @property - def type(self) -> AppCommandOptionType: - return AppCommandOptionType.user - - async def transform(self, interaction: Interaction, value: Any, /) -> Member: - if not isinstance(value, Member): - raise TransformerError(value, self.type, self) - return value - - -class BaseChannelTransformer(Transformer): - def __init__(self, *channel_types: Type[Any]) -> None: - super().__init__() - if len(channel_types) == 1: - display_name = channel_types[0].__name__ - types = CHANNEL_TO_TYPES[channel_types[0]] - else: - display_name = '{}, and {}'.format(', '.join(t.__name__ for t in channel_types[:-1]), channel_types[-1].__name__) - types = [] - - for t in channel_types: - try: - types.extend(CHANNEL_TO_TYPES[t]) - except KeyError: - raise TypeError(f'Union type of channels must be entirely made up of channels') from None - - self._types: Tuple[Type[Any]] = channel_types - self._channel_types: List[ChannelType] = types - self._display_name = display_name - - @property - def _error_display_name(self) -> str: - return self._display_name - - @property - def type(self) -> AppCommandOptionType: - return AppCommandOptionType.channel - - @property - def channel_types(self) -> List[ChannelType]: - return self._channel_types - - async def transform(self, interaction: Interaction, value: Any, /): - resolved = value.resolve() - if resolved is None or not isinstance(resolved, self._types): - raise TransformerError(value, AppCommandOptionType.channel, self) - return resolved - - -class RawChannelTransformer(BaseChannelTransformer): - async def transform(self, interaction: Interaction, value: Any, /): - if not isinstance(value, self._types): - raise TransformerError(value, AppCommandOptionType.channel, self) - return value - - -class UnionChannelTransformer(BaseChannelTransformer): - async def transform(self, interaction: Interaction, value: Any, /): - if isinstance(value, self._types): - return value - - resolved = value.resolve() - if resolved is None or not isinstance(resolved, self._types): - raise TransformerError(value, AppCommandOptionType.channel, self) - return resolved - - -CHANNEL_TO_TYPES: Dict[Any, List[ChannelType]] = { - AppCommandChannel: [ - ChannelType.stage_voice, - ChannelType.voice, - ChannelType.text, - ChannelType.news, - ChannelType.category, - ], - GuildChannel: [ - ChannelType.stage_voice, - ChannelType.voice, - ChannelType.text, - ChannelType.news, - ChannelType.category, - ], - AppCommandThread: [ChannelType.news_thread, ChannelType.private_thread, ChannelType.public_thread], - Thread: [ChannelType.news_thread, ChannelType.private_thread, ChannelType.public_thread], - StageChannel: [ChannelType.stage_voice], - VoiceChannel: [ChannelType.voice], - TextChannel: [ChannelType.text, ChannelType.news], - CategoryChannel: [ChannelType.category], -} - -BUILT_IN_TRANSFORMERS: Dict[Any, Transformer] = { - str: IdentityTransformer(AppCommandOptionType.string), - int: IdentityTransformer(AppCommandOptionType.integer), - float: IdentityTransformer(AppCommandOptionType.number), - bool: IdentityTransformer(AppCommandOptionType.boolean), - User: IdentityTransformer(AppCommandOptionType.user), - Member: MemberTransformer(), - Role: IdentityTransformer(AppCommandOptionType.role), - AppCommandChannel: RawChannelTransformer(AppCommandChannel), - AppCommandThread: RawChannelTransformer(AppCommandThread), - GuildChannel: BaseChannelTransformer(GuildChannel), - Thread: BaseChannelTransformer(Thread), - StageChannel: BaseChannelTransformer(StageChannel), - VoiceChannel: BaseChannelTransformer(VoiceChannel), - TextChannel: BaseChannelTransformer(TextChannel), - CategoryChannel: BaseChannelTransformer(CategoryChannel), - Attachment: IdentityTransformer(AppCommandOptionType.attachment), -} - -ALLOWED_DEFAULTS: Dict[AppCommandOptionType, Tuple[Type[Any], ...]] = { - AppCommandOptionType.string: (str, NoneType), - AppCommandOptionType.integer: (int, NoneType), - AppCommandOptionType.boolean: (bool, NoneType), - AppCommandOptionType.number: (float, NoneType), -} - - -def get_supported_annotation( - annotation: Any, - *, - _none: type = NoneType, - _mapping: Dict[Any, Transformer] = BUILT_IN_TRANSFORMERS, -) -> Tuple[Any, Any, bool]: - """Returns an appropriate, yet supported, annotation along with an optional default value. - - The third boolean element of the tuple indicates if default values should be validated. - - This differs from the built in mapping by supporting a few more things. - Likewise, this returns a "transformed" annotation that is ready to use with CommandParameter.transform. - """ - - try: - return (_mapping[annotation], MISSING, True) - except KeyError: - pass - - if isinstance(annotation, Transformer): - return (annotation, MISSING, False) - - if inspect.isclass(annotation): - if issubclass(annotation, Transformer): - return (annotation(), MISSING, False) - if issubclass(annotation, (Enum, InternalEnum)): - if all(isinstance(v.value, (str, int, float)) for v in annotation): - return (EnumValueTransformer(annotation), MISSING, False) - else: - return (EnumNameTransformer(annotation), MISSING, False) - if annotation is Choice: - raise TypeError(f'Choice requires a type argument of int, str, or float') - - # Check if a transform @classmethod is given to the class - # These flatten into simple "inline" transformers with implicit strings - transform_classmethod = annotation.__dict__.get('transform', None) - if isinstance(transform_classmethod, classmethod): - params = inspect.signature(transform_classmethod.__func__).parameters - if len(params) != 3: - raise TypeError(f'Inline transformer with transform classmethod requires 3 parameters') - if not inspect.iscoroutinefunction(transform_classmethod.__func__): - raise TypeError(f'Inline transformer with transform classmethod must be a coroutine') - return (InlineTransformer(annotation), MISSING, False) - - # Check if there's an origin - origin = getattr(annotation, '__origin__', None) - if origin is Literal: - args = annotation.__args__ # type: ignore - return (LiteralTransformer(args), MISSING, True) - - if origin is Choice: - arg = annotation.__args__[0] # type: ignore - return (ChoiceTransformer(arg), MISSING, True) - - if origin is not Union: - # Only Union/Optional is supported right now so bail early - raise TypeError(f'unsupported type annotation {annotation!r}') - - default = MISSING - args = annotation.__args__ # type: ignore - if args[-1] is _none: - if len(args) == 2: - underlying = args[0] - inner, _, validate_default = get_supported_annotation(underlying) - if inner is None: - raise TypeError(f'unsupported inner optional type {underlying!r}') - return (inner, None, validate_default) - else: - args = args[:-1] - default = None - - # Check for channel union types - if any(arg in CHANNEL_TO_TYPES for arg in args): - # If any channel type is given, then *all* must be channel types - return (UnionChannelTransformer(*args), default, True) - - # The only valid transformations here are: - # [Member, User] => user - # [Member, User, Role] => mentionable - # [Member | User, Role] => mentionable - supported_types: Set[Any] = {Role, Member, User} - if not all(arg in supported_types for arg in args): - raise TypeError(f'unsupported types given inside {annotation!r}') - if args == (User, Member) or args == (Member, User): - return (IdentityTransformer(AppCommandOptionType.user), default, True) - - return (IdentityTransformer(AppCommandOptionType.mentionable), default, True) - - -def annotation_to_parameter(annotation: Any, parameter: inspect.Parameter) -> CommandParameter: - """Returns the appropriate :class:`CommandParameter` for the given annotation. - - The resulting ``_annotation`` attribute might not match the one given here and might - be transformed in order to be easier to call from the ``transform`` asynchronous function - of a command parameter. - """ - - (inner, default, validate_default) = get_supported_annotation(annotation) - type = inner.type - - if default is MISSING or default is None: - param_default = parameter.default - if param_default is not parameter.empty: - default = param_default - - # Verify validity of the default parameter - if default is not MISSING and validate_default: - valid_types: Tuple[Any, ...] = ALLOWED_DEFAULTS.get(type, (NoneType,)) - if not isinstance(default, valid_types): - raise TypeError(f'invalid default parameter type given ({default.__class__}), expected {valid_types}') - - result = CommandParameter( - type=type, - _annotation=inner, - default=default, - required=default is MISSING, - name=parameter.name, - ) - - choices = inner.choices - if choices is not None: - result.choices = choices - - # These methods should be duck typed - if type in (AppCommandOptionType.number, AppCommandOptionType.string, AppCommandOptionType.integer): - result.min_value = inner.min_value - result.max_value = inner.max_value - - if type is AppCommandOptionType.channel: - result.channel_types = inner.channel_types - - if parameter.kind in (parameter.POSITIONAL_ONLY, parameter.VAR_KEYWORD, parameter.VAR_POSITIONAL): - raise TypeError(f'unsupported parameter kind in callback: {parameter.kind!s}') - - # Check if the method is overridden - if inner.autocomplete.__func__ is not Transformer.autocomplete: - from .commands import _validate_auto_complete_callback - - result.autocomplete = _validate_auto_complete_callback(inner.autocomplete) - - return result diff --git a/.venv/Lib/site-packages/discord/app_commands/translator.py b/.venv/Lib/site-packages/discord/app_commands/translator.py deleted file mode 100644 index 1741054..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/translator.py +++ /dev/null @@ -1,305 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -from typing import TYPE_CHECKING, Any, Generic, Literal, Optional, TypeVar, Union, overload -from .errors import TranslationError -from ..enums import Enum, Locale - - -if TYPE_CHECKING: - from .commands import Command, ContextMenu, Group, Parameter - from .models import Choice - - -__all__ = ( - 'TranslationContextLocation', - 'TranslationContextTypes', - 'TranslationContext', - 'Translator', - 'locale_str', -) - - -class TranslationContextLocation(Enum): - command_name = 0 - command_description = 1 - group_name = 2 - group_description = 3 - parameter_name = 4 - parameter_description = 5 - choice_name = 6 - other = 7 - - -_L = TypeVar('_L', bound=TranslationContextLocation) -_D = TypeVar('_D') - - -class TranslationContext(Generic[_L, _D]): - """A class that provides context for the :class:`locale_str` being translated. - - This is useful to determine where exactly the string is located and aid in looking - up the actual translation. - - Attributes - ----------- - location: :class:`TranslationContextLocation` - The location where this string is located. - data: Any - The extraneous data that is being translated. - """ - - __slots__ = ('location', 'data') - - @overload - def __init__( - self, location: Literal[TranslationContextLocation.command_name], data: Union[Command[Any, ..., Any], ContextMenu] - ) -> None: - ... - - @overload - def __init__( - self, location: Literal[TranslationContextLocation.command_description], data: Command[Any, ..., Any] - ) -> None: - ... - - @overload - def __init__( - self, - location: Literal[TranslationContextLocation.group_name, TranslationContextLocation.group_description], - data: Group, - ) -> None: - ... - - @overload - def __init__( - self, - location: Literal[TranslationContextLocation.parameter_name, TranslationContextLocation.parameter_description], - data: Parameter, - ) -> None: - ... - - @overload - def __init__(self, location: Literal[TranslationContextLocation.choice_name], data: Choice[Any]) -> None: - ... - - @overload - def __init__(self, location: Literal[TranslationContextLocation.other], data: Any) -> None: - ... - - def __init__(self, location: _L, data: _D) -> None: - self.location: _L = location - self.data: _D = data - - -# For type checking purposes, it makes sense to allow the user to leverage type narrowing -# So code like this works as expected: -# -# if context.type == TranslationContextLocation.command_name: -# reveal_type(context.data) # Revealed type is Command | ContextMenu -# -# This requires a union of types -CommandNameTranslationContext = TranslationContext[ - Literal[TranslationContextLocation.command_name], Union['Command[Any, ..., Any]', 'ContextMenu'] -] -CommandDescriptionTranslationContext = TranslationContext[ - Literal[TranslationContextLocation.command_description], 'Command[Any, ..., Any]' -] -GroupTranslationContext = TranslationContext[ - Literal[TranslationContextLocation.group_name, TranslationContextLocation.group_description], 'Group' -] -ParameterTranslationContext = TranslationContext[ - Literal[TranslationContextLocation.parameter_name, TranslationContextLocation.parameter_description], 'Parameter' -] -ChoiceTranslationContext = TranslationContext[Literal[TranslationContextLocation.choice_name], 'Choice[Any]'] -OtherTranslationContext = TranslationContext[Literal[TranslationContextLocation.other], Any] - -TranslationContextTypes = Union[ - CommandNameTranslationContext, - CommandDescriptionTranslationContext, - GroupTranslationContext, - ParameterTranslationContext, - ChoiceTranslationContext, - OtherTranslationContext, -] - - -class Translator: - """A class that handles translations for commands, parameters, and choices. - - Translations are done lazily in order to allow for async enabled translations as well - as supporting a wide array of translation systems such as :mod:`gettext` and - `Project Fluent `_. - - In order for a translator to be used, it must be set using the :meth:`CommandTree.set_translator` - method. The translation flow for a string is as follows: - - 1. Use :class:`locale_str` instead of :class:`str` in areas of a command you want to be translated. - - Currently, these are command names, command descriptions, parameter names, parameter descriptions, and choice names. - - This can also be used inside the :func:`~discord.app_commands.describe` decorator. - 2. Call :meth:`CommandTree.set_translator` to the translator instance that will handle the translations. - 3. Call :meth:`CommandTree.sync` - 4. The library will call :meth:`Translator.translate` on all the relevant strings being translated. - - .. versionadded:: 2.0 - """ - - async def load(self) -> None: - """|coro| - - An asynchronous setup function for loading the translation system. - - The default implementation does nothing. - - This is invoked when :meth:`CommandTree.set_translator` is called. - """ - pass - - async def unload(self) -> None: - """|coro| - - An asynchronous teardown function for unloading the translation system. - - The default implementation does nothing. - - This is invoked when :meth:`CommandTree.set_translator` is called - if a tree already has a translator or when :meth:`discord.Client.close` is called. - """ - pass - - async def _checked_translate( - self, string: locale_str, locale: Locale, context: TranslationContextTypes - ) -> Optional[str]: - try: - return await self.translate(string, locale, context) - except TranslationError: - raise - except Exception as e: - raise TranslationError(string=string, locale=locale, context=context) from e - - async def translate(self, string: locale_str, locale: Locale, context: TranslationContextTypes) -> Optional[str]: - """|coro| - - Translates the given string to the specified locale. - - If the string cannot be translated, ``None`` should be returned. - - The default implementation returns ``None``. - - If an exception is raised in this method, it should inherit from :exc:`TranslationError`. - If it doesn't, then when this is called the exception will be chained with it instead. - - Parameters - ------------ - string: :class:`locale_str` - The string being translated. - locale: :class:`~discord.Locale` - The locale being requested for translation. - context: :class:`TranslationContext` - The translation context where the string originated from. - For better type checking ergonomics, the ``TranslationContextTypes`` - type can be used instead to aid with type narrowing. It is functionally - equivalent to :class:`TranslationContext`. - """ - - return None - - -class locale_str: - """Marks a string as ready for translation. - - This is done lazily and is not actually translated until :meth:`CommandTree.sync` is called. - - The sync method then ultimately defers the responsibility of translating to the :class:`Translator` - instance used by the :class:`CommandTree`. For more information on the translation flow, see the - :class:`Translator` documentation. - - .. container:: operations - - .. describe:: str(x) - - Returns the message passed to the string. - - .. describe:: x == y - - Checks if the string is equal to another string. - - .. describe:: x != y - - Checks if the string is not equal to another string. - - .. describe:: hash(x) - - Returns the hash of the string. - - .. versionadded:: 2.0 - - Attributes - ------------ - message: :class:`str` - The message being translated. Once set, this cannot be changed. - - .. warning:: - - This must be the default "message" that you send to Discord. - Discord sends this message back to the library and the library - uses it to access the data in order to dispatch commands. - - For example, in a command name context, if the command - name is ``foo`` then the message *must* also be ``foo``. - For other translation systems that require a message ID such - as Fluent, consider using a keyword argument to pass it in. - extras: :class:`dict` - A dict of user provided extras to attach to the translated string. - This can be used to add more context, information, or any metadata necessary - to aid in actually translating the string. - - Since these are passed via keyword arguments, the keys are strings. - """ - - __slots__ = ('__message', 'extras') - - def __init__(self, message: str, /, **kwargs: Any) -> None: - self.__message: str = message - self.extras: dict[str, Any] = kwargs - - @property - def message(self) -> str: - return self.__message - - def __str__(self) -> str: - return self.__message - - def __repr__(self) -> str: - kwargs = ', '.join(f'{k}={v!r}' for k, v in self.extras.items()) - if kwargs: - return f'{self.__class__.__name__}({self.__message!r}, {kwargs})' - return f'{self.__class__.__name__}({self.__message!r})' - - def __eq__(self, obj: object) -> bool: - return isinstance(obj, locale_str) and self.message == obj.message - - def __hash__(self) -> int: - return hash(self.__message) diff --git a/.venv/Lib/site-packages/discord/app_commands/tree.py b/.venv/Lib/site-packages/discord/app_commands/tree.py deleted file mode 100644 index 5ee4a6a..0000000 --- a/.venv/Lib/site-packages/discord/app_commands/tree.py +++ /dev/null @@ -1,1247 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -import logging -import inspect - -from typing import ( - Any, - TYPE_CHECKING, - Callable, - Coroutine, - Dict, - Generator, - Generic, - List, - Literal, - Optional, - Sequence, - Set, - Tuple, - TypeVar, - Union, - overload, -) -from collections import Counter - - -from .namespace import Namespace, ResolveKey -from .models import AppCommand -from .commands import Command, ContextMenu, Group, _shorten -from .errors import ( - AppCommandError, - CommandAlreadyRegistered, - CommandNotFound, - CommandSignatureMismatch, - CommandLimitReached, - CommandSyncFailure, - MissingApplicationID, -) -from .translator import Translator, locale_str -from ..errors import ClientException, HTTPException -from ..enums import AppCommandType, InteractionType -from ..utils import MISSING, _get_as_snowflake, _is_submodule - -if TYPE_CHECKING: - from ..types.interactions import ApplicationCommandInteractionData, ApplicationCommandInteractionDataOption - from ..interactions import Interaction - from ..client import Client - from ..abc import Snowflake - from .commands import ContextMenuCallback, CommandCallback, P, T - - ErrorFunc = Callable[ - [Interaction, AppCommandError], - Coroutine[Any, Any, Any], - ] - -__all__ = ('CommandTree',) - -ClientT = TypeVar('ClientT', bound='Client') - -_log = logging.getLogger(__name__) - - -def _retrieve_guild_ids( - command: Any, guild: Optional[Snowflake] = MISSING, guilds: Sequence[Snowflake] = MISSING -) -> Optional[Set[int]]: - if guild is not MISSING and guilds is not MISSING: - raise TypeError('cannot mix guild and guilds keyword arguments') - - # guilds=[] or guilds=[...] - if guild is MISSING: - # If no arguments are given then it should default to the ones - # given to the guilds(...) decorator or None for global. - if guilds is MISSING: - return getattr(command, '_guild_ids', None) - - # guilds=[] is the same as global - if len(guilds) == 0: - return None - - return {g.id for g in guilds} - - # At this point it should be... - # guild=None or guild=Object - if guild is None: - return None - return {guild.id} - - -class CommandTree(Generic[ClientT]): - """Represents a container that holds application command information. - - Parameters - ----------- - client: :class:`~discord.Client` - The client instance to get application command information from. - fallback_to_global: :class:`bool` - If a guild-specific command is not found when invoked, then try falling back into - a global command in the tree. For example, if the tree locally has a ``/ping`` command - under the global namespace but the guild has a guild-specific ``/ping``, instead of failing - to find the guild-specific ``/ping`` command it will fall back to the global ``/ping`` command. - This has the potential to raise more :exc:`~discord.app_commands.CommandSignatureMismatch` errors - than usual. Defaults to ``True``. - """ - - def __init__(self, client: ClientT, *, fallback_to_global: bool = True): - self.client: ClientT = client - self._http = client.http - self._state = client._connection - - if self._state._command_tree is not None: - raise ClientException('This client already has an associated command tree.') - - self._state._command_tree = self - self.fallback_to_global: bool = fallback_to_global - self._guild_commands: Dict[int, Dict[str, Union[Command, Group]]] = {} - self._global_commands: Dict[str, Union[Command, Group]] = {} - # (name, guild_id, command_type): Command - # The above two mappings can use this structure too but we need fast retrieval - # by name and guild_id in the above case while here it isn't as important since - # it's uncommon and N=5 anyway. - self._context_menus: Dict[Tuple[str, Optional[int], int], ContextMenu] = {} - - async def fetch_command(self, command_id: int, /, *, guild: Optional[Snowflake] = None) -> AppCommand: - """|coro| - - Fetches an application command from the application. - - Parameters - ----------- - command_id: :class:`int` - The ID of the command to fetch. - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to fetch the command from. If not passed then the global command - is fetched instead. - - Raises - ------- - HTTPException - Fetching the command failed. - MissingApplicationID - The application ID could not be found. - NotFound - The application command was not found. - This could also be because the command is a guild command - and the guild was not specified and vice versa. - - Returns - -------- - :class:`~discord.app_commands.AppCommand` - The application command. - """ - if self.client.application_id is None: - raise MissingApplicationID - - if guild is None: - command = await self._http.get_global_command(self.client.application_id, command_id) - else: - command = await self._http.get_guild_command(self.client.application_id, guild.id, command_id) - - return AppCommand(data=command, state=self._state) - - async def fetch_commands(self, *, guild: Optional[Snowflake] = None) -> List[AppCommand]: - """|coro| - - Fetches the application's current commands. - - If no guild is passed then global commands are fetched, otherwise - the guild's commands are fetched instead. - - .. note:: - - This includes context menu commands. - - Parameters - ----------- - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to fetch the commands from. If not passed then global commands - are fetched instead. - - Raises - ------- - HTTPException - Fetching the commands failed. - MissingApplicationID - The application ID could not be found. - - Returns - -------- - List[:class:`~discord.app_commands.AppCommand`] - The application's commands. - """ - if self.client.application_id is None: - raise MissingApplicationID - - if guild is None: - commands = await self._http.get_global_commands(self.client.application_id) - else: - commands = await self._http.get_guild_commands(self.client.application_id, guild.id) - - return [AppCommand(data=data, state=self._state) for data in commands] - - def copy_global_to(self, *, guild: Snowflake) -> None: - """Copies all global commands to the specified guild. - - This method is mainly available for development purposes, as it allows you - to copy your global commands over to a testing guild easily. - - Note that this method will *override* pre-existing guild commands that would conflict. - - Parameters - ----------- - guild: :class:`~discord.abc.Snowflake` - The guild to copy the commands to. - - Raises - -------- - CommandLimitReached - The maximum number of commands was reached for that guild. - This is currently 100 for slash commands and 5 for context menu commands. - """ - - try: - mapping = self._guild_commands[guild.id].copy() - except KeyError: - mapping = {} - - mapping.update(self._global_commands) - if len(mapping) > 100: - raise CommandLimitReached(guild_id=guild.id, limit=100) - - ctx_menu: Dict[Tuple[str, Optional[int], int], ContextMenu] = { - (name, guild.id, cmd_type): cmd - for ((name, g, cmd_type), cmd) in self._context_menus.items() - if g is None or g == guild.id - } - - counter = Counter(cmd_type for _, _, cmd_type in ctx_menu) - for cmd_type, count in counter.items(): - if count > 5: - as_enum = AppCommandType(cmd_type) - raise CommandLimitReached(guild_id=guild.id, limit=5, type=as_enum) - - self._context_menus.update(ctx_menu) - self._guild_commands[guild.id] = mapping - - def add_command( - self, - command: Union[Command[Any, ..., Any], ContextMenu, Group], - /, - *, - guild: Optional[Snowflake] = MISSING, - guilds: Sequence[Snowflake] = MISSING, - override: bool = False, - ) -> None: - """Adds an application command to the tree. - - This only adds the command locally -- in order to sync the commands - and enable them in the client, :meth:`sync` must be called. - - The root parent of the command is added regardless of the type passed. - - Parameters - ----------- - command: Union[:class:`Command`, :class:`Group`] - The application command or group to add. - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to add the command to. If not given or ``None`` then it - becomes a global command instead. - guilds: List[:class:`~discord.abc.Snowflake`] - The list of guilds to add the command to. This cannot be mixed - with the ``guild`` parameter. If no guilds are given at all - then it becomes a global command instead. - override: :class:`bool` - Whether to override a command with the same name. If ``False`` - an exception is raised. Default is ``False``. - - Raises - -------- - ~discord.app_commands.CommandAlreadyRegistered - The command was already registered and no override was specified. - TypeError - The application command passed is not a valid application command. - Or, ``guild`` and ``guilds`` were both given. - CommandLimitReached - The maximum number of commands was reached globally or for that guild. - This is currently 100 for slash commands and 5 for context menu commands. - """ - - guild_ids = _retrieve_guild_ids(command, guild, guilds) - if isinstance(command, ContextMenu): - type = command.type.value - name = command.name - - def _context_menu_add_helper( - guild_id: Optional[int], - data: Dict[Tuple[str, Optional[int], int], ContextMenu], - name: str = name, - type: int = type, - ) -> None: - key = (name, guild_id, type) - found = key in self._context_menus - if found and not override: - raise CommandAlreadyRegistered(name, guild_id) - - # If the key is found and overridden then it shouldn't count as an extra addition - # read as `0 if override and found else 1` if confusing - to_add = not (override and found) - total = sum(1 for _, g, t in self._context_menus if g == guild_id and t == type) - if total + to_add > 5: - raise CommandLimitReached(guild_id=guild_id, limit=5, type=AppCommandType(type)) - data[key] = command - - if guild_ids is None: - _context_menu_add_helper(None, self._context_menus) - else: - current: Dict[Tuple[str, Optional[int], int], ContextMenu] = {} - for guild_id in guild_ids: - _context_menu_add_helper(guild_id, current) - - # Update at the end in order to make sure the update is atomic. - # An error during addition could end up making the context menu mapping - # have a partial state - self._context_menus.update(current) - return - elif not isinstance(command, (Command, Group)): - raise TypeError(f'Expected an application command, received {command.__class__!r} instead') - - # todo: validate application command groups having children (required) - - root = command.root_parent or command - name = root.name - if guild_ids is not None: - # Validate that the command can be added first, before actually - # adding it into the mapping. This ensures atomicity. - for guild_id in guild_ids: - commands = self._guild_commands.get(guild_id, {}) - found = name in commands - if found and not override: - raise CommandAlreadyRegistered(name, guild_id) - - to_add = not (override and found) - if len(commands) + to_add > 100: - raise CommandLimitReached(guild_id=guild_id, limit=100) - - # Actually add the command now that it has been verified to be okay. - for guild_id in guild_ids: - commands = self._guild_commands.setdefault(guild_id, {}) - commands[name] = root - else: - found = name in self._global_commands - if found and not override: - raise CommandAlreadyRegistered(name, None) - - to_add = not (override and found) - if len(self._global_commands) + to_add > 100: - raise CommandLimitReached(guild_id=None, limit=100) - self._global_commands[name] = root - - @overload - def remove_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.message, AppCommandType.user], - ) -> Optional[ContextMenu]: - ... - - @overload - def remove_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.chat_input] = ..., - ) -> Optional[Union[Command[Any, ..., Any], Group]]: - ... - - @overload - def remove_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = ..., - type: AppCommandType, - ) -> Optional[Union[Command[Any, ..., Any], ContextMenu, Group]]: - ... - - def remove_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = None, - type: AppCommandType = AppCommandType.chat_input, - ) -> Optional[Union[Command[Any, ..., Any], ContextMenu, Group]]: - """Removes an application command from the tree. - - This only removes the command locally -- in order to sync the commands - and remove them in the client, :meth:`sync` must be called. - - Parameters - ----------- - command: :class:`str` - The name of the root command to remove. - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to remove the command from. If not given or ``None`` then it - removes a global command instead. - type: :class:`~discord.AppCommandType` - The type of command to remove. Defaults to :attr:`~discord.AppCommandType.chat_input`, - i.e. slash commands. - - Returns - --------- - Optional[Union[:class:`Command`, :class:`ContextMenu`, :class:`Group`]] - The application command that got removed. - If nothing was removed then ``None`` is returned instead. - """ - - if type is AppCommandType.chat_input: - if guild is None: - return self._global_commands.pop(command, None) - else: - try: - commands = self._guild_commands[guild.id] - except KeyError: - return None - else: - return commands.pop(command, None) - elif type in (AppCommandType.user, AppCommandType.message): - guild_id = None if guild is None else guild.id - key = (command, guild_id, type.value) - return self._context_menus.pop(key, None) - - def clear_commands(self, *, guild: Optional[Snowflake], type: Optional[AppCommandType] = None) -> None: - """Clears all application commands from the tree. - - This only removes the commands locally -- in order to sync the commands - and remove them in the client, :meth:`sync` must be called. - - Parameters - ----------- - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to remove the commands from. If ``None`` then it - removes all global commands instead. - type: :class:`~discord.AppCommandType` - The type of command to clear. If not given or ``None`` then it removes all commands - regardless of the type. - """ - - if type is None or type is AppCommandType.chat_input: - if guild is None: - self._global_commands.clear() - else: - try: - commands = self._guild_commands[guild.id] - except KeyError: - pass - else: - commands.clear() - - guild_id = None if guild is None else guild.id - if type is None: - self._context_menus = { - (name, _guild_id, value): cmd - for (name, _guild_id, value), cmd in self._context_menus.items() - if _guild_id != guild_id - } - elif type in (AppCommandType.user, AppCommandType.message): - self._context_menus = { - (name, _guild_id, value): cmd - for (name, _guild_id, value), cmd in self._context_menus.items() - if _guild_id != guild_id or value != type.value - } - - @overload - def get_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.message, AppCommandType.user], - ) -> Optional[ContextMenu]: - ... - - @overload - def get_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.chat_input] = ..., - ) -> Optional[Union[Command[Any, ..., Any], Group]]: - ... - - @overload - def get_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = ..., - type: AppCommandType, - ) -> Optional[Union[Command[Any, ..., Any], ContextMenu, Group]]: - ... - - def get_command( - self, - command: str, - /, - *, - guild: Optional[Snowflake] = None, - type: AppCommandType = AppCommandType.chat_input, - ) -> Optional[Union[Command[Any, ..., Any], ContextMenu, Group]]: - """Gets an application command from the tree. - - Parameters - ----------- - command: :class:`str` - The name of the root command to get. - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to get the command from. If not given or ``None`` then it - gets a global command instead. - type: :class:`~discord.AppCommandType` - The type of command to get. Defaults to :attr:`~discord.AppCommandType.chat_input`, - i.e. slash commands. - - Returns - --------- - Optional[Union[:class:`Command`, :class:`ContextMenu`, :class:`Group`]] - The application command that was found. - If nothing was found then ``None`` is returned instead. - """ - - if type is AppCommandType.chat_input: - if guild is None: - return self._global_commands.get(command) - else: - try: - commands = self._guild_commands[guild.id] - except KeyError: - return None - else: - return commands.get(command) - elif type in (AppCommandType.user, AppCommandType.message): - guild_id = None if guild is None else guild.id - key = (command, guild_id, type.value) - return self._context_menus.get(key) - - @overload - def get_commands( - self, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.message, AppCommandType.user], - ) -> List[ContextMenu]: - ... - - @overload - def get_commands( - self, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.chat_input], - ) -> List[Union[Command[Any, ..., Any], Group]]: - ... - - @overload - def get_commands( - self, - *, - guild: Optional[Snowflake] = ..., - type: AppCommandType, - ) -> Union[List[Union[Command[Any, ..., Any], Group]], List[ContextMenu]]: - ... - - @overload - def get_commands( - self, - *, - guild: Optional[Snowflake] = ..., - type: Optional[AppCommandType] = ..., - ) -> List[Union[Command[Any, ..., Any], Group, ContextMenu]]: - ... - - def get_commands( - self, - *, - guild: Optional[Snowflake] = None, - type: Optional[AppCommandType] = None, - ) -> Union[ - List[ContextMenu], - List[Union[Command[Any, ..., Any], Group]], - List[Union[Command[Any, ..., Any], Group, ContextMenu]], - ]: - """Gets all application commands from the tree. - - Parameters - ----------- - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to get the commands from, not including global commands. - If not given or ``None`` then only global commands are returned. - type: Optional[:class:`~discord.AppCommandType`] - The type of commands to get. When not given or ``None``, then all - command types are returned. - - Returns - --------- - List[Union[:class:`ContextMenu`, :class:`Command`, :class:`Group`]] - The application commands from the tree. - """ - if type is None: - return self._get_all_commands(guild=guild) - - if type is AppCommandType.chat_input: - if guild is None: - return list(self._global_commands.values()) - else: - try: - commands = self._guild_commands[guild.id] - except KeyError: - return [] - else: - return list(commands.values()) - else: - guild_id = None if guild is None else guild.id - value = type.value - return [command for ((_, g, t), command) in self._context_menus.items() if g == guild_id and t == value] - - @overload - def walk_commands( - self, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.message, AppCommandType.user], - ) -> Generator[ContextMenu, None, None]: - ... - - @overload - def walk_commands( - self, - *, - guild: Optional[Snowflake] = ..., - type: Literal[AppCommandType.chat_input] = ..., - ) -> Generator[Union[Command[Any, ..., Any], Group], None, None]: - ... - - @overload - def walk_commands( - self, - *, - guild: Optional[Snowflake] = ..., - type: AppCommandType, - ) -> Union[Generator[Union[Command[Any, ..., Any], Group], None, None], Generator[ContextMenu, None, None]]: - ... - - def walk_commands( - self, - *, - guild: Optional[Snowflake] = None, - type: AppCommandType = AppCommandType.chat_input, - ) -> Union[Generator[Union[Command[Any, ..., Any], Group], None, None], Generator[ContextMenu, None, None]]: - """An iterator that recursively walks through all application commands and child commands from the tree. - - Parameters - ----------- - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to iterate the commands from, not including global commands. - If not given or ``None`` then only global commands are iterated. - type: :class:`~discord.AppCommandType` - The type of commands to iterate over. Defaults to :attr:`~discord.AppCommandType.chat_input`, - i.e. slash commands. - - Yields - --------- - Union[:class:`ContextMenu`, :class:`Command`, :class:`Group`] - The application commands from the tree. - """ - - if type is AppCommandType.chat_input: - if guild is None: - for cmd in self._global_commands.values(): - yield cmd - if isinstance(cmd, Group): - yield from cmd.walk_commands() - else: - try: - commands = self._guild_commands[guild.id] - except KeyError: - return - else: - for cmd in commands.values(): - yield cmd - if isinstance(cmd, Group): - yield from cmd.walk_commands() - else: - guild_id = None if guild is None else guild.id - value = type.value - for ((_, g, t), command) in self._context_menus.items(): - if g == guild_id and t == value: - yield command - - def _get_all_commands( - self, *, guild: Optional[Snowflake] = None - ) -> List[Union[Command[Any, ..., Any], Group, ContextMenu]]: - if guild is None: - base: List[Union[Command[Any, ..., Any], Group, ContextMenu]] = list(self._global_commands.values()) - base.extend(cmd for ((_, g, _), cmd) in self._context_menus.items() if g is None) - return base - else: - try: - commands = self._guild_commands[guild.id] - except KeyError: - guild_id = guild.id - return [cmd for ((_, g, _), cmd) in self._context_menus.items() if g == guild_id] - else: - base: List[Union[Command[Any, ..., Any], Group, ContextMenu]] = list(commands.values()) - guild_id = guild.id - base.extend(cmd for ((_, g, _), cmd) in self._context_menus.items() if g == guild_id) - return base - - def _remove_with_module(self, name: str) -> None: - remove: List[Any] = [] - for key, cmd in self._context_menus.items(): - if cmd.module is not None and _is_submodule(name, cmd.module): - remove.append(key) - - for key in remove: - del self._context_menus[key] - - remove = [] - for key, cmd in self._global_commands.items(): - if cmd.module is not None and _is_submodule(name, cmd.module): - remove.append(key) - - for key in remove: - del self._global_commands[key] - - for mapping in self._guild_commands.values(): - remove = [] - for key, cmd in mapping.items(): - if cmd.module is not None and _is_submodule(name, cmd.module): - remove.append(key) - - for key in remove: - del mapping[key] - - async def on_error(self, interaction: Interaction, error: AppCommandError, /) -> None: - """|coro| - - A callback that is called when any command raises an :exc:`AppCommandError`. - - The default implementation logs the exception using the library logger - if the command does not have any error handlers attached to it. - - To get the command that failed, :attr:`discord.Interaction.command` should - be used. - - Parameters - ----------- - interaction: :class:`~discord.Interaction` - The interaction that is being handled. - error: :exc:`AppCommandError` - The exception that was raised. - """ - - command = interaction.command - if command is not None: - if command._has_any_error_handlers(): - return - - _log.error('Ignoring exception in command %r', command.name, exc_info=error) - else: - _log.error('Ignoring exception in command tree', exc_info=error) - - def error(self, coro: ErrorFunc) -> ErrorFunc: - """A decorator that registers a coroutine as a local error handler. - - This must match the signature of the :meth:`on_error` callback. - - The error passed will be derived from :exc:`AppCommandError`. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the local error handler. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine or does - not match the signature. - """ - - if not inspect.iscoroutinefunction(coro): - raise TypeError('The error handler must be a coroutine.') - - params = inspect.signature(coro).parameters - if len(params) != 2: - raise TypeError('error handler must have 2 parameters') - - self.on_error = coro - return coro - - def command( - self, - *, - name: Union[str, locale_str] = MISSING, - description: Union[str, locale_str] = MISSING, - nsfw: bool = False, - guild: Optional[Snowflake] = MISSING, - guilds: Sequence[Snowflake] = MISSING, - auto_locale_strings: bool = True, - extras: Dict[Any, Any] = MISSING, - ) -> Callable[[CommandCallback[Group, P, T]], Command[Group, P, T]]: - """A decorator that creates an application command from a regular function directly under this tree. - - Parameters - ------------ - name: Union[:class:`str`, :class:`locale_str`] - The name of the application command. If not given, it defaults to a lower-case - version of the callback name. - description: Union[:class:`str`, :class:`locale_str`] - The description of the application command. This shows up in the UI to describe - the application command. If not given, it defaults to the first line of the docstring - of the callback shortened to 100 characters. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. Defaults to ``False``. - - Due to a Discord limitation, this does not work on subcommands. - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to add the command to. If not given or ``None`` then it - becomes a global command instead. - guilds: List[:class:`~discord.abc.Snowflake`] - The list of guilds to add the command to. This cannot be mixed - with the ``guild`` parameter. If no guilds are given at all - then it becomes a global command instead. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - def decorator(func: CommandCallback[Group, P, T]) -> Command[Group, P, T]: - if not inspect.iscoroutinefunction(func): - raise TypeError('command function must be a coroutine function') - - if description is MISSING: - if func.__doc__ is None: - desc = '…' - else: - desc = _shorten(func.__doc__) - else: - desc = description - - command = Command( - name=name if name is not MISSING else func.__name__, - description=desc, - callback=func, - nsfw=nsfw, - parent=None, - auto_locale_strings=auto_locale_strings, - extras=extras, - ) - self.add_command(command, guild=guild, guilds=guilds) - return command - - return decorator - - def context_menu( - self, - *, - name: Union[str, locale_str] = MISSING, - nsfw: bool = False, - guild: Optional[Snowflake] = MISSING, - guilds: Sequence[Snowflake] = MISSING, - auto_locale_strings: bool = True, - extras: Dict[Any, Any] = MISSING, - ) -> Callable[[ContextMenuCallback], ContextMenu]: - """A decorator that creates an application command context menu from a regular function directly under this tree. - - This function must have a signature of :class:`~discord.Interaction` as its first parameter - and taking either a :class:`~discord.Member`, :class:`~discord.User`, or :class:`~discord.Message`, - or a :obj:`typing.Union` of ``Member`` and ``User`` as its second parameter. - - Examples - --------- - - .. code-block:: python3 - - @app_commands.context_menu() - async def react(interaction: discord.Interaction, message: discord.Message): - await interaction.response.send_message('Very cool message!', ephemeral=True) - - @app_commands.context_menu() - async def ban(interaction: discord.Interaction, user: discord.Member): - await interaction.response.send_message(f'Should I actually ban {user}...', ephemeral=True) - - Parameters - ------------ - name: Union[:class:`str`, :class:`locale_str`] - The name of the context menu command. If not given, it defaults to a title-case - version of the callback name. Note that unlike regular slash commands this can - have spaces and upper case characters in the name. - nsfw: :class:`bool` - Whether the command is NSFW and should only work in NSFW channels. Defaults to ``False``. - - Due to a Discord limitation, this does not work on subcommands. - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to add the command to. If not given or ``None`` then it - becomes a global command instead. - guilds: List[:class:`~discord.abc.Snowflake`] - The list of guilds to add the command to. This cannot be mixed - with the ``guild`` parameter. If no guilds are given at all - then it becomes a global command instead. - auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`locale_str` rather than :class:`str`. This could - avoid some repetition and be more ergonomic for certain defaults such - as default command names, command descriptions, and parameter names. - Defaults to ``True``. - extras: :class:`dict` - A dictionary that can be used to store extraneous data. - The library will not touch any values or keys within this dictionary. - """ - - def decorator(func: ContextMenuCallback) -> ContextMenu: - if not inspect.iscoroutinefunction(func): - raise TypeError('context menu function must be a coroutine function') - - actual_name = func.__name__.title() if name is MISSING else name - context_menu = ContextMenu( - name=actual_name, - nsfw=nsfw, - callback=func, - auto_locale_strings=auto_locale_strings, - extras=extras, - ) - self.add_command(context_menu, guild=guild, guilds=guilds) - return context_menu - - return decorator - - @property - def translator(self) -> Optional[Translator]: - """Optional[:class:`Translator`]: The translator, if any, responsible for handling translation of commands. - - To change the translator, use :meth:`set_translator`. - """ - return self._state._translator - - async def set_translator(self, translator: Optional[Translator]) -> None: - """Sets the translator to use for translating commands. - - If a translator was previously set, it will be unloaded using its - :meth:`Translator.unload` method. - - When a translator is set, it will be loaded using its :meth:`Translator.load` method. - - Parameters - ------------ - translator: Optional[:class:`Translator`] - The translator to use. If ``None`` then the translator is just removed and unloaded. - - Raises - ------- - TypeError - The translator was not ``None`` or a :class:`Translator` instance. - """ - - if translator is not None and not isinstance(translator, Translator): - raise TypeError(f'expected None or Translator instance, received {translator.__class__!r} instead') - - old_translator = self._state._translator - if old_translator is not None: - await old_translator.unload() - - if translator is None: - self._state._translator = None - else: - await translator.load() - self._state._translator = translator - - async def sync(self, *, guild: Optional[Snowflake] = None) -> List[AppCommand]: - """|coro| - - Syncs the application commands to Discord. - - This also runs the translator to get the translated strings necessary for - feeding back into Discord. - - This must be called for the application commands to show up. - - Parameters - ----------- - guild: Optional[:class:`~discord.abc.Snowflake`] - The guild to sync the commands to. If ``None`` then it - syncs all global commands instead. - - Raises - ------- - HTTPException - Syncing the commands failed. - CommandSyncFailure - Syncing the commands failed due to a user related error, typically because - the command has invalid data. This is equivalent to an HTTP status code of - 400. - Forbidden - The client does not have the ``applications.commands`` scope in the guild. - MissingApplicationID - The client does not have an application ID. - TranslationError - An error occurred while translating the commands. - - Returns - -------- - List[:class:`AppCommand`] - The application's commands that got synced. - """ - - if self.client.application_id is None: - raise MissingApplicationID - - commands = self._get_all_commands(guild=guild) - - translator = self.translator - if translator: - payload = [await command.get_translated_payload(translator) for command in commands] - else: - payload = [command.to_dict() for command in commands] - - try: - if guild is None: - data = await self._http.bulk_upsert_global_commands(self.client.application_id, payload=payload) - else: - data = await self._http.bulk_upsert_guild_commands(self.client.application_id, guild.id, payload=payload) - except HTTPException as e: - if e.status == 400: - raise CommandSyncFailure(e, commands) from None - raise - - return [AppCommand(data=d, state=self._state) for d in data] - - async def _dispatch_error(self, interaction: Interaction, error: AppCommandError, /) -> None: - command = interaction.command - interaction.command_failed = True - try: - if isinstance(command, Command): - await command._invoke_error_handlers(interaction, error) - finally: - await self.on_error(interaction, error) - - def _from_interaction(self, interaction: Interaction) -> None: - async def wrapper(): - try: - await self._call(interaction) - except AppCommandError as e: - await self._dispatch_error(interaction, e) - - self.client.loop.create_task(wrapper(), name='CommandTree-invoker') - - def _get_context_menu(self, data: ApplicationCommandInteractionData) -> Optional[ContextMenu]: - name = data['name'] - guild_id = _get_as_snowflake(data, 'guild_id') - t = data.get('type', 1) - cmd = self._context_menus.get((name, guild_id, t)) - if cmd is None and self.fallback_to_global: - return self._context_menus.get((name, None, t)) - return cmd - - def _get_app_command_options( - self, data: ApplicationCommandInteractionData - ) -> Tuple[Command[Any, ..., Any], List[ApplicationCommandInteractionDataOption]]: - parents: List[str] = [] - name = data['name'] - - command_guild_id = _get_as_snowflake(data, 'guild_id') - if command_guild_id: - try: - guild_commands = self._guild_commands[command_guild_id] - except KeyError: - command = None if not self.fallback_to_global else self._global_commands.get(name) - else: - command = guild_commands.get(name) - if command is None and self.fallback_to_global: - command = self._global_commands.get(name) - else: - command = self._global_commands.get(name) - - # If it's not found at this point then it's not gonna be found at any point - if command is None: - raise CommandNotFound(name, parents) - - # This could be done recursively but it'd be a bother due to the state needed - # to be tracked above like the parents, the actual command type, and the - # resulting options we care about - searching = True - options: List[ApplicationCommandInteractionDataOption] = data.get('options', []) - while searching: - for option in options: - # Find subcommands - if option.get('type', 0) in (1, 2): - parents.append(name) - name = option['name'] - command = command._get_internal_command(name) - if command is None: - raise CommandNotFound(name, parents) - options = option.get('options', []) - break - else: - searching = False - break - else: - break - - if isinstance(command, Group): - # Right now, groups can't be invoked. This is a Discord limitation in how they - # do slash commands. So if we're here and we have a Group rather than a Command instance - # then something in the code is out of date from the data that Discord has. - raise CommandSignatureMismatch(command) - - return (command, options) - - async def _call_context_menu(self, interaction: Interaction, data: ApplicationCommandInteractionData, type: int) -> None: - name = data['name'] - guild_id = _get_as_snowflake(data, 'guild_id') - ctx_menu = self._context_menus.get((name, guild_id, type)) - if ctx_menu is None and self.fallback_to_global: - ctx_menu = self._context_menus.get((name, None, type)) - - # Pre-fill the cached slot to prevent re-computation - interaction._cs_command = ctx_menu - - if ctx_menu is None: - raise CommandNotFound(name, [], AppCommandType(type)) - - resolved = Namespace._get_resolved_items(interaction, data.get('resolved', {})) - - # This is annotated as str | int but realistically this will always be str - target_id: Optional[Union[str, int]] = data.get('target_id') - # Right now, the only types are message and user - # Therefore, there's no conflict with snowflakes - - # This will always work at runtime - key = ResolveKey.any_with(target_id) # type: ignore - value = resolved.get(key) - if ctx_menu.type.value != type: - raise CommandSignatureMismatch(ctx_menu) - - if value is None: - raise AppCommandError('This should not happen if Discord sent well-formed data.') - - # I assume I don't have to type check here. - try: - await ctx_menu._invoke(interaction, value) - except AppCommandError as e: - if ctx_menu.on_error is not None: - await ctx_menu.on_error(interaction, e) - await self.on_error(interaction, e) - else: - self.client.dispatch('app_command_completion', interaction, ctx_menu) - - async def interaction_check(self, interaction: Interaction, /) -> bool: - """|coro| - - A global check to determine if an :class:`~discord.Interaction` should - be processed by the tree. - - The default implementation returns True (all interactions are processed), - but can be overridden if custom behaviour is desired. - """ - return True - - async def _call(self, interaction: Interaction) -> None: - if not await self.interaction_check(interaction): - interaction.command_failed = True - return - - data: ApplicationCommandInteractionData = interaction.data # type: ignore - type = data.get('type', 1) - if type != 1: - # Context menu command... - await self._call_context_menu(interaction, data, type) - return - - command, options = self._get_app_command_options(data) - - # Pre-fill the cached slot to prevent re-computation - interaction._cs_command = command - - # At this point options refers to the arguments of the command - # and command refers to the class type we care about - namespace = Namespace(interaction, data.get('resolved', {}), options) - - # Same pre-fill as above - interaction._cs_namespace = namespace - - # Auto complete handles the namespace differently... so at this point this is where we decide where that is. - if interaction.type is InteractionType.autocomplete: - focused = next((opt['name'] for opt in options if opt.get('focused')), None) - if focused is None: - raise AppCommandError('This should not happen, but there is no focused element. This is a Discord bug.') - await command._invoke_autocomplete(interaction, focused, namespace) - return - - try: - await command._invoke_with_namespace(interaction, namespace) - except AppCommandError as e: - interaction.command_failed = True - await command._invoke_error_handlers(interaction, e) - await self.on_error(interaction, e) - else: - if not interaction.command_failed: - self.client.dispatch('app_command_completion', interaction, command) diff --git a/.venv/Lib/site-packages/discord/appinfo.py b/.venv/Lib/site-packages/discord/appinfo.py deleted file mode 100644 index 98c2cd3..0000000 --- a/.venv/Lib/site-packages/discord/appinfo.py +++ /dev/null @@ -1,315 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -from typing import List, TYPE_CHECKING, Optional - -from . import utils -from .asset import Asset -from .flags import ApplicationFlags -from .permissions import Permissions - -if TYPE_CHECKING: - from .guild import Guild - from .types.appinfo import ( - AppInfo as AppInfoPayload, - PartialAppInfo as PartialAppInfoPayload, - Team as TeamPayload, - InstallParams as InstallParamsPayload, - ) - from .user import User - from .state import ConnectionState - -__all__ = ( - 'AppInfo', - 'PartialAppInfo', - 'AppInstallParams', -) - - -class AppInfo: - """Represents the application info for the bot provided by Discord. - - - Attributes - ------------- - id: :class:`int` - The application ID. - name: :class:`str` - The application name. - owner: :class:`User` - The application owner. - team: Optional[:class:`Team`] - The application's team. - - .. versionadded:: 1.3 - - description: :class:`str` - The application description. - bot_public: :class:`bool` - Whether the bot can be invited by anyone or if it is locked - to the application owner. - bot_require_code_grant: :class:`bool` - Whether the bot requires the completion of the full oauth2 code - grant flow to join. - rpc_origins: Optional[List[:class:`str`]] - A list of RPC origin URLs, if RPC is enabled. - - verify_key: :class:`str` - The hex encoded key for verification in interactions and the - GameSDK's :ddocs:`GetTicket `. - - .. versionadded:: 1.3 - - guild_id: Optional[:class:`int`] - If this application is a game sold on Discord, - this field will be the guild to which it has been linked to. - - .. versionadded:: 1.3 - - primary_sku_id: Optional[:class:`int`] - If this application is a game sold on Discord, - this field will be the id of the "Game SKU" that is created, - if it exists. - - .. versionadded:: 1.3 - - slug: Optional[:class:`str`] - If this application is a game sold on Discord, - this field will be the URL slug that links to the store page. - - .. versionadded:: 1.3 - - terms_of_service_url: Optional[:class:`str`] - The application's terms of service URL, if set. - - .. versionadded:: 2.0 - - privacy_policy_url: Optional[:class:`str`] - The application's privacy policy URL, if set. - - .. versionadded:: 2.0 - - tags: List[:class:`str`] - The list of tags describing the functionality of the application. - - .. versionadded:: 2.0 - - custom_install_url: List[:class:`str`] - The custom authorization URL for the application, if enabled. - - .. versionadded:: 2.0 - - install_params: Optional[:class:`AppInstallParams`] - The settings for custom authorization URL of application, if enabled. - - .. versionadded:: 2.0 - """ - - __slots__ = ( - '_state', - 'description', - 'id', - 'name', - 'rpc_origins', - 'bot_public', - 'bot_require_code_grant', - 'owner', - '_icon', - 'verify_key', - 'team', - 'guild_id', - 'primary_sku_id', - 'slug', - '_cover_image', - '_flags', - 'terms_of_service_url', - 'privacy_policy_url', - 'tags', - 'custom_install_url', - 'install_params', - ) - - def __init__(self, state: ConnectionState, data: AppInfoPayload): - from .team import Team - - self._state: ConnectionState = state - self.id: int = int(data['id']) - self.name: str = data['name'] - self.description: str = data['description'] - self._icon: Optional[str] = data['icon'] - self.rpc_origins: List[str] = data['rpc_origins'] - self.bot_public: bool = data['bot_public'] - self.bot_require_code_grant: bool = data['bot_require_code_grant'] - self.owner: User = state.create_user(data['owner']) - - team: Optional[TeamPayload] = data.get('team') - self.team: Optional[Team] = Team(state, team) if team else None - - self.verify_key: str = data['verify_key'] - - self.guild_id: Optional[int] = utils._get_as_snowflake(data, 'guild_id') - - self.primary_sku_id: Optional[int] = utils._get_as_snowflake(data, 'primary_sku_id') - self.slug: Optional[str] = data.get('slug') - self._flags: int = data.get('flags', 0) - self._cover_image: Optional[str] = data.get('cover_image') - self.terms_of_service_url: Optional[str] = data.get('terms_of_service_url') - self.privacy_policy_url: Optional[str] = data.get('privacy_policy_url') - self.tags: List[str] = data.get('tags', []) - self.custom_install_url: Optional[str] = data.get('custom_install_url') - - params = data.get('install_params') - self.install_params: Optional[AppInstallParams] = AppInstallParams(params) if params else None - - def __repr__(self) -> str: - return ( - f'<{self.__class__.__name__} id={self.id} name={self.name!r} ' - f'description={self.description!r} public={self.bot_public} ' - f'owner={self.owner!r}>' - ) - - @property - def icon(self) -> Optional[Asset]: - """Optional[:class:`.Asset`]: Retrieves the application's icon asset, if any.""" - if self._icon is None: - return None - return Asset._from_icon(self._state, self.id, self._icon, path='app') - - @property - def cover_image(self) -> Optional[Asset]: - """Optional[:class:`.Asset`]: Retrieves the cover image on a store embed, if any. - - This is only available if the application is a game sold on Discord. - """ - if self._cover_image is None: - return None - return Asset._from_cover_image(self._state, self.id, self._cover_image) - - @property - def guild(self) -> Optional[Guild]: - """Optional[:class:`Guild`]: If this application is a game sold on Discord, - this field will be the guild to which it has been linked - - .. versionadded:: 1.3 - """ - return self._state._get_guild(self.guild_id) - - @property - def flags(self) -> ApplicationFlags: - """:class:`ApplicationFlags`: The application's flags. - - .. versionadded:: 2.0 - """ - return ApplicationFlags._from_value(self._flags) - - -class PartialAppInfo: - """Represents a partial AppInfo given by :func:`~discord.abc.GuildChannel.create_invite` - - .. versionadded:: 2.0 - - Attributes - ------------- - id: :class:`int` - The application ID. - name: :class:`str` - The application name. - description: :class:`str` - The application description. - rpc_origins: Optional[List[:class:`str`]] - A list of RPC origin URLs, if RPC is enabled. - verify_key: :class:`str` - The hex encoded key for verification in interactions and the - GameSDK's :ddocs:`GetTicket `. - terms_of_service_url: Optional[:class:`str`] - The application's terms of service URL, if set. - privacy_policy_url: Optional[:class:`str`] - The application's privacy policy URL, if set. - """ - - __slots__ = ( - '_state', - 'id', - 'name', - 'description', - 'rpc_origins', - 'verify_key', - 'terms_of_service_url', - 'privacy_policy_url', - '_icon', - '_flags', - ) - - def __init__(self, *, state: ConnectionState, data: PartialAppInfoPayload): - self._state: ConnectionState = state - self.id: int = int(data['id']) - self.name: str = data['name'] - self._icon: Optional[str] = data.get('icon') - self._flags: int = data.get('flags', 0) - self.description: str = data['description'] - self.rpc_origins: Optional[List[str]] = data.get('rpc_origins') - self.verify_key: str = data['verify_key'] - self.terms_of_service_url: Optional[str] = data.get('terms_of_service_url') - self.privacy_policy_url: Optional[str] = data.get('privacy_policy_url') - - def __repr__(self) -> str: - return f'<{self.__class__.__name__} id={self.id} name={self.name!r} description={self.description!r}>' - - @property - def icon(self) -> Optional[Asset]: - """Optional[:class:`.Asset`]: Retrieves the application's icon asset, if any.""" - if self._icon is None: - return None - return Asset._from_icon(self._state, self.id, self._icon, path='app') - - @property - def flags(self) -> ApplicationFlags: - """:class:`ApplicationFlags`: The application's flags. - - .. versionadded:: 2.0 - """ - return ApplicationFlags._from_value(self._flags) - - -class AppInstallParams: - """Represents the settings for custom authorization URL of an application. - - .. versionadded:: 2.0 - - Attributes - ---------- - scopes: List[:class:`str`] - The list of :ddocs:`OAuth2 scopes ` - to add the application to a guild with. - permissions: :class:`Permissions` - The permissions to give to application in the guild. - """ - - __slots__ = ('scopes', 'permissions') - - def __init__(self, data: InstallParamsPayload) -> None: - self.scopes: List[str] = data.get('scopes', []) - self.permissions: Permissions = Permissions(int(data['permissions'])) diff --git a/.venv/Lib/site-packages/discord/asset.py b/.venv/Lib/site-packages/discord/asset.py deleted file mode 100644 index d88ebb9..0000000 --- a/.venv/Lib/site-packages/discord/asset.py +++ /dev/null @@ -1,516 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -import io -import os -from typing import Any, Literal, Optional, TYPE_CHECKING, Tuple, Union -from .errors import DiscordException -from . import utils -from .file import File - -import yarl - -# fmt: off -__all__ = ( - 'Asset', -) -# fmt: on - -if TYPE_CHECKING: - from typing_extensions import Self - - from .state import ConnectionState - from .webhook.async_ import _WebhookState - - _State = Union[ConnectionState, _WebhookState] - - ValidStaticFormatTypes = Literal['webp', 'jpeg', 'jpg', 'png'] - ValidAssetFormatTypes = Literal['webp', 'jpeg', 'jpg', 'png', 'gif'] - -VALID_STATIC_FORMATS = frozenset({"jpeg", "jpg", "webp", "png"}) -VALID_ASSET_FORMATS = VALID_STATIC_FORMATS | {"gif"} - - -MISSING = utils.MISSING - - -class AssetMixin: - __slots__ = () - url: str - _state: Optional[Any] - - async def read(self) -> bytes: - """|coro| - - Retrieves the content of this asset as a :class:`bytes` object. - - Raises - ------ - DiscordException - There was no internal connection state. - HTTPException - Downloading the asset failed. - NotFound - The asset was deleted. - - Returns - ------- - :class:`bytes` - The content of the asset. - """ - if self._state is None: - raise DiscordException('Invalid state (no ConnectionState provided)') - - return await self._state.http.get_from_cdn(self.url) - - async def save(self, fp: Union[str, bytes, os.PathLike[Any], io.BufferedIOBase], *, seek_begin: bool = True) -> int: - """|coro| - - Saves this asset into a file-like object. - - Parameters - ---------- - fp: Union[:class:`io.BufferedIOBase`, :class:`os.PathLike`] - The file-like object to save this asset to or the filename - to use. If a filename is passed then a file is created with that - filename and used instead. - seek_begin: :class:`bool` - Whether to seek to the beginning of the file after saving is - successfully done. - - Raises - ------ - DiscordException - There was no internal connection state. - HTTPException - Downloading the asset failed. - NotFound - The asset was deleted. - - Returns - -------- - :class:`int` - The number of bytes written. - """ - - data = await self.read() - if isinstance(fp, io.BufferedIOBase): - written = fp.write(data) - if seek_begin: - fp.seek(0) - return written - else: - with open(fp, 'wb') as f: - return f.write(data) - - async def to_file( - self, - *, - filename: Optional[str] = MISSING, - description: Optional[str] = None, - spoiler: bool = False, - ) -> File: - """|coro| - - Converts the asset into a :class:`File` suitable for sending via - :meth:`abc.Messageable.send`. - - .. versionadded:: 2.0 - - Parameters - ----------- - filename: Optional[:class:`str`] - The filename of the file. If not provided, then the filename from - the asset's URL is used. - description: Optional[:class:`str`] - The description for the file. - spoiler: :class:`bool` - Whether the file is a spoiler. - - Raises - ------ - DiscordException - The asset does not have an associated state. - ValueError - The asset is a unicode emoji. - TypeError - The asset is a sticker with lottie type. - HTTPException - Downloading the asset failed. - NotFound - The asset was deleted. - - Returns - ------- - :class:`File` - The asset as a file suitable for sending. - """ - - data = await self.read() - file_filename = filename if filename is not MISSING else yarl.URL(self.url).name - return File(io.BytesIO(data), filename=file_filename, description=description, spoiler=spoiler) - - -class Asset(AssetMixin): - """Represents a CDN asset on Discord. - - .. container:: operations - - .. describe:: str(x) - - Returns the URL of the CDN asset. - - .. describe:: len(x) - - Returns the length of the CDN asset's URL. - - .. describe:: x == y - - Checks if the asset is equal to another asset. - - .. describe:: x != y - - Checks if the asset is not equal to another asset. - - .. describe:: hash(x) - - Returns the hash of the asset. - """ - - __slots__: Tuple[str, ...] = ( - '_state', - '_url', - '_animated', - '_key', - ) - - BASE = 'https://cdn.discordapp.com' - - def __init__(self, state: _State, *, url: str, key: str, animated: bool = False) -> None: - self._state: _State = state - self._url: str = url - self._animated: bool = animated - self._key: str = key - - @classmethod - def _from_default_avatar(cls, state: _State, index: int) -> Self: - return cls( - state, - url=f'{cls.BASE}/embed/avatars/{index}.png', - key=str(index), - animated=False, - ) - - @classmethod - def _from_avatar(cls, state: _State, user_id: int, avatar: str) -> Self: - animated = avatar.startswith('a_') - format = 'gif' if animated else 'png' - return cls( - state, - url=f'{cls.BASE}/avatars/{user_id}/{avatar}.{format}?size=1024', - key=avatar, - animated=animated, - ) - - @classmethod - def _from_guild_avatar(cls, state: _State, guild_id: int, member_id: int, avatar: str) -> Self: - animated = avatar.startswith('a_') - format = 'gif' if animated else 'png' - return cls( - state, - url=f"{cls.BASE}/guilds/{guild_id}/users/{member_id}/avatars/{avatar}.{format}?size=1024", - key=avatar, - animated=animated, - ) - - @classmethod - def _from_icon(cls, state: _State, object_id: int, icon_hash: str, path: str) -> Self: - return cls( - state, - url=f'{cls.BASE}/{path}-icons/{object_id}/{icon_hash}.png?size=1024', - key=icon_hash, - animated=False, - ) - - @classmethod - def _from_app_icon( - cls, state: _State, object_id: int, icon_hash: str, asset_type: Literal['icon', 'cover_image'] - ) -> Self: - return cls( - state, - url=f'{cls.BASE}/app-icons/{object_id}/{asset_type}.png?size=1024', - key=icon_hash, - animated=False, - ) - - @classmethod - def _from_cover_image(cls, state: _State, object_id: int, cover_image_hash: str) -> Self: - return cls( - state, - url=f'{cls.BASE}/app-assets/{object_id}/store/{cover_image_hash}.png?size=1024', - key=cover_image_hash, - animated=False, - ) - - @classmethod - def _from_scheduled_event_cover_image(cls, state: _State, scheduled_event_id: int, cover_image_hash: str) -> Self: - return cls( - state, - url=f'{cls.BASE}/guild-events/{scheduled_event_id}/{cover_image_hash}.png?size=1024', - key=cover_image_hash, - animated=False, - ) - - @classmethod - def _from_guild_image(cls, state: _State, guild_id: int, image: str, path: str) -> Self: - animated = image.startswith('a_') - format = 'gif' if animated else 'png' - return cls( - state, - url=f'{cls.BASE}/{path}/{guild_id}/{image}.{format}?size=1024', - key=image, - animated=animated, - ) - - @classmethod - def _from_guild_icon(cls, state: _State, guild_id: int, icon_hash: str) -> Self: - animated = icon_hash.startswith('a_') - format = 'gif' if animated else 'png' - return cls( - state, - url=f'{cls.BASE}/icons/{guild_id}/{icon_hash}.{format}?size=1024', - key=icon_hash, - animated=animated, - ) - - @classmethod - def _from_sticker_banner(cls, state: _State, banner: int) -> Self: - return cls( - state, - url=f'{cls.BASE}/app-assets/710982414301790216/store/{banner}.png', - key=str(banner), - animated=False, - ) - - @classmethod - def _from_user_banner(cls, state: _State, user_id: int, banner_hash: str) -> Self: - animated = banner_hash.startswith('a_') - format = 'gif' if animated else 'png' - return cls( - state, - url=f'{cls.BASE}/banners/{user_id}/{banner_hash}.{format}?size=512', - key=banner_hash, - animated=animated, - ) - - def __str__(self) -> str: - return self._url - - def __len__(self) -> int: - return len(self._url) - - def __repr__(self) -> str: - shorten = self._url.replace(self.BASE, '') - return f'' - - def __eq__(self, other: object) -> bool: - return isinstance(other, Asset) and self._url == other._url - - def __hash__(self) -> int: - return hash(self._url) - - @property - def url(self) -> str: - """:class:`str`: Returns the underlying URL of the asset.""" - return self._url - - @property - def key(self) -> str: - """:class:`str`: Returns the identifying key of the asset.""" - return self._key - - def is_animated(self) -> bool: - """:class:`bool`: Returns whether the asset is animated.""" - return self._animated - - def replace( - self, - *, - size: int = MISSING, - format: ValidAssetFormatTypes = MISSING, - static_format: ValidStaticFormatTypes = MISSING, - ) -> Self: - """Returns a new asset with the passed components replaced. - - - .. versionchanged:: 2.0 - ``static_format`` is now preferred over ``format`` - if both are present and the asset is not animated. - - .. versionchanged:: 2.0 - This function will now raise :exc:`ValueError` instead of - ``InvalidArgument``. - - Parameters - ----------- - size: :class:`int` - The new size of the asset. - format: :class:`str` - The new format to change it to. Must be either - 'webp', 'jpeg', 'jpg', 'png', or 'gif' if it's animated. - static_format: :class:`str` - The new format to change it to if the asset isn't animated. - Must be either 'webp', 'jpeg', 'jpg', or 'png'. - - Raises - ------- - ValueError - An invalid size or format was passed. - - Returns - -------- - :class:`Asset` - The newly updated asset. - """ - url = yarl.URL(self._url) - path, _ = os.path.splitext(url.path) - - if format is not MISSING: - if self._animated: - if format not in VALID_ASSET_FORMATS: - raise ValueError(f'format must be one of {VALID_ASSET_FORMATS}') - else: - if static_format is MISSING and format not in VALID_STATIC_FORMATS: - raise ValueError(f'format must be one of {VALID_STATIC_FORMATS}') - url = url.with_path(f'{path}.{format}') - - if static_format is not MISSING and not self._animated: - if static_format not in VALID_STATIC_FORMATS: - raise ValueError(f'static_format must be one of {VALID_STATIC_FORMATS}') - url = url.with_path(f'{path}.{static_format}') - - if size is not MISSING: - if not utils.valid_icon_size(size): - raise ValueError('size must be a power of 2 between 16 and 4096') - url = url.with_query(size=size) - else: - url = url.with_query(url.raw_query_string) - - url = str(url) - return Asset(state=self._state, url=url, key=self._key, animated=self._animated) - - def with_size(self, size: int, /) -> Self: - """Returns a new asset with the specified size. - - .. versionchanged:: 2.0 - This function will now raise :exc:`ValueError` instead of - ``InvalidArgument``. - - Parameters - ------------ - size: :class:`int` - The new size of the asset. - - Raises - ------- - ValueError - The asset had an invalid size. - - Returns - -------- - :class:`Asset` - The new updated asset. - """ - if not utils.valid_icon_size(size): - raise ValueError('size must be a power of 2 between 16 and 4096') - - url = str(yarl.URL(self._url).with_query(size=size)) - return Asset(state=self._state, url=url, key=self._key, animated=self._animated) - - def with_format(self, format: ValidAssetFormatTypes, /) -> Self: - """Returns a new asset with the specified format. - - .. versionchanged:: 2.0 - This function will now raise :exc:`ValueError` instead of - ``InvalidArgument``. - - Parameters - ------------ - format: :class:`str` - The new format of the asset. - - Raises - ------- - ValueError - The asset had an invalid format. - - Returns - -------- - :class:`Asset` - The new updated asset. - """ - - if self._animated: - if format not in VALID_ASSET_FORMATS: - raise ValueError(f'format must be one of {VALID_ASSET_FORMATS}') - else: - if format not in VALID_STATIC_FORMATS: - raise ValueError(f'format must be one of {VALID_STATIC_FORMATS}') - - url = yarl.URL(self._url) - path, _ = os.path.splitext(url.path) - url = str(url.with_path(f'{path}.{format}').with_query(url.raw_query_string)) - return Asset(state=self._state, url=url, key=self._key, animated=self._animated) - - def with_static_format(self, format: ValidStaticFormatTypes, /) -> Self: - """Returns a new asset with the specified static format. - - This only changes the format if the underlying asset is - not animated. Otherwise, the asset is not changed. - - .. versionchanged:: 2.0 - This function will now raise :exc:`ValueError` instead of - ``InvalidArgument``. - - Parameters - ------------ - format: :class:`str` - The new static format of the asset. - - Raises - ------- - ValueError - The asset had an invalid format. - - Returns - -------- - :class:`Asset` - The new updated asset. - """ - - if self._animated: - return self - return self.with_format(format) diff --git a/.venv/Lib/site-packages/discord/audit_logs.py b/.venv/Lib/site-packages/discord/audit_logs.py deleted file mode 100644 index 4d51de6..0000000 --- a/.venv/Lib/site-packages/discord/audit_logs.py +++ /dev/null @@ -1,774 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Callable, ClassVar, Dict, Generator, List, Optional, Tuple, Type, TypeVar, Union - -from . import enums, flags, utils -from .asset import Asset -from .colour import Colour -from .invite import Invite -from .mixins import Hashable -from .object import Object -from .permissions import PermissionOverwrite, Permissions -from .automod import AutoModTrigger, AutoModRuleAction, AutoModPresets, AutoModRule -from .role import Role -from .emoji import Emoji -from .member import Member -from .scheduled_event import ScheduledEvent -from .stage_instance import StageInstance -from .sticker import GuildSticker -from .threads import Thread -from .integrations import PartialIntegration -from .channel import StageChannel - -__all__ = ( - 'AuditLogDiff', - 'AuditLogChanges', - 'AuditLogEntry', -) - - -if TYPE_CHECKING: - import datetime - - from . import abc - from .guild import Guild - from .state import ConnectionState - from .types.audit_log import ( - AuditLogChange as AuditLogChangePayload, - AuditLogEntry as AuditLogEntryPayload, - ) - from .types.channel import ( - PermissionOverwrite as PermissionOverwritePayload, - ) - from .types.invite import Invite as InvitePayload - from .types.role import Role as RolePayload - from .types.snowflake import Snowflake - from .types.command import ApplicationCommandPermissions - from .types.automod import AutoModerationTriggerMetadata, AutoModerationAction - from .user import User - from .app_commands import AppCommand - - TargetType = Union[ - Guild, - abc.GuildChannel, - Member, - User, - Role, - Invite, - Emoji, - StageInstance, - GuildSticker, - Thread, - Object, - PartialIntegration, - AutoModRule, - None, - ] - - -def _transform_timestamp(entry: AuditLogEntry, data: Optional[str]) -> Optional[datetime.datetime]: - return utils.parse_time(data) - - -def _transform_color(entry: AuditLogEntry, data: int) -> Colour: - return Colour(data) - - -def _transform_snowflake(entry: AuditLogEntry, data: Snowflake) -> int: - return int(data) - - -def _transform_channel(entry: AuditLogEntry, data: Optional[Snowflake]) -> Optional[Union[abc.GuildChannel, Object]]: - if data is None: - return None - return entry.guild.get_channel(int(data)) or Object(id=data) - - -def _transform_channels_or_threads( - entry: AuditLogEntry, data: List[Snowflake] -) -> List[Union[abc.GuildChannel, Thread, Object]]: - return [entry.guild.get_channel_or_thread(int(data)) or Object(id=data) for data in data] - - -def _transform_member_id(entry: AuditLogEntry, data: Optional[Snowflake]) -> Union[Member, User, None]: - if data is None: - return None - return entry._get_member(int(data)) - - -def _transform_guild_id(entry: AuditLogEntry, data: Optional[Snowflake]) -> Optional[Guild]: - if data is None: - return None - return entry._state._get_guild(int(data)) - - -def _transform_roles(entry: AuditLogEntry, data: List[Snowflake]) -> List[Union[Role, Object]]: - return [entry.guild.get_role(int(role_id)) or Object(role_id, type=Role) for role_id in data] - - -def _transform_overwrites( - entry: AuditLogEntry, data: List[PermissionOverwritePayload] -) -> List[Tuple[Object, PermissionOverwrite]]: - overwrites = [] - for elem in data: - allow = Permissions(int(elem['allow'])) - deny = Permissions(int(elem['deny'])) - ow = PermissionOverwrite.from_pair(allow, deny) - - ow_type = elem['type'] - ow_id = int(elem['id']) - target = None - if ow_type == '0': - target = entry.guild.get_role(ow_id) - elif ow_type == '1': - target = entry._get_member(ow_id) - - if target is None: - target = Object(id=ow_id, type=Role if ow_type == '0' else Member) - - overwrites.append((target, ow)) - - return overwrites - - -def _transform_icon(entry: AuditLogEntry, data: Optional[str]) -> Optional[Asset]: - if data is None: - return None - if entry.action is enums.AuditLogAction.guild_update: - return Asset._from_guild_icon(entry._state, entry.guild.id, data) - else: - return Asset._from_icon(entry._state, entry._target_id, data, path='role') # type: ignore # target_id won't be None in this case - - -def _transform_avatar(entry: AuditLogEntry, data: Optional[str]) -> Optional[Asset]: - if data is None: - return None - return Asset._from_avatar(entry._state, entry._target_id, data) # type: ignore # target_id won't be None in this case - - -def _transform_cover_image(entry: AuditLogEntry, data: Optional[str]) -> Optional[Asset]: - if data is None: - return None - return Asset._from_scheduled_event_cover_image(entry._state, entry._target_id, data) # type: ignore # target_id won't be None in this case - - -def _guild_hash_transformer(path: str) -> Callable[[AuditLogEntry, Optional[str]], Optional[Asset]]: - def _transform(entry: AuditLogEntry, data: Optional[str]) -> Optional[Asset]: - if data is None: - return None - return Asset._from_guild_image(entry._state, entry.guild.id, data, path=path) - - return _transform - - -def _transform_automod_trigger_metadata( - entry: AuditLogEntry, data: AutoModerationTriggerMetadata -) -> Optional[AutoModTrigger]: - - if isinstance(entry.target, AutoModRule): - # Trigger type cannot be changed, so type should be the same before and after updates. - # Avoids checking which keys are in data to guess trigger type - # or returning None if data is empty. - try: - return AutoModTrigger.from_data(type=entry.target.trigger.type.value, data=data) - except Exception: - pass - - # If cannot get trigger type from the rule and data is empty, then cannot determine trigger type - if not data: - return None - - # Try to infer trigger type from available keys in data - if 'presets' in data: - return AutoModTrigger( - type=enums.AutoModRuleTriggerType.keyword_preset, - presets=AutoModPresets._from_value(data['presets']), # type: ignore - allow_list=data.get('allow_list'), - ) - elif 'keyword_filter' in data: - return AutoModTrigger(type=enums.AutoModRuleTriggerType.keyword, keyword_filter=data['keyword_filter']) # type: ignore - elif 'mention_total_limit' in data: - return AutoModTrigger(type=enums.AutoModRuleTriggerType.mention_spam, mention_limit=data['mention_total_limit']) # type: ignore - - -def _transform_automod_actions(entry: AuditLogEntry, data: List[AutoModerationAction]) -> List[AutoModRuleAction]: - return [AutoModRuleAction.from_data(action) for action in data] - - -E = TypeVar('E', bound=enums.Enum) - - -def _enum_transformer(enum: Type[E]) -> Callable[[AuditLogEntry, int], E]: - def _transform(entry: AuditLogEntry, data: int) -> E: - return enums.try_enum(enum, data) - - return _transform - - -F = TypeVar('F', bound=flags.BaseFlags) - - -def _flag_transformer(cls: Type[F]) -> Callable[[AuditLogEntry, Union[int, str]], F]: - def _transform(entry: AuditLogEntry, data: Union[int, str]) -> F: - return cls._from_value(int(data)) - - return _transform - - -def _transform_type(entry: AuditLogEntry, data: int) -> Union[enums.ChannelType, enums.StickerType]: - if entry.action.name.startswith('sticker_'): - return enums.try_enum(enums.StickerType, data) - else: - return enums.try_enum(enums.ChannelType, data) - - -class AuditLogDiff: - def __len__(self) -> int: - return len(self.__dict__) - - def __iter__(self) -> Generator[Tuple[str, Any], None, None]: - yield from self.__dict__.items() - - def __repr__(self) -> str: - values = ' '.join('%s=%r' % item for item in self.__dict__.items()) - return f'' - - if TYPE_CHECKING: - - def __getattr__(self, item: str) -> Any: - ... - - def __setattr__(self, key: str, value: Any) -> Any: - ... - - -Transformer = Callable[["AuditLogEntry", Any], Any] - - -class AuditLogChanges: - # fmt: off - TRANSFORMERS: ClassVar[Dict[str, Tuple[Optional[str], Optional[Transformer]]]] = { - 'verification_level': (None, _enum_transformer(enums.VerificationLevel)), - 'explicit_content_filter': (None, _enum_transformer(enums.ContentFilter)), - 'allow': (None, _flag_transformer(Permissions)), - 'deny': (None, _flag_transformer(Permissions)), - 'permissions': (None, _flag_transformer(Permissions)), - 'id': (None, _transform_snowflake), - 'color': ('colour', _transform_color), - 'owner_id': ('owner', _transform_member_id), - 'inviter_id': ('inviter', _transform_member_id), - 'channel_id': ('channel', _transform_channel), - 'afk_channel_id': ('afk_channel', _transform_channel), - 'system_channel_id': ('system_channel', _transform_channel), - 'system_channel_flags': (None, _flag_transformer(flags.SystemChannelFlags)), - 'widget_channel_id': ('widget_channel', _transform_channel), - 'rules_channel_id': ('rules_channel', _transform_channel), - 'public_updates_channel_id': ('public_updates_channel', _transform_channel), - 'permission_overwrites': ('overwrites', _transform_overwrites), - 'splash_hash': ('splash', _guild_hash_transformer('splashes')), - 'banner_hash': ('banner', _guild_hash_transformer('banners')), - 'discovery_splash_hash': ('discovery_splash', _guild_hash_transformer('discovery-splashes')), - 'icon_hash': ('icon', _transform_icon), - 'avatar_hash': ('avatar', _transform_avatar), - 'rate_limit_per_user': ('slowmode_delay', None), - 'guild_id': ('guild', _transform_guild_id), - 'tags': ('emoji', None), - 'default_message_notifications': ('default_notifications', _enum_transformer(enums.NotificationLevel)), - 'video_quality_mode': (None, _enum_transformer(enums.VideoQualityMode)), - 'privacy_level': (None, _enum_transformer(enums.PrivacyLevel)), - 'format_type': (None, _enum_transformer(enums.StickerFormatType)), - 'type': (None, _transform_type), - 'communication_disabled_until': ('timed_out_until', _transform_timestamp), - 'expire_behavior': (None, _enum_transformer(enums.ExpireBehaviour)), - 'mfa_level': (None, _enum_transformer(enums.MFALevel)), - 'status': (None, _enum_transformer(enums.EventStatus)), - 'entity_type': (None, _enum_transformer(enums.EntityType)), - 'preferred_locale': (None, _enum_transformer(enums.Locale)), - 'image_hash': ('cover_image', _transform_cover_image), - 'trigger_type': (None, _enum_transformer(enums.AutoModRuleTriggerType)), - 'event_type': (None, _enum_transformer(enums.AutoModRuleEventType)), - 'trigger_metadata': ('trigger', _transform_automod_trigger_metadata), - 'actions': (None, _transform_automod_actions), - 'exempt_channels': (None, _transform_channels_or_threads), - 'exempt_roles': (None, _transform_roles), - } - # fmt: on - - def __init__(self, entry: AuditLogEntry, data: List[AuditLogChangePayload]): - self.before: AuditLogDiff = AuditLogDiff() - self.after: AuditLogDiff = AuditLogDiff() - # special case entire process since each - # element in data is a different target - # key is the target id - if entry.action is enums.AuditLogAction.app_command_permission_update: - self.before.app_command_permissions = [] - self.after.app_command_permissions = [] - - for elem in data: - self._handle_app_command_permissions( - self.before, - entry, - elem.get('old_value'), # type: ignore # value will be an ApplicationCommandPermissions if present - ) - - self._handle_app_command_permissions( - self.after, - entry, - elem.get('new_value'), # type: ignore # value will be an ApplicationCommandPermissions if present - ) - return - - for elem in data: - attr = elem['key'] - - # special cases for role add/remove - if attr == '$add': - self._handle_role(self.before, self.after, entry, elem['new_value']) # type: ignore # new_value is a list of roles in this case - continue - elif attr == '$remove': - self._handle_role(self.after, self.before, entry, elem['new_value']) # type: ignore # new_value is a list of roles in this case - continue - - try: - key, transformer = self.TRANSFORMERS[attr] - except (ValueError, KeyError): - transformer = None - else: - if key: - attr = key - - transformer: Optional[Transformer] - - try: - before = elem['old_value'] - except KeyError: - before = None - else: - if transformer: - before = transformer(entry, before) - - setattr(self.before, attr, before) - - try: - after = elem['new_value'] - except KeyError: - after = None - else: - if transformer: - after = transformer(entry, after) - - setattr(self.after, attr, after) - - # add an alias - if hasattr(self.after, 'colour'): - self.after.color = self.after.colour - self.before.color = self.before.colour - if hasattr(self.after, 'expire_behavior'): - self.after.expire_behaviour = self.after.expire_behavior - self.before.expire_behaviour = self.before.expire_behavior - - def __repr__(self) -> str: - return f'' - - def _handle_role(self, first: AuditLogDiff, second: AuditLogDiff, entry: AuditLogEntry, elem: List[RolePayload]) -> None: - if not hasattr(first, 'roles'): - setattr(first, 'roles', []) - - data = [] - g: Guild = entry.guild - - for e in elem: - role_id = int(e['id']) - role = g.get_role(role_id) - - if role is None: - role = Object(id=role_id, type=Role) - role.name = e['name'] # type: ignore # Object doesn't usually have name - - data.append(role) - - setattr(second, 'roles', data) - - def _handle_app_command_permissions( - self, - diff: AuditLogDiff, - entry: AuditLogEntry, - data: Optional[ApplicationCommandPermissions], - ): - if data is None: - return - - # avoid circular import - from discord.app_commands import AppCommandPermissions - - state = entry._state - guild = entry.guild - diff.app_command_permissions.append(AppCommandPermissions(data=data, guild=guild, state=state)) - - -class _AuditLogProxy: - def __init__(self, **kwargs: Any) -> None: - for k, v in kwargs.items(): - setattr(self, k, v) - - -class _AuditLogProxyMemberPrune(_AuditLogProxy): - delete_member_days: int - members_removed: int - - -class _AuditLogProxyMemberMoveOrMessageDelete(_AuditLogProxy): - channel: Union[abc.GuildChannel, Thread] - count: int - - -class _AuditLogProxyMemberDisconnect(_AuditLogProxy): - count: int - - -class _AuditLogProxyPinAction(_AuditLogProxy): - channel: Union[abc.GuildChannel, Thread] - message_id: int - - -class _AuditLogProxyStageInstanceAction(_AuditLogProxy): - channel: abc.GuildChannel - - -class _AuditLogProxyMessageBulkDelete(_AuditLogProxy): - count: int - - -class _AuditLogProxyAutoModAction(_AuditLogProxy): - automod_rule_name: str - automod_rule_trigger_type: str - channel: Union[abc.GuildChannel, Thread] - - -class AuditLogEntry(Hashable): - r"""Represents an Audit Log entry. - - You retrieve these via :meth:`Guild.audit_logs`. - - .. container:: operations - - .. describe:: x == y - - Checks if two entries are equal. - - .. describe:: x != y - - Checks if two entries are not equal. - - .. describe:: hash(x) - - Returns the entry's hash. - - .. versionchanged:: 1.7 - Audit log entries are now comparable and hashable. - - Attributes - ----------- - action: :class:`AuditLogAction` - The action that was done. - user: :class:`abc.User` - The user who initiated this action. Usually a :class:`Member`\, unless gone - then it's a :class:`User`. - id: :class:`int` - The entry ID. - target: Any - The target that got changed. The exact type of this depends on - the action being done. - reason: Optional[:class:`str`] - The reason this action was done. - extra: Any - Extra information that this entry has that might be useful. - For most actions, this is ``None``. However in some cases it - contains extra information. See :class:`AuditLogAction` for - which actions have this field filled out. - """ - - def __init__( - self, - *, - users: Dict[int, User], - integrations: Dict[int, PartialIntegration], - app_commands: Dict[int, AppCommand], - automod_rules: Dict[int, AutoModRule], - data: AuditLogEntryPayload, - guild: Guild, - ): - self._state: ConnectionState = guild._state - self.guild: Guild = guild - self._users: Dict[int, User] = users - self._integrations: Dict[int, PartialIntegration] = integrations - self._app_commands: Dict[int, AppCommand] = app_commands - self._automod_rules: Dict[int, AutoModRule] = automod_rules - self._from_data(data) - - def _from_data(self, data: AuditLogEntryPayload) -> None: - self.action: enums.AuditLogAction = enums.try_enum(enums.AuditLogAction, data['action_type']) - self.id: int = int(data['id']) - - # this key is technically not usually present - self.reason: Optional[str] = data.get('reason') - extra = data.get('options') - - # fmt: off - self.extra: Union[ - _AuditLogProxyMemberPrune, - _AuditLogProxyMemberMoveOrMessageDelete, - _AuditLogProxyMemberDisconnect, - _AuditLogProxyPinAction, - _AuditLogProxyStageInstanceAction, - _AuditLogProxyMessageBulkDelete, - _AuditLogProxyAutoModAction, - Member, User, None, PartialIntegration, - Role, Object - ] = None - # fmt: on - - if isinstance(self.action, enums.AuditLogAction) and extra: - if self.action is enums.AuditLogAction.member_prune: - # member prune has two keys with useful information - self.extra = _AuditLogProxyMemberPrune( - delete_member_days=int(extra['delete_member_days']), - members_removed=int(extra['members_removed']), - ) - elif self.action is enums.AuditLogAction.member_move or self.action is enums.AuditLogAction.message_delete: - channel_id = int(extra['channel_id']) - self.extra = _AuditLogProxyMemberMoveOrMessageDelete( - count=int(extra['count']), - channel=self.guild.get_channel_or_thread(channel_id) or Object(id=channel_id), - ) - elif self.action is enums.AuditLogAction.member_disconnect: - # The member disconnect action has a dict with some information - self.extra = _AuditLogProxyMemberDisconnect(count=int(extra['count'])) - elif self.action is enums.AuditLogAction.message_bulk_delete: - # The bulk message delete action has the number of messages deleted - self.extra = _AuditLogProxyMessageBulkDelete(count=int(extra['count'])) - elif self.action.name.endswith('pin'): - # the pin actions have a dict with some information - channel_id = int(extra['channel_id']) - self.extra = _AuditLogProxyPinAction( - channel=self.guild.get_channel_or_thread(channel_id) or Object(id=channel_id), - message_id=int(extra['message_id']), - ) - elif self.action is enums.AuditLogAction.automod_block_message: - channel_id = int(extra['channel_id']) - self.extra = _AuditLogProxyAutoModAction( - automod_rule_name=extra['auto_moderation_rule_name'], - automod_rule_trigger_type=enums.try_enum( - enums.AutoModRuleTriggerType, extra['auto_moderation_rule_trigger_type'] - ), - channel=self.guild.get_channel_or_thread(channel_id) or Object(id=channel_id), - ) - - elif self.action.name.startswith('overwrite_'): - # the overwrite_ actions have a dict with some information - instance_id = int(extra['id']) - the_type = extra.get('type') - if the_type == '1': - self.extra = self._get_member(instance_id) - elif the_type == '0': - role = self.guild.get_role(instance_id) - if role is None: - role = Object(id=instance_id, type=Role) - role.name = extra.get('role_name') # type: ignore # Object doesn't usually have name - self.extra = role - elif self.action.name.startswith('stage_instance'): - channel_id = int(extra['channel_id']) - self.extra = _AuditLogProxyStageInstanceAction( - channel=self.guild.get_channel(channel_id) or Object(id=channel_id, type=StageChannel) - ) - elif self.action.name.startswith('app_command'): - app_id = int(extra['application_id']) - self.extra = self._get_integration_by_app_id(app_id) or Object(app_id, type=PartialIntegration) - - # this key is not present when the above is present, typically. - # It's a list of { new_value: a, old_value: b, key: c } - # where new_value and old_value are not guaranteed to be there depending - # on the action type, so let's just fetch it for now and only turn it - # into meaningful data when requested - self._changes = data.get('changes', []) - - user_id = utils._get_as_snowflake(data, 'user_id') - self.user: Optional[Union[User, Member]] = self._get_member(user_id) - self._target_id = utils._get_as_snowflake(data, 'target_id') - - def _get_member(self, user_id: Optional[int]) -> Union[Member, User, None]: - if user_id is None: - return None - - return self.guild.get_member(user_id) or self._users.get(user_id) - - def _get_integration(self, integration_id: Optional[int]) -> Optional[PartialIntegration]: - if integration_id is None: - return None - - return self._integrations.get(integration_id) - - def _get_integration_by_app_id(self, application_id: Optional[int]) -> Optional[PartialIntegration]: - if application_id is None: - return None - - # get PartialIntegration by application id - return utils.get(self._integrations.values(), application_id=application_id) - - def _get_app_command(self, app_command_id: Optional[int]) -> Optional[AppCommand]: - if app_command_id is None: - return None - - return self._app_commands.get(app_command_id) - - def __repr__(self) -> str: - return f'' - - @utils.cached_property - def created_at(self) -> datetime.datetime: - """:class:`datetime.datetime`: Returns the entry's creation time in UTC.""" - return utils.snowflake_time(self.id) - - @utils.cached_property - def target(self) -> TargetType: - if self.action.target_type is None: - return None - - try: - converter = getattr(self, '_convert_target_' + self.action.target_type) - except AttributeError: - if self._target_id is None: - return None - return Object(id=self._target_id) - else: - return converter(self._target_id) - - @utils.cached_property - def category(self) -> Optional[enums.AuditLogActionCategory]: - """Optional[:class:`AuditLogActionCategory`]: The category of the action, if applicable.""" - return self.action.category - - @utils.cached_property - def changes(self) -> AuditLogChanges: - """:class:`AuditLogChanges`: The list of changes this entry has.""" - obj = AuditLogChanges(self, self._changes) - del self._changes - return obj - - @utils.cached_property - def before(self) -> AuditLogDiff: - """:class:`AuditLogDiff`: The target's prior state.""" - return self.changes.before - - @utils.cached_property - def after(self) -> AuditLogDiff: - """:class:`AuditLogDiff`: The target's subsequent state.""" - return self.changes.after - - def _convert_target_guild(self, target_id: int) -> Guild: - return self.guild - - def _convert_target_channel(self, target_id: int) -> Union[abc.GuildChannel, Object]: - return self.guild.get_channel(target_id) or Object(id=target_id) - - def _convert_target_user(self, target_id: int) -> Union[Member, User, None]: - return self._get_member(target_id) - - def _convert_target_role(self, target_id: int) -> Union[Role, Object]: - return self.guild.get_role(target_id) or Object(id=target_id, type=Role) - - def _convert_target_invite(self, target_id: None) -> Invite: - # invites have target_id set to null - # so figure out which change has the full invite data - changeset = self.before if self.action is enums.AuditLogAction.invite_delete else self.after - - fake_payload: InvitePayload = { - 'max_age': changeset.max_age, - 'max_uses': changeset.max_uses, - 'code': changeset.code, - 'temporary': changeset.temporary, - 'uses': changeset.uses, - 'channel': None, # type: ignore # the channel is passed to the Invite constructor directly - } - - obj = Invite(state=self._state, data=fake_payload, guild=self.guild, channel=changeset.channel) - try: - obj.inviter = changeset.inviter - except AttributeError: - pass - return obj - - def _convert_target_emoji(self, target_id: int) -> Union[Emoji, Object]: - return self._state.get_emoji(target_id) or Object(id=target_id, type=Emoji) - - def _convert_target_message(self, target_id: int) -> Union[Member, User, None]: - return self._get_member(target_id) - - def _convert_target_stage_instance(self, target_id: int) -> Union[StageInstance, Object]: - return self.guild.get_stage_instance(target_id) or Object(id=target_id, type=StageInstance) - - def _convert_target_sticker(self, target_id: int) -> Union[GuildSticker, Object]: - return self._state.get_sticker(target_id) or Object(id=target_id, type=GuildSticker) - - def _convert_target_thread(self, target_id: int) -> Union[Thread, Object]: - return self.guild.get_thread(target_id) or Object(id=target_id, type=Thread) - - def _convert_target_guild_scheduled_event(self, target_id: int) -> Union[ScheduledEvent, Object]: - return self.guild.get_scheduled_event(target_id) or Object(id=target_id, type=ScheduledEvent) - - def _convert_target_integration(self, target_id: int) -> Union[PartialIntegration, Object]: - return self._get_integration(target_id) or Object(target_id, type=PartialIntegration) - - def _convert_target_app_command(self, target_id: int) -> Union[AppCommand, Object]: - target = self._get_app_command(target_id) - if not target: - # circular import - from .app_commands import AppCommand - - target = Object(target_id, type=AppCommand) - - return target - - def _convert_target_integration_or_app_command(self, target_id: int) -> Union[PartialIntegration, AppCommand, Object]: - target = self._get_integration_by_app_id(target_id) or self._get_app_command(target_id) - if not target: - try: - # get application id from extras - # if it matches target id, type should be integration - target_app = self.extra - # extra should be an Object or PartialIntegration - app_id = target_app.application_id if isinstance(target_app, PartialIntegration) else target_app.id # type: ignore - type = PartialIntegration if target_id == app_id else AppCommand - except AttributeError: - return Object(target_id) - else: - return Object(target_id, type=type) - - return target - - def _convert_target_auto_moderation(self, target_id: int) -> Union[AutoModRule, Object]: - return self._automod_rules.get(target_id) or Object(target_id, type=AutoModRule) diff --git a/.venv/Lib/site-packages/discord/automod.py b/.venv/Lib/site-packages/discord/automod.py deleted file mode 100644 index 5c40629..0000000 --- a/.venv/Lib/site-packages/discord/automod.py +++ /dev/null @@ -1,540 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -import datetime - -from typing import TYPE_CHECKING, Any, Dict, Optional, List, Sequence, Set, Union, Sequence - - -from .enums import AutoModRuleTriggerType, AutoModRuleActionType, AutoModRuleEventType, try_enum -from .flags import AutoModPresets -from . import utils -from .utils import MISSING, cached_slot_property - -if TYPE_CHECKING: - from typing_extensions import Self - from .abc import Snowflake, GuildChannel - from .threads import Thread - from .guild import Guild - from .member import Member - from .state import ConnectionState - from .types.automod import ( - AutoModerationRule as AutoModerationRulePayload, - AutoModerationTriggerMetadata as AutoModerationTriggerMetadataPayload, - AutoModerationAction as AutoModerationActionPayload, - AutoModerationActionExecution as AutoModerationActionExecutionPayload, - ) - from .role import Role - -__all__ = ( - 'AutoModRuleAction', - 'AutoModTrigger', - 'AutoModRule', - 'AutoModAction', -) - - -class AutoModRuleAction: - """Represents an auto moderation's rule action. - - .. versionadded:: 2.0 - - Attributes - ----------- - type: :class:`AutoModRuleActionType` - The type of action to take. - Defaults to :attr:`~AutoModRuleActionType.block_message`. - channel_id: Optional[:class:`int`] - The ID of the channel or thread to send the alert message to, if any. - Passing this sets :attr:`type` to :attr:`~AutoModRuleActionType.send_alert_message`. - duration: Optional[:class:`datetime.timedelta`] - The duration of the timeout to apply, if any. - Has a maximum of 28 days. - Passing this sets :attr:`type` to :attr:`~AutoModRuleActionType.timeout`. - """ - - __slots__ = ('type', 'channel_id', 'duration') - - def __init__(self, *, channel_id: Optional[int] = None, duration: Optional[datetime.timedelta] = None) -> None: - self.channel_id: Optional[int] = channel_id - self.duration: Optional[datetime.timedelta] = duration - if channel_id and duration: - raise ValueError('Please provide only one of ``channel`` or ``duration``') - - if channel_id: - self.type = AutoModRuleActionType.send_alert_message - elif duration: - self.type = AutoModRuleActionType.timeout - else: - self.type = AutoModRuleActionType.block_message - - def __repr__(self) -> str: - return f'' - - @classmethod - def from_data(cls, data: AutoModerationActionPayload) -> Self: - type_ = try_enum(AutoModRuleActionType, data['type']) - if data['type'] == AutoModRuleActionType.timeout.value: - duration_seconds = data['metadata']['duration_seconds'] - return cls(duration=datetime.timedelta(seconds=duration_seconds)) - elif data['type'] == AutoModRuleActionType.send_alert_message.value: - channel_id = int(data['metadata']['channel_id']) - return cls(channel_id=channel_id) - return cls() - - def to_dict(self) -> Dict[str, Any]: - ret = {'type': self.type.value, 'metadata': {}} - if self.type is AutoModRuleActionType.timeout: - ret['metadata'] = {'duration_seconds': int(self.duration.total_seconds())} # type: ignore # duration cannot be None here - elif self.type is AutoModRuleActionType.send_alert_message: - ret['metadata'] = {'channel_id': str(self.channel_id)} - return ret - - -class AutoModTrigger: - r"""Represents a trigger for an auto moderation rule. - - The following table illustrates relevant attributes for each :class:`AutoModRuleTriggerType`: - - +-----------------------------------------------+--------------------------------------+ - | Type | Attributes | - +===============================================+======================================+ - | :attr:`AutoModRuleTriggerType.keyword` | :attr:`keyword_filter` | - +-----------------------------------------------+--------------------------------------+ - | :attr:`AutoModRuleTriggerType.spam` | | - +-----------------------------------------------+--------------------------------------+ - | :attr:`AutoModRuleTriggerType.keyword_preset` | :attr:`presets`\, :attr:`allow_list` | - +-----------------------------------------------+--------------------------------------+ - | :attr:`AutoModRuleTriggerType.mention_spam` | :attr:`mention_limit` | - +-----------------------------------------------+--------------------------------------+ - - .. versionadded:: 2.0 - - Attributes - ----------- - type: :class:`AutoModRuleTriggerType` - The type of trigger. - keyword_filter: List[:class:`str`] - The list of strings that will trigger the keyword filter. - presets: :class:`AutoModPresets` - The presets used with the preset keyword filter. - allow_list: List[:class:`str`] - The list of words that are exempt from the commonly flagged words. - mention_limit: :class:`int` - The total number of user and role mentions a message can contain. - Has a maximum of 50. - """ - - __slots__ = ( - 'type', - 'keyword_filter', - 'presets', - 'allow_list', - 'mention_limit', - ) - - def __init__( - self, - *, - type: Optional[AutoModRuleTriggerType] = None, - keyword_filter: Optional[List[str]] = None, - presets: Optional[AutoModPresets] = None, - allow_list: Optional[List[str]] = None, - mention_limit: Optional[int] = None, - ) -> None: - if type is None and sum(arg is not None for arg in (keyword_filter, presets, mention_limit)) > 1: - raise ValueError('Please pass only one of keyword_filter, presets, or mention_limit.') - - if type is not None: - self.type = type - elif keyword_filter is not None: - self.type = AutoModRuleTriggerType.keyword - elif presets is not None: - self.type = AutoModRuleTriggerType.keyword_preset - elif mention_limit is not None: - self.type = AutoModRuleTriggerType.mention_spam - else: - raise ValueError( - 'Please pass the trigger type explicitly if not using keyword_filter, presets, or mention_limit.' - ) - - self.keyword_filter: List[str] = keyword_filter if keyword_filter is not None else [] - self.presets: AutoModPresets = presets if presets is not None else AutoModPresets() - self.allow_list: List[str] = allow_list if allow_list is not None else [] - self.mention_limit: int = mention_limit if mention_limit is not None else 0 - - @classmethod - def from_data(cls, type: int, data: Optional[AutoModerationTriggerMetadataPayload]) -> Self: - type_ = try_enum(AutoModRuleTriggerType, type) - if data is None: - return cls(type=type_) - elif type_ is AutoModRuleTriggerType.keyword: - return cls(type=type_, keyword_filter=data.get('keyword_filter')) - elif type_ is AutoModRuleTriggerType.keyword_preset: - return cls( - type=type_, presets=AutoModPresets._from_value(data.get('presets', [])), allow_list=data.get('allow_list') - ) - elif type_ is AutoModRuleTriggerType.mention_spam: - return cls(type=type_, mention_limit=data.get('mention_total_limit')) - else: - return cls(type=type_) - - def to_metadata_dict(self) -> Optional[Dict[str, Any]]: - if self.type is AutoModRuleTriggerType.keyword: - return {'keyword_filter': self.keyword_filter} - elif self.type is AutoModRuleTriggerType.keyword_preset: - return {'presets': self.presets.to_array(), 'allow_list': self.allow_list} - elif self.type is AutoModRuleTriggerType.mention_spam: - return {'mention_total_limit': self.mention_limit} - - -class AutoModRule: - """Represents an auto moderation rule. - - .. versionadded:: 2.0 - - Attributes - ----------- - id: :class:`int` - The ID of the rule. - guild: :class:`Guild` - The guild the rule is for. - name: :class:`str` - The name of the rule. - creator_id: :class:`int` - The ID of the user that created the rule. - trigger: :class:`AutoModTrigger` - The rule's trigger. - enabled: :class:`bool` - Whether the rule is enabled. - exempt_role_ids: Set[:class:`int`] - The IDs of the roles that are exempt from the rule. - exempt_channel_ids: Set[:class:`int`] - The IDs of the channels that are exempt from the rule. - """ - - __slots__ = ( - '_state', - '_cs_exempt_roles', - '_cs_exempt_channels', - '_cs_actions', - 'id', - 'guild', - 'name', - 'creator_id', - 'event_type', - 'trigger', - 'enabled', - 'exempt_role_ids', - 'exempt_channel_ids', - '_actions', - ) - - def __init__(self, *, data: AutoModerationRulePayload, guild: Guild, state: ConnectionState) -> None: - self._state: ConnectionState = state - self.guild: Guild = guild - self.id: int = int(data['id']) - self.name: str = data['name'] - self.creator_id = int(data['creator_id']) - self.event_type: AutoModRuleEventType = try_enum(AutoModRuleEventType, data['event_type']) - self.trigger: AutoModTrigger = AutoModTrigger.from_data(data['trigger_type'], data=data.get('trigger_metadata')) - self.enabled: bool = data['enabled'] - self.exempt_role_ids: Set[int] = {int(role_id) for role_id in data['exempt_roles']} - self.exempt_channel_ids: Set[int] = {int(channel_id) for channel_id in data['exempt_channels']} - self._actions: List[AutoModerationActionPayload] = data['actions'] - - def __repr__(self) -> str: - return f'' - - def to_dict(self) -> AutoModerationRulePayload: - ret: AutoModerationRulePayload = { - 'id': str(self.id), - 'guild_id': str(self.guild.id), - 'name': self.name, - 'creator_id': str(self.creator_id), - 'event_type': self.event_type.value, - 'trigger_type': self.trigger.type.value, - 'trigger_metadata': self.trigger.to_metadata_dict(), - 'actions': [action.to_dict() for action in self.actions], - 'enabled': self.enabled, - 'exempt_roles': [str(role_id) for role_id in self.exempt_role_ids], - 'exempt_channels': [str(channel_id) for channel_id in self.exempt_channel_ids], - } # type: ignore # trigger types break the flow here. - - return ret - - @property - def creator(self) -> Optional[Member]: - """Optional[:class:`Member`]: The member that created this rule.""" - return self.guild.get_member(self.creator_id) - - @cached_slot_property('_cs_exempt_roles') - def exempt_roles(self) -> List[Role]: - """List[:class:`Role`]: The roles that are exempt from this rule.""" - result = [] - get_role = self.guild.get_role - for role_id in self.exempt_role_ids: - role = get_role(role_id) - if role is not None: - result.append(role) - - return utils._unique(result) - - @cached_slot_property('_cs_exempt_channels') - def exempt_channels(self) -> List[Union[GuildChannel, Thread]]: - """List[Union[:class:`abc.GuildChannel`, :class:`Thread`]]: The channels that are exempt from this rule.""" - it = filter(None, map(self.guild._resolve_channel, self.exempt_channel_ids)) - return utils._unique(it) - - @cached_slot_property('_cs_actions') - def actions(self) -> List[AutoModRuleAction]: - """List[:class:`AutoModRuleAction`]: The actions that are taken when this rule is triggered.""" - return [AutoModRuleAction.from_data(action) for action in self._actions] - - def is_exempt(self, obj: Snowflake, /) -> bool: - """Check if an object is exempt from the automod rule. - - Parameters - ----------- - obj: :class:`abc.Snowflake` - The role, channel, or thread to check. - - Returns - -------- - :class:`bool` - Whether the object is exempt from the automod rule. - """ - return obj.id in self.exempt_channel_ids or obj.id in self.exempt_role_ids - - async def edit( - self, - *, - name: str = MISSING, - event_type: AutoModRuleEventType = MISSING, - actions: List[AutoModRuleAction] = MISSING, - trigger: AutoModTrigger = MISSING, - enabled: bool = MISSING, - exempt_roles: Sequence[Snowflake] = MISSING, - exempt_channels: Sequence[Snowflake] = MISSING, - reason: str = MISSING, - ) -> Self: - """|coro| - - Edits this auto moderation rule. - - You must have :attr:`Permissions.manage_guild` to edit rules. - - Parameters - ----------- - name: :class:`str` - The new name to change to. - event_type: :class:`AutoModRuleEventType` - The new event type to change to. - actions: List[:class:`AutoModRuleAction`] - The new rule actions to update. - trigger: :class:`AutoModTrigger` - The new trigger to update. - You can only change the trigger metadata, not the type. - enabled: :class:`bool` - Whether the rule should be enabled or not. - exempt_roles: Sequence[:class:`abc.Snowflake`] - The new roles to exempt from the rule. - exempt_channels: Sequence[:class:`abc.Snowflake`] - The new channels to exempt from the rule. - reason: :class:`str` - The reason for updating this rule. Shows up on the audit log. - - Raises - ------- - Forbidden - You do not have permission to edit this rule. - HTTPException - Editing the rule failed. - - Returns - -------- - :class:`AutoModRule` - The updated auto moderation rule. - """ - payload = {} - if actions is not MISSING: - payload['actions'] = [action.to_dict() for action in actions] - - if name is not MISSING: - payload['name'] = name - - if event_type is not MISSING: - payload['event_type'] = event_type - - if trigger is not MISSING: - trigger_metadata = trigger.to_metadata_dict() - if trigger_metadata is not None: - payload['trigger_metadata'] = trigger_metadata - - if enabled is not MISSING: - payload['enabled'] = enabled - - if exempt_roles is not MISSING: - payload['exempt_roles'] = exempt_roles - - if exempt_channels is not MISSING: - payload['exempt_channels'] = exempt_channels - - data = await self._state.http.edit_auto_moderation_rule( - self.guild.id, - self.id, - reason=reason, - **payload, - ) - - return AutoModRule(data=data, guild=self.guild, state=self._state) - - async def delete(self, *, reason: str = MISSING) -> None: - """|coro| - - Deletes the auto moderation rule. - - You must have :attr:`Permissions.manage_guild` to delete rules. - - Parameters - ----------- - reason: :class:`str` - The reason for deleting this rule. Shows up on the audit log. - - Raises - ------- - Forbidden - You do not have permissions to delete the rule. - HTTPException - Deleting the rule failed. - """ - await self._state.http.delete_auto_moderation_rule(self.guild.id, self.id, reason=reason) - - -class AutoModAction: - """Represents an action that was taken as the result of a moderation rule. - - .. versionadded:: 2.0 - - Attributes - ----------- - action: :class:`AutoModRuleAction` - The action that was taken. - message_id: Optional[:class:`int`] - The message ID that triggered the action. This is only available if the - action is done on an edited message. - rule_id: :class:`int` - The ID of the rule that was triggered. - rule_trigger_type: :class:`AutoModRuleTriggerType` - The trigger type of the rule that was triggered. - guild_id: :class:`int` - The ID of the guild where the rule was triggered. - user_id: :class:`int` - The ID of the user that triggered the rule. - channel_id: :class:`int` - The ID of the channel where the rule was triggered. - alert_system_message_id: Optional[:class:`int`] - The ID of the system message that was sent to the predefined alert channel. - content: :class:`str` - The content of the message that triggered the rule. - Requires the :attr:`Intents.message_content` or it will always return an empty string. - matched_keyword: Optional[:class:`str`] - The matched keyword from the triggering message. - matched_content: Optional[:class:`str`] - The matched content from the triggering message. - Requires the :attr:`Intents.message_content` or it will always return ``None``. - """ - - __slots__ = ( - '_state', - 'action', - 'rule_id', - 'rule_trigger_type', - 'guild_id', - 'user_id', - 'channel_id', - 'message_id', - 'alert_system_message_id', - 'content', - 'matched_keyword', - 'matched_content', - ) - - def __init__(self, *, data: AutoModerationActionExecutionPayload, state: ConnectionState) -> None: - self._state: ConnectionState = state - self.message_id: Optional[int] = utils._get_as_snowflake(data, 'message_id') - self.action: AutoModRuleAction = AutoModRuleAction.from_data(data['action']) - self.rule_id: int = int(data['rule_id']) - self.rule_trigger_type: AutoModRuleTriggerType = try_enum(AutoModRuleTriggerType, data['rule_trigger_type']) - self.guild_id: int = int(data['guild_id']) - self.channel_id: Optional[int] = utils._get_as_snowflake(data, 'channel_id') - self.user_id: int = int(data['user_id']) - self.alert_system_message_id: Optional[int] = utils._get_as_snowflake(data, 'alert_system_message_id') - self.content: str = data.get('content', '') - self.matched_keyword: Optional[str] = data['matched_keyword'] - self.matched_content: Optional[str] = data.get('matched_content') - - def __repr__(self) -> str: - return f'' - - @property - def guild(self) -> Guild: - """:class:`Guild`: The guild this action was taken in.""" - return self._state._get_or_create_unavailable_guild(self.guild_id) - - @property - def channel(self) -> Optional[Union[GuildChannel, Thread]]: - """Optional[Union[:class:`abc.GuildChannel`, :class:`Thread`]]: The channel this action was taken in.""" - if self.channel_id: - return self.guild.get_channel_or_thread(self.channel_id) - return None - - @property - def member(self) -> Optional[Member]: - """Optional[:class:`Member`]: The member this action was taken against /who triggered this rule.""" - return self.guild.get_member(self.user_id) - - async def fetch_rule(self) -> AutoModRule: - """|coro| - - Fetch the rule whose action was taken. - - You must have the :attr:`Permissions.manage_guild` permission to use this. - - Raises - ------- - Forbidden - You do not have permissions to view the rule. - HTTPException - Fetching the rule failed. - - Returns - -------- - :class:`AutoModRule` - The rule that was executed. - """ - - data = await self._state.http.get_auto_moderation_rule(self.guild.id, self.rule_id) - return AutoModRule(data=data, guild=self.guild, state=self._state) diff --git a/.venv/Lib/site-packages/discord/backoff.py b/.venv/Lib/site-packages/discord/backoff.py deleted file mode 100644 index cfb93ad..0000000 --- a/.venv/Lib/site-packages/discord/backoff.py +++ /dev/null @@ -1,108 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - - -import time -import random -from typing import Callable, Generic, Literal, TypeVar, overload, Union - -T = TypeVar('T', bool, Literal[True], Literal[False]) - -# fmt: off -__all__ = ( - 'ExponentialBackoff', -) -# fmt: on - - -class ExponentialBackoff(Generic[T]): - """An implementation of the exponential backoff algorithm - - Provides a convenient interface to implement an exponential backoff - for reconnecting or retrying transmissions in a distributed network. - - Once instantiated, the delay method will return the next interval to - wait for when retrying a connection or transmission. The maximum - delay increases exponentially with each retry up to a maximum of - 2^10 * base, and is reset if no more attempts are needed in a period - of 2^11 * base seconds. - - Parameters - ---------- - base: :class:`int` - The base delay in seconds. The first retry-delay will be up to - this many seconds. - integral: :class:`bool` - Set to ``True`` if whole periods of base is desirable, otherwise any - number in between may be returned. - """ - - def __init__(self, base: int = 1, *, integral: T = False): - self._base: int = base - - self._exp: int = 0 - self._max: int = 10 - self._reset_time: int = base * 2**11 - self._last_invocation: float = time.monotonic() - - # Use our own random instance to avoid messing with global one - rand = random.Random() - rand.seed() - - self._randfunc: Callable[..., Union[int, float]] = rand.randrange if integral else rand.uniform - - @overload - def delay(self: ExponentialBackoff[Literal[False]]) -> float: - ... - - @overload - def delay(self: ExponentialBackoff[Literal[True]]) -> int: - ... - - @overload - def delay(self: ExponentialBackoff[bool]) -> Union[int, float]: - ... - - def delay(self) -> Union[int, float]: - """Compute the next delay - - Returns the next delay to wait according to the exponential - backoff algorithm. This is a value between 0 and base * 2^exp - where exponent starts off at 1 and is incremented at every - invocation of this method up to a maximum of 10. - - If a period of more than base * 2^11 has passed since the last - retry, the exponent is reset to 1. - """ - invocation = time.monotonic() - interval = invocation - self._last_invocation - self._last_invocation = invocation - - if interval > self._reset_time: - self._exp = 0 - - self._exp = min(self._exp + 1, self._max) - return self._randfunc(0, self._base * 2**self._exp) diff --git a/.venv/Lib/site-packages/discord/bin/libopus-0.x64.dll b/.venv/Lib/site-packages/discord/bin/libopus-0.x64.dll deleted file mode 100644 index 74a8e3554ff00d07d979d7763f03555d8e392f21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441856 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%0DfdGRmjsdzH`o8kKLF zbRI<|BeNw-dpG;q#RomisocJ5wn55+-SLKS>YF#2t3{%DUO~g?#1rDb4yea$Njxr^ z1#2LRD{%tuiOV$I2RbAAGcz+)hfq@)=YB42!j12ERZR}Hbi&bb;OP9R7`6<|oZjpg z+XYEXrL0A>hLAolw~kTFs^p>$SsOEz@wYui>=jGsD4L^B6X|(J?*I(=mm{k5pj?3wgs&4EDd>d4cpq zbBycA79$P3;RL8hjAvROKcPf(fEF~|;+CRKN>coj)cpWund-uU8CA}=$gGlo>y_Nf zdv>y^$d#URZY74#wA}i0UE{{}7o}=vnz&hu3|j7jNdPpvT0CXXC}KCdU!aUNscH)c z3hz?`{w=r>ECgl&tdoyry<#5X7+P|zt|ftpOW_K3Hv}PUU1%zUyggW++uPk80jWHL z+YZJ|JD}j(vlcm7$g179aBcU3@PzT4a9vx_QW0 zf@o8mHNEB9AiHY1CW@OAUV=aM))Re*3I!9wd?I3f^KF`Y`CO4VSkTh_=Z zgdR0$8-{lpht)@duQW|VC%J`|BR>0-yE&;E7*HLxLoV>rQ6wft$j_V@#Mgj`f87rV zHKh$K2u{~(@S$+>C#owx!rf1W@eA$RE1}mmaT$d_bk()lPq<1uO}yQHZFU@L8woaT zX7<(``20w2BXlJ>18dSx2pIt9_!jde>XOyAoRE6cKmtAJXgno6<*I9~)U9s(tZNmC zq8xO=5#-amFHPLGIC$swte;oJc}$;Op;9PthYVdeW`ChNR@Y5OIWG=lhtnXH2nBT4 zM*=;NTD!5>Q7%5&{c6+3jvD(gB(#{l$BthKY79!TS!N~=hV7R_kDGBGz>lqsCo)Gc z%!^_^40mn3xTqF$+k+(nghC>XW3Al*mEKNs34&w4t9K0|3X*h0xE!py9w$Md%+rqY zbMbM5*WeiFZ4cK0sFa6;Hx)FYx-dsZzpA)~MX>3E#x8Zfh}GJt%TJ}PV~7dSiW)z+ zu|S%ds2+kXLhK0QF=nA;NcI~qLoNVT{nOSuCd4*7r#@+h-`!a7Ib0JJ)>2(RFlrz| zck5w62q-9__6lCPcy`I8flx?e(jeu3QTTu?8b~tE%^pA1o`bTsxpRiv%ZPV=l!hE( zHn4CBYiWu|Y+>|gV%7_sW-@v8+Q!$U`vnzl@(M0aWX5EDuBC!N1_o}f%LqvsSciB3 z@>1Xux$J?5*O7&5Zm+?lb=A*95Bk-AHba`}o0#cr+KnHRYh1ZwiN7;XO`Zx|u+>AOL>#JZ3r=wG?)$N4Zz0unfVhGG0SF+*^|U~D9VKO&Dn1F=*MqPF6XEDPP$WRcZWK5L+I ztL-Mmx<|ORbS^L4@bP69DT&tYsqy{pl2qBb&Y@$lnyNK~>VmZtYZ306X#1ohS7}n+ z`R%a}XL7^rPT{`2UX+$d*gjweJd`;)JY+v750nHwhW5_X+&mIiwnB|Soqgc)4|Egp}$%*=2)C&Cf=;S zS7PQfh@Z4@UI42)GZuO4)m^AMMiFx?(TEFM{|z5#xbNV?+P_#ybne5B0|TdV?ZTnoTtv5A^py`lb}NL4hEiAi(gzH#8!GM2{=J9Do)StKL>AhCL1e9(?v`yw z(+7&OqmXFoEE}e8ks9S2M4s|!EHbVJlLh!@kb+tfuFBa4I8TZ!N;EBm`78{)-B8qq zxu7Fy*zbua1j0c}48IBPm>5z}jlX9ehV5f5JwT4c7Ay@(m~1&r%mcbe$!u9 z<{mJCt{g(R-Vr9RmWC$k8Y|kOu`-vNthfKoHTz6tGES?h+blJl=89=8jg`3qxWKum zqd907y+up@%qq*JL%z-VecDz_V^AKdLAfz!cRMFvYi=KT+3kHyal1-Ca`7TR#WCgXXGEZ++M#}F6( zF=R;k+1tohzT{Jh$0dAJ*l+C^NGgPPXP@PkaJtE-S+<|?FHZNH-bu2QAHw*@Tl+M64W~}|wP8#bPnoqaJ~}yTVRBWP z%6i5^4SrmG=^06=##4-cg5vEN3zLOC?-HWO);=RZ@)c-#labinnzA`DIE+~~KKAEVr)vAXUV zUn_&YC&FS+6?s3v+*)!*MbC&qg+E3CE>D>95AtHh)hqvYmap5cdrUno^gMfSzFn>6 zQ}J^7^kMUO6f-@$P^DJWBDsHrv|BmPlzjmuY zV_}E$r)H{90r}?r#(X$|58ca43Gx_NQYO|M6iFkp705u*?CBcx*`4~#pl*D*mY00v zzDzi2=o~$32IarRWPs{b`j7GkjNvPH? z5f@_VVc_#1#Cw1^5=xHogfp$BC+X8!4ZdxmPMf24y<|}s@ovHjYVm)6RlzEgg&xnyTOvp3fU@iYE8`Cr5u)`UJ`G}sgNp|fw zcpfEOvkg0(H!$1KGn`b}MOPO*kw}?Ee?YHw%@AsjI~T&|!p=a-a8yI>2Zw{Hz5+qX zyHo6Nej@u1p3n@qp@brTv=R;@6ca;`YcHsVNa0?V4K;zVC?oD_S|%tpzzTQe9<)PJ z(V&yPN9F^(_F(E(&4ksNTqag#k3?f@Y)qRV_yE#gFy)rX4OhDtAEWNc9=u~_3^`qU zb13oH#JwkDV8Z%-8ut<_VWdJyDT9(yOei$vmlNNa4%BTsL@~E9|w-*vW@OiXqe=R0458wUp0%ZFwuL{9j7N(t)zhL)dnyL8i6j| zZh3$jlTIq(qNMS#k;PtD!G?3FHI{4@@ks4Cj;)3){;CT$s5xO0C{79gMFIpKoRoU* zATT-fCY{FQkg|lXzy7*St0Qc+yZBqf-%I>WjbhJ(zaMk1ZRYR$gg5e6LO8%*h`%}f zE#Pkze|t%LgTGSFE&ct0xOe#*PTVK?8-1~_U?P7?o56D#@IhWt^!|PCng3SLM~Lel z6yHO57~h=1-z5I>d20yY?7dHq`991Z$lnXenCLv4G)TrLK{6)V+xx9=Omu#AlR+{j z=8+6x07FcIRLkqj95f6Pf1Zfx1$+`q1+WjYJhm7bsywqG<6Sa6sF7ZO5Nr88=B0HIZj?|=YtF@uZuj!ah8xS=;72z*r@BoSesuF7{OD%qts70#Z_YPe zvU8iEm>L5jPQ}~W{jsV_=lK<`?U0ixo}iV@WG;eLDXo6U-f47tbMY~*(hvmMwDdel8H8)AR_H)7{Ld{< z-p%R|468w{JOc})>0`d#vhVOntf&l`y)n{_$zjkT-Iz7)M-&}PF+;wO*1?WKrmY5< z=dDfW(54djlPEM(qGvD6EiZ)XomXHK%KK{r1r8~1XnV$|Dlmh^2L5lFG%%Qi?8{1g zm-$-{=lF2R-%(&K#Jo!8CxtjC^b-mzE5zhNaZ6t=KHBTxYvx?VQqiVC{%)lHXY_CY zO^ED#&lr!dwO>Z<8$)T)y2A#8l1ylrVMEjMeSOUJU+7YvevJ>949y`M-c4 zTZr)Yn34jUu;?XfUP-E~*|(GLZ+G3l2M$1`BDJnZspYW%ip>>Oc#}FR*Y4%fLof7u zoOAuryY@Wh4)}31UKsq}Lc`C$h*;NsDNfGt0#NotX#aAOU_8vpX#=MD3zc(j%(wZy znSWO6+ld%zVf_C5(1o#8*h2e_QGO{1&WqU^141`Pf_to#DD;Ro*Vai>88aa-)zZt% zD@De!K$sMy7Ev7%U9F9*_#%BK5_ledjkU3`2HA^2EyI%pZX%61#{rHUELONC0Oc$S zC2kq9OqIFQk~vURgG;+fu7MSx&=`5Pl_1DFL%(#FnXCigXV^%2&tnBNoFA*hjy=VN z3_}sKKWX$B2Jvs!6=LNFd!IEvs5S6IUdIX{xS>CU$XJcN9T2N^nb)_62gV&0lPe6} z+w5Hy-(0THOsA_GwA3s^Uga;Kg;5|#?Zr2O$|x89(ut(yo|Czc`n?~Thx@(AR|DU_ zS08O0OIrG9vr$Bw_&MFrHzU{g5Z}b?Ux~8B4#5uoWM#7tqmnk;g!ZBA9gQWMDp5YG z4#Vn3AC2QCf;bP#*}nj^LJ}?C@Hm$&N2Es`K&yy#PnNHh56DjrSh08a&0uN4_u6uP zV=t`;>|f8xOrsO!YKjCAQ*!bMqun|EKXW-_1VP5_$MAyqV*&bSQf^x@mijT_ukg}W zDIshx@S{*57Z~`!$Y5)qBPQ4Lw$A+simtgyh(2Jz@Ku!ajpe9TKEkNNUZxmdH@RRh zG-kA@uvY!7hI(=c@qZ(Vf$rc$^3pga6OAnS(yLU2^Wy59AsXYnkoqG^gwy5xBaVoD+oU2hgkIK9< zx`^Wt{jjg_Ps(vQShbC@a^?AIC*tcXcxOqI59`(-H{dlM8Uv3IKqPfSc2&a&4b-ZA zdVc38v4*FON+hmJ< zB9wMxi$O(#qP@rA0QD z>$j*s6RGHL)-gI?SiCcPvGY*A#)g0BhZldlz4UiTdvD8s9pBEZTkP&& zZ{s$RLd#rqrk^6JT`!7g?=#w74|b`6I9&BWt+ZMD?QiAvn>~9;!uDAuI9!z-KxD4p zoO+zEt>wC|p~Y|Aols#SaW$dQws>*7&T}~1P}tac2_%}MkgbS!V5Ojbfz znAo4mtNzN2rwx@819D;eaH_V*`TDPOxm0ao80$Or1f!|@1<f)}Eg!a;c;P_H7vx}r`7g(-oo~~_HYJh?vz{n)~fr6 z$)87|R1*@nx0j%1f&|QPgo!e5a1qj$b6S4E%5ns%zrq(OzX%E}QP~Ay8sm^DQ78%3|6Nnpd3qgMhX!mewHR)$>KWHxk5&N_HkV35pRqjUE+c*Y zys7Hpo)^iHFMF4oGqh|&fuU>_n*qYO&DYgnNb~be&-A!R34{4GgV}JK8NVIuC;|;P zw)RZ|%;iZDH-+utz`(^gb(rCA0Cpw?_rFZVxd!17V1J+ZQAPi4h;5d!S^!PxwBvF!~ zb>`fps>!PA1}rWRWFwfDYHWY8$}4pVw?Q}a8@Y;kWv1pK18Ut3M}f@@Np$5XLJ%HT zh=gSJw6-+c{at2Y5`vS+^~~}kM>Gp_F6m}~6uUD9>WjkR87<_&v1wsW9LW+6(wf5H zNsWIIX?z%@PaV_0CWk;wwdt#F-qC343ANwoSv!BnN;2m?r;2kXFEF2`Twl^Wu^;}1 z42Ks6F(kR!WB{l{La7c7ShN<+=yRBDA9!1BI?1{9<&9WLYY`TCK}OqIC}kd6dekejd% zXsS2Mhx;!=t;qZ~*U2{b1ny5~&p%DN+2vzza-XNo;TfxY9=rT4*wn18+lt_F4W_+} zd^Z_U_?B(053=u27J>fiNa z@l_<)Z4=3arUaPsT#(ts`tj6VDBtLya3o=Kilm!)o2xgx8)1;DItJ=1i&XIw9l3h| zzQ*kR&aVl^?1Qn?FSJe!dXKFl?gEoR_Y0gHR@@1cZ1{J8t4u-t#f_Nf5rm(1UL-=u z3~28^>+0dGTxT}zfE|(NAYLiMB@({Nr7ju~PR&G`IZ}?~KzyY1k?=98_wbZ9bwBSS z>j!+t4dV0BC-PcIY>2^{N4kSc^XTVKnc;GwCqR3Vt`N>Uul3&?#yNlD#SSjmIW`#? z@9F|YQ`7J+({Tp}ja$l%ZYhaJ&1mWdLOJo-@#%H~p>1wWpviM40O}-7!cqaiM=G_X zcxvfXOLkjJX)!Y^i-D}A8@cU`KgnF3{Q0qE;+&rz0HT|UisIMW|6ED=_MOl~L=uai zVb}U09GStYD72@S_<-}>^E;)V>FdsxCl2T0BTe-D?t%k;BbnNXvI915aa_MMntFU5 zm~(W^+rNvokQ(p`iTc`i5XghuO z@WIATu|s;=j`L-2uN%vLS93*fQ^E4V&W_CEBX3)`79=tVomW?4-*hS-Fqc&C$8st5 zOmFQbvHGBiCI;)MOR5h->XB7c*+0c%n``nE%O38FOrCbthpgru5U85Y!%LUf8;php zunw2@ToP&*`7;}spOGSm7bQWA?6~@`l4Kl#r1iQo>(f%H=jZLN53CWfk@o#ZP=s zrd?!WX$iqZgR3U-q#tW^)=J|S+m6rnfD9`SpYgSRT}IazQ*Wwvk@LrkR5ak0E61~} zQ#Ha$$)kmnW$(I4(B0fr=POwOnUNbv=fVeILz)C(IksZdT=C5QGyZiX*qf6bzDU&M zR!+Xes1V9%f{5%`FZaT#N^)|240{vMIb5i;nTO+ye$9g4jjdVm^jHiKUsa!Mo5w^G zoJH`TOfY;^5#cYp;aLi=^y2-5Z}j37UggCPBV6yrE4i?1Nu;KeI^zZZWJ z;oH4M9|Iv$A_{U!Sc*2cdyuv^6;!h{s?8PhmQ!l=faElkO z@Xx*Yvk2ei#VhegfeYUcAD;Aq*X6a?dQ5f%C7% z?#D=Db4YyZl#~o;OfxmKUA!sew3#%g>_!^cYwnXgBDSresM)wQ&9FhUYs(}HJ zAQ*_0AzqdiWx|)<_?OcJ5j!y?-HYmcB=}~7H7VViJH~Wi4=9%o^qNznij?>ndBohV zovhLf)RyfrJMH`lllFGoY#I_vrP8z%+yL$>0ZPgS*@&r*mobQ89(vcNEq)F7oac7DbjJ)f!BD=EJIRy{K zOI#&#EOT7~*8eK8lN2wo3K_4{SpY*!)k0ORT_n6j#bP+hSf+E$R!JF+^*!4q4Mcr? zLI6P>Ac!ZM<^rn$$2fk!{4n&I5iX61sjxA>oq9+pDI}(QHVKkH*u`uAUHAHHAThni ze%=6msoKz&_HmLArZ4@9euppxboY-H5bRy~uY?e}TJde3?v->CR3_{0yLiV(H-x6e zoNge8&O2{tCX8g+@J4VvGZEJ^ z5x=8Md#_7z+TkptWXaC0tZLyqmmGy`=$7n|dWO)T3l}Ycbf&C~-8XiUt&mQTCVoZ_D+y#=E{LB*JuL%Y5uH@aqRC>hA5AMQ(o%dd^s_YY^bbp=^Zh3}WNp8jOPPr9|)=ZK; z{gu=Wpi6fcbm_X`A~oHd5oaG&mmSWn&#~`_F(?Kl6&86y`sQlzCg1rRpXfPE(NWu{ zxuh)x&F1>Qm*R?7(0V#sC>kyR89Qy-;$28P~?EC5y;m*uxieZTGbC*|@b zm+Su1)5K2{1VhqWa$aSdXk?mhBq6cU+%Dq5Xx$m0Rbrkwzj#BpF>aijP!PR-H=66Z z|L=t1Xp+mg{q!e)p5%NtDkzWp{Lr4b|>;tB#%>B!z7s zsH@0gGYwhnios+thV9Z45llR)MdbZ7u{T8%`+ZIF{GJv{Ggw@YZb2dYsn#Chkq89! zjmcBtZiw0W>3rZBwJ=*tmkgl1nYGaT`Jp`$L33dK%?AL%Q-*X$O9JkLnU0K0f5Y|0 zAgUXj{tH;sXYu#+Exv+NZ}k$B^0%Fe)4?If$>5KaslV0yk2xRDnCTHV6(!%acXfx@y0xzlgJOSPn6vrkpltu_Z`TM4!H%?m-E_CUQ zCyL&<-MJSysGa`>nnbFde-RzRx4?pj4-bGP1?a zFY@UUPlSter@!&h?0Jb?QG9|Ogp@J$01dO2zd?JsC_Vk}=n-KMr1wy#a1yIcMnYs? zc%Gq87^#9->QT*bjeW?O1tQT;?+oz*)K*hVnrG+zxm^kO9Y2_c?5S;@2zni4R5*(|C9Oh_>e`m!#UN|deAHCL{n7A z5KWbOY?nNx{?%$LCBH7PgG=={{s%Gxn&-rEF00}%rDhd6-`vMc?y!5EMFd2Qgc2#k ztdQB^?aQU60VmzM5l?$BIDug)D(H&~e2Zgs5Mi*rT!VE)Brj@kvjK<otH}kE~1(>m+U{B*8LJPJm zmUO{RWXDvMvky{G@;?QsMHTLsgGd-L1=mlZxNWcINyCy}aHI3|+4mXIXOjuvsj+*+ zPdhxoPZMVYf(k2V4=3yesZj~eI)1W02gd1o0QgUp&*51vQ$$>!}mtH$+`#ABO|ju=rwkcWHbWOyFceW z^#4aj7Htg`b%j=xP2{3y7m?fLLpQ!UX)6@I5qxvT0KdR43iwz9Ysij^Sf4MADd{Zp z(Oeu3zS}Tr((4A$if|Qn*hvCz;=bFZ00?%=WH3=}BcYebDG;o5e%8xDQPyt6o%6hR zL_m$;l+JE07C4Y$*;SjXk-U5j{2N05$BefO7>n{>jXi01eHG6~z~2?)DKHDpm>$EC zW3=w^HAHX`h}J#)03nIJK^ZZ_+opbCxVf4;nh8Y~BM8E+^g5{4a~36=CM4tK)|j>j z$jw8d0#5m>M?nMTREF*6kX!7A_m+$RMsGRTo@N=;TZ{h6?HOJ9Ie2#82H~(vTqa4E zU1JZFjv>REsL0W$oiK9EE1zC7L|~U@wEKWSn1_oG(YYCn)D!1RGiXl=%Lvcab%0 zfB&Z%jlj#UTaFlXepn;%$&v?*mqK?ge&JN?SzeAz-Z7)Ug*PXX8b-vD_h^i=6L}qu zJv;X`+Sx{_nii}JlTs3|q>NE_PzKa(qp_|sz4x{U$k$%5no}_u@nhp?<5(iNM`vCx zkB;o3KZGh3N~R97Et9EUe(RH|qk2TGTQb&3X(p?MR~~{SnnCyRko!oxk8by|p9iO| zwd!qXx3Ri8GEW-qj6|tc`h9&!voN^NB3%_l&W?pK50>M9u!wZ3T$1vCi=d#}!2W^6 zaWfh8$olzPaZ70|$QfN`$Ij5D$OJXU>bfSSIo!KA4Xjnod2)c6VTSsHJ} z@>8gFKU34vR2l*rC%O)bSVe3gEo>w;qf#uB{fUlp7%J6Jt;^*!Zi_f44=ClK{?~_i zji&XAf&C@Xv{JkKQ@d*bbHA-Y2>9ca9?1B*^Y}A<$W}3%ouQtV-vZb*S&#bE2X36=bPh z&~Z);Mj?@T#ZCw|La;q?c~NVREW-t1d(Fz!C#ShyL0%$XRmf##`u5bXmO&9~Ble|I zm;bp~niHPg`{czZ;a!W=ilMO;ZtMv|V^45n%ZJ96yRoB(#^Rt$<(3VNEpuZ_hsNT& zO?gX(#^RGqvBQSO;^S?aA3JWX8Pkn?xBWGe*=ef)Z<}T>z2^aj%dlK-^J#h>zl$NR z2_TvI@KQpx0eIDqFEb(H9$aBU`)gBC5FQ-yJ={V>Ebw+Lb>612NF@Z0!~(CxeA{aR z2cvn?mr&Uzk8;{}y4qCb!Gxpu+! zOy39yJ~SO4_Fb5#3(vu3T_8NCU=5aAcGZV62Zm8BoDxng8?ZE-RwG@t<+4oAQ5O9Y%hVA4klKfZmz<;~W6csF~AjlUk4#qN%pu6RHWM-R-!E-77SNjR$5nPP@|Gj)AP%k-hBLN2$q( zG56DR^7~Wc@Zm#H%l1T^=Y=sv0~-{(Q2yCw&uXiZ`Z%d<*xA~!>A$gEw?|UrF`(;i zR@M6v_KsKi^&eV!_5Yx9ZCq`nkFc`6x({$Y=!Z=2>-dwTe&mi9ee`wiResZlRzCB8 zQn~-5uX?X?$NI3IZzJ_1_uTC8Gu>hT)JIxx3qG{++W$%AC2#@9+1u3rPif5+exwGx zHu}SQ{}ibosrRZ|Yp!qr3bY6c%x6m?-GR$$0|nZ206zg_(8dM;2q;K}DfOTW6m&A{ z(5(${3eWYM1Nv8H+b7aTW4;&I^X~3{1prVRaAJY1LAdkyC;Ca(PC9C~ESBo7I2yLM zbEtN+9S?^C7^4qt!aS_bX2}8RZ0;-2*&H(_|BC+rQTA`|fi$T@#$qdH^~*Y|u{G$O z)m`=em0eD4 z>gI9tsX9vC;{%!t^_ai$KK1!Sn&9>P)v^!k`4&CKYP3hZyW*f>)=SP=CjjSD?v-VfWr;DftW)yHcRn}$V=OZXx# z7BN(B3=u%CBX!Gw4PPzKLfn_c_s8~v7A~l%OL7Rh zLAHYyUAjRA!FyIwd&qhmGd_4XOx3&zeZ4rer#CxtJ(r{cTv~_r>~AlqhAjUkGMn@i z3xkQCQ9!hGXnuM*^jFy)^f72%?O)m__vu)4lbS8Ikq`g}Es^f|^R;(9|g`4SbV9`a#fGMc)=U%$Gh4l2F1 zR3-(Z3%bs+)-4@%l}7ke(~c@U*9{+6_=_f7q~Nt~vE+SnB}fTfGJ(-WHd98s zH!;e(^x=etyLC!;ED4d!{vi`O!6kd99-KhzP+1aDP5(B%K5TypFYt-=<+KmF^TDwF zO>DM34;gt2s??FdQ79jgz;OsOy&?NwE6Mfv`OIu^^YqjOUy(zUv=w_gbx|_&CtvFk zBQJ`gzakeTH{I&+GVH6&`CqkmC$@n@ksHTj?%J?)f z7&OXt0JQv+0>4kH0hOX`PY`7rY8+C}L#WyxI6ubqJRdFgY-=4x4+WkAVocDMu-2XD zyxs60ECd(;XNQrxz_uTPq@KhL6u5;|6D7VRx_hPbU(>X5JUyHDOW6$2*Z)WDIbonZ zwZ62|{m@5k&W!L!Y>v?%unQCEkuYbmNek(_L=>aym~WTI_(KIVPxU0>J!-_~K_+o2 zOui=x4d^B0dn|p2{~zT~)s8e2tRHRq;PTN=qQ&pm7p#Vh(PnpE z=``c>UWGw#y$vXNNx*FvYRSW#Z(ZaK$XRAU-ohp_12WbOh^unLmg?8xLIX&x?vL>% z_`Uoh9XR3_u@#G}k;rfvMcUSgO0MP+k-qoiIxBHoo1DXdzd18?!KYAi0q*P&gADfz zR@?6xL@`eW*es>d_5FMrkK6M3?^0O+ZcC$dg0?na1d6hTl3_m3a&e&? zbXt$Vg#jJTyj)U066Adn_%KEQLdN|uYWB}Dy)bVZgBTkb#yDIbP0cDXqS!|372-bo z-`?ZcWPm~VLi3ntse4 zS#PH_GCFHsMXV5kMNx2v95NpQFYx&LCT5TAZo|g!b-u-r(eQFD ziIAu#wz7#gXIvXhly1h)F#V9B?Fb#hY_Y^wex%&f3*A%6u{W6jhbxSXqWCHHsHrbu zBzNR9BTAH|gIn>EATzcPRaI(*5xod(=()^?jXwPn!>a-k$mu zex3R$Y?XtI-zV5A+nuZRDo}!ph-Z-pUT$Py8b+9{0^WzHZrOF#wxTtW` zrxVimI3AuYr?w9ygxhv>GP3lr}B2_wLCQBXTYIug1mN>t=keB3e;l5{5 zP$F$fx~Q(V#+S>tIP|h<$HhD-`O`e?v1jx9{ubZi=4^3u-ehuKo-ZM3iU+m`bQ)7qJSyNgBBAO*FET~-CKD+~o^mMr;l zD0oBJl52x!ESZbUI=}#j2_Y!xuV^6>!vhpP{?HF3#sPUDpOqyxi-uoa>B& z{)8Ie&aj%m9&*08cM!Z;X*2_)SReZa=C>tI@>7by3Yiw&0N`>~a@KhDm z+Is~kIDGP`5XzODQ83zM%)iq4M7s z3mrcpTJN=W-E=EjcMxe)4Boc(eEno@EUtCro+4Mh8Nk?Z8oY7(jhz|iBBb%~?wvq* z4ATqPoWjJ7eOpPycbh+I!({zj*#5^7a9->GBkyhCqbkq5|0FYk0KpSADpjm$josL> z+qBRwHuyLPW?%+ql(tf7D=pipS!{h_SF*)z5<-Un*6QeEImIQ>%^Zngt@&>ls-Oqmh|NrOnw-s>u<~P_cCrs={+n! zLOHud0cK2_S%q^=R1rfGI9<%IF~Q7SbCZa#rB_7~vGNdMG<+ulxb_d!J|1%Y0aGvY z4Ul0B>n_tP>{->T7{BU=Hlqfljr|XQ&+qc>8nJO0M~Is3-DxJS_eJL8Hm2hcZE?hW z|Lvja*hC3dG9;Q{b76JMl;HWwtJ$7jJ`_p)xV%ULSSF!E9ZCIjdAoj{qf?0J^5b%& zg6E;kd_qo-Cg^cXCwTGo>kebo2p8H{0>Be~-5$%Kj0qaZM})2ex78E!>F^qBY34YD_~);+2x4%r0p zq=~p|$`9%D&#T9_;yJ}#KUN=R6#7%C4vSfcaU&d4c|E_&w+mdp z_<3U|CVI}$E5cIHD&~d4&m12DB(r1*c2y4+iUicQ)|_TURj*hpe$6jd*&3fD0(}VJ z**}D47L|P~5dtx%&is5MaA-X_#;hM@X8mT*W_7x9E2vO{4}CSaT!TTCUknAKv5B4+<-O^CEYXpp#Dj0b3oIUC4@Ls3v)c#u!#)~d$-LuW=b?`o{dk$WHa;R7n?CsC_-n3?aJ!)DVOtc*{P(c;s5br9Hz-f}*$do2R!TrhWga&zaIp?ZT6h)X^%-cO>F%V7%5>_KHY z2QuAAO;X7WtJ*t`dHra?qi1UF@j`W6b7yYKY8ONjGs$aOX+7qsCb8IA>}9jD@PjY+ zW6X@p`?pr}gh`o^LkF5D-1iMmfK~!$45EY&h0QG07U$pRH_)POD}HLBWCM#h8*$Pa z830|B!RF&MpLu9A-#}{ca9!ZyiKlD0qdVebn=#Mw}NRaRA&*>m=gEStVW;0?FOQjxNGW-aCu8H}}vIVT7i zwp!t)IdCoaRxUzSw%=MufLZYU{2~GorWR-H&1ck1YH4@G{i&ujmRd+~wAW&(MIE+t zCYD;-9&_(6a@H8LSQEN^>a4gsy$uS&iX?Vahpvy!8VFh&+rW_QxJ|ScCH^D`54@Jg zsZn#a)jTHK;v=KLS!Y;t)P(`?Z0Xm0S1rF+ys&vf< z-08Pu+svEK^K|gdTzAUP7U$DK?-x+qVHv%hILB_JfS}mEb{YEfxlJQpDj&e8ueg90 z_( z9_y(~Bkn9BqU2RyUs4k$a%ZxoplV<338n-2CpTtF>X$Zgl+YD0fWj~aJvJ7G7SYx1 zVgnGou*~yqJerbi1)N_?=|LXB>p*{4f4?9pcC#mVv8&Qp;#wQizW!|5cPh$8t9g}G zvYJD)2F&M{eKTl1xvybYL$6;Kxd|;O_Jsn!VVq2ky?Rc5*b2Q#xV$BwwHxN-2W>Z= zZCc*Y(7>V<^!0??sTbPm0eGaHCMV2s(Pm}Q#LH244j%T~{ym#{KtdyU1Wm4n9q}Q( z4rlFxovVG3>^9qX7Aj(C-jYfRO~#x055%3{4eEzySk1+M%UWgb3$jrWy%Al&cQ{`4 z``TX)!IkH0l(*zkMn_ev87R!m^y*W&@vZs~4cV8(m~jwh)VVBkR2&(%ad%k}or<`B ziyG*y{FMkkSuItQ!mK0eS)*<(kd z>32$uKlHdMXwZDV*4_(AeBF$j8ZfuV*VcK;myRbojdAHtO>W?2UVSN=-5qmpE{LYz zD2NhXsCXJFSK$rjFf9`X$O={z={!y5VNw>KE>RY+ljaG$dfB;)0}*%|K(}4al+-zWu8lG0<4a+2=HN^Ed7s zjU+aTn&Xp8lHFqotFs!WAAL?^2c;O?H?gp@w@YH-=O~}Yrx6i^H$@@A=-N`qx#?Mk z)-IFj^r6VJKGMc?oz~egwfFtWf#a6@QBZ>ko?|za@TO{*$0&HZj$xOr4r4eSOZ-Ii zrqKDFEj#~(vJ1l<{Ogvp?xJifz*;7*Y>_!D!jJn%^z}sfLNiHS;ydPZsfL66i-;b8 z<+}S(S~$)>wT7Pou?%Gc{Y$DUps0-I?d%TC$U-LS3i+Xj;?5bJ+4GTD+ng2k3y4#y zp1EH~ooC3Q1syTxj!jYbYXw95+4whMb9}(g5=j^HTle$+NLPRMK>o}#k>t*TD7yBV zBSNMN)ksKk*ZJVm=`mk_H2G$}qVz1RSto)i*z*yM1nc&`LuR7X(*x{lXFoIBvs+j1 zSl2#L9;BM>*5qT6a?f!)aF&^c;+=jG8$1+Ayc~BGx>aleM+&fSk%Z%_Gpu_5e8e3^zqRTWxJNeTSIc(%YBc8ck$!Zxc!5j{qG=!4jyprQ-U!X_ zAFej|bQ@0((W%-WnE_D$=af+D#q~Kfc%!&J+|<7kO&r1mBvN(QavSNds9$g_=0~-k zMa~_A_X})`^8aL}AljKhl!1FfXpTF1=Fs|E%|#p$rSOMAKS<4Ljtr1Vk)m7Y4{(p! zg*o_;;WDFqsP1warb!G9ibMSI-;QL~cgj3QJ~*C(G5pXS58piZp^8Hr&X|X1 z&V9(fz@LCsN*bt-RCU$8Z)iR-!B#(nBf9hHSp)=tKV~NGdtF;eA^R3ujUND0S{2?- z$YBy~v8564@?4-RVwHqDro3ctVdz1tB;GA|6|N};DY%==WgOgK9FHgkMHr)c>Xr?; zZn)jlOEn%he;3j#?V4#In8m`P*KZVZu-4vKq#Xrv+bk?+2lh7s>-_Enxo8_lLe4vo zCw(1UFI>+~8L-xVhsF#-n#5L?*O5E*q9~_bs%AYJuv^^gZZsY(;f847`6$}1fvE2+ z$o%0ZzQ{&B8V&4-LH`(ZHQIj!g0=V)WDezbHlBHq-z{Coy1M(0^c}L(-Q%!78%LPU zCHEmjBwuJOK{AC`)WRUW13_{zIBXzlHBX4UpD$476m6R$c?Rpz!4`=Q-LEhPLUR(K z4V4`A)a&41yAJk{54?SfpIz~)7i<63%nv&t0%|iD(C$0Tluae<6vjL8#3AgB8luUT z0lVvH%-0f49G9de9Vqw<;*sNg* z+x$O$6ngd8g)!$PEyG_%@Ck@IXQIBJ=j4f2^JNit8Tr+keJn%43@5g+QjyJf67N5o z?mWdJY=jwtXnAZWr+#`y{)&x)YzN_0YuMKTvLGH;yy}(OpJ_A97hr<4O0@zDZ^rCG zBc96iGsn<+*lj(G0p>t7aT<3`f~p|HZO(&AV+8w|_kpf%&@^SXW_pj-G=I$o?FgQm zXA~dE6?+TN8m)S{CB>MLJ^fxP1Uj&c5m_@QvEmXnWLG_BTem!i&>Y7>XK!G49RDZ0%tU>3b%%V1 zfbvT^hD&_M^``8kR0jFzAFO#CHxgG5X82aPzoY3W>=y3h+8ycBWnIU7r{h%ztTkVv zw`Pc-{g2N|eRqrMM%<0&)zs8yIA)&dd)ap~aGa#(>OE?5(;l?{1&qUfM*R;34)u<) zpDE+gCbMhXBar6UF-&P?Coy1C(GYe}zEm`H9j;!`?SQBlhO4?>e*_oVz#*2l?-bij zWca~IqAkicjwW_{JNi^v`Y3GKF7Xed(%Eq#Ux%ISEx7+CyYD4b@0{;^S}iWKyH0iW zEAm@unAox(z-QC=YsT8?Q|~Np>rw5Po9n3{s#$iJJo_LnjAeBbbm#1$mEQLdtBtgB zy`_yOy-%3-J=f2Z&XyK7pU9736g?Pf2obdAR8uxYgNaU+xqbvl2qfFAb>Cu9m>~lR zW?~EkUl|n? zH;HV$ZNrm@*WDZW_s?W6Y9!3z?x!_}UHx6Bt6J+XVj7pdKU77((pIdstGoBlxTzoG z=yEa-vF2*$8Fv?u5wWc9gEF{sc6arYGMkBEa0E|XcKKF@&cPuveR0V7P0u=w*3`hV zvenGP=1G)c`HbJ)?j^;IyY3&;cetyix1g*2WNZHBm5|J~G0_ZJp>*eI>&e|{h`Rcd z$CgErQ9$a%?%XZ0h(;Xt$>p#ft&aQH*`b2=^YDZqE8vn z#PqoHLKdfMP=J%>_?+G;6)&QNS@Fc-o88cs>#%<;0WF=GlZb7Ad5e!_q)!)RTVb9PyZeqX{RJ@ zkYacnQZUB8#EbGsEhJ?4agJMWb<7j&Uog0CO2OX7TcDDrrt+l(5dS2lfyYwi7%j&Y z*D0OACzkTNe7m?(MQ&GAtyp4<#%5O?sC%#Nv`sn4QJ82k;W6WtCR~PFygYN^18R5P zYEBB=Qz1m95SXJ?jJlsX!}0!ftg7Q{6C*Ae7Z3|35AYZY{mMr$T#dN%Dw`mzuzw8) z3EmM6Kt~@v9>+S{x~D_N5LCUVJL=9T8%_T}a>fd}p~izatHNDIlRM!jjuGE;U=P2< z`aGQ`G0DBLyiGF4-9(l19;=BKJ$?M$o|>1<deme}Ba|rUF<}>#$00`hteSI8}_{-}9FPpY||0O4X zGI|#1A}`(#Vqv4~UMwZlAr>*Nu)*Ig@8B}z&dJ76Z98~{r^CMe5l>V1qwNE9$7j2L zn{^7eK3|YWYzFvZX{!y>xmp+ai>z731u$_(p0o3s9Jkq?Z0{!~!wYbrUdULd4UQ7v z@_0WuG(LBhmtgVY*wdO${TeJC)t^yPlrNoxedO710?(09%u-yQ9HuX+X_T>BwGtq z&|&73;Pt<%vqo2K5x2-UBZ&vgK^<(Adk4a)vA4K))gU*&t2_v&0UMZyWS(d|`A~5& zck(j_(*em4b*<(LA^!&W^+Ep+5X}&BK;1jt)gNGx zt>IKb-1nU6*Fjnyz#bs({*|8(paHohl6ugr=Jg9;jXns@5Ot$TsX!ssqJBC@=HyZy z#aUsPqPa0Pw+|BgRzyhDdYoGE0R5Xq*d4_nU#D7SwtF)PyIM|aTX8l_g9lQ1Wc2%Q0WxVV9B=(GDFxAo4^IJ+WYC>P zs(xX)|G_&pIcA+5gR+XRYo|tHu73eYnF)SA?%NRyklqLhZ08%Cg^-e;&hZ!CKwF}| z?Gjta>nDhuLjF#9U8jAg@xm#c#67&2A8DTNG>zofkb;Z_WQU?%tnVp3> zg1dyO!n_c$fwJtu90kZ5C=rO!A7zt< z@}DprhbzRn05HX$yqA7@g}G199Ubm4n`aN46J9Ak#ZX_h}2ha1<_ zUn_JWR+Lg=1w1BW<11__R$ew!-AP;>8`>-{H5OyNP}R$|&*moB8%S>DMTwYkdw?ae*x)RnFe%8*Ru0Jb}3Jp0|v&c8)v!lbBwv?KErlqLJg^hLz_OUUh)u z>7|(Sx)AWD}j=^H=b${b+|w}mJ<>dq_@QX0la z!|)F6QXldoI!^x=@R51vkKv;jVK;v8pCBTuo};}hDfH2|h-d!0i6~m;Q#GZ0^2H{W~tLl2z-e9pzkhsimjZh2RUTWZfppxrvoS zQm%SjH#(D}iSNHgEflRLa-BsZ(ZnkC79m9`S$|hGP&IGKxVXFOSt|B^93}6nNt5ZI zS75KE)hAcI#(3-kf4TK!d((})@QHRShCZH8JLUtN<}z_we1LT#w@JyxJJpv4NtvyD_HS>u!{1ob*XeG#z!f z+{JC&*^YTv1Ce-^GRDPG_h+(~v7JVFp+()h=Tf?e*}Qd40)HqBi88&W(V4$PJeY{WRO=z*vef<3= z2O!Q@X|YYeHCt(7@;Li4moKG^?rU*G%L}NCO__e-A5Y)OFZPMtvd`ckzc_4doYPNx z`G}VPj(D3fw{X|LU}1d(Cp^2iy~DFK$~UC@*HRaz%B~>?&oW zcFfpAEs&bHEg9v7SXz*hyA#`fe*5`|7@4`wh|%sqeJ~@3!?mKtHTqZ}swjry%AWizJpG*A%+n)+B_SRTK<-4mN4zceJ!rP!DP~$or(Od zrZr-AP~({*P3rG>!{_xN@ojYr`91_c0tGCSBUS0Iots+m!M~yp_~ZjkXb|`dr{ZqN zyP8f0;6yyk23@MQ8J>_yW-&waZgW+6TMs}l!nP;MG*JiGK&HfNO%E2)Q)wfIOFlkB zCHse(fnhz6A&w)dd_53eCp?FO=vkr0)B=BMK}F`9CEyXOWDGMdMA;TDgAgV6gYaWp zxLh|mHBy9Jq`XIfI_l3tchtCv7j!ML(R3Jn`?^abGy`umnr##%(si21;sso2QLysbv<`+hfz(vTF_DFjZ*Vv z@XI<)0O)=Uk2iUj470=xjpA8lbi#~`ab7s9GIOaJU$|(s8KU)6nDG8)j81rJ$_#M` zKmVBKhS2l(xp5ko0u@9Je}dVOA33?Jv^uQ(;@nbzdVy}%kg`P)x3N|)aJ`Ugft0S% zz&6HIi|e^u-=4dUaD7+qI>_~!T>WWW&&^$9>DXA3y9PM}V3{wI7P03a{y*EjJ7PNX z&W@?M7PNScpjPXigU0Zp94LmD4#8nK=!7d}k>Z%+nK)_Qbe3fvcpDEPv$e^^8M3yn z`Zp#YlUQr(w}nKR&a%v`lUNB@TV|En&KD*H4mphi#OxmRz-oL)D_ZBzvl>rug_?S8 z55Fi?=UY#1XkqGe3rc2b15xVUg#xGW(m_}X2R%Sq{cX_(*RRtit-k~(`Sm;VaEA!y zXVX=tu=Y3P6snZ>*Akz-8sGD9DUN;Tz}ofegevQaeY%tP0WI%+73%%L36QBy8MDBw zWExNW=aXRn{#_>_xn(Jnkym4}pK8Wy_&a=1I@cijM9x~~ZCW!^D`dFg&7G<#n}-wj zW71i{-@U z?mF$s2;%!dCyB@n9lurL%6y|lLHZ;=`kG$ah2Fb*R@I72y7^4qgc-?aFVTUNx8#Bu zZ7a;B`rBJPE9F%ojqwLypJADI7KD*%tXTqfC2vuQqmYg9NzS}tq-T>GYbw0?vl`#x z{i>JA*~4#BUJ&%DyAV<-PH;PZd zTt~LKa3CGnjo`4Ag=w*|+ao##j;v`E#NDtxMNC5dnAvW5elH&O+i>HjpbnA9Q?FKs z1KlC-yi@+XdolhI3`{vF^%{l|4Oy+{&_WTG=Bc7yKY#ZkL%Za0s-g^(T8*fn{UtY` zlgg_fi~em{UN6D;cVIQQ1CM_MMFp&>!NRPkfrlSyA+0AHb9-M~nmq=opRB9I?$A&H zz?P7_F_1G<{FL!fCL>ShO#V30#q+SA=yw)i2(zQ70$Vd-nkB6LsU`lZm+Kb@&0z9^ z-G;CV=aoS!HI;P6L~*JIxQJ*xB0aP@_K{3tDV`lY8v0t zf6f|n>H#_i$F39cyn59Z{^ro^&65J{$@G}?DI_+<<=B-wu4qTO4*#DosJ}lb0_%7J z4MqP}t`q$?iXO$7Fv7NwfA(C+&`nzh$EBWsnQ z?`>zf!6?oN7zPYEyD8n(A@d1y8J z1K|=}T~qVGHKt8I21j`yGw{Q+b4yb2JgSi% z?*fTXnbP3uX9O4oFU?Jrm3kdvOM@x(*N_K$u;U9g<<1Y7a>wmvxB~9IpVx~1pr70G zfgAXaIX{mR&*jteFvDFsDC|cr0zl#%VXeIykcg)4n-oobJrhqQz<~c;-a=#X)K_sO zcq^W|uOsIEO;J4c_4Zi8lfy>QXR&>m*+|%(T{wC@XFC4>Bmb8mcn&{OF+I*%_#U(# z5v2h1d=WB*|H_=ZxBz;oj%cd_IbQ@m$D^(bH6EPVw0z=4e)$@_2(7XJyc9sabWbOe zr_Z3i^cibev{9|7Abk|fEXm!>Ea8q=HmEasbW@q0RSrJm;;K+yUf1+w1hsUs|2?(8 z>w4CFy?5gM6SSh-K1?@E52Nni_OqocY!ih@sy1yMquD!<$&m6+Q>(5=?ri@zv}uUe z^se;FkYerDEooF;i5Bd$5`KrsFBe80iT3rUxR!6hsrS^r9!U^qYTK9f4A~ojVSIO$ zN2nta%%e1w8WT;-Iy3aDotkwf$}59S+2%P$HMypF?&pP~p#m)xg&aUTO9$Z~R+X{V z%rTNZ#Pc$ZG#b){o&Xpl$;A>>Y|=oI+n3@Bdp^Eg1U?eJTnN5gOc-2`Z9mQ{A!oBN zKOtm7zRfxb5XD6j-`sAlPK2D4c;qmqoT&vxm}QqBm%C^%4*0vovbb+P9||0eCfXt# z?$7dB>@yHNVWtJHn~8cgf>+fI9ocL&u~tpXI2ADU^;3>opi+@DoVEHq3^fOlvxh?{ zv!+^rW{ShWV}95%FGDJf0|V&1D#drHcxL9+1CS-o+6uNR*iU3BUBF4#dzVC`f?-1; zyYaG2A$d3=2@)B)Ch~FES!rJUYU>PRX;FeW02G=Emu0?QrKuuban*L)Gd!|x>4r4% z%x)%NxD+PV!#OrL+hucuxs5T+DN?MjbF7s{nA*HX-M#0V+HA*B=ufh?X`T3Au(r8w z*xKfOqpWQ%Hr6&mhsN4QDT21!sYZD%f!sUHYI<{|+-Xma(dwGXenynwRz)h2sCf#N zA2*eSn-`NGB|qI?j46rV+16WFwbP32tR^WzGOfr}2($5_`Gwu|*Jt$=6W$#Y&rIe= zFec8*+`*ydlmHX5KH|(nPbjXrg6CQ>;h#)X(Lgpl?T4Z~tQAM~_3MAAv)O8VjvLG> zS3V(lyR&2e-ZNRQe=vZJh9FJANV@&Y~Sk#>Zqtsq`M0Poq>+! zty4JEtGbqrt$M*ZV#Qw0^)T)})c!ux5nM6X{+JhdAYvfyuKZW-=;7QbqFPGJ^;y&X z2zL@%@i55cb*hKJl3RpeD@8nUSs|$={OpyIK3fmA47Av*S89;G??qq+K^U$j;N%bW zk?`st>dV}zFC0JG;5vTd^Z13fVj17{_&JZhYS)W7`YQOd9KHxIayFYGIY&u)PzG5A zLMXxw4#6LqI2Zyng7Hbx0x2pQ`2?I7bNX3_Q!`4!yF<{|MC&?)`YXTYjYmj?R}yj% zr}c%V9K&L!A{00l3miu$>>XD_^heCSyCUxU%}i(NpJO4i#Dbh;AIju0x23M)5*Guf zoo)2el-6MrH)9u>+nA~ZT*nf7x_%{-yQ?07bHT1F&^lxyxI2>AdH#OGi(RP?Mj5za zN;bRiFcKzs4r9M3H7q1Ui|hm2Wgpm1AbJehTCly8eH&S1@gvjCs zCD(iDt8MQQ5ixhLT8e#{6PymU|0S;~-X(&4vzbi_9q4Ve3KSVe-o&D+0NTqkCoqM` z)nq4C(kZsRw$bBUQX>*|A9|2W>IfL4%iAO*;DNS~Cl$Cw+Jb2jW<-<;))%*H7ZLj? z^JUcVA*ZpM+2y>EhxC`AVK|C3Z!vfFT#g1_)RBbPC>H3JHYWEWFGWf2BeYu~fHkB~ zCJxygar$~Tn08xb(|{1c`8^E~QsR@g?;)>a3o3H^A>{awJV5)(-sr09O&7c>pU1e` ztRnvKwzE}3RBVh^85d(ukDY0@mQ%4t%LA!0g+%Tx#CV#Uxj&&1Y}I7gZO}IQS*htW zm&vV$O<6LwY5a@-n{c1e#8^<@JmCd)0KwzMt&j0R?pe)iSE!99#Ma<|(kMABN`x1e zw+bFH(~I2MsrY@6jg)3O*J(=IIVdA>XNRWrmbYb%vsU~Bw=g~kD?d|`S-J?}o(BRE z_n}R>MT@v=*Xwi6N^c2nF45Z2Qf}I{fTQOeg^u9l@SlU)OTq|}<46cET&d6TyY`>? zMMAYmcyHcZ4dITZ=OI19Nas657O6*|d)t|a^LAYMvct}J3~2FV$jW@Kh%};KG9(SdxG6*UQu~M*A1GSjUtuIis9>WB0tTNJiXF6fi6nf8&|)~4cD@s5 zaN)Rn3xn&A`Suw4JDwo=SoF+IiPDFntaZ*f-nV;Zs`w%0jiJC8r{dO#SS=OBZnUd* zH-ePxPCPVH{;MFGIqPu)-5{?XM#OH^*ytl_DLLMb9M0Y#Ztqf`1;x#**CIHFHG~r5 z0DnUE@oT@y;>0i$Tdl`RRlv{}M^VeLg45W4&W{aoZ~KUO^5ybMc_KHcYT$^pnjnPR z%Sqk?e~`MaTp%?`YDA3Y#Bbb`@Lz1QLAAsJEwYMul{X;;Y+_&bA%y!&9Gzd__s)V? z;3Nudb&<#UG=spV**@b%Z3{WSkeJ7F)E+tCEV!Tiz%o0DoZ(Lp>w(91SdZ;v_OMy9 z9-|#|8KlZ%+r3MqSdX=tOaG&);5^4OG$^d8*Rv6>)`IR6u3cqWn#hZNakJZ?1P9Ek> z_Ac;)%&hk53<+-N>g-|`~R5~4m#nZ9B0l}rO4j(xRd zihN`_0t*-r9B*FlMC7=Q5IIpSwm;gkdihUz5l_%dk{}{$EARX5)QqJg^5IT093K=@ z$*A0}@x+NKZ^ek|>0}52CDm)+5!;;w@!x?R_H|IAXAo0D?H7O3tbZh-ctz1O*h9BO zaC@a&`IKOD{>w<>GP`M#0Lf}T%Jb*&Cg5kUHoC#3pvk;^Fe=D0^TY!P`x1=dWc}4s zc10Z$#5C|2EQeH(axg`)n5_S>b5&fH zk)p_e?`Yyveh?M{FWH)J*Z6$fi0Yb}aRx&#>}l;m-xANGz@xN`M?sE=GV~MF3-ney zCrBSi1-#HKS1FDwb2RiFNq3i|kNIMWR^-3w%}}tY*ID4eZe;9@yO!P9ci50m=eP#6 z$TfhN(L|2TxdyZjy9N+18H!4YuzD{L-Gq-kHl~VIH)WTmc`{3C`1g06U#q#zU6B9P z_Ufi7%nbYKa5%89+SiU+0DtjLy4fKI5$1S=KgDKm^zHal7@uJT($20&?5<Hh<_oR#*x{a_#QcR68JDh-OpqtMDIi7bg&-kX14YO44i*G@(}PV4hjHEyV(yo zOi`l!z{%JeOI)U@i)$8f8)62{I*Ve+%eR-eXfLo%Bj)t{31h+cFsa>UQsvQPs^AAy zXgq?D10-;+Ip)nMR6J7}3cNHlrMRWEo=>=k0%>Az7e*5;!&BP+U!&aNm4_+!t434q zC4#^rk8=fD$xHYXdA1SKEHOb-%7*Bc(Wm3y zy)YKe!AIEc!yx!B?oi$y6;IT46p+nrQ%H(!E94bawMpnHi6yj)a&16 zr(Vd!EV~j(f`b+(p6==;YKl|eXrS55S8zHOJGMD52qNh052sd%>`iVB(Ntc|&6@$)yuezC z3}6RP87U65%t4)XdS4h5$CHQq4yC(&#t*JpAZCAapJ{NcTo8X+PdX!Gi7k;`eMyM(`ArEgAoDdcRGyg(la`?5L8 z9TS*X;si@~oc9e&M7w0)LzLEF0*j`kjjg{O9i+r^;%tsfisH_LcW*;JgTC)UOG^5>7SOggO9_(G8feV3RuBk-Z3kN#wt1aV{Lcs_QsGK3dIC0KMz-|TmKmB+qJina<;pD`oB3Lj zUOg0KMpEGlP|{`5#5%1}?9QV%VDlt>V#s$)`|h*03yXVZ=bZi5O6eVa`uaZlh4TTg`W! zc~GYDN$%ue;GIt3>Okgm$U`V9!R0WP*k+itQd@PPG3?B(66%|QOFv&K=j!sQf zIuOT{;3CecE2tA@|kfU`~*?$%fh0m;r<^I;luR!*i48=|ECa_CPGx4VgVjOHp# zEQI49gpityFo>zkwm{NS`V(l5v_Xp#@(@ z%2dwjdNO~1wFIMH7u*f10Yn86T4WaeR{G+32tC4ikXzvuFQ7Zb6|qz57tC~8mKB0A zdq0aThi#}+)A;J4HX!-Ik_*7nW09}mtLL-3+QTdMH_2J=>AVKmzEFoe@2n?xb)AO% zNFH6LFdH0Au{+bx(~b@wTsrK|(>dq$-9|dKjL4CO-pF|&Vnx)l?7c&zM(@R3BB5;U z9nXUyGGk`S|KZ#+SZn{0)+33vnsCJ0_@Ozsy3<{}h!ccFU3w*FVM~sFJUEB}e7Cy6 zXkh>SZ_-EN&>W&p`_mO_Cr6fxRLslIT#FsoO^MBpcJAM#$91bZmb{#-#$ACM_x(&UC16(fvl@` z)7Q3UeVJ!}2dPQg(d*4Z*58AOwanCL*1quMx8vo;buPQn2D{NFMn>A1RwL34RhdR= z_XsKUUX8<^-!>~tn4(#dWdhB?uxtMwzp>ewFZ~WI6E2P>cleWG|0FdNE~`XeS7mUS zwdR`~jUMvw_GltpxmnT*1i2@fMj_e2?#xY?`)saIapF+sf64Y|tx%!HKY2t#l8SWmSqKgvGN209IO6`asvr{)sx z=OGQZ_9-$}nZ61V?Pu~@*xYxv{KF%kH3ybCnB3wZGQA4~J)ywip5^M{luvs-)CZC7 z{KF&cp~Nn)bDCg=Ye;yfU0vy8URrQ_wU>9RC(sE7go6{{{MTtzq3fSiZ|dJ4b=S@1 zo_xuUH{9&bR8A6XYSg~&^>Ofc`~s(|Fg&}|pO-%B4+z#7iaGuU_e~&eKq8r7Ee0Ifo5>AOP25vjKOf)~Xs5!(H?hfj&2#c;t2VllWN%%{1?Q=UqRN zYu@|TpYV~z=YM43|M*9gy5yXZd|5?ixvV3ma>#YmC_;fFObia-nkA7gX38{Q zBPL5R)z0~ZQA;|mMksOJ52y3%rJo$4d_5D8;5GH#a3-)sP6Jz_Dn(Ojo~wpv9g z6FUJ4a_x5qH5QSOV@@mFUC`spz5@l9zvlW#qVZ8)A&t?Oz9_fciQk!U2A?CHt8sr@ zIPd*Dw6;E2^z5e#sWf#*b_ihcc3^Fk-53 z5PR7&*sun)!~{nPPa|KBwe{wF92)q2FOkmzdk`SFeq>x>H4+JQIE|0I^ zzy8BmBvie;>;pzFPWC|QTm6s6@J0i_7m2$=J|v_lb=;kSt2H~B5*_c*^L{Ql1P-fgAH zNipBumGWeX`R zYy9T8 za7*(W4=x?w*e+f$wxhRbg1L%spONw>jmIYP>|{>?ZPyak?a2#JTOo108yPUbZf%v7 zOMQ$;4p;mddTB$;8xe09K9jbN(+ z*b2)Ivk2HKBW^N+OkgW0*a}ShlVM8&&2#zJc407}EEsVLOCBD{zdBn=3e@yrr?H<( zA?F8W+^51M`Di?@w^FE88z)g_yRmXVi%amw6d}4&CIlH0-w@f82+$KtnJpbjndn5Y z0V$G0d$1#A7xYmQr<-l@Z>Z+JJTl3n^F@*Pr!~!~0=?fY8<9+RR5*!c~Q1 zShh;Yk_&>@TeumB$aCgRYl88iQ;nPW8CE1Jw>6qkKoFLCki|mBw+n~9<4~!YuYa7k z0!I~8nw@Km=;7G@!kv@fc`6m3hG6bvNI#u{C^_kXAH?4Tq#%z;SHE&J<7k$@q|k{^ z>;08eH@SDbn4Hu`A$2?n;Yv-|PXcs+JKs%*Iq)%kyj!|Up^f>3WvKZxj0?St(y|mw zHMVFx&hwcWpB=~!kE{2FWVX2GBPh~yl|?V&n}^}hV4`!qn0a&bTfR6hYkWw7alMw! z+`QYwe983fsKK6C{~41wsXl>}uFTKoW3qr48fK_IjF5`hC6L=PlwpEqA|bzJ09g%* z?r`#0CNclhgJS-JY_o&aDLjC2^u|lidMYiBYOj6g_7!wEH&Lnh!a;@Xxt=V$rs>P^ZryT6eqRabgn~gLZW;Qcnwm#ApbD!D7YtEJm z02s%d62LiVEY`LIM<{)dBZxprT0_c(U-w!=`h4#N)PfDtOWB(%Xavj0GMisc8F`dB zCo?N6WC8Nsa*1MKmF*@~gNm1d-R>(?=IXm%xfi^_>CZgQ6Oi6t7vy1{|7BRTV&KP2adc{gG-XCN0*NP@>9sUw11A_|==$d$Q3bhNp^|GXTRIGt_DkJP>xiNCdwYA!~F&Ovs7eNh5tY7=X&Q+R$x%|1{|3`!O zp{~QldK)C1BEj|Hf)5XlWU2--t8FglZ3RanzjrK-F5mGDK!sB=h=Nc1wx$w{R$(>% zCHyuuF)=h4L1{CaBUH7MXZ$rYu)}E34N6M>tydcmf&;z|>#4TtzC+mq)#+}0nBiNE zKt?P;wQo1D8Yuvk*R}N$*?O&77%d;CEfb%ER>IXryWgy#Hu>91w)Ot4r{6YnCb{n|Gay0W&P=K-}$R{!2!kLH*0<=R26C;aIfgU&v zoe!fhdk*6tx`ah(ktmqtBw|iO&Z~p=3$Xhik2;7O&4C~{F#PV#aS;ie=D2|D%{bd2~CbNH1qW%2c6b;_-VTAnVBhK4YB5|s?*CRSM{UM zjdgS#>kU-(gCTYGzN*t!?6mVDmzPTUGKS03y%VOiI0Oe&Zc#-J`E!xRA`+a&23oF8 z-5Pn#LmK}MQS2;$>#12Rb4%e3d-)DSQ^@umRADuKfjS`vzyUWn@#zTJpxW$axP+{y zY-wl<2i0NtCqHgT6$rhii_j|b?P~hWym|BbdeGnXT!nBTK0QPR8f#i&85k@NqO}sZ}(ETIFfQV z@x1p#o1sKhZK&i5Qxb7688bJZ^*)N42z?37q~eQFAzN#|GDdI^&ugmYg4ASA=3x-j zE`)_};|q~9JW7iXr^54x;FZ9QKk3$I+>HWp@($}bRupolPoN!61;V5x#Te{{FhW;S zCpbT7pnk-82jAc7_10FRh@AGdE^pOL`*ue3!C2@uMLm-*+AHAf%5VwF5L zgFjMTh3));rZ(}CY4q-eh)VMskZ-o)i=(bo9l!|i=55x^2QX<)9D^>RrOeFz6ZRaC(T+bI>7Kq*R(ha!G}D=P8Hznp-@O` zgFHl|p6oBKnaK2saSGa_Q7BJ)38Ul?*u_g;==9YX(X zFM7?ain6_9c}Njz#n}UG#&fZusx{;sb6z1hJ*#9xdZ!uNhb&^ZpQ%l7%Yh?ihG z>Q0{!chZ1J2<*QVWR1CnyKI7u)H^i?GYh0FnTUJCQ6#1&Z{K^dMCVYOxR(O<*`i2W zxa9q;Cj9wz<9qQPc`mgc?f9Z z?1Qu$7tA1^AxK^NYjAR2g(s*$d~i|K)H9a*FmzrRS^O$Yfb|Wl)hUUUScWnfAnk_C z=iW5lfl`Z*b{!c5)8JJk>S+o&)X*E5Fa8=7Q#aY{E>>PEnRSbs;r{6}y9%VFHzNt$ z@QV>}G!u26NIWf>7cB1tC<|4+YOVVf(9Jnh>2yV%cI0I+J45@?dBymO{+KEe_ha=p zGZ%E1M?d0 z{8O?{o7EhjZ#9#3v2(K+(dqz}f6d0+M^-;53QV;ZtL9bImm-3)ecP+TwadmKyb3#K z*zHcZEKB_Hu%v#ak?c-eKC+8FG0Z||UQiwZc6Pg#GE{ZUTKh2_MtHi0S%C0dnB>pt zOmaG6jw>n#d7b1M_<==y@kQ3weB0L+W<(d;SYa2^^WMvC#)}zI?}c2bs8u#{Eff*F zDL>*nfUO&LiBLFc983FqKc^iW=OY*rc7jWCgq1H|5_3#Mft>x8_bo$8VXCIS4B6h< zDb&!k+v2tRJpCte`){Dajr;}|VJzhun|LL-nq0KKf1y(pN=c1i&70V+2qc*w{RQLl z-VhxXUzEDAI;A%B;_4E2Mn10$%FXY=XY$?U=7UC+%Ev@X92v(g!h}+0kJF}{Y}lN$ z`TnV#S!LqKQF=J+^w)gKd0-7ty}T!n6VTXFbe_um#e#t>G5npK*Z+r6?|eu~7Dy-d zM^2vxen10&o=P!mOE4ptgJvpeG*iE5+6poYBxT@W^eSJ!l?!TR*1v$Z&QYaD`ks*y zbjW#GSq{**^|U*P!*FJetZRP%OLNO<8omNqsA3OCs z+xNph>On*9fhqhe_A&34>MH__&abwAR0_;}oY<*v*Q#oAdxS(-6WXmcKh$Y2fL->Pc-G|Gkb2*m#g-&e0y~}UAKRVae{p^J+ce$W|=V51)yhi7bvjSw!x}1)XlP;I=qL=jAR&1vn#owi7F<`~W&NDbyyimB?*2NUUA+^I7V z6C?J+PCr~W=>KD+q=@K52@s+{83f8O^3V9X(AA;`h&m_9pIvS@LwSGzexUA;IIp9~ zSKWEYb?}tssyLbX%Doa}`=h?!V_*)4D<;&KE7uUitOl-}Jc{rb=4Wn3wo*d%@pJ?r=%NQL%J<1^f{-C}|4LD!wB*sFAE*g^>$H zQW_UQx0*UK(;j7udoJB1pD&q>dbYUIXq<00y4%oHoLf0_Wz0rFLPL}ly6qO(2Y9P6 z${6=1G6;+?#+BvhA27!Klf#*N_KC*l*S=? zmU#brr_OLn55T*#%i6JQ;FOgKP#I}iQpE=-8!TXl&q&4gP9;Ep9HG^AvoLHCJ9{7k zf0b-2idMa4tx191;lQt>iT&}!jwuIqj$z=F${fW{M{(c;J5Bt{t2%DQ2>vghWkHyN zs^#gIplUyW3?ZnR0M{Pn5u*IJ@(5Y}rm5-_{-|~csJm$sCkOcSM1LezTpo8`M7ed_ zuyTvAI(63&XKLTDeiZlxi-q=<@~KPuw0DN~+M;lky%A?Rt`)KJQh0PWkw)ct;IK3LX+=Bg zIKPBNx7PNl!1;x}g(DFrs?R1WJ%{F1E4bwe`k2zV@0Vbg^4vbrHo@J)a(}>cS)A;L zGbdH0bqlgr81ueE=h|u+vbP$I>=$wKk0wsaTs|rqu6q3pr*?bkOs8}^(QSvo%Om3C zoFhf~?l zs0BUUyesJWtIG}a2twq7VjSUf1h9OAka6FIzmYtC?9Z^>Vh&kidcv55K=TSI{YVp; z?Dt#W_(!giH+$cItb;TK{&%j1W9cW zKce9<$@fHvY}(2*lkI8RH7(WFbK8lu-ECeY1nY3s5j9Lm5xO%%&iYAi7n0tuFuaSKw>moo*raea=%_ezWS?W z9uw%qeh;b?W0j~9=(LEQs!rKxe&FMNX-v$Cr}62}2wiLf7&rrKmkyze#VSdBw>-ly zdS6A;fKE~%jkwdT@Q_G3PE4Wvz7D&oomo{-4KZdtQP;_UG;{7=)`gh%=uc38=IYNv z{aI{XxT3s)_cE_v3ryp`*3FmXUFZDP_^rLjGaZf{6q9hwoTtpAzm}w)>F$Yfc4a;4 zgtubu?WB?M{DnOCpCW}sK&~v4wtYIX!oHh+XQyWV&UR*!77$_#>pW2sFj&yzk^BdL zzDXa09n#^(G}*qHSi0Xt{s}6Znz?$0Tug2&h+^3N_xKt=!MWb%)j~?FCaE|l|H0p> z!Dv<1T0<6StS6+sbzatCpy8MRnN-lB(O~Y=+T5$T)aG7qe*d}rVLeLsm*EsPSxG*J zlkp|fWxW?06zkiiBz=SS3CZ*?Lhj7`;|%CYt) zg;5WrQ)Bf&Y@2vUd|J%*-pn=Io5;kEaV2MNw{#`3Otx>*ZPoFwU8uk&-VJ#h9-!2A zI+h;sXDRcQm6P{ zq9SOeAa~pTys2J{$Pm{LA7jK${*io)Ud9Y|>xg^@k@HXIfn2VG-O9(v5dPBu<6b_-E|T0@F7yurZyh|Q zKTFy~F9j|k$Ianv@-apTc%{>Mi2l#zV?-!3A|K;HyzILgYnNmnp&&b~fy+&vx3N2h1Rp~Tp9gXYf3&!|*3e=tAe z@WXe>&p7<>UGg&yKOD}_sML&CBOvM{DN2sM&gEwum7K9R>cdu5{?AN+)%YH8p20sk zOkt*4h+rB~2s+UADIp_~caiHVo9TLOdFQNkEhnKiGd{3)9`f?QdV=K9IU7NvE6PnW zB1F5SC@!-}+u;S>rFk%kF&tAKM{2GyNsYL8uzW6UQ%}Md>U8rHOD(|OPxN%EaUpw2 zfw73+MND}8nI5{{!)$Bg<4NOGLNzbpEt==RiDveG7L2yg4xD0(FAWnRueN*%8UDg} zvQt7@k_KL3C!QkTV?E6q{5H9e?>aTBq0cV@N`y$+zE=p)d4EwffW~s?fW$(+6J83) zhauydB#qOB_RjG<@E{)nEXNR>b5TMAJ>aK{8R3|Is5Cm2NQVY=^Khezv)6gBUWJ z3Wl@B8_gsgl)y3s6R zCy=rnoU+TD*TeZ9G0r$Y-y@&Rb;Jmk4M)1i3<8e9{Jw`Zao_X zVLDyD#|0SUqOkKi)40iYzjzk2pVhe)NG)hE^Z%wVY~6M+hEWUeXLF~WCO^dCL*mEY zk`eMY1Kcb^@%7-&>sf|Ub~XH#m-ewbOqQT?b3dwZHzGZD{YmAZ8Gz0?na7_j3@#QQ zJ6UWn@^rAr{6M=q*O+_^?mw{ey_Jv@U`Eh_5vQ4t6KcMrFLr<0o_ZGRan| zbeSeoCMhx-JHV`D$RsGKRH)JTfbmURDEsWfmo1<#|S1YBik{WOre#97dggHPvq zx^~Y|{dt3VdQEHdmRXzCX{`NsXxVC23py5F=ux?uqT?`74wlA zAWrTMGIrcDj33~)Fh`0O;M4HOvVl4Wy1IuYYswL7J}q*)tNt0L7VGj&W}lG{XAzk~ z!VfFQSj1|41~rJ%V1`000?G4!rWbAJY{>UBp=NSK&2VntsDz&z*XtgerWImP2m!j0 zSF?7r2-u?C`n?@^YVR8R6BOni?(&kiz0ZtZRfx_`94j$&xy*}DV~`G zpeEhtMA=fQ3`>(-x=&v}**-U@oNS*Pen-QK?lLmlCw|TFCDxh*eKkXzk@~L5<|hHt zP`1zSK*W4!RJKoBlHE6GFlT?>ESWiq*TUv9F0uz85Xjq!I_tlX>Jv;v6pH0B_o8+`3q^r);(mP$4i*%Wj}q_B%fZuL1%yf zXs`c~9G|fS^X#QbwY&aM;KB1n;&_jYG&E@cpH1<3ogo{~P4PLIEXK^D=cO$QWO2{m zGjIRzCHbU3BRV7VC6ni~n{Zu*(!yII1kFQ^PvwD29ETabDVjJ%n$L~b4db74@_n-8 zZQ79|@_nkvgj7=L4E$b*6!k(aA;EIFJ~vj%RITwZwRaO)&Rui{OGzk7womMh{@eLJ zV_3kp>fBJUDseZ46%^egBE%rK9Q_-r+G1GbHOGH1MZ$s>6l>?F`?T?IUoZLctv{(G zweU}bOWrNvC-JdzmIYGwq?T_;qhcab#@e+d? zhCEy~P-k4?U1IeI$PbDy1Q8WHjXjw``;ee82{^m%gDrv?dX2%78T4m^nL+=3bY{>U zJcbgva@ns$zm3Way8l1P49Y=zPCn2boRW60LCz-aP485;5oiSOjrh09;e=_Ge2)Hp_Y{q>)V z!zK}x5>W-tJn4*&*l!_svY-QH>k9oyzL*cGb#F1k#V9NNd#K52*I-=uoDoJqN-N#I7T4D&dfx*X`}|2a#Tos82ohDnS=?f zoqV+)jkA3+55LaNB?R;j7R3{D{e6c}C`g!nHA;+abDUDln`V|c5q9*!P_J(-c{051vkvgIi1sz@=3D2Dp7DC>z_i3=t3NqJ@)eB_bj>N zE_?Zj*>~JiLo^@fILQQ%afh*i`6qk%+jrh`M>ORx4^P<5nEcKugoH&%8;Wb@Mv@c1 z^~Hj`>@~-4%vv|JV8*|s;)aD|3i6h`?}o+txxDc4Q)jZt{<5!?M{u3f|JXIw|4!dW z?D@jrodxjk?fIcp;m5e_Wm^?q$3>GU&X5~--PF_5Heem1X)31)ZZ+v(H z$*c=cEh@-sE6jeOz_cDpO+3S;_4MndR`Q!_C^hkQ3ZB7!EH8CsxA*Ld`|hX4h^rOZnj15v<7i1Cd8g&Ux;X8bD|p05iS4uV zX}utgCtk|V#P7Y#v6$`57UusIldcYWHVi~?)U<*LkQ_1>WoY}1Xgm<#`NaEFYM1F!;cM%=@@HdFYCllCS1x?xr@8rvJ(7#7uQ!{oV-jp49xZSSmOv zHJ9~?6k$@J1qxy$g-xV$qVZsjb^Rsf^kLap>|n&Gxii>D`Ckj8-B^qbAg+xy_k$-hx@){KD^|!gLSf(l=9i$Xk&IsVKVEh2@ZYpx)I-8axL#Zm49{A;GGc9E|KyxtlhhPuo?!`y zAf=>{0LTy!u>N1{At)?nY@7k!1~`m$%O$rFQh)j@Bdr_Vw`yKnQ?Aa|D3|hym78hXl(cJ*Bjd+uDr4R zP3~&2yBgb9D1)-8jHF6&MVt7Yh4lDl!JFxu*1b$i9>kz9dr93Pb>f+R^@WplF6RBX z>-=Bd-UU3W>U#LjZ9*U!&VURCAsQvA(HKC38XBWBkjNQHG+xjIqhhJ3wJL=fz$%(J zNhKVoQhT$1FSWI;m)dGCBH%3{1Of;I@B(5bK(%KaR4xh$5$F4@y=RgM((iqr_j{i& z&oepuy7t<)wbx#I?X{!sJ0+Z*{CQ^Z`*|hAAwyEThDy$PsNV!-V5}0`|9A?DdF>Lg zQTN3PoO)n%wMV}-4=Jr!tP)9)GZ|x1_c6}SrMyY~_GoDPCsA4Q-0pGLYygp}owM%P2+p4>0({*>GPd?0$tC z{f~VG_8qTd$~l;kXMaL@IJf{PV@}2OLSbmc({C}YwEPKbe3=;$2UgSkBZ^!0o5tUq zuLCIX`FS!g3))^zjvR@NVf!tecaVMR5mb6c*&_d8$+)djflNEEB{Im)tWHXLIay_u z@>uxF7>6u;ztr&JuwKoQ(12tbZhvr<@(i+HAvCftA-}ziDEldbV}X*Nfy7Mzp{%np z1`FcEOS1cgK85XUg(f$`dXodg6xlT8jor0T_Xo6_44E3_os45ewUqH%u5wCS-xThe zN(yPiZLl7+lZ!@wU8Wdq5w@tC{o{OzfC5g(kyy_kfvHNC3$~i}8Ot0C$lSC}y;N}!D$_UbE@XE5#6PI%82HV$3j+?_`LdwPE8~>UyEw&dlKIMyP7Pcez|!v$vC6yixbK zZMdu_ZADIhxt&OsMMY4@NDP=?6en<@E)}a1^%FT%S3U@;>eXXcJEdJ*3==9 z5W;G%XGt-Fhzj&Be@seM>xa5!WqSp!SPuA@nQ%AN2r@i;uaV^=>i!QfVS;4k0iGb?Ufqc4k=&j^{R_FIaDc_Ob8-udDb~XcNnPnlzSMQm-F^G>HsjSHvzs$u*M^vU@L^PEatcA^ zi#;iA#ko@WBE~Ho*Y!+ZO)T~%}%Pz|xY_XZqUw*9UHo=E{I*XJa zhx01)U%{bV6F_nKM?yR}Ts1TyQTgKPp>2jMZCGV0`><9QyF|l(l2OnhrfDQx1scOL zD+^nz=+4&gAfs`ybj(@a{gtIoUv)~-{FB3sj0Alt;<}8pd@4WvG|Xi-w5rZL%Ue(Q zQo~g~j83c^_A+NoBz~H}mnE=80y_z5A*546x+G+O;4cEw7wme#C}@pj#qmPr!=;f* z^N&e5e>H}ARoQ|&B?P`8r{Q;U7@G_@7sJNn=iSdJrTIKbMj`kXf^T-?uq1|?z?X9S z@Gb=J!sGES1nK8h`Cpk3K4Sn=iFP>bBnuhPfhcyAHP+{*xKB zy3L8B_+glrZLKP7i#59cHsh@1h*Qh!XbhKe)?fug@a!@h!m;+9L&MFKh-!)O==QB9 z&?A8pBruok69~zb5SQV~8W#AgK#VnSyg^UtpHECPK~?aQ=G?EEliR?qAv_t8Nvt$v z0wvJS{`}X8h)$@%p%+LQCkFlT&;w)HR^N)`*dGd->xDWPKRGDl%4gh#tZrsYj3g{@ zh3`~B? z*EO4e`vdPttHhh+q!|5D?V*PjIxY;Ybf{2ya>95@W(@SfR|7@ES0e-XYQO>hUB-o! z5P5>(+gBe1g3zx^Ul;n-*ia4qLW0Mjq4B(sv8877l?R%y?3vws<*~(AM%%>yW%HF^ zL)))BA_064HDB2)PJN!yeC5IBE02=?8{%B@o84TUvAB9jJYM-F+$5auK>o1rHkI0A zgsW6vvYSQq%r1wCs@iY*1S8rFpv~1n{+jR{injUO~7T}(Wdx`p(|wxHm!|O_b7s`%3haO?FD?PZ;Lgn zYnZG)YbpW&&PjS*J`@1C+3ZVwN7iO8T1{o!ST0+xQuq`5T2e>XgwGewq$S)AWS{jw zE_a!HgphMKxf*7bZ_`y2a*0Q(IPU?TK}$oXo9iz}sTlV)kL4k2NOopG|XY#VR61U`#1+KTTV%Yf+Hm%Kom z;TdFm2_3jE*-YO6Futvc?RB`I-@j3ju*P+PA@-jEV}HZHgguPxF@D}3WTFav>tbH6 zAd}fJNsWxFgZE^o1(34m7UepAK8lwy7I;j{J3;Dkp@|S3?s%A)dL^PaUx9r#-4w}< zoO(FPu568gs`>@b@Z-&tz9=BAsaX2$$ME7-Ck&(V8Q z!IHxUM_MhcAp1~<{R2@)R(n?6e_}z;*=`~j?uq(~rPGGmtLPHT`7(jXFS);V6hAS3 zwiu3;vYRj6?&maNgPo&+>AjTd{8quN3u+0i3vXAd8k>4r?Ggx*Nz@q_?1}-H> z)ScQPMV1kYrLoCUUT}SsOK;TnRt?YEAGyJDjwXfu1L7&;@|E@E4PDk?ze_QeGdfiv zEXk3#cG^>PGFacXwNn`o zb8r)?L2Hc0Pr-raHk$V0sN&L8VjFhwOc*34hC=SouZME?Oi`^nlBQ9)qwewj z`A+p&YrwV$Y<&+k>Y{_~C^GE}-=_M#jaVZwmW~=s&qv)mC{GL%iu+yMGJKfW9lnPi zR+Wtmse0(2%7w&?ae;8-ha!!Wmp9or^%KOt`NRr+4H$D1D&&}ggBp}e4McV;&<)Cx ztRk3wM(PlAkEe79fri6IDCEp1o3haeq+uG;aDgPMhQI(;Ry^~J1VG=c7C;GbKI6i< zlJf#*hg?1nxj*1z9}}_mKsdt_;QUF!N!U|jcPHdrPEL!f?CzHYDibIPsE-S{zXA@G ze)z28eZwZoI)e}%RjD^T|EOzQTnX|(#w?rkEn;6FcX6G zUnBHgUG8bU}M_-lA~nJ7eVmaC6SYYXmRT$x(3pr7I-ax`-){V*8PF8Co;T%dv)HW^pu$-oQi!GV1QS5#Z5beyFB5dQ|?6q(?M|8oir zQ>ZHq&1iS=y{eEAt4Q@Osq%;GRG;8q&5zRVrj;4wHHb_4_zzOLpSw=7);V5Q-}qNt%x-M`1J& zn|^$xwF@*p?p*bCp>w;_{m*M@a>hX?BjVkOvyG!gtB9q~zY6C=EBopbI2FvC7m%96 z`SBoPulGQsP`_`aKc%Bw&JrE#me?01_U!)h%~Ho;qS=#|I`&V;vB}JIoU9AKi}$S) z@YegQ;+FQ^^ExN4-raLQuHKx{q-{U?$)Wb1okec}puJ~&(W`uoMkH-X?OVS1j1Wf6 zGmIM2xOYmL-n#r^$=5Uf{GEJ_M%mL4>-s$0Lhbsj^MfUmf`)_$nAwY}GsQ!8nE zT}7w!UA^bP^EuK!;wXwL++1BMbht`Zi)YJ%Dp)zOYb% z%UacbsAl8pJ?mCD7OR{!t?fPiBQV|{f=dT?ycG0-h1N)!t--gK39?8)81RV z1Ayy5dduoP;pg)Ykyso>LnJm*yQO_+?H;~c#Vt7QY2R75x4pM!bwaVyH0u%0wnysR ztK_?7-qwlj;hpa3;^`?^)xPCu(d~l9Q3lq%46ML7FmZlDe=weQ5o7=OV(FUxn#k_G zfBZ=5?K<@ZJ^;=ZW^8iDRiaWPH7fgHFAxgEE4WYb3cC(&Yn6QY%v;y|k`i zL>WzCMF0y# zM&tGv30;Rzlh7-OhlJMfIgW(hA~_yJg+h%;nbiMKup-VsOP-MP7hHj%h;I|k$A2Ob zt{mxKnXIp=@3)C&n+mUSS~|W9A|r%V5zSxgxB)~nRi|^lMo*J&Ao0B5r>Za^p050L zIz^mtLQIb*o(cU;2KRE6q0Z5wzBQ1jfOH^bTLb`{*a`Z_&?sjdsyv8r2if zPnUa)E+a-qUFUzz&;b^mzcWYYuWJM0F2WE37raeXg+5cU+D-gEB2HEV?pUx4B&-PZ zP_nLuy9ba|OOf3h1pEN9doQUJ**yTiHhZb2x9=gGXY3jvZhyD*czU~C$9_dldyK>m zq_@u#t?2Diaj5x#LssMe9eVpXY2)M0$Iu*7-H}P$lz3l?S@p#{kT=Vq>^HQuD5&yGaT{ z&8h@ywUoT>3>9AIaLG4P(+Ry@Pk6p7hFF36)*cu@Z}+MKp|?j>u7UKneOv9P?K^8e zhU9)iGv*xDCA1ON1zmPtD_HNW&A(B;dutuazqdB$VpSVRbT6wzZ%tbQrb4RkmS{-z zt@4eN>h;xlVx;G4!4h`en5rYCQLg26l-4E8u+0p zwHF($Nozt+Hn>;1e5)L>(TVe=837M)gJ8Ps!djl z&r0iLbJc+qxfL~!o|FaYYttD>QLO!N?XpIlgR1Wr$$_V|aA1N62iQ1@(nEsMUTiOJ zk7CKTU-wYWooF`Q4FaZ>m1z$l7=&)p{#44F5OoiGg+MuK4fbXScv{!#A=-ZSyAqmT zj9beML^jomQHlI5D9Od$8An0C@{8`xt5)2)7=+RQm582WcZndZ!hLXmN;rvchLpfl7K* zlCDkM>B~N!5rNP%5s_1EvmcQhjfmtz&rJ62VAN`7fzBZNIUq)M+oNdprGiWW4y#*S z!^O2W((x@>!Wu8CMIt=-5i;7Xeg{Xw5m&J6=1N*D;AD?lf1%RKNRM1@53Zt)m^c&V z^u;2GG@FOwTC7}GxI~)$(<`JIFzb4q%U-74R)bt~crFD+*p8HD=eOY-ql`@)sOTy(c>mPEAB?PIol|g?`WK8WmPehZ!-Ith_+mN`@P6YME zt4yB$6G57&8Jxywfp`>DAUn(wyN*tL=i#%zI!B?BiVAChcSYQ{=#&@pvF{u!x!m8= zL03!A3<*NXT#^r6%TNe>Cl&#RJF&Tkk-p#$pOzns%!{qfV!;A{9ke%Gn`L5uKZX8Me zK@67P;Xt_}dkw~hQ8eqS3{|~@KNq)M8LH^Qjaa5)Ket7;>)X?zDy-PP(_FFLp3amH zF3L^vXG$N;q$1Tfv;kAvyHCbuzr@f$m&0G6MDsI=vzETj|JF}44zEI2D(YVGvNTSI zwJqvih7$-VBk_s47f?UiB-XD=<4@juDPh)z+y}9-D~&LNM6|(aBJL@Pg-6|av8Kro zIM@AMN|0!#CStd!l&IRBvF02$8J!#H@N#a#haaL=l*t(IhN@G-A|1CJpTHCKiC&0h zj0X4Jh7L6y$uN6>Q7_ycvH~tVqo!f3Ja|cEsr$4_;djm@jU32g0mbc>kl<;O-Y7s| zQ0v}CHE?%TajBs-JQ4oV-9ZqmNKT20`b3y(=S8?-A0-Rydfi^WT)U8~z6J25b?~L^ z2PHjdh^MF!kGW;H*&05-vT&U**kjyZKw@ERh2KZ0AVBKy*C8CK3kx8A8*#Vu>*9y@ zhuR%Up`FIcE-?QkJtIXu`IMk2kX%JKEBCPP=jD=K_7415z$Zv4gaD}~=LVf#Vx@Fg z>zblbIt)x|a*DLuz40=NqoSE~GVKU5`BT8%X8>R?N9uq(yy0w4A}*R>F~O3O1> z-UTbALeL?(Y!;dfV9#6g?&GNZrT$-r@Hy@kNiS@_OFbLV^tZD zxv&_LLXqFM(T3bkGDP6qvDA*&^Pa{LEPJs`5#`Zn#3qhUND^~jn0(nqjFDtCjsPp>9(RGc=H_@4P|S$8_%MgdeoayYPE}~SHaF(g z(^^Ql%4D3AAiSX(cU4V*E)>>EOj2cJ`AA&W9xyAMtg zAwI6~!O2E#9^}IHwI&xL?{Z_JhnWeo_bOS9_2!L`pS+I|!+x2|@D!?nA_tU8%(P3|9}SVd=RIDs6rW!Nx;! z#xA}w;(PEDD8@nKlmAqP+|!s}*xM?HoWmzTrd{rA1*n!|mHT&_Yg^ddC5@GmXo^~A zriyfR7Iw7uq*FA#RP!FWsGrMmv5w3cslWN3BbFo+aY`aa`>Dkztix&?7wb04IjqwW zUX#CGyQMG|^4gCvfJv~_x~xyy&3T3i;@?hjFa5YJ3t=Y!4%ul9_ym#VK8ROaCp(gHIQJ0BWOeU+dRrGWnR7Q(f|8z)>Z z;W8fa(QyQSs)MWK9)vSzG8AUprYvI7SRukgGy$q z9O0_58;quBNlj2vUyz7&99K$aA-%NhD^hZ!@XvUjR-Q9-rcykb+McU||4bSh75(z? zD;zb;$f52sx`kG`#%+E1W`*WM^-QUmHLG`Vg!iKIa42NjG_NLShA zDx0Q-;V)>er6vYRvCw8Y_g*5SD(4)Jbbbem*;WF4MtKWyMlSu-j@he(A ze2-Y<=dCSyjL7+n&c9D3mBsK;T&7XJinv!3@^8RxG`@n47U(%X16uf8;KccXK6qD4 zp3IylR91mE8CMM6ttzm?XgU=%6o(l8j6tmUYs-DEB+Qh{WU;!r2TA(OoN7LLMLv9S zyl(E%3Rb7lbVeVn-ziv)%yBhL*O6F{xVLZ_jgy%DjLP9;G#c+C4HZ#52Qo;O2$y?1 z$;vI~bUyYIQ)#Gb1+YE_@18z*cPn^dUCa_4>@NcLUsc2exFYNg(dc(cT&eRq34WM! z>!h%se^Os2=2?VFRTZx>29JLRp{Y0sGU2|maRx?8JGE%S7k-Pb*Zfu@?veufaIG@V z;rvM%=>H2zP55V|j`xoYmQu%?#L*Y(>wlf5{fYnz-Nc7Njiz@&PZb!xMvCgEUvh=s za?jT3Dvk1-dj*swqvU7e%5=QIN1EHH*lsl8R&|5RvD_Ys$#gdJ(Ul#KOAk@^H4-9*^Iei*yl2Mb1u~k+b^tBO3od z#pBC!Uc;GCKQ-nA*`E^*vLD7$mbxFr6+`w}iHjrq0^N^rCs3i}^NgF*CAKN&$9&3- z3g;<&2lNsmhHZ9v1s&7f{Vn`O0MQoSB@yxScaTX3hHkR2OZ%`;<&5nN)O`y&NIXnB zdsjJy{9F|h@Bb5}{l29Ahorr=521K^;ZI9*-XukpQNF`}CZqUo+OwewRqnCw>y@tp z-!^*1y#DIkvh^AFTNmIQf{U^@xgdu2nw|Km3Vr$|w< zA-IQClrb%EjmFo-gFYx8J?CG;#p3jD`N-mAH2Tui{9muqf2}=|-e`P@-2s^&!=p3* zR0ZFrHW}^)Jh~IEli)|rRjJ)S=nFO__+c?Ht5qi0>b8i=#6mEQ9pSm_#Lcl>IX!AL z-Ve>vJAl{83!!*}kLLVkyTzRpt?uwE$;I*8Px->3PbD*}Ml~D&r*L~#H(U=-&rUGB z`ghmE)8qP@-SXRfx9}65{$q}I*y?@2X4<(zfc4h4po*|dGz^@N5uh9o#2vHa4(U%7 zHBmWwo)^W1qW8g)@}Fj&auA1ZM1$x?tp45AEYuXZp?z=N2SluJJVinRy7k#tf!*G7 zjpI}3Z=7fU2sbBm+uGaej>&mqds|H}XlkCFlHl11>fv_`A3Qq;aOgeM?&8$WRrZX?*@Q=@^~>htF&^rI%!qHH_#XVb z_<9wO{w&9(@aRu31-ql4yp3?-4aYnZwf7`2=!Q?`*unRx8i#cw+o@zaK_hc^;M)>aAUc`bq6MZSp^B6`b`~B|vJu z8m5~XZ$#|{rd#UmzXV2GF|dK@WP{so?-3HpvEA!=PeZA2oPgWzr=PTkBbzcczfESx z5RleDA}iwjwxl`;3Ne2BeI!5ucVc;wpZ4?HtcQn55M#Ul3%{M1IeZ~AE0$jx@;P#A z48mgL;&^`h9-=kBy_v~;+Ul6AYm*6rU8KoFq_m6e3=C}WXNAuf%mNbk1$Y6si zU5h8qZ^LZ=R#I8(6~Fzs%Axt~1*C>9E$s_Z{Pyni$sFUiD~K{0zYwUU?g`2x_lwB1 zfmE89wc;`w9|t=cRru{|VQb<%mh%}&mzlGVkLDjA#TDZpUzNBR|0wW`Mh7h!epa+) zxh1;az5x(`ew;Q;<|Eg`^ikxdiuWdy|5@|_YVEYEp;ur?>~ zv$SBdN+BpbfXisC)vdf$d4zvd&6&%8mMH$aA0vi!%+1HHE2E+AR{-ltDm^lZaNQ&0 z6^OyQcQ4byihsOIMfCHJ<0P)sd9nmQd^_pGjr@!8kKtnK8|NQC#H0AfHXKw|_{Z%y z10$uKT4K{kxNXf}B;qb9I@`lB{_#?B*-u_XS#Krq)0%(0UrL$CqPs{OrL^roaWEG` zd}L8>`ZxHg62lErR^NP~Jcmi5@DCJF=G%2G;Tx4(wU6e{(lr?2FGu6l{N=gg%5+@D zN19LZmqiq#hOn?~UFQ*#={zfzxzxRxfLJ$wDRFU@4Z)O5?z_;(Q2gabia}Q8Lrxtp zlQz6wg(2D#es?}0GIHQ2Eu7!tC$Ejim*?Dp^F;jQ6v9F7;aJL2_j$Nt$XzFKapb<^esUQw^h|gWR}2eP zj_{M;g3e&Rh;;TNQpn#F(;bI@qO>Cr`QrTK zu?do}Liow6h&WMcFObCkisSh3$&?2DM&C#HN&Yh*LH(DK;2lYD81`0+rThMKKDaPg zcKVr6MWg8oNC3N@zVpG@jk?$=;csBKj0dMF>i&VRHF8P(uu#jVwh|FL0CHbSQrwA$ zg{1_+=;k~wf*eC17XB9Z|LU;NlJxPz!k^;#zkXQw;A7AwL2b^1f}#jO(7#gdVK89S zL*$A4VxrEz!@>zVy~M^OjWtF48WfCA*`MVk>3FvXtQC*X?phxfF4L*t{7-OL=n20B zLVf!^eO~zWWCg?dLzUCzm>4TZAAJd)8b^IzIA5g}tZJNRtCTg4gY^QTrf5cA+`#j~ z|54#J&QEnZ$KTag4#NhX7oMWhab74TBCFBogdPX@G4Wo>jAsnivp9S0uQ0koA?>`b8@5dYH!4Vl;T$FmaXPR2v(q?sp>EfjLU9SOnW4h1kvD44uS~MDe>h7P>crnT4X06!hXlNm; z4@k~QC34BF#l_ii;1EaO2#buylSo=A_AbSfjt8Rvj)1cgOBvpf=j-rSk{f-TKn6N) z;s4+>tvgUpoR<+?n3iEQt&|Yan+yF+j#VS*VfoOsYsJdQ`oN)vl2B4oi*>Kd|Ko;| zpW^i2(NIFwTl{qmC8TfhS2dLUOuiR4lyDur#Xr8GfyY}b_ z0iyX{R|H$0X;M=a_&oy6<~uUNCqaAS-Emy6GIma&pLvb4(GKnc9;ssAR|pU(fmfj^bl7 zl0jnBQ4X~(%JrvRG#Hyh(X~qkMGi=CE5SVJ>ypVWrzuAg*9z(F-5gRyYfc$kW;*at zO70UB{Fjm_kO2;57Y+7LqCtvOeN}Cj3^LyAu>WHASC!|z5?VtlA6*;%9-R||j*&5e z9zK;IsQ{0weg`w~X;qCbj`Y3zn+UHra%pMLIX$i}(SJ+BNKL=1A@ z5sa>M%p1=cV=50VcQA{%XopGK`C~9~qgsYz7NuZoZMSE-WJa_pGm{jdY+)&VM0pNU zhJ~`;HlY|}y$7%!tS%gdykfF({z%&bOz5VO&Dr+NL(yRC4YM)S_j55iv=S>(-sNe8 za1#`hTfY+JTjU3~J#Y(6X0@(l}Gzroi){NF2I- zh`pq|trHk&Re0#}=A72N6cmvE!T;iQk=xM##PZ=HRCqVoZ^86h7#f#5|5YXSIlv}Z zV(nbq);AHfDoM_rRCKi`eHS{#1BJXXVooXveA(>0Nx@Xmn%y(-*kO>3gZP(nqfv;) zY;g4ixkt>~is*f)eozy$IBHHR`w&Oe$eFw|{nrHp%~pvp3;r06PS zC@R!flZ($pK6Jv5bh-BJdvnJsV&|mE-Zd+r|wEq+g{88mqyb6!%C~$yCj`?bdwp}D9Y1h z92Yo(1)2k7hIcR|B-Z+sb58S zBx-}r5-Rok8DUTj>k#fH1xMY}28i6!W=hFK(oNhZ3l6sJWT0UH;4PFeS+_)Evb4Y9 zm0gD&LL#`U-C>_6AVUwZGC}E}3R3c^v0`Gzvjm3R)wKpAUVIN37N!=Sl}WE}4fn_W zUB_9+#f6;BMA*wEIOJ>+cZax(=fgbUTc`-d=>~UaK z0Y&1^2^rA+-&&jFOM+?uo)pT4Xz4X{Ge9aWhn3Fs7UNyrW^t)fE51I%+_u?QyxrV} zxq+!vxciv#kZ2^6tjgL?no5g$L@*PsOpc-8n~L!O{}(A5y@_0o=6G z$*3T^Dy<wvMz_rJJGMrS1Ngm8}^VADeL&`Mnv8M&)AtX1j?V1<^eY z1q*(nvKb}hbmj2Ug)tX)qmL)JFMCgJWH>g zE8Sf0=WWLn`!{Jk6^x`N$;RUJ@$ww1&0qh13F~`uJO2kqT0uL>pJOab{%+ckzzy<{ zRd3%e-)r@;Ki|seH~No9YxB9clvLKuzXdHqS4si!D!evtdfFNDjVd0A z6i#JqtFNieznPg~j&5OzQS%{u3FU&3v}86>#;eJ*!RMser73}-z~ElaDxUAcCjZAo zVXm*Rm1(zHtRq(=5@^h;2W^YZI(mPLajtBM(hFvXX+5m;DUr%}y7*_p8x5=3jt%Qh zyURxtV^k{FK9xyB!E%G(UILX6#={V)?&p_eDbY4<*eqEGgL_Z2dJeZ{_(#Aq-ear~ zhSbiy41LYLMFyS*QxQ=GY`CC-D|tuV$!5l zHwm}qk+nw}8d9iE2bGk|w0A=d2@Ncu^*q5v52OT!Sru;uyHIN%7I-Pxk=k7GR=HJi zlbF7Q{o^*8exWo}aW_vCN#oB{%%J@?}OGGrBv7hRVL(~?+tfb({GjJ zNR*JV74V)dd4U&#B`5B-({6dp0@q7l%dleQ3E z?0T3nb2%RVGLp@~7s!OIV3@nC>4rJSC|D9c&(xQC9w!C%KZcCDYgr z+9{2_epYEm;G7d1>F2WGd&5$a^3pF#uYk`2+*-VRR`X%83a)lt58c?uuR3x!_EtwIP5 z4c|A>cW;ea6%ar-qwd>qGM`*c z(Lh$PH>xf+Er&5MEp5z}k^IIJ?3Y4MX5tRB^4 zX&M<5GUmAzl`FC$#kIrbUntB`jNf8ijxBw++#6f^s6RH)VoTr2n51XvOSYe4;9>uk zL~!*hB^VF|+?~uPh&yR$dR%`k2Rhc4ayD|ML;Qu&7GG*-u)ApP!I1Z}VE3>E>C55! zliC_u%K^1q*5F{zP_J=mOPkj!Z%tD?oV2gnzaiopOA^{IFqm2UbDATPhAb*rMu8P-u z39sRbJP+Pvs2DAt++`j)gh*}f6ke#?zFg)rtUepO?Gd;A(IoX~< zE|~YIJDm`#!xn=Y)V(kNapN?>)?{wE7$-ab;@cC9lTEW8{wDVi7{s*PpY#YPw>j#y zR{5;0X7Lto^e*Wz8Fr=b8;#e?3}^7M7g!ap#v`v#HtwJWwBfSD_0ObBV<0Rl-DNb& z)vNID`B!EA^KjQbZM$q!+;-WY?*W+Jjb9OUm*ErJWs^fSFGD|g_7SFag24e=DY{s6 z^I1CRh8Z%-Hre?)^dvQ^35dF{*YFU`@Yc@xH{6EJZ+2kVBU_7IGlf~?R0KD1j|?4c z#%#D`B-D{~ew7(CaF(-dDj6oY+cQ-#tfV z;Os-R0alCw5ErrE#!Yjr<712UJgM7Ak>RXu#tkkZCoudm7!a#Ivu*pN1!D*; zTmWmW#<{A}3IQWaA65FJ26Ll;DFO@tKqf1m^G^v-E(1y&9|h+gfg^MbIJamx-w`+; zBf&Zj&W#Ch4$c=iipDD%#6wXu&O`txgKE85KuyE9CwmpA{pdtWClv(70DsT8(*66C!IB%*SImt@o7WG+DJ+XAszF zoOK|rYhfD-zB-HW+Jx;NlI-a%X z0g*mfnX)Fhux}8RJHs3Nlo1@u56c4~$JdgC*Pph>H~29gO}{y$7G=Fzxr7d1`Wnna z5>z{{G{-{T;lItLC zo?GtF1hQpNr7bo!I!$}+k0CKq8K6$d;6P&#-|S!pC>wSyB_{M@Y|Ja%V(%uw5FOB_ z0K#nZmYP;hg-CT~IWFK+8Jeg#xDv6d*(d{1%48%`*R&%N5`S@^3H_}1 zaZ_eRH~e|F+H!DVzq#Vy_B)hPzsQxu8!$!%_w|FTJt8hYo-Q$`EFT@H`fVEh=D*Y` zExb1)ILifY^Wc1oo1*uhC%nxWkXM<~!pz!R%9D~xyZuA<2d9m2A^M68v!-B&B86^s z><`WwaZE34>_Gd?JM_uRlzojMpp<)kIE%%~zLkG4Ij1WanZUqi#s>RutP3zYa}`e& z5TSmm$kHWS+uMIj4sW4~F_;V~YNAKsnQF?U10@H0#2NPQu>-unVb%zF1Olv@r%+zggR{Zsk>jo*7XJ=uTJ;q(mQ zSu&&UZ4||zJlnL|p>A);IJP$O3~4%?gU`z9Fhe6+^Z?#cuq1tP`IZvS1x${pmE{u* zt2`t789|->40gEh$YxKI>$C1Rm94z-8_#n zhC}Cz==SnmjH4E21P5C~>MM7Z)Q2CTtTpAkN*b(998`@AhIzLRqZli`q(>uJD|lWe z8gZpR0iMXY!JgE> zIpWTU&cej=o&fU41SYpG!>~-vO8dPVI@1x(2S<< z`gyh&;m3=2vR8Uli?OooJ+L75Mj-wpStt1yN%~&H>E{_>7ei&kQl+o5N@aN%VviO1 zaWJoxe=H0Qy-AGZxk$XgL@y1o_3d~X3yJL_D?}{SoCU4HkWH&}0fXV?6n2AqFtsxR zW58)Ghs!%llKq42jkG@!{h@Z=A=y+6#v9xag>be2M?a+2w>5g3Wm^g9%~@N5N58?s z&E|tFBe_ZTfB5Rm5r5OVg*ByaFNX{Bs^vk@kmGzQT5O`M(!(KZoyMR842ncT;1RtH zelpCMrP`0%PI@9T+P*PX;QYPPayYjeLZe0-P?a6*9yhCB7*ykfGBPAzX`aI zxMkSQxl`?{UckP{52Xo-d!<6+-lxV>C_@?>K99+#+dQjd4f73y(EcoFQ-#L5|K&l5 ziL#?B{Ix9IZu?P^#LNfX$|IjbBvUPKHe^S5>7XxLQ6qK8!5IhV9Ao$uJmekGrpKkQ zJHei=1s4HsxvGoaZ=QO-A`M^qI-D)(JP@>Wo8IQwLa&}-CXc&zJ_+~es70%_$&R;rrg8kg9 zG8vI=H7v{uAEP(UfMXjZ%P+zn>wQ7=EG1U#pb>y#c0@**lb(|z0%yx!E8SQ&Xm)d| z>M>6VXZmpcz?%?!T5Ja$vs%M{rvk<@3=3gt*j`E}QoXB``Id5MyccqE|9Bn`xbJMs zmu0mB6NYo8%m(c9>J^zc-|V{!q=#W@S!@h*7N<+4`{!QlDY-k@Ujmp&&}#SUVWR-V z@?!Ukxk&Y--Eu86%RUo0Q2(ZBjB5LZFX-HLboJR37cLW$(_AzddZ3rUna6XsVn=43 zvLU1TA&~}%SP2@Co1tg`d=TX}EC%fUXc8xqb%ZA}L;o#*7smk55JOn;!S=) zWy9f`FZc`w9NndKyZdw4OEC2xSAr*Q=E!WW+783B9fk)>L{+)!I2@Bi_HxVT+DnueD59{RF|!HnYQB<$&g)0Xu0r5t;QPxy?Q34DALf>DW!)-t z*<_U}G`(PU^WxW~9%RC~iV-Y~mx>KO{j_lO_IFq^K&}(KKw>(jR%P2iBaoSoF(l!^ zXoXYaZ&KQ5831pCee^Sxgc%yIFN|Y_O`Z7(DEEum$w>oiDlzdI3frenj8@6)>9AiA zcovy0-yHkNeou|PwBIw+4)%L)v*-7FO#AkJPqkgw?^$SH(dTKdmnvVLNGU5!|?C`e>(9`T2RDPwSfe?cw zY+f;sG(_fD&NfoXlMVKRB!QCsXJrS?rYMhnZv-)b^LLU088d{+1u8R02XFE|agmjf zRNJRA28LVC1*9ZJi7IS!gu|=N_69@=B!7F)3&*Zu1FKr2pEtKR z?&;^Hoq2$iDvY-OhZz}b7dQv@Xp16uTF$gM`fWsm{%r~9zy7J9zvn-K{`NTfkCP63 zvIYH8#DF= z+h2h=g5>82^1AJB06X2_@eWAX6)Aopncf7W{Edhq#Q)v>d+{**SA+Qi^}1w#nDzh(hrK8Ma^M zM}jOl&VM-mAqPmu<=LR~JeD&sPmHJFe7A2w<1nR%)$A&Wn6ofcpH)vI zt~o00%H}Yd-+Qw<1B%hNoDbz_L*6%eh9rsao9rcB)cFR{RCQOMw5lKG+e!>2!?EZ>n2rdd3* z*Sb3k^LAOB?}sP)f~ztPO)>5!_{i=`s|723a=WDkpD(y~5Y|n$XZTWAnZd2}7MHsE zVk=WSk)vNAU^x^i+#m{;+w6I#`HpP$9ogdJNrsig$zOe<{<#_Kqy}9Gn9}mV6^)A_ zzHNKBipi^Q9v)}&8E>o)oWcbKE++Zbwn%;n@&zLvbziD76^=hV5w1V!zOjC96=iSx z)VD1x+07$6eA~LJGCLCPgGrdxs*2bhO9PsfnVr6EHYu0-8rr0x#PZ-o@Ttt)DmHa0 zGqp*uqKe}A*eB7P$iT>t)&Xk35b)RztmXZNTKQsou6B`O06gaW+;G$>$6xe=oJ=?EG`eEu&dhNN599=<03DteCFG^=@Eq38l}@2t(aT)unj{9ifW}Xb@E3bvXLpl1ej2zApfEBOISjsvWO$?!HrH;fZDJ!F>~ocX~x58KKhw z;la)*nNc8n*UMb?XCFnQi*G70n{Prgc2hRL-0;xkq@?~%dh3y`!97{VFItgl{i0>@R3KiFEw^;655m%MrZtr}JF_ECc@g0t z-YF1~l@jx8MC>!fE@Sjo&f;1_U}V(&a1A_7hwb|py!t=+XJtngaVW&vb720IlA9Fn zSGeqRH9pfqSr^#no(LVEQNC#)K1S0Ig*^osg@+s*S!*n<*`x4yMKo4sb;yx}Us6U< z%fBL5L`$+cigU-+@oO*>l(7H5wY#TyXGKidcYM1CsMhiAeg^G6d(x=DHODu+sT1pc z>r~ln{_i!s%mS(FV%l9AyF@B24sKGckxnSy>a{khZm_de#ceuZRMee$o$7#&opeC) zhtdJzCI#z?Y_l{xe{z2x{DoMl2S?F=m7Un}h?z$D#^bv{T|0_(fkG=b7A6#Lg}4+b zlpr8>6G!N=zPNp0U)1Qnpc~Xpiu*VuLbjp%f_i0$I+#l?4PE1%-hXjuCO21<)HN{D zzJaRg+d{=mOsg&YG>s2gGn>DQY=?KWMX0rCzicPaMx9Ja*_S{pJ&PAzWsmks z!*WKA)IdZnN>j!T0V0xx*riL}c^m{sDED+wvXa9ID>d@>O6wMzi$h)EZW>b@mDXkn z^I7lv2wXbk3o0&>$zpwS1R38UUA#)IHc4}4W*QPObv&j>OBGk&S6j9+Cb=`$? zV6MBgqH>&3$&9HvFT(e%ry+{iD^DhgH*k5HGF`K7z+KiUl z^cvt(PuTv#&B(zztE}`&>vLbUeM-qi1zd_L?8I%RPOq+Ft}rtnzgWvr0h)2_ zaa=otMBGlR3e87s+#A>@m#Z$7PC~~0MBdX~{lbfcO2sk{nTYR}IN zP390y?5rnhPpGRq3Wv6;(8A=()MJ9`*d3~&0W8H*=4%Xwo`+u!f!4M zWfc=sX>F{sR@=T<?7NirfQ%+y^Id?FmN6}K&IKlq>{@H>7S=Tx!)MTD z{|2V)u0Q1araH!0XLsVZ)`U}-d|4Fj$*k>K!q zaXC_M;&cqXnAdrX@*4I{V3r^>S-(~GJfcCH3(HbvF@p}6uO$l)kxPQoE&el>q?|MU zqM`*uOykWK(|D$BE=$iQ`$uXf(n)IqAC)gj@z!^LH^8&Xm!i<$>33IIVoP4c^PB81 zC@?HJU7*|WUX2F9<%UiGs>h`^xR?O(u-bJTW%c7t44pu zhilZILIXMwM~!+)nhg1e_boY%DW9}3E0FCex$pR6l?q;j_^utHt7z-dCrF?tYGmXI zqC^cKH2rC*z^UC*T-D1En9ima)NBew*Cy9ADmK&XA^^#|N*Z&!l7XI_Sa-Q!Xmy9D zLZGT3nHg1u6Z2$D&@zCSBUP*x*Fq{-&u=lmrPT5<`}`+$9c%h)cbh&ms*W8R>DoCH zYIj_M#M&JfrD}%-FhtZ}+smjQM6tf9g=r+Us-HA2Fl>o887=$Vi^c`gJtg-bQ=?wY zDbbC{QMIB?uP=^zN)|ol&ye{ynjuG%L63NR;FK%rZ`C_;jO1h>bEJyQK%Sc{?BsP7 zro}=3S-!&eWPr<_4at;O>37)a$R#2}>lZziqyevbSDFH#uT&$CSk#du0@JFO?H33a zWsQ&wUD4d%c(){cB5$#b?S|Dd#1p9%Z*5%HqX^XT^a(y4mSF&^HcHs9)WtLC>ltup zGvLr>4u~T+ z`y?kA&th~57nXj7VglN@lVy(sFkF}^To|)){t)2+mQqH zCS+pHH?$>MBGR;$pw@AF^ zMBQ627aAKF5p|omAi55)=Q-!6X%o@bo=HMvdp63Bp_7xBpWu-Ez2Icq#h2_vyu zC%DY94?~y$I+GD3wUQBJ-6=;nXqZrKG)&MgxtD$UUOChfGzYxTB06J8f3JZpTq^nu zeP@}dkZ@q;oGOP1tPgj~(tm?~gOy7ZJg{-U!Nc{#k`0&XGKTqFhRc&{4D;sVpMZY? zeh+>R{%ZWy_-EpuX{N3xXbwU9&D2#sR8a!UmLx4sj+_ZQxm+30*m*x==IEBbbNS7k zGOMTzZ#z}rKM+d?XM^;u^I16!0M8o*&&vNhsBr^pStLi$N}>?ET+o`;k5&n2i7uRK zvtjzUG$qK5lhN_ekRz!Rv?e9X0oP#rE%GYtS$ksH9#qGz+@VZtdO1cmY_~d^=synA zGHH*sgJCD5(BA%QBU7Zsk@x zE8FNrGHcAx{aI%7rD;kt*KGcY&^P1Nmf45?j3SOLQ?c-yC26NAivwoxv*f@*GxSsG z&6QGzC25luC(E^SxjJ}IpUc2Km1ymtpr~=kSZ1!vy&9S8^-x9Tdc8W8cD%Zt0u)Oy zCtXlOe=e<|N9Lo^i0Kk0GRiPfcg-}#RW+VNkf6+rdQ*yDoE&YT^wKqRzgkkB2M>Qu z-nGo`Ik}ND%8g}{lTm?+I7>Ip8)~(#DbJdd8*TNLcFad*vx~T>ghFaJW2&I!=(} z1vql;ITsz5h4D%9<8n34p&A1-UPwlDAY+DpDL5QXN%m*fS7v9smQ*_Kj<^q}r1*!5 zKX=K)j=RYoNjY!b;)k<2&xZW1N@2rb20u>@tc^@5-m01@bXhVl@B9|?B)P%vQ47#E z8*2DRzJNG zRnBa{h!efUuuVtHeYIsqHZ#Bmkor(EnApuFPCCYM|X0Y z&D{}hvCA=HzCCzjoZxZG19a@A1PEuKA87K(Rz-|XazDIvsu3hMvlYvGS^cA&4(S2La>qp^^7`3Tm?K$mFTXP z;O>TV+#j0afIG59hk=bN`W^NQOgqrRhOTU~Et0Z?G&_$l|H2m#q}LohPh*F9Oy?fU zaTX;tsfWhUBMq()RRF~k{YE+=@_ltpzxL9Inyy3sMQu{Z2_;-go@xl+-5s&oq{KA+N(qI~R;7 zTow9pa%eKlf4Z`lWD%dMrRSb54;;QO%sev1;aY zPtw)Q`45iD!jED-Ylg1PQvEqCbWx%4YWd0Cvzt@Q&{ZkYoL_`T$w;J|Q`lRvI*Ll3 z@RxJ7+d$1*(qIvNc<=QCm#Y8E4q8r*};oc!UGE4l=shHRuD<<=I6 zmDl)HTk+0Vd87Nw8?r)*GoERkJINb7dUm9caiPjO8;33ohbk=_hbqp%AuJ7=nJW(t zV%Vb9P?={|G@_qV&IZA#XyeEARsy-ODrCcRJ$OAhS)J>M(69z#ecbz|o~ZkF5{RC; zlK2^oe_%YD)_!#BC-}!;#sC3Z3!aIW1`eB{iIiPehNHwRJS1OaWNT8) zE#IK+3jb412m)h?$VIYa%gCB#!>dmd;qTwrAZk4-|2PGM90~@R5x|i#&M&=0MsmSV zAMs(VDAi|yK8K}}{$Tja>Qgjd! ziINUCumT^V=9I#G(fIb=7E%0JqK*zlpTh1&sdOnozlsAY-4(OXrxjU*e|LI6Krbk+ z$F##fL&g~xk5Gb=I&$I}q)32L;fC%1f7pBPu%?!-4|FyOCA5Hoiim)sfLKs0D1rn* zf`DSLD2QMe1VWLLgn$Au_TIa4>>WG7Ua^ZE+aZ{vqUTt!<^E>x;KB2q_r2|(d!OeE zE@$uAvuDq&Su?X{tu;#{!Eu zE*QrJ;}Kvv&eES#?KF=@$MP=7>vf>>WS2D2K_)OC8||>mBH39{!%q%V)EFf4h;a0&yW$Y;=*~ z^CSok?aVk=E+vrK&!zVuhfbBp(8gEUHtr(6c~uKZMHexAo^e$~KNRLt_EvPv3g+aB zuV$&f7`Y!NbqP@hVT8+NGpFO9XNV%!1PM$e12j*l=*^${I!XgLY07Ya&fjVlia`@} z09UZ}HLZIEKZF-VQL&D_Wl_Pd$AAQEUs6OtD-D!rwRpo11%;?vYs3|Wmfw`CPax_; zi_9)bW?>woAFd*t<;S{36{ottA@)-{pf4p}Rq=be^pew!CxI2`LCN zp;_$FG@x08p%!8*?FRZq6ICCc=GHxk^C+QeUKIk9(C^x=I|?jb6noiL-+?tEIt;dt zL%+6&s((R?7WWX1R<}(@I&5%flb)%YR6?C#hJas%;z!rw2o{v=SVe_no9Z8 z3G~WIgVi@BDlx_?cD}(%fICZDTp+I9Lgz#Uaq!M|<0K@AB?bNXSVveDL|~Aofw|~o ziB&STUIkg5oP*~IF`q${fj)}*s6>wHWy`rC=-1YRvh$2413}1 z(5KcIqoqGx^AedTDy-U5zgo2q1nLT&{(;Fa4@}h+2Kop5Umlq8O7!sth^NvWEam^a!6CaQ^d`tkAvWiKEVcT1WAL%m>E{ijy+D zr2gGd?&OG#>oiKhW+YZhycJ?6Mv>)DlD%mBk*65%oFmYPL7r56h&B@gp|sdhm@tB@ zoFk%WptLLyM^GVfIDD5p$2&@qlc;$KJ#SjXzRU{Jf|*fbmwA(erGW8DDEc?|xwa49B(aenzv8KEgTll!-xkm4=DX+x_HWe##YV{q@0LBbDeT zQ?C)et}VanPCf@RRD4HK@gQ6*gI?OB^!jJ8kx)pA;U<`eJ$DQ5UUN1gn$uP+?@&M8 zP?ZJ7P!-AeJjp(dc}{C4=6w_?b3c_MSzbw61K$_OD@iC`Du%~LW$w8IVBW*R* za58L}QTYg37uKC+U71uZFTu&sFI!RzYIOA&bb>m20#`y(@IUqhx@d~fzp(Px+1hjg z9Y4T4+EnxM2;~alJ>+~REW3G{54f+pU2q;g!HFxtT~iq-+Ry}SgSURKpoQkt&o{J_ zxjljo5Vh9s5wxa7`G2`b@H=KMZGFw~pC8h+I}F1A$KJrYvJ2H@mwS-RQn@N7NQVQM zAgK%^$Wa_~pY_lKRxn%#$_P?cL8Q{%<*P2NAgD5&rx6!KehO1Q4=b2*2z$g!Le$@k zdMk6EdTufzy_JF0Zph@M&h|NwMcH(yAq#@GXi7lgbR9G_$V(SQmmFEU086Nue?Rkr zLEA!nz6%wdFfl?Zpp0C>?v{jOutH1GNtBRaYqx(OEI zIqMw#eu(l*sEYqC(0ib_U$PmMYQp8I&M@;0TvQ8ZgHIr#%G^qtGE5nCD9qz*fbd{g zwO=pciDO-@<{M#-KNqBY8|d*WJmyijPq}c;c+3XWvkNwIyFlb-9OiMpugc~fhlc$~!64|eg32(8o`e4r$o9%a3LT%~G7y$nx{^R8{(aVjQDTLhQkZ)S z#T2Q6z&lPkB#!wk=KZL;fyxRG8c|Oy(1fCb-n4>nN=z-)eM*IMsF)KRY*@jdyYwRk zk|)R;pS%l!vTD#1e1rWUHi5nXfpg!PjCYWEpz^C$0&$xwD$-lIkgZ5SVc2`$k7|Ch zGf?v0Pxka{evpt;5EU8)7B`{_!1D`!3DD5VUD z3dj!xrNorNqf%xCI*N!_j_d-x2hI6ag^!G>W4s{ru<%{5K!h(s41nQ|R8&Oz(Z0Bn zb*=_wHXQ=$Dzk&YVdmY)4gfKIf*pOh^0r9vvPX#ei%}m{6WWJJIPa0DknbtdsX@kf z*^bAWDWP!p{6bjz%6trz^6poS21`*$H(`Hu{F~@?r%-0LCg_eF^~l1iefg+GRVTcl zvyJq`P#d&FmNkb|HD_Z&xft)rIaT!#!LA*t9Z)0c%c3{}c4eC4zKHjzz;M=Qw|+Rw zb@9iOu$UW=Zeu@!2xA$$E#G1#2ttGjAcO}~t!lB7uMWlb@GxcaH8-rE3XBVaO~QQ6 zB*lwWbjCqbxfB|~TR?YHi9i=@a+YTS=h~c>OqJ`>1K+@2oW#4F_b_%}w?{dp51eZP z&rBc+*5}eW)B%g8bxKI1nmw(Bwby&|Y}Rh?OlVKATFc6u~A2 zhp|4u#%3%)PZ?k*G7ZE)ik}`S7waHJtjCJ@`d1b!ya&JwP^7cnj_UslYVs*+BHI27 zYJ5=9|BRYnal<;GFHS&#Gz-IP@zZMOPy9sT2}>hTUX=!c!{KNo4SQ56jfC@HTKAcq z6l=+3EJr3VbUO>D7(&HW7DX`a4e|Mr)JAwnh(i(#;uJNe67wS*daSS*1$w|3zzc+G zmdj_X!LSfWyh_pI4g6Aj9d^Y=hqef@hnfy%tgmXMCRBk6whF9;Q=szvVJcvRQnxcK z1e6-!EyU|1{`aay^+NUq>W-Ywn=q~6!C>%mpvPIAZBHN*NgMH!UHn0NSCr>O9_I>r z@=@@rj%-hR+M2RCtOjP53q=j3#LHnEx+xMtiJ-zspy}uAxB-K`I(lEq{nS;FIKf^v z40g&f_oza=k!JB8jOR{7vlAi5MzOLF@I^^J4u;UBBu!$!{ij&{0|Q5!_h5U$hJ>kH zNS-J}dsPT59-t|OiQ_Po|eV`?3WQ3AMR%nVa1JV*u(F-Q&y$=Pv30ZaB%sNTC3Ufm@8S{MYvKHrjtC?ju)Fm4DBosWb5QZuJ1RdR(_ z$6+Dd0mDT>zKp<#-~YU+5gz8&ag~<319iD#ht-}W{nsou zd;vFo^w+p;UlF(E*SJ(@`m_sJoPcq<P^gs~~LDvZiLm0JX*mDWa9(6>Ew+hQ<|_=x$Xiq*n&L@ZgSO!0b=;?;z}7tZwVf zDOmBth=W~B9T6j`s`qD&J@TqmKqQY4tF{tqZ3-Xh(8Q*B;>3$sufQVgH&*N~T_nDeer%dHn| zLm-dAiWA7Q3oN>>2Bv!JC%{_A$YRwVwm?+K4te|49scDV zKePT-X3om&Swl7Uyb@34J9!Opg8vzJ4Z%A{sZ$Ji*1ok3sDwn0U5h5uwP+^07KQQf zDKDL>ud!x16cTflPn3q8(5+ck)2BMKGuA6DAczd<+Wkqgfwq}uE*5Pe1$>xEmq-j% zY35oRr6He=110_ihF{U^z+-6DhcWcyd~4*0@v0DON-$H8Aqs@Fk1k-@smh#nY@^@F z+TN9}?b&n(|64k1HXZn2$YOy)uHLLaBaGD;juU+xQc#Gbi5QOIB61?~qJjb(rGbH2 zj1dZUmmewFG1Mhf=4Uruat}>)V+_d<&bUJ5)4-!V*$h72?El535w&eSj{?v<#ELMy z3?EeuG|PZmZc@-p#U%)r6@#<-7}{3Av_Crm z*H3CCj=2D=Z9PJ<_P1{)8@)3g>JA8;SKu`_Z4=F>-?-6Q_%kcbiy}(P>{^Ct+q2s0x9N&B;Jv@CDqddOJ~9&A}Hv)DknC{F-bO z0x_24G~^cgI#_5{^rP9 zq-{%f3=`^XPrG2=Jg<@C6Iv)XX&NlflFviA1`PK?DJfCn19hDL$i`mxhCK6UBi8m| zc5#5d%*v_!L3ES}a?&hHz&?(ij4#2olnP4_ut5+)LIXXl1(87%X5dxwZ@Om%YZ1rh z1(~QmuL+H4-~Y@{Z4CQhCm4MYBFEs4=_mL)H8kPH6~NBrwC7J-I&=f9DSqK!#L8|^ z|FFjvVXMdcFm}_sF!v3*CBDNt`dNqTK<{=E6Hze=jg8}h@QXw5FuxP6urS!*V|loJ zNyw-25bUdkxiiP^!5PK*hBTLJED|Lc2$IJ^ND?8(!~zX=SFz$dlM*afL)idhOHvNp ztHEDIs5Pcy-IX|zSqT{KV!BZ|t~n%orwoe8LtL9-nuSR13(Jbbicgp~8k`;WXM_~^ zQPvxV7xp2_?{R?z9@;9zX_~>iGv|bdrE`w)nfy=2Cq((^|6V1PccJq89oxXz>Mf(y zQ_$AHfjl~hM?TZ>ZO7%y)jIfaQpziUE1HDI+62j~f4$ZGdP|ApXJVDeTT~1l2<(on z{bqEOt`XHxh$*e8vKZOH?OK|K&;@b?bfC3SB~EN7L|-UyLT***_^-CV{FHm5e>$OT zpK0cFqftq6I=D54MTNd#(F(X}94S^Rxq{;y2t`*SvDS>j=`4t)IcOTQ z0xl(2m!B!R*Ga(#Uy9T;Q;kcV_(trtqPE(>^keX>qcov-kXQYn>Hpfye#r_^CuN8b zdz5J^xVT0%8E&t0w=^5g8Sa|aU9*WMSM77d^>Gf784#=(UfoEM8C*@($Lx-jdbCa! znnLzfOHB?96;j|9{j@J|3lDBIg`s9V`{XQ^JLjBOL()BTP~gUZUo1we{E(8H&tc4D zIM#q-_I$Dx+mYbwNInu}(v_Sl1_etop5YUo1K3tk8FrzG(JDyaP{}65m~5fRWwCro z^I{V%9jl(^{01R^zCM3TjB`J8KVO?W%7O71-w@_521e-Ky6QkCq%L*x5n%#~s3p(Z z`&#;}y{~O4?!GRCrf;A~1%-khSqh~|;L?$jC=_ZOiR$C@G>XBVrBMx)j<5qeJFc_b znPvx2qs*tqf?`$iTogOcV$4>!_(3ThF~&(+vj#Y<9%C-lh!+o0q?Ktfq$4cn9{L_f zz8DYTNQ7l<^pb4NyA@QMPk99PTXerE`cE&~3L>%6PV94^9&mO}+gV)Dm1f%h8<&rk z@>#p7IyD2Xg&qO%_UmZFmM237e~I-4tUZT0iY18J`GCbc#T(bYl#L6))&z^uW^6lfgbj>3?m!RV9CB3YJ!+KT+FxiY^9<7x5(pSUU4x)5p$G_Dd%FM z5VMDiIZI>Mul<8ZfWeH4k7fe;-`DOO*Ex!tzeDq3$KoeyUjyyGnI@O!013MaCo_S! z{^OrhJlmdhWYT{CgDT5j9;X~F@>ky0$SFOmLcMWGZNpR&Ln`(SP0+yj7!Q=!kPZZ!+J?6=bEeC~QTz0TyW>13}-V6T7L4*|cU;FGM5 z#b}fmnio$j)T6LK9*<2~36NK=UV+Zxbp~rjNOxWZv8H)+$DAshXl9H<_dZU^2j?+> zO${2xrnZ5BK?=5*w=O*cRLvt3~*f>LheTcLFzF23eBM_Ar)Uuul{AeGD z90!Nc{m8H^YYHY%=om;)H_I6`bwx7$5Hqi&e-zbhe$?GGuqeZdtnd+2?Jt zJN2sZcl|`dgP_Q3Vvn1`gQocgqI{gIS;B5SdP$3l9BEbF*wLzFx8f=gj%*yUT{+yN zY%a==EX=J%`F!g-HK6;hYw@s$d$~<*?RCk`usItq(~|t>_aB8QKgG?3abSv52=6h> z@sb*GjyTy8jpQe8)}uY{LrByr5gQdFe(UN|mUh zP(ioahAFjGV-X@E$rk+>lu*D?LTyrHB2=7alYXya{SzuVninheeL$)26A(brJ_1r= z`vO&Z(0)fn&C%GQ0JRkDnB0DF&JL=U2Vr%o)_M{H*$l)@u)vZ_!r`1M{u5k12!1UX_SFFyX!{y9;14fNN+?V|JHgN^DfMh1-w8sX5*m?NU1*?n6duG5 z*H=8@!4gG|9nmq=5On~3!h;tSPq8Ck!@Kz`cOc(M z;)q@rRA>?e$Ncvw`vvs?Mfn>@{(+;RsC$XFN+X21H60}D{C?#TFa+F(KRQ=FwC{@N zLa>D)9#~f1N2!HF9^fED-JimEOdy{vQBAA|#^C@e8J?x?mQYc(HxLpiJa!)KFEI*K^?$Fm1tmc$!=7+P9hLd0MZ)=|P!f8m zp&y@Fh76RmW;p3+*{|xJBIg>0X3tdZXY)>~F`%~wRdn%0pYrG}uZpf5=q;b#@~dX* zZ`q<5YBT5~Bl^fl8&9vPFEvy(hF+V{YZL7ddM%*W0v0bdru5oW+k?iN(Q7lU7rka{ zZLW2t*A_J1LQ7qe)mYMNORbPz)Bo-XwLIaF3qdd|%&SIu&^kk`;54ih7=r67iXn+V zrV!SM@TXW4a*@$hL(rQk&MpUfkA`9AUcAlDHNU26k5oV|JgRxX_6dfliqBT5J3Zhl zTbMdsIcsqghec&6i^ngFHWsD&VxS#G10Gx9FMMqTy))E?(7;F=Km%i~4-HJT@a~oL zMWAg%15<5F8klJvX<)8xL<0-0H4QAa6j@)`3g3tmYN+_~WF+67(p@_31bQ{7_jhMG7bTMPI2Cg*n*h8=qJJYykFvW&n49 zC!ht`gFcFXf$N`w5 zi&+C20UQA>0c`*s0X~2LKnNfLFa$6P5DS+p&-!{O+j@nO6eGE?}+IV*4B7=GQ4}{e@+%+hVH%SnJYM z?1aEb4xZYo9q>eXYHGqpjig}=M$Q?re02lrOS22R#H*&#rk||!S;|^}WRtIX_+Heq4AGk@7aIT<8{8H`JnxTQ_K` zmZDfO?6x&uynKX~J}~c9a(`t|0?n}%B7Hs!=Q#cMoM8~-#pl5oh9*eEn>v3ZvWF-B=NuC z0bU8%($ZClrV^XCf%Enpy0Cn4#^EE7g#!WDAOfPmFd2(DH~PRyQ+$c5m?Y|#<;j!< z=pm4%e5A{kK7TJ;1|goBcZ8eJRZ0e}kP=j^1Qjbm#j04VS}UB$Qxu6<+;AAwE~=CN z7L5h+(XPeZ{Og>IbtJkXk!BYn!yupJa zVmBgi=Sl6@x6<^q1h`(y#XD(IA=yDs9nXqUk-2^=dKeal2`~t-!f6@sY4Dsne4sKk z&49DO!iC%t_z%N6Lc!`HIN2J^>-Wz4IiAd%3p~^+SHM5eMWe+*2t?>RFlRpn^NF8) z$lv2PzF{KV*~CT3r;aX7Ser}XPWS*hCEN*4@o)(kEaxy6q@i(f!nTHmouN&!p;!61 zN-=#e7PdK$|5~Xje;G&37TAKfLe~ZnI8p_OH`}c!?mRU)T)eUH5YVJGET$5Au3k#R z-Y74pYhhhf(R1zD5!CRE@+WWS33ek)<o!h_lnpErS6rU`pq1;b3si0_nimkIM`;JFf7D{!Sf)D=d`>t@#=Jq+=H{hvDV zc9_qVq$acsqE`3fM6gK_9y~=uBT+&9s&A;hDu=k~biO(iF~twVE3qa?o#_kIQJ)NX zBXl7qZ0Ls5EQrs*+(wBu6gdV34L;ouhq8xy@jj!ihf7WCIlpQ>=*$IX_^CVXnIo}l z0<#ZmUW`rNUL{Zx!g9Y9`?Yi>vhF5C@}AO-UU#K5T(JQDtRH~y`5|dbJEmu#swWSj z8`K4k9jUis9Ndax9zii-B6!P`_A$d)yoGmk!bPXB$iw%jB8rkBIzb5gtmb=t^7T{CLatvJ)b+(4cNAcN6 zG8*|;&8Oey@?XW~Pv-^{H^B>9ys?-YMD$S3f0n#4Ejb=LVLrh^@;qv>205`V5^n2k z=~>;_p$Hr8e{lw*Ytb65L%VZWjHo+M62?=*cQ90^{x(6vLqoBcDrtnR`axhWnkpmA z!+dTenkvO6yo+Hz*Ap#aaEJtMK|YrfpJB@j&8POqj)i&|HFSTzvp#)6BbI48q5|m6 z&FDTqRz#x7K`){+t5E6hqSiQmx~8aL*o|yxa=q9anHGl+M?b@v>P|T8qPv)7LkUHa&$Mq1!XOqNcAJxXmHgR(cah$a^R;uiA)`*k5 zp^l8<22SFLC1bLXdv4A>m%I}rSNjr0x$e|lBr-_u!k$im97bUO0;H{h)+X5gPLF-Z zrIo}NmynbPS~mjmDb!9Ox(kvkA&Lq}OW2Pjuc&?B9*-evxgdFi$HrQyuzZ)s(#|4EG12Iz?8s?SMsOooFXb6U5AAA7Z~? zZF(+omS=5Z%s{VDSZGEtBD+zeT5Q{IfNl?q?F8kZ@t8lOG$+78(VRRX&qGe^8(tUW z-iFvc#7;OgegORhI?^i`vcp$GxTh>@C`q1-X%*ivK?I#)-Q?aeNmDA|857rvv_^bM zC>xvRFC8b4OM%!4Pmt+Q6HOG2EEwvh=>j^N zdoIWc^hXa8Lt)(_=|0Jy^@dXnuI_sxYU_?{P@2{&)$ErCb&I$3(XXEh8d{s#8}MU) z7lQTez-4y(mj@7gvh_UqOROv_0is=QliVge`JW`CWVohIHkW%lpvjZz0cYH%(sPFhU>3>BB^Qn5_?I>%-OhaJxP{ zq7N_Y!~6R1cYXLpADZTK-*2K1Tk69O`p{1wM(D#a`Y=r&&en%p^f&XQL0B>BG+Y5L@op_8+JZ*&F;P_T$UIrTz@B2@Ki$e}=W`{~3yhbMO1lhytOg+eEbOR{-5b;?`fInk1{~?he;p&B%yZL?2nEg^ck%cjmONxrlDd- z`U9K8rZq=M)0qM2JC*>N9{d*jE;SCPd4p?W^C12ggY3g}{d0!z8?$~=l!P!0W5DC_ zYJu>~g`QsBdw}UEtA-CqyvF`$o^^rvBccxEfSsueMECRW2fW|t$Pe<}Kp*lD`n#UD zUuqTQ6VZ&2sJLsi8o&IkY&bkN(ubbca$mn6D3)>cb>SOiXN25}7bHC3^CN zu};y6<0MmJrzY2aWQ-&(E;i9AIX>PgX-f3u$+htlrY6TGPK}=I6q}eBpGZhdd}5*` zAvt!eQ&MtbZ1j}cbcwOkB(X`!PE+HPohD34m>f$pj~)B-dr8UB$+1X0C3Z@DV!9K) z5FZnrJRyFnQ(W|f$w;XGNv2Mk8lO6~_H$(Ngfa06k|d}0ZN1vIZ`0np&A6@|yvD?i z85`SX?1aSR^fqx5(&*dSnWl~q0rL8!W=&{Gc!|DQvv%kp+95xXY`MsVVxiUKm9(A-UjUsnM1Y=vAV4r61P}@c2lNH>0}KER0t^8R1B?Jf0!9O(0Wko|Ba8z~089c< z1|uFY4Uhzo08#n;3?oa;3c3EPzBHeUIX3&-U0pud;oj`)BwH$z5{ds>OGHcKr;jw0|Wpw zfCWGZum;oz*a8{?>;U!v2Y@5M8PFWi0^kauqHGTU^^e#NK=)NcOi4Ncx&XQYd;nB) z)dL^`^aKO}f&n3bP(V1KF97GFkpTcIP9Fjo1{eW|1dIk)pbmBbcYrTo5MUZ$9)RMU z;)&LYes>CB6W}Sp84O7*U2P`r}oxz1)2S`vj2P`Bm0MdoPi51!ju+AEEiyc`l>Z6?ihp|_) zz!r6a&0431z&Q+n-T`i-V#gbUrtCp?*d(TM0G(pbo!k-NgllKSHN&&!NaKREE$~iD zyz7cQfRIkDkf#UoZjEoW!MEDto1XY~dz7IA%HoAGbwb%Xql{fp)~+aXH4*ajV7Y4CZWxypzY$(hG@h=NoZ3E+BOw!oQ}56 z0G(!mW~Bf*t`&&O!?T%4Q-HKeyraUqbC3rJ;J^apxd?efe%5t4zO@qHT#aw9MHx1r zESpfKEht+N%D5e6-H9^qM%nkF4hK+|V$|sf>UIouJc+uhQRmaB`&r=N0&sB&IJpYk zTmz170#~0dV*TxU2w9p98lqfnyDDtp(0s1NYV3*oP{xeKwuJJ!nwG!x+Rz zeL!bacOn8kRf3LcKs(a0jaqwAkwa;M83+D81v1D-4ru&vfPX?!RDm$kU2^BuplSbSrBz&OEPn@ zC9$&=66sVOl$pO2(O_ zKX4`|i<=QOI^xW17h*TA1(6PDNz^@ENo5x|Qq#_z=sa2>y$3P&Y)$OE+mIfCZHatf zJ5o8`lcdYrlOC%(;IsrUe7_^Hv+PWCK3#}tsyC_J*p<{g=|-fE-HANLml$vNBX%`C z$jRO!!mJA*m0x?3^btYi!CzGZ#b#!HWKxZBt2G*CZfU7z<&&}D<4aAYvYJ0emtoRm`G~uCll$H zDePEX1UeNMg0?XBi7av50AmlvB6VBPmk9lEDB{p(dDlTM9?pu6a}Ob(Hbd{Ps}IoTjvqM$Q6Vs+(ekpyNO`z zQR3d{9FY&cNkq*nNKwvfB1r#A)TXA4sJk5_sOQcU&F#vlkM(Al6(bpU&v-^4&tc^A z7c=q++ZchFnsLv(%P^&H81+*lgQ5yY1HtL82BLWb4bzsS^^FYt-stM|>}i!zS$1xx?n z7g;$Nsc@le6+%>n1m@D;+)&2V$7s(bF3r5{B z7QJt5q7IBU5kwZ56b1ZgBKqzpkT0AiaJPCW5Tvy+Wp2q#nbvnq1^I2v+^c7p$tOQE z6B+uO7nQCt7wljx)R$u|M6E7c2(EUtEGk)JsW!C`G6yn+?&seK1>rGP^050>^0EQe zf+uCx?zw&HG3U$bsrL=2Uleh_zF=#Njp)={8}+tqTfro&21TZu8i*ElZz#9E+t7Vh zawCDItsS$j*pBHty0M^{z~0^EpuK!_Toch_JBOm*t~m(G3Y)42i5*2D0w=-#D^5jg z7dfl#qMI?TJe#{eG;k64+;frl+t*?N#?c_qs1ReOHO9#iLoi>=1|NvAxhoiqnBN() zXrBRbRP%_lgCW^=*N8ka5D?>iX5_*TOX8)gM_!gSB<z zGOSBD;q4hgI`y1PdbE@h(c*<9^yYSw<$RvFUickH0t%R$Bib=}uZJ;xTNW_=VvjQ` zEI%>f%FYIdLNX1~kDoW#FuDov_Rdt^=ynfy(UXGt+V{u!4kNo82KPK`C;MOs0uj3w)w@rmz33GQE4d!fe?Sjd{=a29}bK?S#^Y30CrzXRVc;JJdhE zcfZXz=e`ZxR~R&^FS=%Tru$+0IVC3?<{3Y8d@#tRndoSyR~iO zgm!D%6m(eUeyNkk>MmU)TU_ftGiI@Wi1DnzeHZqMW2c&j?>e=--=6iO2WPw;Iik(7 zg;5Qco5bDwbYzm^)Q)Kf?4GBdY!;dA&>Zt_IObihC%%v|U{ z$l$QYa|2tOS-fzQfqeC}9)_Z}1B|XLS!ldymO#)owb(Rd$X0X1ixrlU^(R`lcMZ3> zzIQ>x<1NMZn@S{(MT^{A?ya2S{^4-{c2my(-f7+DuD;QtkwH7wMD;oFX4p`>*&|~n zG|7&Cskoh~JC5-SyRqg>;*oc&jYyB?=0xplOXeJGPTqa%N_7235ax@L2qo9aw38i} z9?Odv^}{I!!m`o4X|q@Jbs4@!%)tRBb5?#ceHT5{vd5NL_0%oSG@KLLvFSUxO-tR^ zE$x_<-F$>&nuSc8Q8KJYVa^ow(C4{~C7;Z577**!^@-?B3nJ2J5$jKn2-7Qx zVdf7vux5&R^Ew?f6wTRUA~L#aZoPL!y?MgrjhV(NEtoLlj`LOz3ASFfJxa8Bp1gU# z2ILIpl7@#Tk!2st$)tj{jK%36298XGq4PZlf!AbD;qCPs8*Le9;_CiAt9!|F{?)5gOFP zyS-a82b+4}*|^`-vBL-U2^MwpYUAqE*amDI{iRGD7dbd0w3o=IQ#&`uhC*%*eqJy?gq0Y471;!>nJiaCV+FJ!x`W)bN4f!T4U=rp)$DtC!9x zP-LYfOdLCENIzQWHa6$=zq9INhxYE+x?%OQg>o?D`kw*t(1lDUdxxvy z^78nD3_BaS8oQfx6O1sOWp>%z-ZEYI(rR?Q-|J`CHfeaVQEuaqCU#B#biC_)y7}Q2 zhg^@jpYteh^R}I72ltMlo#VY1bvxSqnV*TMP0xs+_+VwohR_4yrG3x$J2&9OpdCXN z42vHT5NSI4Y*gA9hp~rZdyYFbzVpPDlRixLpPCiFBcW{C^Tbz4FOsiGcBkZ|iqn|% zUFrR%S58mN_%mZd=AF#0SqrmXX0^*s%-)gxG}}t*EgdPHE?p$uCOs~_BE2VlA^k)8 zUiwk`Mfy$pL#nIuS6lDekV@+5pB4LO3pq$5$Ud4u2f+Pcr1HzJ_C0s3NZm<){AG}h z$oSnFyx#No~lbsK%fEJE*KR)Def@g$5C!xM4C)me>}KQa?%AoUuYW*La7buapNRg0 zh721qa#Ylq*l`mkO`e*NC`nDv$jp|xHFWjr-ZP}{fFUDBMURb}FeyGMB|S4+u9&Hu zJ#XRSWh>Tf*j%)I=bnAdo3t1885T1sF)cecUo~&hvNfBw?cRU*c*(gdH_IPBeW`i- z;j684x4zK{Sp^GMZQgnC_^AtJ_nvG2{A%62$KZ(>%B7q396fXO&g0)-f3b7y5;|gn zL{>O|`MRw;_a8oS{@UHgFSXSlbXG2+VN+#u*X%fay6oPwSMR@=x%VC?TeAJ+^{4N2 z0*}5^3pX4od;ZbfH8>_??#6>>@4R^TUC_GUwAour?r3$!?T1U(o_zSp$ZPbB-!8o} zZZ{-jMe(iIMjfLIc3!JC>^gBtNu{Ar{OXH;8g?1C;An+m_i5{{e&&m&@2cSUlpe&W z#r-PuzqR-sK74rZ-mNoyThvBY<5yNzcJ}O{xdCo81^pq_VYOO)=+O2;|CTfb{UKEu z41?6_{c{4`XbSp6D*B@-MXodj{ZaFw3l}aNJGNUD;Kn83{x2;pEiT@n6uH(K7$Mb# zvuDp9J-TaFfLm>Oby%zakPi6qLAv={rL^YDEopeo5$U>5E2JMkq)L1L6((Kt-a-1I zT9Y06c1QMx*ORlqYF)DjzIu?gLsOV#TPjlR}S7o%p;sdxGpx z{&?quv&Ws@KQC_LK2@yk-Wg*{cTbN=+BI>E+s?t!PqzC;t=Q%~diZa;$fia2N50&$ zXT+|}is4zC`VWiP=rGiE!;8Vp`YnSh*2WDyy{6fKZL9D1TfAy^#LSiceKS_P4o_OX zBy8F;-_WF`&qC6c$i=yf9fIdCIvBKNVR+!l1VhseOgz|Jlbl=%$DvK zXUuU8objb z)?JabYsN~qor_mJ+5X$=728g&8UEXowM~nd^)I)y+^}nN-;G(DvNlC*+_~9x!}Bf7 z`X)scYlr=Idd>1}+g3l`zIav3oikS^?#ftEvO8&c{k_wcP1u*T^wj>eB~1_JE|wme zzvy}KmW92KoLsQ)=)?Ie(4D)tGZ>vtFD( zr5t~;p7QOb*uvB+Cs1RDg8A2E`A#>gX70T?WM&#cqF<%}(=BqgY3|Dhyjm!)(GHNWdu=E0{r0)+uj>7>)$a>s zA%Dfn{`$~Mw)RtNSy)YDw4|AA<2M6Y{~rum*g&>}F_R7F*`eiI%k~-dl8rWrm6@6r z$PSwAmqlAVmzfD0$q!f!kVn>AC^xjZC*N+{B4)c5T_x6rS}JmUXj-Zas}`A-5)EC>tSyzoHK z{6!AIIg4fDv?WhM5|?%ljbFAnENQtmeEJH%zB5*;A{MVI@Aunk=K-hI#14G2cJm-+ z{jH`ovDyRqM}tWApHJ2&qh@qEj@kxhzpk;8s-8ohj5_o&C)2SvBsIdM$luJo9a z-Fai{?^VT4*f%Hc)PB{trU&!KOAlpEcwRhpV(%lvCha>an%wlb%M{fKgQ>cc_opVS zcgFuwnw1cDI(XW%GZu+s&Rt1-aXvq3{6*j7x0l`|r(Rhh;g z%tt(}zHe4Sq2JDU;{RakG?Bs7Cjl-~!U6*(9|#&g$su^^M432y!jq8v@!dmbk6Roz zFHRe-ibd;=RYgpXDepINjProO(Xj)4qc#t69{p^vF4BJJ{gM5K?HQpMt{A?1ME_y; zMmh}DMZOs9GTek^^CtKamGEsjhd;nE(M z+nCYJSqMy~0HfuZq9$HhYZ?~<(+{!+HEfx^!*+7EvCWR`(e)~`4_Y}$&4ppoF%~J( zLuMFUMC5#Cf z58l*`$!FY1KG6^{mcU}Nm6$N&ne&VlNg&sVCo`AvBy+)eM&R(R2(p`4F$v5yrV&Yl zqa$x-DdSC+lFwu)Q_Kt{#iSAV$a02{_0nnL!sIe8B$vD(fy_oG5IioQ8Oxkz%(0@l zOj%yq^Ny2E?W zBQ0aPLJL>}P1Ip#81#8|OgeLqF@y&4476Z*Obh4|UqYX?i3uW`h#?cpoM9}WkGuk% zmj zDtOvj1-)G)bDW8U{?LKRVjeLDWDF@K&6pgf8Ob5fNC2~*2_Wl<0W*dvWlUk2bdj`T z3Yk`=NhW;NqSR>RzF6mx6{yIdq2`n4ZwU@|YOr6k`V6 z?5O=oR-d1E8I)&m=K78GEe4 z9zZv_g7JZd_barFN0|}O)!H)|%mc<4+U0Z5aL#00p(n0{u5t?#42`cbGmbgO2%&2( zgT8YP(+*nWx6oYfV){b=D`euCGNvIk&v&8yT*7pL4*3)Gn1`4l&;~bTQklDqBlOTu zpbK5Y^ngZL2d(BwW;Arej*OIfg8u7?9t<`H>ra35$F=B@P9y?-c{h49_Kl*SEksYV zA%W;M8_{oE$UyYC{pfQhuu&V2zIh&NRxx_(R`gdlSgYlumuev8=#E~v68*3V2}7US zj$YN8j6{Dth91d~_UK9T(3h;Cqo0Nzbe%Xu8!tzHcuFAC1HCT-#oI!2F9Dt3h6TVN zQ2qhXz5rVO3FspipqULpuPH*mafjx<0KKIO8e3oVhE?bf4$$&vp%*-YwLm2L#c}iu z16bCL0X3GwLu3Hxb3G`u8CKCbpvz~l!RrjVTMWu;Kzf0SHiM2@lEI+BgP=iE(hc;! z92DP}^al0*2KsG9hJ*5tfc7n6uQwGGb(J)QG$$L>_?WaMqd=c0K%qQXDa3#(PQlut zC+K7YD5W_p4-}w}=dg_Eg7#km3TOx`g;ccrUE&IRgqdi?O4v*IfbLd+^6X)|kO6vo z02_!ApunS`K_ToM;?c5Yu$SnIw%&!-ZU@_iIcVdzgrIG(nFnobf_C*r%Z^7&yP>Uz zqP6*Gn~rFmv1lz9wAVnimLU?~n*YYDs!2Id+7 zTfKm<6yVAp*a`){%zz^wU}+Mt<^jBo0OpKQ&n~FxIMmz~bsvJ-Lxv8#jRxijYC

?{OTS8Mq@SdJN#9A| zNMA{Rmp+p|l9o$vK)!ZXS|U9x-7Eb~x?Z|mI!~G}l}aVjNz!QPU}>n-U)oXXCbgGZ zN*U>2*}rF(XJ5!ZlD#c^MYb|KBYR@@uxxR5=WLhkdfB?HKeFy+oypphwJIw=D=8~7 zD>$otmVFjK>viVs%;TAxGG}EbWe(32Wx8gXXTHz4n{g~-ZANa!_>9nuwi(tLe@?$W z{m}HK)6=I9pWbbH@brqQEDHyC|&)QnMnqdr7#kBo_I9C>ZzjFH_( zz8kT5#E21ABhCy@AKqs8(_ssTiHCh1x?^b6(0W5p4@nu~Hss#m!ofa+{}{A#P}rbv z1Gf(xG0<$_kpbfeG#qfIe^P(v{$>3#`?>eK6QPLkjCj~Lzi-FB6@8R_I`?@RJ}bOS z_|q_DSf{Wjq4}X5LLcEKDh^@59gjqYXGYgd)br$pmKrlOtx{rvyxv7|@09*_K_e$D(&`^Nd2_!e~!?f!?4 z%BQVQS+|64R^9e=?br34_dM_R-q*S$bP;yh**U!PADs$2xpz9(F|H%O<9e?iUXMCt zbZFG!K>Pmf-+IpSboV^lZcMu$ZI`$0()LE1sclT#Y;G-T{m>)LqrS(^R^nFA-Lu^r zx$koecdK-jyV|=RXxXTO4rd<5JmN*4(c7-e$d6y)^CQQ~Of zxT&dc)7uV{9rz9_ns_z2Xdi7~(|B%U*TyI82HE}5D5sHKqumXAHGI?{sex&OwYHsY zuh_)c)YP9-zeW9{_4?JTw9d4yXT8qET{TmI_)*Ns2N{rTvuCh9-x?c6xw|;MLzM1ew_j=K5kJsuyhWznb ztI*nMcfIQM>S0x4m7r>krnBZsWlZIl-{<}A_WQ|~gI~UWk^7>_i+#^SpFevx{h9T% zqNk##_bR4U2rAY+>GtHt<4KQsk5@kG^ytdNxQDt2%N}%iaOr;R{U7(1-s^DhQh98- z?(Xut9q(SfGvN;Z&g$D;Z{NBVf6MIF=9{9Mk8Y&ju(`4OdieFKYkAk2T{}@WqU`h4 zMOQmqExR)1is_ZDmwR1)aVh7L)1{LaBQJitu;N0u3-`{aoo{sh(77S!KAl~1w#(V_ zGihh+&Kx;C;`Fyut4{Se^|Vw`+M@KFdV<aiJen(y$RvvDDxV%_e+_Lz}A;}?!LuU?7IcR(E#DTa2!UKo* zkJ)d&|G>V{`%L%k-#dD*VDEuFQG3kx9NHbTTe$n^uJOBUcR?_@(_!bu9cepS?zp{O zvAx6gr`zUk^WRqe+uGkEej~r_DH>B$zv#@?l&x-C?{86U>9OVg=1rT2Z8qOrvMG6! z+onew=Wh(&_-(`94dXX7-EeEYa(%%1nsvL^jbG=qu6*s>wIOQ_)*fAxyr%6M&Fb~5 zBUd+CeRI|9RlQdkt}0!bz0zmp=M@K5B(CsW@n-ps<&&1TT3)rRXxaE>?#rr{7A>8) z)MM%ECA*ePTjI6k!{Xw_8H;-?<}E(ANVzCtkqwJzIQ&tonC@d_DD(qZnUihrwaKYSy z@df?`jS8ysFXXS!&&(f`@0o9!|8i!@%oQ_JXAYRzZl?Lnsu|~IY@CrZBYKAa496Ki z@*d}%$XlH!&5Ozl$ZMWwn5W6Tl)E!`Uall}Sgv1gvs~lc*NU5p!-_SE8Hy>2K?+|* z3x%cPV@^fRg`9mkt8(&ll5$4n^v>y=(=11r^G#kQzbii@-zQ%$pC^~gr^%z`{p101 zFL?`jL%BfyRrW^qOmmX|_ zbCordImql}wlZs(rOZrbA~TZlWjq;{@c5(i?|00+e__`BUHTC7?OAEDv`D&4I#Ze~ zjgt13c91rf66uTVbJ<1N1=-`Xdu2Dv{+@LwYiCwo*6^&hSxnZA%=MWGnZB8V%v%|& zGR9`K%6L0{-*n0J&eK1p?@ynW-a5T9ZEf0+G>f#-)Ra`W)O#rfDP2-tO6E#@BrlR@ zC3_{8CuJr%CaDvn6G`IgX+G2LBqSsV64u3ciN7*6dg`B3@}}5M**Lkw>#3I#4JWYf*BPM^cZ$A=X8z{k9v+d$AeiB6N)GzDw!o`b_u(%0rquo zFmUhv?|bk2-uJy8iteheuBxu?>6z*6>6x-<@~cVKlh#bk4<8UNnDA}9+jzmag0W6x z*Nk~L+HCaVum__^qo$5LJ)$MlFEnlVyAXqr*~9)0ZbUuNWZwNCWgr^3ap;R7_#q<# zw)nsF!}$#xyutU8Pd9kaCBggBz-li`uj!t9Jzl%_y7{;*asA8X>j3(IVCQ6~i;g7@ zOow6iNp|OKzuJ&&{J9IQk6OL4?6z>Um}XINs=Y&NIUn0~3Sc`pfmw z*{@mcObg~H#!C7L+H0zqVnzuiCyxMXKVLOX|aSL@$8z}xw+#;d$E`x_7cr$+unMorJ|YM?B5jEc(CDFeQTY0-RRoX zn)B6Ps_<1lm9fGG2~qmu^t$6Q$19IT9jiP#|7h)zMMv5WCm&WE+I)y{=;$Bzf86>V z{r%&?$b;<%HXkrOaDD%X{bl=7_UY}rx_9*6`aRqBIPH16d)aQi-S>9Q+eO@UbLXs` zq@8zn#OyHG@p60WcGvB~ZAZ3+ZzFHZ+PYzD;8yvThg;Te;cdZgd9!)%=INWQH#cp{ z*tBWW&D;_(%AO{84;ke&vR98)7$DZTPfauztY$ z_v;p~!>v2K)^6>U-#mW1y2gIZk=6LsOH)6lxTkDgRg~*iZAXu9`1 zuOQEB?&faWT{@g+J7qaI+3&J#?+IThRlfeLe0sAY{jgdzCLUAFl zCw{`)<5Ds2RF-`!l`rKcvL)S_62q=V9nZu@qGheGnys2vH+-)1tleGRR5?a?rJPxo zSW;Mo7GC^n@I~-h^eHOu^M|n9XE_1y{>dKn=I$%Mmrt@rKF@y^^|bx*mPZy3@78B}SL=pCoYN)cRXQ#xcqq1#(^Y8|FO-5yEIa)$5tSor) z>8}rab2evheziC2%(EAdMGu_sExY^dmi3K2SE-i|U+_Lx_V=;V@h69$@IF51=*YuM z|2TKBegDLLFZPVtUAyzpj#=A%w%KiU+A?hO%1s#?^)_xwqorLG%mr5}ia_uP0W(Wr zt+W<$!MbDc_{$Y**WtitPOwx|%|in**H!x*?XHR0ZkkvC9-twwQ2YGpg=*>AI8PgM zgEjQ++Q)P+og5Dh{j{eh_L`uHfk<_Lvf=ZzE{4y;KjZ(2z94qav`OQ`Mot(zdenq5 zBf>_G88<2r2DMc1J~V$=T8LnnAQ)V~gTXOp!kq9q6J~`c4@h!Oblz;X+3bMcU-X;Q zTQrk9UONYG8@$DM5=Taji5MF(W6aEu*~4RpF7;mR{F_6x>jdv96Q)jz z7(0E;j8U^j&mA*&%rfUh`&G89Z1?FM&_8JKH~k#-Ht7lRDft$~`1ar=G(Kehh?p@m zN6j8Rd&11=6X%4?4UQkWAaG&eDxbA(JMFeuM>~#p51KVMaFNTB0SWHOjw>BkIIc6> zY`)!Kw_!T-6#Jz9WyUS)BXTD32IUl$b9-pQsOe*;O`S43Bx3Z8usLJrhb#NI-~79|TEnM{gA+9P{uRH*|E8##G_eIy>+c`uE!LFR z#s8^1!gBHn3LO(ZHDXR=O#Gsy%fafH-{2ycE!%eN+Pm+-?}v^YOaJra>A%mMyKwRH zm21~;-nw%)sO8ChQb+B;t89Hp_mNPOtT@Enk1F$C_81(fkFsT^WR9+zzR#sKl)B?L2fnhDJZ6YzStxF>92G%K* zVDoRCi^!G(2Kw_tMvfUjamw_F*>fYKW3(%Wpp~g>fSDWkX&X0f-nva~=w4vyL15}( zovo)%|E06`@)fPUYJ=4lLzACClcCMfXkfL@Y-l$yTx&Tr9oVil9$F902lj&sw89F& z8o(;RI;blF>cAp{R~YCxEQ3lQQkWQoLd4+-WDFKgAc6qLp`QW4f=Nm+wTMCB0mF~~ znv@EhG9VkQYGj+(!h99{Q(^kBeSO$oEUs6HQ{wRof?PqA5ea0l9$!-qlmH1ew+aJ< zs33nI78KAis5N3B7tB?GKP*;->+9!|^r8*Tl!)-!LeN2)sc8 z`ltw&s86MXc}qBIQ}84_*kOT0LR@ZqdHYcn3}%aCRM8lA-x2mB>9GP&R@W+w`FZIA&EqD_Gk*biMsa$Bs6Xas=BJ6_HRYt_0NWqX zX;ccCL?qy0L2bAbqe*aQ5Co9utd0G(afCLG(#9*a@qTTbsg2nYn)3Ix_)RUIsg22O zu3FJ3e^)CGort_Sw}0KTsHvlZ2DxyJS!ATW^7ETVH_jg0yLoNmqNs?8VZj03ZjLsV zCWdS}g@8p^n|AI@Prr6;#N4EmO*{AOJbXC)aQf-R!XhH(_D!^-WivbK}H_OG8iRt4F=$1MRQ{v?K5K<4D>DX)Ift@vD z?(E6)8AeXVbd`Ouxm-r|bJfFO$QTS!GRC*N%Wqs4xfeIrTxsSs6xV}A#?vT0Ms9MF zGsO%?kr~Fx@VFiqGo;-n6l>h)=h4T)sW|Kba`PZ3g2W{PkLe2>MpUX4qx~`62J7lt)Q>F)tPsUF^GAR89Z-C>BIG_cwb8H*DUy4~jVV0w*4Sj!^^ zbP=3}vy~V`zS^&})9p8W!z2O?M*=SrQ6rYEPNA<%T9q0zbjEUY`HG1f)~#Qcwq}Fz zX7HQC2L5kbHg1heNj~dR7W@U4vSv>`_=3UGq(}561SbYn_I~+@}0PN-r);YAGw@U&9QVJws_s)D=&ps1II?M*?aEcr&E4S9za&YvzooDWRsWD%K4QId^8DvV}Gokc+bwTi4c4wCOt?7^Yog(;NcP1#TXK-EyI$k)iH z$Y00@$tNh6LEbFwfl?NLGDjFmc2j3iHU6=ugp(r~9~tE|F-=K6NxG)>&Nzl6!->qN2GC%Qs>qiqEtH$g z(~Og(Sn4ENh1x48fSm=jY@j!cc9*&s*efDG1Qso4j%GHJZUN5Sz{;0ue{7>qV|W8U zhS9=k_P~}m_477@X#SGByN>Hm*04QZND8HL319jgBJpV;qQ+r^I zC!m(ouF|DI?`0qpT-Jei#sMCU4KFE;)JD*HhQM!gm}$(1WDn97@^k8W>PqS-&`OQe z2>N*-*NXNDcw`nRw}o7A`;WAxQPU=ej}ICe;6G@fm%GaVXGeQmYcT3lap1jJNmol_ zWl_%4n>YSCw0(VI{On1i0)1TVEWj>3bQ%FX`hpM>VsCG2Zwtbd5%xZ|$?+pYLvO~1 zhT0CB7CO~FdC$>Zmp4DUU$|ql?Bau63*%!$LvI&9cyPI^@X@2oU5_4>>|Bt3|G|#r zd+A5FZ!Wrj|MJWKA(01-2Yiss0{q3wP~P168UQ}bsd~G9l-H1rAaOonbO3K*zDlK7JIpUM z_KHdl?(^Wi9z4LUo%+ZHYPi6o@s3w8NThb0j@HI;nz%4t69;SYU@g918y9NF>sTPs zSu2+S))6qlb$|wNGFV?g0x{fE00xq=WeGQ|7PW@BQ=2 zqny$f78q26Cd^s9Vf)bw4{|HTRF1tj8XlRjVb7n}p5&Ib>KQr=8aiR-lC@h8pS_ZsvyDvI+ z=8~k%N3J~nP$s6ZEuH;GMJ!0&as0}Y-11hofxTD2xEYI5HXpw5;9YSGUC(mxs7dn{ zZrFb4Y{uKNR+fb)FFZOaZEyO;yIFY^ZDgjEJ8#0g<@|l8Ze)I}5b0SBFZD5mo_sE?A?RL&0e}@=kcpRej8oi+C6aG>?Lb=9>4PFeOU`b&)U^@l_XIL;_N?k^K%vev)qFK{(Kna~5I2LM- z=hUYLPYqIN5=H>HMltAcgo*(A;0V=1c@D<8aeBV&-PGsQ6F@7Jdyba#lbrKZdu9%> z2HF=ulTyXN-g>}OLNB48qqWg*(3Th;HfW(x8Lxqc^>ib;7vmfaUIqAIq_m=~q!t+r zHYDkf(>p<#M5_n&h^F(Ya9p>d!TjA+Z+e*86B^rL?KPfRrcEtoZv&dFK^mplRdbOLbPrEX#SvfJne4CwDLH6OGKS_h9tsu=hWdSBB%P%7*tn!GS@ zjV0+<=ta|4GGHrBqLl+3&{B9nKkTOZvabOTjb@&wmV#P@srxpR067`~C6!&pc&^r_ zu^h_RXwg_S*f7B03wa?UmwAL?0Iuq7^dpQ3z=tQmwf;Hi|7#g>OmA@CV#$EL3t9os zC@6(bZ2{N!b3h|(YiNxXsIyq>!wI0zz%xz&`V${`x)ikjLPin8Qr%L}w;KQD0FFt3 z51x}bpseOhg}&BUI+4X^!JcTz*bmN$5@6kG=1Oq)wgud~8B#r|mG9r)zjx#0@nhRk zlU61yigO>2xH-v~Dm%3! zKH+%EjJVV|@FZ$)9};R8bv8cM9>LmN*m*rZb}AMdyJU5${VT9cNPA5Leg6QbL*tqAZ&qxx2?0ifstxK}uV2cKgCp*o&5 zN1gaG#U!i+rVfv@LBE3d>6-Dbeh)xGvSXC%&|NTVQ;2uSk}Pnekvz`NcfCq=7$8|gET<4s{aQg0x&6*u1y#>LogB-!h0EEwBnOePe| z&r)HWa~MHJc6wO3R*z*`#|um>+$^cZ(P8?nC%T9&UIw)4{pawlXDzYRiY2&jFV3$| z0DJiK%DWm1G7fKAoiKk|Sl~csuBicwLHjZNlAre>=gsqb7xyk4<_-6Xf)ac=^aF==*&ZSNa z^0WhjD0mG)`+xl)Gkw-C6F;vPxf}gT`SN%2l%cL%6TnCT(?d8cB6^fO)Pnu6M_X(LVR6p%s6^rzmYy!^M|u3<2}sTRFZ~A)hiQ~K0A>* zEx^H;rLLl?S0Qb!$hmWL-TbkB&X!=O8PMaqOaERx+{HqlPJvZK$W%JJ{psz^GsX;H zA{Ed7+`Tx!NncwZ>wqPvbHVp%euNR8!K*2?enS0b}RxSug|$C zi0}p587bQeAN;X&l(Rk_>Fun1b6zkjz?y+W`lO8o_kLeC+Rd1XMO1Qe#cPl=#D+}- z1A(HeKL4MC31dA>>2O@=?P)7}c~&qd&`zHWAH#ZO9kqFP4OVpKo~AU2_V%=v zWStSr6O;!oLb~>49)0i{&Hu_G*1KQmA=lhtW&E- zI?$oveLYQiV8rq=Qa`%&$;G8l4lNmO&xYz%eTvTNx4?QoO9nxWE2T|epzmFcsBlcy zg^ft|5Tt&i8ED^ebVT-bqbq2=hHEpReeF4${FzwLYGoJZ*^$BAt*qhs#$m?L5QXUT z-!bki=m|w<#luZwY-q5Rl#;r4Cl>{ns4eR4ZvJ{_^Hetj&Cm~;`{k(>Bka}g0Vfgg z=gsYN{mf~ai$h1OZt7p=Ej&$k|8 zO|>qxI&C%I%GRpXa=&GWWt+ueiy;<;=85K1^Alz+W_L}8m_9ZMG|4dbFg|U>Hrl{x zFq~j`(|~P|pr5U0rI!rW_875Znb#RT^kDjCS~l39cMN4G`85ek;t^L9ZsVJ9wzyef zea|~!#9&oI-}&BhrIB)iV!J#`*4HznC#5?>DwX(4)^%lek~=4NoM>+n4-xMcRkiuI z9c&f1Ol-N`Y|^~3N!%FKnBOp_;bnbj{p-4Mbzf^^Yo#@NYn*FdS1+#CuYOv!qRPIi zyz*paRHbvJRQOtWQn*?eA>;|2g+@ZE5GzE48b5fg0&B;O!SnSel?p7k+P;{N4yxYs7IY6c+vyr+QYDd2qy$~*;S zpKjZEi)X&+FfYn(H1B1|o*)2EK>8`5!8|p5D6XbZGqeb5D7{w^v6m{tQ!LmJHcZ~0Ir)D87Pc~B>`2kL{mpiR&o zs1Mo#?S=M08=$SQ9ee39^`?%una5x~y zA!cZ*$L^sQcU~Gg;{MyA+s?NPZSbH3UXQm7?8XiX{9QFVFg#*@;5@x`fgT5T1wMIm zEO5@%i-Dbi_XE?`WCylI76k@~n*w88dINn)g0ShIgRH-n1brJ+6LjNlOOQ>3B<9YWO zQ+SgF5j-+7k2iI946nm}5zpaW0?&SJGViM2Z|d{rO5;YJtPm`R%iYeK_+}T+@AY0@ z_uB)!JNbX`9EC@Ctd8TnrR0-53%kE~s$pk&d9fFGw{~6TS!7(}O|7}f`^>q^dpPDE zuVLdup6tmJ9z&VQs|tL{n=W|68}<4f?-26?PZ9A6yx?5GYw!HVvj{EW6&)()ksB*{ z7lLYeQ+{vY(VLoiH-?FL7RNhy%uWe!`#2fT_Pi4Qf{Ti-V$jDkap)Q%0qwX=LM9gT$={KG~&=IWzlq9Ho`8V3chrlT1>CTQsiGxQ5;f$pocL}h8# zDBi{f-Tl-SJu}N5HI_J_U-vkn9rgoI=Z7xn(eZ95rotUfOz=eCDZEhGR&TVG<%3>0 z?2F>f{m|MI{%C~75H#r6P;`?)5bCmv2kvr%QBLA8)UPrGO&uSKzQ`DXHd~BB`}kpK zOT}pPVBlD^^3XW6sd+rQh8K?R+cOb$Et-T{+Dt){;-;dE^V87gs_CfGJOcHcG!sqQ zI17DyV>Zexnu8ASn~O$RN1|f`qfq74Xms(S`RJB4F=*hHSoHMnICR6lcwqkm^x?LJ zsC3;T^u)5o=+2o-&`-fj(QvzEC?1o5wihL!o!6G57VB4_qerbo*U=NvyYCZG@wOzC z%}YiNM9HZ9_$u_yuoM)nPC@tZQ_*WitI-V?SECr;HK@(Emv>riarIs>0Gt89 zXJmf>!2l)#hyt(zz;*zq0b~LY0}vhj-3G|CUvIhJQB_ysfnWtbS6?~#-TnJO0And< z$ocfpq1117f%~#nf#qES^%5_m>GdaX;PL@Y5(x5ws;qVeSv}tq6i2xk1op=d@~Bb- z0nxmFmRs>Q$!y_%`Rem#{MYTgx`w}agq~7fg;1gHtK+|t(Ygj3)aI5uidpQ94!!J; z`fLn9gJO9o*i0V<^8x7D73XfE&GB=!4W5FQS z(Y4udpO_y(#fNJJA@mPdTwJY&`8>-R=H6-VYK3H0)Itso70~n5)L)TElb8X(cYa5b)3d zPZxspIA_!!t-n;T5S(s3@H9ij)=xRY{HL5x4nqqNE&#;e;N43LM|p>ZBZ6eNXn3Ak zaou66E(qa*J)n#8Yrw9zzC;Fsyn6}hP!8yM?$1DrfWWN_`sAQaAw)*4@8F>x<`C29 z3Tg5zhPqz4LS2K0LR~dQFb#RwTpRy=N|<^gg7>xa-m_jK$hxu_fO`xaBtT$uVZClS z{XIxsFHrX$=P@R*UO(5p;*CbmaJEJc^xJ0JU*$kQSG-XR6%J?r@bhNdjC!aS+8ojZ z{o`2->{a_GyJhgunxbF*1M5Bv^ePazW?4V#ZvJlYQ0OZtXIQ1ihh|wCA3~p)zx&mP zP*+IPCkLnt`X{^P-AkzJXaB%<4=)6DhwTp9l>BXs32gTtZ3^}MPeIrJ{wE%|hX@fc zK=_vs49*>Rr~@1qv|~Ufpg{oPC#sqY{`*z$kMW=hwBXO-GqwK#a|b#NbUJx!pwlwH zWqytaU>Z_~G2rp61E#@Q-JwZYJ+2xKM$pILQW1q9Fb%`+*~|Rkf5!vG31H`FkcJ_W z5=j}>`j=FL{Uv>-J|!=ZG{%ZEDt)1elWTQtZq)#R8h*bCK!FnExo0_3>jU1guc^$M#l?4IP zh^EjwUEqICbGt=L1+VAdqOqT+xrxE`I~<%pJJ{h}{LdOLY7w>QBYdDo2Kpk16x3al z0{iyA(_mmHe~xd{Tc_b*bbjmPQR&;155_#dLNH#v@hi;Xz!KgbA3lBfv{tzVw*|LW z2{CUEZx0>*;S=P6C384$oxo1{{;;%f6N2Phy>)u>21?V&p{iRA>eg8!b%eBmz8V{$ z95D~pOH+?q;5>pgVLuP=($q7}4f6cA@auW`pSaar{z#u{B;XhY09g7X5T4rwHLgDs zdDpgQ@f_ZM=9&Cf!!tS5#mlB*QHymH zbo8HW^xZOJG_%zbJ!NT+PVF0jdK~aXh2MP8n1TRQyq$-B?hZk(*o{JsS!2<{#}m+N zo|DnVi>ILl;7gdU!mjM9g!LRFL$bmzMi^wGLhG}C4^I{)En^v_Xi(6R5< zp!UOm1J5D9p+n8qqSYX#?7OdIQ?}XaoA9U;}!mc>^j!_~$4Adx<)iF7d{lCukETB5qlqv0 zsA)DIUHYDn&d%ebV7n)D`8PhgshE$(m+?`KkdJPx;-k4We6$YSi|01*(SuEVbYu%3 z&2HtR<d#TFgh!xAV~#9engzCm($X?$`g2@X>ivKI+uXM?V5c?ct-n0RE8iQHmVg z>jUTlFjK)tuK~a)`RG&tM*)-oumbn{69H@l@DG4`0F*vHIuyWM02=`818@^SK7eWf zT>v;LKI#a-55On@5n5OT;@`Be3&iO^!Bvok@Z=}>0Mh-T9MJw9hyeZn6u@mWxM%<0 z1+dizl06LYKLcmY^B-r9ItA}Nzk}Bn&F@9*jhYw^v|Kft<{$fzhCWftH*v29hdf~5 zMz(A7BeXH3VF6$Oz);nV?INhi6biXhUsSHplOReemdfhEst^LBSBz2MNHv{A`(A^W zq8gHh5L;XStAamr*cDEiB{mG8w$)Pg zC{&TuP;TUBchlaqp_D~wjW7t#Ez?6}1H|TdmP%jjS@f=lQQs2Zrf{RxjKbzB2-s`g z)nrc2kP;cgkz%X*#=$p~Ry1?R_F*2YJgd2e^k@E{$7RjJaq(|&4sp{sY6(NoBBRSJNtGIY^S)V zhu+ZrR?*F+k?3vG%f*8o>h-^nYHQyyC`KcRb~5Ak0y*jF6|Qq@w~XFS!V=497Kj-W zgTd4F?Tp%bnJN;qrvtp7-zrnp*P7P#*)-MG5vnpzL3(cHLXk#j|B89BGlVypK ziluh;vZew(D8Q;q$(b(Oeh8onbrp8bz?sdaQaFn8dtIF zt!&A~z547*BV{+nkm4u=Ti(b!Y4yS;>jsHLsWdD%GNja-D=exli5z*`V0^wYr=!yT zTLa#RN+a0|JKu{;EJ{j&=wdrBeXPoz>SR*PAdAVSG*Y#MWLQ=Fnb}s;JuJv5r&w(7 zVOYd{A(xj{wAJ{>xzlPIt6vy?!g`sDFwPiUF3Zls$j-5KFGl*F zxZ%ied;uT)Ev56l1f?)3;LijvPlE{jJ9FJ|{jlqN$Bao47sCgAI#9=)a&fGkC5P&%muE&O7j^qmoMZy(MYxE4V*r*c<<1em0adebqk#e(Rt6 zfu6j?6oFusNWKQ>m^}C}pI;GM)Tn>EyjoQSUbq%)5STaK+MdP_3$Y|U&E6##B*ril za+BQ} znU(dFR;M1kwd%8^=4^gDC#A_fm)6qK&S*YWEo}Tc4`bYe_U0SZaSJo*%#@v0Emid$ zm7l-hU*>g{gI7WrEE=2O(fwBZ#**pyp|3#F<5OEKGxXGZg?M^Aw-XuIgtlT?Vhiyx zvog=3msZw|?>mz{>#dxvny~cRHfyPQ&r>=RUsuzKW7Oq35U|ajIELxB+8!n0ZiNMv zlAmEsdh~W(>c$)FE1eKfSA0iG zB>rQ1N@A0bVKi5?u;slHWvwImTVI8~K^>;LN!jsMaba%};EMQ@oQmk+Plis}T?KEqt@Skk{4I_1apfM{F=Pp(tD3iFzG` zTDJ0=X(@q4_ck{*E_l@4n%9G;%NeazrDhJQ-m0%1(iXFKwFUUmb+fpSs>QekERlmr zW2H?=rYYk_jnJG>*2roy0Lxkp8qGUhEvw~}!iowZg_hUT_})XW>8oA)H@2Qxv#MK z10m+6B8OT@SCA&!>sM0d+dnVEch)pmbn3HJZRJ!$65f(#Dzj(0n_$FNL_4{pfuS;Y zGW3!tJ1uCHZPwLBeJx^wRaZ^#T(Pl!HSt}EMQ`t?-qN?d1EijP#xAl4wNo-l4P-MB zi*8+2+*y&07a8hfsuc3djuOO(TIC?pClZWHg-rd<7w;drRk8Jz^~_0TJ&mt?j_Rcf z&GazF?v|NvI!1FkJ1LK4?{OwYZtdnwgYFs$0axCKHIg^tag3%;X`3a{t+SyAYsGXW z>fMve3~$P0HLOR)iW6n5TgH}cwVbCVFb$RL6 zgB-8al&esM!pW(a+f`%e+=I2ImvtJ}Taj^{-7VNo69=gc(NNqVm$xd6I8>Svya+XL zK>Hg`*7!%ANCrk$+(Sey@MiBPqYU>7xA)JQ^FIcQxF(@RVnv+=;YAJBgw|C-De0{- zD(Nyn+WMFnJh{8iRn+&i(!cOhX`k}zXO;Drc5_t1l~$Oy;#qa&mdc`M%$8dTiKOQGHI^rps>0+J!|V#MTlWHk%Y&QoV<->%ofbZ8q04~v7)B0gxjXa zleB!W=VWzd`*`c&yxhLk_sli0KS=$!ZNeNqoj+whuBD+d>LH*G8_ zvruXo&`9vTgA*w{-FWBJ7oY(_JN&Raz0j zs*+Po9SoG#O;|kEo`fsEX)oat6?I`F%ET7R)fJ)BWb0ot()ecbSDe|Z|Io39ze)tl3m$Sl{+^R zS5eQ5>EtHr#824zd$-tC!lz!G z&yr8fT9J%Z&{0q)G;7q8)tJdGh;>*-M`MS92OC?_Y$5vUR)Q(An3~U`G77@#%(yjO z*Ra&80%?t}`!J+Fz`lZL>6Sw?=&QBk4#XQf+M7@Z72#!O4rR1YZ5He@7ro|h7R)Z% zXVRB;eT8G;hpJ}ENe10`Y__adsVb*`q?xtVh-?@g&L;OusCsfEHe23R)j@S`q_cY4 z8QIDzOs~k?TM=B^O0qOErHEfYDtz&v!)2}+P5xRk^1T72s)APXsky0;>WOdE^BR!H zq_S)q`#u>9JEe7XO15JM(j}7_x~YVp#2i74ZmjOgTx8@$IWNrc}w5a{rM?MT@Ar!9#JxGe6hRFz1F!HdfL6jQ-x}L)XB;<8Dyh zzrE6LHDy-jDCpKx8?huTRp`{$h3Q755(=xQ538aw6@>;enVAxc0gb__G;{673!Ssx z+Z#C=*`Fp#8$Yrt+Io=zoK}u;QKOvb>5m_SoV5JZQOapDVl(J$1w*g19aCOsM(3I{ zo|t3FRDHIgNEDDsU>aDr737QY^?Dl{obY77`f?{Rjxs8&@-2~C&%M&D-@~HU$}r7+ z3NNufrm2q2tTdOmH{(0>OAUwrNgq%@u)uCof~W1%4(3Z+%X`!Tb~8z3MkMnVxxZNm z(dMl$rkSZ1>Ngb8?urd6epGgnex`f7+N=Ut<-hdx3deEQEpluP6-|;W zem%L83TfrtZ^mwg@6yr@8rxasLtc`Z6&SB>$rhZiF}}tKTm8hIPV#GxFjO^*a09r~ z4#k_{0UYDL+ItPFIr?QTGTi6-apm5$cjs{XS`?nFPkQFPbuubxOkuE0(eSaMS86Wm z>1Ed1Fq|x8#g=S01HWEM=Nng7Yvhc`ARFIR?{KAar;W&e)J-K((&qWzl;U*=!!hio zij^jM)-T#Vm`LfP%xJw}rH`yo-?7|Lk6e!BtQFR|GRsxn4q~DxE7VAj_K(d?UiUxa z?7#ICN**{D@jl*Qcfa=u(mPfw?RocxV=R7euTNEwS=EHr5^@gFpu|z+MMWlgjI55M zxfS%9&~VId8uK&5qxVgy8#>>#rjf;!`pWydWAhNH zw7pM3qu;A3Hp14Ae&6+$`Mo)f2!f#fwNK_Zm+pTjn-cQm#&_!-oHbmdiCCs3iMkyg#TC+ur4+ezB zL1G2IVH`E5M)qusv$&co{#e#K^z?@>UtYBLl$KX?(0YsTd$&kFHZ!v^uFuV!^`&(k z?PX;WZow0*5ee5_m0M#$Y+~Eizkk;wCy))rq5^ZAwIWZ|n@k&3`DvMVQ`Z}A2)X{u zJE_6l@@TKpwyL7KE(<2TtI`om#TOc~Utois2rL`t7a!+JZ7d|UZBAKoIgi%k_=Ilm zRJ*oK{%lI7p@GE4M9+T$seN#IchYI^L3Xz04uukOsmo_%i8qTYpaC*RQkp69Dg)2i(=n-OYD$uSI*RX zN8rdvs6Wg6Zau#4xy6(BuAd${cR4>TLF^oI@Sk*ob zO`_iVw06ib-sRJC9I@|9I|Hw5=aRaNM#}znyj$7Asv!}beIsy=`aMmJgB-dULepk* zYeW6+P7J4^(}^XiF4bp|%{hOong)ibh`ohvL<_pjD_&sUEY(s9xcZKNHaV}jRl@fU z(eG>uEOzdw>vS9*U}a-w?7U_{u>XwkRH+dc@@iMco1}OF39vR9EWZl_@o_ z>a^|g4s4Q3stDd(fAC$&P+GNncNZR`{}Cx}on>h^h@2Ot>gpCgep~dv0mUG zUK%4WA$2~=uQm;C*2B0w#Y{94a#$=PQOe>I9L;CEsi%cCD`=fhC)oE6XeL(}kG2S? zSKymIvG8y1+hFvuz7PIv?me({RL5k~pgaO4x23+9S;6crH=?%|i?JNGS>;%_O14>u zUUyTIQGt;;c1Q>H-dDf+7hx)^*Y&7bUZGi4AX%hpYjJH+*6h767@XJdK)!jZvY2)a1A7j9IhF4^n*XzlNpNsPGX8dk_aILe!Dp++*yPk_) z1!a&vy%s!Si3N15AtkTS6;~)OmN(UiUo{aGw63Rx=2-=;j=fGj&J7HX_sb^VYB|Q} z6{1&^^wp4!EDFS&G6~dY@J#u(;eILnNNeQ`4jtQ}Z%o!x^$_qT4jhI(Lr>qq$_7IQ z7yHUy1wzCPk*UOlPByi#gQmnu_Fc3VYX4O|Cx`3iF?BV7xSFQT_&(Q()es;K z0l{E_)F1l=fsO0c1n5_FKEw&&+hSTCbv}Uz_I}Wm0UM!X!NwjW1nY)52lhaAM~o2~ zXc4tg!1JF1%!iif_+T39)6sQ#y0{A@eui+*agMIs$L5hHPdFzHD)bh!-B}h)PevsD zA`MSVq_$B~C=|+h@>sHzbcqyAvLXqI=V3?DhSSH10w_B;T@!1TjsN&xGZL@P*YSIu z(#$8reg;FZ76)BH9m4wMM`&@1Hh-ZOhkX==)&218S{(LY7>@QUe^!g@s&KPker7*B zPmAm9E7amT{S8`N_cL=(zw+4An)+(20qw8FVLyO@t;KcnO|&@lDGU}`T-}EN&h3ZW z_v3f&m+#gO_v(lHYjItBg!ao1)8aaN#`Vje*bkrDk3XUxKBpfZrNwpqH@08?!hZPD ze)tM4uJccFzx>tx^4Imt7xc^D+%JE7KYVvTe1E_4fAqtT_QOx~!%z3a&-TMF_QS7g zah<)LN=+A%sdVX`YxNa?y zzZSR9@<(WKOD(>-U;fd4`S<(f7iw`kZF%HxjeavN&eh^vEgq)D!IC0%Sg6GvwfO#i z-^8v;_%uFgO?W9)n}p> z*ZFUS7I)CFBS*Eky%x{xm*1ep!2%$4Fgg3Hzx=g0SDPQD#cj3tb}jC##qVozaM@Oe z1}&~$lm#f{a~k=&@z_L*>uLGDw772k>_1)x_v4Sy;yU@OwYaW-?bqTu|J>B#@OMra z`pXZ~_Fvuj)_;8Je}4BL4;J<--@pIoY4xiYZvg#~k@KUI;$n5~19(hqT+C7suZT{H ziC(HUQq7l?91CzAAu=*~;UdVOB}7KXM<*r!jHkrKBri|YQGnc~IwUeOE_(hVjpWG4 zq|`<6$&mxKigdX5cYH;1;$R#c3DHXzEl7xqRTFf%up-=qxKwR% zgc}>TG%h&~d_Mv#as~HVaN|Q8kPZR_8vwKCYB-m#h)awH_Cm}Z@WKA$3Oc1bSPKZ3 z1H%3Z&q;Tl3-}%b0`|Sq{)i1^0Ct22VmA;w4*)B~Ks*n?IslHK&^nNC0r{=~+yQt3 zZ~(vqg#rVE5J!++2Vfq6sFe8R==n?IoIqI^qEhDf!=Xo=kf`J}E8>>N>)4Q}rOQDE zHz_$fc~J~^!K&!QSan_$bXvlKAABjWy@6K%eHCmVZBCS?xiszq1^RPD#m2=)uUeYS zjaiANE=pRl6zr_GEG{9LyDWNzuAXrVx&Or!jo*Lp{qPm{he=UC^8ZJZqGFb>So5Ep z2J5{lHkq3km%J)5LETJIBf^lV$y29}R$Bq`HSPMnSNw|qd%>{(>-x2(LE>~M6199; z!Xhs0LrIHZuZa5LB+Z%fbE880`sdG{`wK_Zvgm~91#z+e&8hwQ{;gA?z8`-57tj6h z{x5tw|M&Cr&)k4Nc1=R`GH_~uoxGD5fsy04xI}LJ@1>8D(7bTU_S>G(N+SYl%I8m(Wo zMZy+=Q#~Qq2Ww-2HjV~wPAmc=_A>A#A9wJ*o<-oxKknd5Kg+>af#N_a9#H0kRH8b6 zDfm*4yB5^dNB&#+B=9|`1R!rAD5ojy4N_j3!r=cBwd@4&e<}EqkM1gl^pmS$htCKj zmnIEc3fl6!0FcnqM<&L_smWS=R9y1(=%uSPG?<~KPx+Y+?;9X}^!IK)JP~wwaKcXk z-d(gjVFa8N(FHMFp9O+grHOU_#e7{#6ZiDXC;ytQo|Vy%G*8;PyHl__Rd-{mEup)w z`9*;E2fv!$Up#m$|AikBqrc*9{qXjFxbO%5Zw-k0k*^l~gMXSjeCd~;_Z>fe42HMg zaSi{g@3>lA&%R8Zy}cw|>gV|8cYf_m1z(q2Hx)|!=X-v^>xV$!j_>%XN$n)N(euCK zV%6MiA3@-E9LN!dc+`Ez1K0S90^|vrlO1I0`pd7)^nc$U{#$$Z?;q-V{txZXtaaq9 z%_;eAKjdHi6YhIxrL*6qi{I-5vL_mZe*Vtyz?)x=if}*YLlMF7-;dD0KmBNbwS#^z zYE%FJ^cRgm|E>RP7x4q;{|Eg`EmP;BpZinN%0%5|Mm-+uM&UTb1MCO_J{ScG4PTx( z0$gt=CN7VOOG<)Lf~P8MWZ&CwV9b28=(~B~&R7?se!-Jg;5>Gko*Amk)x^5?)WwKE zm*4;Nhhyc>VN>?oWnPgrTK&3yAbh6b3D))_E^6W)3hZoD^9eRv4TJf4`boon^{;Lm zh3~6r!q5JJb8Z9x@Yx#<3vk$@0QlD+9ImB-rx$e)Xd>Nt`dyDoOXq82wS6$Hv+LLM zPdBcAkG17=1F-J;fT$<()pE201=vGb9eg#BR=#c=*Y-Evd94$t;r(Ciy$4tmOW*Ll zAksvQpooYX6qF(u8&YH@fC3gIA_|H}LsL2tQNbFl*kkutW5;&HcElb#dMvSvHTHTu z0R*w2-^}cP0eSA{y`SrS-tT(e>-xTh@Z&c#J3Bi&yGi!H*;LRrkbeczR3-gGCMEl8 zq>}!^LY0QOz<>XI1?wTKx6rQt((}>(@_5PG@!vjv2;++5_~(oN{pXjZ4!ssT^g3O& zomu<-?emQW%4;w`9{$6pBBZPy-A}%p2B-!qfpVY}C3aA7sfHI&IC;^Ir98h1u zw_gX;0`q}tpbDr2Du8mJ6et0Tfg&IW)PIKM0kyzkrVMJ>3d7W2Ucs=-yYs00_N0GHRI3|ycTTvCf-aDgIlfgHFVUPlVl zfeX}v3)FxM%m-K3q6%D~5?r7HT%a6WpbT7~6kMPLT%Z_Spa@(b2VO;ZwL>7*wIV-1 zk>2FH!4yp^yu)roEA^$0SX`0Qsv-yDtveqX$Il4H@^fa+*~|Om&bM6ViHahyX{(9) zQzpalqdInT^$TNhxw5Fvh=vJRd%I3%8JCLH8Ds06wC#*nFADf=d6Eq8ySmK8;r&oN zp0KzF9h zyqd2ID;kE4;$FVv1}EYcxBSSjFa9GjrFh}Kp?Jg_<)fC#iMUAe!|_>00N&Wd!^Cp8 z9PhufqE7nf}x8#3^Ibh`k2D;Fmw&A9WEGKw-+uTaUS2i;w^=`CnsZ4a9y;UZ;<)I(ekUk~cJFLrqh9u|;I z?kdm&*EuG3{;3^_t&=rPk~ITy_?Np4hkK{tIukD3(mamF?&r*B&F&P0>)h|64ylub z2RS)!Y+>{pw%zPUe!cNpsn?u_0~7E}tG3uZ5O~)qUOPZUz zzeGo4s%0!D` zTqpC#Ic{w_4jSJfQ8VKTfZR!bhI>HY{By!!|Rc$*(6?wzJSr zC--~_J2EN0%smlHq`m6aSsI5WY?5PR8@bZJI1*1WsI2>`sSH1QlXYW`iy!_}caq<5 zZBu;bv*A#Ok*Rq5%%W3`dL-c|)}vGIhL6M@RK1D~e~-fnw)48S5yfERvs-VdMi0k( z_uZ~*>KcUuoBo!0y=MeI+v%%GlQRQwQ~mhnl^bN(yQl7X%9%b`kyCG|&M*isImD6Q z0K7M4V&?;6G0tx|(=H*#8#hfkWu0=$17EndspAe+7mSRYyEVDe8M{~3o1Ztj3vQZ_ zW1W!Wfj!obvX+;6VQW-zSeBuedme(IL^M_;6ndETu*O2=GQPTaANOsMYFESao<10Z6idncw_6b zh4ZrG@owco!#m~)I6eILpl4^2aNzyDhS8f-vAk}i!60Q5+-B8&<8wC=mN#7S?B?;l zn16pV5ZA4!_i@#Vp?JaVR&N$r#$e?#bJ^}6@z~o%f9`g}B>ZsB>^7%+rr{%iWlTR@m zfe+Ll)@Me`RQ${;*zt9|AO6Ss?)JbD5jgj1#OGkwSZusKEO6hcB;43%ua(c<&UpH4 z@%yK$aGZAjha}Q722XC@=_kNV)w&G3E zhMkhIs!m(!uBqK|hYiQ4ms<|O?U!$?3|Kn?uTb{UIO+^>AEp06Bd2hjga;e0E|0}u z?b8m}m8N1>gWX04EM<6#`PA2rUNLxTcgMm3Q&aHEwvL)di~Hb4j&kxFji0Pq6ENyi zG9H@eWp;K(Z)_c6xa-S^Xx#3ZqruZ2q`d0*+)wZOV)Eva{KnwXe`?&_(^GNXiKR); z2KUE?;SSQChH=={)*4Ude?8Lgiijt#@^&sQ!Tf$d%YaGi3# z8xD&6m^l3<*>2t2XgV9FU`xfEPKN#ZJ^?-swB zZdpGC4>l^)2XqZ1UwP5*-HGlaaKXHxkMJrVd}HjYCUz&}*fV%Rf^Ca5e7A>~{6^pj z5jhX6nkHh|>YTUU7kcCJzN&tm<#D(Xn>u3s4?m-dkHhf~dtIfyjy!M8Tz>i8p$L4e zmDiQK?-H>pKxsCpnGAPwo!_#*-w3??YVoeUt^M)TF$c2OKa0Uv8o4K2*E`^lmgAP^ zuO5z{B^CYlVptkBTIH{HHX4HMHO9k34khEOp^io`zLS19``5b>5s7%Z$lug{x(s`s zxjkwC8i^A+pTJ>~UifUeV~J;SJob4KI)6o)KR$2q{)O~WEDrROj-E8d3m4D1*nZ`b z7%VdKBfk>-;`2hI^!d^Faj!G)H+i(i^R5s0SaDH~O^pn5q+$`?n)Yd9O0XP@*rZ2F zasi={shocuTKzJBGyMMZXAOmabyNOh8lO`8e4DoDpC^IRS(;zV>!rW=WqnotkEyQl zK}{lR=Ij04XI8ZJPreyHJlnAzyGA)GxRQTqsun?N-%lzfhh~ zZLUwJ<67=Q?vX(#3wk(Jmz>`Qa6mV$J&1%vVocPpK@*-$0o^YuzSF zb<`ZTAL%1Ax3O~5hHj@+Jo4X3sZ4ISn^Ge&-$N-`IVPV{=Mle`Qd~Y@AEoN9-+s#c zhwcX`B__=eQmP}3|D;sj&@;-%-akZL+w)8TrPP1tVMphMz>Rz^G`=i!#38O;tlTmsl={zl`Yj}rIUm?9fotwRrQLSlG zNL{X;!l-q6%cvR>#^Q@&kE4vDV{I<6<$ajTD7{$9sOlf}7fn~pJk2OeaAx=2(|lgY zDD7I#D7PPag_ctvJH<%)=PGrX;XFpoZawej1Fz9^xy@llX-Wevb(N!(QC2XDQRlFU z_vBlQ`nh$l({kJ_4@ULSk&NQ{D;YH_3mH{ED;V{D&Npazk$f=EA+s4JlEaMo&)zU< zM%mnC%YPKaC~rHCQPy`WqdN39qf%mYiWu$9v0SM%_reB3fRwG>B2U zDT7hDY%L>~T*#l>{?|tAb$~j|kx{qKlTr1g4`Y7g;fykr!KfTMgHf8klFuKz zlTnv(f>9HDol)8A1*6E}Goz~1>?v)ZsKAaYQKmr+!3hEXrN!zdg6hEcldE2H+I#WT7*^3^1aT1iJnd7l7AP1Ha}E@mX7XjnGy zvbl`l~X@P-R9wZ zdec#idgW9`t!@dUq}vuo>GVJO{0kQt<%UI!s?P5il~LaqrQ)s(s^U0==S zW{hGt7e;QkH>2F452I{J6r=V_GNV3XB4hsUd5q$3YZ#@{-Heh+#~HQc3k+%fvd51Y z)rKGW^p-yu^_?29>pk?SCF3vgOu8NDG$cS~I4t*|?~SyIM%TzaEFF6v`Ma^_Px`uU$=>GL^_}nS^_!E<4*Kc4y#GJL15f<$ttkGT8=<#Azb&2db6=1p`qMD% z75! zF&liHQ#EH7#ag3+v)WT-fo|w#d9j;QV|P@4L~s9~bQ^@mjML5U>xS$?Z%me0xTBlL zV`pthYmGWz?6%_0B}Zg1+w^zGau=lCcV}A4c^lMlfBOEbN*lDf>80~KmN}q#vqb(6 zqT8VkyIf~3IOL9s>SvF+vacCxc>CsGF9)`VcI@?S_HyHnohK@NgU-uF{S{`7p1EJy zXScx%S>RO^=UunDKG3ST|H-8dbI8%gvdL-vW75gZ@iGro}I>@zja4#(mI__I){<{wHY0UiM)_z&EA(&41CcKt4G1ft$dO9 z>ur&p{}dxT`+0`3lD0^`B7bHAxu?`PoQit0;{NUz{=IyW@IPsV_>eJPBwDh0{`e$}>9lx8MP(ycb z+kLA-(ed@)Y-g=$gQVp-?H?r}KSQ{M|8>!FpK%WS)Ta!0b>KE1q0^+byY zdq#Vo?umZSC^MUu=Z~(=*|q(vq$i5pw)pPpACBnmF}rO|w{%6DitNxslWwS&>V4xorA~YHs4FtsGd{$MYlF%h+8xjx>W)lf zCtEK`b3+f3!uBRM@kM^Nb2@+jy#caozG10Vem~fbM(E4<3ER70bwm;O8Z2$t$_Y)J zk^7soM+j|!?d@l|_tz_p^s z!Xu%`7ImL8JiQ0%GxFlh;dO(MZCbMHcE3KzY3yQmYu_Gd?-wg+(-A#T%$hq%W_5i~ z_h%kR9d7lb_b z_b%-IqAyx>{LGHK27QrSwA^I=xt=Jkr{9-jP9ErnU0~k6$i8UR%5PIGO**4BdS%ki z`u?cp1h2mLDte&cb%RYmYNg2Iez(b42`$j~Ba3d&iuOPmua9sey0k_Mn%~imtK)@C z4v#3RKP(hI<5nH&ZrBUmn{zs{zpe**F=wyogs(nmZug4*v{qdegi ziLBZe*v(lkLkDq&U(z4L(1Xp&P0nk6L&IY3o9|dEMVCxZrSBd+7_Hd(phKsiAY|{q z_UmGg!KmoMH@Dx13`OHT4WD*y)ep@x>RWt*d=-(;uuE2Dsvc-^?oR<;N*lkQJ=*-UM}y zZYU~fYO~U^K?Ks)>00!si!*BZ=b5{c{)$BRv+9{we(i@AIGr7tp&Ew9m}V{ir{ix( zw)@8S`T=dwms3%9b3?kI??%JwHvABUb{|$XiJtKra_$tlV34@f*Rw36X^YuIP{_8U z_b>k48qJg$Y%o*xLCtKV=DBPLLo;?&>SttmqebVvZ+#CPj&_^JJ@a-5LpQssoUP)+ zk>g#rt!KQVQ2+Ht(nnjPkXdHayDeMvMAl(bDogT*BCFQ@uE_R!qaL2kN+(nfMaNqV z?^*G40J=C_RWI)2aMaf{xNP^caCGBJ%ZK9!`=Bx2sbv-AEFAiB zo(zo|K6tXh$td)2$xWZpSG%DN6?L}c`?P`Mg9LStiXAd=E*W>Ag^Bw;d&^uL6P>KcTe*gpEa;e8MqIG}tmN{&P!&8NgJcy5O-{N3!L`@Kli z?d!w&abbOt<*uji+6RZB&?B}TEjJBBjwQ~qZCd)F6o(F13WK9i?dw1JR|A|B;(M5n z@BPG_y%`a7#83viRN) zJZEOb^E)pq@ue2(hX$7_@q?VhW95HT;yF`VwkcU$iMzBf2>)|jCEk}YM!9QfCB*kC zv2E1%P3_xN;!I82!h;r-`25KpL(@vW<9e&>%pP>_JAVC_!Sd7--|?cS!|Lwe{2lwx z`8K5O-0u+I`;KS!s(*cHY+fp?T9H$1$n0Q7jZCvY`Dy?thchLuBnuN*(t%qbYuxg1Ml490zJQ;wJZ(J^6v<8p}amE-Sj&Rycl z%kb+a+JdOpWq8Z84`)W+E5i|@C9b&_%kZMFLFbPhDZ`o}2FZ1ImEj$i+Z0EyEyI6D z=16WVD1-Q38TL+=b^m)*8GaTv@yLqUGKlY$;U80vzH$sI!|xk@3O4g9!+q-J4f^R) zhMQD8duP(344*sO=xOVQ#94f=46p9{C}v^lC+tBQ$OKV*UB#ZCI5skjlJ-!Xuv1@ttckGBJdLq`M6Wk&ifOd)#|q62)9qT|KMS5 z50dMC8ncPaAK&2mR1;F(DjyqsE5#;zw)ijnSc(m|zc|+ZSt&k0X2+tU+okyR&Iy~B zT`a`|o!b=2kC#GxuN1c~9PjC{r4+|bv1xDjdnsOEI^t&Q`6Qpk_e$}{o)@o2jVZ;! zCXY+!Czj$0m-WN1{#J@lWx0N{3oFHeR=Qo;fu(rgv52S_-lh0!i=@AYb|}RsMXtS{ zw<*PczJD7z&ZZQru1gG>)i1?z!?P}h2BkQG1^7yEpX)z1^m|_d@x2nPmbn?2-zIFI z6Y}k132xMF$bv5?O0bj#_)2iyQ>BaTwwK^_mM@(B)|KEbMg>tBOG>a+ey(MHZV3*# zy2117q!QeO0bKiy0w8z3C{XvpL3{H34S#&Sef0V1Q%&WS_IWAf%sktRaBwakufcVmw%9_r3MGV(k2PptSeVV*LC_$;gR&i}CUa zw$X>T72|b{bj=Lb72`D<=P3s)EyfRARnzk46hnNk7*D^`yxE*_#W;Jk|7_#5VrMFuCnnGo0i5b1yD@kYn}U;i%CW7V2h$z>n(xRHG7 zK;svBygYDWp7?nYSIS$KNco z*BngJW_o<*r?0h&nx=t@wqtb%e{K(A-+e-1x-D4-cyflhqXGm zh+OaU)_L6bI43>C_w=~i`2HRaHl#cs-@{54-_x`6GUQYckmFL)N76?}3A`|<0oA(W zQM8=m)}CZa`Le^AlR9_iVpYLN-3Szn8hzND<3jyzi!H->6#r$ES{m= zF4;kyw1bgbbz~=X)%?l3C`GsZSe!#W%IFX3in#NP`G3q}aSx4?Lq1K{x1G+Yy78P* z(mr4>O_z4r$S8l$?PK+Y4QJFP9A}hCn(wFSy1Xn#$<5o0>OGwf&~zl|Ohc9sDOv*Z+2aG5=A6L)5v(iHvfCGmMh0b_FcG&R9l?%{4~pt9FNJ zx++!4sQ%*~Bk7+bG+jMBmrh1ieB$$lmtHHJ=f?oEw9_vo>6-soKe4i zBBL^GGh@E^GNbCxQbw{J&(QhA3;cO%6B(7|Dn_|M0i#a;m{D@B?pd}TliM?D?FR6! z&gN;RX5=EzGfL)tV3cmPJV)n~Z1rT6%^Sw3ik!|Ut+#_wvH2SB4rPqmIkqe=CA)_i zwHEP=N~bwIUH35Rn%v^^Uso_HHnd>zE1kbTqxA9!Mz!x;M#+jjjH05OjIufvjACm$ zKEBmR%BU%eWz?OX#mHsvWF+H{QLQdvR9ITGI9PtF7o&3DP)6?Q6h_&Xjf{$K=NR)} zzhTrLugBtK%E|7Ga_9bx>Jy_G6=*r5KCggL{Np~O1Xc1(Y{lYg(kXt73S}&#K4k`D zevfUun_Ohn{P~Vi(%*u`-DG#&c=ifqlx|ZnN{Scp-flmmvezv}QDhk-H^7>Y(|LE} z*&vdUyOzbMnD{%R+WH8icI|yeeWP!TlF`jsJdf;0jIzooMtR$bjJob?cuJ2kDmy)7 z)HeFgr$27a;(yxTeHhjLQH;u>@r;ULs~A<+`8c7zQxRWoY6YWAS5HgFqk3#}Mv0Lt zqiD7_qqJ^sMqSomM*Z^yMnzy2qf$MKQB<;=QR1_eQ9t1zqwK(0M)`}Ie7?nVMvZF; zqbR_D#TlhxBA$a=F-juc8M#njMy+pOMzuo}qoPg{qwIbbqjdW$M!8}+qq@TuMsj>$ z)GR;En2)YA>K{L0RE+z`C^xNSR4=M`gZ78a%9c?v--%Jgbz_ty_hi&w9l*%B#_&Ex z!6>~lnNe;vpHUpPno&J_JEQLKA)e39G3FcHVwAOd#;EC}XB6WfjEWu>EN+_bZ_B9j za$*#@crgC*c}mi5HZ2tIYkkaopYN^u?wu1G?)8nhG5JmXWmkO@Q)7I3l-~4>KptD( z4f*6-@8r|&2?1w)8*Mo+zcTxa?|S!E;`EqG-z&%O7t9TP>)S-)|IfW#4(-l%-D+iI ziq78rsA;;QE;8(OYxlU`yL}r-y6N%Q2Ix$=anRkEr@oDkg|xbCV2n<_Ebp%?edqhW z)V5{4@n-0Pp++%#lg79Ig$VM6Ga}R=?aD_kstMY2u#Uoc<`du4O&-;cHlhXk=lf?*-M(_)T)pCa_}fz7{g=GW%rcC~`PFu>7b;qy z*M~=qTlb_Dk{g?EJK4?@@$IliQNxl%<=u=?pO}foR!Nq~o4oDahs@C9rA^*mmo!El z)eA+U^Oj68qE_fKcke&^X^?G0T~kN8KEv`xSGuIpAO zLN0BB=R$HDp{ZJ9`PoKIQH5#8?(SwCkoQy9=jR$X zMXN$bS8hAn7EPP3JGk&urSGzOAs1G6XoIXQvV-4@{^FY!dEWHc<(6n=@31d#o7kg* zjvWU}n|455J>wkbUTcn&f6r}^H@p>kQRMt3q_+cFYSH?hc%>yWdv3HOxSk985x;fk zppaH5w!cR+m4!X>XgByrR>KP4OLm2hxnUxdl$kndz%rdL-#<2}`;wj?^74(*_6KFn zD~5kdfsd(UYfIq4f>l_L?xS zJ!&y{MHBryXXG)VW7^go&Co#O46{KQ?kIfM`0t(V+M=+H(brr@I3r2BvyBP^Y>>xa zL+Txk6Qj)r?WS9FF-Lc@7aknAz!t4qJ8X@;+gsnH$|?0<#bVSrwtrEB)$YimYfLj$ z8)uX=EXy-Dy%XBAb!XqCC?8}ucEQ7>)_UK+ZM{3*?cE(Uoj-cwo46*(X2hK04+}e^ z5o5=dty}Di3e@xUKEYn7ZRC!R4IcTRBi#%KKRWA$E?j!Ads}LYcGYh;b->lG=*VH0 z0hys*D12t_vUXiekiO6JdfX5T*pBT`#k{`{IFh)J`bNpsx!1}1jWM@ycd|#9whiuF zs;G|~rFmA9r?{e)v+d8Mk@%5p%v}2PiQ-z^o!2!Vq0FT-S{IJ>M$czH4m;n#7ww6h zsk^+n16pUUxv_D&54s+8x+HRw%z)mnbX7j@IGp3!ixDSG;s>R_8(gvytK(`gd)MJ0P<`3kH`B@It|72UVn>@<5-W zOB%NR%K>d1;CoyAv@04^GCO)om^W&;=GM>egFMmwyG~QxEhI?yq{mXNRk82Z!S5Qx ziX2g+yPXtK&8%DjqppY4Xe zD@VmlZ|a1idp*4n)Bl|>KmIzR+_4*6L%MfEIlgaoTi&>!J@(f6^Z71lMAW0qxh*AV zY536(>0)vxpUa^ca}Vf!ou5V5Yc&m{J;zMWuCT4}-ErtIyA&scmYBEhRWH^F4Q;>i zRFir?eFM$xUiS>|ie{u5S4dv@Ag`1n{gdAvQBMBCy)!O*pu)VCTxw7k)as`7x?J21 z&2q`EFN)}l$_=9b$iD7_o|T^&B-&(wzL~CxQ8@V`Jo1Lp^N2UvI?4I3&K~WN;k$o+ z_ndBzUYUy5UcBssWH*oZsLOexr%Cd*rx&@RC$4|CeKOt!T}+!=7&_Jl=@S~h^bKu= zo-fNDb4mW$H>khz=HwCIebb*LH7oDj4JA)QrJ_R}kd-LzNLsEJvYod_n=s&;?KA0iq-Ju%Pm7 zt3SG+7xLcIru1ox+_M9o`PX+w2BB7_;&y#e)U`X-?peK2@QC}_LuEaX{gse+x3>31 z$8JxI@tx$1tacpxGIXyPJsNv0Rvgt41-IK#`f8dpTKe|qr?|ctH5~G0;*k^NJo?st zm5FP7(9X@nr)^1cMc4msn0@AQ0Mdm@&-T?gqqXlXN`I^M@xgRo{m2! zMOV5O`8B@K8TIo?9=LdOhHt<_zdB}L#pqMfb2G(4chqx^(cJRpebAuoU!R11MCf?@ z3(hRLCmbI_ko;MW5NE;{^ucxvA#=U?ByC#A-G^zJ*Igw7%Scgs&9cLItfrBcZ9$FsI1 zk`#K6pz6E%bo@V3Upl$Z&}dROZ7p5nnoFoYyY}zes~{tfwm6>DHJa3uKs=tbJFeFK zi-bP-clFUaGT2>_Mpm_m_Px-ee?NaVSu(w=(g@P7n(M^(+P|Bh-=Z0$6~eqVm;Ud! zUl!{HehkqX==QH!!@piWU7m3F5jWEIOl}ORhu#HBxJOhRS(|bHqD}w0K00qKse|@p zCb=V&8>x-<3*FACq-VyEWyBKW#}>U4RrQ^wgr4RHSvf^Tozs9u9v^Rg<3#xmRjc9e@&`6c`MQ1jYdq zfC``zxDrUWFP-wh^MM6G4X_ZX1>OVdfO;VJnO_eP&#5+b7g70v7`%Kq)X1m;h7)mjc%S^MD%Q8zA?EU*3Q*X;@d<+*7ox%AjG6=J|-emc`$E0w6V@7fV;uTydxdCjy^s!uz_*hmi znTOo#G@H(s!TuqsWd7I$LQ+Q}eLY9&U^mSp^^n$*^f4pHjD|Z?kvcQuQ)A-k>pMD; z`qQbAWz(jhLcLpH0IdK{VBi$lmHrvGGA43?(o?~cvdXyICqpza)dinXQov&v!se>=U z*GKP1Se-_yf%@rP5QUO7Rajni8oylnOjn&o%k?Jp({=}vnqvqa>Nu zVLd77w(uhyNjQMaryvYv&yyV2kMzS>;yp+@-LicBV_2=U9)3CWS%WTzUw4uW%cb{Y zFBElp}q9kUP$4~ z@$LUL-H)`APBI|0mCH^CnAAC4cEF zLt%<1Tg8nVNc#8xpJ)$=|HF?HC;a@!y#JUIOkO4YuYRVJcYL*fel4Fv-YW_}2Hbz` zr)CXPx#}N7@*eTO@*~VI{{Q?SQ07dXHhsp-S-G?4%$+xX!9vxd#Y>hhTfSoD@2gg? zS-Wn%dc(#|o40J;mbZP!&Rx6z*pt6^-~Iy!|2$N1_{h;?$4{KpoH~8x?78z73NK#z z>++SW*R9glAUcP$$=Iy)pAO8OMkG{C1^ix^+=ZY_1 zzkRR#@soZJi&0%;6H_zudKUE?G!!+mv})YMx~WYw+vavHTDB6~w{GL$*tVUMvx{qc zH}?*bj-5Jp>FUwV)63h3+>;keqhrVo*++~_NK8sjNli;vjLI0DIcDs*tnBeoLw_4K zT>hWuPnbAq@|6GS_5Yt<{(rmw{rm%Z^b8CN?$x_b-;jQxvi@NM!UqnDh#WkG@BjZi z|Nn~qul;%Vk%{zvB!f;02Zlu-J~dMte66}a>Vy$fHiS-Id_u_o;O?pV^P_!L{$Qk8G;I3@deiwo8DJ?U_Odo`qLc?CY3 zzwFb!^cCjk@3Z*@8xL*Vx$V|P^!}GJxId^s`2kUXS|3ojf2cs=exU+6;eMfv!u>@B z3ilHgc&eA!an-a5UIK;B-wWj1se|>^Vfy}&P6Bz;Px+Ocl6OvN0RIRS?o=s(^c(h_ zr%Ws|ln(P8=sZ5Dp>)i)qi>H^Hjy6Pclm^Opq*4#-29Y9qFr$FSTw>*w%iQ$DC)e0HDQ zDC5TKzV%;42E8)+GU@s%&8V$bmVY0)b=P#`w>4YOX6zbQF*-P~UEWcLX39R@%-$9( zdN{MmKjZf-==sIOuR(F#pgE~^#@)OXG<>aoTe!&UaQ#6uJ^61JZ}k}BNyQ=qUN z1^%)n}aS1IaAMeStXELLHExG=b&OhS@Blp9&lzP5tcSgy!Q9K`PW0Y=v%qTXu{>17t z?Z=qEaVDeo{z*o~zAub2*DhtWoFpinQERf3QIt-ugQm-w>`+dr^o(JYuTwKh_B~XH+!az$hst*N>BQ)ojNK#-ap9=}U6GI!*thm@&Uww=c}6PGVFpI?JdS zVeyrw=hqp?C`(?)s9OJqPv6-28_m~`ox-SUd6`kWy4iP{E-oI)s1+Y#l)9Nz(sZp& zBqR4~JELU9cSfB%f1gzKp3OgKIbHLwjIyz^pVXD7wlR`_Iqu8jho`uIQjiO}yTNr= zFgh`_k*eE!Im+mGuBByZB5LX_63t&1h-^>3-zPa*qUu1QgY2`ub-X7-=7z zmG+6TK?{sSrKLs@Xjp?WYx3@eqnK+4R_)6if*QI^G(lsAAkDtjiR*6-LGs0W!}3%~ zXi54J`xyrYp*oW)B2T;2N7vA7heq4|(TVo{o&Nbg7@hNb@mrTm3Fv9yk=G~gMWdu6 zm95vC4MsV6Cp;`7Ly>u=U#^#L6l%1-iQ}5zV~|gwL6PI^5v0E!-8UZShx$n(Qa-xG zpjmb1tUFfVj2wKMu3vL39d&*7Tsgf}Pjs+r{KZR0M<55wAun8t{g7%`!^-m415sjw z<3qL`j6oZw{9Wd{PL8Jg4(wKPKM480X*oMnZ;6)s_3+$co{ZA{moDG9Ck3rAak(LW zl8Ab?wEb+^Fb>r_(5FGK&xxqMe7ft>qJC&l;9q6;ANE0gKdrgIS)sm$>wjT)_?1T6zSvG_IEPjzyHn?7z~UACXx5iZsgsujFl#z z%_i@l-M9eqKAfMD$@_6Pt`Ccs(G)&EoSdKdbrPPp@|*C>6OQ}^;KK8u2HXf{F9fIY zK|0+7r*T3$>A>mvS~|S}r?Ejg>A`92jZPKdG&aX3YrZ`+mPRL2a3Pi^0;e%JI@y3X z;FS}D3(v<+;Pjj^oh0Bic1I^qa7$h}DYzAQFnD8d8F&-$NN^fMq>~(+#!%^$0N#vO zP5~}_4_6j=bI4bM)7T}Qa>2>{eb}S|ZwbBMZt_25R}!f~rEIA_CeUt@3)xCyuz+!R~_ZYInR=eO&DOCjF^Tn1hrTn^pT8D{vXO7+el+53T@j4Xy-l1Fiyh09S)Mg6D&`1=oPL1J{B(gX_Ru z!1ds+;G8YL{_Vj<;BMef;2pp{!8?HmgLeUs1n&x-0PX>v1>Oxj7u*wkCAb%O9=JDn z0k{u%AvglR2adttfJ?zE!2Q5YoAc`*0B!@`16%^$6I==&2rdH;0+)mL0#|_d23Laj z0atCP*MqkJH*Epq zAKV7q2V4So={%GmoE^?gBJ?r!S4y>yYS`T2<5>m zg!15~_OSk*e0dvib8sgizdN7rDdd9(3;9w$KT^mCPY}EZpPwaoFz>m7_vL-1;4OyIUI1%7$=QF(}`Y3L??PR5lM^!+fM==)wer9r)E;0kaBl&4qa(TPT+=|r!~ zqtj?o1J6-F8r9~=TnRwF9F3^cDUqxRoyNd?G@4AO(N*ikw=ac7$LaN{ypMqPj)nD1 zfEaQ#d8baNcxYED)EiBDf=Kje2ilfsQs5cXquYh_+ z!gA9uZrkFji0E4@Z<0K1-- zrqFTX#`$x?`ye`A+_;`q@oqX!=y?p`eF+^eZse*0;e8MtH`IIb)f1yvqXku+=b+=p zja+RYysx6;hk6*4r{ln-?+jw?5EmPMF9 zjjR!M;e8k#XKv)IjF3;q8(m*v`E=a55fjSO@kd=)J{^a&Jwkap9%=sx>pz+sMcl8d z{?VkjX}-`Obey`8*1~R1mQL#nud0uZTiQOMK01Es`oUp>w1zHkV2$lX`^%pj4C_zF zHC>+2zx3Kzy8VRZ({b)bS|_~kq~o2s(0_E?)8z^4N5{V#DJ{IOrTYP0Ke#-HlpfD~ z2>IKWSSE}=x_{IhH*`O7BXbGsMa#L7QRD~h&SL#i?c>?})lT=Xn&s(!M#q(~Ui{Uv zfmPd$?ss%Ogm$O0^$e+6PkM!E&2hnB9~x5Ck90q!=jViRPWM;p!hS*bTk68{>HbT% zOYMH3`*Y3l6T{ZKx?OZXuh~wzzt?oS-~a0T{voUvJr2~&Pi5P`x_)|msF^>yR(X77yA4|k5|I}#vdQ5 z^V8V+*E~MZ^0FG^g!bP6lJe{L=J)IB<5@v2Q*%C{ z-+Gd^(~0kwo>k+IfBp`x+MoD-@~dh$-%oy3$1T2}s*mG*KLu3nf1}wr;n%ZfJNWij zucy#18T2sUuD(_K4d1Q-Rqf>4)wf1F=yUsX7h_%db8j(&bl=H-7m6RmVGi`PJ>EpE01L*N^tD0p zU$<*2I}-fb{!p?f@e^Nf?;1|~VNlij(DkP&!pPv;HMlCDpFg1LI3o13@VrXrr(5FJ z`GunheSJl9{j0XC(0{`5mS0})s`cc{hgXdwzPw-6cIC_Wto=Z%Hqy$zffZqE+`P9)*q2l21ANiY`TK#Kpr zKo5Qy^0|)u`kw?Bffow-&|l8rV#r?&?g^d@F2rr@!DWyi3ogX<48Y}(FTDO!fKP&a zCHNt5Ar2_S30FeCu-^!AKqDxh2l>M5ngZ}ykT1ju>w*_TzHodN;)X(8@gC%Fgz|5| z7lBuR3&&&APJI9FhkP6Go!~;8LwKF&1o?9zUx-thfO|r|5T_C1mZp#&4EdYDBf+nL zCxGt)&jP;)o(sMhd?ol1@I3Hy;053Zzzf0efZqexg1-S5UME+8YarjWGv8k~!8wS_ znSt9t{&jFC@JHaD;CI1;!7qVFf*%A=06ztu1%3-W7ko4LO7Pv_dEigL3&59v7lP}+ z?|~l$e*=CMyaN0wxM>%@KOTVFfIkLz0xtsh1V0Zh#7WzL2Sa{5xGC)4LR>Tw@>3vR zh?}+rPk{UcVSd;?=HOY7-xu5o>URgvh5XUrBACA(_)5rM3Z4hP1-tuY~+%;CbNv!9Afq5qJUQ3-7nZ&_8aFUkLg9vo%*0_wES!_aHwDJQwEo27d$j zQ^BRM{6^sUP#%L69=rXKwE9RMB-P)U1D*@{)4@F5PN ze`9bb$R7kQhx{hso{%2_9t^$`JQ92!cmnu(@GS5=As_0u2G523NN@$@Hw9k_`TW@g zjuWn%=nnaLkUs;w0DK#GA^2GEd*Expm9V^K;BO#5N|+z=TZ30XejK=|C*S`kz-_?K zfIETbgL{G(fCq#B1s(~00X!F$ZwsCP`9r~l^ZL)hvmpO8xC;C@cpmsxa1HqHLU~wT zbMSkRzY6>f_;28{ru_PM2Csnp@!-OBDpGJ$FTVU7@GO|$6Wj*!mEcOq_X2l<{2cI= z&|W)mPskqz9t@rau7>h0z#}1lIJg{^*A+Yg@+X29!2DwHEXa=m&x8Dy;JJ`52akmM zyMV8R{B_{@;1j_0P+vRnLdZ`9zXzTU{sz1bcm?<~a8qx-|5e~N;2Xf5!1sZBg6{wi z1`h;}1XqCb=Vj@g9{7oWpBqiyzt{8_a(1_-$3e71c%K~)(J8?b$yxN8<&z+qBIGAS z)I{(Ua+bel`4n;nuBOv-9W_0joPDV2qiW^Tv!pfi=~>R2E}Z2SmY-c?ed*aw{%l}u zjq`wf3ja5Sc$6Dyy-+_Ne-WZ}G#*3GJJ9<<@DqPNDu&cR?@>@)4ueezEK)+|r&^6{$+&x68w;8ch< z@o}J$aMnRMzY|T)4)YU#{wAiXy}S$2N}+sgRr~q;>h4YdNABU#>EsRh8 z{A%_15nMP9@lO8=%cJLCQ>w-zpP$M;D@{xAaggfv@o}2!{gRJcR(~#5#p@pXD!5c-Rcb5!rIybIBHKK|}T&R7e_ zZ9aZBvZ}xMcvo`O{=vtUs@pHbeS{SL`t{_h{^R3g$yLX3KCUQ4(`j6t#vO$yJB?e@ z_+0h=$j1kTXgbZOaVKGE)ah}M{^ch=u2nOi-`}e9si#(rKR*6P|MC+b7Z$EQ;IBuh zIez#!k#Lm)&8N$+S)SHkeLUdfc-8IU*B5^M_&8s6d-ym`_5QVnV z&)?JMAfX1qg&L^S_(;us>NWFej|wfKcuMe2}cWF{gAlW~(SM5Z3hn zEHx_rb${(zZ7liwΝ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 B;I9Ax diff --git a/.venv/Lib/site-packages/discord/bin/libopus-0.x86.dll b/.venv/Lib/site-packages/discord/bin/libopus-0.x86.dll deleted file mode 100644 index ee71317fa6291e8a015b57b5b42a968b49ceb7fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 366080 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

ss8*YJa`<&!F4OE!PF< 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 str: - attrs = [ - ('id', self.id), - ('name', self.name), - ('position', self.position), - ('nsfw', self.nsfw), - ('news', self.is_news()), - ('category_id', self.category_id), - ] - joined = ' '.join('%s=%r' % t for t in attrs) - return f'<{self.__class__.__name__} {joined}>' - - def _update(self, guild: Guild, data: Union[TextChannelPayload, NewsChannelPayload]) -> None: - self.guild: Guild = guild - self.name: str = data['name'] - self.category_id: Optional[int] = utils._get_as_snowflake(data, 'parent_id') - self.topic: Optional[str] = data.get('topic') - self.position: int = data['position'] - self.nsfw: bool = data.get('nsfw', False) - # Does this need coercion into `int`? No idea yet. - self.slowmode_delay: int = data.get('rate_limit_per_user', 0) - self.default_auto_archive_duration: ThreadArchiveDuration = data.get('default_auto_archive_duration', 1440) - self._type: Literal[0, 5] = data.get('type', self._type) - self.last_message_id: Optional[int] = utils._get_as_snowflake(data, 'last_message_id') - self._fill_overwrites(data) - - async def _get_channel(self) -> Self: - return self - - @property - def type(self) -> Literal[ChannelType.text, ChannelType.news]: - """:class:`ChannelType`: The channel's Discord type.""" - if self._type == 0: - return ChannelType.text - return ChannelType.news - - @property - def _sorting_bucket(self) -> int: - return ChannelType.text.value - - @property - def _scheduled_event_entity_type(self) -> Optional[EntityType]: - return None - - @utils.copy_doc(discord.abc.GuildChannel.permissions_for) - def permissions_for(self, obj: Union[Member, Role], /) -> Permissions: - base = super().permissions_for(obj) - - # text channels do not have voice related permissions - denied = Permissions.voice() - base.value &= ~denied.value - return base - - @property - def members(self) -> List[Member]: - """List[:class:`Member`]: Returns all members that can see this channel.""" - return [m for m in self.guild.members if self.permissions_for(m).read_messages] - - @property - def threads(self) -> List[Thread]: - """List[:class:`Thread`]: Returns all the threads that you can see. - - .. versionadded:: 2.0 - """ - return [thread for thread in self.guild._threads.values() if thread.parent_id == self.id] - - def is_nsfw(self) -> bool: - """:class:`bool`: Checks if the channel is NSFW.""" - return self.nsfw - - def is_news(self) -> bool: - """:class:`bool`: Checks if the channel is a news channel.""" - return self._type == ChannelType.news.value - - @property - def last_message(self) -> Optional[Message]: - """Retrieves the last message from this channel in cache. - - The message might not be valid or point to an existing message. - - .. admonition:: Reliable Fetching - :class: helpful - - For a slightly more reliable method of fetching the - last message, consider using either :meth:`history` - or :meth:`fetch_message` with the :attr:`last_message_id` - attribute. - - Returns - --------- - Optional[:class:`Message`] - The last message in this channel or ``None`` if not found. - """ - return self._state._get_message(self.last_message_id) if self.last_message_id else None - - @overload - async def edit(self) -> Optional[TextChannel]: - ... - - @overload - async def edit(self, *, position: int, reason: Optional[str] = ...) -> None: - ... - - @overload - async def edit( - self, - *, - reason: Optional[str] = ..., - name: str = ..., - topic: str = ..., - position: int = ..., - nsfw: bool = ..., - sync_permissions: bool = ..., - category: Optional[CategoryChannel] = ..., - slowmode_delay: int = ..., - default_auto_archive_duration: ThreadArchiveDuration = ..., - type: ChannelType = ..., - overwrites: Mapping[OverwriteKeyT, PermissionOverwrite] = ..., - ) -> TextChannel: - ... - - async def edit(self, *, reason: Optional[str] = None, **options: Any) -> Optional[TextChannel]: - """|coro| - - Edits the channel. - - You must have the :attr:`~Permissions.manage_channels` permission to - use this. - - .. versionchanged:: 1.3 - The ``overwrites`` keyword-only parameter was added. - - .. versionchanged:: 1.4 - The ``type`` keyword-only parameter was added. - - .. versionchanged:: 2.0 - Edits are no longer in-place, the newly edited channel is returned instead. - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` or - :exc:`ValueError` instead of ``InvalidArgument``. - - Parameters - ---------- - name: :class:`str` - The new channel name. - topic: :class:`str` - The new channel's topic. - position: :class:`int` - The new channel's position. - nsfw: :class:`bool` - To mark the channel as NSFW or not. - sync_permissions: :class:`bool` - Whether to sync permissions with the channel's new or pre-existing - category. Defaults to ``False``. - category: Optional[:class:`CategoryChannel`] - The new category for this channel. Can be ``None`` to remove the - category. - slowmode_delay: :class:`int` - Specifies the slowmode rate limit for user in this channel, in seconds. - A value of `0` disables slowmode. The maximum value possible is `21600`. - type: :class:`ChannelType` - Change the type of this text channel. Currently, only conversion between - :attr:`ChannelType.text` and :attr:`ChannelType.news` is supported. This - is only available to guilds that contain ``NEWS`` in :attr:`Guild.features`. - reason: Optional[:class:`str`] - The reason for editing this channel. Shows up on the audit log. - overwrites: :class:`Mapping` - A :class:`Mapping` of target (either a role or a member) to - :class:`PermissionOverwrite` to apply to the channel. - default_auto_archive_duration: :class:`int` - The new default auto archive duration in minutes for threads created in this channel. - Must be one of ``60``, ``1440``, ``4320``, or ``10080``. - - Raises - ------ - ValueError - The new ``position`` is less than 0 or greater than the number of channels. - TypeError - The permission overwrite information is not in proper form. - Forbidden - You do not have permissions to edit the channel. - HTTPException - Editing the channel failed. - - Returns - -------- - Optional[:class:`.TextChannel`] - The newly edited text channel. If the edit was only positional - then ``None`` is returned instead. - """ - - payload = await self._edit(options, reason=reason) - if payload is not None: - # the payload will always be the proper channel payload - return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore - - @utils.copy_doc(discord.abc.GuildChannel.clone) - async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> TextChannel: - return await self._clone_impl( - {'topic': self.topic, 'nsfw': self.nsfw, 'rate_limit_per_user': self.slowmode_delay}, name=name, reason=reason - ) - - async def delete_messages(self, messages: Iterable[Snowflake], *, reason: Optional[str] = None) -> None: - """|coro| - - Deletes a list of messages. This is similar to :meth:`Message.delete` - except it bulk deletes multiple messages. - - As a special case, if the number of messages is 0, then nothing - is done. If the number of messages is 1 then single message - delete is done. If it's more than two, then bulk delete is used. - - You cannot bulk delete more than 100 messages or messages that - are older than 14 days old. - - You must have the :attr:`~Permissions.manage_messages` permission to - use this. - - .. versionchanged:: 2.0 - - ``messages`` parameter is now positional-only. - - The ``reason`` keyword-only parameter was added. - - Parameters - ----------- - messages: Iterable[:class:`abc.Snowflake`] - An iterable of messages denoting which ones to bulk delete. - reason: Optional[:class:`str`] - The reason for deleting the messages. Shows up on the audit log. - - Raises - ------ - ClientException - The number of messages to delete was more than 100. - Forbidden - You do not have proper permissions to delete the messages. - NotFound - If single delete, then the message was already deleted. - HTTPException - Deleting the messages failed. - """ - if not isinstance(messages, (list, tuple)): - messages = list(messages) - - if len(messages) == 0: - return # do nothing - - if len(messages) == 1: - message_id: int = messages[0].id - await self._state.http.delete_message(self.id, message_id) - return - - if len(messages) > 100: - raise ClientException('Can only bulk delete messages up to 100 messages') - - message_ids: SnowflakeList = [m.id for m in messages] - await self._state.http.delete_messages(self.id, message_ids, reason=reason) - - async def purge( - self, - *, - limit: Optional[int] = 100, - check: Callable[[Message], bool] = MISSING, - before: Optional[SnowflakeTime] = None, - after: Optional[SnowflakeTime] = None, - around: Optional[SnowflakeTime] = None, - oldest_first: Optional[bool] = None, - bulk: bool = True, - reason: Optional[str] = None, - ) -> List[Message]: - """|coro| - - Purges a list of messages that meet the criteria given by the predicate - ``check``. If a ``check`` is not provided then all messages are deleted - without discrimination. - - You must have the :attr:`~Permissions.manage_messages` permission to - delete messages even if they are your own. - The :attr:`~Permissions.read_message_history` permission is - also needed to retrieve message history. - - .. versionchanged:: 2.0 - - The ``reason`` keyword-only parameter was added. - - Examples - --------- - - Deleting bot's messages :: - - def is_me(m): - return m.author == client.user - - deleted = await channel.purge(limit=100, check=is_me) - await channel.send(f'Deleted {len(deleted)} message(s)') - - Parameters - ----------- - limit: Optional[:class:`int`] - The number of messages to search through. This is not the number - of messages that will be deleted, though it can be. - check: Callable[[:class:`Message`], :class:`bool`] - The function used to check if a message should be deleted. - It must take a :class:`Message` as its sole parameter. - before: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] - Same as ``before`` in :meth:`history`. - after: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] - Same as ``after`` in :meth:`history`. - around: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] - Same as ``around`` in :meth:`history`. - oldest_first: Optional[:class:`bool`] - Same as ``oldest_first`` in :meth:`history`. - bulk: :class:`bool` - If ``True``, use bulk delete. Setting this to ``False`` is useful for mass-deleting - a bot's own messages without :attr:`Permissions.manage_messages`. When ``True``, will - fall back to single delete if messages are older than two weeks. - reason: Optional[:class:`str`] - The reason for purging the messages. Shows up on the audit log. - - Raises - ------- - Forbidden - You do not have proper permissions to do the actions required. - HTTPException - Purging the messages failed. - - Returns - -------- - List[:class:`.Message`] - The list of messages that were deleted. - """ - return await discord.abc._purge_helper( - self, - limit=limit, - check=check, - before=before, - after=after, - around=around, - oldest_first=oldest_first, - bulk=bulk, - reason=reason, - ) - - async def webhooks(self) -> List[Webhook]: - """|coro| - - Gets the list of webhooks from this channel. - - Requires :attr:`~.Permissions.manage_webhooks` permissions. - - Raises - ------- - Forbidden - You don't have permissions to get the webhooks. - - Returns - -------- - List[:class:`Webhook`] - The webhooks for this channel. - """ - - from .webhook import Webhook - - data = await self._state.http.channel_webhooks(self.id) - return [Webhook.from_state(d, state=self._state) for d in data] - - async def create_webhook(self, *, name: str, avatar: Optional[bytes] = None, reason: Optional[str] = None) -> Webhook: - """|coro| - - Creates a webhook for this channel. - - Requires :attr:`~.Permissions.manage_webhooks` permissions. - - .. versionchanged:: 1.1 - Added the ``reason`` keyword-only parameter. - - Parameters - ------------- - name: :class:`str` - The webhook's name. - avatar: Optional[:class:`bytes`] - A :term:`py:bytes-like object` representing the webhook's default avatar. - This operates similarly to :meth:`~ClientUser.edit`. - reason: Optional[:class:`str`] - The reason for creating this webhook. Shows up in the audit logs. - - Raises - ------- - HTTPException - Creating the webhook failed. - Forbidden - You do not have permissions to create a webhook. - - Returns - -------- - :class:`Webhook` - The created webhook. - """ - - from .webhook import Webhook - - if avatar is not None: - avatar = utils._bytes_to_base64_data(avatar) # type: ignore # Silence reassignment error - - data = await self._state.http.create_webhook(self.id, name=str(name), avatar=avatar, reason=reason) - return Webhook.from_state(data, state=self._state) - - async def follow(self, *, destination: TextChannel, reason: Optional[str] = None) -> Webhook: - """ - Follows a channel using a webhook. - - Only news channels can be followed. - - .. note:: - - The webhook returned will not provide a token to do webhook - actions, as Discord does not provide it. - - .. versionadded:: 1.3 - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` instead of - ``InvalidArgument``. - - Parameters - ----------- - destination: :class:`TextChannel` - The channel you would like to follow from. - reason: Optional[:class:`str`] - The reason for following the channel. Shows up on the destination guild's audit log. - - .. versionadded:: 1.4 - - Raises - ------- - HTTPException - Following the channel failed. - Forbidden - You do not have the permissions to create a webhook. - ClientException - The channel is not a news channel. - TypeError - The destination channel is not a text channel. - - Returns - -------- - :class:`Webhook` - The created webhook. - """ - - if not self.is_news(): - raise ClientException('The channel must be a news channel.') - - if not isinstance(destination, TextChannel): - raise TypeError(f'Expected TextChannel received {destination.__class__.__name__}') - - from .webhook import Webhook - - data = await self._state.http.follow_webhook(self.id, webhook_channel_id=destination.id, reason=reason) - return Webhook._as_follower(data, channel=destination, user=self._state.user) - - def get_partial_message(self, message_id: int, /) -> PartialMessage: - """Creates a :class:`PartialMessage` from the message ID. - - This is useful if you want to work with a message and only have its ID without - doing an unnecessary API call. - - .. versionadded:: 1.6 - - .. versionchanged:: 2.0 - - ``message_id`` parameter is now positional-only. - - Parameters - ------------ - message_id: :class:`int` - The message ID to create a partial message for. - - Returns - --------- - :class:`PartialMessage` - The partial message. - """ - - from .message import PartialMessage - - return PartialMessage(channel=self, id=message_id) - - def get_thread(self, thread_id: int, /) -> Optional[Thread]: - """Returns a thread with the given ID. - - .. note:: - - This does not always retrieve archived threads, as they are not retained in the internal - cache. Use :func:`Guild.fetch_channel` instead. - - .. versionadded:: 2.0 - - Parameters - ----------- - thread_id: :class:`int` - The ID to search for. - - Returns - -------- - Optional[:class:`Thread`] - The returned thread or ``None`` if not found. - """ - return self.guild.get_thread(thread_id) - - async def create_thread( - self, - *, - name: str, - message: Optional[Snowflake] = None, - auto_archive_duration: ThreadArchiveDuration = MISSING, - type: Optional[ChannelType] = None, - reason: Optional[str] = None, - invitable: bool = True, - slowmode_delay: Optional[int] = None, - ) -> Thread: - """|coro| - - Creates a thread in this text channel. - - To create a public thread, you must have :attr:`~discord.Permissions.create_public_threads`. - For a private thread, :attr:`~discord.Permissions.create_private_threads` is needed instead. - - .. versionadded:: 2.0 - - Parameters - ----------- - name: :class:`str` - The name of the thread. - message: Optional[:class:`abc.Snowflake`] - A snowflake representing the message to create the thread with. - If ``None`` is passed then a private thread is created. - Defaults to ``None``. - auto_archive_duration: :class:`int` - The duration in minutes before a thread is automatically archived for inactivity. - If not provided, the channel's default auto archive duration is used. - type: Optional[:class:`ChannelType`] - The type of thread to create. If a ``message`` is passed then this parameter - is ignored, as a thread created with a message is always a public thread. - By default this creates a private thread if this is ``None``. - reason: :class:`str` - The reason for creating a new thread. Shows up on the audit log. - invitable: :class:`bool` - Whether non-moderators can add users to the thread. Only applicable to private threads. - Defaults to ``True``. - slowmode_delay: Optional[:class:`int`] - Specifies the slowmode rate limit for user in this channel, in seconds. - The maximum value possible is `21600`. By default no slowmode rate limit - if this is ``None``. - - Raises - ------- - Forbidden - You do not have permissions to create a thread. - HTTPException - Starting the thread failed. - - Returns - -------- - :class:`Thread` - The created thread - """ - - if type is None: - type = ChannelType.private_thread - - if message is None: - data = await self._state.http.start_thread_without_message( - self.id, - name=name, - auto_archive_duration=auto_archive_duration or self.default_auto_archive_duration, - type=type.value, - reason=reason, - invitable=invitable, - rate_limit_per_user=slowmode_delay, - ) - else: - data = await self._state.http.start_thread_with_message( - self.id, - message.id, - name=name, - auto_archive_duration=auto_archive_duration or self.default_auto_archive_duration, - reason=reason, - rate_limit_per_user=slowmode_delay, - ) - - return Thread(guild=self.guild, state=self._state, data=data) - - async def archived_threads( - self, - *, - private: bool = False, - joined: bool = False, - limit: Optional[int] = 100, - before: Optional[Union[Snowflake, datetime.datetime]] = None, - ) -> AsyncIterator[Thread]: - """Returns an :term:`asynchronous iterator` that iterates over all archived threads in this text channel, - in order of decreasing ID for joined threads, and decreasing :attr:`Thread.archive_timestamp` otherwise. - - You must have :attr:`~Permissions.read_message_history` to use this. If iterating over private threads - then :attr:`~Permissions.manage_threads` is also required. - - .. versionadded:: 2.0 - - Parameters - ----------- - limit: Optional[:class:`bool`] - The number of threads to retrieve. - If ``None``, retrieves every archived thread in the channel. Note, however, - that this would make it a slow operation. - before: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] - Retrieve archived channels before the given date or ID. - private: :class:`bool` - Whether to retrieve private archived threads. - joined: :class:`bool` - Whether to retrieve private archived threads that you've joined. - You cannot set ``joined`` to ``True`` and ``private`` to ``False``. - - Raises - ------ - Forbidden - You do not have permissions to get archived threads. - HTTPException - The request to get the archived threads failed. - ValueError - ``joined`` was set to ``True`` and ``private`` was set to ``False``. You cannot retrieve public archived - threads that you have joined. - - Yields - ------- - :class:`Thread` - The archived threads. - """ - if joined and not private: - raise ValueError('Cannot retrieve joined public archived threads') - - before_timestamp = None - - if isinstance(before, datetime.datetime): - if joined: - before_timestamp = str(utils.time_snowflake(before, high=False)) - else: - before_timestamp = before.isoformat() - elif before is not None: - if joined: - before_timestamp = str(before.id) - else: - before_timestamp = utils.snowflake_time(before.id).isoformat() - - update_before = lambda data: data['thread_metadata']['archive_timestamp'] - endpoint = self.guild._state.http.get_public_archived_threads - - if joined: - update_before = lambda data: data['id'] - endpoint = self.guild._state.http.get_joined_private_archived_threads - elif private: - endpoint = self.guild._state.http.get_private_archived_threads - - while True: - retrieve = 100 - if limit is not None: - if limit <= 0: - return - retrieve = max(2, min(retrieve, limit)) - - data = await endpoint(self.id, before=before_timestamp, limit=retrieve) - - threads = data.get('threads', []) - for raw_thread in threads: - yield Thread(guild=self.guild, state=self.guild._state, data=raw_thread) - # Currently the API doesn't let you request less than 2 threads. - # Bail out early if we had to retrieve more than what the limit was. - if limit is not None: - limit -= 1 - if limit <= 0: - return - - if not data.get('has_more', False): - return - - before_timestamp = update_before(threads[-1]) - - -class VocalGuildChannel(discord.abc.Connectable, discord.abc.GuildChannel, Hashable): - __slots__ = ( - 'name', - 'id', - 'guild', - 'nsfw', - 'bitrate', - 'user_limit', - '_state', - 'position', - '_overwrites', - 'category_id', - 'rtc_region', - 'video_quality_mode', - 'last_message_id', - ) - - def __init__(self, *, state: ConnectionState, guild: Guild, data: Union[VoiceChannelPayload, StageChannelPayload]): - self._state: ConnectionState = state - self.id: int = int(data['id']) - self._update(guild, data) - - def _get_voice_client_key(self) -> Tuple[int, str]: - return self.guild.id, 'guild_id' - - def _get_voice_state_pair(self) -> Tuple[int, int]: - return self.guild.id, self.id - - def _update(self, guild: Guild, data: Union[VoiceChannelPayload, StageChannelPayload]) -> None: - self.guild: Guild = guild - self.name: str = data['name'] - self.nsfw: bool = data.get('nsfw', False) - self.rtc_region: Optional[str] = data.get('rtc_region') - self.video_quality_mode: VideoQualityMode = try_enum(VideoQualityMode, data.get('video_quality_mode', 1)) - self.category_id: Optional[int] = utils._get_as_snowflake(data, 'parent_id') - self.last_message_id: Optional[int] = utils._get_as_snowflake(data, 'last_message_id') - self.position: int = data['position'] - self.bitrate: int = data['bitrate'] - self.user_limit: int = data['user_limit'] - self._fill_overwrites(data) - - @property - def _sorting_bucket(self) -> int: - return ChannelType.voice.value - - def is_nsfw(self) -> bool: - """:class:`bool`: Checks if the channel is NSFW. - - .. versionadded:: 2.0 - """ - return self.nsfw - - @property - def members(self) -> List[Member]: - """List[:class:`Member`]: Returns all members that are currently inside this voice channel.""" - ret = [] - for user_id, state in self.guild._voice_states.items(): - if state.channel and state.channel.id == self.id: - member = self.guild.get_member(user_id) - if member is not None: - ret.append(member) - return ret - - @property - def voice_states(self) -> Dict[int, VoiceState]: - """Returns a mapping of member IDs who have voice states in this channel. - - .. versionadded:: 1.3 - - .. note:: - - This function is intentionally low level to replace :attr:`members` - when the member cache is unavailable. - - Returns - -------- - Mapping[:class:`int`, :class:`VoiceState`] - The mapping of member ID to a voice state. - """ - # fmt: off - return { - key: value - for key, value in self.guild._voice_states.items() - if value.channel and value.channel.id == self.id - } - # fmt: on - - @property - def scheduled_events(self) -> List[ScheduledEvent]: - """List[:class:`ScheduledEvent`]: Returns all scheduled events for this channel. - - .. versionadded:: 2.0 - """ - return [event for event in self.guild.scheduled_events if event.channel_id == self.id] - - @utils.copy_doc(discord.abc.GuildChannel.permissions_for) - def permissions_for(self, obj: Union[Member, Role], /) -> Permissions: - base = super().permissions_for(obj) - - # voice channels cannot be edited by people who can't connect to them - # It also implicitly denies all other voice perms - if not base.connect: - denied = Permissions.voice() - denied.update(manage_channels=True, manage_roles=True) - base.value &= ~denied.value - return base - - -class VoiceChannel(discord.abc.Messageable, VocalGuildChannel): - """Represents a Discord guild voice channel. - - .. container:: operations - - .. describe:: x == y - - Checks if two channels are equal. - - .. describe:: x != y - - Checks if two channels are not equal. - - .. describe:: hash(x) - - Returns the channel's hash. - - .. describe:: str(x) - - Returns the channel's name. - - Attributes - ----------- - name: :class:`str` - The channel name. - guild: :class:`Guild` - The guild the channel belongs to. - id: :class:`int` - The channel ID. - nsfw: :class:`bool` - If the channel is marked as "not safe for work" or "age restricted". - - .. versionadded:: 2.0 - category_id: Optional[:class:`int`] - The category channel ID this channel belongs to, if applicable. - position: :class:`int` - The position in the channel list. This is a number that starts at 0. e.g. the - top channel is position 0. - bitrate: :class:`int` - The channel's preferred audio bitrate in bits per second. - user_limit: :class:`int` - The channel's limit for number of members that can be in a voice channel. - rtc_region: Optional[:class:`str`] - The region for the voice channel's voice communication. - A value of ``None`` indicates automatic voice region detection. - - .. versionadded:: 1.7 - - .. versionchanged:: 2.0 - The type of this attribute has changed to :class:`str`. - video_quality_mode: :class:`VideoQualityMode` - The camera video quality for the voice channel's participants. - - .. versionadded:: 2.0 - last_message_id: Optional[:class:`int`] - The last message ID of the message sent to this channel. It may - *not* point to an existing or valid message. - - .. versionadded:: 2.0 - """ - - __slots__ = () - - def __repr__(self) -> str: - attrs = [ - ('id', self.id), - ('name', self.name), - ('rtc_region', self.rtc_region), - ('position', self.position), - ('bitrate', self.bitrate), - ('video_quality_mode', self.video_quality_mode), - ('user_limit', self.user_limit), - ('category_id', self.category_id), - ] - joined = ' '.join('%s=%r' % t for t in attrs) - return f'<{self.__class__.__name__} {joined}>' - - async def _get_channel(self) -> Self: - return self - - @property - def _scheduled_event_entity_type(self) -> Optional[EntityType]: - return EntityType.voice - - @property - def type(self) -> Literal[ChannelType.voice]: - """:class:`ChannelType`: The channel's Discord type.""" - return ChannelType.voice - - @property - def last_message(self) -> Optional[Message]: - """Retrieves the last message from this channel in cache. - - The message might not be valid or point to an existing message. - - .. versionadded:: 2.0 - - .. admonition:: Reliable Fetching - :class: helpful - - For a slightly more reliable method of fetching the - last message, consider using either :meth:`history` - or :meth:`fetch_message` with the :attr:`last_message_id` - attribute. - - Returns - --------- - Optional[:class:`Message`] - The last message in this channel or ``None`` if not found. - """ - return self._state._get_message(self.last_message_id) if self.last_message_id else None - - def get_partial_message(self, message_id: int, /) -> PartialMessage: - """Creates a :class:`PartialMessage` from the message ID. - - This is useful if you want to work with a message and only have its ID without - doing an unnecessary API call. - - .. versionadded:: 2.0 - - Parameters - ------------ - message_id: :class:`int` - The message ID to create a partial message for. - - Returns - --------- - :class:`PartialMessage` - The partial message. - """ - - from .message import PartialMessage - - return PartialMessage(channel=self, id=message_id) - - async def delete_messages(self, messages: Iterable[Snowflake], *, reason: Optional[str] = None) -> None: - """|coro| - - Deletes a list of messages. This is similar to :meth:`Message.delete` - except it bulk deletes multiple messages. - - As a special case, if the number of messages is 0, then nothing - is done. If the number of messages is 1 then single message - delete is done. If it's more than two, then bulk delete is used. - - You cannot bulk delete more than 100 messages or messages that - are older than 14 days old. - - You must have the :attr:`~Permissions.manage_messages` permission to - use this. - - .. versionadded:: 2.0 - - Parameters - ----------- - messages: Iterable[:class:`abc.Snowflake`] - An iterable of messages denoting which ones to bulk delete. - reason: Optional[:class:`str`] - The reason for deleting the messages. Shows up on the audit log. - - Raises - ------ - ClientException - The number of messages to delete was more than 100. - Forbidden - You do not have proper permissions to delete the messages. - NotFound - If single delete, then the message was already deleted. - HTTPException - Deleting the messages failed. - """ - if not isinstance(messages, (list, tuple)): - messages = list(messages) - - if len(messages) == 0: - return # do nothing - - if len(messages) == 1: - message_id: int = messages[0].id - await self._state.http.delete_message(self.id, message_id) - return - - if len(messages) > 100: - raise ClientException('Can only bulk delete messages up to 100 messages') - - message_ids: SnowflakeList = [m.id for m in messages] - await self._state.http.delete_messages(self.id, message_ids, reason=reason) - - async def purge( - self, - *, - limit: Optional[int] = 100, - check: Callable[[Message], bool] = MISSING, - before: Optional[SnowflakeTime] = None, - after: Optional[SnowflakeTime] = None, - around: Optional[SnowflakeTime] = None, - oldest_first: Optional[bool] = None, - bulk: bool = True, - reason: Optional[str] = None, - ) -> List[Message]: - """|coro| - - Purges a list of messages that meet the criteria given by the predicate - ``check``. If a ``check`` is not provided then all messages are deleted - without discrimination. - - You must have the :attr:`~Permissions.manage_messages` permission to - delete messages even if they are your own. - The :attr:`~Permissions.read_message_history` permission is - also needed to retrieve message history. - - .. versionadded:: 2.0 - - Examples - --------- - - Deleting bot's messages :: - - def is_me(m): - return m.author == client.user - - deleted = await channel.purge(limit=100, check=is_me) - await channel.send(f'Deleted {len(deleted)} message(s)') - - Parameters - ----------- - limit: Optional[:class:`int`] - The number of messages to search through. This is not the number - of messages that will be deleted, though it can be. - check: Callable[[:class:`Message`], :class:`bool`] - The function used to check if a message should be deleted. - It must take a :class:`Message` as its sole parameter. - before: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] - Same as ``before`` in :meth:`history`. - after: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] - Same as ``after`` in :meth:`history`. - around: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] - Same as ``around`` in :meth:`history`. - oldest_first: Optional[:class:`bool`] - Same as ``oldest_first`` in :meth:`history`. - bulk: :class:`bool` - If ``True``, use bulk delete. Setting this to ``False`` is useful for mass-deleting - a bot's own messages without :attr:`Permissions.manage_messages`. When ``True``, will - fall back to single delete if messages are older than two weeks. - reason: Optional[:class:`str`] - The reason for purging the messages. Shows up on the audit log. - - Raises - ------- - Forbidden - You do not have proper permissions to do the actions required. - HTTPException - Purging the messages failed. - - Returns - -------- - List[:class:`.Message`] - The list of messages that were deleted. - """ - - return await discord.abc._purge_helper( - self, - limit=limit, - check=check, - before=before, - after=after, - around=around, - oldest_first=oldest_first, - bulk=bulk, - reason=reason, - ) - - async def webhooks(self) -> List[Webhook]: - """|coro| - - Gets the list of webhooks from this channel. - - Requires :attr:`~.Permissions.manage_webhooks` permissions. - - .. versionadded:: 2.0 - - Raises - ------- - Forbidden - You don't have permissions to get the webhooks. - - Returns - -------- - List[:class:`Webhook`] - The webhooks for this channel. - """ - - from .webhook import Webhook - - data = await self._state.http.channel_webhooks(self.id) - return [Webhook.from_state(d, state=self._state) for d in data] - - async def create_webhook(self, *, name: str, avatar: Optional[bytes] = None, reason: Optional[str] = None) -> Webhook: - """|coro| - - Creates a webhook for this channel. - - Requires :attr:`~.Permissions.manage_webhooks` permissions. - - .. versionadded:: 2.0 - - Parameters - ------------- - name: :class:`str` - The webhook's name. - avatar: Optional[:class:`bytes`] - A :term:`py:bytes-like object` representing the webhook's default avatar. - This operates similarly to :meth:`~ClientUser.edit`. - reason: Optional[:class:`str`] - The reason for creating this webhook. Shows up in the audit logs. - - Raises - ------- - HTTPException - Creating the webhook failed. - Forbidden - You do not have permissions to create a webhook. - - Returns - -------- - :class:`Webhook` - The created webhook. - """ - - from .webhook import Webhook - - if avatar is not None: - avatar = utils._bytes_to_base64_data(avatar) # type: ignore # Silence reassignment error - - data = await self._state.http.create_webhook(self.id, name=str(name), avatar=avatar, reason=reason) - return Webhook.from_state(data, state=self._state) - - @utils.copy_doc(discord.abc.GuildChannel.clone) - async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> VoiceChannel: - return await self._clone_impl({'bitrate': self.bitrate, 'user_limit': self.user_limit}, name=name, reason=reason) - - @overload - async def edit(self) -> None: - ... - - @overload - async def edit(self, *, position: int, reason: Optional[str] = ...) -> None: - ... - - @overload - async def edit( - self, - *, - name: str = ..., - nsfw: bool = ..., - bitrate: int = ..., - user_limit: int = ..., - position: int = ..., - sync_permissions: int = ..., - category: Optional[CategoryChannel] = ..., - overwrites: Mapping[OverwriteKeyT, PermissionOverwrite] = ..., - rtc_region: Optional[str] = ..., - video_quality_mode: VideoQualityMode = ..., - reason: Optional[str] = ..., - ) -> VoiceChannel: - ... - - async def edit(self, *, reason: Optional[str] = None, **options: Any) -> Optional[VoiceChannel]: - """|coro| - - Edits the channel. - - You must have the :attr:`~Permissions.manage_channels` permission to - use this. - - .. versionchanged:: 1.3 - The ``overwrites`` keyword-only parameter was added. - - .. versionchanged:: 2.0 - Edits are no longer in-place, the newly edited channel is returned instead. - - .. versionchanged:: 2.0 - The ``region`` parameter now accepts :class:`str` instead of an enum. - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` instead of - ``InvalidArgument``. - - Parameters - ---------- - name: :class:`str` - The new channel's name. - bitrate: :class:`int` - The new channel's bitrate. - nsfw: :class:`bool` - To mark the channel as NSFW or not. - user_limit: :class:`int` - The new channel's user limit. - position: :class:`int` - The new channel's position. - sync_permissions: :class:`bool` - Whether to sync permissions with the channel's new or pre-existing - category. Defaults to ``False``. - category: Optional[:class:`CategoryChannel`] - The new category for this channel. Can be ``None`` to remove the - category. - reason: Optional[:class:`str`] - The reason for editing this channel. Shows up on the audit log. - overwrites: :class:`Mapping` - A :class:`Mapping` of target (either a role or a member) to - :class:`PermissionOverwrite` to apply to the channel. - rtc_region: Optional[:class:`str`] - The new region for the voice channel's voice communication. - A value of ``None`` indicates automatic voice region detection. - - .. versionadded:: 1.7 - video_quality_mode: :class:`VideoQualityMode` - The camera video quality for the voice channel's participants. - - .. versionadded:: 2.0 - - Raises - ------ - TypeError - If the permission overwrite information is not in proper form. - Forbidden - You do not have permissions to edit the channel. - HTTPException - Editing the channel failed. - - Returns - -------- - Optional[:class:`.VoiceChannel`] - The newly edited voice channel. If the edit was only positional - then ``None`` is returned instead. - """ - - payload = await self._edit(options, reason=reason) - if payload is not None: - # the payload will always be the proper channel payload - return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore - - -class StageChannel(VocalGuildChannel): - """Represents a Discord guild stage channel. - - .. versionadded:: 1.7 - - .. container:: operations - - .. describe:: x == y - - Checks if two channels are equal. - - .. describe:: x != y - - Checks if two channels are not equal. - - .. describe:: hash(x) - - Returns the channel's hash. - - .. describe:: str(x) - - Returns the channel's name. - - Attributes - ----------- - name: :class:`str` - The channel name. - guild: :class:`Guild` - The guild the channel belongs to. - id: :class:`int` - The channel ID. - nsfw: :class:`bool` - If the channel is marked as "not safe for work" or "age restricted". - - .. versionadded:: 2.0 - topic: Optional[:class:`str`] - The channel's topic. ``None`` if it isn't set. - category_id: Optional[:class:`int`] - The category channel ID this channel belongs to, if applicable. - position: :class:`int` - The position in the channel list. This is a number that starts at 0. e.g. the - top channel is position 0. - bitrate: :class:`int` - The channel's preferred audio bitrate in bits per second. - user_limit: :class:`int` - The channel's limit for number of members that can be in a stage channel. - rtc_region: Optional[:class:`str`] - The region for the stage channel's voice communication. - A value of ``None`` indicates automatic voice region detection. - video_quality_mode: :class:`VideoQualityMode` - The camera video quality for the stage channel's participants. - - .. versionadded:: 2.0 - """ - - __slots__ = ('topic',) - - def __repr__(self) -> str: - attrs = [ - ('id', self.id), - ('name', self.name), - ('topic', self.topic), - ('rtc_region', self.rtc_region), - ('position', self.position), - ('bitrate', self.bitrate), - ('video_quality_mode', self.video_quality_mode), - ('user_limit', self.user_limit), - ('category_id', self.category_id), - ] - joined = ' '.join('%s=%r' % t for t in attrs) - return f'<{self.__class__.__name__} {joined}>' - - def _update(self, guild: Guild, data: StageChannelPayload) -> None: - super()._update(guild, data) - self.topic: Optional[str] = data.get('topic') - - @property - def _scheduled_event_entity_type(self) -> Optional[EntityType]: - return EntityType.stage_instance - - @property - def requesting_to_speak(self) -> List[Member]: - """List[:class:`Member`]: A list of members who are requesting to speak in the stage channel.""" - return [member for member in self.members if member.voice and member.voice.requested_to_speak_at is not None] - - @property - def speakers(self) -> List[Member]: - """List[:class:`Member`]: A list of members who have been permitted to speak in the stage channel. - - .. versionadded:: 2.0 - """ - return [ - member - for member in self.members - if member.voice and not member.voice.suppress and member.voice.requested_to_speak_at is None - ] - - @property - def listeners(self) -> List[Member]: - """List[:class:`Member`]: A list of members who are listening in the stage channel. - - .. versionadded:: 2.0 - """ - return [member for member in self.members if member.voice and member.voice.suppress] - - @property - def moderators(self) -> List[Member]: - """List[:class:`Member`]: A list of members who are moderating the stage channel. - - .. versionadded:: 2.0 - """ - required_permissions = Permissions.stage_moderator() - return [member for member in self.members if self.permissions_for(member) >= required_permissions] - - @property - def type(self) -> Literal[ChannelType.stage_voice]: - """:class:`ChannelType`: The channel's Discord type.""" - return ChannelType.stage_voice - - @utils.copy_doc(discord.abc.GuildChannel.clone) - async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> StageChannel: - return await self._clone_impl({}, name=name, reason=reason) - - @property - def instance(self) -> Optional[StageInstance]: - """Optional[:class:`StageInstance`]: The running stage instance of the stage channel. - - .. versionadded:: 2.0 - """ - return utils.get(self.guild.stage_instances, channel_id=self.id) - - async def create_instance( - self, *, topic: str, privacy_level: PrivacyLevel = MISSING, reason: Optional[str] = None - ) -> StageInstance: - """|coro| - - Create a stage instance. - - You must have the :attr:`~Permissions.manage_channels` permission to - use this. - - .. versionadded:: 2.0 - - Parameters - ----------- - topic: :class:`str` - The stage instance's topic. - privacy_level: :class:`PrivacyLevel` - The stage instance's privacy level. Defaults to :attr:`PrivacyLevel.guild_only`. - reason: :class:`str` - The reason the stage instance was created. Shows up on the audit log. - - Raises - ------ - TypeError - If the ``privacy_level`` parameter is not the proper type. - Forbidden - You do not have permissions to create a stage instance. - HTTPException - Creating a stage instance failed. - - Returns - -------- - :class:`StageInstance` - The newly created stage instance. - """ - - payload: Dict[str, Any] = {'channel_id': self.id, 'topic': topic} - - if privacy_level is not MISSING: - if not isinstance(privacy_level, PrivacyLevel): - raise TypeError('privacy_level field must be of type PrivacyLevel') - - payload['privacy_level'] = privacy_level.value - - data = await self._state.http.create_stage_instance(**payload, reason=reason) - return StageInstance(guild=self.guild, state=self._state, data=data) - - async def fetch_instance(self) -> StageInstance: - """|coro| - - Gets the running :class:`StageInstance`. - - .. versionadded:: 2.0 - - Raises - ------- - NotFound - The stage instance or channel could not be found. - HTTPException - Getting the stage instance failed. - - Returns - -------- - :class:`StageInstance` - The stage instance. - """ - data = await self._state.http.get_stage_instance(self.id) - return StageInstance(guild=self.guild, state=self._state, data=data) - - @overload - async def edit(self) -> None: - ... - - @overload - async def edit(self, *, position: int, reason: Optional[str] = ...) -> None: - ... - - @overload - async def edit( - self, - *, - name: str = ..., - nsfw: bool = ..., - position: int = ..., - sync_permissions: int = ..., - category: Optional[CategoryChannel] = ..., - overwrites: Mapping[OverwriteKeyT, PermissionOverwrite] = ..., - rtc_region: Optional[str] = ..., - video_quality_mode: VideoQualityMode = ..., - reason: Optional[str] = ..., - ) -> StageChannel: - ... - - async def edit(self, *, reason: Optional[str] = None, **options: Any) -> Optional[StageChannel]: - """|coro| - - Edits the channel. - - You must have the :attr:`~Permissions.manage_channels` permission to - use this. - - .. versionchanged:: 2.0 - The ``topic`` parameter must now be set via :attr:`create_instance`. - - .. versionchanged:: 2.0 - Edits are no longer in-place, the newly edited channel is returned instead. - - .. versionchanged:: 2.0 - The ``region`` parameter now accepts :class:`str` instead of an enum. - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` instead of - ``InvalidArgument``. - - Parameters - ---------- - name: :class:`str` - The new channel's name. - position: :class:`int` - The new channel's position. - nsfw: :class:`bool` - To mark the channel as NSFW or not. - sync_permissions: :class:`bool` - Whether to sync permissions with the channel's new or pre-existing - category. Defaults to ``False``. - category: Optional[:class:`CategoryChannel`] - The new category for this channel. Can be ``None`` to remove the - category. - reason: Optional[:class:`str`] - The reason for editing this channel. Shows up on the audit log. - overwrites: :class:`Mapping` - A :class:`Mapping` of target (either a role or a member) to - :class:`PermissionOverwrite` to apply to the channel. - rtc_region: Optional[:class:`str`] - The new region for the stage channel's voice communication. - A value of ``None`` indicates automatic voice region detection. - video_quality_mode: :class:`VideoQualityMode` - The camera video quality for the stage channel's participants. - - .. versionadded:: 2.0 - - Raises - ------ - ValueError - If the permission overwrite information is not in proper form. - Forbidden - You do not have permissions to edit the channel. - HTTPException - Editing the channel failed. - - Returns - -------- - Optional[:class:`.StageChannel`] - The newly edited stage channel. If the edit was only positional - then ``None`` is returned instead. - """ - - payload = await self._edit(options, reason=reason) - if payload is not None: - # the payload will always be the proper channel payload - return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore - - -class CategoryChannel(discord.abc.GuildChannel, Hashable): - """Represents a Discord channel category. - - These are useful to group channels to logical compartments. - - .. container:: operations - - .. describe:: x == y - - Checks if two channels are equal. - - .. describe:: x != y - - Checks if two channels are not equal. - - .. describe:: hash(x) - - Returns the category's hash. - - .. describe:: str(x) - - Returns the category's name. - - Attributes - ----------- - name: :class:`str` - The category name. - guild: :class:`Guild` - The guild the category belongs to. - id: :class:`int` - The category channel ID. - position: :class:`int` - The position in the category list. This is a number that starts at 0. e.g. the - top category is position 0. - nsfw: :class:`bool` - If the channel is marked as "not safe for work". - - .. note:: - - To check if the channel or the guild of that channel are marked as NSFW, consider :meth:`is_nsfw` instead. - """ - - __slots__ = ('name', 'id', 'guild', 'nsfw', '_state', 'position', '_overwrites', 'category_id') - - def __init__(self, *, state: ConnectionState, guild: Guild, data: CategoryChannelPayload): - self._state: ConnectionState = state - self.id: int = int(data['id']) - self._update(guild, data) - - def __repr__(self) -> str: - return f'' - - def _update(self, guild: Guild, data: CategoryChannelPayload) -> None: - self.guild: Guild = guild - self.name: str = data['name'] - self.category_id: Optional[int] = utils._get_as_snowflake(data, 'parent_id') - self.nsfw: bool = data.get('nsfw', False) - self.position: int = data['position'] - self._fill_overwrites(data) - - @property - def _sorting_bucket(self) -> int: - return ChannelType.category.value - - @property - def _scheduled_event_entity_type(self) -> Optional[EntityType]: - return None - - @property - def type(self) -> Literal[ChannelType.category]: - """:class:`ChannelType`: The channel's Discord type.""" - return ChannelType.category - - def is_nsfw(self) -> bool: - """:class:`bool`: Checks if the category is NSFW.""" - return self.nsfw - - @utils.copy_doc(discord.abc.GuildChannel.clone) - async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> CategoryChannel: - return await self._clone_impl({'nsfw': self.nsfw}, name=name, reason=reason) - - @overload - async def edit(self) -> None: - ... - - @overload - async def edit(self, *, position: int, reason: Optional[str] = ...) -> None: - ... - - @overload - async def edit( - self, - *, - name: str = ..., - position: int = ..., - nsfw: bool = ..., - overwrites: Mapping[OverwriteKeyT, PermissionOverwrite] = ..., - reason: Optional[str] = ..., - ) -> CategoryChannel: - ... - - async def edit(self, *, reason: Optional[str] = None, **options: Any) -> Optional[CategoryChannel]: - """|coro| - - Edits the channel. - - You must have the :attr:`~Permissions.manage_channels` permission to - use this. - - .. versionchanged:: 1.3 - The ``overwrites`` keyword-only parameter was added. - - .. versionchanged:: 2.0 - Edits are no longer in-place, the newly edited channel is returned instead. - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` or - :exc:`ValueError` instead of ``InvalidArgument``. - - Parameters - ---------- - name: :class:`str` - The new category's name. - position: :class:`int` - The new category's position. - nsfw: :class:`bool` - To mark the category as NSFW or not. - reason: Optional[:class:`str`] - The reason for editing this category. Shows up on the audit log. - overwrites: :class:`Mapping` - A :class:`Mapping` of target (either a role or a member) to - :class:`PermissionOverwrite` to apply to the channel. - - Raises - ------ - ValueError - If position is less than 0 or greater than the number of categories. - TypeError - The overwrite information is not in proper form. - Forbidden - You do not have permissions to edit the category. - HTTPException - Editing the category failed. - - Returns - -------- - Optional[:class:`.CategoryChannel`] - The newly edited category channel. If the edit was only positional - then ``None`` is returned instead. - """ - - payload = await self._edit(options, reason=reason) - if payload is not None: - # the payload will always be the proper channel payload - return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore - - @utils.copy_doc(discord.abc.GuildChannel.move) - async def move(self, **kwargs: Any) -> None: - kwargs.pop('category', None) - await super().move(**kwargs) - - @property - def channels(self) -> List[GuildChannelType]: - """List[:class:`abc.GuildChannel`]: Returns the channels that are under this category. - - These are sorted by the official Discord UI, which places voice channels below the text channels. - """ - - def comparator(channel): - return (not isinstance(channel, TextChannel), channel.position) - - ret = [c for c in self.guild.channels if c.category_id == self.id] - ret.sort(key=comparator) - return ret - - @property - def text_channels(self) -> List[TextChannel]: - """List[:class:`TextChannel`]: Returns the text channels that are under this category.""" - ret = [c for c in self.guild.channels if c.category_id == self.id and isinstance(c, TextChannel)] - ret.sort(key=lambda c: (c.position, c.id)) - return ret - - @property - def voice_channels(self) -> List[VoiceChannel]: - """List[:class:`VoiceChannel`]: Returns the voice channels that are under this category.""" - ret = [c for c in self.guild.channels if c.category_id == self.id and isinstance(c, VoiceChannel)] - ret.sort(key=lambda c: (c.position, c.id)) - return ret - - @property - def stage_channels(self) -> List[StageChannel]: - """List[:class:`StageChannel`]: Returns the stage channels that are under this category. - - .. versionadded:: 1.7 - """ - ret = [c for c in self.guild.channels if c.category_id == self.id and isinstance(c, StageChannel)] - ret.sort(key=lambda c: (c.position, c.id)) - return ret - - async def create_text_channel(self, name: str, **options: Any) -> TextChannel: - """|coro| - - A shortcut method to :meth:`Guild.create_text_channel` to create a :class:`TextChannel` in the category. - - Returns - ------- - :class:`TextChannel` - The channel that was just created. - """ - return await self.guild.create_text_channel(name, category=self, **options) - - async def create_voice_channel(self, name: str, **options: Any) -> VoiceChannel: - """|coro| - - A shortcut method to :meth:`Guild.create_voice_channel` to create a :class:`VoiceChannel` in the category. - - Returns - ------- - :class:`VoiceChannel` - The channel that was just created. - """ - return await self.guild.create_voice_channel(name, category=self, **options) - - async def create_stage_channel(self, name: str, **options: Any) -> StageChannel: - """|coro| - - A shortcut method to :meth:`Guild.create_stage_channel` to create a :class:`StageChannel` in the category. - - .. versionadded:: 1.7 - - Returns - ------- - :class:`StageChannel` - The channel that was just created. - """ - return await self.guild.create_stage_channel(name, category=self, **options) - - async def create_forum(self, name: str, **options: Any) -> ForumChannel: - """|coro| - - A shortcut method to :meth:`Guild.create_forum` to create a :class:`ForumChannel` in the category. - - .. versionadded:: 2.0 - - Returns - -------- - :class:`ForumChannel` - The channel that was just created. - """ - return await self.guild.create_forum(name, category=self, **options) - - -class ForumChannel(discord.abc.GuildChannel, Hashable): - """Represents a Discord guild forum channel. - - .. versionadded:: 2.0 - - .. container:: operations - - .. describe:: x == y - - Checks if two forums are equal. - - .. describe:: x != y - - Checks if two forums are not equal. - - .. describe:: hash(x) - - Returns the forum's hash. - - .. describe:: str(x) - - Returns the forum's name. - - Attributes - ----------- - name: :class:`str` - The forum name. - guild: :class:`Guild` - The guild the forum belongs to. - id: :class:`int` - The forum ID. - category_id: Optional[:class:`int`] - The category channel ID this forum belongs to, if applicable. - topic: Optional[:class:`str`] - The forum's topic. ``None`` if it doesn't exist. - position: :class:`int` - The position in the channel list. This is a number that starts at 0. e.g. the - top channel is position 0. - last_message_id: Optional[:class:`int`] - The last thread ID that was created on this forum. This technically also - coincides with the message ID that started the thread that was created. - It may *not* point to an existing or valid thread or message. - slowmode_delay: :class:`int` - The number of seconds a member must wait between creating threads - in this forum. A value of `0` denotes that it is disabled. - Bots and users with :attr:`~Permissions.manage_channels` or - :attr:`~Permissions.manage_messages` bypass slowmode. - nsfw: :class:`bool` - If the forum is marked as "not safe for work" or "age restricted". - default_auto_archive_duration: :class:`int` - The default auto archive duration in minutes for threads created in this forum. - """ - - __slots__ = ( - 'name', - 'id', - 'guild', - 'topic', - '_state', - '_flags', - 'nsfw', - 'category_id', - 'position', - 'slowmode_delay', - '_overwrites', - 'last_message_id', - 'default_auto_archive_duration', - ) - - def __init__(self, *, state: ConnectionState, guild: Guild, data: ForumChannelPayload): - self._state: ConnectionState = state - self.id: int = int(data['id']) - self._update(guild, data) - - def __repr__(self) -> str: - attrs = [ - ('id', self.id), - ('name', self.name), - ('position', self.position), - ('nsfw', self.nsfw), - ('category_id', self.category_id), - ] - joined = ' '.join('%s=%r' % t for t in attrs) - return f'<{self.__class__.__name__} {joined}>' - - def _update(self, guild: Guild, data: ForumChannelPayload) -> None: - self.guild: Guild = guild - self.name: str = data['name'] - self.category_id: Optional[int] = utils._get_as_snowflake(data, 'parent_id') - self.topic: Optional[str] = data.get('topic') - self.position: int = data['position'] - self.nsfw: bool = data.get('nsfw', False) - self.slowmode_delay: int = data.get('rate_limit_per_user', 0) - self.default_auto_archive_duration: ThreadArchiveDuration = data.get('default_auto_archive_duration', 1440) - self.last_message_id: Optional[int] = utils._get_as_snowflake(data, 'last_message_id') - self._fill_overwrites(data) - - @property - def type(self) -> Literal[ChannelType.forum]: - """:class:`ChannelType`: The channel's Discord type.""" - return ChannelType.forum - - @property - def _sorting_bucket(self) -> int: - return ChannelType.text.value - - @property - def _scheduled_event_entity_type(self) -> Optional[EntityType]: - return None - - @utils.copy_doc(discord.abc.GuildChannel.permissions_for) - def permissions_for(self, obj: Union[Member, Role], /) -> Permissions: - base = super().permissions_for(obj) - - # text channels do not have voice related permissions - denied = Permissions.voice() - base.value &= ~denied.value - return base - - @property - def threads(self) -> List[Thread]: - """List[:class:`Thread`]: Returns all the threads that you can see.""" - return [thread for thread in self.guild._threads.values() if thread.parent_id == self.id] - - def is_nsfw(self) -> bool: - """:class:`bool`: Checks if the forum is NSFW.""" - return self.nsfw - - @utils.copy_doc(discord.abc.GuildChannel.clone) - async def clone(self, *, name: Optional[str] = None, reason: Optional[str] = None) -> ForumChannel: - return await self._clone_impl( - {'topic': self.topic, 'nsfw': self.nsfw, 'rate_limit_per_user': self.slowmode_delay}, name=name, reason=reason - ) - - @overload - async def edit(self) -> None: - ... - - @overload - async def edit(self, *, position: int, reason: Optional[str] = ...) -> None: - ... - - @overload - async def edit( - self, - *, - reason: Optional[str] = ..., - name: str = ..., - topic: str = ..., - position: int = ..., - nsfw: bool = ..., - sync_permissions: bool = ..., - category: Optional[CategoryChannel] = ..., - slowmode_delay: int = ..., - default_auto_archive_duration: ThreadArchiveDuration = ..., - type: ChannelType = ..., - overwrites: Mapping[OverwriteKeyT, PermissionOverwrite] = ..., - ) -> ForumChannel: - ... - - async def edit(self, *, reason: Optional[str] = None, **options: Any) -> Optional[ForumChannel]: - """|coro| - - Edits the forum. - - You must have the :attr:`~Permissions.manage_channels` permission to - use this. - - Parameters - ---------- - name: :class:`str` - The new forum name. - topic: :class:`str` - The new forum's topic. - position: :class:`int` - The new forum's position. - nsfw: :class:`bool` - To mark the forum as NSFW or not. - sync_permissions: :class:`bool` - Whether to sync permissions with the forum's new or pre-existing - category. Defaults to ``False``. - category: Optional[:class:`CategoryChannel`] - The new category for this forum. Can be ``None`` to remove the - category. - slowmode_delay: :class:`int` - Specifies the slowmode rate limit for user in this forum, in seconds. - A value of `0` disables slowmode. The maximum value possible is `21600`. - type: :class:`ChannelType` - Change the type of this text forum. Currently, only conversion between - :attr:`ChannelType.text` and :attr:`ChannelType.news` is supported. This - is only available to guilds that contain ``NEWS`` in :attr:`Guild.features`. - reason: Optional[:class:`str`] - The reason for editing this forum. Shows up on the audit log. - overwrites: :class:`Mapping` - A :class:`Mapping` of target (either a role or a member) to - :class:`PermissionOverwrite` to apply to the forum. - default_auto_archive_duration: :class:`int` - The new default auto archive duration in minutes for threads created in this channel. - Must be one of ``60``, ``1440``, ``4320``, or ``10080``. - - Raises - ------ - ValueError - The new ``position`` is less than 0 or greater than the number of channels. - TypeError - The permission overwrite information is not in proper form. - Forbidden - You do not have permissions to edit the forum. - HTTPException - Editing the forum failed. - - Returns - -------- - Optional[:class:`.ForumChannel`] - The newly edited forum channel. If the edit was only positional - then ``None`` is returned instead. - """ - - payload = await self._edit(options, reason=reason) - if payload is not None: - # the payload will always be the proper channel payload - return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore - - async def create_thread( - self, - *, - name: str, - auto_archive_duration: ThreadArchiveDuration = MISSING, - slowmode_delay: Optional[int] = None, - content: Optional[str] = None, - tts: bool = False, - embed: Embed = MISSING, - embeds: Sequence[Embed] = MISSING, - file: File = MISSING, - files: Sequence[File] = MISSING, - stickers: Sequence[Union[GuildSticker, StickerItem]] = MISSING, - allowed_mentions: AllowedMentions = MISSING, - mention_author: bool = MISSING, - view: View = MISSING, - suppress_embeds: bool = False, - reason: Optional[str] = None, - ) -> ThreadWithMessage: - """|coro| - - Creates a thread in this forum. - - This thread is a public thread with the initial message given. Currently in order - to start a thread in this forum, the user needs :attr:`~discord.Permissions.send_messages`. - - Parameters - ----------- - name: :class:`str` - The name of the thread. - auto_archive_duration: :class:`int` - The duration in minutes before a thread is automatically archived for inactivity. - If not provided, the channel's default auto archive duration is used. - slowmode_delay: Optional[:class:`int`] - Specifies the slowmode rate limit for user in this channel, in seconds. - The maximum value possible is `21600`. By default no slowmode rate limit - if this is ``None``. - content: Optional[:class:`str`] - The content of the message to send with the thread. - tts: :class:`bool` - Indicates if the message should be sent using text-to-speech. - embed: :class:`~discord.Embed` - The rich embed for the content. - embeds: List[:class:`~discord.Embed`] - A list of embeds to upload. Must be a maximum of 10. - file: :class:`~discord.File` - The file to upload. - files: List[:class:`~discord.File`] - A list of files to upload. Must be a maximum of 10. - allowed_mentions: :class:`~discord.AllowedMentions` - Controls the mentions being processed in this message. If this is - passed, then the object is merged with :attr:`~discord.Client.allowed_mentions`. - The merging behaviour only overrides attributes that have been explicitly passed - to the object, otherwise it uses the attributes set in :attr:`~discord.Client.allowed_mentions`. - If no object is passed at all then the defaults given by :attr:`~discord.Client.allowed_mentions` - are used instead. - mention_author: :class:`bool` - If set, overrides the :attr:`~discord.AllowedMentions.replied_user` attribute of ``allowed_mentions``. - view: :class:`discord.ui.View` - A Discord UI View to add to the message. - stickers: Sequence[Union[:class:`~discord.GuildSticker`, :class:`~discord.StickerItem`]] - A list of stickers to upload. Must be a maximum of 3. - suppress_embeds: :class:`bool` - Whether to suppress embeds for the message. This sends the message without any embeds if set to ``True``. - reason: :class:`str` - The reason for creating a new thread. Shows up on the audit log. - - Raises - ------- - Forbidden - You do not have permissions to create a thread. - HTTPException - Starting the thread failed. - ValueError - The ``files`` or ``embeds`` list is not of the appropriate size. - TypeError - You specified both ``file`` and ``files``, - or you specified both ``embed`` and ``embeds``. - - Returns - -------- - Tuple[:class:`Thread`, :class:`Message`] - The created thread with the created message. - This is also accessible as a namedtuple with ``thread`` and ``message`` fields. - """ - - state = self._state - previous_allowed_mention = state.allowed_mentions - if stickers is MISSING: - sticker_ids = MISSING - else: - sticker_ids: SnowflakeList = [s.id for s in stickers] - - if view and not hasattr(view, '__discord_ui_view__'): - raise TypeError(f'view parameter must be View not {view.__class__!r}') - - if suppress_embeds: - from .message import MessageFlags # circular import - - flags = MessageFlags._from_value(4) - else: - flags = MISSING - - content = str(content) if content else MISSING - - channel_payload = { - 'name': name, - 'auto_archive_duration': auto_archive_duration or self.default_auto_archive_duration, - 'rate_limit_per_user': slowmode_delay, - 'type': 11, # Private threads don't seem to be allowed - } - - with handle_message_parameters( - content=content, - tts=tts, - file=file, - files=files, - embed=embed, - embeds=embeds, - allowed_mentions=allowed_mentions, - previous_allowed_mentions=previous_allowed_mention, - mention_author=None if mention_author is MISSING else mention_author, - stickers=sticker_ids, - view=view, - flags=flags, - channel_payload=channel_payload, - ) as params: - # Circular import - from .message import Message - - data = await state.http.start_thread_in_forum(self.id, params=params, reason=reason) - thread = Thread(guild=self.guild, state=self._state, data=data) - message = Message(state=self._state, channel=thread, data=data['message']) - if view: - self._state.store_view(view, message.id) - - return ThreadWithMessage(thread=thread, message=message) - - async def webhooks(self) -> List[Webhook]: - """|coro| - - Gets the list of webhooks from this channel. - - Requires :attr:`~.Permissions.manage_webhooks` permissions. - - Raises - ------- - Forbidden - You don't have permissions to get the webhooks. - - Returns - -------- - List[:class:`Webhook`] - The webhooks for this channel. - """ - - from .webhook import Webhook - - data = await self._state.http.channel_webhooks(self.id) - return [Webhook.from_state(d, state=self._state) for d in data] - - async def create_webhook(self, *, name: str, avatar: Optional[bytes] = None, reason: Optional[str] = None) -> Webhook: - """|coro| - - Creates a webhook for this channel. - - Requires :attr:`~.Permissions.manage_webhooks` permissions. - - Parameters - ------------- - name: :class:`str` - The webhook's name. - avatar: Optional[:class:`bytes`] - A :term:`py:bytes-like object` representing the webhook's default avatar. - This operates similarly to :meth:`~ClientUser.edit`. - reason: Optional[:class:`str`] - The reason for creating this webhook. Shows up in the audit logs. - - Raises - ------- - HTTPException - Creating the webhook failed. - Forbidden - You do not have permissions to create a webhook. - - Returns - -------- - :class:`Webhook` - The created webhook. - """ - - from .webhook import Webhook - - if avatar is not None: - avatar = utils._bytes_to_base64_data(avatar) # type: ignore # Silence reassignment error - - data = await self._state.http.create_webhook(self.id, name=str(name), avatar=avatar, reason=reason) - return Webhook.from_state(data, state=self._state) - - -class DMChannel(discord.abc.Messageable, discord.abc.PrivateChannel, Hashable): - """Represents a Discord direct message channel. - - .. container:: operations - - .. describe:: x == y - - Checks if two channels are equal. - - .. describe:: x != y - - Checks if two channels are not equal. - - .. describe:: hash(x) - - Returns the channel's hash. - - .. describe:: str(x) - - Returns a string representation of the channel - - Attributes - ---------- - recipient: Optional[:class:`User`] - The user you are participating with in the direct message channel. - If this channel is received through the gateway, the recipient information - may not be always available. - me: :class:`ClientUser` - The user presenting yourself. - id: :class:`int` - The direct message channel ID. - """ - - __slots__ = ('id', 'recipient', 'me', '_state') - - def __init__(self, *, me: ClientUser, state: ConnectionState, data: DMChannelPayload): - self._state: ConnectionState = state - self.recipient: Optional[User] = state.store_user(data['recipients'][0]) - self.me: ClientUser = me - self.id: int = int(data['id']) - - async def _get_channel(self) -> Self: - return self - - def __str__(self) -> str: - if self.recipient: - return f'Direct Message with {self.recipient}' - return 'Direct Message with Unknown User' - - def __repr__(self) -> str: - return f'' - - @classmethod - def _from_message(cls, state: ConnectionState, channel_id: int) -> Self: - self = cls.__new__(cls) - self._state = state - self.id = channel_id - self.recipient = None - # state.user won't be None here - self.me = state.user # type: ignore - return self - - @property - def type(self) -> Literal[ChannelType.private]: - """:class:`ChannelType`: The channel's Discord type.""" - return ChannelType.private - - @property - def guild(self) -> Optional[Guild]: - """Optional[:class:`Guild`]: The guild this DM channel belongs to. Always ``None``. - - This is mainly provided for compatibility purposes in duck typing. - - .. versionadded:: 2.0 - """ - return None - - @property - def jump_url(self) -> str: - """:class:`str`: Returns a URL that allows the client to jump to the channel. - - .. versionadded:: 2.0 - """ - return f'https://discord.com/channels/@me/{self.id}' - - @property - def created_at(self) -> datetime.datetime: - """:class:`datetime.datetime`: Returns the direct message channel's creation time in UTC.""" - return utils.snowflake_time(self.id) - - def permissions_for(self, obj: Any = None, /) -> Permissions: - """Handles permission resolution for a :class:`User`. - - This function is there for compatibility with other channel types. - - Actual direct messages do not really have the concept of permissions. - - This returns all the Text related permissions set to ``True`` except: - - - :attr:`~Permissions.send_tts_messages`: You cannot send TTS messages in a DM. - - :attr:`~Permissions.manage_messages`: You cannot delete others messages in a DM. - - .. versionchanged:: 2.0 - - ``obj`` parameter is now positional-only. - - Parameters - ----------- - obj: :class:`User` - The user to check permissions for. This parameter is ignored - but kept for compatibility with other ``permissions_for`` methods. - - Returns - -------- - :class:`Permissions` - The resolved permissions. - """ - return Permissions._dm_permissions() - - def get_partial_message(self, message_id: int, /) -> PartialMessage: - """Creates a :class:`PartialMessage` from the message ID. - - This is useful if you want to work with a message and only have its ID without - doing an unnecessary API call. - - .. versionadded:: 1.6 - - .. versionchanged:: 2.0 - - ``message_id`` parameter is now positional-only. - - Parameters - ------------ - message_id: :class:`int` - The message ID to create a partial message for. - - Returns - --------- - :class:`PartialMessage` - The partial message. - """ - - from .message import PartialMessage - - return PartialMessage(channel=self, id=message_id) - - -class GroupChannel(discord.abc.Messageable, discord.abc.PrivateChannel, Hashable): - """Represents a Discord group channel. - - .. container:: operations - - .. describe:: x == y - - Checks if two channels are equal. - - .. describe:: x != y - - Checks if two channels are not equal. - - .. describe:: hash(x) - - Returns the channel's hash. - - .. describe:: str(x) - - Returns a string representation of the channel - - Attributes - ---------- - recipients: List[:class:`User`] - The users you are participating with in the group channel. - me: :class:`ClientUser` - The user presenting yourself. - id: :class:`int` - The group channel ID. - owner: Optional[:class:`User`] - The user that owns the group channel. - owner_id: :class:`int` - The owner ID that owns the group channel. - - .. versionadded:: 2.0 - name: Optional[:class:`str`] - The group channel's name if provided. - """ - - __slots__ = ('id', 'recipients', 'owner_id', 'owner', '_icon', 'name', 'me', '_state') - - def __init__(self, *, me: ClientUser, state: ConnectionState, data: GroupChannelPayload): - self._state: ConnectionState = state - self.id: int = int(data['id']) - self.me: ClientUser = me - self._update_group(data) - - def _update_group(self, data: GroupChannelPayload) -> None: - self.owner_id: Optional[int] = utils._get_as_snowflake(data, 'owner_id') - self._icon: Optional[str] = data.get('icon') - self.name: Optional[str] = data.get('name') - self.recipients: List[User] = [self._state.store_user(u) for u in data.get('recipients', [])] - - self.owner: Optional[BaseUser] - if self.owner_id == self.me.id: - self.owner = self.me - else: - self.owner = utils.find(lambda u: u.id == self.owner_id, self.recipients) - - async def _get_channel(self) -> Self: - return self - - def __str__(self) -> str: - if self.name: - return self.name - - if len(self.recipients) == 0: - return 'Unnamed' - - return ', '.join(map(lambda x: x.name, self.recipients)) - - def __repr__(self) -> str: - return f'' - - @property - def type(self) -> Literal[ChannelType.group]: - """:class:`ChannelType`: The channel's Discord type.""" - return ChannelType.group - - @property - def guild(self) -> Optional[Guild]: - """Optional[:class:`Guild`]: The guild this group channel belongs to. Always ``None``. - - This is mainly provided for compatibility purposes in duck typing. - - .. versionadded:: 2.0 - """ - return None - - @property - def icon(self) -> Optional[Asset]: - """Optional[:class:`Asset`]: Returns the channel's icon asset if available.""" - if self._icon is None: - return None - return Asset._from_icon(self._state, self.id, self._icon, path='channel') - - @property - def created_at(self) -> datetime.datetime: - """:class:`datetime.datetime`: Returns the channel's creation time in UTC.""" - return utils.snowflake_time(self.id) - - @property - def jump_url(self) -> str: - """:class:`str`: Returns a URL that allows the client to jump to the channel. - - .. versionadded:: 2.0 - """ - return f'https://discord.com/channels/@me/{self.id}' - - def permissions_for(self, obj: Snowflake, /) -> Permissions: - """Handles permission resolution for a :class:`User`. - - This function is there for compatibility with other channel types. - - Actual direct messages do not really have the concept of permissions. - - This returns all the Text related permissions set to ``True`` except: - - - :attr:`~Permissions.send_tts_messages`: You cannot send TTS messages in a DM. - - :attr:`~Permissions.manage_messages`: You cannot delete others messages in a DM. - - This also checks the kick_members permission if the user is the owner. - - .. versionchanged:: 2.0 - - ``obj`` parameter is now positional-only. - - Parameters - ----------- - obj: :class:`~discord.abc.Snowflake` - The user to check permissions for. - - Returns - -------- - :class:`Permissions` - The resolved permissions for the user. - """ - - base = Permissions._dm_permissions() - base.mention_everyone = True - - if obj.id == self.owner_id: - base.kick_members = True - - return base - - async def leave(self) -> None: - """|coro| - - Leave the group. - - If you are the only one in the group, this deletes it as well. - - Raises - ------- - HTTPException - Leaving the group failed. - """ - - await self._state.http.leave_group(self.id) - - -class PartialMessageable(discord.abc.Messageable, Hashable): - """Represents a partial messageable to aid with working messageable channels when - only a channel ID is present. - - The only way to construct this class is through :meth:`Client.get_partial_messageable`. - - Note that this class is trimmed down and has no rich attributes. - - .. versionadded:: 2.0 - - .. container:: operations - - .. describe:: x == y - - Checks if two partial messageables are equal. - - .. describe:: x != y - - Checks if two partial messageables are not equal. - - .. describe:: hash(x) - - Returns the partial messageable's hash. - - Attributes - ----------- - id: :class:`int` - The channel ID associated with this partial messageable. - guild_id: Optional[:class:`int`] - The guild ID associated with this partial messageable. - type: Optional[:class:`ChannelType`] - The channel type associated with this partial messageable, if given. - """ - - def __init__(self, state: ConnectionState, id: int, guild_id: Optional[int] = None, type: Optional[ChannelType] = None): - self._state: ConnectionState = state - self.id: int = id - self.guild_id: Optional[int] = guild_id - self.type: Optional[ChannelType] = type - - def __repr__(self) -> str: - return f'<{self.__class__.__name__} id={self.id} type={self.type!r}>' - - async def _get_channel(self) -> PartialMessageable: - return self - - @property - def guild(self) -> Optional[Guild]: - """Optional[:class:`Guild`]: The guild this partial messageable is in.""" - return self._state._get_guild(self.guild_id) - - @property - def jump_url(self) -> str: - """:class:`str`: Returns a URL that allows the client to jump to the channel.""" - if self.guild_id is None: - return f'https://discord.com/channels/@me/{self.id}' - return f'https://discord.com/channels/{self.guild_id}/{self.id}' - - @property - def created_at(self) -> datetime.datetime: - """:class:`datetime.datetime`: Returns the channel's creation time in UTC.""" - return utils.snowflake_time(self.id) - - def permissions_for(self, obj: Any = None, /) -> Permissions: - """Handles permission resolution for a :class:`User`. - - This function is there for compatibility with other channel types. - - Since partial messageables cannot reasonably have the concept of - permissions, this will always return :meth:`Permissions.none`. - - Parameters - ----------- - obj: :class:`User` - The user to check permissions for. This parameter is ignored - but kept for compatibility with other ``permissions_for`` methods. - - Returns - -------- - :class:`Permissions` - The resolved permissions. - """ - - return Permissions.none() - - def get_partial_message(self, message_id: int, /) -> PartialMessage: - """Creates a :class:`PartialMessage` from the message ID. - - This is useful if you want to work with a message and only have its ID without - doing an unnecessary API call. - - Parameters - ------------ - message_id: :class:`int` - The message ID to create a partial message for. - - Returns - --------- - :class:`PartialMessage` - The partial message. - """ - - from .message import PartialMessage - - return PartialMessage(channel=self, id=message_id) - - -def _guild_channel_factory(channel_type: int): - value = try_enum(ChannelType, channel_type) - if value is ChannelType.text: - return TextChannel, value - elif value is ChannelType.voice: - return VoiceChannel, value - elif value is ChannelType.category: - return CategoryChannel, value - elif value is ChannelType.news: - return TextChannel, value - elif value is ChannelType.stage_voice: - return StageChannel, value - elif value is ChannelType.forum: - return ForumChannel, value - else: - return None, value - - -def _channel_factory(channel_type: int): - cls, value = _guild_channel_factory(channel_type) - if value is ChannelType.private: - return DMChannel, value - elif value is ChannelType.group: - return GroupChannel, value - else: - return cls, value - - -def _threaded_channel_factory(channel_type: int): - cls, value = _channel_factory(channel_type) - if value in (ChannelType.private_thread, ChannelType.public_thread, ChannelType.news_thread): - return Thread, value - return cls, value - - -def _threaded_guild_channel_factory(channel_type: int): - cls, value = _guild_channel_factory(channel_type) - if value in (ChannelType.private_thread, ChannelType.public_thread, ChannelType.news_thread): - return Thread, value - return cls, value diff --git a/.venv/Lib/site-packages/discord/client.py b/.venv/Lib/site-packages/discord/client.py deleted file mode 100644 index 6415d35..0000000 --- a/.venv/Lib/site-packages/discord/client.py +++ /dev/null @@ -1,1980 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -import asyncio -import datetime -import logging -from typing import ( - Any, - AsyncIterator, - Callable, - Coroutine, - Dict, - Generator, - List, - Optional, - Sequence, - TYPE_CHECKING, - Tuple, - Type, - TypeVar, - Union, -) - -import aiohttp - -from .user import User, ClientUser -from .invite import Invite -from .template import Template -from .widget import Widget -from .guild import Guild -from .emoji import Emoji -from .channel import _threaded_channel_factory, PartialMessageable -from .enums import ChannelType -from .mentions import AllowedMentions -from .errors import * -from .enums import Status -from .flags import ApplicationFlags, Intents -from .gateway import * -from .activity import ActivityTypes, BaseActivity, create_activity -from .voice_client import VoiceClient -from .http import HTTPClient -from .state import ConnectionState -from . import utils -from .utils import MISSING, time_snowflake -from .object import Object -from .backoff import ExponentialBackoff -from .webhook import Webhook -from .appinfo import AppInfo -from .ui.view import View -from .stage_instance import StageInstance -from .threads import Thread -from .sticker import GuildSticker, StandardSticker, StickerPack, _sticker_factory - -if TYPE_CHECKING: - from typing_extensions import Self - from types import TracebackType - from .types.guild import Guild as GuildPayload - from .abc import SnowflakeTime, Snowflake, PrivateChannel - from .guild import GuildChannel - from .channel import DMChannel - from .message import Message - from .member import Member - from .voice_client import VoiceProtocol - -# fmt: off -__all__ = ( - 'Client', -) -# fmt: on - -Coro = TypeVar('Coro', bound=Callable[..., Coroutine[Any, Any, Any]]) - -_log = logging.getLogger(__name__) - - -class _LoopSentinel: - __slots__ = () - - def __getattr__(self, attr: str) -> None: - msg = ( - 'loop attribute cannot be accessed in non-async contexts. ' - 'Consider using either an asynchronous main function and passing it to asyncio.run or ' - 'using asynchronous initialisation hooks such as Client.setup_hook' - ) - raise AttributeError(msg) - - -_loop: Any = _LoopSentinel() - - -class Client: - r"""Represents a client connection that connects to Discord. - This class is used to interact with the Discord WebSocket and API. - - .. container:: operations - - .. describe:: async with x - - Asynchronously initialises the client and automatically cleans up. - - .. versionadded:: 2.0 - - A number of options can be passed to the :class:`Client`. - - Parameters - ----------- - max_messages: Optional[:class:`int`] - The maximum number of messages to store in the internal message cache. - This defaults to ``1000``. Passing in ``None`` disables the message cache. - - .. versionchanged:: 1.3 - Allow disabling the message cache and change the default size to ``1000``. - proxy: Optional[:class:`str`] - Proxy URL. - proxy_auth: Optional[:class:`aiohttp.BasicAuth`] - An object that represents proxy HTTP Basic Authorization. - shard_id: Optional[:class:`int`] - Integer starting at ``0`` and less than :attr:`.shard_count`. - shard_count: Optional[:class:`int`] - The total number of shards. - application_id: :class:`int` - The client's application ID. - intents: :class:`Intents` - The intents that you want to enable for the session. This is a way of - disabling and enabling certain gateway events from triggering and being sent. - - .. versionadded:: 1.5 - - .. versionchanged:: 2.0 - Parameter is now required. - member_cache_flags: :class:`MemberCacheFlags` - Allows for finer control over how the library caches members. - If not given, defaults to cache as much as possible with the - currently selected intents. - - .. versionadded:: 1.5 - chunk_guilds_at_startup: :class:`bool` - Indicates if :func:`.on_ready` should be delayed to chunk all guilds - at start-up if necessary. This operation is incredibly slow for large - amounts of guilds. The default is ``True`` if :attr:`Intents.members` - is ``True``. - - .. versionadded:: 1.5 - status: Optional[:class:`.Status`] - A status to start your presence with upon logging on to Discord. - activity: Optional[:class:`.BaseActivity`] - An activity to start your presence with upon logging on to Discord. - allowed_mentions: Optional[:class:`AllowedMentions`] - Control how the client handles mentions by default on every message sent. - - .. versionadded:: 1.4 - heartbeat_timeout: :class:`float` - The maximum numbers of seconds before timing out and restarting the - WebSocket in the case of not receiving a HEARTBEAT_ACK. Useful if - processing the initial packets take too long to the point of disconnecting - you. The default timeout is 60 seconds. - guild_ready_timeout: :class:`float` - The maximum number of seconds to wait for the GUILD_CREATE stream to end before - preparing the member cache and firing READY. The default timeout is 2 seconds. - - .. versionadded:: 1.4 - assume_unsync_clock: :class:`bool` - Whether to assume the system clock is unsynced. This applies to the ratelimit handling - code. If this is set to ``True``, the default, then the library uses the time to reset - a rate limit bucket given by Discord. If this is ``False`` then your system clock is - used to calculate how long to sleep for. If this is set to ``False`` it is recommended to - sync your system clock to Google's NTP server. - - .. versionadded:: 1.3 - enable_debug_events: :class:`bool` - Whether to enable events that are useful only for debugging gateway related information. - - Right now this involves :func:`on_socket_raw_receive` and :func:`on_socket_raw_send`. If - this is ``False`` then those events will not be dispatched (due to performance considerations). - To enable these events, this must be set to ``True``. Defaults to ``False``. - - .. versionadded:: 2.0 - http_trace: :class:`aiohttp.TraceConfig` - The trace configuration to use for tracking HTTP requests the library does using ``aiohttp``. - This allows you to check requests the library is using. For more information, check the - `aiohttp documentation `_. - - .. versionadded:: 2.0 - max_ratelimit_timeout: Optional[:class:`float`] - The maximum number of seconds to wait when a non-global rate limit is encountered. - If a request requires sleeping for more than the seconds passed in, then - :exc:`~discord.RateLimited` will be raised. By default, there is no timeout limit. - In order to prevent misuse and unnecessary bans, the minimum value this can be - set to is ``30.0`` seconds. - - .. versionadded:: 2.0 - - Attributes - ----------- - ws - The websocket gateway the client is currently connected to. Could be ``None``. - """ - - def __init__(self, *, intents: Intents, **options: Any) -> None: - self.loop: asyncio.AbstractEventLoop = _loop - # self.ws is set in the connect method - self.ws: DiscordWebSocket = None # type: ignore - self._listeners: Dict[str, List[Tuple[asyncio.Future, Callable[..., bool]]]] = {} - self.shard_id: Optional[int] = options.get('shard_id') - self.shard_count: Optional[int] = options.get('shard_count') - - proxy: Optional[str] = options.pop('proxy', None) - proxy_auth: Optional[aiohttp.BasicAuth] = options.pop('proxy_auth', None) - unsync_clock: bool = options.pop('assume_unsync_clock', True) - http_trace: Optional[aiohttp.TraceConfig] = options.pop('http_trace', None) - max_ratelimit_timeout: Optional[float] = options.pop('max_ratelimit_timeout', None) - self.http: HTTPClient = HTTPClient( - self.loop, - proxy=proxy, - proxy_auth=proxy_auth, - unsync_clock=unsync_clock, - http_trace=http_trace, - max_ratelimit_timeout=max_ratelimit_timeout, - ) - - self._handlers: Dict[str, Callable[..., None]] = { - 'ready': self._handle_ready, - } - - self._hooks: Dict[str, Callable[..., Coroutine[Any, Any, Any]]] = { - 'before_identify': self._call_before_identify_hook, - } - - self._enable_debug_events: bool = options.pop('enable_debug_events', False) - self._connection: ConnectionState = self._get_state(intents=intents, **options) - self._connection.shard_count = self.shard_count - self._closed: bool = False - self._ready: asyncio.Event = MISSING - self._application: Optional[AppInfo] = None - self._connection._get_websocket = self._get_websocket - self._connection._get_client = lambda: self - - if VoiceClient.warn_nacl: - VoiceClient.warn_nacl = False - _log.warning("PyNaCl is not installed, voice will NOT be supported") - - async def __aenter__(self) -> Self: - await self._async_setup_hook() - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc_value: Optional[BaseException], - traceback: Optional[TracebackType], - ) -> None: - if not self.is_closed(): - await self.close() - - # internals - - def _get_websocket(self, guild_id: Optional[int] = None, *, shard_id: Optional[int] = None) -> DiscordWebSocket: - return self.ws - - def _get_state(self, **options: Any) -> ConnectionState: - return ConnectionState(dispatch=self.dispatch, handlers=self._handlers, hooks=self._hooks, http=self.http, **options) - - def _handle_ready(self) -> None: - self._ready.set() - - @property - def latency(self) -> float: - """:class:`float`: Measures latency between a HEARTBEAT and a HEARTBEAT_ACK in seconds. - - This could be referred to as the Discord WebSocket protocol latency. - """ - ws = self.ws - return float('nan') if not ws else ws.latency - - def is_ws_ratelimited(self) -> bool: - """:class:`bool`: Whether the websocket is currently rate limited. - - This can be useful to know when deciding whether you should query members - using HTTP or via the gateway. - - .. versionadded:: 1.6 - """ - if self.ws: - return self.ws.is_ratelimited() - return False - - @property - def user(self) -> Optional[ClientUser]: - """Optional[:class:`.ClientUser`]: Represents the connected client. ``None`` if not logged in.""" - return self._connection.user - - @property - def guilds(self) -> Sequence[Guild]: - """Sequence[:class:`.Guild`]: The guilds that the connected client is a member of.""" - return self._connection.guilds - - @property - def emojis(self) -> Sequence[Emoji]: - """Sequence[:class:`.Emoji`]: The emojis that the connected client has.""" - return self._connection.emojis - - @property - def stickers(self) -> Sequence[GuildSticker]: - """Sequence[:class:`.GuildSticker`]: The stickers that the connected client has. - - .. versionadded:: 2.0 - """ - return self._connection.stickers - - @property - def cached_messages(self) -> Sequence[Message]: - """Sequence[:class:`.Message`]: Read-only list of messages the connected client has cached. - - .. versionadded:: 1.1 - """ - return utils.SequenceProxy(self._connection._messages or []) - - @property - def private_channels(self) -> Sequence[PrivateChannel]: - """Sequence[:class:`.abc.PrivateChannel`]: The private channels that the connected client is participating on. - - .. note:: - - This returns only up to 128 most recent private channels due to an internal working - on how Discord deals with private channels. - """ - return self._connection.private_channels - - @property - def voice_clients(self) -> List[VoiceProtocol]: - """List[:class:`.VoiceProtocol`]: Represents a list of voice connections. - - These are usually :class:`.VoiceClient` instances. - """ - return self._connection.voice_clients - - @property - def application_id(self) -> Optional[int]: - """Optional[:class:`int`]: The client's application ID. - - If this is not passed via ``__init__`` then this is retrieved - through the gateway when an event contains the data or after a call - to :meth:`~discord.Client.login`. Usually after :func:`~discord.on_connect` - is called. - - .. versionadded:: 2.0 - """ - return self._connection.application_id - - @property - def application_flags(self) -> ApplicationFlags: - """:class:`~discord.ApplicationFlags`: The client's application flags. - - .. versionadded:: 2.0 - """ - return self._connection.application_flags - - @property - def application(self) -> Optional[AppInfo]: - """Optional[:class:`~discord.AppInfo`]: The client's application info. - - This is retrieved on :meth:`~discord.Client.login` and is not updated - afterwards. This allows populating the application_id without requiring a - gateway connection. - - This is ``None`` if accessed before :meth:`~discord.Client.login` is called. - - .. seealso:: The :meth:`~discord.Client.application_info` API call - - .. versionadded:: 2.0 - """ - return self._application - - def is_ready(self) -> bool: - """:class:`bool`: Specifies if the client's internal cache is ready for use.""" - return self._ready is not MISSING and self._ready.is_set() - - async def _run_event( - self, - coro: Callable[..., Coroutine[Any, Any, Any]], - event_name: str, - *args: Any, - **kwargs: Any, - ) -> None: - try: - await coro(*args, **kwargs) - except asyncio.CancelledError: - pass - except Exception: - try: - await self.on_error(event_name, *args, **kwargs) - except asyncio.CancelledError: - pass - - def _schedule_event( - self, - coro: Callable[..., Coroutine[Any, Any, Any]], - event_name: str, - *args: Any, - **kwargs: Any, - ) -> asyncio.Task: - wrapped = self._run_event(coro, event_name, *args, **kwargs) - # Schedules the task - return self.loop.create_task(wrapped, name=f'discord.py: {event_name}') - - def dispatch(self, event: str, /, *args: Any, **kwargs: Any) -> None: - _log.debug('Dispatching event %s', event) - method = 'on_' + event - - listeners = self._listeners.get(event) - if listeners: - removed = [] - for i, (future, condition) in enumerate(listeners): - if future.cancelled(): - removed.append(i) - continue - - try: - result = condition(*args) - except Exception as exc: - future.set_exception(exc) - removed.append(i) - else: - if result: - if len(args) == 0: - future.set_result(None) - elif len(args) == 1: - future.set_result(args[0]) - else: - future.set_result(args) - removed.append(i) - - if len(removed) == len(listeners): - self._listeners.pop(event) - else: - for idx in reversed(removed): - del listeners[idx] - - try: - coro = getattr(self, method) - except AttributeError: - pass - else: - self._schedule_event(coro, method, *args, **kwargs) - - async def on_error(self, event_method: str, /, *args: Any, **kwargs: Any) -> None: - """|coro| - - The default error handler provided by the client. - - By default this logs to the library logger however it could be - overridden to have a different implementation. - Check :func:`~discord.on_error` for more details. - - .. versionchanged:: 2.0 - - ``event_method`` parameter is now positional-only - and instead of writing to ``sys.stderr`` it logs instead. - """ - _log.exception('Ignoring exception in %s', event_method) - - # hooks - - async def _call_before_identify_hook(self, shard_id: Optional[int], *, initial: bool = False) -> None: - # This hook is an internal hook that actually calls the public one. - # It allows the library to have its own hook without stepping on the - # toes of those who need to override their own hook. - await self.before_identify_hook(shard_id, initial=initial) - - async def before_identify_hook(self, shard_id: Optional[int], *, initial: bool = False) -> None: - """|coro| - - A hook that is called before IDENTIFYing a session. This is useful - if you wish to have more control over the synchronization of multiple - IDENTIFYing clients. - - The default implementation sleeps for 5 seconds. - - .. versionadded:: 1.4 - - Parameters - ------------ - shard_id: :class:`int` - The shard ID that requested being IDENTIFY'd - initial: :class:`bool` - Whether this IDENTIFY is the first initial IDENTIFY. - """ - - if not initial: - await asyncio.sleep(5.0) - - async def _async_setup_hook(self) -> None: - # Called whenever the client needs to initialise asyncio objects with a running loop - loop = asyncio.get_running_loop() - self.loop = loop - self.http.loop = loop - self._connection.loop = loop - - self._ready = asyncio.Event() - - async def setup_hook(self) -> None: - """|coro| - - A coroutine to be called to setup the bot, by default this is blank. - - To perform asynchronous setup after the bot is logged in but before - it has connected to the Websocket, overwrite this coroutine. - - This is only called once, in :meth:`login`, and will be called before - any events are dispatched, making it a better solution than doing such - setup in the :func:`~discord.on_ready` event. - - .. warning:: - - Since this is called *before* the websocket connection is made therefore - anything that waits for the websocket will deadlock, this includes things - like :meth:`wait_for` and :meth:`wait_until_ready`. - - .. versionadded:: 2.0 - """ - pass - - # login state management - - async def login(self, token: str) -> None: - """|coro| - - Logs in the client with the specified credentials and - calls the :meth:`setup_hook`. - - - Parameters - ----------- - token: :class:`str` - The authentication token. Do not prefix this token with - anything as the library will do it for you. - - Raises - ------ - LoginFailure - The wrong credentials are passed. - HTTPException - An unknown HTTP related error occurred, - usually when it isn't 200 or the known incorrect credentials - passing status code. - """ - - _log.info('logging in using static token') - - if self.loop is _loop: - await self._async_setup_hook() - - if not isinstance(token, str): - raise TypeError(f'expected token to be a str, received {token.__class__!r} instead') - token = token.strip() - - data = await self.http.static_login(token) - self._connection.user = ClientUser(state=self._connection, data=data) - self._application = await self.application_info() - if self._connection.application_id is None: - self._connection.application_id = self._application.id - - if not self._connection.application_flags: - self._connection.application_flags = self._application.flags - - await self.setup_hook() - - async def connect(self, *, reconnect: bool = True) -> None: - """|coro| - - Creates a websocket connection and lets the websocket listen - to messages from Discord. This is a loop that runs the entire - event system and miscellaneous aspects of the library. Control - is not resumed until the WebSocket connection is terminated. - - Parameters - ----------- - reconnect: :class:`bool` - If we should attempt reconnecting, either due to internet - failure or a specific failure on Discord's part. Certain - disconnects that lead to bad state will not be handled (such as - invalid sharding payloads or bad tokens). - - Raises - ------- - GatewayNotFound - If the gateway to connect to Discord is not found. Usually if this - is thrown then there is a Discord API outage. - ConnectionClosed - The websocket connection has been terminated. - """ - - backoff = ExponentialBackoff() - ws_params = { - 'initial': True, - 'shard_id': self.shard_id, - } - while not self.is_closed(): - try: - coro = DiscordWebSocket.from_client(self, **ws_params) - self.ws = await asyncio.wait_for(coro, timeout=60.0) - ws_params['initial'] = False - while True: - await self.ws.poll_event() - except ReconnectWebSocket as e: - _log.debug('Got a request to %s the websocket.', e.op) - self.dispatch('disconnect') - ws_params.update(sequence=self.ws.sequence, resume=e.resume, session=self.ws.session_id) - if e.resume: - ws_params['gateway'] = self.ws.gateway - continue - except ( - OSError, - HTTPException, - GatewayNotFound, - ConnectionClosed, - aiohttp.ClientError, - asyncio.TimeoutError, - ) as exc: - - self.dispatch('disconnect') - if not reconnect: - await self.close() - if isinstance(exc, ConnectionClosed) and exc.code == 1000: - # clean close, don't re-raise this - return - raise - - if self.is_closed(): - return - - # If we get connection reset by peer then try to RESUME - if isinstance(exc, OSError) and exc.errno in (54, 10054): - ws_params.update( - sequence=self.ws.sequence, - gateway=self.ws.gateway, - initial=False, - resume=True, - session=self.ws.session_id, - ) - continue - - # We should only get this when an unhandled close code happens, - # such as a clean disconnect (1000) or a bad state (bad token, no sharding, etc) - # sometimes, discord sends us 1000 for unknown reasons so we should reconnect - # regardless and rely on is_closed instead - if isinstance(exc, ConnectionClosed): - if exc.code == 4014: - raise PrivilegedIntentsRequired(exc.shard_id) from None - if exc.code != 1000: - await self.close() - raise - - retry = backoff.delay() - _log.exception("Attempting a reconnect in %.2fs", retry) - await asyncio.sleep(retry) - # Always try to RESUME the connection - # If the connection is not RESUME-able then the gateway will invalidate the session. - # This is apparently what the official Discord client does. - ws_params.update( - sequence=self.ws.sequence, - gateway=self.ws.gateway, - resume=True, - session=self.ws.session_id, - ) - - async def close(self) -> None: - """|coro| - - Closes the connection to Discord. - """ - if self._closed: - return - - self._closed = True - - await self._connection.close() - - if self.ws is not None and self.ws.open: - await self.ws.close(code=1000) - - await self.http.close() - - if self._ready is not MISSING: - self._ready.clear() - - self.loop = MISSING - - def clear(self) -> None: - """Clears the internal state of the bot. - - After this, the bot can be considered "re-opened", i.e. :meth:`is_closed` - and :meth:`is_ready` both return ``False`` along with the bot's internal - cache cleared. - """ - self._closed = False - self._ready.clear() - self._connection.clear() - self.http.clear() - - async def start(self, token: str, *, reconnect: bool = True) -> None: - """|coro| - - A shorthand coroutine for :meth:`login` + :meth:`connect`. - - Parameters - ----------- - token: :class:`str` - The authentication token. Do not prefix this token with - anything as the library will do it for you. - reconnect: :class:`bool` - If we should attempt reconnecting, either due to internet - failure or a specific failure on Discord's part. Certain - disconnects that lead to bad state will not be handled (such as - invalid sharding payloads or bad tokens). - - Raises - ------- - TypeError - An unexpected keyword argument was received. - """ - await self.login(token) - await self.connect(reconnect=reconnect) - - def run( - self, - token: str, - *, - reconnect: bool = True, - log_handler: Optional[logging.Handler] = MISSING, - log_formatter: logging.Formatter = MISSING, - log_level: int = MISSING, - root_logger: bool = False, - ) -> None: - """A blocking call that abstracts away the event loop - initialisation from you. - - If you want more control over the event loop then this - function should not be used. Use :meth:`start` coroutine - or :meth:`connect` + :meth:`login`. - - This function also sets up the logging library to make it easier - for beginners to know what is going on with the library. For more - advanced users, this can be disabled by passing ``None`` to - the ``log_handler`` parameter. - - .. warning:: - - This function must be the last function to call due to the fact that it - is blocking. That means that registration of events or anything being - called after this function call will not execute until it returns. - - Parameters - ----------- - token: :class:`str` - The authentication token. Do not prefix this token with - anything as the library will do it for you. - reconnect: :class:`bool` - If we should attempt reconnecting, either due to internet - failure or a specific failure on Discord's part. Certain - disconnects that lead to bad state will not be handled (such as - invalid sharding payloads or bad tokens). - log_handler: Optional[:class:`logging.Handler`] - The log handler to use for the library's logger. If this is ``None`` - then the library will not set up anything logging related. Logging - will still work if ``None`` is passed, though it is your responsibility - to set it up. - - The default log handler if not provided is :class:`logging.StreamHandler`. - - .. versionadded:: 2.0 - log_formatter: :class:`logging.Formatter` - The formatter to use with the given log handler. If not provided then it - defaults to a colour based logging formatter (if available). - - .. versionadded:: 2.0 - log_level: :class:`int` - The default log level for the library's logger. This is only applied if the - ``log_handler`` parameter is not ``None``. Defaults to ``logging.INFO``. - - .. versionadded:: 2.0 - root_logger: :class:`bool` - Whether to set up the root logger rather than the library logger. - By default, only the library logger (``'discord'``) is set up. If this - is set to ``True`` then the root logger is set up as well. - - Defaults to ``False``. - - .. versionadded:: 2.0 - """ - - async def runner(): - async with self: - await self.start(token, reconnect=reconnect) - - if log_handler is not None: - utils.setup_logging( - handler=log_handler, - formatter=log_formatter, - level=log_level, - root=root_logger, - ) - - try: - asyncio.run(runner()) - except KeyboardInterrupt: - # nothing to do here - # `asyncio.run` handles the loop cleanup - # and `self.start` closes all sockets and the HTTPClient instance. - return - - # properties - - def is_closed(self) -> bool: - """:class:`bool`: Indicates if the websocket connection is closed.""" - return self._closed - - @property - def activity(self) -> Optional[ActivityTypes]: - """Optional[:class:`.BaseActivity`]: The activity being used upon - logging in. - """ - return create_activity(self._connection._activity, self._connection) - - @activity.setter - def activity(self, value: Optional[ActivityTypes]) -> None: - if value is None: - self._connection._activity = None - elif isinstance(value, BaseActivity): - # ConnectionState._activity is typehinted as ActivityPayload, we're passing Dict[str, Any] - self._connection._activity = value.to_dict() # type: ignore - else: - raise TypeError('activity must derive from BaseActivity.') - - @property - def status(self) -> Status: - """:class:`.Status`: - The status being used upon logging on to Discord. - - .. versionadded: 2.0 - """ - if self._connection._status in set(state.value for state in Status): - return Status(self._connection._status) - return Status.online - - @status.setter - def status(self, value: Status) -> None: - if value is Status.offline: - self._connection._status = 'invisible' - elif isinstance(value, Status): - self._connection._status = str(value) - else: - raise TypeError('status must derive from Status.') - - @property - def allowed_mentions(self) -> Optional[AllowedMentions]: - """Optional[:class:`~discord.AllowedMentions`]: The allowed mention configuration. - - .. versionadded:: 1.4 - """ - return self._connection.allowed_mentions - - @allowed_mentions.setter - def allowed_mentions(self, value: Optional[AllowedMentions]) -> None: - if value is None or isinstance(value, AllowedMentions): - self._connection.allowed_mentions = value - else: - raise TypeError(f'allowed_mentions must be AllowedMentions not {value.__class__!r}') - - @property - def intents(self) -> Intents: - """:class:`~discord.Intents`: The intents configured for this connection. - - .. versionadded:: 1.5 - """ - return self._connection.intents - - # helpers/getters - - @property - def users(self) -> List[User]: - """List[:class:`~discord.User`]: Returns a list of all the users the bot can see.""" - return list(self._connection._users.values()) - - def get_channel(self, id: int, /) -> Optional[Union[GuildChannel, Thread, PrivateChannel]]: - """Returns a channel or thread with the given ID. - - .. versionchanged:: 2.0 - - ``id`` parameter is now positional-only. - - Parameters - ----------- - id: :class:`int` - The ID to search for. - - Returns - -------- - Optional[Union[:class:`.abc.GuildChannel`, :class:`.Thread`, :class:`.abc.PrivateChannel`]] - The returned channel or ``None`` if not found. - """ - return self._connection.get_channel(id) # type: ignore # The cache contains all channel types - - def get_partial_messageable( - self, id: int, *, guild_id: Optional[int] = None, type: Optional[ChannelType] = None - ) -> PartialMessageable: - """Returns a partial messageable with the given channel ID. - - This is useful if you have a channel_id but don't want to do an API call - to send messages to it. - - .. versionadded:: 2.0 - - Parameters - ----------- - id: :class:`int` - The channel ID to create a partial messageable for. - guild_id: Optional[:class:`int`] - The optional guild ID to create a partial messageable for. - - This is not required to actually send messages, but it does allow the - :meth:`~discord.PartialMessageable.jump_url` and - :attr:`~discord.PartialMessageable.guild` properties to function properly. - type: Optional[:class:`.ChannelType`] - The underlying channel type for the partial messageable. - - Returns - -------- - :class:`.PartialMessageable` - The partial messageable - """ - return PartialMessageable(state=self._connection, id=id, guild_id=guild_id, type=type) - - def get_stage_instance(self, id: int, /) -> Optional[StageInstance]: - """Returns a stage instance with the given stage channel ID. - - .. versionadded:: 2.0 - - Parameters - ----------- - id: :class:`int` - The ID to search for. - - Returns - -------- - Optional[:class:`.StageInstance`] - The stage instance or ``None`` if not found. - """ - from .channel import StageChannel - - channel = self._connection.get_channel(id) - - if isinstance(channel, StageChannel): - return channel.instance - - def get_guild(self, id: int, /) -> Optional[Guild]: - """Returns a guild with the given ID. - - .. versionchanged:: 2.0 - - ``id`` parameter is now positional-only. - - Parameters - ----------- - id: :class:`int` - The ID to search for. - - Returns - -------- - Optional[:class:`.Guild`] - The guild or ``None`` if not found. - """ - return self._connection._get_guild(id) - - def get_user(self, id: int, /) -> Optional[User]: - """Returns a user with the given ID. - - .. versionchanged:: 2.0 - - ``id`` parameter is now positional-only. - - Parameters - ----------- - id: :class:`int` - The ID to search for. - - Returns - -------- - Optional[:class:`~discord.User`] - The user or ``None`` if not found. - """ - return self._connection.get_user(id) - - def get_emoji(self, id: int, /) -> Optional[Emoji]: - """Returns an emoji with the given ID. - - .. versionchanged:: 2.0 - - ``id`` parameter is now positional-only. - - Parameters - ----------- - id: :class:`int` - The ID to search for. - - Returns - -------- - Optional[:class:`.Emoji`] - The custom emoji or ``None`` if not found. - """ - return self._connection.get_emoji(id) - - def get_sticker(self, id: int, /) -> Optional[GuildSticker]: - """Returns a guild sticker with the given ID. - - .. versionadded:: 2.0 - - .. note:: - - To retrieve standard stickers, use :meth:`.fetch_sticker`. - or :meth:`.fetch_premium_sticker_packs`. - - Returns - -------- - Optional[:class:`.GuildSticker`] - The sticker or ``None`` if not found. - """ - return self._connection.get_sticker(id) - - def get_all_channels(self) -> Generator[GuildChannel, None, None]: - """A generator that retrieves every :class:`.abc.GuildChannel` the client can 'access'. - - This is equivalent to: :: - - for guild in client.guilds: - for channel in guild.channels: - yield channel - - .. note:: - - Just because you receive a :class:`.abc.GuildChannel` does not mean that - you can communicate in said channel. :meth:`.abc.GuildChannel.permissions_for` should - be used for that. - - Yields - ------ - :class:`.abc.GuildChannel` - A channel the client can 'access'. - """ - - for guild in self.guilds: - yield from guild.channels - - def get_all_members(self) -> Generator[Member, None, None]: - """Returns a generator with every :class:`.Member` the client can see. - - This is equivalent to: :: - - for guild in client.guilds: - for member in guild.members: - yield member - - Yields - ------ - :class:`.Member` - A member the client can see. - """ - for guild in self.guilds: - yield from guild.members - - # listeners/waiters - - async def wait_until_ready(self) -> None: - """|coro| - - Waits until the client's internal cache is all ready. - - .. warning:: - - Calling this inside :meth:`setup_hook` can lead to a deadlock. - """ - if self._ready is not MISSING: - await self._ready.wait() - else: - raise RuntimeError( - 'Client has not been properly initialised. ' - 'Please use the login method or asynchronous context manager before calling this method' - ) - - def wait_for( - self, - event: str, - /, - *, - check: Optional[Callable[..., bool]] = None, - timeout: Optional[float] = None, - ) -> Any: - """|coro| - - Waits for a WebSocket event to be dispatched. - - This could be used to wait for a user to reply to a message, - or to react to a message, or to edit a message in a self-contained - way. - - The ``timeout`` parameter is passed onto :func:`asyncio.wait_for`. By default, - it does not timeout. Note that this does propagate the - :exc:`asyncio.TimeoutError` for you in case of timeout and is provided for - ease of use. - - In case the event returns multiple arguments, a :class:`tuple` containing those - arguments is returned instead. Please check the - :ref:`documentation ` for a list of events and their - parameters. - - This function returns the **first event that meets the requirements**. - - Examples - --------- - - Waiting for a user reply: :: - - @client.event - async def on_message(message): - if message.content.startswith('$greet'): - channel = message.channel - await channel.send('Say hello!') - - def check(m): - return m.content == 'hello' and m.channel == channel - - msg = await client.wait_for('message', check=check) - await channel.send(f'Hello {msg.author}!') - - Waiting for a thumbs up reaction from the message author: :: - - @client.event - async def on_message(message): - if message.content.startswith('$thumb'): - channel = message.channel - await channel.send('Send me that \N{THUMBS UP SIGN} reaction, mate') - - def check(reaction, user): - return user == message.author and str(reaction.emoji) == '\N{THUMBS UP SIGN}' - - try: - reaction, user = await client.wait_for('reaction_add', timeout=60.0, check=check) - except asyncio.TimeoutError: - await channel.send('\N{THUMBS DOWN SIGN}') - else: - await channel.send('\N{THUMBS UP SIGN}') - - .. versionchanged:: 2.0 - - ``event`` parameter is now positional-only. - - - Parameters - ------------ - event: :class:`str` - The event name, similar to the :ref:`event reference `, - but without the ``on_`` prefix, to wait for. - check: Optional[Callable[..., :class:`bool`]] - A predicate to check what to wait for. The arguments must meet the - parameters of the event being waited for. - timeout: Optional[:class:`float`] - The number of seconds to wait before timing out and raising - :exc:`asyncio.TimeoutError`. - - Raises - ------- - asyncio.TimeoutError - If a timeout is provided and it was reached. - - Returns - -------- - Any - Returns no arguments, a single argument, or a :class:`tuple` of multiple - arguments that mirrors the parameters passed in the - :ref:`event reference `. - """ - - future = self.loop.create_future() - if check is None: - - def _check(*args): - return True - - check = _check - - ev = event.lower() - try: - listeners = self._listeners[ev] - except KeyError: - listeners = [] - self._listeners[ev] = listeners - - listeners.append((future, check)) - return asyncio.wait_for(future, timeout) - - # event registration - - def event(self, coro: Coro, /) -> Coro: - """A decorator that registers an event to listen to. - - You can find more info about the events on the :ref:`documentation below `. - - The events must be a :ref:`coroutine `, if not, :exc:`TypeError` is raised. - - Example - --------- - - .. code-block:: python3 - - @client.event - async def on_ready(): - print('Ready!') - - .. versionchanged:: 2.0 - - ``coro`` parameter is now positional-only. - - Raises - -------- - TypeError - The coroutine passed is not actually a coroutine. - """ - - if not asyncio.iscoroutinefunction(coro): - raise TypeError('event registered must be a coroutine function') - - setattr(self, coro.__name__, coro) - _log.debug('%s has successfully been registered as an event', coro.__name__) - return coro - - async def change_presence( - self, - *, - activity: Optional[BaseActivity] = None, - status: Optional[Status] = None, - ) -> None: - """|coro| - - Changes the client's presence. - - Example - --------- - - .. code-block:: python3 - - game = discord.Game("with the API") - await client.change_presence(status=discord.Status.idle, activity=game) - - .. versionchanged:: 2.0 - Removed the ``afk`` keyword-only parameter. - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` instead of - ``InvalidArgument``. - - Parameters - ---------- - activity: Optional[:class:`.BaseActivity`] - The activity being done. ``None`` if no currently active activity is done. - status: Optional[:class:`.Status`] - Indicates what status to change to. If ``None``, then - :attr:`.Status.online` is used. - - Raises - ------ - TypeError - If the ``activity`` parameter is not the proper type. - """ - - if status is None: - status_str = 'online' - status = Status.online - elif status is Status.offline: - status_str = 'invisible' - status = Status.offline - else: - status_str = str(status) - - await self.ws.change_presence(activity=activity, status=status_str) - - for guild in self._connection.guilds: - me = guild.me - if me is None: - continue - - if activity is not None: - me.activities = (activity,) # type: ignore # Type checker does not understand the downcast here - else: - me.activities = () - - me.status = status - - # Guild stuff - - async def fetch_guilds( - self, - *, - limit: Optional[int] = 200, - before: Optional[SnowflakeTime] = None, - after: Optional[SnowflakeTime] = None, - ) -> AsyncIterator[Guild]: - """Retrieves an :term:`asynchronous iterator` that enables receiving your guilds. - - .. note:: - - Using this, you will only receive :attr:`.Guild.owner`, :attr:`.Guild.icon`, - :attr:`.Guild.id`, and :attr:`.Guild.name` per :class:`.Guild`. - - .. note:: - - This method is an API call. For general usage, consider :attr:`guilds` instead. - - Examples - --------- - - Usage :: - - async for guild in client.fetch_guilds(limit=150): - print(guild.name) - - Flattening into a list :: - - guilds = [guild async for guild in client.fetch_guilds(limit=150)] - # guilds is now a list of Guild... - - All parameters are optional. - - Parameters - ----------- - limit: Optional[:class:`int`] - The number of guilds to retrieve. - If ``None``, it retrieves every guild you have access to. Note, however, - that this would make it a slow operation. - Defaults to ``200``. - - .. versionchanged:: 2.0 - - The default has been changed to 200. - - before: Union[:class:`.abc.Snowflake`, :class:`datetime.datetime`] - Retrieves guilds before this date or object. - If a datetime is provided, it is recommended to use a UTC aware datetime. - If the datetime is naive, it is assumed to be local time. - after: Union[:class:`.abc.Snowflake`, :class:`datetime.datetime`] - Retrieve guilds after this date or object. - If a datetime is provided, it is recommended to use a UTC aware datetime. - If the datetime is naive, it is assumed to be local time. - - Raises - ------ - HTTPException - Getting the guilds failed. - - Yields - -------- - :class:`.Guild` - The guild with the guild data parsed. - """ - - async def _before_strategy(retrieve: int, before: Optional[Snowflake], limit: Optional[int]): - before_id = before.id if before else None - data = await self.http.get_guilds(retrieve, before=before_id) - - if data: - if limit is not None: - limit -= len(data) - - before = Object(id=int(data[0]['id'])) - - return data, before, limit - - async def _after_strategy(retrieve: int, after: Optional[Snowflake], limit: Optional[int]): - after_id = after.id if after else None - data = await self.http.get_guilds(retrieve, after=after_id) - - if data: - if limit is not None: - limit -= len(data) - - after = Object(id=int(data[-1]['id'])) - - return data, after, limit - - if isinstance(before, datetime.datetime): - before = Object(id=time_snowflake(before, high=False)) - if isinstance(after, datetime.datetime): - after = Object(id=time_snowflake(after, high=True)) - - predicate: Optional[Callable[[GuildPayload], bool]] = None - strategy, state = _after_strategy, after - - if before: - strategy, state = _before_strategy, before - - if before and after: - predicate = lambda m: int(m['id']) > after.id - - while True: - retrieve = min(200 if limit is None else limit, 200) - if retrieve < 1: - return - - data, state, limit = await strategy(retrieve, state, limit) - - # Terminate loop on next iteration; there's no data left after this - if len(data) < 200: - limit = 0 - - if predicate: - data = filter(predicate, data) - - for raw_guild in data: - yield Guild(state=self._connection, data=raw_guild) - - async def fetch_template(self, code: Union[Template, str]) -> Template: - """|coro| - - Gets a :class:`.Template` from a discord.new URL or code. - - Parameters - ----------- - code: Union[:class:`.Template`, :class:`str`] - The Discord Template Code or URL (must be a discord.new URL). - - Raises - ------- - NotFound - The template is invalid. - HTTPException - Getting the template failed. - - Returns - -------- - :class:`.Template` - The template from the URL/code. - """ - code = utils.resolve_template(code) - data = await self.http.get_template(code) - return Template(data=data, state=self._connection) - - async def fetch_guild(self, guild_id: int, /, *, with_counts: bool = True) -> Guild: - """|coro| - - Retrieves a :class:`.Guild` from an ID. - - .. note:: - - Using this, you will **not** receive :attr:`.Guild.channels`, :attr:`.Guild.members`, - :attr:`.Member.activity` and :attr:`.Member.voice` per :class:`.Member`. - - .. note:: - - This method is an API call. For general usage, consider :meth:`get_guild` instead. - - .. versionchanged:: 2.0 - - ``guild_id`` parameter is now positional-only. - - - Parameters - ----------- - guild_id: :class:`int` - The guild's ID to fetch from. - with_counts: :class:`bool` - Whether to include count information in the guild. This fills the - :attr:`.Guild.approximate_member_count` and :attr:`.Guild.approximate_presence_count` - attributes without needing any privileged intents. Defaults to ``True``. - - .. versionadded:: 2.0 - - Raises - ------ - Forbidden - You do not have access to the guild. - HTTPException - Getting the guild failed. - - Returns - -------- - :class:`.Guild` - The guild from the ID. - """ - data = await self.http.get_guild(guild_id, with_counts=with_counts) - return Guild(data=data, state=self._connection) - - async def create_guild( - self, - *, - name: str, - icon: bytes = MISSING, - code: str = MISSING, - ) -> Guild: - """|coro| - - Creates a :class:`.Guild`. - - Bot accounts in more than 10 guilds are not allowed to create guilds. - - .. versionchanged:: 2.0 - ``name`` and ``icon`` parameters are now keyword-only. The ``region`` parameter has been removed. - - .. versionchanged:: 2.0 - This function will now raise :exc:`ValueError` instead of - ``InvalidArgument``. - - Parameters - ---------- - name: :class:`str` - The name of the guild. - icon: Optional[:class:`bytes`] - The :term:`py:bytes-like object` representing the icon. See :meth:`.ClientUser.edit` - for more details on what is expected. - code: :class:`str` - The code for a template to create the guild with. - - .. versionadded:: 1.4 - - Raises - ------ - HTTPException - Guild creation failed. - ValueError - Invalid icon image format given. Must be PNG or JPG. - - Returns - ------- - :class:`.Guild` - The guild created. This is not the same guild that is - added to cache. - """ - if icon is not MISSING: - icon_base64 = utils._bytes_to_base64_data(icon) - else: - icon_base64 = None - - if code: - data = await self.http.create_from_template(code, name, icon_base64) - else: - data = await self.http.create_guild(name, icon_base64) - return Guild(data=data, state=self._connection) - - async def fetch_stage_instance(self, channel_id: int, /) -> StageInstance: - """|coro| - - Gets a :class:`.StageInstance` for a stage channel id. - - .. versionadded:: 2.0 - - Parameters - ----------- - channel_id: :class:`int` - The stage channel ID. - - Raises - ------- - NotFound - The stage instance or channel could not be found. - HTTPException - Getting the stage instance failed. - - Returns - -------- - :class:`.StageInstance` - The stage instance from the stage channel ID. - """ - data = await self.http.get_stage_instance(channel_id) - guild = self.get_guild(int(data['guild_id'])) - # Guild can technically be None here but this is being explicitly silenced right now. - return StageInstance(guild=guild, state=self._connection, data=data) # type: ignore - - # Invite management - - async def fetch_invite( - self, - url: Union[Invite, str], - *, - with_counts: bool = True, - with_expiration: bool = True, - scheduled_event_id: Optional[int] = None, - ) -> Invite: - """|coro| - - Gets an :class:`.Invite` from a discord.gg URL or ID. - - .. note:: - - If the invite is for a guild you have not joined, the guild and channel - attributes of the returned :class:`.Invite` will be :class:`.PartialInviteGuild` and - :class:`.PartialInviteChannel` respectively. - - Parameters - ----------- - url: Union[:class:`.Invite`, :class:`str`] - The Discord invite ID or URL (must be a discord.gg URL). - with_counts: :class:`bool` - Whether to include count information in the invite. This fills the - :attr:`.Invite.approximate_member_count` and :attr:`.Invite.approximate_presence_count` - fields. - with_expiration: :class:`bool` - Whether to include the expiration date of the invite. This fills the - :attr:`.Invite.expires_at` field. - - .. versionadded:: 2.0 - scheduled_event_id: Optional[:class:`int`] - The ID of the scheduled event this invite is for. - - .. note:: - - It is not possible to provide a url that contains an ``event_id`` parameter - when using this parameter. - - .. versionadded:: 2.0 - - Raises - ------- - ValueError - The url contains an ``event_id``, but ``scheduled_event_id`` has also been provided. - NotFound - The invite has expired or is invalid. - HTTPException - Getting the invite failed. - - Returns - -------- - :class:`.Invite` - The invite from the URL/ID. - """ - - resolved = utils.resolve_invite(url) - - if scheduled_event_id and resolved.event: - raise ValueError('Cannot specify scheduled_event_id and contain an event_id in the url.') - - scheduled_event_id = scheduled_event_id or resolved.event - - data = await self.http.get_invite( - resolved.code, - with_counts=with_counts, - with_expiration=with_expiration, - guild_scheduled_event_id=scheduled_event_id, - ) - return Invite.from_incomplete(state=self._connection, data=data) - - async def delete_invite(self, invite: Union[Invite, str], /) -> None: - """|coro| - - Revokes an :class:`.Invite`, URL, or ID to an invite. - - You must have the :attr:`~.Permissions.manage_channels` permission in - the associated guild to do this. - - .. versionchanged:: 2.0 - - ``invite`` parameter is now positional-only. - - Parameters - ---------- - invite: Union[:class:`.Invite`, :class:`str`] - The invite to revoke. - - Raises - ------- - Forbidden - You do not have permissions to revoke invites. - NotFound - The invite is invalid or expired. - HTTPException - Revoking the invite failed. - """ - - resolved = utils.resolve_invite(invite) - await self.http.delete_invite(resolved.code) - - # Miscellaneous stuff - - async def fetch_widget(self, guild_id: int, /) -> Widget: - """|coro| - - Gets a :class:`.Widget` from a guild ID. - - .. note:: - - The guild must have the widget enabled to get this information. - - .. versionchanged:: 2.0 - - ``guild_id`` parameter is now positional-only. - - Parameters - ----------- - guild_id: :class:`int` - The ID of the guild. - - Raises - ------- - Forbidden - The widget for this guild is disabled. - HTTPException - Retrieving the widget failed. - - Returns - -------- - :class:`.Widget` - The guild's widget. - """ - data = await self.http.get_widget(guild_id) - - return Widget(state=self._connection, data=data) - - async def application_info(self) -> AppInfo: - """|coro| - - Retrieves the bot's application information. - - Raises - ------- - HTTPException - Retrieving the information failed somehow. - - Returns - -------- - :class:`.AppInfo` - The bot's application information. - """ - data = await self.http.application_info() - if 'rpc_origins' not in data: - data['rpc_origins'] = None - return AppInfo(self._connection, data) - - async def fetch_user(self, user_id: int, /) -> User: - """|coro| - - Retrieves a :class:`~discord.User` based on their ID. - You do not have to share any guilds with the user to get this information, - however many operations do require that you do. - - .. note:: - - This method is an API call. If you have :attr:`discord.Intents.members` and member cache enabled, consider :meth:`get_user` instead. - - .. versionchanged:: 2.0 - - ``user_id`` parameter is now positional-only. - - Parameters - ----------- - user_id: :class:`int` - The user's ID to fetch from. - - Raises - ------- - NotFound - A user with this ID does not exist. - HTTPException - Fetching the user failed. - - Returns - -------- - :class:`~discord.User` - The user you requested. - """ - data = await self.http.get_user(user_id) - return User(state=self._connection, data=data) - - async def fetch_channel(self, channel_id: int, /) -> Union[GuildChannel, PrivateChannel, Thread]: - """|coro| - - Retrieves a :class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`, or :class:`.Thread` with the specified ID. - - .. note:: - - This method is an API call. For general usage, consider :meth:`get_channel` instead. - - .. versionadded:: 1.2 - - .. versionchanged:: 2.0 - - ``channel_id`` parameter is now positional-only. - - Raises - ------- - InvalidData - An unknown channel type was received from Discord. - HTTPException - Retrieving the channel failed. - NotFound - Invalid Channel ID. - Forbidden - You do not have permission to fetch this channel. - - Returns - -------- - Union[:class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`, :class:`.Thread`] - The channel from the ID. - """ - data = await self.http.get_channel(channel_id) - - factory, ch_type = _threaded_channel_factory(data['type']) - if factory is None: - raise InvalidData('Unknown channel type {type} for channel ID {id}.'.format_map(data)) - - if ch_type in (ChannelType.group, ChannelType.private): - # the factory will be a DMChannel or GroupChannel here - channel = factory(me=self.user, data=data, state=self._connection) # type: ignore - else: - # the factory can't be a DMChannel or GroupChannel here - guild_id = int(data['guild_id']) # type: ignore - guild = self._connection._get_or_create_unavailable_guild(guild_id) - # the factory should be a GuildChannel or Thread - channel = factory(guild=guild, state=self._connection, data=data) # type: ignore - - return channel - - async def fetch_webhook(self, webhook_id: int, /) -> Webhook: - """|coro| - - Retrieves a :class:`.Webhook` with the specified ID. - - .. versionchanged:: 2.0 - - ``webhook_id`` parameter is now positional-only. - - Raises - -------- - HTTPException - Retrieving the webhook failed. - NotFound - Invalid webhook ID. - Forbidden - You do not have permission to fetch this webhook. - - Returns - --------- - :class:`.Webhook` - The webhook you requested. - """ - data = await self.http.get_webhook(webhook_id) - return Webhook.from_state(data, state=self._connection) - - async def fetch_sticker(self, sticker_id: int, /) -> Union[StandardSticker, GuildSticker]: - """|coro| - - Retrieves a :class:`.Sticker` with the specified ID. - - .. versionadded:: 2.0 - - Raises - -------- - HTTPException - Retrieving the sticker failed. - NotFound - Invalid sticker ID. - - Returns - -------- - Union[:class:`.StandardSticker`, :class:`.GuildSticker`] - The sticker you requested. - """ - data = await self.http.get_sticker(sticker_id) - cls, _ = _sticker_factory(data['type']) - # The type checker is not smart enough to figure out the constructor is correct - return cls(state=self._connection, data=data) # type: ignore - - async def fetch_premium_sticker_packs(self) -> List[StickerPack]: - """|coro| - - Retrieves all available premium sticker packs. - - .. versionadded:: 2.0 - - Raises - ------- - HTTPException - Retrieving the sticker packs failed. - - Returns - --------- - List[:class:`.StickerPack`] - All available premium sticker packs. - """ - data = await self.http.list_premium_sticker_packs() - return [StickerPack(state=self._connection, data=pack) for pack in data['sticker_packs']] - - async def create_dm(self, user: Snowflake) -> DMChannel: - """|coro| - - Creates a :class:`.DMChannel` with this user. - - This should be rarely called, as this is done transparently for most - people. - - .. versionadded:: 2.0 - - Parameters - ----------- - user: :class:`~discord.abc.Snowflake` - The user to create a DM with. - - Returns - ------- - :class:`.DMChannel` - The channel that was created. - """ - state = self._connection - found = state._get_private_channel_by_user(user.id) - if found: - return found - - data = await state.http.start_private_message(user.id) - return state.add_dm_channel(data) - - def add_view(self, view: View, *, message_id: Optional[int] = None) -> None: - """Registers a :class:`~discord.ui.View` for persistent listening. - - This method should be used for when a view is comprised of components - that last longer than the lifecycle of the program. - - .. versionadded:: 2.0 - - Parameters - ------------ - view: :class:`discord.ui.View` - The view to register for dispatching. - message_id: Optional[:class:`int`] - The message ID that the view is attached to. This is currently used to - refresh the view's state during message update events. If not given - then message update events are not propagated for the view. - - Raises - ------- - TypeError - A view was not passed. - ValueError - The view is not persistent. A persistent view has no timeout - and all their components have an explicitly provided custom_id. - """ - - if not isinstance(view, View): - raise TypeError(f'expected an instance of View not {view.__class__!r}') - - if not view.is_persistent(): - raise ValueError('View is not persistent. Items need to have a custom_id set and View must have no timeout') - - self._connection.store_view(view, message_id) - - @property - def persistent_views(self) -> Sequence[View]: - """Sequence[:class:`.View`]: A sequence of persistent views added to the client. - - .. versionadded:: 2.0 - """ - return self._connection.persistent_views diff --git a/.venv/Lib/site-packages/discord/colour.py b/.venv/Lib/site-packages/discord/colour.py deleted file mode 100644 index f6d88f8..0000000 --- a/.venv/Lib/site-packages/discord/colour.py +++ /dev/null @@ -1,401 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" -from __future__ import annotations - -import colorsys -import random -import re - -from typing import TYPE_CHECKING, Optional, Tuple, Union - -if TYPE_CHECKING: - from typing_extensions import Self - -__all__ = ( - 'Colour', - 'Color', -) - -RGB_REGEX = re.compile(r'rgb\s*\((?P[0-9.]+%?)\s*,\s*(?P[0-9.]+%?)\s*,\s*(?P[0-9.]+%?)\s*\)') - - -def parse_hex_number(argument: str) -> Colour: - arg = ''.join(i * 2 for i in argument) if len(argument) == 3 else argument - try: - value = int(arg, base=16) - if not (0 <= value <= 0xFFFFFF): - raise ValueError('hex number out of range for 24-bit colour') - except ValueError: - raise ValueError('invalid hex digit given') from None - else: - return Color(value=value) - - -def parse_rgb_number(number: str) -> int: - if number[-1] == '%': - value = float(number[:-1]) - if not (0 <= value <= 100): - raise ValueError('rgb percentage can only be between 0 to 100') - return round(255 * (value / 100)) - - value = int(number) - if not (0 <= value <= 255): - raise ValueError('rgb number can only be between 0 to 255') - return value - - -def parse_rgb(argument: str, *, regex: re.Pattern[str] = RGB_REGEX) -> Colour: - match = regex.match(argument) - if match is None: - raise ValueError('invalid rgb syntax found') - - red = parse_rgb_number(match.group('r')) - green = parse_rgb_number(match.group('g')) - blue = parse_rgb_number(match.group('b')) - return Color.from_rgb(red, green, blue) - - -class Colour: - """Represents a Discord role colour. This class is similar - to a (red, green, blue) :class:`tuple`. - - There is an alias for this called Color. - - .. container:: operations - - .. describe:: x == y - - Checks if two colours are equal. - - .. describe:: x != y - - Checks if two colours are not equal. - - .. describe:: hash(x) - - Return the colour's hash. - - .. describe:: str(x) - - Returns the hex format for the colour. - - .. describe:: int(x) - - Returns the raw colour value. - - Attributes - ------------ - value: :class:`int` - The raw integer colour value. - """ - - __slots__ = ('value',) - - def __init__(self, value: int): - if not isinstance(value, int): - raise TypeError(f'Expected int parameter, received {value.__class__.__name__} instead.') - - self.value: int = value - - def _get_byte(self, byte: int) -> int: - return (self.value >> (8 * byte)) & 0xFF - - def __eq__(self, other: object) -> bool: - return isinstance(other, Colour) and self.value == other.value - - def __ne__(self, other: object) -> bool: - return not self.__eq__(other) - - def __str__(self) -> str: - return f'#{self.value:0>6x}' - - def __int__(self) -> int: - return self.value - - def __repr__(self) -> str: - return f'' - - def __hash__(self) -> int: - return hash(self.value) - - @property - def r(self) -> int: - """:class:`int`: Returns the red component of the colour.""" - return self._get_byte(2) - - @property - def g(self) -> int: - """:class:`int`: Returns the green component of the colour.""" - return self._get_byte(1) - - @property - def b(self) -> int: - """:class:`int`: Returns the blue component of the colour.""" - return self._get_byte(0) - - def to_rgb(self) -> Tuple[int, int, int]: - """Tuple[:class:`int`, :class:`int`, :class:`int`]: Returns an (r, g, b) tuple representing the colour.""" - return (self.r, self.g, self.b) - - @classmethod - def from_rgb(cls, r: int, g: int, b: int) -> Self: - """Constructs a :class:`Colour` from an RGB tuple.""" - return cls((r << 16) + (g << 8) + b) - - @classmethod - def from_hsv(cls, h: float, s: float, v: float) -> Self: - """Constructs a :class:`Colour` from an HSV tuple.""" - rgb = colorsys.hsv_to_rgb(h, s, v) - return cls.from_rgb(*(int(x * 255) for x in rgb)) - - @classmethod - def from_str(cls, value: str) -> Self: - """Constructs a :class:`Colour` from a string. - - The following formats are accepted: - - - ``0x`` - - ``#`` - - ``0x#`` - - ``rgb(, , )`` - - Like CSS, ```` can be either 0-255 or 0-100% and ```` can be - either a 6 digit hex number or a 3 digit hex shortcut (e.g. #fff). - - .. versionadded:: 2.0 - - Raises - ------- - ValueError - The string could not be converted into a colour. - """ - - if value[0] == '#': - return parse_hex_number(value[1:]) - - if value[0:2] == '0x': - rest = value[2:] - # Legacy backwards compatible syntax - if rest.startswith('#'): - return parse_hex_number(rest[1:]) - return parse_hex_number(rest) - - arg = value.lower() - if arg[0:3] == 'rgb': - return parse_rgb(arg) - - raise ValueError('unknown colour format given') - - @classmethod - def default(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0``.""" - return cls(0) - - @classmethod - def random(cls, *, seed: Optional[Union[int, str, float, bytes, bytearray]] = None) -> Self: - """A factory method that returns a :class:`Colour` with a random hue. - - .. note:: - - The random algorithm works by choosing a colour with a random hue but - with maxed out saturation and value. - - .. versionadded:: 1.6 - - Parameters - ------------ - seed: Optional[Union[:class:`int`, :class:`str`, :class:`float`, :class:`bytes`, :class:`bytearray`]] - The seed to initialize the RNG with. If ``None`` is passed the default RNG is used. - - .. versionadded:: 1.7 - """ - rand = random if seed is None else random.Random(seed) - return cls.from_hsv(rand.random(), 1, 1) - - @classmethod - def teal(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x1abc9c``.""" - return cls(0x1ABC9C) - - @classmethod - def dark_teal(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x11806a``.""" - return cls(0x11806A) - - @classmethod - def brand_green(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x57F287``. - - .. versionadded:: 2.0 - """ - return cls(0x57F287) - - @classmethod - def green(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x2ecc71``.""" - return cls(0x2ECC71) - - @classmethod - def dark_green(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x1f8b4c``.""" - return cls(0x1F8B4C) - - @classmethod - def blue(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x3498db``.""" - return cls(0x3498DB) - - @classmethod - def dark_blue(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x206694``.""" - return cls(0x206694) - - @classmethod - def purple(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x9b59b6``.""" - return cls(0x9B59B6) - - @classmethod - def dark_purple(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x71368a``.""" - return cls(0x71368A) - - @classmethod - def magenta(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xe91e63``.""" - return cls(0xE91E63) - - @classmethod - def dark_magenta(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xad1457``.""" - return cls(0xAD1457) - - @classmethod - def gold(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xf1c40f``.""" - return cls(0xF1C40F) - - @classmethod - def dark_gold(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xc27c0e``.""" - return cls(0xC27C0E) - - @classmethod - def orange(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xe67e22``.""" - return cls(0xE67E22) - - @classmethod - def dark_orange(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xa84300``.""" - return cls(0xA84300) - - @classmethod - def brand_red(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xED4245``. - - .. versionadded:: 2.0 - """ - return cls(0xED4245) - - @classmethod - def red(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xe74c3c``.""" - return cls(0xE74C3C) - - @classmethod - def dark_red(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x992d22``.""" - return cls(0x992D22) - - @classmethod - def lighter_grey(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x95a5a6``.""" - return cls(0x95A5A6) - - lighter_gray = lighter_grey - - @classmethod - def dark_grey(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x607d8b``.""" - return cls(0x607D8B) - - dark_gray = dark_grey - - @classmethod - def light_grey(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x979c9f``.""" - return cls(0x979C9F) - - light_gray = light_grey - - @classmethod - def darker_grey(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x546e7a``.""" - return cls(0x546E7A) - - darker_gray = darker_grey - - @classmethod - def og_blurple(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x7289da``.""" - return cls(0x7289DA) - - @classmethod - def blurple(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x5865F2``.""" - return cls(0x5865F2) - - @classmethod - def greyple(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x99aab5``.""" - return cls(0x99AAB5) - - @classmethod - def dark_theme(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0x36393F``. - This will appear transparent on Discord's dark theme. - - .. versionadded:: 1.5 - """ - return cls(0x36393F) - - @classmethod - def fuchsia(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xEB459E``. - - .. versionadded:: 2.0 - """ - return cls(0xEB459E) - - @classmethod - def yellow(cls) -> Self: - """A factory method that returns a :class:`Colour` with a value of ``0xFEE75C``. - - .. versionadded:: 2.0 - """ - return cls(0xFEE75C) - - -Color = Colour diff --git a/.venv/Lib/site-packages/discord/components.py b/.venv/Lib/site-packages/discord/components.py deleted file mode 100644 index 3f7dd11..0000000 --- a/.venv/Lib/site-packages/discord/components.py +++ /dev/null @@ -1,528 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -from typing import ClassVar, List, Literal, Optional, TYPE_CHECKING, Tuple, Union, overload -from .enums import try_enum, ComponentType, ButtonStyle, TextStyle -from .utils import get_slots, MISSING -from .partial_emoji import PartialEmoji, _EmojiTag - -if TYPE_CHECKING: - from typing_extensions import Self - - from .types.components import ( - Component as ComponentPayload, - ButtonComponent as ButtonComponentPayload, - SelectMenu as SelectMenuPayload, - SelectOption as SelectOptionPayload, - ActionRow as ActionRowPayload, - TextInput as TextInputPayload, - ActionRowChildComponent as ActionRowChildComponentPayload, - ) - from .emoji import Emoji - - ActionRowChildComponentType = Union['Button', 'SelectMenu', 'TextInput'] - - -__all__ = ( - 'Component', - 'ActionRow', - 'Button', - 'SelectMenu', - 'SelectOption', - 'TextInput', -) - - -class Component: - """Represents a Discord Bot UI Kit Component. - - Currently, the only components supported by Discord are: - - - :class:`ActionRow` - - :class:`Button` - - :class:`SelectMenu` - - :class:`TextInput` - - This class is abstract and cannot be instantiated. - - .. versionadded:: 2.0 - """ - - __slots__: Tuple[str, ...] = () - - __repr_info__: ClassVar[Tuple[str, ...]] - - def __repr__(self) -> str: - attrs = ' '.join(f'{key}={getattr(self, key)!r}' for key in self.__repr_info__) - return f'<{self.__class__.__name__} {attrs}>' - - @property - def type(self) -> ComponentType: - """:class:`ComponentType`: The type of component.""" - raise NotImplementedError - - @classmethod - def _raw_construct(cls, **kwargs) -> Self: - self = cls.__new__(cls) - for slot in get_slots(cls): - try: - value = kwargs[slot] - except KeyError: - pass - else: - setattr(self, slot, value) - return self - - def to_dict(self) -> ComponentPayload: - raise NotImplementedError - - -class ActionRow(Component): - """Represents a Discord Bot UI Kit Action Row. - - This is a component that holds up to 5 children components in a row. - - This inherits from :class:`Component`. - - .. versionadded:: 2.0 - - Attributes - ------------ - children: List[Union[:class:`Button`, :class:`SelectMenu`, :class:`TextInput`]] - The children components that this holds, if any. - """ - - __slots__: Tuple[str, ...] = ('children',) - - __repr_info__: ClassVar[Tuple[str, ...]] = __slots__ - - def __init__(self, data: ActionRowPayload, /) -> None: - self.children: List[ActionRowChildComponentType] = [] - - for component_data in data.get('components', []): - component = _component_factory(component_data) - - if component is not None: - self.children.append(component) - - @property - def type(self) -> Literal[ComponentType.action_row]: - """:class:`ComponentType`: The type of component.""" - return ComponentType.action_row - - def to_dict(self) -> ActionRowPayload: - return { - 'type': self.type.value, - 'components': [child.to_dict() for child in self.children], - } - - -class Button(Component): - """Represents a button from the Discord Bot UI Kit. - - This inherits from :class:`Component`. - - .. note:: - - The user constructible and usable type to create a button is :class:`discord.ui.Button` - not this one. - - .. versionadded:: 2.0 - - Attributes - ----------- - style: :class:`.ButtonStyle` - The style of the button. - custom_id: Optional[:class:`str`] - The ID of the button that gets received during an interaction. - If this button is for a URL, it does not have a custom ID. - url: Optional[:class:`str`] - The URL this button sends you to. - disabled: :class:`bool` - Whether the button is disabled or not. - label: Optional[:class:`str`] - The label of the button, if any. - emoji: Optional[:class:`PartialEmoji`] - The emoji of the button, if available. - """ - - __slots__: Tuple[str, ...] = ( - 'style', - 'custom_id', - 'url', - 'disabled', - 'label', - 'emoji', - ) - - __repr_info__: ClassVar[Tuple[str, ...]] = __slots__ - - def __init__(self, data: ButtonComponentPayload, /) -> None: - self.style: ButtonStyle = try_enum(ButtonStyle, data['style']) - self.custom_id: Optional[str] = data.get('custom_id') - self.url: Optional[str] = data.get('url') - self.disabled: bool = data.get('disabled', False) - self.label: Optional[str] = data.get('label') - self.emoji: Optional[PartialEmoji] - try: - self.emoji = PartialEmoji.from_dict(data['emoji']) - except KeyError: - self.emoji = None - - @property - def type(self) -> Literal[ComponentType.button]: - """:class:`ComponentType`: The type of component.""" - return ComponentType.button - - def to_dict(self) -> ButtonComponentPayload: - payload: ButtonComponentPayload = { - 'type': 2, - 'style': self.style.value, - 'disabled': self.disabled, - } - - if self.label: - payload['label'] = self.label - - if self.custom_id: - payload['custom_id'] = self.custom_id - - if self.url: - payload['url'] = self.url - - if self.emoji: - payload['emoji'] = self.emoji.to_dict() - - return payload - - -class SelectMenu(Component): - """Represents a select menu from the Discord Bot UI Kit. - - A select menu is functionally the same as a dropdown, however - on mobile it renders a bit differently. - - .. note:: - - The user constructible and usable type to create a select menu is - :class:`discord.ui.Select` not this one. - - .. versionadded:: 2.0 - - Attributes - ------------ - custom_id: Optional[:class:`str`] - The ID of the select menu that gets received during an interaction. - placeholder: Optional[:class:`str`] - The placeholder text that is shown if nothing is selected, if any. - min_values: :class:`int` - The minimum number of items that must be chosen for this select menu. - Defaults to 1 and must be between 0 and 25. - max_values: :class:`int` - The maximum number of items that must be chosen for this select menu. - Defaults to 1 and must be between 1 and 25. - options: List[:class:`SelectOption`] - A list of options that can be selected in this menu. - disabled: :class:`bool` - Whether the select is disabled or not. - """ - - __slots__: Tuple[str, ...] = ( - 'custom_id', - 'placeholder', - 'min_values', - 'max_values', - 'options', - 'disabled', - ) - - __repr_info__: ClassVar[Tuple[str, ...]] = __slots__ - - def __init__(self, data: SelectMenuPayload, /) -> None: - self.custom_id: str = data['custom_id'] - self.placeholder: Optional[str] = data.get('placeholder') - self.min_values: int = data.get('min_values', 1) - self.max_values: int = data.get('max_values', 1) - self.options: List[SelectOption] = [SelectOption.from_dict(option) for option in data.get('options', [])] - self.disabled: bool = data.get('disabled', False) - - @property - def type(self) -> Literal[ComponentType.select]: - """:class:`ComponentType`: The type of component.""" - return ComponentType.select - - def to_dict(self) -> SelectMenuPayload: - payload: SelectMenuPayload = { - 'type': self.type.value, - 'custom_id': self.custom_id, - 'min_values': self.min_values, - 'max_values': self.max_values, - 'options': [op.to_dict() for op in self.options], - 'disabled': self.disabled, - } - - if self.placeholder: - payload['placeholder'] = self.placeholder - - return payload - - -class SelectOption: - """Represents a select menu's option. - - These can be created by users. - - .. versionadded:: 2.0 - - Parameters - ----------- - label: :class:`str` - The label of the option. This is displayed to users. - Can only be up to 100 characters. - value: :class:`str` - The value of the option. This is not displayed to users. - If not provided when constructed then it defaults to the - label. Can only be up to 100 characters. - description: Optional[:class:`str`] - An additional description of the option, if any. - Can only be up to 100 characters. - emoji: Optional[Union[:class:`str`, :class:`Emoji`, :class:`PartialEmoji`]] - The emoji of the option, if available. - default: :class:`bool` - Whether this option is selected by default. - - Attributes - ----------- - label: :class:`str` - The label of the option. This is displayed to users. - Can only be up to 100 characters. - value: :class:`str` - The value of the option. This is not displayed to users. - If not provided when constructed then it defaults to the - label. Can only be up to 100 characters. - description: Optional[:class:`str`] - An additional description of the option, if any. - Can only be up to 100 characters. - default: :class:`bool` - Whether this option is selected by default. - """ - - __slots__: Tuple[str, ...] = ( - 'label', - 'value', - 'description', - '_emoji', - 'default', - ) - - def __init__( - self, - *, - label: str, - value: str = MISSING, - description: Optional[str] = None, - emoji: Optional[Union[str, Emoji, PartialEmoji]] = None, - default: bool = False, - ) -> None: - self.label: str = label - self.value: str = label if value is MISSING else value - self.description: Optional[str] = description - - self.emoji = emoji - self.default: bool = default - - def __repr__(self) -> str: - return ( - f'' - ) - - def __str__(self) -> str: - if self.emoji: - base = f'{self.emoji} {self.label}' - else: - base = self.label - - if self.description: - return f'{base}\n{self.description}' - return base - - @property - def emoji(self) -> Optional[PartialEmoji]: - """Optional[:class:`.PartialEmoji`]: The emoji of the option, if available.""" - return self._emoji - - @emoji.setter - def emoji(self, value: Optional[Union[str, Emoji, PartialEmoji]]) -> None: - if value is not None: - if isinstance(value, str): - self._emoji = PartialEmoji.from_str(value) - elif isinstance(value, _EmojiTag): - self._emoji = value._to_partial() - else: - raise TypeError(f'expected str, Emoji, or PartialEmoji, received {value.__class__} instead') - else: - self._emoji = None - - @classmethod - def from_dict(cls, data: SelectOptionPayload) -> SelectOption: - try: - emoji = PartialEmoji.from_dict(data['emoji']) - except KeyError: - emoji = None - - return cls( - label=data['label'], - value=data['value'], - description=data.get('description'), - emoji=emoji, - default=data.get('default', False), - ) - - def to_dict(self) -> SelectOptionPayload: - payload: SelectOptionPayload = { - 'label': self.label, - 'value': self.value, - 'default': self.default, - } - - if self.emoji: - payload['emoji'] = self.emoji.to_dict() - - if self.description: - payload['description'] = self.description - - return payload - - -class TextInput(Component): - """Represents a text input from the Discord Bot UI Kit. - - .. note:: - The user constructible and usable type to create a text input is - :class:`discord.ui.TextInput` not this one. - - .. versionadded:: 2.0 - - Attributes - ------------ - custom_id: Optional[:class:`str`] - The ID of the text input that gets received during an interaction. - label: :class:`str` - The label to display above the text input. - style: :class:`TextStyle` - The style of the text input. - placeholder: Optional[:class:`str`] - The placeholder text to display when the text input is empty. - value: Optional[:class:`str`] - The default value of the text input. - required: :class:`bool` - Whether the text input is required. - min_length: Optional[:class:`int`] - The minimum length of the text input. - max_length: Optional[:class:`int`] - The maximum length of the text input. - """ - - __slots__: Tuple[str, ...] = ( - 'style', - 'label', - 'custom_id', - 'placeholder', - 'value', - 'required', - 'min_length', - 'max_length', - ) - - __repr_info__: ClassVar[Tuple[str, ...]] = __slots__ - - def __init__(self, data: TextInputPayload, /) -> None: - self.style: TextStyle = try_enum(TextStyle, data['style']) - self.label: str = data['label'] - self.custom_id: str = data['custom_id'] - self.placeholder: Optional[str] = data.get('placeholder') - self.value: Optional[str] = data.get('value') - self.required: bool = data.get('required', True) - self.min_length: Optional[int] = data.get('min_length') - self.max_length: Optional[int] = data.get('max_length') - - @property - def type(self) -> Literal[ComponentType.text_input]: - """:class:`ComponentType`: The type of component.""" - return ComponentType.text_input - - def to_dict(self) -> TextInputPayload: - payload: TextInputPayload = { - 'type': self.type.value, - 'style': self.style.value, - 'label': self.label, - 'custom_id': self.custom_id, - 'required': self.required, - } - - if self.placeholder: - payload['placeholder'] = self.placeholder - - if self.value: - payload['value'] = self.value - - if self.min_length: - payload['min_length'] = self.min_length - - if self.max_length: - payload['max_length'] = self.max_length - - return payload - - @property - def default(self) -> Optional[str]: - """Optional[:class:`str`]: The default value of the text input. - - This is an alias to :attr:`value`. - """ - return self.value - - -@overload -def _component_factory(data: ActionRowChildComponentPayload) -> Optional[ActionRowChildComponentType]: - ... - - -@overload -def _component_factory(data: ComponentPayload) -> Optional[Union[ActionRow, ActionRowChildComponentType]]: - ... - - -def _component_factory(data: ComponentPayload) -> Optional[Union[ActionRow, ActionRowChildComponentType]]: - if data['type'] == 1: - return ActionRow(data) - elif data['type'] == 2: - return Button(data) - elif data['type'] == 3: - return SelectMenu(data) - elif data['type'] == 4: - return TextInput(data) diff --git a/.venv/Lib/site-packages/discord/context_managers.py b/.venv/Lib/site-packages/discord/context_managers.py deleted file mode 100644 index 09803c9..0000000 --- a/.venv/Lib/site-packages/discord/context_managers.py +++ /dev/null @@ -1,92 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -import asyncio -from typing import TYPE_CHECKING, Generator, Optional, Type, TypeVar - -if TYPE_CHECKING: - from .abc import Messageable, MessageableChannel - - from types import TracebackType - - BE = TypeVar('BE', bound=BaseException) - -# fmt: off -__all__ = ( - 'Typing', -) -# fmt: on - - -def _typing_done_callback(fut: asyncio.Future) -> None: - # just retrieve any exception and call it a day - try: - fut.exception() - except (asyncio.CancelledError, Exception): - pass - - -class Typing: - def __init__(self, messageable: Messageable) -> None: - self.loop: asyncio.AbstractEventLoop = messageable._state.loop - self.messageable: Messageable = messageable - self.channel: Optional[MessageableChannel] = None - - async def _get_channel(self) -> MessageableChannel: - if self.channel: - return self.channel - - self.channel = channel = await self.messageable._get_channel() - return channel - - async def wrapped_typer(self) -> None: - channel = await self._get_channel() - await channel._state.http.send_typing(channel.id) - - def __await__(self) -> Generator[None, None, None]: - return self.wrapped_typer().__await__() - - async def do_typing(self) -> None: - channel = await self._get_channel() - typing = channel._state.http.send_typing - - while True: - await asyncio.sleep(5) - await typing(channel.id) - - async def __aenter__(self) -> None: - channel = await self._get_channel() - await channel._state.http.send_typing(channel.id) - self.task: asyncio.Task[None] = self.loop.create_task(self.do_typing()) - self.task.add_done_callback(_typing_done_callback) - - async def __aexit__( - self, - exc_type: Optional[Type[BE]], - exc: Optional[BE], - traceback: Optional[TracebackType], - ) -> None: - self.task.cancel() diff --git a/.venv/Lib/site-packages/discord/embeds.py b/.venv/Lib/site-packages/discord/embeds.py deleted file mode 100644 index 6a79fef..0000000 --- a/.venv/Lib/site-packages/discord/embeds.py +++ /dev/null @@ -1,757 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -import datetime -from typing import Any, Dict, List, Mapping, Optional, Protocol, TYPE_CHECKING, TypeVar, Union - -from . import utils -from .colour import Colour - -# fmt: off -__all__ = ( - 'Embed', -) -# fmt: on - - -class EmbedProxy: - def __init__(self, layer: Dict[str, Any]): - self.__dict__.update(layer) - - def __len__(self) -> int: - return len(self.__dict__) - - def __repr__(self) -> str: - inner = ', '.join((f'{k}={v!r}' for k, v in self.__dict__.items() if not k.startswith('_'))) - return f'EmbedProxy({inner})' - - def __getattr__(self, attr: str) -> None: - return None - - def __eq__(self, other: object) -> bool: - return isinstance(other, EmbedProxy) and self.__dict__ == other.__dict__ - - -if TYPE_CHECKING: - from typing_extensions import Self - - from .types.embed import Embed as EmbedData, EmbedType - - T = TypeVar('T') - - class _EmbedFooterProxy(Protocol): - text: Optional[str] - icon_url: Optional[str] - - class _EmbedFieldProxy(Protocol): - name: Optional[str] - value: Optional[str] - inline: bool - - class _EmbedMediaProxy(Protocol): - url: Optional[str] - proxy_url: Optional[str] - height: Optional[int] - width: Optional[int] - - class _EmbedVideoProxy(Protocol): - url: Optional[str] - height: Optional[int] - width: Optional[int] - - class _EmbedProviderProxy(Protocol): - name: Optional[str] - url: Optional[str] - - class _EmbedAuthorProxy(Protocol): - name: Optional[str] - url: Optional[str] - icon_url: Optional[str] - proxy_icon_url: Optional[str] - - -class Embed: - """Represents a Discord embed. - - .. container:: operations - - .. describe:: len(x) - - Returns the total size of the embed. - Useful for checking if it's within the 6000 character limit. - - .. describe:: bool(b) - - Returns whether the embed has any data set. - - .. versionadded:: 2.0 - - .. describe:: x == y - - Checks if two embeds are equal. - - .. versionadded:: 2.0 - - For ease of use, all parameters that expect a :class:`str` are implicitly - casted to :class:`str` for you. - - .. versionchanged:: 2.0 - ``Embed.Empty`` has been removed in favour of ``None``. - - Attributes - ----------- - title: Optional[:class:`str`] - The title of the embed. - This can be set during initialisation. - Can only be up to 256 characters. - type: :class:`str` - The type of embed. Usually "rich". - This can be set during initialisation. - Possible strings for embed types can be found on discord's - :ddocs:`api docs ` - description: Optional[:class:`str`] - The description of the embed. - This can be set during initialisation. - Can only be up to 4096 characters. - url: Optional[:class:`str`] - The URL of the embed. - This can be set during initialisation. - timestamp: Optional[:class:`datetime.datetime`] - The timestamp of the embed content. This is an aware datetime. - If a naive datetime is passed, it is converted to an aware - datetime with the local timezone. - colour: Optional[Union[:class:`Colour`, :class:`int`]] - The colour code of the embed. Aliased to ``color`` as well. - This can be set during initialisation. - """ - - __slots__ = ( - 'title', - 'url', - 'type', - '_timestamp', - '_colour', - '_footer', - '_image', - '_thumbnail', - '_video', - '_provider', - '_author', - '_fields', - 'description', - ) - - def __init__( - self, - *, - colour: Optional[Union[int, Colour]] = None, - color: Optional[Union[int, Colour]] = None, - title: Optional[Any] = None, - type: EmbedType = 'rich', - url: Optional[Any] = None, - description: Optional[Any] = None, - timestamp: Optional[datetime.datetime] = None, - ): - - self.colour = colour if colour is not None else color - self.title: Optional[str] = title - self.type: EmbedType = type - self.url: Optional[str] = url - self.description: Optional[str] = description - - if self.title is not None: - self.title = str(self.title) - - if self.description is not None: - self.description = str(self.description) - - if self.url is not None: - self.url = str(self.url) - - if timestamp is not None: - self.timestamp = timestamp - - @classmethod - def from_dict(cls, data: Mapping[str, Any]) -> Self: - """Converts a :class:`dict` to a :class:`Embed` provided it is in the - format that Discord expects it to be in. - - You can find out about this format in the :ddocs:`official Discord documentation `. - - Parameters - ----------- - data: :class:`dict` - The dictionary to convert into an embed. - """ - # we are bypassing __init__ here since it doesn't apply here - self = cls.__new__(cls) - - # fill in the basic fields - - self.title = data.get('title', None) - self.type = data.get('type', None) - self.description = data.get('description', None) - self.url = data.get('url', None) - - if self.title is not None: - self.title = str(self.title) - - if self.description is not None: - self.description = str(self.description) - - if self.url is not None: - self.url = str(self.url) - - # try to fill in the more rich fields - - try: - self._colour = Colour(value=data['color']) - except KeyError: - pass - - try: - self._timestamp = utils.parse_time(data['timestamp']) - except KeyError: - pass - - for attr in ('thumbnail', 'video', 'provider', 'author', 'fields', 'image', 'footer'): - try: - value = data[attr] - except KeyError: - continue - else: - setattr(self, '_' + attr, value) - - return self - - def copy(self) -> Self: - """Returns a shallow copy of the embed.""" - return self.__class__.from_dict(self.to_dict()) - - def __len__(self) -> int: - total = len(self.title or '') + len(self.description or '') - for field in getattr(self, '_fields', []): - total += len(field['name']) + len(field['value']) - - try: - footer_text = self._footer['text'] - except (AttributeError, KeyError): - pass - else: - total += len(footer_text) - - try: - author = self._author - except AttributeError: - pass - else: - total += len(author['name']) - - return total - - def __bool__(self) -> bool: - return any( - ( - self.title, - self.url, - self.description, - self.colour, - self.fields, - self.timestamp, - self.author, - self.thumbnail, - self.footer, - self.image, - self.provider, - self.video, - ) - ) - - def __eq__(self, other: Embed) -> bool: - return isinstance(other, Embed) and ( - self.type == other.type - and self.title == other.title - and self.url == other.url - and self.description == other.description - and self.colour == other.colour - and self.fields == other.fields - and self.timestamp == other.timestamp - and self.author == other.author - and self.thumbnail == other.thumbnail - and self.footer == other.footer - and self.image == other.image - and self.provider == other.provider - and self.video == other.video - ) - - @property - def colour(self) -> Optional[Colour]: - return getattr(self, '_colour', None) - - @colour.setter - def colour(self, value: Optional[Union[int, Colour]]) -> None: - if value is None: - self._colour = None - elif isinstance(value, Colour): - self._colour = value - elif isinstance(value, int): - self._colour = Colour(value=value) - else: - raise TypeError(f'Expected discord.Colour, int, or None but received {value.__class__.__name__} instead.') - - color = colour - - @property - def timestamp(self) -> Optional[datetime.datetime]: - return getattr(self, '_timestamp', None) - - @timestamp.setter - def timestamp(self, value: Optional[datetime.datetime]) -> None: - if isinstance(value, datetime.datetime): - if value.tzinfo is None: - value = value.astimezone() - self._timestamp = value - elif value is None: - self._timestamp = None - else: - raise TypeError(f"Expected datetime.datetime or None received {value.__class__.__name__} instead") - - @property - def footer(self) -> _EmbedFooterProxy: - """Returns an ``EmbedProxy`` denoting the footer contents. - - See :meth:`set_footer` for possible values you can access. - - If the attribute has no value then ``None`` is returned. - """ - # Lying to the type checker for better developer UX. - return EmbedProxy(getattr(self, '_footer', {})) # type: ignore - - def set_footer(self, *, text: Optional[Any] = None, icon_url: Optional[Any] = None) -> Self: - """Sets the footer for the embed content. - - This function returns the class instance to allow for fluent-style - chaining. - - Parameters - ----------- - text: :class:`str` - The footer text. Can only be up to 2048 characters. - icon_url: :class:`str` - The URL of the footer icon. Only HTTP(S) is supported. - Inline attachment URLs are also supported, see :ref:`local_image`. - """ - - self._footer = {} - if text is not None: - self._footer['text'] = str(text) - - if icon_url is not None: - self._footer['icon_url'] = str(icon_url) - - return self - - def remove_footer(self) -> Self: - """Clears embed's footer information. - - This function returns the class instance to allow for fluent-style - chaining. - - .. versionadded:: 2.0 - """ - try: - del self._footer - except AttributeError: - pass - - return self - - @property - def image(self) -> _EmbedMediaProxy: - """Returns an ``EmbedProxy`` denoting the image contents. - - Possible attributes you can access are: - - - ``url`` - - ``proxy_url`` - - ``width`` - - ``height`` - - If the attribute has no value then ``None`` is returned. - """ - # Lying to the type checker for better developer UX. - return EmbedProxy(getattr(self, '_image', {})) # type: ignore - - def set_image(self, *, url: Optional[Any]) -> Self: - """Sets the image for the embed content. - - This function returns the class instance to allow for fluent-style - chaining. - - Parameters - ----------- - url: :class:`str` - The source URL for the image. Only HTTP(S) is supported. - Inline attachment URLs are also supported, see :ref:`local_image`. - """ - - if url is None: - try: - del self._image - except AttributeError: - pass - else: - self._image = { - 'url': str(url), - } - - return self - - @property - def thumbnail(self) -> _EmbedMediaProxy: - """Returns an ``EmbedProxy`` denoting the thumbnail contents. - - Possible attributes you can access are: - - - ``url`` - - ``proxy_url`` - - ``width`` - - ``height`` - - If the attribute has no value then ``None`` is returned. - """ - # Lying to the type checker for better developer UX. - return EmbedProxy(getattr(self, '_thumbnail', {})) # type: ignore - - def set_thumbnail(self, *, url: Optional[Any]) -> Self: - """Sets the thumbnail for the embed content. - - This function returns the class instance to allow for fluent-style - chaining. - - .. versionchanged:: 1.4 - Passing ``None`` removes the thumbnail. - - Parameters - ----------- - url: :class:`str` - The source URL for the thumbnail. Only HTTP(S) is supported. - Inline attachment URLs are also supported, see :ref:`local_image`. - """ - - if url is None: - try: - del self._thumbnail - except AttributeError: - pass - else: - self._thumbnail = { - 'url': str(url), - } - - return self - - @property - def video(self) -> _EmbedVideoProxy: - """Returns an ``EmbedProxy`` denoting the video contents. - - Possible attributes include: - - - ``url`` for the video URL. - - ``height`` for the video height. - - ``width`` for the video width. - - If the attribute has no value then ``None`` is returned. - """ - # Lying to the type checker for better developer UX. - return EmbedProxy(getattr(self, '_video', {})) # type: ignore - - @property - def provider(self) -> _EmbedProviderProxy: - """Returns an ``EmbedProxy`` denoting the provider contents. - - The only attributes that might be accessed are ``name`` and ``url``. - - If the attribute has no value then ``None`` is returned. - """ - # Lying to the type checker for better developer UX. - return EmbedProxy(getattr(self, '_provider', {})) # type: ignore - - @property - def author(self) -> _EmbedAuthorProxy: - """Returns an ``EmbedProxy`` denoting the author contents. - - See :meth:`set_author` for possible values you can access. - - If the attribute has no value then ``None`` is returned. - """ - # Lying to the type checker for better developer UX. - return EmbedProxy(getattr(self, '_author', {})) # type: ignore - - def set_author(self, *, name: Any, url: Optional[Any] = None, icon_url: Optional[Any] = None) -> Self: - """Sets the author for the embed content. - - This function returns the class instance to allow for fluent-style - chaining. - - Parameters - ----------- - name: :class:`str` - The name of the author. Can only be up to 256 characters. - url: :class:`str` - The URL for the author. - icon_url: :class:`str` - The URL of the author icon. Only HTTP(S) is supported. - Inline attachment URLs are also supported, see :ref:`local_image`. - """ - - self._author = { - 'name': str(name), - } - - if url is not None: - self._author['url'] = str(url) - - if icon_url is not None: - self._author['icon_url'] = str(icon_url) - - return self - - def remove_author(self) -> Self: - """Clears embed's author information. - - This function returns the class instance to allow for fluent-style - chaining. - - .. versionadded:: 1.4 - """ - try: - del self._author - except AttributeError: - pass - - return self - - @property - def fields(self) -> List[_EmbedFieldProxy]: - """List[``EmbedProxy``]: Returns a :class:`list` of ``EmbedProxy`` denoting the field contents. - - See :meth:`add_field` for possible values you can access. - - If the attribute has no value then ``None`` is returned. - """ - # Lying to the type checker for better developer UX. - return [EmbedProxy(d) for d in getattr(self, '_fields', [])] # type: ignore - - def add_field(self, *, name: Any, value: Any, inline: bool = True) -> Self: - """Adds a field to the embed object. - - This function returns the class instance to allow for fluent-style - chaining. Can only be up to 25 fields. - - Parameters - ----------- - name: :class:`str` - The name of the field. Can only be up to 256 characters. - value: :class:`str` - The value of the field. Can only be up to 1024 characters. - inline: :class:`bool` - Whether the field should be displayed inline. - """ - - field = { - 'inline': inline, - 'name': str(name), - 'value': str(value), - } - - try: - self._fields.append(field) - except AttributeError: - self._fields = [field] - - return self - - def insert_field_at(self, index: int, *, name: Any, value: Any, inline: bool = True) -> Self: - """Inserts a field before a specified index to the embed. - - This function returns the class instance to allow for fluent-style - chaining. Can only be up to 25 fields. - - .. versionadded:: 1.2 - - Parameters - ----------- - index: :class:`int` - The index of where to insert the field. - name: :class:`str` - The name of the field. Can only be up to 256 characters. - value: :class:`str` - The value of the field. Can only be up to 1024 characters. - inline: :class:`bool` - Whether the field should be displayed inline. - """ - - field = { - 'inline': inline, - 'name': str(name), - 'value': str(value), - } - - try: - self._fields.insert(index, field) - except AttributeError: - self._fields = [field] - - return self - - def clear_fields(self) -> Self: - """Removes all fields from this embed. - - This function returns the class instance to allow for fluent-style - chaining. - - .. versionchanged:: 2.0 - This function now returns the class instance. - """ - try: - self._fields.clear() - except AttributeError: - self._fields = [] - - return self - - def remove_field(self, index: int) -> Self: - """Removes a field at a specified index. - - If the index is invalid or out of bounds then the error is - silently swallowed. - - This function returns the class instance to allow for fluent-style - chaining. - - .. note:: - - When deleting a field by index, the index of the other fields - shift to fill the gap just like a regular list. - - .. versionchanged:: 2.0 - This function now returns the class instance. - - Parameters - ----------- - index: :class:`int` - The index of the field to remove. - """ - try: - del self._fields[index] - except (AttributeError, IndexError): - pass - - return self - - def set_field_at(self, index: int, *, name: Any, value: Any, inline: bool = True) -> Self: - """Modifies a field to the embed object. - - The index must point to a valid pre-existing field. Can only be up to 25 fields. - - This function returns the class instance to allow for fluent-style - chaining. - - Parameters - ----------- - index: :class:`int` - The index of the field to modify. - name: :class:`str` - The name of the field. Can only be up to 256 characters. - value: :class:`str` - The value of the field. Can only be up to 1024 characters. - inline: :class:`bool` - Whether the field should be displayed inline. - - Raises - ------- - IndexError - An invalid index was provided. - """ - - try: - field = self._fields[index] - except (TypeError, IndexError, AttributeError): - raise IndexError('field index out of range') - - field['name'] = str(name) - field['value'] = str(value) - field['inline'] = inline - return self - - def to_dict(self) -> EmbedData: - """Converts this embed object into a dict.""" - - # add in the raw data into the dict - # fmt: off - result = { - key[1:]: getattr(self, key) - for key in self.__slots__ - if key[0] == '_' and hasattr(self, key) - } - # fmt: on - - # deal with basic convenience wrappers - - try: - colour = result.pop('colour') - except KeyError: - pass - else: - if colour: - result['color'] = colour.value - - try: - timestamp = result.pop('timestamp') - except KeyError: - pass - else: - if timestamp: - if timestamp.tzinfo: - result['timestamp'] = timestamp.astimezone(tz=datetime.timezone.utc).isoformat() - else: - result['timestamp'] = timestamp.replace(tzinfo=datetime.timezone.utc).isoformat() - - # add in the non raw attribute ones - if self.type: - result['type'] = self.type - - if self.description: - result['description'] = self.description - - if self.url: - result['url'] = self.url - - if self.title: - result['title'] = self.title - - return result # type: ignore # This payload is equivalent to the EmbedData type diff --git a/.venv/Lib/site-packages/discord/emoji.py b/.venv/Lib/site-packages/discord/emoji.py deleted file mode 100644 index 35875fa..0000000 --- a/.venv/Lib/site-packages/discord/emoji.py +++ /dev/null @@ -1,259 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -from typing import Any, Collection, Iterator, List, Optional, TYPE_CHECKING, Tuple - -from .asset import Asset, AssetMixin -from .utils import SnowflakeList, snowflake_time, MISSING -from .partial_emoji import _EmojiTag, PartialEmoji -from .user import User - -# fmt: off -__all__ = ( - 'Emoji', -) -# fmt: on - -if TYPE_CHECKING: - from .types.emoji import Emoji as EmojiPayload - from .guild import Guild - from .state import ConnectionState - from .abc import Snowflake - from .role import Role - from datetime import datetime - - -class Emoji(_EmojiTag, AssetMixin): - """Represents a custom emoji. - - Depending on the way this object was created, some of the attributes can - have a value of ``None``. - - .. container:: operations - - .. describe:: x == y - - Checks if two emoji are the same. - - .. describe:: x != y - - Checks if two emoji are not the same. - - .. describe:: hash(x) - - Return the emoji's hash. - - .. describe:: iter(x) - - Returns an iterator of ``(field, value)`` pairs. This allows this class - to be used as an iterable in list/dict/etc constructions. - - .. describe:: str(x) - - Returns the emoji rendered for discord. - - Attributes - ----------- - name: :class:`str` - The name of the emoji. - id: :class:`int` - The emoji's ID. - require_colons: :class:`bool` - If colons are required to use this emoji in the client (:PJSalt: vs PJSalt). - animated: :class:`bool` - Whether an emoji is animated or not. - managed: :class:`bool` - If this emoji is managed by a Twitch integration. - guild_id: :class:`int` - The guild ID the emoji belongs to. - available: :class:`bool` - Whether the emoji is available for use. - user: Optional[:class:`User`] - The user that created the emoji. This can only be retrieved using :meth:`Guild.fetch_emoji` and - having the :attr:`~Permissions.manage_emojis` permission. - """ - - __slots__: Tuple[str, ...] = ( - 'require_colons', - 'animated', - 'managed', - 'id', - 'name', - '_roles', - 'guild_id', - '_state', - 'user', - 'available', - ) - - def __init__(self, *, guild: Guild, state: ConnectionState, data: EmojiPayload) -> None: - self.guild_id: int = guild.id - self._state: ConnectionState = state - self._from_data(data) - - def _from_data(self, emoji: EmojiPayload) -> None: - self.require_colons: bool = emoji.get('require_colons', False) - self.managed: bool = emoji.get('managed', False) - self.id: int = int(emoji['id']) # type: ignore # This won't be None for full emoji objects. - self.name: str = emoji['name'] # type: ignore # This won't be None for full emoji objects. - self.animated: bool = emoji.get('animated', False) - self.available: bool = emoji.get('available', True) - self._roles: SnowflakeList = SnowflakeList(map(int, emoji.get('roles', []))) - user = emoji.get('user') - self.user: Optional[User] = User(state=self._state, data=user) if user else None - - def _to_partial(self) -> PartialEmoji: - return PartialEmoji(name=self.name, animated=self.animated, id=self.id) - - def __iter__(self) -> Iterator[Tuple[str, Any]]: - for attr in self.__slots__: - if attr[0] != '_': - value = getattr(self, attr, None) - if value is not None: - yield (attr, value) - - def __str__(self) -> str: - if self.animated: - return f'' - return f'<:{self.name}:{self.id}>' - - def __repr__(self) -> str: - return f'' - - def __eq__(self, other: object) -> bool: - return isinstance(other, _EmojiTag) and self.id == other.id - - def __ne__(self, other: object) -> bool: - return not self.__eq__(other) - - def __hash__(self) -> int: - return self.id >> 22 - - @property - def created_at(self) -> datetime: - """:class:`datetime.datetime`: Returns the emoji's creation time in UTC.""" - return snowflake_time(self.id) - - @property - def url(self) -> str: - """:class:`str`: Returns the URL of the emoji.""" - fmt = 'gif' if self.animated else 'png' - return f'{Asset.BASE}/emojis/{self.id}.{fmt}' - - @property - def roles(self) -> List[Role]: - """List[:class:`Role`]: A :class:`list` of roles that is allowed to use this emoji. - - If roles is empty, the emoji is unrestricted. - """ - guild = self.guild - if guild is None: - return [] - - return [role for role in guild.roles if self._roles.has(role.id)] - - @property - def guild(self) -> Optional[Guild]: - """:class:`Guild`: The guild this emoji belongs to.""" - return self._state._get_guild(self.guild_id) - - def is_usable(self) -> bool: - """:class:`bool`: Whether the bot can use this emoji. - - .. versionadded:: 1.3 - """ - if not self.available or not self.guild or self.guild.unavailable: - return False - if not self._roles: - return True - emoji_roles, my_roles = self._roles, self.guild.me._roles - return any(my_roles.has(role_id) for role_id in emoji_roles) - - async def delete(self, *, reason: Optional[str] = None) -> None: - """|coro| - - Deletes the custom emoji. - - You must have :attr:`~Permissions.manage_emojis` permission to - do this. - - Parameters - ----------- - reason: Optional[:class:`str`] - The reason for deleting this emoji. Shows up on the audit log. - - Raises - ------- - Forbidden - You are not allowed to delete emojis. - HTTPException - An error occurred deleting the emoji. - """ - - await self._state.http.delete_custom_emoji(self.guild_id, self.id, reason=reason) - - async def edit( - self, *, name: str = MISSING, roles: Collection[Snowflake] = MISSING, reason: Optional[str] = None - ) -> Emoji: - r"""|coro| - - Edits the custom emoji. - - You must have :attr:`~Permissions.manage_emojis` permission to - do this. - - .. versionchanged:: 2.0 - The newly updated emoji is returned. - - Parameters - ----------- - name: :class:`str` - The new emoji name. - roles: List[:class:`~discord.abc.Snowflake`] - A list of roles that can use this emoji. An empty list can be passed to make it available to everyone. - reason: Optional[:class:`str`] - The reason for editing this emoji. Shows up on the audit log. - - Raises - ------- - Forbidden - You are not allowed to edit emojis. - HTTPException - An error occurred editing the emoji. - - Returns - -------- - :class:`Emoji` - The newly updated emoji. - """ - - payload = {} - if name is not MISSING: - payload['name'] = name - if roles is not MISSING: - payload['roles'] = [role.id for role in roles] - - data = await self._state.http.edit_custom_emoji(self.guild_id, self.id, payload=payload, reason=reason) - return Emoji(guild=self.guild, data=data, state=self._state) # type: ignore # if guild is None, the http request would have failed diff --git a/.venv/Lib/site-packages/discord/enums.py b/.venv/Lib/site-packages/discord/enums.py deleted file mode 100644 index 0368e96..0000000 --- a/.venv/Lib/site-packages/discord/enums.py +++ /dev/null @@ -1,741 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" -from __future__ import annotations - -import types -from collections import namedtuple -from typing import Any, ClassVar, Dict, List, Optional, TYPE_CHECKING, Tuple, Type, TypeVar, Iterator, Mapping - -__all__ = ( - 'Enum', - 'ChannelType', - 'MessageType', - 'SpeakingState', - 'VerificationLevel', - 'ContentFilter', - 'Status', - 'DefaultAvatar', - 'AuditLogAction', - 'AuditLogActionCategory', - 'UserFlags', - 'ActivityType', - 'NotificationLevel', - 'TeamMembershipState', - 'WebhookType', - 'ExpireBehaviour', - 'ExpireBehavior', - 'StickerType', - 'StickerFormatType', - 'InviteTarget', - 'VideoQualityMode', - 'ComponentType', - 'ButtonStyle', - 'TextStyle', - 'PrivacyLevel', - 'InteractionType', - 'InteractionResponseType', - 'NSFWLevel', - 'MFALevel', - 'Locale', - 'EntityType', - 'EventStatus', - 'AppCommandType', - 'AppCommandOptionType', - 'AppCommandPermissionType', - 'AutoModRuleTriggerType', - 'AutoModRuleEventType', - 'AutoModRuleActionType', -) - -if TYPE_CHECKING: - from typing_extensions import Self - - -def _create_value_cls(name: str, comparable: bool): - # All the type ignores here are due to the type checker being unable to recognise - # Runtime type creation without exploding. - cls = namedtuple('_EnumValue_' + name, 'name value') - cls.__repr__ = lambda self: f'<{name}.{self.name}: {self.value!r}>' # type: ignore - cls.__str__ = lambda self: f'{name}.{self.name}' # type: ignore - if comparable: - cls.__le__ = lambda self, other: isinstance(other, self.__class__) and self.value <= other.value # type: ignore - cls.__ge__ = lambda self, other: isinstance(other, self.__class__) and self.value >= other.value # type: ignore - cls.__lt__ = lambda self, other: isinstance(other, self.__class__) and self.value < other.value # type: ignore - cls.__gt__ = lambda self, other: isinstance(other, self.__class__) and self.value > other.value # type: ignore - return cls - - -def _is_descriptor(obj): - return hasattr(obj, '__get__') or hasattr(obj, '__set__') or hasattr(obj, '__delete__') - - -class EnumMeta(type): - if TYPE_CHECKING: - __name__: ClassVar[str] - _enum_member_names_: ClassVar[List[str]] - _enum_member_map_: ClassVar[Dict[str, Any]] - _enum_value_map_: ClassVar[Dict[Any, Any]] - - def __new__(cls, name: str, bases: Tuple[type, ...], attrs: Dict[str, Any], *, comparable: bool = False) -> Self: - value_mapping = {} - member_mapping = {} - member_names = [] - - value_cls = _create_value_cls(name, comparable) - for key, value in list(attrs.items()): - is_descriptor = _is_descriptor(value) - if key[0] == '_' and not is_descriptor: - continue - - # Special case classmethod to just pass through - if isinstance(value, classmethod): - continue - - if is_descriptor: - setattr(value_cls, key, value) - del attrs[key] - continue - - try: - new_value = value_mapping[value] - except KeyError: - new_value = value_cls(name=key, value=value) - value_mapping[value] = new_value - member_names.append(key) - - member_mapping[key] = new_value - attrs[key] = new_value - - attrs['_enum_value_map_'] = value_mapping - attrs['_enum_member_map_'] = member_mapping - attrs['_enum_member_names_'] = member_names - attrs['_enum_value_cls_'] = value_cls - actual_cls = super().__new__(cls, name, bases, attrs) - value_cls._actual_enum_cls_ = actual_cls # type: ignore # Runtime attribute isn't understood - return actual_cls - - def __iter__(cls) -> Iterator[Any]: - return (cls._enum_member_map_[name] for name in cls._enum_member_names_) - - def __reversed__(cls) -> Iterator[Any]: - return (cls._enum_member_map_[name] for name in reversed(cls._enum_member_names_)) - - def __len__(cls) -> int: - return len(cls._enum_member_names_) - - def __repr__(cls) -> str: - return f'' - - @property - def __members__(cls) -> Mapping[str, Any]: - return types.MappingProxyType(cls._enum_member_map_) - - def __call__(cls, value: str) -> Any: - try: - return cls._enum_value_map_[value] - except (KeyError, TypeError): - raise ValueError(f"{value!r} is not a valid {cls.__name__}") - - def __getitem__(cls, key: str) -> Any: - return cls._enum_member_map_[key] - - def __setattr__(cls, name: str, value: Any) -> None: - raise TypeError('Enums are immutable.') - - def __delattr__(cls, attr: str) -> None: - raise TypeError('Enums are immutable') - - def __instancecheck__(self, instance: Any) -> bool: - # isinstance(x, Y) - # -> __instancecheck__(Y, x) - try: - return instance._actual_enum_cls_ is self - except AttributeError: - return False - - -if TYPE_CHECKING: - from enum import Enum -else: - - class Enum(metaclass=EnumMeta): - @classmethod - def try_value(cls, value): - try: - return cls._enum_value_map_[value] - except (KeyError, TypeError): - return value - - -class ChannelType(Enum): - text = 0 - private = 1 - voice = 2 - group = 3 - category = 4 - news = 5 - news_thread = 10 - public_thread = 11 - private_thread = 12 - stage_voice = 13 - forum = 15 - - def __str__(self) -> str: - return self.name - - -class MessageType(Enum): - default = 0 - recipient_add = 1 - recipient_remove = 2 - call = 3 - channel_name_change = 4 - channel_icon_change = 5 - pins_add = 6 - new_member = 7 - premium_guild_subscription = 8 - premium_guild_tier_1 = 9 - premium_guild_tier_2 = 10 - premium_guild_tier_3 = 11 - channel_follow_add = 12 - guild_stream = 13 - guild_discovery_disqualified = 14 - guild_discovery_requalified = 15 - guild_discovery_grace_period_initial_warning = 16 - guild_discovery_grace_period_final_warning = 17 - thread_created = 18 - reply = 19 - chat_input_command = 20 - thread_starter_message = 21 - guild_invite_reminder = 22 - context_menu_command = 23 - auto_moderation_action = 24 - - -class SpeakingState(Enum): - none = 0 - voice = 1 - soundshare = 2 - priority = 4 - - def __str__(self) -> str: - return self.name - - def __int__(self) -> int: - return self.value - - -class VerificationLevel(Enum, comparable=True): - none = 0 - low = 1 - medium = 2 - high = 3 - highest = 4 - - def __str__(self) -> str: - return self.name - - -class ContentFilter(Enum, comparable=True): - disabled = 0 - no_role = 1 - all_members = 2 - - def __str__(self) -> str: - return self.name - - -class Status(Enum): - online = 'online' - offline = 'offline' - idle = 'idle' - dnd = 'dnd' - do_not_disturb = 'dnd' - invisible = 'invisible' - - def __str__(self) -> str: - return self.value - - -class DefaultAvatar(Enum): - blurple = 0 - grey = 1 - gray = 1 - green = 2 - orange = 3 - red = 4 - - def __str__(self) -> str: - return self.name - - -class NotificationLevel(Enum, comparable=True): - all_messages = 0 - only_mentions = 1 - - -class AuditLogActionCategory(Enum): - create = 1 - delete = 2 - update = 3 - - -class AuditLogAction(Enum): - # fmt: off - guild_update = 1 - channel_create = 10 - channel_update = 11 - channel_delete = 12 - overwrite_create = 13 - overwrite_update = 14 - overwrite_delete = 15 - kick = 20 - member_prune = 21 - ban = 22 - unban = 23 - member_update = 24 - member_role_update = 25 - member_move = 26 - member_disconnect = 27 - bot_add = 28 - role_create = 30 - role_update = 31 - role_delete = 32 - invite_create = 40 - invite_update = 41 - invite_delete = 42 - webhook_create = 50 - webhook_update = 51 - webhook_delete = 52 - emoji_create = 60 - emoji_update = 61 - emoji_delete = 62 - message_delete = 72 - message_bulk_delete = 73 - message_pin = 74 - message_unpin = 75 - integration_create = 80 - integration_update = 81 - integration_delete = 82 - stage_instance_create = 83 - stage_instance_update = 84 - stage_instance_delete = 85 - sticker_create = 90 - sticker_update = 91 - sticker_delete = 92 - scheduled_event_create = 100 - scheduled_event_update = 101 - scheduled_event_delete = 102 - thread_create = 110 - thread_update = 111 - thread_delete = 112 - app_command_permission_update = 121 - automod_rule_create = 140 - automod_rule_update = 141 - automod_rule_delete = 142 - automod_block_message = 143 - # fmt: on - - @property - def category(self) -> Optional[AuditLogActionCategory]: - # fmt: off - lookup: Dict[AuditLogAction, Optional[AuditLogActionCategory]] = { - AuditLogAction.guild_update: AuditLogActionCategory.update, - AuditLogAction.channel_create: AuditLogActionCategory.create, - AuditLogAction.channel_update: AuditLogActionCategory.update, - AuditLogAction.channel_delete: AuditLogActionCategory.delete, - AuditLogAction.overwrite_create: AuditLogActionCategory.create, - AuditLogAction.overwrite_update: AuditLogActionCategory.update, - AuditLogAction.overwrite_delete: AuditLogActionCategory.delete, - AuditLogAction.kick: None, - AuditLogAction.member_prune: None, - AuditLogAction.ban: None, - AuditLogAction.unban: None, - AuditLogAction.member_update: AuditLogActionCategory.update, - AuditLogAction.member_role_update: AuditLogActionCategory.update, - AuditLogAction.member_move: None, - AuditLogAction.member_disconnect: None, - AuditLogAction.bot_add: None, - AuditLogAction.role_create: AuditLogActionCategory.create, - AuditLogAction.role_update: AuditLogActionCategory.update, - AuditLogAction.role_delete: AuditLogActionCategory.delete, - AuditLogAction.invite_create: AuditLogActionCategory.create, - AuditLogAction.invite_update: AuditLogActionCategory.update, - AuditLogAction.invite_delete: AuditLogActionCategory.delete, - AuditLogAction.webhook_create: AuditLogActionCategory.create, - AuditLogAction.webhook_update: AuditLogActionCategory.update, - AuditLogAction.webhook_delete: AuditLogActionCategory.delete, - AuditLogAction.emoji_create: AuditLogActionCategory.create, - AuditLogAction.emoji_update: AuditLogActionCategory.update, - AuditLogAction.emoji_delete: AuditLogActionCategory.delete, - AuditLogAction.message_delete: AuditLogActionCategory.delete, - AuditLogAction.message_bulk_delete: AuditLogActionCategory.delete, - AuditLogAction.message_pin: None, - AuditLogAction.message_unpin: None, - AuditLogAction.integration_create: AuditLogActionCategory.create, - AuditLogAction.integration_update: AuditLogActionCategory.update, - AuditLogAction.integration_delete: AuditLogActionCategory.delete, - AuditLogAction.stage_instance_create: AuditLogActionCategory.create, - AuditLogAction.stage_instance_update: AuditLogActionCategory.update, - AuditLogAction.stage_instance_delete: AuditLogActionCategory.delete, - AuditLogAction.sticker_create: AuditLogActionCategory.create, - AuditLogAction.sticker_update: AuditLogActionCategory.update, - AuditLogAction.sticker_delete: AuditLogActionCategory.delete, - AuditLogAction.scheduled_event_create: AuditLogActionCategory.create, - AuditLogAction.scheduled_event_update: AuditLogActionCategory.update, - AuditLogAction.scheduled_event_delete: AuditLogActionCategory.delete, - AuditLogAction.thread_create: AuditLogActionCategory.create, - AuditLogAction.thread_delete: AuditLogActionCategory.delete, - AuditLogAction.thread_update: AuditLogActionCategory.update, - AuditLogAction.app_command_permission_update: AuditLogActionCategory.update, - AuditLogAction.automod_rule_create: AuditLogActionCategory.create, - AuditLogAction.automod_rule_update: AuditLogActionCategory.update, - AuditLogAction.automod_rule_delete: AuditLogActionCategory.delete, - AuditLogAction.automod_block_message: None, - } - # fmt: on - return lookup[self] - - @property - def target_type(self) -> Optional[str]: - v = self.value - if v == -1: - return 'all' - elif v < 10: - return 'guild' - elif v < 20: - return 'channel' - elif v < 30: - return 'user' - elif v < 40: - return 'role' - elif v < 50: - return 'invite' - elif v < 60: - return 'webhook' - elif v < 70: - return 'emoji' - elif v == 73: - return 'channel' - elif v < 80: - return 'message' - elif v < 83: - return 'integration' - elif v < 90: - return 'stage_instance' - elif v < 93: - return 'sticker' - elif v < 103: - return 'guild_scheduled_event' - elif v < 113: - return 'thread' - elif v < 122: - return 'integration_or_app_command' - elif v < 143: - return 'auto_moderation' - elif v == 143: - return 'user' - - -class UserFlags(Enum): - staff = 1 - partner = 2 - hypesquad = 4 - bug_hunter = 8 - mfa_sms = 16 - premium_promo_dismissed = 32 - hypesquad_bravery = 64 - hypesquad_brilliance = 128 - hypesquad_balance = 256 - early_supporter = 512 - team_user = 1024 - system = 4096 - has_unread_urgent_messages = 8192 - bug_hunter_level_2 = 16384 - verified_bot = 65536 - verified_bot_developer = 131072 - discord_certified_moderator = 262144 - bot_http_interactions = 524288 - spammer = 1048576 - - -class ActivityType(Enum): - unknown = -1 - playing = 0 - streaming = 1 - listening = 2 - watching = 3 - custom = 4 - competing = 5 - - def __int__(self) -> int: - return self.value - - -class TeamMembershipState(Enum): - invited = 1 - accepted = 2 - - -class WebhookType(Enum): - incoming = 1 - channel_follower = 2 - application = 3 - - -class ExpireBehaviour(Enum): - remove_role = 0 - kick = 1 - - -ExpireBehavior = ExpireBehaviour - - -class StickerType(Enum): - standard = 1 - guild = 2 - - -class StickerFormatType(Enum): - png = 1 - apng = 2 - lottie = 3 - - @property - def file_extension(self) -> str: - # fmt: off - lookup: Dict[StickerFormatType, str] = { - StickerFormatType.png: 'png', - StickerFormatType.apng: 'png', - StickerFormatType.lottie: 'json', - } - # fmt: on - return lookup[self] - - -class InviteTarget(Enum): - unknown = 0 - stream = 1 - embedded_application = 2 - - -class InteractionType(Enum): - ping = 1 - application_command = 2 - component = 3 - autocomplete = 4 - modal_submit = 5 - - -class InteractionResponseType(Enum): - pong = 1 - # ack = 2 (deprecated) - # channel_message = 3 (deprecated) - channel_message = 4 # (with source) - deferred_channel_message = 5 # (with source) - deferred_message_update = 6 # for components - message_update = 7 # for components - autocomplete_result = 8 - modal = 9 # for modals - - -class VideoQualityMode(Enum): - auto = 1 - full = 2 - - def __int__(self) -> int: - return self.value - - -class ComponentType(Enum): - action_row = 1 - button = 2 - select = 3 - text_input = 4 - - def __int__(self) -> int: - return self.value - - -class ButtonStyle(Enum): - primary = 1 - secondary = 2 - success = 3 - danger = 4 - link = 5 - - # Aliases - blurple = 1 - grey = 2 - gray = 2 - green = 3 - red = 4 - url = 5 - - def __int__(self) -> int: - return self.value - - -class TextStyle(Enum): - short = 1 - paragraph = 2 - - # Aliases - long = 2 - - def __int__(self) -> int: - return self.value - - -class PrivacyLevel(Enum): - guild_only = 2 - - -class NSFWLevel(Enum, comparable=True): - default = 0 - explicit = 1 - safe = 2 - age_restricted = 3 - - -class MFALevel(Enum, comparable=True): - disabled = 0 - require_2fa = 1 - - -class Locale(Enum): - american_english = 'en-US' - british_english = 'en-GB' - bulgarian = 'bg' - chinese = 'zh-CN' - taiwan_chinese = 'zh-TW' - croatian = 'hr' - czech = 'cs' - danish = 'da' - dutch = 'nl' - finnish = 'fi' - french = 'fr' - german = 'de' - greek = 'el' - hindi = 'hi' - hungarian = 'hu' - italian = 'it' - japanese = 'ja' - korean = 'ko' - lithuanian = 'lt' - norwegian = 'no' - polish = 'pl' - brazil_portuguese = 'pt-BR' - romanian = 'ro' - russian = 'ru' - spain_spanish = 'es-ES' - swedish = 'sv-SE' - thai = 'th' - turkish = 'tr' - ukrainian = 'uk' - vietnamese = 'vi' - - def __str__(self) -> str: - return self.value - - -E = TypeVar('E', bound='Enum') - - -class EntityType(Enum): - stage_instance = 1 - voice = 2 - external = 3 - - -class EventStatus(Enum): - scheduled = 1 - active = 2 - completed = 3 - canceled = 4 - - ended = 3 - cancelled = 4 - - -class AppCommandOptionType(Enum): - subcommand = 1 - subcommand_group = 2 - string = 3 - integer = 4 - boolean = 5 - user = 6 - channel = 7 - role = 8 - mentionable = 9 - number = 10 - attachment = 11 - - -class AppCommandType(Enum): - chat_input = 1 - user = 2 - message = 3 - - -class AppCommandPermissionType(Enum): - role = 1 - user = 2 - channel = 3 - - -class AutoModRuleTriggerType(Enum): - keyword = 1 - harmful_link = 2 - spam = 3 - keyword_preset = 4 - mention_spam = 5 - - -class AutoModRuleEventType(Enum): - message_send = 1 - - -class AutoModRuleActionType(Enum): - block_message = 1 - send_alert_message = 2 - timeout = 3 - - -def create_unknown_value(cls: Type[E], val: Any) -> E: - value_cls = cls._enum_value_cls_ # type: ignore # This is narrowed below - name = f'unknown_{val}' - return value_cls(name=name, value=val) - - -def try_enum(cls: Type[E], val: Any) -> E: - """A function that tries to turn the value into enum ``cls``. - - If it fails it returns a proxy invalid value instead. - """ - - try: - return cls._enum_value_map_[val] # type: ignore # All errors are caught below - except (KeyError, TypeError, AttributeError): - return create_unknown_value(cls, val) diff --git a/.venv/Lib/site-packages/discord/errors.py b/.venv/Lib/site-packages/discord/errors.py deleted file mode 100644 index 6035ace..0000000 --- a/.venv/Lib/site-packages/discord/errors.py +++ /dev/null @@ -1,280 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations -from typing import Dict, List, Optional, TYPE_CHECKING, Any, Tuple, Union - -if TYPE_CHECKING: - from aiohttp import ClientResponse, ClientWebSocketResponse - from requests import Response - - _ResponseType = Union[ClientResponse, Response] - - from .interactions import Interaction - -__all__ = ( - 'DiscordException', - 'ClientException', - 'GatewayNotFound', - 'HTTPException', - 'RateLimited', - 'Forbidden', - 'NotFound', - 'DiscordServerError', - 'InvalidData', - 'LoginFailure', - 'ConnectionClosed', - 'PrivilegedIntentsRequired', - 'InteractionResponded', -) - - -class DiscordException(Exception): - """Base exception class for discord.py - - Ideally speaking, this could be caught to handle any exceptions raised from this library. - """ - - pass - - -class ClientException(DiscordException): - """Exception that's raised when an operation in the :class:`Client` fails. - - These are usually for exceptions that happened due to user input. - """ - - pass - - -class GatewayNotFound(DiscordException): - """An exception that is raised when the gateway for Discord could not be found""" - - def __init__(self): - message = 'The gateway to connect to discord was not found.' - super().__init__(message) - - -def _flatten_error_dict(d: Dict[str, Any], key: str = '') -> Dict[str, str]: - items: List[Tuple[str, str]] = [] - for k, v in d.items(): - new_key = key + '.' + k if key else k - - if isinstance(v, dict): - try: - _errors: List[Dict[str, Any]] = v['_errors'] - except KeyError: - items.extend(_flatten_error_dict(v, new_key).items()) - else: - items.append((new_key, ' '.join(x.get('message', '') for x in _errors))) - else: - items.append((new_key, v)) - - return dict(items) - - -class HTTPException(DiscordException): - """Exception that's raised when an HTTP request operation fails. - - Attributes - ------------ - response: :class:`aiohttp.ClientResponse` - The response of the failed HTTP request. This is an - instance of :class:`aiohttp.ClientResponse`. In some cases - this could also be a :class:`requests.Response`. - - text: :class:`str` - The text of the error. Could be an empty string. - status: :class:`int` - The status code of the HTTP request. - code: :class:`int` - The Discord specific error code for the failure. - """ - - def __init__(self, response: _ResponseType, message: Optional[Union[str, Dict[str, Any]]]): - self.response: _ResponseType = response - self.status: int = response.status # type: ignore # This attribute is filled by the library even if using requests - self.code: int - self.text: str - if isinstance(message, dict): - self.code = message.get('code', 0) - base = message.get('message', '') - errors = message.get('errors') - self._errors: Optional[Dict[str, Any]] = errors - if errors: - errors = _flatten_error_dict(errors) - helpful = '\n'.join('In %s: %s' % t for t in errors.items()) - self.text = base + '\n' + helpful - else: - self.text = base - else: - self.text = message or '' - self.code = 0 - - fmt = '{0.status} {0.reason} (error code: {1})' - if len(self.text): - fmt += ': {2}' - - super().__init__(fmt.format(self.response, self.code, self.text)) - - -class RateLimited(DiscordException): - """Exception that's raised for when status code 429 occurs - and the timeout is greater than the configured maximum using - the ``max_ratelimit_timeout`` parameter in :class:`Client`. - - This is not raised during global ratelimits. - - Since sometimes requests are halted pre-emptively before they're - even made, this **does not** subclass :exc:`HTTPException`. - - .. versionadded:: 2.0 - - Attributes - ------------ - retry_after: :class:`float` - The amount of seconds that the client should wait before retrying - the request. - """ - - def __init__(self, retry_after: float): - self.retry_after = retry_after - super().__init__(f'Too many requests. Retry in {retry_after:.2f} seconds.') - - -class Forbidden(HTTPException): - """Exception that's raised for when status code 403 occurs. - - Subclass of :exc:`HTTPException` - """ - - pass - - -class NotFound(HTTPException): - """Exception that's raised for when status code 404 occurs. - - Subclass of :exc:`HTTPException` - """ - - pass - - -class DiscordServerError(HTTPException): - """Exception that's raised for when a 500 range status code occurs. - - Subclass of :exc:`HTTPException`. - - .. versionadded:: 1.5 - """ - - pass - - -class InvalidData(ClientException): - """Exception that's raised when the library encounters unknown - or invalid data from Discord. - """ - - pass - - -class LoginFailure(ClientException): - """Exception that's raised when the :meth:`Client.login` function - fails to log you in from improper credentials or some other misc. - failure. - """ - - pass - - -class ConnectionClosed(ClientException): - """Exception that's raised when the gateway connection is - closed for reasons that could not be handled internally. - - Attributes - ----------- - code: :class:`int` - The close code of the websocket. - reason: :class:`str` - The reason provided for the closure. - shard_id: Optional[:class:`int`] - The shard ID that got closed if applicable. - """ - - def __init__(self, socket: ClientWebSocketResponse, *, shard_id: Optional[int], code: Optional[int] = None): - # This exception is just the same exception except - # reconfigured to subclass ClientException for users - self.code: int = code or socket.close_code or -1 - # aiohttp doesn't seem to consistently provide close reason - self.reason: str = '' - self.shard_id: Optional[int] = shard_id - super().__init__(f'Shard ID {self.shard_id} WebSocket closed with {self.code}') - - -class PrivilegedIntentsRequired(ClientException): - """Exception that's raised when the gateway is requesting privileged intents - but they're not ticked in the developer page yet. - - Go to https://discord.com/developers/applications/ and enable the intents - that are required. Currently these are as follows: - - - :attr:`Intents.members` - - :attr:`Intents.presences` - - :attr:`Intents.message_content` - - Attributes - ----------- - shard_id: Optional[:class:`int`] - The shard ID that got closed if applicable. - """ - - def __init__(self, shard_id: Optional[int]): - self.shard_id: Optional[int] = shard_id - msg = ( - 'Shard ID %s is requesting privileged intents that have not been explicitly enabled in the ' - 'developer portal. It is recommended to go to https://discord.com/developers/applications/ ' - 'and explicitly enable the privileged intents within your application\'s page. If this is not ' - 'possible, then consider disabling the privileged intents instead.' - ) - super().__init__(msg % shard_id) - - -class InteractionResponded(ClientException): - """Exception that's raised when sending another interaction response using - :class:`InteractionResponse` when one has already been done before. - - An interaction can only respond once. - - .. versionadded:: 2.0 - - Attributes - ----------- - interaction: :class:`Interaction` - The interaction that's already been responded to. - """ - - def __init__(self, interaction: Interaction): - self.interaction: Interaction = interaction - super().__init__('This interaction has already been responded to before') diff --git a/.venv/Lib/site-packages/discord/ext/commands/__init__.py b/.venv/Lib/site-packages/discord/ext/commands/__init__.py deleted file mode 100644 index 08dab54..0000000 --- a/.venv/Lib/site-packages/discord/ext/commands/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -""" -discord.ext.commands -~~~~~~~~~~~~~~~~~~~~~ - -An extension module to facilitate creation of bot commands. - -:copyright: (c) 2015-present Rapptz -:license: MIT, see LICENSE for more details. -""" - -from .bot import * -from .cog import * -from .context import * -from .converter import * -from .cooldowns import * -from .core import * -from .errors import * -from .flags import * -from .help import * -from .parameters import * -from .hybrid import * diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/__init__.cpython-38.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 9f3eb8de0f363a054728e4d85548fde4e65ee1f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 597 zcmZvY&2AGh5P)}+G)Y~0@8w69ohl!)ay~J_iBypO!pU4sqh{LOFHoE)Hl=c#xD&TV{B=)^9%Cj&36UN>dPS3!2 zjfVHA)*bMGd?}>vbPxf!bRfdci%Y)1z#k$OjFl4Y*6DT?O8!L7_{--nUL9Kp9!%gL zgtg(0m7SIp9!mcH{Q4R90Q}5%mpm49=nRac|j)mM&M&*~qMLq6hlm ztMO{Pa9VxM+yUkLqkhSgvcB=;tyk+7U407vHlVF{EkkcR)LgB3Ak){y2F#|u(2LsZ t0LNCyThW5A)8OY+;QV1s^QO^8ho&j)HcnsPkNC~5Pyd+Ih)wf<*KgJevbz8P diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/_types.cpython-38.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/_types.cpython-38.pyc deleted file mode 100644 index 300005e858f42d93af30c229f00f7e7bcbcaa45f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2852 zcmZuzPjlPG6(_(yA|Z;FWZ9NvyV=NzD`pru?X(w9CKHH)BupuiLxOe%%Yy;2D-tn) zWf!1S>FQi_?Wtd&_kJ2&d&*bnslQ!Hij{^C7W>}5_kQos?puvkR*V9E+Qo~Yi`jo9 z@#(Ju;(NU5zqLYv7Tf~Ws2*vt?&@*TEyg9c6qns{TyZP$lDiaF-D+HOYq8-P@v^(D z6uca&1=!) z_=)=jwi?uctxZ;9n{@eH-zvCU$p#P>T!U@0`hv@9w1U-bR%SY$`gsx5Q&ysN_LM z(zQwPzAQMOXe;R#KwYKl3iS)jAF^$_K_C58biV}k7%L0v2_mkI^LnKE)>JERi^EJ+#J1<^E&HlJOIa5BxvZqOuu z{N@jT{(2@@%94x>{MjtKHjF+KahRqdPe_=ODHCjbMJB>eGDchETrfuXISHn|n6MVf zIPsG!GGiiz0v~67n1soM_(lLIDVa@SCgtbZr7swSDe=>k2cZvpgz{h>1KrOg-gy|Y zl<1P}U=zJ~`Kq4tJT#l3}#2;9YNsjdVoJSGAl%WMY zp`na7eQl^(`(u8=R4j|~COm_y3m0SoloN}p-Ylh4AHI*-O~Qa1CWd6)hJ)zl<1|Cz zL*#zOg~I!Fn0vrKw#cw|=)5%t7O{tSV-7*@w8&fAIqr=d0*Qgybxuj| zkeJ<5@)x^%&?44f`vYq@Ge408nU2f!JScCUXru#b)%a@^}2SYYm3@XXxrSPLiw)$W+~ zNsAnqC+3m#Za{jlGBBjr!aMTz*pe)XXX3Bz*uAa{quuK|1CT95IdJY&-`Yc~Ma+Rc zgsaBkpa=6ZozRdu>q@<@wXh;ntrB!s5s1iyjS%#mF9(*{fi0A$drx@J_*q^DO(QRw z$yHu6FMS-Ham4a!8+${|YHcoX>cWKOE6!=(^4iB%8UnXWXL-Y%XMBhTLm34P!KF4w z`}w<^7TbJ+Prc3K7>Cdjf{R@1U$33`S7UbP?>p!HUS5K%bG>p4`VQoK=$6NPo=`-z zFzSeh0KbMsh4Bu7zt2kmcATaz9%C)91^mJnA&x@6e5>UJJiyw$-`(~38f;c@HC&gv+GNDtMOUi^Vfk(PcexdttxiC6M+d&+_jc@5o}h5>pd zlCv5h@g5gIRflj}|LJ#w51oP?m!vHC0VWy4!5#OP+@-5-F%4m1z7bT2aL6A`L17a@UC^IaK9PlY{&> zPb|wp=D=NBsCy_6{vD9_hFFpOB5EuiNHG~)z7#CZfLK$D0iTF<$*(YZ%u;nw#D-j3 zzkl2g=Skp}JRBMqhfZ)8hf8q9ttm;xY}{88k6=l>l;&!3|EcZZmX109keAiL7Eh$a zrW{nkWyMr(ek+N2_1ndc`A$|W{S$`L);GnfUefCNs#ceeUey|S)mK}Uk6zc-wXd{2 Ld>eYBxMBPc`XT;o diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/bot.cpython-38.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/bot.cpython-38.pyc deleted file mode 100644 index f07f2089b7e4313de6b73fa58a675caee49ff785..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46348 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 diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/cog.cpython-38.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/cog.cpython-38.pyc deleted file mode 100644 index 774c279fb617a482e9571f127936c1584b313dfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23822 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

!H^%7tZ;@@njMHV$qkav6{s z5v6wRp9NIF5RHtSwX&Jg3M%A8dys=mRK@O>fK;#iqi0sck&h4z;=|Po7CTxBp<&m7 z73DA~dnfb2ZcB6;nMP!nzzYriOJ=Hrbv5G*M-UlKqElGCh|#m>i-ZIm?IlJ=CJ8`@ z(_|AcCn?P%RK8%n0`&*#0pVeaT}P3mB9<_ia>+g|B})KfCuEE{Y?58?AcDw=mn5si zX2aOAr9&DaSj2h9?zDX@z#^)$8<2V_m5|1Ox<8SaKLrQ~S^n_CtBA%2f_l4Jq%N0S z*_rS{himf&KXZe?{uOMbfS5;nogHjnfq2}i$WOZpDoTn+1Z@54-iJ-eDPUEwmo~M7BStsot5k@@r_+wx#Q6g;= zI2~Yu+Pf6>0(n5)!%T&eR(AR-^eRFK4=>tVcH20t6f@X81s(-|>fmuBkIcvDjhj}F zla6VM{BqYUB;DJ%It1Zx0bY~Fff4AFkFYbdYD_gt?p2Tn+-bwzfjvuEPKhWW)}akL z?3ZRx$OBaEz`yBqB2)wp0ngT%iKUc=#WVEUn~3vl;KpjNXq-G5P)eCc6xK(%LbQy# zVEv-YCyl2kPd*i>!y)W!q>L20kQ482u3QSG|7a0<4V7UtQ2hUhdy*pzSl;p0qNjEx zCv_VzN=hEvoY1mmz(|!BT5TX)W*ROKw+reLP0Qtw&6D$n(lg!SkC8BvZS5wAL}D1b z+g7Sa5Q`z%AEuie=HovQbL3><3GMtCM#&!QrJtitxQv)9{8wK(E2^O z*JZfw6Gr=~jIg{5)6dqu^^fuAg76o4_;(6QC1uEG5Vef{w==NeU%*?cgHY-4(wz9U zJNo&*4DaL9XzV|{|M&dJaN5WmKz!3t#xWsG4F*Bnw7_{!rWg4C^X?+M!&OizcNvM_ zUjmpa7>j^zj#)!8JQZT(K48fYn0%YxaNL`BthDaAKhL}mnfx*n9<22HwfN)rwOi1( z{jmzJzk-k(R+30^i7DqX7!}LT<0|f7VZvx=_ir)z+f06qiFiG@w*H8QTLph-E`XhQ zLJ)VAas`T?#nT3Uy}L*d4R(14*b%P3S9~dx-g|xG!MDEg#fcXWoH%ea^}jQ@UD}nlSCIu!#OnAYFJA%X<3Pent-FAP6IU_-i0A1bL$$O^c z)-Jiu%B9U;T}3s)r~ORSd4Qm<=5L5Dln@b5d0i_kco+$;EQPz$@#G3xbC2?-VhiE| zG+r0)$t9ugQ5Jue2}4$*fvxk#GWU7rjRqaoNp@Y=NEE~oD44L1F^|Wc`KP4hDnR!I zW=#ZHiP-oT`6+Bx5p(yYL=!a0xi2$oJZK`Ythlc*do0M-(xiJFx$cR?CoSu^ll*j& zp9(>(cGdk1GmZoq0xR5b658WEcZ$`xOXQDyxqpLC42<*(Tfr?tp8F~@`V^#3^Ld2# z=!L;#?rY4$mW5IXg!-3wlYNV`XQkNRsKci>`ROetpJVbRCTEcNS)h#>{P{Q@CKhy! zxfEqfaX0w`Z>v8Wgg*z0Ewz9oe{dKnK diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/converter.cpython-38.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/converter.cpython-38.pyc deleted file mode 100644 index e089834268346032a203db09cc379b78131b2488..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39117 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 diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/cooldowns.cpython-38.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/cooldowns.cpython-38.pyc deleted file mode 100644 index 2681bf4e9f83bd27f924b674070a0a513af72f01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10406 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 diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/core.cpython-38.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/core.cpython-38.pyc deleted file mode 100644 index b43d3c585a06aedd7db0045467e127c288aaf5dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74716 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 diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/errors.cpython-38.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/errors.cpython-38.pyc deleted file mode 100644 index ed5ac3936b59e7ddb34bd366b76938cf849e732e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42847 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 diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/flags.cpython-38.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/flags.cpython-38.pyc deleted file mode 100644 index cc7b93850c2a0791a83028888d228ce282426454..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17170 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%0DpC$0`=?hF6v=Gex(KY? z7gjmhiP*S=V_LoqCq7Q1DSitavm7zOB0|WE4k*c{fk9?N^ z?iYo`R{eXV|KyfNqIHb3UWkd~RL7z&X5&K(11Z%G;BjQYR`FXMNC?m^w7-xBGb}SP zzpo=_;ulJ$=~LDNUmhS|-T*5-%#Rso^;lavwDf*p1-q#K_gn#i5i7@=``7SP2g%cz zbOH{GYE|!9TF8&DzK=lZy(wm zGEs0=(?5$0(Iwu`+vBoLi6BY2Z6md7ty;2Skkw*6DjnruL?`ip*`3F){t*+3wr~!^ z0RS7g1iAq`UT2MHMEm!Y)(ukUV(~x38*4y=X^kD&*mfiJ*EkL(EQ~24hzP-gQ7Ghx zvJ#i|+gujK9y*;v*s5X5qbiz+UCg)7?<50+plyI}tIJS3k%QW5wUy2k9Lg5TGEgcK zP-ezE@9ZHZAz~!7ESFWHlXo^Df@ewxN@@Su2;hKX*}ErceMw{yvO6x?=q=)59K?k8 zQTCs>MHI{o$Vv1N(HAs?Z_7EbT^*Lx@yI=oUQa##1ow&BrfcpQVhe}#^hx%CP>%R= zVfP?UJuo&B8%bD{af6ViKBEgYJ^#dX4vkDzEdo;Y z+`Uf6C+4{)=3CII7!M&-N#pH5=Ihsxw9%D%I>Z4zyTBnJ0Acmme;fl~n9frWRyS&m z3fYw_c!hE8$T1j4n+OgeFAq0|?*(pM6%)WYL$rkkCCH24A?~DL=SbrXP9da;Js|BP z6I%Ii(WAZxz3q_+`*Dsj5PNCY!qN4G8MOe1Lk6~%J{bCw(6d(HYUzVs1+zcwBz*AUVL` z>iGxs{10KC??Qk!XFnGPN5g=2xBjnCFx)9QFRGosgrmfS!Grz|T4-TjWgI-H7J`ketcmveWF`=O$N=enkkiP!36fr=XmZ7d~v(OK!8Wfui z1|Kx)g`B*uf?sOiWD3H0c^%G158icHtzdo%Ie`$^9p+?GA;$;kZJ!8Y+IRimiNSvs z%?+_o!Uh2=L>lB5)=wG_X^{Y>$wM3C+bHxgv46q`4bxMCc2Jm~L{G~j4@+pGb$tIt z?3oRYRUvj_923k3>FInZuMqQhiTO~=HQ6TiwlN=M95(^)Ak?%XB1Xu(eF~VK{+0>M zgWe9zqnp&lsV9MXpXxJz0PdyU3(^lHT&#XR$e<((lK)ANW9|XS5JBZkJg2{DeA8ToI~M9JB4%h2X}9Do!x-mv zI3EGSPNvf{qkBq>OS<%5xSjmXSlHE&C@SOUR_hIfs)$-z4&)a;U3FD7r;fbZ)*^|6 zv5?pk`G0-CE<#F^M7GfJ*tg;c*q;O>EVp;UpRz5`keZKr@}EWVab3E`X3g0S+c5bNDo0dhQs=JgJ) zRnJb>L!-x`()%vU;dRJvw-*5WK^&~3BZVMf2sEO)LAUDeQk#sCf*oSa6pwy^cZ@=m zFlHF40)q^>jf1ebYnB|Fsc5(X$GVG$B5`@#7QMRS92ukf=Sa$s#6&t4raZB4dH4;R zoW#?3^28DKyBtFVC=sP@@KvZLrE*27U;R@iA{OM13M>>kF%8miGwJ zZ!w{0sQx7r*~8ywu1obLCkON_Dt?_LpY9KM51zBkp(MVE0i+{&N#DTlMc59`&m3mc zzjU22=O@0V1P;V>t#0AhLwl9vorrJd>kH;Iigz^tEkY zEc${xf)rxF=kn>1#04rA3&R?;qPQ|?Xz@kAP|wL&MF#u$%8@QOd6F#k1-{wT?Xg9$ z&ZyHU&=GWUCob~!>r5(4ZZp|n@@q_fgNa}#H~MKO1uwI<$-RZsGJFn~9M2PR@Hb?B s4V*X+M-P0GnIyQb_#6{B$k+D8h5yibbtpN~Ke{}0YwXzAiSg(D4|17b2><{9 diff --git a/.venv/Lib/site-packages/discord/ext/commands/__pycache__/help.cpython-38.pyc b/.venv/Lib/site-packages/discord/ext/commands/__pycache__/help.cpython-38.pyc deleted file mode 100644 index ddfef82e3c924ea76822f62015204f68054fdec8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53593 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 T: - ... - - -# This is merely a tag type to avoid circular import issues. -# Yes, this is a terrible solution but ultimately it is the only solution. -class _BaseCommand: - __slots__ = () diff --git a/.venv/Lib/site-packages/discord/ext/commands/bot.py b/.venv/Lib/site-packages/discord/ext/commands/bot.py deleted file mode 100644 index 050e2c4..0000000 --- a/.venv/Lib/site-packages/discord/ext/commands/bot.py +++ /dev/null @@ -1,1497 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - - -import asyncio -import collections -import collections.abc -import inspect -import importlib.util -import sys -import logging -import types -from typing import ( - Any, - Callable, - Mapping, - List, - Dict, - TYPE_CHECKING, - Optional, - TypeVar, - Type, - Union, - Iterable, - Collection, - overload, -) - -import discord -from discord import app_commands -from discord.app_commands.tree import _retrieve_guild_ids -from discord.utils import MISSING, _is_submodule - -from .core import GroupMixin -from .view import StringView -from .context import Context -from . import errors -from .help import HelpCommand, DefaultHelpCommand -from .cog import Cog -from .hybrid import hybrid_command, hybrid_group, HybridCommand, HybridGroup - -if TYPE_CHECKING: - from typing_extensions import Self - - import importlib.machinery - - from discord.message import Message - from discord.interactions import Interaction - from discord.abc import User, Snowflake - from ._types import ( - _Bot, - BotT, - UserCheck, - CoroFunc, - ContextT, - MaybeAwaitableFunc, - ) - from .core import Command - from .hybrid import CommandCallback, ContextT, P - - _Prefix = Union[Iterable[str], str] - _PrefixCallable = MaybeAwaitableFunc[[BotT, Message], _Prefix] - PrefixType = Union[_Prefix, _PrefixCallable[BotT]] - -__all__ = ( - 'when_mentioned', - 'when_mentioned_or', - 'Bot', - 'AutoShardedBot', -) - -T = TypeVar('T') -CFT = TypeVar('CFT', bound='CoroFunc') - -_log = logging.getLogger(__name__) - - -def when_mentioned(bot: _Bot, msg: Message, /) -> List[str]: - """A callable that implements a command prefix equivalent to being mentioned. - - These are meant to be passed into the :attr:`.Bot.command_prefix` attribute. - - .. versionchanged:: 2.0 - - ``bot`` and ``msg`` parameters are now positional-only. - """ - # bot.user will never be None when this is called - return [f'<@{bot.user.id}> ', f'<@!{bot.user.id}> '] # type: ignore - - -def when_mentioned_or(*prefixes: str) -> Callable[[_Bot, Message], List[str]]: - """A callable that implements when mentioned or other prefixes provided. - - These are meant to be passed into the :attr:`.Bot.command_prefix` attribute. - - Example - -------- - - .. code-block:: python3 - - bot = commands.Bot(command_prefix=commands.when_mentioned_or('!')) - - - .. note:: - - This callable returns another callable, so if this is done inside a custom - callable, you must call the returned callable, for example: - - .. code-block:: python3 - - async def get_prefix(bot, message): - extras = await prefixes_for(message.guild) # returns a list - return commands.when_mentioned_or(*extras)(bot, message) - - - See Also - ---------- - :func:`.when_mentioned` - """ - - def inner(bot, msg): - r = list(prefixes) - r = when_mentioned(bot, msg) + r - return r - - return inner - - -class _DefaultRepr: - def __repr__(self): - return '' - - -_default: Any = _DefaultRepr() - - -class BotBase(GroupMixin[None]): - def __init__( - self, - command_prefix: PrefixType[BotT], - *, - help_command: Optional[HelpCommand] = _default, - tree_cls: Type[app_commands.CommandTree[Any]] = app_commands.CommandTree, - description: Optional[str] = None, - intents: discord.Intents, - **options: Any, - ) -> None: - super().__init__(intents=intents, **options) - self.command_prefix: PrefixType[BotT] = command_prefix - self.extra_events: Dict[str, List[CoroFunc]] = {} - # Self doesn't have the ClientT bound, but since this is a mixin it technically does - self.__tree: app_commands.CommandTree[Self] = tree_cls(self) # type: ignore - self.__cogs: Dict[str, Cog] = {} - self.__extensions: Dict[str, types.ModuleType] = {} - self._checks: List[UserCheck] = [] - self._check_once: List[UserCheck] = [] - self._before_invoke: Optional[CoroFunc] = None - self._after_invoke: Optional[CoroFunc] = None - self._help_command: Optional[HelpCommand] = None - self.description: str = inspect.cleandoc(description) if description else '' - self.owner_id: Optional[int] = options.get('owner_id') - self.owner_ids: Optional[Collection[int]] = options.get('owner_ids', set()) - self.strip_after_prefix: bool = options.get('strip_after_prefix', False) - - if self.owner_id and self.owner_ids: - raise TypeError('Both owner_id and owner_ids are set.') - - if self.owner_ids and not isinstance(self.owner_ids, collections.abc.Collection): - raise TypeError(f'owner_ids must be a collection not {self.owner_ids.__class__!r}') - - if help_command is _default: - self.help_command = DefaultHelpCommand() - else: - self.help_command = help_command - - # internal helpers - - async def _async_setup_hook(self) -> None: - # self/super() resolves to Client/AutoShardedClient - await super()._async_setup_hook() # type: ignore - prefix = self.command_prefix - - # This has to be here because for the default logging set up to capture - # the logging calls, they have to come after the `Client.run` call. - # The best place to do this is in an async init scenario - if not self.intents.message_content: # type: ignore - trigger_warning = ( - (callable(prefix) and prefix is not when_mentioned) - or isinstance(prefix, str) - or (isinstance(prefix, collections.abc.Iterable) and len(list(prefix)) >= 1) - ) - if trigger_warning: - _log.warning('Privileged message content intent is missing, commands may not work as expected.') - - def dispatch(self, event_name: str, /, *args: Any, **kwargs: Any) -> None: - # super() will resolve to Client - super().dispatch(event_name, *args, **kwargs) # type: ignore - ev = 'on_' + event_name - for event in self.extra_events.get(ev, []): - self._schedule_event(event, ev, *args, **kwargs) # type: ignore - - @discord.utils.copy_doc(discord.Client.close) - async def close(self) -> None: - for extension in tuple(self.__extensions): - try: - await self.unload_extension(extension) - except Exception: - pass - - for cog in tuple(self.__cogs): - try: - await self.remove_cog(cog) - except Exception: - pass - - await super().close() # type: ignore - - # GroupMixin overrides - - @discord.utils.copy_doc(GroupMixin.add_command) - def add_command(self, command: Command[Any, ..., Any], /) -> None: - super().add_command(command) - if isinstance(command, (HybridCommand, HybridGroup)) and command.app_command: - # If a cog is also inheriting from app_commands.Group then it'll also - # add the hybrid commands as text commands, which would recursively add the - # hybrid commands as slash commands. This check just terminates that recursion - # from happening - if command.cog is None or not command.cog.__cog_is_app_commands_group__: - self.tree.add_command(command.app_command) - - @discord.utils.copy_doc(GroupMixin.remove_command) - def remove_command(self, name: str, /) -> Optional[Command[Any, ..., Any]]: - cmd: Optional[Command[Any, ..., Any]] = super().remove_command(name) - if isinstance(cmd, (HybridCommand, HybridGroup)) and cmd.app_command: - # See above - if cmd.cog is not None and cmd.cog.__cog_is_app_commands_group__: - return cmd - - guild_ids: Optional[List[int]] = cmd.app_command._guild_ids - if guild_ids is None: - self.__tree.remove_command(name) - else: - for guild_id in guild_ids: - self.__tree.remove_command(name, guild=discord.Object(id=guild_id)) - - return cmd - - def hybrid_command( - self, - name: Union[str, app_commands.locale_str] = MISSING, - with_app_command: bool = True, - *args: Any, - **kwargs: Any, - ) -> Callable[[CommandCallback[Any, ContextT, P, T]], HybridCommand[Any, P, T]]: - """A shortcut decorator that invokes :func:`~discord.ext.commands.hybrid_command` and adds it to - the internal command list via :meth:`add_command`. - - Returns - -------- - Callable[..., :class:`HybridCommand`] - A decorator that converts the provided method into a Command, adds it to the bot, then returns it. - """ - - def decorator(func: CommandCallback[Any, ContextT, P, T]): - kwargs.setdefault('parent', self) - result = hybrid_command(name=name, *args, with_app_command=with_app_command, **kwargs)(func) - self.add_command(result) - return result - - return decorator - - def hybrid_group( - self, - name: Union[str, app_commands.locale_str] = MISSING, - with_app_command: bool = True, - *args: Any, - **kwargs: Any, - ) -> Callable[[CommandCallback[Any, ContextT, P, T]], HybridGroup[Any, P, T]]: - """A shortcut decorator that invokes :func:`~discord.ext.commands.hybrid_group` and adds it to - the internal command list via :meth:`add_command`. - - Returns - -------- - Callable[..., :class:`HybridGroup`] - A decorator that converts the provided method into a Group, adds it to the bot, then returns it. - """ - - def decorator(func: CommandCallback[Any, ContextT, P, T]): - kwargs.setdefault('parent', self) - result = hybrid_group(name=name, *args, with_app_command=with_app_command, **kwargs)(func) - self.add_command(result) - return result - - return decorator - - # Error handler - - async def on_command_error(self, context: Context[BotT], exception: errors.CommandError, /) -> None: - """|coro| - - The default command error handler provided by the bot. - - By default this logs to the library logger, however it could be - overridden to have a different implementation. - - This only fires if you do not specify any listeners for command error. - - .. versionchanged:: 2.0 - - ``context`` and ``exception`` parameters are now positional-only. - Instead of writing to ``sys.stderr`` this now uses the library logger. - """ - if self.extra_events.get('on_command_error', None): - return - - command = context.command - if command and command.has_error_handler(): - return - - cog = context.cog - if cog and cog.has_error_handler(): - return - - _log.error('Ignoring exception in command %s', command, exc_info=exception) - - # global check registration - - def check(self, func: T, /) -> T: - r"""A decorator that adds a global check to the bot. - - A global check is similar to a :func:`.check` that is applied - on a per command basis except it is run before any command checks - have been verified and applies to every command the bot has. - - .. note:: - - This function can either be a regular function or a coroutine. - - Similar to a command :func:`.check`\, this takes a single parameter - of type :class:`.Context` and can only raise exceptions inherited from - :exc:`.CommandError`. - - Example - --------- - - .. code-block:: python3 - - @bot.check - def check_commands(ctx): - return ctx.command.qualified_name in allowed_commands - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - """ - # T was used instead of Check to ensure the type matches on return - self.add_check(func) # type: ignore - return func - - def add_check(self, func: UserCheck[ContextT], /, *, call_once: bool = False) -> None: - """Adds a global check to the bot. - - This is the non-decorator interface to :meth:`.check` - and :meth:`.check_once`. - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - - .. seealso:: The :func:`~discord.ext.commands.check` decorator - - Parameters - ----------- - func - The function that was used as a global check. - call_once: :class:`bool` - If the function should only be called once per - :meth:`.invoke` call. - """ - - if call_once: - self._check_once.append(func) - else: - self._checks.append(func) - - def remove_check(self, func: UserCheck[ContextT], /, *, call_once: bool = False) -> None: - """Removes a global check from the bot. - - This function is idempotent and will not raise an exception - if the function is not in the global checks. - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - - Parameters - ----------- - func - The function to remove from the global checks. - call_once: :class:`bool` - If the function was added with ``call_once=True`` in - the :meth:`.Bot.add_check` call or using :meth:`.check_once`. - """ - l = self._check_once if call_once else self._checks - - try: - l.remove(func) - except ValueError: - pass - - def check_once(self, func: CFT, /) -> CFT: - r"""A decorator that adds a "call once" global check to the bot. - - Unlike regular global checks, this one is called only once - per :meth:`.invoke` call. - - Regular global checks are called whenever a command is called - or :meth:`.Command.can_run` is called. This type of check - bypasses that and ensures that it's called only once, even inside - the default help command. - - .. note:: - - When using this function the :class:`.Context` sent to a group subcommand - may only parse the parent command and not the subcommands due to it - being invoked once per :meth:`.Bot.invoke` call. - - .. note:: - - This function can either be a regular function or a coroutine. - - Similar to a command :func:`.check`\, this takes a single parameter - of type :class:`.Context` and can only raise exceptions inherited from - :exc:`.CommandError`. - - Example - --------- - - .. code-block:: python3 - - @bot.check_once - def whitelist(ctx): - return ctx.message.author.id in my_whitelist - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - - """ - self.add_check(func, call_once=True) - return func - - async def can_run(self, ctx: Context[BotT], /, *, call_once: bool = False) -> bool: - data = self._check_once if call_once else self._checks - - if len(data) == 0: - return True - - return await discord.utils.async_all(f(ctx) for f in data) - - async def is_owner(self, user: User, /) -> bool: - """|coro| - - Checks if a :class:`~discord.User` or :class:`~discord.Member` is the owner of - this bot. - - If an :attr:`owner_id` is not set, it is fetched automatically - through the use of :meth:`~.Bot.application_info`. - - .. versionchanged:: 1.3 - The function also checks if the application is team-owned if - :attr:`owner_ids` is not set. - - .. versionchanged:: 2.0 - - ``user`` parameter is now positional-only. - - Parameters - ----------- - user: :class:`.abc.User` - The user to check for. - - Returns - -------- - :class:`bool` - Whether the user is the owner. - """ - - if self.owner_id: - return user.id == self.owner_id - elif self.owner_ids: - return user.id in self.owner_ids - else: - - app = await self.application_info() # type: ignore - if app.team: - self.owner_ids = ids = {m.id for m in app.team.members} - return user.id in ids - else: - self.owner_id = owner_id = app.owner.id - return user.id == owner_id - - def before_invoke(self, coro: CFT, /) -> CFT: - """A decorator that registers a coroutine as a pre-invoke hook. - - A pre-invoke hook is called directly before the command is - called. This makes it a useful function to set up database - connections or any type of set up required. - - This pre-invoke hook takes a sole parameter, a :class:`.Context`. - - .. note:: - - The :meth:`~.Bot.before_invoke` and :meth:`~.Bot.after_invoke` hooks are - only called if all checks and argument parsing procedures pass - without error. If any check or argument parsing procedures fail - then the hooks are not called. - - .. versionchanged:: 2.0 - - ``coro`` parameter is now positional-only. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the pre-invoke hook. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine. - """ - if not asyncio.iscoroutinefunction(coro): - raise TypeError('The pre-invoke hook must be a coroutine.') - - self._before_invoke = coro - return coro - - def after_invoke(self, coro: CFT, /) -> CFT: - r"""A decorator that registers a coroutine as a post-invoke hook. - - A post-invoke hook is called directly after the command is - called. This makes it a useful function to clean-up database - connections or any type of clean up required. - - This post-invoke hook takes a sole parameter, a :class:`.Context`. - - .. note:: - - Similar to :meth:`~.Bot.before_invoke`\, this is not called unless - checks and argument parsing procedures succeed. This hook is, - however, **always** called regardless of the internal command - callback raising an error (i.e. :exc:`.CommandInvokeError`\). - This makes it ideal for clean-up scenarios. - - .. versionchanged:: 2.0 - - ``coro`` parameter is now positional-only. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the post-invoke hook. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine. - """ - if not asyncio.iscoroutinefunction(coro): - raise TypeError('The post-invoke hook must be a coroutine.') - - self._after_invoke = coro - return coro - - # listener registration - - def add_listener(self, func: CoroFunc, /, name: str = MISSING) -> None: - """The non decorator alternative to :meth:`.listen`. - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - - Parameters - ----------- - func: :ref:`coroutine ` - The function to call. - name: :class:`str` - The name of the event to listen for. Defaults to ``func.__name__``. - - Example - -------- - - .. code-block:: python3 - - async def on_ready(): pass - async def my_message(message): pass - - bot.add_listener(on_ready) - bot.add_listener(my_message, 'on_message') - - """ - name = func.__name__ if name is MISSING else name - - if not asyncio.iscoroutinefunction(func): - raise TypeError('Listeners must be coroutines') - - if name in self.extra_events: - self.extra_events[name].append(func) - else: - self.extra_events[name] = [func] - - def remove_listener(self, func: CoroFunc, /, name: str = MISSING) -> None: - """Removes a listener from the pool of listeners. - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - - Parameters - ----------- - func - The function that was used as a listener to remove. - name: :class:`str` - The name of the event we want to remove. Defaults to - ``func.__name__``. - """ - - name = func.__name__ if name is MISSING else name - - if name in self.extra_events: - try: - self.extra_events[name].remove(func) - except ValueError: - pass - - def listen(self, name: str = MISSING) -> Callable[[CFT], CFT]: - """A decorator that registers another function as an external - event listener. Basically this allows you to listen to multiple - events from different places e.g. such as :func:`.on_ready` - - The functions being listened to must be a :ref:`coroutine `. - - Example - -------- - - .. code-block:: python3 - - @bot.listen() - async def on_message(message): - print('one') - - # in some other file... - - @bot.listen('on_message') - async def my_message(message): - print('two') - - Would print one and two in an unspecified order. - - Raises - ------- - TypeError - The function being listened to is not a coroutine. - """ - - def decorator(func: CFT) -> CFT: - self.add_listener(func, name) - return func - - return decorator - - # cogs - - async def add_cog( - self, - cog: Cog, - /, - *, - override: bool = False, - guild: Optional[Snowflake] = MISSING, - guilds: List[Snowflake] = MISSING, - ) -> None: - """|coro| - - Adds a "cog" to the bot. - - A cog is a class that has its own event listeners and commands. - - If the cog is a :class:`.app_commands.Group` then it is added to - the bot's :class:`~discord.app_commands.CommandTree` as well. - - .. note:: - - Exceptions raised inside a :class:`.Cog`'s :meth:`~.Cog.cog_load` method will be - propagated to the caller. - - .. versionchanged:: 2.0 - - :exc:`.ClientException` is raised when a cog with the same name - is already loaded. - - .. versionchanged:: 2.0 - - ``cog`` parameter is now positional-only. - - .. versionchanged:: 2.0 - - This method is now a :term:`coroutine`. - - Parameters - ----------- - cog: :class:`.Cog` - The cog to register to the bot. - override: :class:`bool` - If a previously loaded cog with the same name should be ejected - instead of raising an error. - - .. versionadded:: 2.0 - guild: Optional[:class:`~discord.abc.Snowflake`] - If the cog is an application command group, then this would be the - guild where the cog group would be added to. If not given then - it becomes a global command instead. - - .. versionadded:: 2.0 - guilds: List[:class:`~discord.abc.Snowflake`] - If the cog is an application command group, then this would be the - guilds where the cog group would be added to. If not given then - it becomes a global command instead. Cannot be mixed with - ``guild``. - - .. versionadded:: 2.0 - - Raises - ------- - TypeError - The cog does not inherit from :class:`.Cog`. - CommandError - An error happened during loading. - ClientException - A cog with the same name is already loaded. - """ - - if not isinstance(cog, Cog): - raise TypeError('cogs must derive from Cog') - - cog_name = cog.__cog_name__ - existing = self.__cogs.get(cog_name) - - if existing is not None: - if not override: - raise discord.ClientException(f'Cog named {cog_name!r} already loaded') - await self.remove_cog(cog_name, guild=guild, guilds=guilds) - - if cog.__cog_app_commands_group__: - self.__tree.add_command(cog.__cog_app_commands_group__, override=override, guild=guild, guilds=guilds) - - cog = await cog._inject(self, override=override, guild=guild, guilds=guilds) - self.__cogs[cog_name] = cog - - def get_cog(self, name: str, /) -> Optional[Cog]: - """Gets the cog instance requested. - - If the cog is not found, ``None`` is returned instead. - - .. versionchanged:: 2.0 - - ``name`` parameter is now positional-only. - - Parameters - ----------- - name: :class:`str` - The name of the cog you are requesting. - This is equivalent to the name passed via keyword - argument in class creation or the class name if unspecified. - - Returns - -------- - Optional[:class:`Cog`] - The cog that was requested. If not found, returns ``None``. - """ - return self.__cogs.get(name) - - async def remove_cog( - self, - name: str, - /, - *, - guild: Optional[Snowflake] = MISSING, - guilds: List[Snowflake] = MISSING, - ) -> Optional[Cog]: - """|coro| - - Removes a cog from the bot and returns it. - - All registered commands and event listeners that the - cog has registered will be removed as well. - - If no cog is found then this method has no effect. - - .. versionchanged:: 2.0 - - ``name`` parameter is now positional-only. - - .. versionchanged:: 2.0 - - This method is now a :term:`coroutine`. - - Parameters - ----------- - name: :class:`str` - The name of the cog to remove. - guild: Optional[:class:`~discord.abc.Snowflake`] - If the cog is an application command group, then this would be the - guild where the cog group would be removed from. If not given then - a global command is removed instead instead. - - .. versionadded:: 2.0 - guilds: List[:class:`~discord.abc.Snowflake`] - If the cog is an application command group, then this would be the - guilds where the cog group would be removed from. If not given then - a global command is removed instead instead. Cannot be mixed with - ``guild``. - - .. versionadded:: 2.0 - - Returns - ------- - Optional[:class:`.Cog`] - The cog that was removed. ``None`` if not found. - """ - - cog = self.__cogs.pop(name, None) - if cog is None: - return - - help_command = self._help_command - if help_command and help_command.cog is cog: - help_command.cog = None - - guild_ids = _retrieve_guild_ids(cog, guild, guilds) - if cog.__cog_app_commands_group__: - if guild_ids is None: - self.__tree.remove_command(name) - else: - for guild_id in guild_ids: - self.__tree.remove_command(name, guild=discord.Object(guild_id)) - - await cog._eject(self, guild_ids=guild_ids) - - return cog - - @property - def cogs(self) -> Mapping[str, Cog]: - """Mapping[:class:`str`, :class:`Cog`]: A read-only mapping of cog name to cog.""" - return types.MappingProxyType(self.__cogs) - - # extensions - - async def _remove_module_references(self, name: str) -> None: - # find all references to the module - # remove the cogs registered from the module - for cogname, cog in self.__cogs.copy().items(): - if _is_submodule(name, cog.__module__): - await self.remove_cog(cogname) - - # remove all the commands from the module - for cmd in self.all_commands.copy().values(): - if cmd.module is not None and _is_submodule(name, cmd.module): - if isinstance(cmd, GroupMixin): - cmd.recursively_remove_all_commands() - self.remove_command(cmd.name) - - # remove all the listeners from the module - for event_list in self.extra_events.copy().values(): - remove = [] - for index, event in enumerate(event_list): - if event.__module__ is not None and _is_submodule(name, event.__module__): - remove.append(index) - - for index in reversed(remove): - del event_list[index] - - # remove all relevant application commands from the tree - self.__tree._remove_with_module(name) - - async def _call_module_finalizers(self, lib: types.ModuleType, key: str) -> None: - try: - func = getattr(lib, 'teardown') - except AttributeError: - pass - else: - try: - await func(self) - except Exception: - pass - finally: - self.__extensions.pop(key, None) - sys.modules.pop(key, None) - name = lib.__name__ - for module in list(sys.modules.keys()): - if _is_submodule(name, module): - del sys.modules[module] - - async def _load_from_module_spec(self, spec: importlib.machinery.ModuleSpec, key: str) -> None: - # precondition: key not in self.__extensions - lib = importlib.util.module_from_spec(spec) - sys.modules[key] = lib - try: - spec.loader.exec_module(lib) # type: ignore - except Exception as e: - del sys.modules[key] - raise errors.ExtensionFailed(key, e) from e - - try: - setup = getattr(lib, 'setup') - except AttributeError: - del sys.modules[key] - raise errors.NoEntryPointError(key) - - try: - await setup(self) - except Exception as e: - del sys.modules[key] - await self._remove_module_references(lib.__name__) - await self._call_module_finalizers(lib, key) - raise errors.ExtensionFailed(key, e) from e - else: - self.__extensions[key] = lib - - def _resolve_name(self, name: str, package: Optional[str]) -> str: - try: - return importlib.util.resolve_name(name, package) - except ImportError: - raise errors.ExtensionNotFound(name) - - async def load_extension(self, name: str, *, package: Optional[str] = None) -> None: - """|coro| - - Loads an extension. - - An extension is a python module that contains commands, cogs, or - listeners. - - An extension must have a global function, ``setup`` defined as - the entry point on what to do when the extension is loaded. This entry - point must have a single argument, the ``bot``. - - .. versionchanged:: 2.0 - - This method is now a :term:`coroutine`. - - Parameters - ------------ - name: :class:`str` - The extension name to load. It must be dot separated like - regular Python imports if accessing a sub-module. e.g. - ``foo.test`` if you want to import ``foo/test.py``. - package: Optional[:class:`str`] - The package name to resolve relative imports with. - This is required when loading an extension using a relative path, e.g ``.foo.test``. - Defaults to ``None``. - - .. versionadded:: 1.7 - - Raises - -------- - ExtensionNotFound - The extension could not be imported. - This is also raised if the name of the extension could not - be resolved using the provided ``package`` parameter. - ExtensionAlreadyLoaded - The extension is already loaded. - NoEntryPointError - The extension does not have a setup function. - ExtensionFailed - The extension or its setup function had an execution error. - """ - - name = self._resolve_name(name, package) - if name in self.__extensions: - raise errors.ExtensionAlreadyLoaded(name) - - spec = importlib.util.find_spec(name) - if spec is None: - raise errors.ExtensionNotFound(name) - - await self._load_from_module_spec(spec, name) - - async def unload_extension(self, name: str, *, package: Optional[str] = None) -> None: - """|coro| - - Unloads an extension. - - When the extension is unloaded, all commands, listeners, and cogs are - removed from the bot and the module is un-imported. - - The extension can provide an optional global function, ``teardown``, - to do miscellaneous clean-up if necessary. This function takes a single - parameter, the ``bot``, similar to ``setup`` from - :meth:`~.Bot.load_extension`. - - .. versionchanged:: 2.0 - - This method is now a :term:`coroutine`. - - Parameters - ------------ - name: :class:`str` - The extension name to unload. It must be dot separated like - regular Python imports if accessing a sub-module. e.g. - ``foo.test`` if you want to import ``foo/test.py``. - package: Optional[:class:`str`] - The package name to resolve relative imports with. - This is required when unloading an extension using a relative path, e.g ``.foo.test``. - Defaults to ``None``. - - .. versionadded:: 1.7 - - Raises - ------- - ExtensionNotFound - The name of the extension could not - be resolved using the provided ``package`` parameter. - ExtensionNotLoaded - The extension was not loaded. - """ - - name = self._resolve_name(name, package) - lib = self.__extensions.get(name) - if lib is None: - raise errors.ExtensionNotLoaded(name) - - await self._remove_module_references(lib.__name__) - await self._call_module_finalizers(lib, name) - - async def reload_extension(self, name: str, *, package: Optional[str] = None) -> None: - """Atomically reloads an extension. - - This replaces the extension with the same extension, only refreshed. This is - equivalent to a :meth:`unload_extension` followed by a :meth:`load_extension` - except done in an atomic way. That is, if an operation fails mid-reload then - the bot will roll-back to the prior working state. - - Parameters - ------------ - name: :class:`str` - The extension name to reload. It must be dot separated like - regular Python imports if accessing a sub-module. e.g. - ``foo.test`` if you want to import ``foo/test.py``. - package: Optional[:class:`str`] - The package name to resolve relative imports with. - This is required when reloading an extension using a relative path, e.g ``.foo.test``. - Defaults to ``None``. - - .. versionadded:: 1.7 - - Raises - ------- - ExtensionNotLoaded - The extension was not loaded. - ExtensionNotFound - The extension could not be imported. - This is also raised if the name of the extension could not - be resolved using the provided ``package`` parameter. - NoEntryPointError - The extension does not have a setup function. - ExtensionFailed - The extension setup function had an execution error. - """ - - name = self._resolve_name(name, package) - lib = self.__extensions.get(name) - if lib is None: - raise errors.ExtensionNotLoaded(name) - - # get the previous module states from sys modules - # fmt: off - modules = { - name: module - for name, module in sys.modules.items() - if _is_submodule(lib.__name__, name) - } - # fmt: on - - try: - # Unload and then load the module... - await self._remove_module_references(lib.__name__) - await self._call_module_finalizers(lib, name) - await self.load_extension(name) - except Exception: - # if the load failed, the remnants should have been - # cleaned from the load_extension function call - # so let's load it from our old compiled library. - await lib.setup(self) - self.__extensions[name] = lib - - # revert sys.modules back to normal and raise back to caller - sys.modules.update(modules) - raise - - @property - def extensions(self) -> Mapping[str, types.ModuleType]: - """Mapping[:class:`str`, :class:`py:types.ModuleType`]: A read-only mapping of extension name to extension.""" - return types.MappingProxyType(self.__extensions) - - # help command stuff - - @property - def help_command(self) -> Optional[HelpCommand]: - return self._help_command - - @help_command.setter - def help_command(self, value: Optional[HelpCommand]) -> None: - if value is not None: - if not isinstance(value, HelpCommand): - raise TypeError('help_command must be a subclass of HelpCommand') - if self._help_command is not None: - self._help_command._remove_from_bot(self) - self._help_command = value - value._add_to_bot(self) - elif self._help_command is not None: - self._help_command._remove_from_bot(self) - self._help_command = None - else: - self._help_command = None - - # application command interop - - # As mentioned above, this is a mixin so the Self type hint fails here. - # However, since the only classes that can use this are subclasses of Client - # anyway, then this is sound. - @property - def tree(self) -> app_commands.CommandTree[Self]: # type: ignore - """:class:`~discord.app_commands.CommandTree`: The command tree responsible for handling the application commands - in this bot. - - .. versionadded:: 2.0 - """ - return self.__tree - - # command processing - - async def get_prefix(self, message: Message, /) -> Union[List[str], str]: - """|coro| - - Retrieves the prefix the bot is listening to - with the message as a context. - - .. versionchanged:: 2.0 - - ``message`` parameter is now positional-only. - - Parameters - ----------- - message: :class:`discord.Message` - The message context to get the prefix of. - - Returns - -------- - Union[List[:class:`str`], :class:`str`] - A list of prefixes or a single prefix that the bot is - listening for. - """ - prefix = ret = self.command_prefix - - if callable(prefix): - # self will be a Bot or AutoShardedBot - ret = await discord.utils.maybe_coroutine(prefix, self, message) # type: ignore - - if not isinstance(ret, str): - try: - ret = list(ret) # type: ignore - except TypeError: - # It's possible that a generator raised this exception. Don't - # replace it with our own error if that's the case. - if isinstance(ret, collections.abc.Iterable): - raise - - raise TypeError( - "command_prefix must be plain string, iterable of strings, or callable " - f"returning either of these, not {ret.__class__.__name__}" - ) - - return ret - - @overload - async def get_context( - self, - origin: Union[Message, Interaction], - /, - ) -> Context[Self]: # type: ignore - ... - - @overload - async def get_context( - self, - origin: Union[Message, Interaction], - /, - *, - cls: Type[ContextT], - ) -> ContextT: - ... - - async def get_context( - self, - origin: Union[Message, Interaction], - /, - *, - cls: Type[ContextT] = MISSING, - ) -> Any: - r"""|coro| - - Returns the invocation context from the message or interaction. - - This is a more low-level counter-part for :meth:`.process_commands` - to allow users more fine grained control over the processing. - - The returned context is not guaranteed to be a valid invocation - context, :attr:`.Context.valid` must be checked to make sure it is. - If the context is not valid then it is not a valid candidate to be - invoked under :meth:`~.Bot.invoke`. - - .. note:: - - In order for the custom context to be used inside an interaction-based - context (such as :class:`HybridCommand`) then this method must be - overridden to return that class. - - .. versionchanged:: 2.0 - - ``message`` parameter is now positional-only and renamed to ``origin``. - - Parameters - ----------- - origin: Union[:class:`discord.Message`, :class:`discord.Interaction`] - The message or interaction to get the invocation context from. - cls - The factory class that will be used to create the context. - By default, this is :class:`.Context`. Should a custom - class be provided, it must be similar enough to :class:`.Context`\'s - interface. - - Returns - -------- - :class:`.Context` - The invocation context. The type of this can change via the - ``cls`` parameter. - """ - if cls is MISSING: - cls = Context # type: ignore - - if isinstance(origin, discord.Interaction): - return await cls.from_interaction(origin) - - view = StringView(origin.content) - ctx = cls(prefix=None, view=view, bot=self, message=origin) - - if origin.author.id == self.user.id: # type: ignore - return ctx - - prefix = await self.get_prefix(origin) - invoked_prefix = prefix - - if isinstance(prefix, str): - if not view.skip_string(prefix): - return ctx - else: - try: - # if the context class' __init__ consumes something from the view this - # will be wrong. That seems unreasonable though. - if origin.content.startswith(tuple(prefix)): - invoked_prefix = discord.utils.find(view.skip_string, prefix) - else: - return ctx - - except TypeError: - if not isinstance(prefix, list): - raise TypeError( - "get_prefix must return either a string or a list of string, " f"not {prefix.__class__.__name__}" - ) - - # It's possible a bad command_prefix got us here. - for value in prefix: - if not isinstance(value, str): - raise TypeError( - "Iterable command_prefix or list returned from get_prefix must " - f"contain only strings, not {value.__class__.__name__}" - ) - - # Getting here shouldn't happen - raise - - if self.strip_after_prefix: - view.skip_ws() - - invoker = view.get_word() - ctx.invoked_with = invoker - # type-checker fails to narrow invoked_prefix type. - ctx.prefix = invoked_prefix # type: ignore - ctx.command = self.all_commands.get(invoker) - return ctx - - async def invoke(self, ctx: Context[BotT], /) -> None: - """|coro| - - Invokes the command given under the invocation context and - handles all the internal event dispatch mechanisms. - - .. versionchanged:: 2.0 - - ``ctx`` parameter is now positional-only. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context to invoke. - """ - if ctx.command is not None: - self.dispatch('command', ctx) - try: - if await self.can_run(ctx, call_once=True): - await ctx.command.invoke(ctx) - else: - raise errors.CheckFailure('The global check once functions failed.') - except errors.CommandError as exc: - await ctx.command.dispatch_error(ctx, exc) - else: - self.dispatch('command_completion', ctx) - elif ctx.invoked_with: - exc = errors.CommandNotFound(f'Command "{ctx.invoked_with}" is not found') - self.dispatch('command_error', ctx, exc) - - async def process_commands(self, message: Message, /) -> None: - """|coro| - - This function processes the commands that have been registered - to the bot and other groups. Without this coroutine, none of the - commands will be triggered. - - By default, this coroutine is called inside the :func:`.on_message` - event. If you choose to override the :func:`.on_message` event, then - you should invoke this coroutine as well. - - This is built using other low level tools, and is equivalent to a - call to :meth:`~.Bot.get_context` followed by a call to :meth:`~.Bot.invoke`. - - This also checks if the message's author is a bot and doesn't - call :meth:`~.Bot.get_context` or :meth:`~.Bot.invoke` if so. - - .. versionchanged:: 2.0 - - ``message`` parameter is now positional-only. - - Parameters - ----------- - message: :class:`discord.Message` - The message to process commands for. - """ - if message.author.bot: - return - - ctx = await self.get_context(message) - # the type of the invocation context's bot attribute will be correct - await self.invoke(ctx) # type: ignore - - async def on_message(self, message: Message, /) -> None: - await self.process_commands(message) - - -class Bot(BotBase, discord.Client): - """Represents a Discord bot. - - This class is a subclass of :class:`discord.Client` and as a result - anything that you can do with a :class:`discord.Client` you can do with - this bot. - - This class also subclasses :class:`.GroupMixin` to provide the functionality - to manage commands. - - Unlike :class:`discord.Client`, this class does not require manually setting - a :class:`~discord.app_commands.CommandTree` and is automatically set upon - instantiating the class. - - .. container:: operations - - .. describe:: async with x - - Asynchronously initialises the bot and automatically cleans up. - - .. versionadded:: 2.0 - - Attributes - ----------- - command_prefix - The command prefix is what the message content must contain initially - to have a command invoked. This prefix could either be a string to - indicate what the prefix should be, or a callable that takes in the bot - as its first parameter and :class:`discord.Message` as its second - parameter and returns the prefix. This is to facilitate "dynamic" - command prefixes. This callable can be either a regular function or - a coroutine. - - An empty string as the prefix always matches, enabling prefix-less - command invocation. While this may be useful in DMs it should be avoided - in servers, as it's likely to cause performance issues and unintended - command invocations. - - The command prefix could also be an iterable of strings indicating that - multiple checks for the prefix should be used and the first one to - match will be the invocation prefix. You can get this prefix via - :attr:`.Context.prefix`. - - .. note:: - - When passing multiple prefixes be careful to not pass a prefix - that matches a longer prefix occurring later in the sequence. For - example, if the command prefix is ``('!', '!?')`` the ``'!?'`` - prefix will never be matched to any message as the previous one - matches messages starting with ``!?``. This is especially important - when passing an empty string, it should always be last as no prefix - after it will be matched. - case_insensitive: :class:`bool` - Whether the commands should be case insensitive. Defaults to ``False``. This - attribute does not carry over to groups. You must set it to every group if - you require group commands to be case insensitive as well. - description: :class:`str` - The content prefixed into the default help message. - help_command: Optional[:class:`.HelpCommand`] - The help command implementation to use. This can be dynamically - set at runtime. To remove the help command pass ``None``. For more - information on implementing a help command, see :ref:`ext_commands_help_command`. - owner_id: Optional[:class:`int`] - The user ID that owns the bot. If this is not set and is then queried via - :meth:`.is_owner` then it is fetched automatically using - :meth:`~.Bot.application_info`. - owner_ids: Optional[Collection[:class:`int`]] - The user IDs that owns the bot. This is similar to :attr:`owner_id`. - If this is not set and the application is team based, then it is - fetched automatically using :meth:`~.Bot.application_info`. - For performance reasons it is recommended to use a :class:`set` - for the collection. You cannot set both ``owner_id`` and ``owner_ids``. - - .. versionadded:: 1.3 - strip_after_prefix: :class:`bool` - Whether to strip whitespace characters after encountering the command - prefix. This allows for ``! hello`` and ``!hello`` to both work if - the ``command_prefix`` is set to ``!``. Defaults to ``False``. - - .. versionadded:: 1.7 - tree_cls: Type[:class:`~discord.app_commands.CommandTree`] - The type of application command tree to use. Defaults to :class:`~discord.app_commands.CommandTree`. - - .. versionadded:: 2.0 - """ - - pass - - -class AutoShardedBot(BotBase, discord.AutoShardedClient): - """This is similar to :class:`.Bot` except that it is inherited from - :class:`discord.AutoShardedClient` instead. - - .. container:: operations - - .. describe:: async with x - - Asynchronously initialises the bot and automatically cleans. - - .. versionadded:: 2.0 - """ - - pass diff --git a/.venv/Lib/site-packages/discord/ext/commands/cog.py b/.venv/Lib/site-packages/discord/ext/commands/cog.py deleted file mode 100644 index 6112a22..0000000 --- a/.venv/Lib/site-packages/discord/ext/commands/cog.py +++ /dev/null @@ -1,744 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" -from __future__ import annotations - -import inspect -import discord -from discord import app_commands -from discord.utils import maybe_coroutine - -from typing import ( - Any, - Callable, - ClassVar, - Coroutine, - Dict, - Generator, - Iterable, - List, - Optional, - TYPE_CHECKING, - Tuple, - TypeVar, - Union, -) - -from ._types import _BaseCommand, BotT - -if TYPE_CHECKING: - from typing_extensions import Self - from discord.abc import Snowflake - - from .bot import BotBase - from .context import Context - from .core import Command - -__all__ = ( - 'CogMeta', - 'Cog', - 'GroupCog', -) - -FuncT = TypeVar('FuncT', bound=Callable[..., Any]) - -MISSING: Any = discord.utils.MISSING - - -class CogMeta(type): - """A metaclass for defining a cog. - - Note that you should probably not use this directly. It is exposed - purely for documentation purposes along with making custom metaclasses to intermix - with other metaclasses such as the :class:`abc.ABCMeta` metaclass. - - For example, to create an abstract cog mixin class, the following would be done. - - .. code-block:: python3 - - import abc - - class CogABCMeta(commands.CogMeta, abc.ABCMeta): - pass - - class SomeMixin(metaclass=abc.ABCMeta): - pass - - class SomeCogMixin(SomeMixin, commands.Cog, metaclass=CogABCMeta): - pass - - .. note:: - - When passing an attribute of a metaclass that is documented below, note - that you must pass it as a keyword-only argument to the class creation - like the following example: - - .. code-block:: python3 - - class MyCog(commands.Cog, name='My Cog'): - pass - - Attributes - ----------- - name: :class:`str` - The cog name. By default, it is the name of the class with no modification. - description: :class:`str` - The cog description. By default, it is the cleaned docstring of the class. - - .. versionadded:: 1.6 - - command_attrs: :class:`dict` - A list of attributes to apply to every command inside this cog. The dictionary - is passed into the :class:`Command` options at ``__init__``. - If you specify attributes inside the command attribute in the class, it will - override the one specified inside this attribute. For example: - - .. code-block:: python3 - - class MyCog(commands.Cog, command_attrs=dict(hidden=True)): - @commands.command() - async def foo(self, ctx): - pass # hidden -> True - - @commands.command(hidden=False) - async def bar(self, ctx): - pass # hidden -> False - - group_name: Union[:class:`str`, :class:`~discord.app_commands.locale_str`] - The group name of a cog. This is only applicable for :class:`GroupCog` instances. - By default, it's the same value as :attr:`name`. - - .. versionadded:: 2.0 - group_description: Union[:class:`str`, :class:`~discord.app_commands.locale_str`] - The group description of a cog. This is only applicable for :class:`GroupCog` instances. - By default, it's the same value as :attr:`description`. - - .. versionadded:: 2.0 - group_nsfw: :class:`bool` - Whether the application command group is NSFW. This is only applicable for :class:`GroupCog` instances. - By default, it's ``False``. - - .. versionadded:: 2.0 - group_auto_locale_strings: :class:`bool` - If this is set to ``True``, then all translatable strings will implicitly - be wrapped into :class:`~discord.app_commands.locale_str` rather - than :class:`str`. Defaults to ``True``. - - .. versionadded:: 2.0 - """ - - __cog_name__: str - __cog_description__: str - __cog_group_name__: Union[str, app_commands.locale_str] - __cog_group_description__: Union[str, app_commands.locale_str] - __cog_group_nsfw__: bool - __cog_group_auto_locale_strings__: bool - __cog_settings__: Dict[str, Any] - __cog_commands__: List[Command[Any, ..., Any]] - __cog_app_commands__: List[Union[app_commands.Group, app_commands.Command[Any, ..., Any]]] - __cog_listeners__: List[Tuple[str, str]] - - def __new__(cls, *args: Any, **kwargs: Any) -> Self: - name, bases, attrs = args - if any(issubclass(base, app_commands.Group) for base in bases): - raise TypeError( - 'Cannot inherit from app_commands.Group with commands.Cog, consider using commands.GroupCog instead' - ) - - # If name='...' is given but not group_name='...' then name='...' is used for both. - # If neither is given then cog name is the class name but group name is kebab case - try: - cog_name = kwargs.pop('name') - except KeyError: - cog_name = name - try: - group_name = kwargs.pop('group_name') - except KeyError: - group_name = app_commands.commands._to_kebab_case(name) - else: - group_name = kwargs.pop('group_name', cog_name) - - attrs['__cog_settings__'] = kwargs.pop('command_attrs', {}) - attrs['__cog_name__'] = cog_name - attrs['__cog_group_name__'] = group_name - attrs['__cog_group_nsfw__'] = kwargs.pop('group_nsfw', False) - attrs['__cog_group_auto_locale_strings__'] = kwargs.pop('group_auto_locale_strings', True) - - description = kwargs.pop('description', None) - if description is None: - description = inspect.cleandoc(attrs.get('__doc__', '')) - - attrs['__cog_description__'] = description - attrs['__cog_group_description__'] = kwargs.pop('group_description', description or '\u2026') - - commands = {} - cog_app_commands = {} - listeners = {} - no_bot_cog = 'Commands or listeners must not start with cog_ or bot_ (in method {0.__name__}.{1})' - - new_cls = super().__new__(cls, name, bases, attrs, **kwargs) - for base in reversed(new_cls.__mro__): - for elem, value in base.__dict__.items(): - if elem in commands: - del commands[elem] - if elem in listeners: - del listeners[elem] - - is_static_method = isinstance(value, staticmethod) - if is_static_method: - value = value.__func__ - if isinstance(value, _BaseCommand): - if is_static_method: - raise TypeError(f'Command in method {base}.{elem!r} must not be staticmethod.') - if elem.startswith(('cog_', 'bot_')): - raise TypeError(no_bot_cog.format(base, elem)) - commands[elem] = value - elif isinstance(value, (app_commands.Group, app_commands.Command)) and value.parent is None: - if is_static_method: - raise TypeError(f'Command in method {base}.{elem!r} must not be staticmethod.') - if elem.startswith(('cog_', 'bot_')): - raise TypeError(no_bot_cog.format(base, elem)) - cog_app_commands[elem] = value - elif inspect.iscoroutinefunction(value): - try: - getattr(value, '__cog_listener__') - except AttributeError: - continue - else: - if elem.startswith(('cog_', 'bot_')): - raise TypeError(no_bot_cog.format(base, elem)) - listeners[elem] = value - - new_cls.__cog_commands__ = list(commands.values()) # this will be copied in Cog.__new__ - new_cls.__cog_app_commands__ = list(cog_app_commands.values()) - - listeners_as_list = [] - for listener in listeners.values(): - for listener_name in listener.__cog_listener_names__: - # I use __name__ instead of just storing the value so I can inject - # the self attribute when the time comes to add them to the bot - listeners_as_list.append((listener_name, listener.__name__)) - - new_cls.__cog_listeners__ = listeners_as_list - return new_cls - - def __init__(self, *args: Any, **kwargs: Any) -> None: - super().__init__(*args) - - @classmethod - def qualified_name(cls) -> str: - return cls.__cog_name__ - - -def _cog_special_method(func: FuncT) -> FuncT: - func.__cog_special_method__ = None - return func - - -class Cog(metaclass=CogMeta): - """The base class that all cogs must inherit from. - - A cog is a collection of commands, listeners, and optional state to - help group commands together. More information on them can be found on - the :ref:`ext_commands_cogs` page. - - When inheriting from this class, the options shown in :class:`CogMeta` - are equally valid here. - """ - - __cog_name__: str - __cog_description__: str - __cog_group_name__: Union[str, app_commands.locale_str] - __cog_group_description__: Union[str, app_commands.locale_str] - __cog_settings__: Dict[str, Any] - __cog_commands__: List[Command[Self, ..., Any]] - __cog_app_commands__: List[Union[app_commands.Group, app_commands.Command[Self, ..., Any]]] - __cog_listeners__: List[Tuple[str, str]] - __cog_is_app_commands_group__: ClassVar[bool] = False - __cog_app_commands_group__: Optional[app_commands.Group] - __discord_app_commands_error_handler__: Optional[ - Callable[[discord.Interaction, app_commands.AppCommandError], Coroutine[Any, Any, None]] - ] - - def __new__(cls, *args: Any, **kwargs: Any) -> Self: - # For issue 426, we need to store a copy of the command objects - # since we modify them to inject `self` to them. - # To do this, we need to interfere with the Cog creation process. - self = super().__new__(cls) - cmd_attrs = cls.__cog_settings__ - - # Either update the command with the cog provided defaults or copy it. - # r.e type ignore, type-checker complains about overriding a ClassVar - self.__cog_commands__ = tuple(c._update_copy(cmd_attrs) for c in cls.__cog_commands__) # type: ignore - - lookup = {cmd.qualified_name: cmd for cmd in self.__cog_commands__} - - # Register the application commands - children: List[Union[app_commands.Group, app_commands.Command[Self, ..., Any]]] = [] - - if cls.__cog_is_app_commands_group__: - group = app_commands.Group( - name=cls.__cog_group_name__, - description=cls.__cog_group_description__, - nsfw=cls.__cog_group_nsfw__, - auto_locale_strings=cls.__cog_group_auto_locale_strings__, - parent=None, - guild_ids=getattr(cls, '__discord_app_commands_default_guilds__', None), - guild_only=getattr(cls, '__discord_app_commands_guild_only__', False), - default_permissions=getattr(cls, '__discord_app_commands_default_permissions__', None), - ) - else: - group = None - - self.__cog_app_commands_group__ = group - - # Update the Command instances dynamically as well - for command in self.__cog_commands__: - setattr(self, command.callback.__name__, command) - parent = command.parent - if parent is not None: - # Get the latest parent reference - parent = lookup[parent.qualified_name] # type: ignore - - # Update our parent's reference to our self - parent.remove_command(command.name) # type: ignore - parent.add_command(command) # type: ignore - - if hasattr(command, '__commands_is_hybrid__') and parent is None: - app_command: Optional[Union[app_commands.Group, app_commands.Command[Self, ..., Any]]] = getattr( - command, 'app_command', None - ) - if app_command: - group_parent = self.__cog_app_commands_group__ - app_command = app_command._copy_with(parent=group_parent, binding=self) - # The type checker does not see the app_command attribute even though it exists - command.app_command = app_command # type: ignore - - if self.__cog_app_commands_group__: - children.append(app_command) - - if Cog._get_overridden_method(self.cog_app_command_error) is not None: - error_handler = self.cog_app_command_error - else: - error_handler = None - - self.__discord_app_commands_error_handler__ = error_handler - - for command in cls.__cog_app_commands__: - copy = command._copy_with(parent=self.__cog_app_commands_group__, binding=self) - - # Update set bindings - if copy._attr: - setattr(self, copy._attr, copy) - - if isinstance(copy, app_commands.Group): - copy.__discord_app_commands_error_handler__ = error_handler - for command in copy._children.values(): - if isinstance(command, app_commands.Group): - command.__discord_app_commands_error_handler__ = error_handler - - children.append(copy) - - self.__cog_app_commands__ = children - if self.__cog_app_commands_group__: - self.__cog_app_commands_group__.module = cls.__module__ - mapping = {cmd.name: cmd for cmd in children} - if len(mapping) > 25: - raise TypeError('maximum number of application command children exceeded') - - self.__cog_app_commands_group__._children = mapping # type: ignore # Variance issue - - return self - - def get_commands(self) -> List[Command[Self, ..., Any]]: - r"""Returns the commands that are defined inside this cog. - - This does *not* include :class:`discord.app_commands.Command` or :class:`discord.app_commands.Group` - instances. - - Returns - -------- - List[:class:`.Command`] - A :class:`list` of :class:`.Command`\s that are - defined inside this cog, not including subcommands. - """ - return [c for c in self.__cog_commands__ if c.parent is None] - - def get_app_commands(self) -> List[Union[app_commands.Command[Self, ..., Any], app_commands.Group]]: - r"""Returns the app commands that are defined inside this cog. - - Returns - -------- - List[Union[:class:`discord.app_commands.Command`, :class:`discord.app_commands.Group`]] - A :class:`list` of :class:`discord.app_commands.Command`\s and :class:`discord.app_commands.Group`\s that are - defined inside this cog, not including subcommands. - """ - return [c for c in self.__cog_app_commands__ if c.parent is None] - - @property - def qualified_name(self) -> str: - """:class:`str`: Returns the cog's specified name, not the class name.""" - return self.__cog_name__ - - @property - def description(self) -> str: - """:class:`str`: Returns the cog's description, typically the cleaned docstring.""" - return self.__cog_description__ - - @description.setter - def description(self, description: str) -> None: - self.__cog_description__ = description - - def walk_commands(self) -> Generator[Command[Self, ..., Any], None, None]: - """An iterator that recursively walks through this cog's commands and subcommands. - - Yields - ------ - Union[:class:`.Command`, :class:`.Group`] - A command or group from the cog. - """ - from .core import GroupMixin - - for command in self.__cog_commands__: - if command.parent is None: - yield command - if isinstance(command, GroupMixin): - yield from command.walk_commands() - - def walk_app_commands(self) -> Generator[Union[app_commands.Command[Self, ..., Any], app_commands.Group], None, None]: - """An iterator that recursively walks through this cog's app commands and subcommands. - - Yields - ------ - Union[:class:`discord.app_commands.Command`, :class:`discord.app_commands.Group`] - An app command or group from the cog. - """ - for command in self.__cog_app_commands__: - yield command - if isinstance(command, app_commands.Group): - yield from command.walk_commands() - - @property - def app_command(self) -> Optional[app_commands.Group]: - """Optional[:class:`discord.app_commands.Group`]: Returns the associated group with this cog. - - This is only available if inheriting from :class:`GroupCog`. - """ - return self.__cog_app_commands_group__ - - def get_listeners(self) -> List[Tuple[str, Callable[..., Any]]]: - """Returns a :class:`list` of (name, function) listener pairs that are defined in this cog. - - Returns - -------- - List[Tuple[:class:`str`, :ref:`coroutine `]] - The listeners defined in this cog. - """ - return [(name, getattr(self, method_name)) for name, method_name in self.__cog_listeners__] - - @classmethod - def _get_overridden_method(cls, method: FuncT) -> Optional[FuncT]: - """Return None if the method is not overridden. Otherwise returns the overridden method.""" - return getattr(method.__func__, '__cog_special_method__', method) - - @classmethod - def listener(cls, name: str = MISSING) -> Callable[[FuncT], FuncT]: - """A decorator that marks a function as a listener. - - This is the cog equivalent of :meth:`.Bot.listen`. - - Parameters - ------------ - name: :class:`str` - The name of the event being listened to. If not provided, it - defaults to the function's name. - - Raises - -------- - TypeError - The function is not a coroutine function or a string was not passed as - the name. - """ - - if name is not MISSING and not isinstance(name, str): - raise TypeError(f'Cog.listener expected str but received {name.__class__.__name__!r} instead.') - - def decorator(func: FuncT) -> FuncT: - actual = func - if isinstance(actual, staticmethod): - actual = actual.__func__ - if not inspect.iscoroutinefunction(actual): - raise TypeError('Listener function must be a coroutine function.') - actual.__cog_listener__ = True - to_assign = name or actual.__name__ - try: - actual.__cog_listener_names__.append(to_assign) - except AttributeError: - actual.__cog_listener_names__ = [to_assign] - # we have to return `func` instead of `actual` because - # we need the type to be `staticmethod` for the metaclass - # to pick it up but the metaclass unfurls the function and - # thus the assignments need to be on the actual function - return func - - return decorator - - def has_error_handler(self) -> bool: - """:class:`bool`: Checks whether the cog has an error handler. - - .. versionadded:: 1.7 - """ - return not hasattr(self.cog_command_error.__func__, '__cog_special_method__') - - @_cog_special_method - async def cog_load(self) -> None: - """|maybecoro| - - A special method that is called when the cog gets loaded. - - Subclasses must replace this if they want special asynchronous loading behaviour. - Note that the ``__init__`` special method does not allow asynchronous code to run - inside it, thus this is helpful for setting up code that needs to be asynchronous. - - .. versionadded:: 2.0 - """ - pass - - @_cog_special_method - async def cog_unload(self) -> None: - """|maybecoro| - - A special method that is called when the cog gets removed. - - Subclasses must replace this if they want special unloading behaviour. - - .. versionchanged:: 2.0 - - This method can now be a :term:`coroutine`. - """ - pass - - @_cog_special_method - def bot_check_once(self, ctx: Context[BotT]) -> bool: - """A special method that registers as a :meth:`.Bot.check_once` - check. - - This function **can** be a coroutine and must take a sole parameter, - ``ctx``, to represent the :class:`.Context`. - """ - return True - - @_cog_special_method - def bot_check(self, ctx: Context[BotT]) -> bool: - """A special method that registers as a :meth:`.Bot.check` - check. - - This function **can** be a coroutine and must take a sole parameter, - ``ctx``, to represent the :class:`.Context`. - """ - return True - - @_cog_special_method - def cog_check(self, ctx: Context[BotT]) -> bool: - """A special method that registers as a :func:`~discord.ext.commands.check` - for every command and subcommand in this cog. - - This function **can** be a coroutine and must take a sole parameter, - ``ctx``, to represent the :class:`.Context`. - """ - return True - - @_cog_special_method - async def cog_command_error(self, ctx: Context[BotT], error: Exception) -> None: - """A special method that is called whenever an error - is dispatched inside this cog. - - This is similar to :func:`.on_command_error` except only applying - to the commands inside this cog. - - This **must** be a coroutine. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context where the error happened. - error: :class:`CommandError` - The error that happened. - """ - pass - - @_cog_special_method - async def cog_app_command_error(self, interaction: discord.Interaction, error: app_commands.AppCommandError) -> None: - """A special method that is called whenever an error within - an application command is dispatched inside this cog. - - This is similar to :func:`discord.app_commands.CommandTree.on_error` except - only applying to the application commands inside this cog. - - This **must** be a coroutine. - - Parameters - ----------- - interaction: :class:`~discord.Interaction` - The interaction that is being handled. - error: :exc:`~discord.app_commands.AppCommandError` - The exception that was raised. - """ - pass - - @_cog_special_method - async def cog_before_invoke(self, ctx: Context[BotT]) -> None: - """A special method that acts as a cog local pre-invoke hook. - - This is similar to :meth:`.Command.before_invoke`. - - This **must** be a coroutine. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context. - """ - pass - - @_cog_special_method - async def cog_after_invoke(self, ctx: Context[BotT]) -> None: - """A special method that acts as a cog local post-invoke hook. - - This is similar to :meth:`.Command.after_invoke`. - - This **must** be a coroutine. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context. - """ - pass - - async def _inject(self, bot: BotBase, override: bool, guild: Optional[Snowflake], guilds: List[Snowflake]) -> Self: - cls = self.__class__ - - # we'll call this first so that errors can propagate without - # having to worry about undoing anything - await maybe_coroutine(self.cog_load) - - # realistically, the only thing that can cause loading errors - # is essentially just the command loading, which raises if there are - # duplicates. When this condition is met, we want to undo all what - # we've added so far for some form of atomic loading. - for index, command in enumerate(self.__cog_commands__): - command.cog = self - if command.parent is None: - try: - bot.add_command(command) - except Exception as e: - # undo our additions - for to_undo in self.__cog_commands__[:index]: - if to_undo.parent is None: - bot.remove_command(to_undo.name) - try: - await maybe_coroutine(self.cog_unload) - finally: - raise e - - # check if we're overriding the default - if cls.bot_check is not Cog.bot_check: - bot.add_check(self.bot_check) - - if cls.bot_check_once is not Cog.bot_check_once: - bot.add_check(self.bot_check_once, call_once=True) - - # while Bot.add_listener can raise if it's not a coroutine, - # this precondition is already met by the listener decorator - # already, thus this should never raise. - # Outside of, memory errors and the like... - for name, method_name in self.__cog_listeners__: - bot.add_listener(getattr(self, method_name), name) - - # Only do this if these are "top level" commands - if not self.__cog_app_commands_group__: - for command in self.__cog_app_commands__: - # This is already atomic - bot.tree.add_command(command, override=override, guild=guild, guilds=guilds) - - return self - - async def _eject(self, bot: BotBase, guild_ids: Optional[Iterable[int]]) -> None: - cls = self.__class__ - - try: - for command in self.__cog_commands__: - if command.parent is None: - bot.remove_command(command.name) - - if not self.__cog_app_commands_group__: - for command in self.__cog_app_commands__: - guild_ids = guild_ids or command._guild_ids - if guild_ids is None: - bot.tree.remove_command(command.name) - else: - for guild_id in guild_ids: - bot.tree.remove_command(command.name, guild=discord.Object(id=guild_id)) - - for name, method_name in self.__cog_listeners__: - bot.remove_listener(getattr(self, method_name), name) - - if cls.bot_check is not Cog.bot_check: - bot.remove_check(self.bot_check) - - if cls.bot_check_once is not Cog.bot_check_once: - bot.remove_check(self.bot_check_once, call_once=True) - finally: - try: - await maybe_coroutine(self.cog_unload) - except Exception: - pass - - -class GroupCog(Cog): - """Represents a cog that also doubles as a parent :class:`discord.app_commands.Group` for - the application commands defined within it. - - This inherits from :class:`Cog` and the options in :class:`CogMeta` also apply to this. - See the :class:`Cog` documentation for methods. - - Decorators such as :func:`~discord.app_commands.guild_only`, :func:`~discord.app_commands.guilds`, - and :func:`~discord.app_commands.default_permissions` will apply to the group if used on top of the - cog. - - For example: - - .. code-block:: python3 - - from discord import app_commands - from discord.ext import commands - - @app_commands.guild_only() - class MyCog(commands.GroupCog, group_name='my-cog'): - pass - - .. versionadded:: 2.0 - """ - - __cog_is_app_commands_group__: ClassVar[bool] = True diff --git a/.venv/Lib/site-packages/discord/ext/commands/context.py b/.venv/Lib/site-packages/discord/ext/commands/context.py deleted file mode 100644 index 616cab9..0000000 --- a/.venv/Lib/site-packages/discord/ext/commands/context.py +++ /dev/null @@ -1,880 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" -from __future__ import annotations - -import re -from typing import TYPE_CHECKING, Any, Dict, Generator, Generic, List, Optional, TypeVar, Union, Sequence, Type - -import discord.abc -import discord.utils -from discord import Interaction, Message, Attachment, MessageType, User, PartialMessageable, Permissions, ChannelType, Thread -from discord.context_managers import Typing -from .view import StringView - -from ._types import BotT - -if TYPE_CHECKING: - from typing_extensions import Self, ParamSpec, TypeGuard - - from discord.abc import MessageableChannel - from discord.guild import Guild - from discord.member import Member - from discord.state import ConnectionState - from discord.user import ClientUser - from discord.voice_client import VoiceProtocol - from discord.embeds import Embed - from discord.file import File - from discord.mentions import AllowedMentions - from discord.sticker import GuildSticker, StickerItem - from discord.message import MessageReference, PartialMessage - from discord.ui import View - from discord.types.interactions import ApplicationCommandInteractionData - - from .cog import Cog - from .core import Command - from .parameters import Parameter - - from types import TracebackType - - BE = TypeVar('BE', bound=BaseException) - -# fmt: off -__all__ = ( - 'Context', -) -# fmt: on - -MISSING: Any = discord.utils.MISSING - - -T = TypeVar('T') -CogT = TypeVar('CogT', bound="Cog") - -if TYPE_CHECKING: - P = ParamSpec('P') -else: - P = TypeVar('P') - - -def is_cog(obj: Any) -> TypeGuard[Cog]: - return hasattr(obj, '__cog_commands__') - - -class DeferTyping: - def __init__(self, ctx: Context[BotT], *, ephemeral: bool): - self.ctx: Context[BotT] = ctx - self.ephemeral: bool = ephemeral - - def __await__(self) -> Generator[Any, None, None]: - return self.ctx.defer(ephemeral=self.ephemeral).__await__() - - async def __aenter__(self) -> None: - await self.ctx.defer(ephemeral=self.ephemeral) - - async def __aexit__( - self, - exc_type: Optional[Type[BE]], - exc: Optional[BE], - traceback: Optional[TracebackType], - ) -> None: - pass - - -class Context(discord.abc.Messageable, Generic[BotT]): - r"""Represents the context in which a command is being invoked under. - - This class contains a lot of meta data to help you understand more about - the invocation context. This class is not created manually and is instead - passed around to commands as the first parameter. - - This class implements the :class:`~discord.abc.Messageable` ABC. - - Attributes - ----------- - message: :class:`.Message` - The message that triggered the command being executed. - - .. note:: - - In the case of an interaction based context, this message is "synthetic" - and does not actually exist. Therefore, the ID on it is invalid similar - to ephemeral messages. - bot: :class:`.Bot` - The bot that contains the command being executed. - args: :class:`list` - The list of transformed arguments that were passed into the command. - If this is accessed during the :func:`.on_command_error` event - then this list could be incomplete. - kwargs: :class:`dict` - A dictionary of transformed arguments that were passed into the command. - Similar to :attr:`args`\, if this is accessed in the - :func:`.on_command_error` event then this dict could be incomplete. - current_parameter: Optional[:class:`Parameter`] - The parameter that is currently being inspected and converted. - This is only of use for within converters. - - .. versionadded:: 2.0 - current_argument: Optional[:class:`str`] - The argument string of the :attr:`current_parameter` that is currently being converted. - This is only of use for within converters. - - .. versionadded:: 2.0 - interaction: Optional[:class:`~discord.Interaction`] - The interaction associated with this context. - - .. versionadded:: 2.0 - prefix: Optional[:class:`str`] - The prefix that was used to invoke the command. For interaction based contexts, - this is ``/`` for slash commands and ``\u200b`` for context menu commands. - command: Optional[:class:`Command`] - The command that is being invoked currently. - invoked_with: Optional[:class:`str`] - The command name that triggered this invocation. Useful for finding out - which alias called the command. - invoked_parents: List[:class:`str`] - The command names of the parents that triggered this invocation. Useful for - finding out which aliases called the command. - - For example in commands ``?a b c test``, the invoked parents are ``['a', 'b', 'c']``. - - .. versionadded:: 1.7 - - invoked_subcommand: Optional[:class:`Command`] - The subcommand that was invoked. - If no valid subcommand was invoked then this is equal to ``None``. - subcommand_passed: Optional[:class:`str`] - The string that was attempted to call a subcommand. This does not have - to point to a valid registered subcommand and could just point to a - nonsense string. If nothing was passed to attempt a call to a - subcommand then this is set to ``None``. - command_failed: :class:`bool` - A boolean that indicates if the command failed to be parsed, checked, - or invoked. - """ - - def __init__( - self, - *, - message: Message, - bot: BotT, - view: StringView, - args: List[Any] = MISSING, - kwargs: Dict[str, Any] = MISSING, - prefix: Optional[str] = None, - command: Optional[Command[Any, ..., Any]] = None, - invoked_with: Optional[str] = None, - invoked_parents: List[str] = MISSING, - invoked_subcommand: Optional[Command[Any, ..., Any]] = None, - subcommand_passed: Optional[str] = None, - command_failed: bool = False, - current_parameter: Optional[Parameter] = None, - current_argument: Optional[str] = None, - interaction: Optional[Interaction] = None, - ): - self.message: Message = message - self.bot: BotT = bot - self.args: List[Any] = args or [] - self.kwargs: Dict[str, Any] = kwargs or {} - self.prefix: Optional[str] = prefix - self.command: Optional[Command[Any, ..., Any]] = command - self.view: StringView = view - self.invoked_with: Optional[str] = invoked_with - self.invoked_parents: List[str] = invoked_parents or [] - self.invoked_subcommand: Optional[Command[Any, ..., Any]] = invoked_subcommand - self.subcommand_passed: Optional[str] = subcommand_passed - self.command_failed: bool = command_failed - self.current_parameter: Optional[Parameter] = current_parameter - self.current_argument: Optional[str] = current_argument - self.interaction: Optional[Interaction] = interaction - self._state: ConnectionState = self.message._state - - @classmethod - async def from_interaction(cls, interaction: Interaction, /) -> Self: - """|coro| - - Creates a context from a :class:`discord.Interaction`. This only - works on application command based interactions, such as slash commands - or context menus. - - On slash command based interactions this creates a synthetic :class:`~discord.Message` - that points to an ephemeral message that the command invoker has executed. This means - that :attr:`Context.author` returns the member that invoked the command. - - In a message context menu based interaction, the :attr:`Context.message` attribute - is the message that the command is being executed on. This means that :attr:`Context.author` - returns the author of the message being targetted. To get the member that invoked - the command then :attr:`discord.Interaction.user` should be used instead. - - .. versionadded:: 2.0 - - Parameters - ----------- - interaction: :class:`discord.Interaction` - The interaction to create a context with. - - Raises - ------- - ValueError - The interaction does not have a valid command. - TypeError - The interaction client is not derived from :class:`Bot` or :class:`AutoShardedBot`. - """ - - # Circular import - from .bot import BotBase - - if not isinstance(interaction.client, BotBase): - raise TypeError('Interaction client is not derived from commands.Bot or commands.AutoShardedBot') - - command = interaction.command - if command is None: - raise ValueError('interaction does not have command data') - - bot: BotT = interaction.client # type: ignore - data: ApplicationCommandInteractionData = interaction.data # type: ignore - if interaction.message is None: - synthetic_payload = { - 'id': interaction.id, - 'reactions': [], - 'embeds': [], - 'mention_everyone': False, - 'tts': False, - 'pinned': False, - 'edited_timestamp': None, - 'type': MessageType.chat_input_command if data.get('type', 1) == 1 else MessageType.context_menu_command, - 'flags': 64, - 'content': '', - 'mentions': [], - 'mention_roles': [], - 'attachments': [], - } - - if interaction.channel_id is None: - raise RuntimeError('interaction channel ID is null, this is probably a Discord bug') - - channel = interaction.channel or PartialMessageable( - state=interaction._state, guild_id=interaction.guild_id, id=interaction.channel_id - ) - message = Message(state=interaction._state, channel=channel, data=synthetic_payload) # type: ignore - message.author = interaction.user - message.attachments = [a for _, a in interaction.namespace if isinstance(a, Attachment)] - else: - message = interaction.message - - prefix = '/' if data.get('type', 1) == 1 else '\u200b' # Mock the prefix - ctx = cls( - message=message, - bot=bot, - view=StringView(''), - args=[], - kwargs={}, - prefix=prefix, - interaction=interaction, - invoked_with=command.name, - command=command, # type: ignore # this will be a hybrid command, technically - ) - interaction._baton = ctx - return ctx - - async def invoke(self, command: Command[CogT, P, T], /, *args: P.args, **kwargs: P.kwargs) -> T: - r"""|coro| - - Calls a command with the arguments given. - - This is useful if you want to just call the callback that a - :class:`.Command` holds internally. - - .. note:: - - This does not handle converters, checks, cooldowns, pre-invoke, - or after-invoke hooks in any matter. It calls the internal callback - directly as-if it was a regular function. - - You must take care in passing the proper arguments when - using this function. - - .. versionchanged:: 2.0 - - ``command`` parameter is now positional-only. - - Parameters - ----------- - command: :class:`.Command` - The command that is going to be called. - \*args - The arguments to use. - \*\*kwargs - The keyword arguments to use. - - Raises - ------- - TypeError - The command argument to invoke is missing. - """ - return await command(self, *args, **kwargs) - - async def reinvoke(self, *, call_hooks: bool = False, restart: bool = True) -> None: - """|coro| - - Calls the command again. - - This is similar to :meth:`~.Context.invoke` except that it bypasses - checks, cooldowns, and error handlers. - - .. note:: - - If you want to bypass :exc:`.UserInputError` derived exceptions, - it is recommended to use the regular :meth:`~.Context.invoke` - as it will work more naturally. After all, this will end up - using the old arguments the user has used and will thus just - fail again. - - Parameters - ------------ - call_hooks: :class:`bool` - Whether to call the before and after invoke hooks. - restart: :class:`bool` - Whether to start the call chain from the very beginning - or where we left off (i.e. the command that caused the error). - The default is to start where we left off. - - Raises - ------- - ValueError - The context to reinvoke is not valid. - """ - cmd = self.command - view = self.view - if cmd is None: - raise ValueError('This context is not valid.') - - # some state to revert to when we're done - index, previous = view.index, view.previous - invoked_with = self.invoked_with - invoked_subcommand = self.invoked_subcommand - invoked_parents = self.invoked_parents - subcommand_passed = self.subcommand_passed - - if restart: - to_call = cmd.root_parent or cmd - view.index = len(self.prefix or '') - view.previous = 0 - self.invoked_parents = [] - self.invoked_with = view.get_word() # advance to get the root command - else: - to_call = cmd - - try: - await to_call.reinvoke(self, call_hooks=call_hooks) - finally: - self.command = cmd - view.index = index - view.previous = previous - self.invoked_with = invoked_with - self.invoked_subcommand = invoked_subcommand - self.invoked_parents = invoked_parents - self.subcommand_passed = subcommand_passed - - @property - def valid(self) -> bool: - """:class:`bool`: Checks if the invocation context is valid to be invoked with.""" - return self.prefix is not None and self.command is not None - - async def _get_channel(self) -> discord.abc.Messageable: - return self.channel - - @property - def clean_prefix(self) -> str: - """:class:`str`: The cleaned up invoke prefix. i.e. mentions are ``@name`` instead of ``<@id>``. - - .. versionadded:: 2.0 - """ - if self.prefix is None: - return '' - - user = self.me - # this breaks if the prefix mention is not the bot itself but I - # consider this to be an *incredibly* strange use case. I'd rather go - # for this common use case rather than waste performance for the - # odd one. - pattern = re.compile(r"<@!?%s>" % user.id) - return pattern.sub("@%s" % user.display_name.replace('\\', r'\\'), self.prefix) - - @property - def cog(self) -> Optional[Cog]: - """Optional[:class:`.Cog`]: Returns the cog associated with this context's command. None if it does not exist.""" - - if self.command is None: - return None - return self.command.cog - - @discord.utils.cached_property - def guild(self) -> Optional[Guild]: - """Optional[:class:`.Guild`]: Returns the guild associated with this context's command. None if not available.""" - return self.message.guild - - @discord.utils.cached_property - def channel(self) -> MessageableChannel: - """Union[:class:`.abc.Messageable`]: Returns the channel associated with this context's command. - Shorthand for :attr:`.Message.channel`. - """ - return self.message.channel - - @discord.utils.cached_property - def author(self) -> Union[User, Member]: - """Union[:class:`~discord.User`, :class:`.Member`]: - Returns the author associated with this context's command. Shorthand for :attr:`.Message.author` - """ - return self.message.author - - @discord.utils.cached_property - def me(self) -> Union[Member, ClientUser]: - """Union[:class:`.Member`, :class:`.ClientUser`]: - Similar to :attr:`.Guild.me` except it may return the :class:`.ClientUser` in private message contexts. - """ - # bot.user will never be None at this point. - return self.guild.me if self.guild is not None else self.bot.user # type: ignore - - @discord.utils.cached_property - def permissions(self) -> Permissions: - """:class:`.Permissions`: Returns the resolved permissions for the invoking user in this channel. - Shorthand for :meth:`.abc.GuildChannel.permissions_for` or :attr:`.Interaction.permissions`. - - .. versionadded:: 2.0 - """ - if self.channel.type is ChannelType.private: - return Permissions._dm_permissions() - if not self.interaction: - # channel and author will always match relevant types here - return self.channel.permissions_for(self.author) # type: ignore - base = self.interaction.permissions - if self.channel.type in (ChannelType.voice, ChannelType.stage_voice): - if not base.connect: - # voice channels cannot be edited by people who can't connect to them - # It also implicitly denies all other voice perms - denied = Permissions.voice() - denied.update(manage_channels=True, manage_roles=True) - base.value &= ~denied.value - else: - # text channels do not have voice related permissions - denied = Permissions.voice() - base.value &= ~denied.value - return base - - @discord.utils.cached_property - def bot_permissions(self) -> Permissions: - """:class:`.Permissions`: Returns the resolved permissions for the bot in this channel. - Shorthand for :meth:`.abc.GuildChannel.permissions_for` or :attr:`.Interaction.app_permissions`. - - For interaction-based commands, this will reflect the effective permissions - for :class:`Context` calls, which may differ from calls through - other :class:`.abc.Messageable` endpoints, like :attr:`channel`. - - Notably, sending messages, embedding links, and attaching files are always - permitted, while reading messages might not be. - - .. versionadded:: 2.0 - """ - channel = self.channel - if channel.type == ChannelType.private: - return Permissions._dm_permissions() - if not self.interaction: - # channel and me will always match relevant types here - return channel.permissions_for(self.me) # type: ignore - guild = channel.guild - base = self.interaction.app_permissions - if self.channel.type in (ChannelType.voice, ChannelType.stage_voice): - if not base.connect: - # voice channels cannot be edited by people who can't connect to them - # It also implicitly denies all other voice perms - denied = Permissions.voice() - denied.update(manage_channels=True, manage_roles=True) - base.value &= ~denied.value - else: - # text channels do not have voice related permissions - denied = Permissions.voice() - base.value &= ~denied.value - base.update( - embed_links=True, - attach_files=True, - send_tts_messages=False, - ) - if isinstance(channel, Thread): - base.send_messages_in_threads = True - else: - base.send_messages = True - return base - - @property - def voice_client(self) -> Optional[VoiceProtocol]: - r"""Optional[:class:`.VoiceProtocol`]: A shortcut to :attr:`.Guild.voice_client`\, if applicable.""" - g = self.guild - return g.voice_client if g else None - - async def send_help(self, *args: Any) -> Any: - """send_help(entity=) - - |coro| - - Shows the help command for the specified entity if given. - The entity can be a command or a cog. - - If no entity is given, then it'll show help for the - entire bot. - - If the entity is a string, then it looks up whether it's a - :class:`Cog` or a :class:`Command`. - - .. note:: - - Due to the way this function works, instead of returning - something similar to :meth:`~.commands.HelpCommand.command_not_found` - this returns ``None`` on bad input or no help command. - - Parameters - ------------ - entity: Optional[Union[:class:`Command`, :class:`Cog`, :class:`str`]] - The entity to show help for. - - Returns - -------- - Any - The result of the help command, if any. - """ - from .core import Command, Group, wrap_callback - from .errors import CommandError - - bot = self.bot - cmd = bot.help_command - - if cmd is None: - return None - - cmd = cmd.copy() - cmd.context = self - - if len(args) == 0: - await cmd.prepare_help_command(self, None) - mapping = cmd.get_bot_mapping() - injected = wrap_callback(cmd.send_bot_help) - try: - return await injected(mapping) - except CommandError as e: - await cmd.on_help_command_error(self, e) - return None - - entity = args[0] - if isinstance(entity, str): - entity = bot.get_cog(entity) or bot.get_command(entity) - - if entity is None: - return None - - try: - entity.qualified_name - except AttributeError: - # if we're here then it's not a cog, group, or command. - return None - - await cmd.prepare_help_command(self, entity.qualified_name) - - try: - if is_cog(entity): - injected = wrap_callback(cmd.send_cog_help) - return await injected(entity) - elif isinstance(entity, Group): - injected = wrap_callback(cmd.send_group_help) - return await injected(entity) - elif isinstance(entity, Command): - injected = wrap_callback(cmd.send_command_help) - return await injected(entity) - else: - return None - except CommandError as e: - await cmd.on_help_command_error(self, e) - - async def reply(self, content: Optional[str] = None, **kwargs: Any) -> Message: - """|coro| - - A shortcut method to :meth:`send` to reply to the - :class:`~discord.Message` referenced by this context. - - For interaction based contexts, this is the same as :meth:`send`. - - .. versionadded:: 1.6 - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` or - :exc:`ValueError` instead of ``InvalidArgument``. - - Raises - -------- - ~discord.HTTPException - Sending the message failed. - ~discord.Forbidden - You do not have the proper permissions to send the message. - ValueError - The ``files`` list is not of the appropriate size - TypeError - You specified both ``file`` and ``files``. - - Returns - --------- - :class:`~discord.Message` - The message that was sent. - """ - if self.interaction is None: - return await self.send(content, reference=self.message, **kwargs) - else: - return await self.send(content, **kwargs) - - def typing(self, *, ephemeral: bool = False) -> Union[Typing, DeferTyping]: - """Returns an asynchronous context manager that allows you to send a typing indicator to - the destination for an indefinite period of time, or 10 seconds if the context manager - is called using ``await``. - - In an interaction based context, this is equivalent to a :meth:`defer` call and - does not do any typing calls. - - Example Usage: :: - - async with channel.typing(): - # simulate something heavy - await asyncio.sleep(20) - - await channel.send('Done!') - - Example Usage: :: - - await channel.typing() - # Do some computational magic for about 10 seconds - await channel.send('Done!') - - .. versionchanged:: 2.0 - This no longer works with the ``with`` syntax, ``async with`` must be used instead. - - .. versionchanged:: 2.0 - Added functionality to ``await`` the context manager to send a typing indicator for 10 seconds. - - Parameters - ----------- - ephemeral: :class:`bool` - Indicates whether the deferred message will eventually be ephemeral. - Only valid for interaction based contexts. - - .. versionadded:: 2.0 - """ - if self.interaction is None: - return Typing(self) - return DeferTyping(self, ephemeral=ephemeral) - - async def defer(self, *, ephemeral: bool = False) -> None: - """|coro| - - Defers the interaction based contexts. - - This is typically used when the interaction is acknowledged - and a secondary action will be done later. - - If this isn't an interaction based context then it does nothing. - - Parameters - ----------- - ephemeral: :class:`bool` - Indicates whether the deferred message will eventually be ephemeral. - - Raises - ------- - HTTPException - Deferring the interaction failed. - InteractionResponded - This interaction has already been responded to before. - """ - - if self.interaction: - await self.interaction.response.defer(ephemeral=ephemeral) - - async def send( - self, - content: Optional[str] = None, - *, - tts: bool = False, - embed: Optional[Embed] = None, - embeds: Optional[Sequence[Embed]] = None, - file: Optional[File] = None, - files: Optional[Sequence[File]] = None, - stickers: Optional[Sequence[Union[GuildSticker, StickerItem]]] = None, - delete_after: Optional[float] = None, - nonce: Optional[Union[str, int]] = None, - allowed_mentions: Optional[AllowedMentions] = None, - reference: Optional[Union[Message, MessageReference, PartialMessage]] = None, - mention_author: Optional[bool] = None, - view: Optional[View] = None, - suppress_embeds: bool = False, - ephemeral: bool = False, - ) -> Message: - """|coro| - - Sends a message to the destination with the content given. - - This works similarly to :meth:`~discord.abc.Messageable.send` for non-interaction contexts. - - For interaction based contexts this does one of the following: - - - :meth:`discord.InteractionResponse.send_message` if no response has been given. - - A followup message if a response has been given. - - Regular send if the interaction has expired - - .. versionchanged:: 2.0 - This function will now raise :exc:`TypeError` or - :exc:`ValueError` instead of ``InvalidArgument``. - - Parameters - ------------ - content: Optional[:class:`str`] - The content of the message to send. - tts: :class:`bool` - Indicates if the message should be sent using text-to-speech. - embed: :class:`~discord.Embed` - The rich embed for the content. - file: :class:`~discord.File` - The file to upload. - files: List[:class:`~discord.File`] - A list of files to upload. Must be a maximum of 10. - nonce: :class:`int` - The nonce to use for sending this message. If the message was successfully sent, - then the message will have a nonce with this value. - delete_after: :class:`float` - If provided, the number of seconds to wait in the background - before deleting the message we just sent. If the deletion fails, - then it is silently ignored. This is ignored for interaction based contexts. - allowed_mentions: :class:`~discord.AllowedMentions` - Controls the mentions being processed in this message. If this is - passed, then the object is merged with :attr:`~discord.Client.allowed_mentions`. - The merging behaviour only overrides attributes that have been explicitly passed - to the object, otherwise it uses the attributes set in :attr:`~discord.Client.allowed_mentions`. - If no object is passed at all then the defaults given by :attr:`~discord.Client.allowed_mentions` - are used instead. - - .. versionadded:: 1.4 - - reference: Union[:class:`~discord.Message`, :class:`~discord.MessageReference`, :class:`~discord.PartialMessage`] - A reference to the :class:`~discord.Message` to which you are replying, this can be created using - :meth:`~discord.Message.to_reference` or passed directly as a :class:`~discord.Message`. You can control - whether this mentions the author of the referenced message using the :attr:`~discord.AllowedMentions.replied_user` - attribute of ``allowed_mentions`` or by setting ``mention_author``. - - This is ignored for interaction based contexts. - - .. versionadded:: 1.6 - - mention_author: Optional[:class:`bool`] - If set, overrides the :attr:`~discord.AllowedMentions.replied_user` attribute of ``allowed_mentions``. - This is ignored for interaction based contexts. - - .. versionadded:: 1.6 - view: :class:`discord.ui.View` - A Discord UI View to add to the message. - - .. versionadded:: 2.0 - embeds: List[:class:`~discord.Embed`] - A list of embeds to upload. Must be a maximum of 10. - - .. versionadded:: 2.0 - stickers: Sequence[Union[:class:`~discord.GuildSticker`, :class:`~discord.StickerItem`]] - A list of stickers to upload. Must be a maximum of 3. This is ignored for interaction based contexts. - - .. versionadded:: 2.0 - suppress_embeds: :class:`bool` - Whether to suppress embeds for the message. This sends the message without any embeds if set to ``True``. - - .. versionadded:: 2.0 - ephemeral: :class:`bool` - Indicates if the message should only be visible to the user who started the interaction. - If a view is sent with an ephemeral message and it has no timeout set then the timeout - is set to 15 minutes. **This is only applicable in contexts with an interaction**. - - .. versionadded:: 2.0 - - Raises - -------- - ~discord.HTTPException - Sending the message failed. - ~discord.Forbidden - You do not have the proper permissions to send the message. - ValueError - The ``files`` list is not of the appropriate size. - TypeError - You specified both ``file`` and ``files``, - or you specified both ``embed`` and ``embeds``, - or the ``reference`` object is not a :class:`~discord.Message`, - :class:`~discord.MessageReference` or :class:`~discord.PartialMessage`. - - Returns - --------- - :class:`~discord.Message` - The message that was sent. - """ - - if self.interaction is None or self.interaction.is_expired(): - return await super().send( - content=content, - tts=tts, - embed=embed, - embeds=embeds, - file=file, - files=files, - stickers=stickers, - delete_after=delete_after, - nonce=nonce, - allowed_mentions=allowed_mentions, - reference=reference, - mention_author=mention_author, - view=view, - suppress_embeds=suppress_embeds, - ) # type: ignore # The overloads don't support Optional but the implementation does - - # Convert the kwargs from None to MISSING to appease the remaining implementations - kwargs = { - 'content': content, - 'tts': tts, - 'embed': MISSING if embed is None else embed, - 'embeds': MISSING if embeds is None else embeds, - 'file': MISSING if file is None else file, - 'files': MISSING if files is None else files, - 'allowed_mentions': MISSING if allowed_mentions is None else allowed_mentions, - 'view': MISSING if view is None else view, - 'suppress_embeds': suppress_embeds, - 'ephemeral': ephemeral, - } - - if self.interaction.response.is_done(): - msg = await self.interaction.followup.send(**kwargs, wait=True) - else: - await self.interaction.response.send_message(**kwargs) - msg = await self.interaction.original_response() - - if delete_after is not None and not (ephemeral and self.interaction is not None): - await msg.delete(delay=delete_after) - return msg diff --git a/.venv/Lib/site-packages/discord/ext/commands/converter.py b/.venv/Lib/site-packages/discord/ext/commands/converter.py deleted file mode 100644 index 2658237..0000000 --- a/.venv/Lib/site-packages/discord/ext/commands/converter.py +++ /dev/null @@ -1,1323 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - -import inspect -import re -from typing import ( - TYPE_CHECKING, - Any, - Dict, - Generic, - Iterable, - List, - Literal, - Optional, - overload, - Protocol, - Tuple, - Type, - TypeVar, - Union, - runtime_checkable, -) -import types - -import discord - -from .errors import * - -if TYPE_CHECKING: - from discord.state import Channel - from discord.threads import Thread - - from .parameters import Parameter - from ._types import BotT, _Bot - from .context import Context - -__all__ = ( - 'Converter', - 'ObjectConverter', - 'MemberConverter', - 'UserConverter', - 'MessageConverter', - 'PartialMessageConverter', - 'TextChannelConverter', - 'InviteConverter', - 'GuildConverter', - 'RoleConverter', - 'GameConverter', - 'ColourConverter', - 'ColorConverter', - 'VoiceChannelConverter', - 'StageChannelConverter', - 'EmojiConverter', - 'PartialEmojiConverter', - 'CategoryChannelConverter', - 'ForumChannelConverter', - 'IDConverter', - 'ThreadConverter', - 'GuildChannelConverter', - 'GuildStickerConverter', - 'ScheduledEventConverter', - 'clean_content', - 'Greedy', - 'Range', - 'run_converters', -) - - -def _get_from_guilds(bot: _Bot, getter: str, argument: Any) -> Any: - result = None - for guild in bot.guilds: - result = getattr(guild, getter)(argument) - if result: - return result - return result - - -_utils_get = discord.utils.get -T = TypeVar('T') -T_co = TypeVar('T_co', covariant=True) -CT = TypeVar('CT', bound=discord.abc.GuildChannel) -TT = TypeVar('TT', bound=discord.Thread) - - -@runtime_checkable -class Converter(Protocol[T_co]): - """The base class of custom converters that require the :class:`.Context` - to be passed to be useful. - - This allows you to implement converters that function similar to the - special cased ``discord`` classes. - - Classes that derive from this should override the :meth:`~.Converter.convert` - method to do its conversion logic. This method must be a :ref:`coroutine `. - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> T_co: - """|coro| - - The method to override to do conversion logic. - - If an error is found while converting, it is recommended to - raise a :exc:`.CommandError` derived exception as it will - properly propagate to the error handlers. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context that the argument is being used in. - argument: :class:`str` - The argument that is being converted. - - Raises - ------- - CommandError - A generic exception occurred when converting the argument. - BadArgument - The converter failed to convert the argument. - """ - raise NotImplementedError('Derived classes need to implement this.') - - -_ID_REGEX = re.compile(r'([0-9]{15,20})$') - - -class IDConverter(Converter[T_co]): - @staticmethod - def _get_id_match(argument): - return _ID_REGEX.match(argument) - - -class ObjectConverter(IDConverter[discord.Object]): - """Converts to a :class:`~discord.Object`. - - The argument must follow the valid ID or mention formats (e.g. `<@80088516616269824>`). - - .. versionadded:: 2.0 - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by member, role, or channel mention. - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Object: - match = self._get_id_match(argument) or re.match(r'<(?:@(?:!|&)?|#)([0-9]{15,20})>$', argument) - - if match is None: - raise ObjectNotFound(argument) - - result = int(match.group(1)) - - return discord.Object(id=result) - - -class MemberConverter(IDConverter[discord.Member]): - """Converts to a :class:`~discord.Member`. - - All lookups are via the local guild. If in a DM context, then the lookup - is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name#discrim - 4. Lookup by name - 5. Lookup by nickname - - .. versionchanged:: 1.5 - Raise :exc:`.MemberNotFound` instead of generic :exc:`.BadArgument` - - .. versionchanged:: 1.5.1 - This converter now lazily fetches members from the gateway and HTTP APIs, - optionally caching the result if :attr:`.MemberCacheFlags.joined` is enabled. - """ - - async def query_member_named(self, guild: discord.Guild, argument: str) -> Optional[discord.Member]: - cache = guild._state.member_cache_flags.joined - if len(argument) > 5 and argument[-5] == '#': - username, _, discriminator = argument.rpartition('#') - members = await guild.query_members(username, limit=100, cache=cache) - return discord.utils.get(members, name=username, discriminator=discriminator) - else: - members = await guild.query_members(argument, limit=100, cache=cache) - return discord.utils.find(lambda m: m.name == argument or m.nick == argument, members) - - async def query_member_by_id(self, bot: _Bot, guild: discord.Guild, user_id: int) -> Optional[discord.Member]: - ws = bot._get_websocket(shard_id=guild.shard_id) - cache = guild._state.member_cache_flags.joined - if ws.is_ratelimited(): - # If we're being rate limited on the WS, then fall back to using the HTTP API - # So we don't have to wait ~60 seconds for the query to finish - try: - member = await guild.fetch_member(user_id) - except discord.HTTPException: - return None - - if cache: - guild._add_member(member) - return member - - # If we're not being rate limited then we can use the websocket to actually query - members = await guild.query_members(limit=1, user_ids=[user_id], cache=cache) - if not members: - return None - return members[0] - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Member: - bot = ctx.bot - match = self._get_id_match(argument) or re.match(r'<@!?([0-9]{15,20})>$', argument) - guild = ctx.guild - result = None - user_id = None - - if match is None: - # not a mention... - if guild: - result = guild.get_member_named(argument) - else: - result = _get_from_guilds(bot, 'get_member_named', argument) - else: - user_id = int(match.group(1)) - if guild: - result = guild.get_member(user_id) or _utils_get(ctx.message.mentions, id=user_id) - else: - result = _get_from_guilds(bot, 'get_member', user_id) - - if not isinstance(result, discord.Member): - if guild is None: - raise MemberNotFound(argument) - - if user_id is not None: - result = await self.query_member_by_id(bot, guild, user_id) - else: - result = await self.query_member_named(guild, argument) - - if not result: - raise MemberNotFound(argument) - - return result - - -class UserConverter(IDConverter[discord.User]): - """Converts to a :class:`~discord.User`. - - All lookups are via the global user cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name#discrim - 4. Lookup by name - - .. versionchanged:: 1.5 - Raise :exc:`.UserNotFound` instead of generic :exc:`.BadArgument` - - .. versionchanged:: 1.6 - This converter now lazily fetches users from the HTTP APIs if an ID is passed - and it's not available in cache. - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.User: - match = self._get_id_match(argument) or re.match(r'<@!?([0-9]{15,20})>$', argument) - result = None - state = ctx._state - - if match is not None: - user_id = int(match.group(1)) - result = ctx.bot.get_user(user_id) or _utils_get(ctx.message.mentions, id=user_id) - if result is None: - try: - result = await ctx.bot.fetch_user(user_id) - except discord.HTTPException: - raise UserNotFound(argument) from None - - return result # type: ignore - - arg = argument - - # Remove the '@' character if this is the first character from the argument - if arg[0] == '@': - # Remove first character - arg = arg[1:] - - # check for discriminator if it exists, - if len(arg) > 5 and arg[-5] == '#': - discrim = arg[-4:] - name = arg[:-5] - predicate = lambda u: u.name == name and u.discriminator == discrim - result = discord.utils.find(predicate, state._users.values()) - if result is not None: - return result - - predicate = lambda u: u.name == arg - result = discord.utils.find(predicate, state._users.values()) - - if result is None: - raise UserNotFound(argument) - - return result - - -class PartialMessageConverter(Converter[discord.PartialMessage]): - """Converts to a :class:`discord.PartialMessage`. - - .. versionadded:: 1.7 - - The creation strategy is as follows (in order): - - 1. By "{channel ID}-{message ID}" (retrieved by shift-clicking on "Copy ID") - 2. By message ID (The message is assumed to be in the context channel.) - 3. By message URL - """ - - @staticmethod - def _get_id_matches(ctx: Context[BotT], argument: str) -> Tuple[Optional[int], int, int]: - id_regex = re.compile(r'(?:(?P[0-9]{15,20})-)?(?P[0-9]{15,20})$') - link_regex = re.compile( - r'https?://(?:(ptb|canary|www)\.)?discord(?:app)?\.com/channels/' - r'(?P[0-9]{15,20}|@me)' - r'/(?P[0-9]{15,20})/(?P[0-9]{15,20})/?$' - ) - match = id_regex.match(argument) or link_regex.match(argument) - if not match: - raise MessageNotFound(argument) - data = match.groupdict() - channel_id = discord.utils._get_as_snowflake(data, 'channel_id') or ctx.channel.id - message_id = int(data['message_id']) - guild_id = data.get('guild_id') - if guild_id is None: - guild_id = ctx.guild and ctx.guild.id - elif guild_id == '@me': - guild_id = None - else: - guild_id = int(guild_id) - return guild_id, message_id, channel_id - - @staticmethod - def _resolve_channel( - ctx: Context[BotT], guild_id: Optional[int], channel_id: Optional[int] - ) -> Optional[Union[Channel, Thread]]: - if channel_id is None: - # we were passed just a message id so we can assume the channel is the current context channel - return ctx.channel - - if guild_id is not None: - guild = ctx.bot.get_guild(guild_id) - if guild is None: - return None - return guild._resolve_channel(channel_id) - - return ctx.bot.get_channel(channel_id) - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.PartialMessage: - guild_id, message_id, channel_id = self._get_id_matches(ctx, argument) - channel = self._resolve_channel(ctx, guild_id, channel_id) - if not channel or not isinstance(channel, discord.abc.Messageable): - raise ChannelNotFound(channel_id) - return discord.PartialMessage(channel=channel, id=message_id) - - -class MessageConverter(IDConverter[discord.Message]): - """Converts to a :class:`discord.Message`. - - .. versionadded:: 1.1 - - The lookup strategy is as follows (in order): - - 1. Lookup by "{channel ID}-{message ID}" (retrieved by shift-clicking on "Copy ID") - 2. Lookup by message ID (the message **must** be in the context channel) - 3. Lookup by message URL - - .. versionchanged:: 1.5 - Raise :exc:`.ChannelNotFound`, :exc:`.MessageNotFound` or :exc:`.ChannelNotReadable` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Message: - guild_id, message_id, channel_id = PartialMessageConverter._get_id_matches(ctx, argument) - message = ctx.bot._connection._get_message(message_id) - if message: - return message - channel = PartialMessageConverter._resolve_channel(ctx, guild_id, channel_id) - if not channel or not isinstance(channel, discord.abc.Messageable): - raise ChannelNotFound(channel_id) - try: - return await channel.fetch_message(message_id) - except discord.NotFound: - raise MessageNotFound(argument) - except discord.Forbidden: - raise ChannelNotReadable(channel) # type: ignore # type-checker thinks channel could be a DMChannel at this point - - -class GuildChannelConverter(IDConverter[discord.abc.GuildChannel]): - """Converts to a :class:`~discord.abc.GuildChannel`. - - All lookups are via the local guild. If in a DM context, then the lookup - is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name. - - .. versionadded:: 2.0 - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.abc.GuildChannel: - return self._resolve_channel(ctx, argument, 'channels', discord.abc.GuildChannel) - - @staticmethod - def _resolve_channel(ctx: Context[BotT], argument: str, attribute: str, type: Type[CT]) -> CT: - bot = ctx.bot - - match = IDConverter._get_id_match(argument) or re.match(r'<#([0-9]{15,20})>$', argument) - result = None - guild = ctx.guild - - if match is None: - # not a mention - if guild: - iterable: Iterable[CT] = getattr(guild, attribute) - result: Optional[CT] = discord.utils.get(iterable, name=argument) - else: - - def check(c): - return isinstance(c, type) and c.name == argument - - result = discord.utils.find(check, bot.get_all_channels()) # type: ignore - else: - channel_id = int(match.group(1)) - if guild: - # guild.get_channel returns an explicit union instead of the base class - result = guild.get_channel(channel_id) # type: ignore - else: - result = _get_from_guilds(bot, 'get_channel', channel_id) - - if not isinstance(result, type): - raise ChannelNotFound(argument) - - return result - - @staticmethod - def _resolve_thread(ctx: Context[BotT], argument: str, attribute: str, type: Type[TT]) -> TT: - match = IDConverter._get_id_match(argument) or re.match(r'<#([0-9]{15,20})>$', argument) - result = None - guild = ctx.guild - - if match is None: - # not a mention - if guild: - iterable: Iterable[TT] = getattr(guild, attribute) - result: Optional[TT] = discord.utils.get(iterable, name=argument) - else: - thread_id = int(match.group(1)) - if guild: - result = guild.get_thread(thread_id) # type: ignore - - if not result or not isinstance(result, type): - raise ThreadNotFound(argument) - - return result - - -class TextChannelConverter(IDConverter[discord.TextChannel]): - """Converts to a :class:`~discord.TextChannel`. - - All lookups are via the local guild. If in a DM context, then the lookup - is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name - - .. versionchanged:: 1.5 - Raise :exc:`.ChannelNotFound` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.TextChannel: - return GuildChannelConverter._resolve_channel(ctx, argument, 'text_channels', discord.TextChannel) - - -class VoiceChannelConverter(IDConverter[discord.VoiceChannel]): - """Converts to a :class:`~discord.VoiceChannel`. - - All lookups are via the local guild. If in a DM context, then the lookup - is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name - - .. versionchanged:: 1.5 - Raise :exc:`.ChannelNotFound` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.VoiceChannel: - return GuildChannelConverter._resolve_channel(ctx, argument, 'voice_channels', discord.VoiceChannel) - - -class StageChannelConverter(IDConverter[discord.StageChannel]): - """Converts to a :class:`~discord.StageChannel`. - - .. versionadded:: 1.7 - - All lookups are via the local guild. If in a DM context, then the lookup - is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.StageChannel: - return GuildChannelConverter._resolve_channel(ctx, argument, 'stage_channels', discord.StageChannel) - - -class CategoryChannelConverter(IDConverter[discord.CategoryChannel]): - """Converts to a :class:`~discord.CategoryChannel`. - - All lookups are via the local guild. If in a DM context, then the lookup - is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name - - .. versionchanged:: 1.5 - Raise :exc:`.ChannelNotFound` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.CategoryChannel: - return GuildChannelConverter._resolve_channel(ctx, argument, 'categories', discord.CategoryChannel) - - -class ThreadConverter(IDConverter[discord.Thread]): - """Coverts to a :class:`~discord.Thread`. - - All lookups are via the local guild. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name. - - .. versionadded: 2.0 - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Thread: - return GuildChannelConverter._resolve_thread(ctx, argument, 'threads', discord.Thread) - - -class ForumChannelConverter(IDConverter[discord.ForumChannel]): - """Converts to a :class:`~discord.ForumChannel`. - - All lookups are via the local guild. If in a DM context, then the lookup - is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name - - .. versionadded:: 2.0 - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.ForumChannel: - return GuildChannelConverter._resolve_channel(ctx, argument, 'forums', discord.ForumChannel) - - -class ColourConverter(Converter[discord.Colour]): - """Converts to a :class:`~discord.Colour`. - - .. versionchanged:: 1.5 - Add an alias named ColorConverter - - The following formats are accepted: - - - ``0x`` - - ``#`` - - ``0x#`` - - ``rgb(, , )`` - - Any of the ``classmethod`` in :class:`~discord.Colour` - - - The ``_`` in the name can be optionally replaced with spaces. - - Like CSS, ```` can be either 0-255 or 0-100% and ```` can be - either a 6 digit hex number or a 3 digit hex shortcut (e.g. #fff). - - .. versionchanged:: 1.5 - Raise :exc:`.BadColourArgument` instead of generic :exc:`.BadArgument` - - .. versionchanged:: 1.7 - Added support for ``rgb`` function and 3-digit hex shortcuts - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Colour: - try: - return discord.Colour.from_str(argument) - except ValueError: - arg = argument.lower().replace(' ', '_') - method = getattr(discord.Colour, arg, None) - if arg.startswith('from_') or method is None or not inspect.ismethod(method): - raise BadColourArgument(arg) - return method() - - -ColorConverter = ColourConverter - - -class RoleConverter(IDConverter[discord.Role]): - """Converts to a :class:`~discord.Role`. - - All lookups are via the local guild. If in a DM context, the converter raises - :exc:`.NoPrivateMessage` exception. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by mention. - 3. Lookup by name - - .. versionchanged:: 1.5 - Raise :exc:`.RoleNotFound` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Role: - guild = ctx.guild - if not guild: - raise NoPrivateMessage() - - match = self._get_id_match(argument) or re.match(r'<@&([0-9]{15,20})>$', argument) - if match: - result = guild.get_role(int(match.group(1))) - else: - result = discord.utils.get(guild._roles.values(), name=argument) - - if result is None: - raise RoleNotFound(argument) - return result - - -class GameConverter(Converter[discord.Game]): - """Converts to :class:`~discord.Game`.""" - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Game: - return discord.Game(name=argument) - - -class InviteConverter(Converter[discord.Invite]): - """Converts to a :class:`~discord.Invite`. - - This is done via an HTTP request using :meth:`.Bot.fetch_invite`. - - .. versionchanged:: 1.5 - Raise :exc:`.BadInviteArgument` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Invite: - try: - invite = await ctx.bot.fetch_invite(argument) - return invite - except Exception as exc: - raise BadInviteArgument(argument) from exc - - -class GuildConverter(IDConverter[discord.Guild]): - """Converts to a :class:`~discord.Guild`. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by name. (There is no disambiguation for Guilds with multiple matching names). - - .. versionadded:: 1.7 - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Guild: - match = self._get_id_match(argument) - result = None - - if match is not None: - guild_id = int(match.group(1)) - result = ctx.bot.get_guild(guild_id) - - if result is None: - result = discord.utils.get(ctx.bot.guilds, name=argument) - - if result is None: - raise GuildNotFound(argument) - return result - - -class EmojiConverter(IDConverter[discord.Emoji]): - """Converts to a :class:`~discord.Emoji`. - - All lookups are done for the local guild first, if available. If that lookup - fails, then it checks the client's global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by extracting ID from the emoji. - 3. Lookup by name - - .. versionchanged:: 1.5 - Raise :exc:`.EmojiNotFound` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.Emoji: - match = self._get_id_match(argument) or re.match(r'$', argument) - result = None - bot = ctx.bot - guild = ctx.guild - - if match is None: - # Try to get the emoji by name. Try local guild first. - if guild: - result = discord.utils.get(guild.emojis, name=argument) - - if result is None: - result = discord.utils.get(bot.emojis, name=argument) - else: - emoji_id = int(match.group(1)) - - # Try to look up emoji by id. - result = bot.get_emoji(emoji_id) - - if result is None: - raise EmojiNotFound(argument) - - return result - - -class PartialEmojiConverter(Converter[discord.PartialEmoji]): - """Converts to a :class:`~discord.PartialEmoji`. - - This is done by extracting the animated flag, name and ID from the emoji. - - .. versionchanged:: 1.5 - Raise :exc:`.PartialEmojiConversionFailure` instead of generic :exc:`.BadArgument` - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.PartialEmoji: - match = re.match(r'<(a?):([a-zA-Z0-9\_]{1,32}):([0-9]{15,20})>$', argument) - - if match: - emoji_animated = bool(match.group(1)) - emoji_name = match.group(2) - emoji_id = int(match.group(3)) - - return discord.PartialEmoji.with_state( - ctx.bot._connection, animated=emoji_animated, name=emoji_name, id=emoji_id - ) - - raise PartialEmojiConversionFailure(argument) - - -class GuildStickerConverter(IDConverter[discord.GuildSticker]): - """Converts to a :class:`~discord.GuildSticker`. - - All lookups are done for the local guild first, if available. If that lookup - fails, then it checks the client's global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by name. - - .. versionadded:: 2.0 - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.GuildSticker: - match = self._get_id_match(argument) - result = None - bot = ctx.bot - guild = ctx.guild - - if match is None: - # Try to get the sticker by name. Try local guild first. - if guild: - result = discord.utils.get(guild.stickers, name=argument) - - if result is None: - result = discord.utils.get(bot.stickers, name=argument) - else: - sticker_id = int(match.group(1)) - - # Try to look up sticker by id. - result = bot.get_sticker(sticker_id) - - if result is None: - raise GuildStickerNotFound(argument) - - return result - - -class ScheduledEventConverter(IDConverter[discord.ScheduledEvent]): - """Converts to a :class:`~discord.ScheduledEvent`. - - Lookups are done for the local guild if available. Otherwise, for a DM context, - lookup is done by the global cache. - - The lookup strategy is as follows (in order): - - 1. Lookup by ID. - 2. Lookup by url. - 3. Lookup by name. - - .. versionadded:: 2.0 - """ - - async def convert(self, ctx: Context[BotT], argument: str) -> discord.ScheduledEvent: - guild = ctx.guild - match = self._get_id_match(argument) - result = None - - if match: - # ID match - event_id = int(match.group(1)) - if guild: - result = guild.get_scheduled_event(event_id) - else: - for guild in ctx.bot.guilds: - result = guild.get_scheduled_event(event_id) - if result: - break - else: - pattern = ( - r'https?://(?:(ptb|canary|www)\.)?discord\.com/events/' - r'(?P[0-9]{15,20})/' - r'(?P[0-9]{15,20})$' - ) - match = re.match(pattern, argument, flags=re.I) - if match: - # URL match - guild = ctx.bot.get_guild(int(match.group('guild_id'))) - - if guild: - event_id = int(match.group('event_id')) - result = guild.get_scheduled_event(event_id) - else: - # lookup by name - if guild: - result = discord.utils.get(guild.scheduled_events, name=argument) - else: - for guild in ctx.bot.guilds: - result = discord.utils.get(guild.scheduled_events, name=argument) - if result: - break - if result is None: - raise ScheduledEventNotFound(argument) - - return result - - -class clean_content(Converter[str]): - """Converts the argument to mention scrubbed version of - said content. - - This behaves similarly to :attr:`~discord.Message.clean_content`. - - Attributes - ------------ - fix_channel_mentions: :class:`bool` - Whether to clean channel mentions. - use_nicknames: :class:`bool` - Whether to use nicknames when transforming mentions. - escape_markdown: :class:`bool` - Whether to also escape special markdown characters. - remove_markdown: :class:`bool` - Whether to also remove special markdown characters. This option is not supported with ``escape_markdown`` - - .. versionadded:: 1.7 - """ - - def __init__( - self, - *, - fix_channel_mentions: bool = False, - use_nicknames: bool = True, - escape_markdown: bool = False, - remove_markdown: bool = False, - ) -> None: - self.fix_channel_mentions = fix_channel_mentions - self.use_nicknames = use_nicknames - self.escape_markdown = escape_markdown - self.remove_markdown = remove_markdown - - async def convert(self, ctx: Context[BotT], argument: str) -> str: - msg = ctx.message - - if ctx.guild: - - def resolve_member(id: int) -> str: - m = _utils_get(msg.mentions, id=id) or ctx.guild.get_member(id) # type: ignore - return f'@{m.display_name if self.use_nicknames else m.name}' if m else '@deleted-user' - - def resolve_role(id: int) -> str: - r = _utils_get(msg.role_mentions, id=id) or ctx.guild.get_role(id) # type: ignore - return f'@{r.name}' if r else '@deleted-role' - - else: - - def resolve_member(id: int) -> str: - m = _utils_get(msg.mentions, id=id) or ctx.bot.get_user(id) - return f'@{m.display_name}' if m else '@deleted-user' - - def resolve_role(id: int) -> str: - return '@deleted-role' - - if self.fix_channel_mentions and ctx.guild: - - def resolve_channel(id: int) -> str: - c = ctx.guild._resolve_channel(id) # type: ignore - return f'#{c.name}' if c else '#deleted-channel' - - else: - - def resolve_channel(id: int) -> str: - return f'<#{id}>' - - transforms = { - '@': resolve_member, - '@!': resolve_member, - '#': resolve_channel, - '@&': resolve_role, - } - - def repl(match: re.Match) -> str: - type = match[1] - id = int(match[2]) - transformed = transforms[type](id) - return transformed - - result = re.sub(r'<(@[!&]?|#)([0-9]{15,20})>', repl, argument) - if self.escape_markdown: - result = discord.utils.escape_markdown(result) - elif self.remove_markdown: - result = discord.utils.remove_markdown(result) - - # Completely ensure no mentions escape: - return discord.utils.escape_mentions(result) - - -class Greedy(List[T]): - r"""A special converter that greedily consumes arguments until it can't. - As a consequence of this behaviour, most input errors are silently discarded, - since it is used as an indicator of when to stop parsing. - - When a parser error is met the greedy converter stops converting, undoes the - internal string parsing routine, and continues parsing regularly. - - For example, in the following code: - - .. code-block:: python3 - - @commands.command() - async def test(ctx, numbers: Greedy[int], reason: str): - await ctx.send("numbers: {}, reason: {}".format(numbers, reason)) - - An invocation of ``[p]test 1 2 3 4 5 6 hello`` would pass ``numbers`` with - ``[1, 2, 3, 4, 5, 6]`` and ``reason`` with ``hello``\. - - For more information, check :ref:`ext_commands_special_converters`. - - .. note:: - - For interaction based contexts the conversion error is propagated - rather than swallowed due to the difference in user experience with - application commands. - """ - - __slots__ = ('converter',) - - def __init__(self, *, converter: T) -> None: - self.converter: T = converter - - def __repr__(self) -> str: - converter = getattr(self.converter, '__name__', repr(self.converter)) - return f'Greedy[{converter}]' - - def __class_getitem__(cls, params: Union[Tuple[T], T]) -> Greedy[T]: - if not isinstance(params, tuple): - params = (params,) - if len(params) != 1: - raise TypeError('Greedy[...] only takes a single argument') - converter = params[0] - - args = getattr(converter, '__args__', ()) - if discord.utils.PY_310 and converter.__class__ is types.UnionType: # type: ignore - converter = Union[args] # type: ignore - - origin = getattr(converter, '__origin__', None) - - if not (callable(converter) or isinstance(converter, Converter) or origin is not None): - raise TypeError('Greedy[...] expects a type or a Converter instance.') - - if converter in (str, type(None)) or origin is Greedy: - raise TypeError(f'Greedy[{converter.__name__}] is invalid.') # type: ignore - - if origin is Union and type(None) in args: - raise TypeError(f'Greedy[{converter!r}] is invalid.') - - return cls(converter=converter) - - -if TYPE_CHECKING: - from typing_extensions import Annotated as Range -else: - - class Range: - """A special converter that can be applied to a parameter to require a numeric - or string type to fit within the range provided. - - During type checking time this is equivalent to :obj:`typing.Annotated` so type checkers understand - the intent of the code. - - Some example ranges: - - - ``Range[int, 10]`` means the minimum is 10 with no maximum. - - ``Range[int, None, 10]`` means the maximum is 10 with no minimum. - - ``Range[int, 1, 10]`` means the minimum is 1 and the maximum is 10. - - Inside a :class:`HybridCommand` this functions equivalently to :class:`discord.app_commands.Range`. - - If the value cannot be converted to the provided type or is outside the given range, - :class:`~.ext.commands.BadArgument` or :class:`~.ext.commands.RangeError` is raised to - the appropriate error handlers respectively. - - .. versionadded:: 2.0 - - Examples - ---------- - - .. code-block:: python3 - - @bot.command() - async def range(ctx: commands.Context, value: commands.Range[int, 10, 12]): - await ctx.send(f'Your value is {value}') - """ - - def __init__( - self, - *, - annotation: Any, - min: Optional[Union[int, float]] = None, - max: Optional[Union[int, float]] = None, - ) -> None: - self.annotation: Any = annotation - self.min: Optional[Union[int, float]] = min - self.max: Optional[Union[int, float]] = max - - if min and max and min > max: - raise TypeError('minimum cannot be larger than maximum') - - async def convert(self, ctx: Context[BotT], value: str) -> Union[int, float]: - try: - count = converted = self.annotation(value) - except ValueError: - raise BadArgument( - f'Converting to "{self.annotation.__name__}" failed for parameter "{ctx.current_parameter.name}".' - ) - - if self.annotation is str: - count = len(value) - - if (self.min is not None and count < self.min) or (self.max is not None and count > self.max): - raise RangeError(converted, minimum=self.min, maximum=self.max) - - return converted - - def __call__(self) -> None: - # Trick to allow it inside typing.Union - pass - - def __class_getitem__(cls, obj) -> Range: - if not isinstance(obj, tuple): - raise TypeError(f'expected tuple for arguments, received {obj.__class__!r} instead') - - if len(obj) == 2: - obj = (*obj, None) - elif len(obj) != 3: - raise TypeError('Range accepts either two or three arguments with the first being the type of range.') - - annotation, min, max = obj - - if min is None and max is None: - raise TypeError('Range must not be empty') - - if min is not None and max is not None: - # At this point max and min are both not none - if type(min) != type(max): - raise TypeError('Both min and max in Range must be the same type') - - if annotation not in (int, float, str): - raise TypeError(f'expected int, float, or str as range type, received {annotation!r} instead') - - if annotation in (str, int): - cast = int - else: - cast = float - - return cls( - annotation=annotation, - min=cast(min) if min is not None else None, - max=cast(max) if max is not None else None, - ) - - -def _convert_to_bool(argument: str) -> bool: - lowered = argument.lower() - if lowered in ('yes', 'y', 'true', 't', '1', 'enable', 'on'): - return True - elif lowered in ('no', 'n', 'false', 'f', '0', 'disable', 'off'): - return False - else: - raise BadBoolArgument(lowered) - - -_GenericAlias = type(List[T]) - - -def is_generic_type(tp: Any, *, _GenericAlias: type = _GenericAlias) -> bool: - return isinstance(tp, type) and issubclass(tp, Generic) or isinstance(tp, _GenericAlias) - - -CONVERTER_MAPPING: Dict[type, Any] = { - discord.Object: ObjectConverter, - discord.Member: MemberConverter, - discord.User: UserConverter, - discord.Message: MessageConverter, - discord.PartialMessage: PartialMessageConverter, - discord.TextChannel: TextChannelConverter, - discord.Invite: InviteConverter, - discord.Guild: GuildConverter, - discord.Role: RoleConverter, - discord.Game: GameConverter, - discord.Colour: ColourConverter, - discord.VoiceChannel: VoiceChannelConverter, - discord.StageChannel: StageChannelConverter, - discord.Emoji: EmojiConverter, - discord.PartialEmoji: PartialEmojiConverter, - discord.CategoryChannel: CategoryChannelConverter, - discord.Thread: ThreadConverter, - discord.abc.GuildChannel: GuildChannelConverter, - discord.GuildSticker: GuildStickerConverter, - discord.ScheduledEvent: ScheduledEventConverter, - discord.ForumChannel: ForumChannelConverter, -} - - -async def _actual_conversion(ctx: Context[BotT], converter: Any, argument: str, param: inspect.Parameter): - if converter is bool: - return _convert_to_bool(argument) - - try: - module = converter.__module__ - except AttributeError: - pass - else: - if module is not None and (module.startswith('discord.') and not module.endswith('converter')): - converter = CONVERTER_MAPPING.get(converter, converter) - - try: - if inspect.isclass(converter) and issubclass(converter, Converter): - if inspect.ismethod(converter.convert): - return await converter.convert(ctx, argument) - else: - return await converter().convert(ctx, argument) - elif isinstance(converter, Converter): - return await converter.convert(ctx, argument) # type: ignore - except CommandError: - raise - except Exception as exc: - raise ConversionError(converter, exc) from exc # type: ignore - - try: - return converter(argument) - except CommandError: - raise - except Exception as exc: - try: - name = converter.__name__ - except AttributeError: - name = converter.__class__.__name__ - - raise BadArgument(f'Converting to "{name}" failed for parameter "{param.name}".') from exc - - -@overload -async def run_converters( - ctx: Context[BotT], converter: Union[Type[Converter[T]], Converter[T]], argument: str, param: Parameter -) -> T: - ... - - -@overload -async def run_converters(ctx: Context[BotT], converter: Any, argument: str, param: Parameter) -> Any: - ... - - -async def run_converters(ctx: Context[BotT], converter: Any, argument: str, param: Parameter) -> Any: - """|coro| - - Runs converters for a given converter, argument, and parameter. - - This function does the same work that the library does under the hood. - - .. versionadded:: 2.0 - - Parameters - ------------ - ctx: :class:`Context` - The invocation context to run the converters under. - converter: Any - The converter to run, this corresponds to the annotation in the function. - argument: :class:`str` - The argument to convert to. - param: :class:`Parameter` - The parameter being converted. This is mainly for error reporting. - - Raises - ------- - CommandError - The converter failed to convert. - - Returns - -------- - Any - The resulting conversion. - """ - origin = getattr(converter, '__origin__', None) - - if origin is Union: - errors = [] - _NoneType = type(None) - union_args = converter.__args__ - for conv in union_args: - # if we got to this part in the code, then the previous conversions have failed - # so we should just undo the view, return the default, and allow parsing to continue - # with the other parameters - if conv is _NoneType and param.kind != param.VAR_POSITIONAL: - ctx.view.undo() - return None if param.required else await param.get_default(ctx) - - try: - value = await run_converters(ctx, conv, argument, param) - except CommandError as exc: - errors.append(exc) - else: - return value - - # if we're here, then we failed all the converters - raise BadUnionArgument(param, union_args, errors) - - if origin is Literal: - errors = [] - conversions = {} - literal_args = converter.__args__ - for literal in literal_args: - literal_type = type(literal) - try: - value = conversions[literal_type] - except KeyError: - try: - value = await _actual_conversion(ctx, literal_type, argument, param) - except CommandError as exc: - errors.append(exc) - conversions[literal_type] = object() - continue - else: - conversions[literal_type] = value - - if value == literal: - return value - - # if we're here, then we failed to match all the literals - raise BadLiteralArgument(param, literal_args, errors) - - # This must be the last if-clause in the chain of origin checking - # Nearly every type is a generic type within the typing library - # So care must be taken to make sure a more specialised origin handle - # isn't overwritten by the widest if clause - if origin is not None and is_generic_type(converter): - converter = origin - - return await _actual_conversion(ctx, converter, argument, param) diff --git a/.venv/Lib/site-packages/discord/ext/commands/cooldowns.py b/.venv/Lib/site-packages/discord/ext/commands/cooldowns.py deleted file mode 100644 index 2af7cb0..0000000 --- a/.venv/Lib/site-packages/discord/ext/commands/cooldowns.py +++ /dev/null @@ -1,285 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" - -from __future__ import annotations - - -from typing import Any, Callable, Deque, Dict, Optional, Union, Generic, TypeVar, TYPE_CHECKING -from discord.enums import Enum -import time -import asyncio -from collections import deque - -from ...abc import PrivateChannel -from .errors import MaxConcurrencyReached -from .context import Context -from discord.app_commands import Cooldown as Cooldown - -if TYPE_CHECKING: - from typing_extensions import Self - - from ...message import Message - -__all__ = ( - 'BucketType', - 'Cooldown', - 'CooldownMapping', - 'DynamicCooldownMapping', - 'MaxConcurrency', -) - -T_contra = TypeVar('T_contra', contravariant=True) - - -class BucketType(Enum): - default = 0 - user = 1 - guild = 2 - channel = 3 - member = 4 - category = 5 - role = 6 - - def get_key(self, msg: Union[Message, Context[Any]]) -> Any: - if self is BucketType.user: - return msg.author.id - elif self is BucketType.guild: - return (msg.guild or msg.author).id - elif self is BucketType.channel: - return msg.channel.id - elif self is BucketType.member: - return ((msg.guild and msg.guild.id), msg.author.id) - elif self is BucketType.category: - return (msg.channel.category or msg.channel).id # type: ignore - elif self is BucketType.role: - # we return the channel id of a private-channel as there are only roles in guilds - # and that yields the same result as for a guild with only the @everyone role - # NOTE: PrivateChannel doesn't actually have an id attribute but we assume we are - # receiving a DMChannel or GroupChannel which inherit from PrivateChannel and do - return (msg.channel if isinstance(msg.channel, PrivateChannel) else msg.author.top_role).id # type: ignore - - def __call__(self, msg: Union[Message, Context[Any]]) -> Any: - return self.get_key(msg) - - -class CooldownMapping(Generic[T_contra]): - def __init__( - self, - original: Optional[Cooldown], - type: Callable[[T_contra], Any], - ) -> None: - if not callable(type): - raise TypeError('Cooldown type must be a BucketType or callable') - - self._cache: Dict[Any, Cooldown] = {} - self._cooldown: Optional[Cooldown] = original - self._type: Callable[[T_contra], Any] = type - - def copy(self) -> CooldownMapping[T_contra]: - ret = CooldownMapping(self._cooldown, self._type) - ret._cache = self._cache.copy() - return ret - - @property - def valid(self) -> bool: - return self._cooldown is not None - - @property - def type(self) -> Callable[[T_contra], Any]: - return self._type - - @classmethod - def from_cooldown(cls, rate: float, per: float, type: Callable[[T_contra], Any]) -> Self: - return cls(Cooldown(rate, per), type) - - def _bucket_key(self, msg: T_contra) -> Any: - return self._type(msg) - - def _verify_cache_integrity(self, current: Optional[float] = None) -> None: - # we want to delete all cache objects that haven't been used - # in a cooldown window. e.g. if we have a command that has a - # cooldown of 60s and it has not been used in 60s then that key should be deleted - current = current or time.time() - dead_keys = [k for k, v in self._cache.items() if current > v._last + v.per] - for k in dead_keys: - del self._cache[k] - - def create_bucket(self, message: T_contra) -> Cooldown: - return self._cooldown.copy() # type: ignore - - def get_bucket(self, message: T_contra, current: Optional[float] = None) -> Optional[Cooldown]: - if self._type is BucketType.default: - return self._cooldown - - self._verify_cache_integrity(current) - key = self._bucket_key(message) - if key not in self._cache: - bucket = self.create_bucket(message) - if bucket is not None: - self._cache[key] = bucket - else: - bucket = self._cache[key] - - return bucket - - def update_rate_limit(self, message: T_contra, current: Optional[float] = None, tokens: int = 1) -> Optional[float]: - bucket = self.get_bucket(message, current) - if bucket is None: - return None - return bucket.update_rate_limit(current, tokens=tokens) - - -class DynamicCooldownMapping(CooldownMapping[T_contra]): - def __init__( - self, - factory: Callable[[T_contra], Optional[Cooldown]], - type: Callable[[T_contra], Any], - ) -> None: - super().__init__(None, type) - self._factory: Callable[[T_contra], Optional[Cooldown]] = factory - - def copy(self) -> DynamicCooldownMapping[T_contra]: - ret = DynamicCooldownMapping(self._factory, self._type) - ret._cache = self._cache.copy() - return ret - - @property - def valid(self) -> bool: - return True - - def create_bucket(self, message: T_contra) -> Optional[Cooldown]: - return self._factory(message) - - -class _Semaphore: - """This class is a version of a semaphore. - - If you're wondering why asyncio.Semaphore isn't being used, - it's because it doesn't expose the internal value. This internal - value is necessary because I need to support both `wait=True` and - `wait=False`. - - An asyncio.Queue could have been used to do this as well -- but it is - not as inefficient since internally that uses two queues and is a bit - overkill for what is basically a counter. - """ - - __slots__ = ('value', 'loop', '_waiters') - - def __init__(self, number: int) -> None: - self.value: int = number - self.loop: asyncio.AbstractEventLoop = asyncio.get_running_loop() - self._waiters: Deque[asyncio.Future] = deque() - - def __repr__(self) -> str: - return f'<_Semaphore value={self.value} waiters={len(self._waiters)}>' - - def locked(self) -> bool: - return self.value == 0 - - def is_active(self) -> bool: - return len(self._waiters) > 0 - - def wake_up(self) -> None: - while self._waiters: - future = self._waiters.popleft() - if not future.done(): - future.set_result(None) - return - - async def acquire(self, *, wait: bool = False) -> bool: - if not wait and self.value <= 0: - # signal that we're not acquiring - return False - - while self.value <= 0: - future = self.loop.create_future() - self._waiters.append(future) - try: - await future - except: - future.cancel() - if self.value > 0 and not future.cancelled(): - self.wake_up() - raise - - self.value -= 1 - return True - - def release(self) -> None: - self.value += 1 - self.wake_up() - - -class MaxConcurrency: - __slots__ = ('number', 'per', 'wait', '_mapping') - - def __init__(self, number: int, *, per: BucketType, wait: bool) -> None: - self._mapping: Dict[Any, _Semaphore] = {} - self.per: BucketType = per - self.number: int = number - self.wait: bool = wait - - if number <= 0: - raise ValueError('max_concurrency \'number\' cannot be less than 1') - - if not isinstance(per, BucketType): - raise TypeError(f'max_concurrency \'per\' must be of type BucketType not {type(per)!r}') - - def copy(self) -> Self: - return self.__class__(self.number, per=self.per, wait=self.wait) - - def __repr__(self) -> str: - return f'' - - def get_key(self, message: Union[Message, Context[Any]]) -> Any: - return self.per.get_key(message) - - async def acquire(self, message: Union[Message, Context[Any]]) -> None: - key = self.get_key(message) - - try: - sem = self._mapping[key] - except KeyError: - self._mapping[key] = sem = _Semaphore(self.number) - - acquired = await sem.acquire(wait=self.wait) - if not acquired: - raise MaxConcurrencyReached(self.number, self.per) - - async def release(self, message: Union[Message, Context[Any]]) -> None: - # Technically there's no reason for this function to be async - # But it might be more useful in the future - key = self.get_key(message) - - try: - sem = self._mapping[key] - except KeyError: - # ...? peculiar - return - else: - sem.release() - - if sem.value >= self.number and not sem.is_active(): - del self._mapping[key] diff --git a/.venv/Lib/site-packages/discord/ext/commands/core.py b/.venv/Lib/site-packages/discord/ext/commands/core.py deleted file mode 100644 index 44ddeaf..0000000 --- a/.venv/Lib/site-packages/discord/ext/commands/core.py +++ /dev/null @@ -1,2586 +0,0 @@ -""" -The MIT License (MIT) - -Copyright (c) 2015-present Rapptz - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -""" -from __future__ import annotations - -import asyncio -import datetime -import functools -import inspect -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Dict, - Generator, - Generic, - List, - Literal, - Optional, - Set, - Tuple, - Type, - TypeVar, - Union, - overload, -) - -import discord - -from ._types import _BaseCommand, CogT -from .cog import Cog -from .context import Context -from .converter import Greedy, run_converters -from .cooldowns import BucketType, Cooldown, CooldownMapping, DynamicCooldownMapping, MaxConcurrency -from .errors import * -from .parameters import Parameter, Signature - -if TYPE_CHECKING: - from typing_extensions import Concatenate, ParamSpec, Self - - from ._types import BotT, Check, ContextT, Coro, CoroFunc, Error, Hook, UserCheck - - -__all__ = ( - 'Command', - 'Group', - 'GroupMixin', - 'command', - 'group', - 'has_role', - 'has_permissions', - 'has_any_role', - 'check', - 'check_any', - 'before_invoke', - 'after_invoke', - 'bot_has_role', - 'bot_has_permissions', - 'bot_has_any_role', - 'cooldown', - 'dynamic_cooldown', - 'max_concurrency', - 'dm_only', - 'guild_only', - 'is_owner', - 'is_nsfw', - 'has_guild_permissions', - 'bot_has_guild_permissions', -) - -MISSING: Any = discord.utils.MISSING - -T = TypeVar('T') -CommandT = TypeVar('CommandT', bound='Command[Any, ..., Any]') -# CHT = TypeVar('CHT', bound='Check') -GroupT = TypeVar('GroupT', bound='Group[Any, ..., Any]') - -if TYPE_CHECKING: - P = ParamSpec('P') -else: - P = TypeVar('P') - - -def unwrap_function(function: Callable[..., Any], /) -> Callable[..., Any]: - partial = functools.partial - while True: - if hasattr(function, '__wrapped__'): - function = function.__wrapped__ - elif isinstance(function, partial): - function = function.func - else: - return function - - -def get_signature_parameters( - function: Callable[..., Any], - globalns: Dict[str, Any], - /, - *, - skip_parameters: Optional[int] = None, -) -> Dict[str, Parameter]: - signature = Signature.from_callable(function) - params: Dict[str, Parameter] = {} - cache: Dict[str, Any] = {} - eval_annotation = discord.utils.evaluate_annotation - required_params = discord.utils.is_inside_class(function) + 1 if skip_parameters is None else skip_parameters - if len(signature.parameters) < required_params: - raise TypeError(f'Command signature requires at least {required_params - 1} parameter(s)') - - iterator = iter(signature.parameters.items()) - for _ in range(0, required_params): - next(iterator) - - for name, parameter in iterator: - default = parameter.default - if isinstance(default, Parameter): # update from the default - if default.annotation is not Parameter.empty: - # There are a few cases to care about here. - # x: TextChannel = commands.CurrentChannel - # x = commands.CurrentChannel - # In both of these cases, the default parameter has an explicit annotation - # but in the second case it's only used as the fallback. - if default._fallback: - if parameter.annotation is Parameter.empty: - parameter._annotation = default.annotation - else: - parameter._annotation = default.annotation - - parameter._default = default.default - parameter._description = default._description - parameter._displayed_default = default._displayed_default - - annotation = parameter.annotation - - if annotation is None: - params[name] = parameter.replace(annotation=type(None)) - continue - - annotation = eval_annotation(annotation, globalns, globalns, cache) - if annotation is Greedy: - raise TypeError('Unparameterized Greedy[...] is disallowed in signature.') - - params[name] = parameter.replace(annotation=annotation) - - return params - - -def wrap_callback(coro: Callable[P, Coro[T]], /) -> Callable[P, Coro[Optional[T]]]: - @functools.wraps(coro) - async def wrapped(*args: P.args, **kwargs: P.kwargs) -> Optional[T]: - try: - ret = await coro(*args, **kwargs) - except CommandError: - raise - except asyncio.CancelledError: - return - except Exception as exc: - raise CommandInvokeError(exc) from exc - return ret - - return wrapped - - -def hooked_wrapped_callback( - command: Command[Any, ..., Any], ctx: Context[BotT], coro: Callable[P, Coro[T]], / -) -> Callable[P, Coro[Optional[T]]]: - @functools.wraps(coro) - async def wrapped(*args: P.args, **kwargs: P.kwargs) -> Optional[T]: - try: - ret = await coro(*args, **kwargs) - except CommandError: - ctx.command_failed = True - raise - except asyncio.CancelledError: - ctx.command_failed = True - return - except Exception as exc: - ctx.command_failed = True - raise CommandInvokeError(exc) from exc - finally: - if command._max_concurrency is not None: - await command._max_concurrency.release(ctx.message) - - await command.call_after_hooks(ctx) - return ret - - return wrapped - - -class _CaseInsensitiveDict(dict): - def __contains__(self, k): - return super().__contains__(k.casefold()) - - def __delitem__(self, k): - return super().__delitem__(k.casefold()) - - def __getitem__(self, k): - return super().__getitem__(k.casefold()) - - def get(self, k, default=None): - return super().get(k.casefold(), default) - - def pop(self, k, default=None): - return super().pop(k.casefold(), default) - - def __setitem__(self, k, v): - super().__setitem__(k.casefold(), v) - - -class _AttachmentIterator: - def __init__(self, data: List[discord.Attachment]): - self.data: List[discord.Attachment] = data - self.index: int = 0 - - def __iter__(self) -> Self: - return self - - def __next__(self) -> discord.Attachment: - try: - value = self.data[self.index] - except IndexError: - raise StopIteration - else: - self.index += 1 - return value - - def is_empty(self) -> bool: - return self.index >= len(self.data) - - -class Command(_BaseCommand, Generic[CogT, P, T]): - r"""A class that implements the protocol for a bot text command. - - These are not created manually, instead they are created via the - decorator or functional interface. - - Attributes - ----------- - name: :class:`str` - The name of the command. - callback: :ref:`coroutine ` - The coroutine that is executed when the command is called. - help: Optional[:class:`str`] - The long help text for the command. - brief: Optional[:class:`str`] - The short help text for the command. - usage: Optional[:class:`str`] - A replacement for arguments in the default help text. - aliases: Union[List[:class:`str`], Tuple[:class:`str`]] - The list of aliases the command can be invoked under. - enabled: :class:`bool` - A boolean that indicates if the command is currently enabled. - If the command is invoked while it is disabled, then - :exc:`.DisabledCommand` is raised to the :func:`.on_command_error` - event. Defaults to ``True``. - parent: Optional[:class:`Group`] - The parent group that this command belongs to. ``None`` if there - isn't one. - cog: Optional[:class:`Cog`] - The cog that this command belongs to. ``None`` if there isn't one. - checks: List[Callable[[:class:`.Context`], :class:`bool`]] - A list of predicates that verifies if the command could be executed - with the given :class:`.Context` as the sole parameter. If an exception - is necessary to be thrown to signal failure, then one inherited from - :exc:`.CommandError` should be used. Note that if the checks fail then - :exc:`.CheckFailure` exception is raised to the :func:`.on_command_error` - event. - description: :class:`str` - The message prefixed into the default help command. - hidden: :class:`bool` - If ``True``\, the default help command does not show this in the - help output. - rest_is_raw: :class:`bool` - If ``False`` and a keyword-only argument is provided then the keyword - only argument is stripped and handled as if it was a regular argument - that handles :exc:`.MissingRequiredArgument` and default values in a - regular matter rather than passing the rest completely raw. If ``True`` - then the keyword-only argument will pass in the rest of the arguments - in a completely raw matter. Defaults to ``False``. - invoked_subcommand: Optional[:class:`Command`] - The subcommand that was invoked, if any. - require_var_positional: :class:`bool` - If ``True`` and a variadic positional argument is specified, requires - the user to specify at least one argument. Defaults to ``False``. - - .. versionadded:: 1.5 - - ignore_extra: :class:`bool` - If ``True``\, ignores extraneous strings passed to a command if all its - requirements are met (e.g. ``?foo a b c`` when only expecting ``a`` - and ``b``). Otherwise :func:`.on_command_error` and local error handlers - are called with :exc:`.TooManyArguments`. Defaults to ``True``. - cooldown_after_parsing: :class:`bool` - If ``True``\, cooldown processing is done after argument parsing, - which calls converters. If ``False`` then cooldown processing is done - first and then the converters are called second. Defaults to ``False``. - extras: :class:`dict` - A dict of user provided extras to attach to the Command. - - .. note:: - This object may be copied by the library. - - - .. versionadded:: 2.0 - """ - __original_kwargs__: Dict[str, Any] - - def __new__(cls, *args: Any, **kwargs: Any) -> Self: - # if you're wondering why this is done, it's because we need to ensure - # we have a complete original copy of **kwargs even for classes that - # mess with it by popping before delegating to the subclass __init__. - # In order to do this, we need to control the instance creation and - # inject the original kwargs through __new__ rather than doing it - # inside __init__. - self = super().__new__(cls) - - # we do a shallow copy because it's probably the most common use case. - # this could potentially break if someone modifies a list or something - # while it's in movement, but for now this is the cheapest and - # fastest way to do what we want. - self.__original_kwargs__ = kwargs.copy() - return self - - def __init__( - self, - func: Union[ - Callable[Concatenate[CogT, Context[Any], P], Coro[T]], - Callable[Concatenate[Context[Any], P], Coro[T]], - ], - /, - **kwargs: Any, - ) -> None: - if not asyncio.iscoroutinefunction(func): - raise TypeError('Callback must be a coroutine.') - - name = kwargs.get('name') or func.__name__ - if not isinstance(name, str): - raise TypeError('Name of a command must be a string.') - self.name: str = name - - self.callback = func - self.enabled: bool = kwargs.get('enabled', True) - - help_doc = kwargs.get('help') - if help_doc is not None: - help_doc = inspect.cleandoc(help_doc) - else: - help_doc = inspect.getdoc(func) - if isinstance(help_doc, bytes): - help_doc = help_doc.decode('utf-8') - - self.help: Optional[str] = help_doc - - self.brief: Optional[str] = kwargs.get('brief') - self.usage: Optional[str] = kwargs.get('usage') - self.rest_is_raw: bool = kwargs.get('rest_is_raw', False) - self.aliases: Union[List[str], Tuple[str]] = kwargs.get('aliases', []) - self.extras: Dict[Any, Any] = kwargs.get('extras', {}) - - if not isinstance(self.aliases, (list, tuple)): - raise TypeError("Aliases of a command must be a list or a tuple of strings.") - - self.description: str = inspect.cleandoc(kwargs.get('description', '')) - self.hidden: bool = kwargs.get('hidden', False) - - try: - checks = func.__commands_checks__ - checks.reverse() - except AttributeError: - checks = kwargs.get('checks', []) - - self.checks: List[UserCheck[Context[Any]]] = checks - - try: - cooldown = func.__commands_cooldown__ - except AttributeError: - cooldown = kwargs.get('cooldown') - - if cooldown is None: - buckets = CooldownMapping(cooldown, BucketType.default) - elif isinstance(cooldown, CooldownMapping): - buckets: CooldownMapping[Context[Any]] = cooldown - else: - raise TypeError("Cooldown must be an instance of CooldownMapping or None.") - self._buckets: CooldownMapping[Context[Any]] = buckets - - try: - max_concurrency = func.__commands_max_concurrency__ - except AttributeError: - max_concurrency = kwargs.get('max_concurrency') - - self._max_concurrency: Optional[MaxConcurrency] = max_concurrency - - self.require_var_positional: bool = kwargs.get('require_var_positional', False) - self.ignore_extra: bool = kwargs.get('ignore_extra', True) - self.cooldown_after_parsing: bool = kwargs.get('cooldown_after_parsing', False) - self._cog: CogT = None - - # bandaid for the fact that sometimes parent can be the bot instance - parent: Optional[GroupMixin[Any]] = kwargs.get('parent') - self.parent: Optional[GroupMixin[Any]] = parent if isinstance(parent, _BaseCommand) else None - - self._before_invoke: Optional[Hook] = None - try: - before_invoke = func.__before_invoke__ - except AttributeError: - pass - else: - self.before_invoke(before_invoke) - - self._after_invoke: Optional[Hook] = None - try: - after_invoke = func.__after_invoke__ - except AttributeError: - pass - else: - self.after_invoke(after_invoke) - - @property - def cog(self) -> CogT: - return self._cog - - @cog.setter - def cog(self, value: CogT) -> None: - self._cog = value - - @property - def callback( - self, - ) -> Union[Callable[Concatenate[CogT, Context[Any], P], Coro[T]], Callable[Concatenate[Context[Any], P], Coro[T]],]: - return self._callback - - @callback.setter - def callback( - self, - function: Union[ - Callable[Concatenate[CogT, Context[Any], P], Coro[T]], - Callable[Concatenate[Context[Any], P], Coro[T]], - ], - ) -> None: - self._callback = function - unwrap = unwrap_function(function) - self.module: str = unwrap.__module__ - - try: - globalns = unwrap.__globals__ - except AttributeError: - globalns = {} - - self.params: Dict[str, Parameter] = get_signature_parameters(function, globalns) - - def add_check(self, func: UserCheck[Context[Any]], /) -> None: - """Adds a check to the command. - - This is the non-decorator interface to :func:`.check`. - - .. versionadded:: 1.3 - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - - .. seealso:: The :func:`~discord.ext.commands.check` decorator - - Parameters - ----------- - func - The function that will be used as a check. - """ - - self.checks.append(func) - - def remove_check(self, func: UserCheck[Context[Any]], /) -> None: - """Removes a check from the command. - - This function is idempotent and will not raise an exception - if the function is not in the command's checks. - - .. versionadded:: 1.3 - - .. versionchanged:: 2.0 - - ``func`` parameter is now positional-only. - - Parameters - ----------- - func - The function to remove from the checks. - """ - - try: - self.checks.remove(func) - except ValueError: - pass - - def update(self, **kwargs: Any) -> None: - """Updates :class:`Command` instance with updated attribute. - - This works similarly to the :func:`~discord.ext.commands.command` decorator in terms - of parameters in that they are passed to the :class:`Command` or - subclass constructors, sans the name and callback. - """ - cog = self.cog - self.__init__(self.callback, **dict(self.__original_kwargs__, **kwargs)) - self.cog = cog - - async def __call__(self, context: Context[BotT], /, *args: P.args, **kwargs: P.kwargs) -> T: - """|coro| - - Calls the internal callback that the command holds. - - .. note:: - - This bypasses all mechanisms -- including checks, converters, - invoke hooks, cooldowns, etc. You must take care to pass - the proper arguments and types to this function. - - .. versionadded:: 1.3 - - .. versionchanged:: 2.0 - - ``context`` parameter is now positional-only. - """ - if self.cog is not None: - return await self.callback(self.cog, context, *args, **kwargs) # type: ignore - else: - return await self.callback(context, *args, **kwargs) # type: ignore - - def _ensure_assignment_on_copy(self, other: Self) -> Self: - other._before_invoke = self._before_invoke - other._after_invoke = self._after_invoke - other.extras = self.extras - if self.checks != other.checks: - other.checks = self.checks.copy() - if self._buckets.valid and not other._buckets.valid: - other._buckets = self._buckets.copy() - if self._max_concurrency and self._max_concurrency != other._max_concurrency: - other._max_concurrency = self._max_concurrency.copy() - - try: - other.on_error = self.on_error - except AttributeError: - pass - return other - - def copy(self) -> Self: - """Creates a copy of this command. - - Returns - -------- - :class:`Command` - A new instance of this command. - """ - ret = self.__class__(self.callback, **self.__original_kwargs__) - return self._ensure_assignment_on_copy(ret) - - def _update_copy(self, kwargs: Dict[str, Any]) -> Self: - if kwargs: - kw = kwargs.copy() - kw.update(self.__original_kwargs__) - copy = self.__class__(self.callback, **kw) - return self._ensure_assignment_on_copy(copy) - else: - return self.copy() - - async def dispatch_error(self, ctx: Context[BotT], error: CommandError, /) -> None: - ctx.command_failed = True - cog = self.cog - try: - coro = self.on_error - except AttributeError: - pass - else: - injected = wrap_callback(coro) # type: ignore - if cog is not None: - await injected(cog, ctx, error) - else: - await injected(ctx, error) # type: ignore - - try: - if cog is not None: - local = Cog._get_overridden_method(cog.cog_command_error) - if local is not None: - wrapped = wrap_callback(local) - await wrapped(ctx, error) - finally: - ctx.bot.dispatch('command_error', ctx, error) - - async def transform(self, ctx: Context[BotT], param: Parameter, attachments: _AttachmentIterator, /) -> Any: - converter = param.converter - consume_rest_is_special = param.kind == param.KEYWORD_ONLY and not self.rest_is_raw - view = ctx.view - view.skip_ws() - - # The greedy converter is simple -- it keeps going until it fails in which case, - # it undos the view ready for the next parameter to use instead - if isinstance(converter, Greedy): - # Special case for Greedy[discord.Attachment] to consume the attachments iterator - if converter.converter is discord.Attachment: - return list(attachments) - - if param.kind in (param.POSITIONAL_OR_KEYWORD, param.POSITIONAL_ONLY): - return await self._transform_greedy_pos(ctx, param, param.required, converter.converter) - elif param.kind == param.VAR_POSITIONAL: - return await self._transform_greedy_var_pos(ctx, param, converter.converter) - else: - # if we're here, then it's a KEYWORD_ONLY param type - # since this is mostly useless, we'll helpfully transform Greedy[X] - # into just X and do the parsing that way. - converter = converter.converter - - # Try to detect Optional[discord.Attachment] or discord.Attachment special converter - if converter is discord.Attachment: - try: - return next(attachments) - except StopIteration: - raise MissingRequiredAttachment(param) - - if self._is_typing_optional(param.annotation) and param.annotation.__args__[0] is discord.Attachment: - if attachments.is_empty(): - # I have no idea who would be doing Optional[discord.Attachment] = 1 - # but for those cases then 1 should be returned instead of None - return None if param.default is param.empty else param.default - return next(attachments) - - if view.eof: - if param.kind == param.VAR_POSITIONAL: - raise RuntimeError() # break the loop - if param.required: - if self._is_typing_optional(param.annotation): - return None - if hasattr(converter, '__commands_is_flag__') and converter._can_be_constructible(): - return await converter._construct_default(ctx) - raise MissingRequiredArgument(param) - return await param.get_default(ctx) - - previous = view.index - if consume_rest_is_special: - ctx.current_argument = argument = view.read_rest().strip() - else: - try: - ctx.current_argument = argument = view.get_quoted_word() - except ArgumentParsingError as exc: - if self._is_typing_optional(param.annotation): - view.index = previous - return None if param.required else await param.get_default(ctx) - else: - raise exc - view.previous = previous - - # type-checker fails to narrow argument - return await run_converters(ctx, converter, argument, param) # type: ignore - - async def _transform_greedy_pos(self, ctx: Context[BotT], param: Parameter, required: bool, converter: Any) -> Any: - view = ctx.view - result = [] - while not view.eof: - # for use with a manual undo - previous = view.index - - view.skip_ws() - try: - ctx.current_argument = argument = view.get_quoted_word() - value = await run_converters(ctx, converter, argument, param) # type: ignore - except (CommandError, ArgumentParsingError): - view.index = previous - break - else: - result.append(value) - - if not result and not required: - return await param.get_default(ctx) - return result - - async def _transform_greedy_var_pos(self, ctx: Context[BotT], param: Parameter, converter: Any) -> Any: - view = ctx.view - previous = view.index - try: - ctx.current_argument = argument = view.get_quoted_word() - value = await run_converters(ctx, converter, argument, param) # type: ignore - except (CommandError, ArgumentParsingError): - view.index = previous - raise RuntimeError() from None # break loop - else: - return value - - @property - def clean_params(self) -> Dict[str, Parameter]: - """Dict[:class:`str`, :class:`Parameter`]: - Retrieves the parameter dictionary without the context or self parameters. - - Useful for inspecting signature. - """ - return self.params.copy() - - @property - def cooldown(self) -> Optional[Cooldown]: - """Optional[:class:`~discord.app_commands.Cooldown`]: The cooldown of a command when invoked - or ``None`` if the command doesn't have a registered cooldown. - - .. versionadded:: 2.0 - """ - return self._buckets._cooldown - - @property - def full_parent_name(self) -> str: - """:class:`str`: Retrieves the fully qualified parent command name. - - This the base command name required to execute it. For example, - in ``?one two three`` the parent name would be ``one two``. - """ - entries = [] - command = self - # command.parent is type-hinted as GroupMixin some attributes are resolved via MRO - while command.parent is not None: # type: ignore - command = command.parent # type: ignore - entries.append(command.name) # type: ignore - - return ' '.join(reversed(entries)) - - @property - def parents(self) -> List[Group[Any, ..., Any]]: - """List[:class:`Group`]: Retrieves the parents of this command. - - If the command has no parents then it returns an empty :class:`list`. - - For example in commands ``?a b c test``, the parents are ``[c, b, a]``. - - .. versionadded:: 1.1 - """ - entries = [] - command = self - while command.parent is not None: # type: ignore - command = command.parent # type: ignore - entries.append(command) - - return entries - - @property - def root_parent(self) -> Optional[Group[Any, ..., Any]]: - """Optional[:class:`Group`]: Retrieves the root parent of this command. - - If the command has no parents then it returns ``None``. - - For example in commands ``?a b c test``, the root parent is ``a``. - """ - if not self.parent: - return None - return self.parents[-1] - - @property - def qualified_name(self) -> str: - """:class:`str`: Retrieves the fully qualified command name. - - This is the full parent name with the command name as well. - For example, in ``?one two three`` the qualified name would be - ``one two three``. - """ - - parent = self.full_parent_name - if parent: - return parent + ' ' + self.name - else: - return self.name - - def __str__(self) -> str: - return self.qualified_name - - async def _parse_arguments(self, ctx: Context[BotT]) -> None: - ctx.args = [ctx] if self.cog is None else [self.cog, ctx] - ctx.kwargs = {} - args = ctx.args - kwargs = ctx.kwargs - attachments = _AttachmentIterator(ctx.message.attachments) - - view = ctx.view - iterator = iter(self.params.items()) - - for name, param in iterator: - ctx.current_parameter = param - if param.kind in (param.POSITIONAL_OR_KEYWORD, param.POSITIONAL_ONLY): - transformed = await self.transform(ctx, param, attachments) - args.append(transformed) - elif param.kind == param.KEYWORD_ONLY: - # kwarg only param denotes "consume rest" semantics - if self.rest_is_raw: - ctx.current_argument = argument = view.read_rest() - kwargs[name] = await run_converters(ctx, param.converter, argument, param) - else: - kwargs[name] = await self.transform(ctx, param, attachments) - break - elif param.kind == param.VAR_POSITIONAL: - if view.eof and self.require_var_positional: - raise MissingRequiredArgument(param) - while not view.eof: - try: - transformed = await self.transform(ctx, param, attachments) - args.append(transformed) - except RuntimeError: - break - - if not self.ignore_extra and not view.eof: - raise TooManyArguments('Too many arguments passed to ' + self.qualified_name) - - async def call_before_hooks(self, ctx: Context[BotT], /) -> None: - # now that we're done preparing we can call the pre-command hooks - # first, call the command local hook: - cog = self.cog - if self._before_invoke is not None: - # should be cog if @commands.before_invoke is used - instance = getattr(self._before_invoke, '__self__', cog) - # __self__ only exists for methods, not functions - # however, if @command.before_invoke is used, it will be a function - if instance: - await self._before_invoke(instance, ctx) # type: ignore - else: - await self._before_invoke(ctx) # type: ignore - - # call the cog local hook if applicable: - if cog is not None: - hook = Cog._get_overridden_method(cog.cog_before_invoke) - if hook is not None: - await hook(ctx) - - # call the bot global hook if necessary - hook = ctx.bot._before_invoke - if hook is not None: - await hook(ctx) - - async def call_after_hooks(self, ctx: Context[BotT], /) -> None: - cog = self.cog - if self._after_invoke is not None: - instance = getattr(self._after_invoke, '__self__', cog) - if instance: - await self._after_invoke(instance, ctx) # type: ignore - else: - await self._after_invoke(ctx) # type: ignore - - # call the cog local hook if applicable: - if cog is not None: - hook = Cog._get_overridden_method(cog.cog_after_invoke) - if hook is not None: - await hook(ctx) - - hook = ctx.bot._after_invoke - if hook is not None: - await hook(ctx) - - def _prepare_cooldowns(self, ctx: Context[BotT]) -> None: - if self._buckets.valid: - dt = ctx.message.edited_at or ctx.message.created_at - current = dt.replace(tzinfo=datetime.timezone.utc).timestamp() - bucket = self._buckets.get_bucket(ctx, current) - if bucket is not None: - retry_after = bucket.update_rate_limit(current) - if retry_after: - raise CommandOnCooldown(bucket, retry_after, self._buckets.type) # type: ignore - - async def prepare(self, ctx: Context[BotT], /) -> None: - ctx.command = self - - if not await self.can_run(ctx): - raise CheckFailure(f'The check functions for command {self.qualified_name} failed.') - - if self._max_concurrency is not None: - # For this application, context can be duck-typed as a Message - await self._max_concurrency.acquire(ctx) - - try: - if self.cooldown_after_parsing: - await self._parse_arguments(ctx) - self._prepare_cooldowns(ctx) - else: - self._prepare_cooldowns(ctx) - await self._parse_arguments(ctx) - - await self.call_before_hooks(ctx) - except: - if self._max_concurrency is not None: - await self._max_concurrency.release(ctx) - raise - - def is_on_cooldown(self, ctx: Context[BotT], /) -> bool: - """Checks whether the command is currently on cooldown. - - .. versionchanged:: 2.0 - - ``ctx`` parameter is now positional-only. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context to use when checking the commands cooldown status. - - Returns - -------- - :class:`bool` - A boolean indicating if the command is on cooldown. - """ - if not self._buckets.valid: - return False - - bucket = self._buckets.get_bucket(ctx) - if bucket is None: - return False - dt = ctx.message.edited_at or ctx.message.created_at - current = dt.replace(tzinfo=datetime.timezone.utc).timestamp() - return bucket.get_tokens(current) == 0 - - def reset_cooldown(self, ctx: Context[BotT], /) -> None: - """Resets the cooldown on this command. - - .. versionchanged:: 2.0 - - ``ctx`` parameter is now positional-only. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context to reset the cooldown under. - """ - if self._buckets.valid: - bucket = self._buckets.get_bucket(ctx) - if bucket is not None: - bucket.reset() - - def get_cooldown_retry_after(self, ctx: Context[BotT], /) -> float: - """Retrieves the amount of seconds before this command can be tried again. - - .. versionadded:: 1.4 - - .. versionchanged:: 2.0 - - ``ctx`` parameter is now positional-only. - - Parameters - ----------- - ctx: :class:`.Context` - The invocation context to retrieve the cooldown from. - - Returns - -------- - :class:`float` - The amount of time left on this command's cooldown in seconds. - If this is ``0.0`` then the command isn't on cooldown. - """ - if self._buckets.valid: - bucket = self._buckets.get_bucket(ctx) - if bucket is None: - return 0.0 - dt = ctx.message.edited_at or ctx.message.created_at - current = dt.replace(tzinfo=datetime.timezone.utc).timestamp() - return bucket.get_retry_after(current) - - return 0.0 - - async def invoke(self, ctx: Context[BotT], /) -> None: - await self.prepare(ctx) - - # terminate the invoked_subcommand chain. - # since we're in a regular command (and not a group) then - # the invoked subcommand is None. - ctx.invoked_subcommand = None - ctx.subcommand_passed = None - injected = hooked_wrapped_callback(self, ctx, self.callback) # type: ignore - await injected(*ctx.args, **ctx.kwargs) # type: ignore - - async def reinvoke(self, ctx: Context[BotT], /, *, call_hooks: bool = False) -> None: - ctx.command = self - await self._parse_arguments(ctx) - - if call_hooks: - await self.call_before_hooks(ctx) - - ctx.invoked_subcommand = None - try: - await self.callback(*ctx.args, **ctx.kwargs) # type: ignore - except: - ctx.command_failed = True - raise - finally: - if call_hooks: - await self.call_after_hooks(ctx) - - def error(self, coro: Error[CogT, ContextT], /) -> Error[CogT, ContextT]: - """A decorator that registers a coroutine as a local error handler. - - A local error handler is an :func:`.on_command_error` event limited to - a single command. However, the :func:`.on_command_error` is still - invoked afterwards as the catch-all. - - .. versionchanged:: 2.0 - - ``coro`` parameter is now positional-only. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the local error handler. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine. - """ - - if not asyncio.iscoroutinefunction(coro): - raise TypeError('The error handler must be a coroutine.') - - self.on_error: Error[CogT, Any] = coro - return coro - - def has_error_handler(self) -> bool: - """:class:`bool`: Checks whether the command has an error handler registered. - - .. versionadded:: 1.7 - """ - return hasattr(self, 'on_error') - - def before_invoke(self, coro: Hook[CogT, ContextT], /) -> Hook[CogT, ContextT]: - """A decorator that registers a coroutine as a pre-invoke hook. - - A pre-invoke hook is called directly before the command is - called. This makes it a useful function to set up database - connections or any type of set up required. - - This pre-invoke hook takes a sole parameter, a :class:`.Context`. - - See :meth:`.Bot.before_invoke` for more info. - - .. versionchanged:: 2.0 - - ``coro`` parameter is now positional-only. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the pre-invoke hook. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine. - """ - if not asyncio.iscoroutinefunction(coro): - raise TypeError('The pre-invoke hook must be a coroutine.') - - self._before_invoke = coro - return coro - - def after_invoke(self, coro: Hook[CogT, ContextT], /) -> Hook[CogT, ContextT]: - """A decorator that registers a coroutine as a post-invoke hook. - - A post-invoke hook is called directly after the command is - called. This makes it a useful function to clean-up database - connections or any type of clean up required. - - This post-invoke hook takes a sole parameter, a :class:`.Context`. - - See :meth:`.Bot.after_invoke` for more info. - - .. versionchanged:: 2.0 - - ``coro`` parameter is now positional-only. - - Parameters - ----------- - coro: :ref:`coroutine ` - The coroutine to register as the post-invoke hook. - - Raises - ------- - TypeError - The coroutine passed is not actually a coroutine. - """ - if not asyncio.iscoroutinefunction(coro): - raise TypeError('The post-invoke hook must be a coroutine.') - - self._after_invoke = coro - return coro - - @property - def cog_name(self) -> Optional[str]: - """Optional[:class:`str`]: The name of the cog this command belongs to, if any.""" - return type(self.cog).__cog_name__ if self.cog is not None else None - - @property - def short_doc(self) -> str: - """:class:`str`: Gets the "short" documentation of a command. - - By default, this is the :attr:`.brief` attribute. - If that lookup leads to an empty string then the first line of the - :attr:`.help` attribute is used instead. - """ - if self.brief is not None: - return self.brief - if self.help is not None: - return self.help.split('\n', 1)[0] - return '' - - def _is_typing_optional(self, annotation: Union[T, Optional[T]]) -> bool: - return getattr(annotation, '__origin__', None) is Union and type(None) in annotation.__args__ # type: ignore - - @property - def signature(self) -> str: - """:class:`str`: Returns a POSIX-like signature useful for help command output.""" - if self.usage is not None: - return self.usage - - params = self.clean_params - if not params: - return '' - - result = [] - for name, param in params.items(): - greedy = isinstance(param.converter, Greedy) - optional = False # postpone evaluation of if it's an optional argument - - annotation: Any = param.converter.converter if greedy else param.converter - origin = getattr(annotation, '__origin__', None) - if not greedy and origin is Union: - none_cls = type(None) - union_args = annotation.__args__ - optional = union_args[-1] is none_cls - if len(union_args) == 2 and optional: - annotation = union_args[0] - origin = getattr(annotation, '__origin__', None) - - if annotation is discord.Attachment: - # For discord.Attachment we need to signal to the user that it's an attachment - # It's not exactly pretty but it's enough to differentiate - if optional: - result.append(f'[{name} (upload a file)]') - elif greedy: - result.append(f'[{name} (upload files)]...') - else: - result.append(f'<{name} (upload a file)>') - continue - - # for typing.Literal[...], typing.Optional[typing.Literal[...]], and Greedy[typing.Literal[...]], the - # parameter signature is a literal list of it's values - if origin is Literal: - name = '|'.join(f'"{v}"' if isinstance(v, str) else str(v) for v in annotation.__args__) - if not param.required: - # We don't want None or '' to trigger the [name=value] case and instead it should - # do [name] since [name=None] or [name=] are not exactly useful for the user. - if param.displayed_default: - result.append( - f'[{name}={param.displayed_default}]' if not greedy else f'[{name}={param.displayed_default}]...' - ) - continue - else: - result.append(f'[{name}]') - - elif param.kind == param.VAR_POSITIONAL: - if self.require_var_positional: - result.append(f'<{name}...>') - else: - result.append(f'[{name}...]') - elif greedy: - result.append(f'[{name}]...') - elif optional: - result.append(f'[{name}]') - else: - result.append(f'<{name}>') - - return ' '.join(result) - - async def can_run(self, ctx: Context[BotT], /) -> bool: - """|coro| - - Checks if the command can be executed by checking all the predicates - inside the :attr:`~Command.checks` attribute. This also checks whether the - command is disabled. - - .. versionchanged:: 1.3 - Checks whether the command is disabled or not - - .. versionchanged:: 2.0 - - ``ctx`` parameter is now positional-only. - - Parameters - ----------- - ctx: :class:`.Context` - The ctx of the command currently being invoked. - - Raises - ------- - :class:`CommandError` - Any command error that was raised during a check call will be propagated - by this function. - - Returns - -------- - :class:`bool` - A boolean indicating if the command can be invoked. - """ - - if not self.enabled: - raise DisabledCommand(f'{self.name} command is disabled') - - original = ctx.command - ctx.command = self - - try: - if not await ctx.bot.can_run(ctx): - raise CheckFailure(f'The global check functions for command {self.qualified_name} failed.') - - cog = self.cog - if cog is not None: - local_check = Cog._get_overridden_method(cog.cog_check) - if local_check is not None: - ret = await discord.utils.maybe_coroutine(local_check, ctx) - if not ret: - return False - - predicates = self.checks - if not predicates: - # since we have no checks, then we just return True. - return True - - return await discord.utils.async_all(predicate(ctx) for predicate in predicates) - finally: - ctx.command = original - - -class GroupMixin(Generic[CogT]): - """A mixin that implements common functionality for classes that behave - similar to :class:`.Group` and are allowed to register commands. - - Attributes - ----------- - all_commands: :class:`dict` - A mapping of command name to :class:`.Command` - objects. - case_insensitive: :class:`bool` - Whether the commands should be case insensitive. Defaults to ``False``. - """ - - def __init__(self, *args: Any, **kwargs: Any) -> None: - case_insensitive = kwargs.get('case_insensitive', False) - self.all_commands: Dict[str, Command[CogT, ..., Any]] = _CaseInsensitiveDict() if case_insensitive else {} - self.case_insensitive: bool = case_insensitive - super().__init__(*args, **kwargs) - - @property - def commands(self) -> Set[Command[CogT, ..., Any]]: - """Set[:class:`.Command`]: A unique set of commands without aliases that are registered.""" - return set(self.all_commands.values()) - - def recursively_remove_all_commands(self) -> None: - for command in self.all_commands.copy().values(): - if isinstance(command, GroupMixin): - command.recursively_remove_all_commands() - self.remove_command(command.name) - - def add_command(self, command: Command[CogT, ..., Any], /) -> None: - """Adds a :class:`.Command` into the internal list of commands. - - This is usually not called, instead the :meth:`~.GroupMixin.command` or - :meth:`~.GroupMixin.group` shortcut decorators are used instead. - - .. versionchanged:: 1.4 - Raise :exc:`.CommandRegistrationError` instead of generic :exc:`.ClientException` - - .. versionchanged:: 2.0 - - ``command`` parameter is now positional-only. - - Parameters - ----------- - command: :class:`Command` - The command to add. - - Raises - ------- - CommandRegistrationError - If the command or its alias is already registered by different command. - TypeError - If the command passed is not a subclass of :class:`.Command`. - """ - - if not isinstance(command, Command): - raise TypeError('The command passed must be a subclass of Command') - - if isinstance(self, Command): - command.parent = self - - if command.name in self.all_commands: - raise CommandRegistrationError(command.name) - - self.all_commands[command.name] = command - for alias in command.aliases: - if alias in self.all_commands: - self.remove_command(command.name) - raise CommandRegistrationError(alias, alias_conflict=True) - self.all_commands[alias] = command - - def remove_command(self, name: str, /) -> Optional[Command[CogT, ..., Any]]: - """Remove a :class:`.Command` from the internal list - of commands. - - This could also be used as a way to remove aliases. - - .. versionchanged:: 2.0 - - ``name`` parameter is now positional-only. - - Parameters - ----------- - name: :class:`str` - The name of the command to remove. - - Returns - -------- - Optional[:class:`.Command`] - The command that was removed. If the name is not valid then - ``None`` is returned instead. - """ - command = self.all_commands.pop(name, None) - - # does not exist - if command is None: - return None - - if name in command.aliases: - # we're removing an alias so we don't want to remove the rest - return command - - # we're not removing the alias so let's delete the rest of them. - for alias in command.aliases: - cmd = self.all_commands.pop(alias, None) - # in the case of a CommandRegistrationError, an alias might conflict - # with an already existing command. If this is the case, we want to - # make sure the pre-existing command is not removed. - if cmd is not None and cmd != command: - self.all_commands[alias] = cmd - return command - - def walk_commands(self) -> Generator[Command[CogT, ..., Any], None, None]: - """An iterator that recursively walks through all commands and subcommands. - - .. versionchanged:: 1.4 - Duplicates due to aliases are no longer returned - - Yields - ------ - Union[:class:`.Command`, :class:`.Group`] - A command or group from the internal list of commands. - """ - for command in self.commands: - yield command - if isinstance(command, GroupMixin): - yield from command.walk_commands() - - def get_command(self, name: str, /) -> Optional[Command[CogT, ..., Any]]: - """Get a :class:`.Command` from the internal list - of commands. - - This could also be used as a way to get aliases. - - The name could be fully qualified (e.g. ``'foo bar'``) will get - the subcommand ``bar`` of the group command ``foo``. If a - subcommand is not found then ``None`` is returned just as usual. - - .. versionchanged:: 2.0 - - ``name`` parameter is now positional-only. - - Parameters - ----------- - name: :class:`str` - The name of the command to get. - - Returns - -------- - Optional[:class:`Command`] - The command that was requested. If not found, returns ``None``. - """ - - # fast path, no space in name. - if ' ' not in name: - return self.all_commands.get(name) - - names = name.split() - if not names: - return None - obj = self.all_commands.get(names[0]) - if not isinstance(obj, GroupMixin): - return obj - - for name in names[1:]: - try: - obj = obj.all_commands[name] # type: ignore - except (AttributeError, KeyError): - return None - - return obj - - @overload - def command( - self: GroupMixin[CogT], - name: str = ..., - *args: Any, - **kwargs: Any, - ) -> Callable[ - [ - Union[ - Callable[Concatenate[CogT, ContextT, P], Coro[T]], - Callable[Concatenate[ContextT, P], Coro[T]], - ] - ], - Command[CogT, P, T], - ]: - ... - - @overload - def command( - self: GroupMixin[CogT], - name: str = ..., - cls: Type[CommandT] = ..., # type: ignore # previous overload handles case where cls is not set - *args: Any, - **kwargs: Any, - ) -> Callable[ - [ - Union[ - Callable[Concatenate[CogT, ContextT, P], Coro[T]], - Callable[Concatenate[ContextT, P], Coro[T]], - ] - ], - CommandT, - ]: - ... - - def command( - self, - name: str = MISSING, - cls: Type[Command[Any, ..., Any]] = MISSING, - *args: Any, - **kwargs: Any, - ) -> Any: - """A shortcut decorator that invokes :func:`~discord.ext.commands.command` and adds it to - the internal command list via :meth:`~.GroupMixin.add_command`. - - Returns - -------- - Callable[..., :class:`Command`] - A decorator that converts the provided method into a Command, adds it to the bot, then returns it. - """ - - def decorator(func): - - kwargs.setdefault('parent', self) - result = command(name=name, cls=cls, *args, **kwargs)(func) - self.add_command(result) - return result - - return decorator - - @overload - def group( - self: GroupMixin[CogT], - name: str = ..., - *args: Any, - **kwargs: Any, - ) -> Callable[ - [ - Union[ - Callable[Concatenate[CogT, ContextT, P], Coro[T]], - Callable[Concatenate[ContextT, P], Coro[T]], - ] - ], - Group[CogT, P, T], - ]: - ... - - @overload - def group( - self: GroupMixin[CogT], - name: str = ..., - cls: Type[GroupT] = ..., # type: ignore # previous overload handles case where cls is not set - *args: Any, - **kwargs: Any, - ) -> Callable[ - [ - Union[ - Callable[Concatenate[CogT, ContextT, P], Coro[T]], - Callable[Concatenate[ContextT, P], Coro[T]], - ] - ], - GroupT, - ]: - ... - - def group( - self, - name: str = MISSING, - cls: Type[Group[Any, ..., Any]] = MISSING, - *args: Any, - **kwargs: Any, - ) -> Any: - """A shortcut decorator that invokes :func:`.group` and adds it to - the internal command list via :meth:`~.GroupMixin.add_command`. - - Returns - -------- - Callable[..., :class:`Group`] - A decorator that converts the provided method into a Group, adds it to the bot, then returns it. - """ - - def decorator(func): - kwargs.setdefault('parent', self) - result = group(name=name, cls=cls, *args, **kwargs)(func) - self.add_command(result) - return result - - return decorator - - -class Group(GroupMixin[CogT], Command[CogT, P, T]): - """A class that implements a grouping protocol for commands to be - executed as subcommands. - - This class is a subclass of :class:`.Command` and thus all options - valid in :class:`.Command` are valid in here as well. - - Attributes - ----------- - invoke_without_command: :class:`bool` - Indicates if the group callback should begin parsing and - invocation only if no subcommand was found. Useful for - making it an error handling function to tell the user that - no subcommand was found or to have different functionality - in case no subcommand was found. If this is ``False``, then - the group callback will always be invoked first. This means - that the checks and the parsing dictated by its parameters - will be executed. Defaults to ``False``. - case_insensitive: :class:`bool` - Indicates if the group's commands should be case insensitive. - Defaults to ``False``. - """ - - def __init__(self, *args: Any, **attrs: Any) -> None: - self.invoke_without_command: bool = attrs.pop('invoke_without_command', False) - super().__init__(*args, **attrs) - - def copy(self) -> Self: - """Creates a copy of this :class:`Group`. - - Returns - -------- - :class:`Group` - A new instance of this group. - """ - ret = super().copy() - for cmd in self.commands: - ret.add_command(cmd.copy()) - return ret - - async def invoke(self, ctx: Context[BotT], /) -> None: - ctx.invoked_subcommand = None - ctx.subcommand_passed = None - early_invoke = not self.invoke_without_command - if early_invoke: - await self.prepare(ctx) - - view = ctx.view - previous = view.index - view.skip_ws() - trigger = view.get_word() - - if trigger: - ctx.subcommand_passed = trigger - ctx.invoked_subcommand = self.all_commands.get(trigger, None) - - if early_invoke: - injected = hooked_wrapped_callback(self, ctx, self.callback) # type: ignore - await injected(*ctx.args, **ctx.kwargs) # type: ignore - - ctx.invoked_parents.append(ctx.invoked_with) # type: ignore - - if trigger and ctx.invoked_subcommand: - ctx.invoked_with = trigger - await ctx.invoked_subcommand.invoke(ctx) - elif not early_invoke: - # undo the trigger parsing - view.index = previous - view.previous = previous - await super().invoke(ctx) - - async def reinvoke(self, ctx: Context[BotT], /, *, call_hooks: bool = False) -> None: - ctx.invoked_subcommand = None - early_invoke = not self.invoke_without_command - if early_invoke: - ctx.command = self - await self._parse_arguments(ctx) - - if call_hooks: - await self.call_before_hooks(ctx) - - view = ctx.view - previous = view.index - view.skip_ws() - trigger = view.get_word() - - if trigger: - ctx.subcommand_passed = trigger - ctx.invoked_subcommand = self.all_commands.get(trigger, None) - - if early_invoke: - try: - await self.callback(*ctx.args, **ctx.kwargs) # type: ignore - except: - ctx.command_failed = True - raise - finally: - if call_hooks: - await self.call_after_hooks(ctx) - - ctx.invoked_parents.append(ctx.invoked_with) # type: ignore - - if trigger and ctx.invoked_subcommand: - ctx.invoked_with = trigger - await ctx.invoked_subcommand.reinvoke(ctx, call_hooks=call_hooks) - elif not early_invoke: - # undo the trigger parsing - view.index = previous - view.previous = previous - await super().reinvoke(ctx, call_hooks=call_hooks) - - -# Decorators - -if TYPE_CHECKING: - # Using a class to emulate a function allows for overloading the inner function in the decorator. - - class _CommandDecorator: - @overload - def __call__(self, func: Callable[Concatenate[CogT, ContextT, P], Coro[T]], /) -> Command[CogT, P, T]: - ... - - @overload - def __call__(self, func: Callable[Concatenate[ContextT, P], Coro[T]], /) -> Command[None, P, T]: - ... - - def __call__(self, func: Callable[..., Coro[T]], /) -> Any: - ... - - class _GroupDecorator: - @overload - def __call__(self, func: Callable[Concatenate[CogT, ContextT, P], Coro[T]], /) -> Group[CogT, P, T]: - ... - - @overload - def __call__(self, func: Callable[Concatenate[ContextT, P], Coro[T]], /) -> Group[None, P, T]: - ... - - def __call__(self, func: Callable[..., Coro[T]], /) -> Any: - ... - - -@overload -def command( - name: str = ..., - **attrs: Any, -) -> _CommandDecorator: - ... - - -@overload -def command( - name: str = ..., - cls: Type[CommandT] = ..., # type: ignore # previous overload handles case where cls is not set - **attrs: Any, -) -> Callable[ - [ - Union[ - Callable[Concatenate[ContextT, P], Coro[Any]], - Callable[Concatenate[CogT, ContextT, P], Coro[Any]], # type: ignore # CogT is used here to allow covariance - ] - ], - CommandT, -]: - ... - - -def command( - name: str = MISSING, - cls: Type[Command[Any, ..., Any]] = MISSING, - **attrs: Any, -) -> Any: - """A decorator that transforms a function into a :class:`.Command` - or if called with :func:`.group`, :class:`.Group`. - - By default the ``help`` attribute is received automatically from the - docstring of the function and is cleaned up with the use of - ``inspect.cleandoc``. If the docstring is ``bytes``, then it is decoded - into :class:`str` using utf-8 encoding. - - All checks added using the :func:`.check` & co. decorators are added into - the function. There is no way to supply your own checks through this - decorator. - - Parameters - ----------- - name: :class:`str` - The name to create the command with. By default this uses the - function name unchanged. - cls - The class to construct with. By default this is :class:`.Command`. - You usually do not change this. - attrs - Keyword arguments to pass into the construction of the class denoted - by ``cls``. - - Raises - ------- - TypeError - If the function is not a coroutine or is already a command. - """ - if cls is MISSING: - cls = Command - - def decorator(func): - if isinstance(func, Command): - raise TypeError('Callback is already a command.') - return cls(func, name=name, **attrs) - - return decorator - - -@overload -def group( - name: str = ..., - **attrs: Any, -) -> _GroupDecorator: - ... - - -@overload -def group( - name: str = ..., - cls: Type[GroupT] = ..., # type: ignore # previous overload handles case where cls is not set - **attrs: Any, -) -> Callable[ - [ - Union[ - Callable[Concatenate[CogT, ContextT, P], Coro[Any]], # type: ignore # CogT is used here to allow covariance - Callable[Concatenate[ContextT, P], Coro[Any]], - ] - ], - GroupT, -]: - ... - - -def group( - name: str = MISSING, - cls: Type[Group[Any, ..., Any]] = MISSING, - **attrs: Any, -) -> Any: - """A decorator that transforms a function into a :class:`.Group`. - - This is similar to the :func:`~discord.ext.commands.command` decorator but the ``cls`` - parameter is set to :class:`Group` by default. - - .. versionchanged:: 1.1 - The ``cls`` parameter can now be passed. - """ - if cls is MISSING: - cls = Group - - return command(name=name, cls=cls, **attrs) - - -def check(predicate: UserCheck[ContextT], /) -> Check[ContextT]: - r"""A decorator that adds a check to the :class:`.Command` or its - subclasses. These checks could be accessed via :attr:`.Command.checks`. - - These checks should be predicates that take in a single parameter taking - a :class:`.Context`. If the check returns a ``False``\-like value then - during invocation a :exc:`.CheckFailure` exception is raised and sent to - the :func:`.on_command_error` event. - - If an exception should be thrown in the predicate then it should be a - subclass of :exc:`.CommandError`. Any exception not subclassed from it - will be propagated while those subclassed will be sent to - :func:`.on_command_error`. - - A special attribute named ``predicate`` is bound to the value - returned by this decorator to retrieve the predicate passed to the - decorator. This allows the following introspection and chaining to be done: - - .. code-block:: python3 - - def owner_or_permissions(**perms): - original = commands.has_permissions(**perms).predicate - async def extended_check(ctx): - if ctx.guild is None: - return False - return ctx.guild.owner_id == ctx.author.id or await original(ctx) - return commands.check(extended_check) - - .. note:: - - The function returned by ``predicate`` is **always** a coroutine, - even if the original function was not a coroutine. - - .. versionchanged:: 1.3 - The ``predicate`` attribute was added. - - Examples - --------- - - Creating a basic check to see if the command invoker is you. - - .. code-block:: python3 - - def check_if_it_is_me(ctx): - return ctx.message.author.id == 85309593344815104 - - @bot.command() - @commands.check(check_if_it_is_me) - async def only_for_me(ctx): - await ctx.send('I know you!') - - Transforming common checks into its own decorator: - - .. code-block:: python3 - - def is_me(): - def predicate(ctx): - return ctx.message.author.id == 85309593344815104 - return commands.check(predicate) - - @bot.command() - @is_me() - async def only_me(ctx): - await ctx.send('Only you!') - - .. versionchanged:: 2.0 - - ``predicate`` parameter is now positional-only. - - Parameters - ----------- - predicate: Callable[[:class:`Context`], :class:`bool`] - The predicate to check if the command should be invoked. - """ - - def decorator(func: Union[Command[Any, ..., Any], CoroFunc]) -> Union[Command[Any, ..., Any], CoroFunc]: - if isinstance(func, Command): - func.checks.append(predicate) # type: ignore - else: - if not hasattr(func, '__commands_checks__'): - func.__commands_checks__ = [] - - func.__commands_checks__.append(predicate) - - return func - - if inspect.iscoroutinefunction(predicate): - decorator.predicate = predicate - else: - - @functools.wraps(predicate) - async def wrapper(ctx: ContextT): - return predicate(ctx) - - decorator.predicate = wrapper - - return decorator # type: ignore - - -def check_any(*checks: Check[ContextT]) -> Check[ContextT]: - r"""A :func:`check` that is added that checks if any of the checks passed - will pass, i.e. using logical OR. - - If all checks fail then :exc:`.CheckAnyFailure` is raised to signal the failure. - It inherits from :exc:`.CheckFailure`. - - .. note:: - - The ``predicate`` attribute for this function **is** a coroutine. - - .. versionadded:: 1.3 - - Parameters - ------------ - \*checks: Callable[[:class:`Context`], :class:`bool`] - An argument list of checks that have been decorated with - the :func:`check` decorator. - - Raises - ------- - TypeError - A check passed has not been decorated with the :func:`check` - decorator. - - Examples - --------- - - Creating a basic check to see if it's the bot owner or - the server owner: - - .. code-block:: python3 - - def is_guild_owner(): - def predicate(ctx): - return ctx.guild is not None and ctx.guild.owner_id == ctx.author.id - return commands.check(predicate) - - @bot.command() - @commands.check_any(commands.is_owner(), is_guild_owner()) - async def only_for_owners(ctx): - await ctx.send('Hello mister owner!') - """ - - unwrapped = [] - for wrapped in checks: - try: - pred = wrapped.predicate - except AttributeError: - raise TypeError(f'{wrapped!r} must be wrapped by commands.check decorator') from None - else: - unwrapped.append(pred) - - async def predicate(ctx: Context[BotT]) -> bool: - errors = [] - for func in unwrapped: - try: - value = await func(ctx) - except CheckFailure as e: - errors.append(e) - else: - if value: - return True - # if we're here, all checks failed - raise CheckAnyFailure(unwrapped, errors) - - return check(predicate) # type: ignore - - -def has_role(item: Union[int, str], /) -> Check[Any]: - """A :func:`.check` that is added that checks if the member invoking the - command has the role specified via the name or ID specified. - - If a string is specified, you must give the exact name of the role, including - caps and spelling. - - If an integer is specified, you must give the exact snowflake ID of the role. - - If the message is invoked in a private message context then the check will - return ``False``. - - This check raises one of two special exceptions, :exc:`.MissingRole` if the user - is missing a role, or :exc:`.NoPrivateMessage` if it is used in a private message. - Both inherit from :exc:`.CheckFailure`. - - .. versionchanged:: 1.1 - - Raise :exc:`.MissingRole` or :exc:`.NoPrivateMessage` - instead of generic :exc:`.CheckFailure` - - .. versionchanged:: 2.0 - - ``item`` parameter is now positional-only. - - Parameters - ----------- - item: Union[:class:`int`, :class:`str`] - The name or ID of the role to check. - """ - - def predicate(ctx: Context[BotT]) -> bool: - if ctx.guild is None: - raise NoPrivateMessage() - - # ctx.guild is None doesn't narrow ctx.author to Member - if isinstance(item, int): - role = discord.utils.get(ctx.author.roles, id=item) # type: ignore - else: - role = discord.utils.get(ctx.author.roles, name=item) # type: ignore - if role is None: - raise MissingRole(item) - return True - - return check(predicate) - - -def has_any_role(*items: Union[int, str]) -> Callable[[T], T]: - r"""A :func:`.check` that is added that checks if the member invoking the - command has **any** of the roles specified. This means that if they have - one out of the three roles specified, then this check will return `True`. - - Similar to :func:`.has_role`\, the names or IDs passed in must be exact. - - This check raises one of two special exceptions, :exc:`.MissingAnyRole` if the user - is missing all roles, or :exc:`.NoPrivateMessage` if it is used in a private message. - Both inherit from :exc:`.CheckFailure`. - - .. versionchanged:: 1.1 - - Raise :exc:`.MissingAnyRole` or :exc:`.NoPrivateMessage` - instead of generic :exc:`.CheckFailure` - - Parameters - ----------- - items: List[Union[:class:`str`, :class:`int`]] - An argument list of names or IDs to check that the member has roles wise. - - Example - -------- - - .. code-block:: python3 - - @bot.command() - @commands.has_any_role('Library Devs', 'Moderators', 492212595072434186) - async def cool(ctx): - await ctx.send('You are cool indeed') - """ - - def predicate(ctx): - if ctx.guild is None: - raise NoPrivateMessage() - - # ctx.guild is None doesn't narrow ctx.author to Member - getter = functools.partial(discord.utils.get, ctx.author.roles) - if any(getter(id=item) is not None if isinstance(item, int) else getter(name=item) is not None for item in items): - return True - raise MissingAnyRole(list(items)) - - return check(predicate) - - -def bot_has_role(item: int, /) -> Callable[[T], T]: - """Similar to :func:`.has_role` except checks if the bot itself has the - role. - - This check raises one of two special exceptions, :exc:`.BotMissingRole` if the bot - is missing the role, or :exc:`.NoPrivateMessage` if it is used in a private message. - Both inherit from :exc:`.CheckFailure`. - - .. versionchanged:: 1.1 - - Raise :exc:`.BotMissingRole` or :exc:`.NoPrivateMessage` - instead of generic :exc:`.CheckFailure` - - .. versionchanged:: 2.0 - - ``item`` parameter is now positional-only. - """ - - def predicate(ctx): - if ctx.guild is None: - raise NoPrivateMessage() - - me = ctx.me - if isinstance(item, int): - role = discord.utils.get(me.roles, id=item) - else: - role = discord.utils.get(me.roles, name=item) - if role is None: - raise BotMissingRole(item) - return True - - return check(predicate) - - -def bot_has_any_role(*items: int) -> Callable[[T], T]: - """Similar to :func:`.has_any_role` except checks if the bot itself has - any of the roles listed. - - This check raises one of two special exceptions, :exc:`.BotMissingAnyRole` if the bot - is missing all roles, or :exc:`.NoPrivateMessage` if it is used in a private message. - Both inherit from :exc:`.CheckFailure`. - - .. versionchanged:: 1.1 - - Raise :exc:`.BotMissingAnyRole` or :exc:`.NoPrivateMessage` - instead of generic checkfailure - """ - - def predicate(ctx): - if ctx.guild is None: - raise NoPrivateMessage() - - me = ctx.me - getter = functools.partial(discord.utils.get, me.roles) - if any(getter(id=item) is not None if isinstance(item, int) else getter(name=item) is not None for item in items): - return True - raise BotMissingAnyRole(list(items)) - - return check(predicate) - - -def has_permissions(**perms: bool) -> Check[Any]: - """A :func:`.check` that is added that checks if the member has all of - the permissions necessary. - - Note that this check operates on the current channel permissions, not the - guild wide permissions. - - The permissions passed in must be exactly like the properties shown under - :class:`.discord.Permissions`. - - This check raises a special exception, :exc:`.MissingPermissions` - that is inherited from :exc:`.CheckFailure`. - - Parameters - ------------ - perms - An argument list of permissions to check for. - - Example - --------- - - .. code-block:: python3 - - @bot.command() - @commands.has_permissions(manage_messages=True) - async def test(ctx): - await ctx.send('You can manage messages.') - - """ - - invalid = set(perms) - set(discord.Permissions.VALID_FLAGS) - if invalid: - raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") - - def predicate(ctx: Context[BotT]) -> bool: - permissions = ctx.permissions - - missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] - - if not missing: - return True - - raise MissingPermissions(missing) - - return check(predicate) - - -def bot_has_permissions(**perms: bool) -> Check[Any]: - """Similar to :func:`.has_permissions` except checks if the bot itself has - the permissions listed. - - This check raises a special exception, :exc:`.BotMissingPermissions` - that is inherited from :exc:`.CheckFailure`. - """ - - invalid = set(perms) - set(discord.Permissions.VALID_FLAGS) - if invalid: - raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") - - def predicate(ctx: Context[BotT]) -> bool: - permissions = ctx.bot_permissions - - missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] - - if not missing: - return True - - raise BotMissingPermissions(missing) - - return check(predicate) - - -def has_guild_permissions(**perms: bool) -> Check[Any]: - """Similar to :func:`.has_permissions`, but operates on guild wide - permissions instead of the current channel permissions. - - If this check is called in a DM context, it will raise an - exception, :exc:`.NoPrivateMessage`. - - .. versionadded:: 1.3 - """ - - invalid = set(perms) - set(discord.Permissions.VALID_FLAGS) - if invalid: - raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") - - def predicate(ctx: Context[BotT]) -> bool: - if not ctx.guild: - raise NoPrivateMessage - - permissions = ctx.author.guild_permissions # type: ignore - missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] - - if not missing: - return True - - raise MissingPermissions(missing) - - return check(predicate) - - -def bot_has_guild_permissions(**perms: bool) -> Check[Any]: - """Similar to :func:`.has_guild_permissions`, but checks the bot - members guild permissions. - - .. versionadded:: 1.3 - """ - - invalid = set(perms) - set(discord.Permissions.VALID_FLAGS) - if invalid: - raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") - - def predicate(ctx: Context[BotT]) -> bool: - if not ctx.guild: - raise NoPrivateMessage - - permissions = ctx.me.guild_permissions # type: ignore - missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] - - if not missing: - return True - - raise BotMissingPermissions(missing) - - return check(predicate) - - -def dm_only() -> Check[Any]: - """A :func:`.check` that indicates this command must only be used in a - DM context. Only private messages are allowed when - using the command. - - This check raises a special exception, :exc:`.PrivateMessageOnly` - that is inherited from :exc:`.CheckFailure`. - - .. versionadded:: 1.1 - """ - - def predicate(ctx: Context[BotT]) -> bool: - if ctx.guild is not None: - raise PrivateMessageOnly() - return True - - return check(predicate) - - -def guild_only() -> Check[Any]: - """A :func:`.check` that indicates this command must only be used in a - guild context only. Basically, no private messages are allowed when - using the command. - - This check raises a special exception, :exc:`.NoPrivateMessage` - that is inherited from :exc:`.CheckFailure`. - - If used on hybrid commands, this will be equivalent to the - :func:`discord.app_commands.guild_only` decorator. In an unsupported - context, such as a subcommand, this will still fallback to applying the - check. - """ - - # Due to implementation quirks, this check has to be re-implemented completely - # to work with both app_commands and the command framework. - - def predicate(ctx: Context[BotT]) -> bool: - if ctx.guild is None: - raise NoPrivateMessage() - return True - - def decorator(func: Union[Command, CoroFunc]) -> Union[Command, CoroFunc]: - if isinstance(func, Command): - func.checks.append(predicate) - if hasattr(func, '__commands_is_hybrid__'): - app_command = getattr(func, 'app_command', None) - if app_command: - app_command.guild_only = True - else: - if not hasattr(func, '__commands_checks__'): - func.__commands_checks__ = [] - - func.__commands_checks__.append(predicate) - func.__discord_app_commands_guild_only__ = True - - return func - - if inspect.iscoroutinefunction(predicate): - decorator.predicate = predicate - else: - - @functools.wraps(predicate) - async def wrapper(ctx: Context[BotT]): - return predicate(ctx) - - decorator.predicate = wrapper - - return decorator # type: ignore - - -def is_owner() -> Check[Any]: - """A :func:`.check` that checks if the person invoking this command is the - owner of the bot. - - This is powered by :meth:`.Bot.is_owner`. - - This check raises a special exception, :exc:`.NotOwner` that is derived - from :exc:`.CheckFailure`. - """ - - async def predicate(ctx: Context[BotT]) -> bool: - if not await ctx.bot.is_owner(ctx.author): - raise NotOwner('You do not own this bot.') - return True - - return check(predicate) - - -def is_nsfw() -> Check[Any]: - """A :func:`.check` that checks if the channel is a NSFW channel. - - This check raises a special exception, :exc:`.NSFWChannelRequired` - that is derived from :exc:`.CheckFailure`. - - If used on hybrid commands, this will be equivalent to setting the - application command's ``nsfw`` attribute to ``True``. In an unsupported - context, such as a subcommand, this will still fallback to applying the - check. - - .. versionchanged:: 1.1 - - Raise :exc:`.NSFWChannelRequired` instead of generic :exc:`.CheckFailure`. - DM channels will also now pass this check. - """ - - # Due to implementation quirks, this check has to be re-implemented completely - # to work with both app_commands and the command framework. - - def predicate(ctx: Context[BotT]) -> bool: - ch = ctx.channel - if ctx.guild is None or ( - isinstance(ch, (discord.TextChannel, discord.Thread, discord.VoiceChannel)) and ch.is_nsfw() - ): - return True - raise NSFWChannelRequired(ch) # type: ignore - - def decorator(func: Union[Command, CoroFunc]) -> Union[Command, CoroFunc]: - if isinstance(func, Command): - func.checks.append(predicate) - if hasattr(func, '__commands_is_hybrid__'): - app_command = getattr(func, 'app_command', None) - if app_command: - app_command.nsfw = True - else: - if not hasattr(func, '__commands_checks__'): - func.__commands_checks__ = [] - - func.__commands_checks__.append(predicate) - func.__discord_app_commands_is_nsfw__ = True - - return func - - if inspect.iscoroutinefunction(predicate): - decorator.predicate = predicate - else: - - @functools.wraps(predicate) - async def wrapper(ctx: Context[BotT]): - return predicate(ctx) - - decorator.predicate = wrapper - - return decorator # type: ignore - - -def cooldown( - rate: int, - per: float, - type: Union[BucketType, Callable[[Context[Any]], Any]] = BucketType.default, -) -> Callable[[T], T]: - """A decorator that adds a cooldown to a :class:`.Command` - - A cooldown allows a command to only be used a specific amount - of times in a specific time frame. These cooldowns can be based - either on a per-guild, per-channel, per-user, per-role or global basis. - Denoted by the third argument of ``type`` which must be of enum - type :class:`.BucketType`. - - If a cooldown is triggered, then :exc:`.CommandOnCooldown` is triggered in - :func:`.on_command_error` and the local error handler. - - A command can only have a single cooldown. - - Parameters - ------------ - rate: :class:`int` - The number of times a command can be used before triggering a cooldown. - per: :class:`float` - The amount of seconds to wait for a cooldown when it's been triggered. - type: Union[:class:`.BucketType`, Callable[[:class:`.Context`], Any]] - The type of cooldown to have. If callable, should return a key for the mapping. - - .. versionchanged:: 1.7 - Callables are now supported for custom bucket types. - """ - - def decorator(func: Union[Command, CoroFunc]) -> Union[Command, CoroFunc]: - if isinstance(func, Command): - func._buckets = CooldownMapping(Cooldown(rate, per), type) - else: - func.__commands_cooldown__ = CooldownMapping(Cooldown(rate, per), type) - return func - - return decorator # type: ignore - - -def dynamic_cooldown( - cooldown: Callable[[Context[Any]], Optional[Cooldown]], - type: Union[BucketType, Callable[[Context[Any]], Any]], -) -> Callable[[T], T]: - """A decorator that adds a dynamic cooldown to a :class:`.Command` - - This differs from :func:`.cooldown` in that it takes a function that - accepts a single parameter of type :class:`.Context` and must - return a :class:`~discord.app_commands.Cooldown` or ``None``. - If ``None`` is returned then that cooldown is effectively bypassed. - - A cooldown allows a command to only be used a specific amount - of times in a specific time frame. These cooldowns can be based - either on a per-guild, per-channel, per-user, per-role or global basis. - Denoted by the third argument of ``type`` which must be of enum - type :class:`.BucketType`. - - If a cooldown is triggered, then :exc:`.CommandOnCooldown` is triggered in - :func:`.on_command_error` and the local error handler. - - A command can only have a single cooldown. - - .. versionadded:: 2.0 - - Parameters - ------------ - cooldown: Callable[[:class:`.Context`], Optional[:class:`~discord.app_commands.Cooldown`]] - A function that takes a message and returns a cooldown that will - apply to this invocation or ``None`` if the cooldown should be bypassed. - type: :class:`.BucketType` - The type of cooldown to have. - """ - if not callable(cooldown): - raise TypeError("A callable must be provided") - - if type is BucketType.default: - raise ValueError('BucketType.default cannot be used in dynamic cooldowns') - - def decorator(func: Union[Command, CoroFunc]) -> Union[Command, CoroFunc]: - if isinstance(func, Command): - func._buckets = DynamicCooldownMapping(cooldown, type) - else: - func.__commands_cooldown__ = DynamicCooldownMapping(cooldown, type) - return func - - return decorator # type: ignore - - -def max_concurrency(number: int, per: BucketType = BucketType.default, *, wait: bool = False) -> Callable[[T], T]: - """A decorator that adds a maximum concurrency to a :class:`.Command` or its subclasses. - - This enables you to only allow a certain number of command invocations at the same time, - for example if a command takes too long or if only one user can use it at a time. This - differs from a cooldown in that there is no set waiting period or token bucket -- only - a set number of people can run the command. - - .. versionadded:: 1.3 - - Parameters - ------------- - number: :class:`int` - The maximum number of invocations of this command that can be running at the same time. - per: :class:`.BucketType` - The bucket that this concurrency is based on, e.g. ``BucketType.guild`` would allow - it to be used up to ``number`` times per guild. - wait: :class:`bool` - Whether the command should wait for the queue to be over. If this is set to ``False`` - then instead of waiting until the command can run again, the command raises - :exc:`.MaxConcurrencyReached` to its error handler. If this is set to ``True`` - then the command waits until it can be executed. - """ - - def decorator(func: Union[Command, CoroFunc]) -> Union[Command, CoroFunc]: - value = MaxConcurrency(number, per=per, wait=wait) - if isinstance(func, Command): - func._max_concurrency = value - else: - func.__commands_max_concurrency__ = value - return func - - return decorator # type: ignore - - -def before_invoke(coro: Hook[CogT, ContextT], /) -> Callable[[T], T]: - """A decorator that registers a coroutine as a pre-invoke hook. - - This allows you to refer to one before invoke hook for several commands that - do not have to be within the same cog. - - .. versionadded:: 1.4 - - .. versionchanged:: 2.0 - - ``coro`` parameter is now positional-only. - - Example - --------- - - .. code-block:: python3 - - async def record_usage(ctx): - print(ctx.author, 'used', ctx.command, 'at', ctx.message.created_at) - - @bot.command() - @commands.before_invoke(record_usage) - async def who(ctx): # Output: used who at

  • {name}