\bgt>UdZddlmZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z m Z mZmZmZmZmZmZmZmZmZmZmZddlmZddlmZdd lmZGd d eZ Gd d eZ!GddeZ"GddeZ#GddeZ$GddeZ%GddeZ&ddZ'ddd Z(dd#Z) ddd*Z*d+d,d-d.d/d0d1d2d3Z+id4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUidVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtduZ,e,-e+dvdwdxdydzZ.d{d|iZ/d}e,0DZ1e2e1D]1Z3d~e3vr+e34d~\Z5Z6e1e3xe1e5<e1e6<e1e3=2de.0DZ7de/0DZ8e2e8D]1Z3d~e3vr+e34d~\Z5Z6e8e3xe8e5<e8e6<e8e3=2dZ9e)e9Z:dZ;e)e;Ze(de=de>DzZ?e=e>zZ@e*e@ddd\ZAZBZCdZDe*eDdd\ZEZFZGZHdZIe*eIdd\ZJZKZLZMdZNe*eNdd\ZOZPZQZRdZSe*eSdd\ZTZUZVZWdZXe*eXdd\ZYZZZ[Z\dZ]e*e]dd\Z^Z_Z`ZadZbe*ebdd\ZcZdZeZfdZge*egdd\ZhZiZjZkdZle)elZmdZne*endd\ZoZpZqZrdZse*esdd\ZtZuZvZwgdZxe)exZye)dexDZze(dexZ{hdZ|de|DZ}gdexzZ~e)e~Ze)de~DZdZe*edd\ZZZZdZe*edd\ZZZZdZe*edd\ZZZZdZe*edd\ZZZZdZe*edd\ZZZZdZe*edd\ZZZZdZe*edd\ZZZZd4Zd4Ze*eddd\ZZZe*eddd\ZZZdZe*eddd\ZZZgdZddgZedeDzZdZgdezZgdZgdezZe)eZgde=zZddge>zZe)eZdeDZdeDZe)eZdgZe'd~edeDzezZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZe'd~egeze2e+zgdϢzZde'dѦfde'dӦfde'dզffZdքeDZd!ed<dd~eӦdٝZdZd۠4ZegdܢzZe)eئZe'd~eئZdeڛdޝZhdߣZiddddddddddddddddddddddddddddddddddddiZddeݠ0DiZded<dedd<ddddddddddddd Ze'd~eߦZe)eߦZdeߠ0Ded<dD]@\ZZZZ eeeee<#e$rieee<eeeee<Y=wxYwe'd~edZe)edZddZdddddddddd Ziddddddd dd d d d d d d d ddddddddddddddddddddddddddddddddddZejde'd~ed ejZd!Zejd"ejZd#Zd$Zd%Zd&Zd'Zd(d(d)d*d+Zejde'd~ed,ejZd-d.d/d/d/d/d0Zejde'd~ed,ejZejd1ejZejd2ejZejd3ejZejd4ejZejd5ejZejd6ejZd7d8d9d:d7d7d7d7d7d7d7d7d7d; ZeeZed<d=d>d?d@dAdBdCDZejdd~edEZgdFZgdGZ gdHZ gdIZ edddd$ddJZ dKe DZ dLe DZd$dddMZejdNZejdOejZejdPZejdQe՛d,ejZejdQeۛd,ejZejdRZejdeћd,ZejdSZejdTejZejdUZejdVejZejdWejZejdXejZejdYejZejdZejZejd[ejZejd\ejZ ejd]ejZ!ejd^ejZ"ejd_ejZ#ejd`ejZ$ejdaejZ%ejdbZ&ejdcejZ'ejddZ(ejdeZ)ejdfZ*ejdgZ+ejdhZ,ejdiZ-ejdjZ.ejdkZ/ejdlZ0ejdmZ1ejdnZ2ejdodpfejdqdrfejdsdtfejdudvfejdwdxfejdydzfejd{d|fejd}dtfejd~dtfejddfejddff Z3ejdZ4Gdde5Z6e Z7e Z8e8ree5dfZ9n&Gdde:Z;Gdde;Z9GddZ`_. methods: classical inflect plural plural_noun plural_verb plural_adj singular_noun no num a an compare compare_nouns compare_verbs compare_adjs present_participle ordinal number_to_words join defnoun defverb defadj defa defan INFLECTIONS: classical inflect plural plural_noun plural_verb plural_adj singular_noun compare no num a an present_participle PLURALS: classical inflect plural plural_noun plural_verb plural_adj singular_noun no num compare compare_nouns compare_verbs compare_adjs COMPARISONS: classical compare compare_nouns compare_verbs compare_adjs ARTICLES: classical inflect num a an NUMERICAL: ordinal number_to_words USER_DEFINED: defnoun defverb defadj defa defan Exceptions: UnknownClassicalModeError BadNumValueError BadChunkingOptionError NumOutOfRangeError BadUserDefinedPatternError BadRcFileError BadGenderError ) annotationsN)Number) TYPE_CHECKINGAnyCallableDictIterableListLiteralMatchOptionalSequenceTupleUnioncast)windowed_complete) typechecked) AnnotatedceZdZdS)UnknownClassicalModeErrorN__name__ __module__ __qualname__t/builddir/build/BUILD/cloudlinux-venv-1.0.7/venv/lib/python3.11/site-packages/setuptools/_vendor/inflect/__init__.pyrrVDrrceZdZdS)BadNumValueErrorNrrrrr!r!Zrrr!ceZdZdS)BadChunkingOptionErrorNrrrrr#r#^rrr#ceZdZdS)NumOutOfRangeErrorNrrrrr%r%brrr%ceZdZdS)BadUserDefinedPatternErrorNrrrrr'r'frrr'ceZdZdS)BadRcFileErrorNrrrrr)r)jrrr)ceZdZdS)BadGenderErrorNrrrrr+r+nrrr+sstrreturncd|dS)Nz(?:)rr,s rencloser2rs :::rcutpoint Optional[int]wordsOptional[Iterable[str]]cdtdfd|pgDS)a Join stem of each word in words into a string for regex. Each word is truncated at cutpoint. Cutpoint is usually negative indicating the number of letters to remove from the end of each word. >>> joinstem(-2, ["ephemeris", "iris", ".*itis"]) '(?:ephemer|ir|.*it)' >>> joinstem(None, ["ephemeris"]) '(?:ephemeris)' >>> joinstem(5, None) '(?:)' |c3,K|]}|dVdSNr).0wr3s r zjoinstem..s+>>QAixiL>>>>>>r)r2join)r3r5s` rjoinstemr?vs8$ 388>>>>%+2>>>>> ? ??r Iterable[str]Dict[int, set]ctjt}|D]*}|t||+|S)a From a list of words, return a dict of sets sorted by word length. >>> words = ['ant', 'cat', 'dog', 'pig', 'frog', 'goat', 'horse', 'elephant'] >>> ret = bysize(words) >>> sorted(ret[3]) ['ant', 'cat', 'dog', 'pig'] >>> ret[5] {'horse'} ) collections defaultdictsetlenadd)r5resr<s rbysizerIsG&1#66C  CFF  JrTlstplending siendingsize dojoinstemboolc fd|D}t|}t|}|rt|}||||fS|||fS)am given a list of singular words: lst an ending to append to make the plural: plending the number of characters to remove from the singular before appending plending: siendingsize a flag whether to create a joinstem: dojoinstem return: a list of pluralised words: si_list (called si because this is what you need to look for to make the singular) the pluralised words as a dict of sets sorted by word length: si_bysize the singular words as a dict of sets sorted by word length: pl_bysize if dojoinstem is True: a regular expression that matches any of the stems: stem Nc*g|]}|dzSr:r)r;r<rKrLs r z$make_pl_si_lists..s'888qq,(*888r)rIr?)rJrKrLrMsi_list pl_bysize si_bysizestems `` rmake_pl_si_listsrVsx0$} 88888C888Gs IwI- c** 9d22 9,,rzcorpuses|corporaz opuses|operageneramythoiz penises|penestesteszatlases|atlantesyeses)corpusopusgenusmythospenistestisatlasyeschildchildrenchilizchilis|chiliesbrotherzbrothers|brethreninfinityzinfinities|infinityloafloaveslorez lores|lorehoofz hoofs|hoovesbeefz beefs|beevesthiefzthiefs|thievesmoneymoniesmongoose mongoosesoxoxencowz cows|kinegraffitograffitioctopuszoctopuses|octopodesgeniez genies|geniiganglionzganglions|gangliatrilbytrilbysturfz turfs|turvesnumennuminaatmanatmasocciputzocciputs|occipita sabretooth sabretooths sabertooth sabertoothslowlifelowlifesflatfoot flatfoots tenderfoot tenderfootsromanyromaniesjerryjerriesmarymariestalousetalousesromromacarmencarminaRomaniesJerrysMarysRoma)RomanyJerryMaryRomz prima donnazprima donnas|prime donneci|]\}}|| Srrr;kvs r rs>>>FQ1a>>>rr8ci|]\}}|| Srrrs rrrsHHH!Q1HHHrci|]\}}|| Srrrs rrrsPPPVaAqPPPr)quartztopaz)snooze) ephemerisirisclitoris chrysalis epididymisitiscg|]}d|Sz.*rr;r<s rrQrQ)s#N#N#NHHH#N#N#NridesF)rM)anathemabema carcinomacharismadiplomadogmadramaedemaenemaenigmalemmalymphomamagmamelismamiasmaoedemasarcomaschemasomastigmastomatraumagummapragmaata)alumnaalgavertebrapersonavitae)amoebaantennaformula hyperbolamedusanebulaparabolaabscissahydranovalacunaauroraumbraflorafauna)stamenforamenlumenina) bacteriumagendum desideratumerratumstratumdatumovumextremum candelabruma)maximumminimummomentumoptimumquantumcranium curriculumdictumphylumaquarium compendiumemporiumencomium gymnasium honorarium interregnumlustrum memorandum millenniumrostrumspectrumspeculumstadium trapezium ultimatummediumvacuumvelum consortium arboretum) alumnusalveolusbacillusbronchuslocusnucleusstimulusmeniscus sarcophagusi)focusradiusgeniusincubussuccubusnimbusfungus nucleolusstylustorus umbilicusuterus hippopotamuscactus)status apparatus prospectussinushiatusimpetusplexus) criterion perihelionaphelion phenomenon prolegomenonnoumenonorganon asyndeton hyperbaton)oxymoron)solosopranobassoalto contraltotempopianovirtuosoc(g|]}|dddS)Nrrrs rrQrQ9s&???a#2#\\\???rrB>ISONCONGOadootoNATOch|]}|dSr1rrs r rJ@s@@@QA@@@r) aficionadoaggroalbinoallegroammo Antananarivo archipelago armadilloautoavocadoBamako BarquisimetobimbobingoBiroboleroBolzanobongoBotoburroCairocanto cappuccinocasinocelloChicagoChimangocilantrocochitococoColomboColoradocommando concertinocontangocredo crescendocyanodemodittoDracodynamoembryo EsperantoespressoeurofalsettoFarofiascoFilipinoflamencofurioso generalissimoGestapoghettogigologizmo Greensborogringo GuaiaberoguanogumbogyrohairdohippoIdahoimpetigoinfernoinfo intermezzo intertrigoIquicojumbojuntoKakapokilo KinkimavoKokakoKosovoLesotholiberolibidolibrettolidoLilolimbolimolinenolingolinolivedolocologolumbagomachomacromafiosomagneto magnificoMajuroMalabo manifestoMaputo MaracaibomedicomemometroMexicomicroMilanoMonacomono MontenegroMoroccoMuqdishomyoneutrinoNingbooctavooreganoOrinocoOrlandoOslopanto ParamariboParduscopedalophotopimentopintoplecoPlutopogopoloponchoz Porto-NovoPortopropsychopuebloquartoQuitoreporhinorisottorococorondo SacramentosaddosagosalvoSantiagoSapporoSarajevo scherzandoscherzosilosiroccosombrerostaccatosternostuccostylosumoTaikotechnoterrazzotestudotimpanotirotobaccoTogoTokyotoreroTorinoTorontotorsotremolotypotyroufoUNESCOvaquero vermicelloversovibrato violoncelloVirgoweirdoWHOWTO Yamoussoukrozyo-yozeroZibocg|]}|dSr1rrs rrQrQ sDDD!gggDDDr)czecheunuchstomach)codexmurexsilexices)radixhelix)vortexvertexcortexlatexpontifexapexindexsimplex)appendix)afritafreetefreet)goyseraphcherubimzq ataman caiman cayman ceriman desman dolman farman harman hetman human leman ottoman shaman talisman z Alabaman Bahaman Burman German Hiroshiman Liman Nakayaman Norman Oklahoman Panaman Roman Selman Sonaman Tacoman Yakiman Yokohaman Yuman ) booklouse grapelouselouse woodlouselice)#breechesbritchespajamaspyjamasclippersgallowshijinks headquarterspliersscissorsrYherpespincersshears proceedingstrouserscantuscoitusnexus contretempscorpsdebrissiemensmumpsdiabetes jackanapesseriesspecies subspeciesrabieschassisinningsnewsmewshaggisoismeaslescg|]}d|Srrrs rrQrQs+666HHH666r) wildebeestswineelandbisonbuffalocattleelk rhinoceroszucchinicariboudacegrousez guinea fowlz guinea-fowlhaddockhakehalibutherringmackerelpickerelpikeroeseedshadsnipetealturbotz water fowlz water-fowl)tunasalmonratroutbreamzsea-basszsea basscarpcodflounderwhitingmooservdjinnsamuri offspringpencequidhertz) PortugueseAmoyeseBorgheseCongoeseFaroese FoochoweseGeneveseGenoese Gilbertese Hottentotese KiplingeseKongoeseLuccheseMaltese NankingeseNiasese Pekingese Piedmontese Pistoiese SarawakeseShavese Vermontese WenchoweseYengeese) buttercash furniture informationfishdeersheepnesereselesemesepoxcraft) acropolisaegisaliasasbestosbathosbias bronchitisbursitiscaddiscannabiscanvaschaoscosmosdais digitalis epidermisethoseyasgasglottishubrisibislensmantismarquis metropolispathospelvispolisrX sassafrastrellisssuscg|]}|dSesrrs rrQrQOsIII!XXXIIIrcg|]}|dSrrrs rrQrQPsGGGqHHHGGGrz [A-Z].*escg|]}d|Srrrs rrQrQXs 6 6 6888 6 6 6r)BolshoisHanois) BetelgeusesDusesMeuses Syracuses Toulouses)abuses applausesblousescarousescauses chartreusesclausescontusesdousesexcusesfusesgrouses hypotenuses masseuses menopausesmisusesmusesoverusespausesperusesprofusesreclusesreusesrusessousesspousessuffuses transfusesuses)AddiesAggiesAlliesAmiesAngiesAnnies AnnmariesArchiesArtiesAussiesBarbiesBarriesBasiesBenniesBerniesBertiesBessiesBettiesBilliesBlondiesBobbiesBonniesBowiesBrandiesBriesBrowniesCallies CarnegiesCarriesCassiesCharliesCheries ChristiesConniesCuriesDanniesDebbiesDixiesDolliesDonnies DrambuiesEddiesEffiesElliesElsiesEriesErniesEssiesEugeniesFanniesFlossiesFrankiesFreddies GillespiesGoldiesGraciesGuthriesHalliesHattiesHettiesHolliesJackiesJamiesJaniesJanniesJeaniesJeanniesJenniesJessiesJimmiesJodiesJohniesJohnniesJosiesJulies KalgoorliesKathiesKatiesKelliesKewpiesKristiesLaramiesLassiesLauriesLesliesLessiesLilliesLizziesLonniesLoriesLorriesLottiesLouies MackenziesMaggiesMaisiesMamiesMarciesMargiesMaries MarjoriesMatties McKenziesMelaniesMickiesMilliesMinniesMolliesMountiesNanniesNataliesNelliesNettiesOlliesOzziesPearlies PottawatomiesReggiesRichiesRickiesRobbiesRonniesRosalies RosemariesRosiesRoxiesRushdiesRuthiesSadiesSalliesSammiesScotties SelassiesSherriesSophiesStacies Stefanies StephaniesSteviesSusiesSylviesTammiesTerriesTessiesTommiesTraciesTrekkiesValariesValeries ValkyriesVickiesVirgiesWilliesWinniesWyliesYorkies)Gaeriesbaggiesbeliesbiggiesbirdiesbogiesbonniesboogiesbookies bourgeoisiesbrowniesbudgiescaddiescalories camaraderies cockamamiescolliescookiescooliescootiescoteriescrappiescuriescutesiesdogieseyriesflooziesfootsiesfreebiesgeniesgoaliesgroupieshies jalousiesjunkieskiddiesladdieslassieslies lingeriesmagpies menageriesmommiesmoviesnecktiesnewbiesnightiesoldies organdiesoverliespiespinkiespixiespotpiesprairiesquickiesreveriesrookies rotisseriessoftiessortiesrFstymiessweetiesties underliesuntiesveggiesviesyuppieszombies)ChloesCrusoesDefoesFaeroesIvanhoesJoesMcEnroesMoesMonroesNoesPoesRoscoesTahoes TippecanoesZoes)aloesbackhoescanoesdoesfloesfoeshoes mistletoesoboespekoesroessloesthroestiptoestoeswoes)quartzestopazes)buzzesfizzesfrizzesrazzes) AndromachesApachesBlanches Comanches NietzschesPorschesRoches)aches avalanches backaches bellyachescachesclochescrechesdouchesearachesfiches headaches heartaches microfichesniches pastichespsychesquiches stomachaches toothachestranches)annexesaxesdeluxespickaxes)HessesJesses LaroussesMatisses)bouillabaisses crevasses demitassesimpassesmoussesposses)Clives Palmolives) interweavesweavesolivesbivalves dissolvesresolvessalvestwelvesvalves)z (.*[csx])isz(.*)cepsz[A-Z].*sgeneralz1(?!major|lieutenant|brigadier|adjutant|.*star)\S+martialcourtforcepoundc#HK|]\}}t|d|dzVdS)z (?=(?:-|\s+)r0N)r2)r;keyvals rr=r=sP$$.6c3GC(#((( ())$$$$$$rpl_sb_postfix_adj(z)(.*))A amanuenses amniocentesesanalyses antitheses apotheosesarteriosclerosesatherosclerosesr  catalyses catharseschasses cirrhosescoccescrises diagnosesdialysesdiereses electrolysesemphasesexegesesgeneses halitoses hydrolyseshypnoses hypotheses hystereses metamorphoses metastases misdiagnosesmitoses mononucleosesnarcosesnecrosesnemesesneurosesoasesosmoses osteoporoses paralyses parenthesesparthenogeneses periphrasesphotosyntheses probosces prognoses prophylaxes prosthesespreces psoriasespsychoanalyses psychokineses psychoses scleroses scoliosessepses silicoses symbiosessynopses synthesestaxes telekinesestheses thromboses tuberculoses urinalysesz about above across after among around at athwart before behind below beneath beside besides between betwixt beyond but by during except for from in into near of off on onto out over since till to under until unto upon with)dedudaz(.*?)((?:-|\s+)(?:z)(?:-|\s+))a(?:-|\s+)(.*)>neuterfeminine masculinegender-neutralfeminine or masculinemasculine or femininewemyself ourselvesyouyourself yourselvesshetheyherself themselveshehimselfititselfthemselfmineoursyoursherstheirshisitsnomci|]\}}|| Srrrs rrrgs 3 3 3VaAq 3 3 3rz0Dict[str, Dict[str, Union[str, Dict[str, str]]]]si_pronIthem) merwryrzherr~himrrrrrci|]\}}|| Srrrs rrrs9996Aq!Q999racc))rr}rpr)rr}rqr|)rr}rrr)rr}rsr})rr}rtz she or he)rr}ruz he or she)rrrpr)rrrqr~)rrrrr)rrrsr)rrrtherself or himself)rrruhimself or herself)rrrpr)rrrqr)rrrrr)rrrsr)rrrtz hers or his)rrruz his or hers)rrrpr)rrrqr)rrrrr)rrrsr)rrrtz her or him)rrruz him or her)rrrpr)rrrqr~)rrrrr)rrrsr)rrrtr)rrrurc t||}n#t$rwxYw ||S#t$rtt|cYSwxYwr:)rKeyError TypeErrorrr-)thecasewordgendersings r get_si_pronrstw%  F| Cs ".AAarewerehavedo) amriswasrrhasrractactsblameblamescanmustflyfliescopycopiesdrinkdrinksfightfightsfirefireslikelookmakereachrunsinksleepview)likesrlooksrmakesrreachesrrunsrsinksrsleepsrviewsz^(z )((\s.*)?)$)didhadatemadeputspentfoughtsankgavesoughtshallcouldoughtshouldz0^((?:thought|saw|bent|will|might|cut))((\s.*)?)$)rrrrrr)rr)shoes)0nor nil)1ranoneeacheverythisthatsomethesethose)rrrrz)$ouryourtheir)myrrrrrz~ ^(?! FJO | [HLMNS]Y. | RY[EO] | SQU | ( F[LR]? | [HL] | MN? | N | RH? | S[CHKLMNPTVW]? | X(YL)?) [AEIOU]) [FHLMNRSX][A-Z] z)^(y(b[lor]|cl[ea]|fere|gg|p[ios]|rou|tt))z^((?:unabomber|unanimous|US))z0^((?:euler|hour(?!i)|heir|honest|hono[ur]|mpeg))z^([aefhilmnorsx]-?th)z^([bcdgjkpqtuvwyz]-?th)thstndrd) rrrr+ tiethfirstsecondthirdfiftheighthninthtwelfth)tyrtwothreefiveeightninetwelvez)\Z) rrrfourrsixsevenrr) tenelevenrthirteenfourteenfifteensixteen seventeeneighteennineteen) rrtwentythirtyfortyfiftysixtyseventyeightyninety)  z thousandz millionz billionz trillionz quadrillionz quintillionz sextillionz septillionz octillionz nonillionz decillion)allr herdnamespersonsancientci|]}|dSTrr;rs rrrs000QD000rci|]}|dS)Frr!s rrrs000Q5000r)TrueFalseNonez\$(\d+)z((\w+)\([^)]*\)*)z\A(\s*)(.+?)(\s*)\Zz^(?:z (?P.+)( (per|a) .+)z\sz ^(.*[^s])s$z ^(.*)'s?$z\A(\s*)(?:an?\s+)?(.+?)(\s*)\Zz^[aefhilmnorsx]$z^[bcdgjkpqtuvwyz]$z^[aefhilmnorsx][.-]z ^[a-z][.-]z ^[^aeiouy]z^e[uw]z^onc?e\bz ^onetime\bz^uni([^nmd]|mo)z^u[bcfghjkqrst][aeiou]z^ukrz ^U[NK][AIEO]?z^[aeiou]z(\d)z(\d)(\d)z (\d)(\d)(\d)z(\d)(\d)(\d)(?=\D*\Z)z(\d)(\d)(?=\D*\Z)z (\d)(?=\D*\Z)z(\d)(\d{3}(?:,|\Z))z\Dz\s+,z , (\S+)\s+\Zz\s+zie$yzue$uz ([auy])e$z\g<1>zski$skiz[^b]i$rz ^(are|were)$bez^(had)$havz^(hoe)$z([^e])e$zer$erz ([^aeiou][aeiouy]([bdgmnprst]))$z \g<1>\g<2>z\dc@eZdZUded<ded<ded<ded<d d Zd S) Wordsr-loweredz List[str]split_rlastr.r%c||_||_|jd|_|jd|_dS)NrrB)lowerr.splitr/rr0)selforigs r__init__zWords.__init__s>zz|| jjll [^ KO rNr.r%)rrr__annotations__r6rrrr-r-sQLLLJJJ III$$$$$$rr- String with at least 1 characterceZdZddZdS) _WordMetainstancerr.rNcRt|tot|dkSNr) isinstancer-rF)r4r<s r__instancecheck__z_WordMeta.__instancecheck__s"h,,CX!1C CrN)r<rr.rN)rrrr@rrrr;r;s. D D D D D Drr;ceZdZdZdS)Wordr9N)rrr__doc__rrrrBrBs....rrB) metaclassceZdZddZedZejdZedd ZeddZ eddZ eddZ eddZ ddZ ddZeddZddZ ddd$Zdd&Zd'Zdd,Zedd.Zdd0Zdd2Zeddd4Ze ddd5Ze ddd6Ze ddd7Zedd;Zedd<Zedd=Zedd>Ze dddAZ ddBZ!ddHZ"ddIZ#ddJZ$dddMZ% dddNZ&e'dOZ(ddRZ)e*dSZ+ dddTZ, dddUZ- dddVZ. dddWZ/edddYZ0e0Z1e2dZfe3d[fe4d[fe5d[fe6dZfe7d[fe8d[fe9dZfe:dZfe;dZfedZfe?dZfe@dZfeAdZfeBdZfeCd[feDd[ffZEdd]ZFeddd_ZGedd`ZHeddcZIdddfZJdddiZKdddjZLddmZMddnZNddoZOddpZPddqZQddrZRddsZSddtZTddvZUe*dwZVe'dxZWe*dyZXe*dzZYe dddZZe*dZ[e dddZ\dS)enginer.r%ct|_d|_d|_g|_g|_g|_g|_g|_ d|_ d|_ dS)Nrrp) def_classicalrclassical_dictpersistent_count mill_countpl_sb_user_definedpl_v_user_definedpl_adj_user_definedsi_sb_user_definedA_a_user_defined thegender_engine__number_argsr4s rr6zengine.__init__sb+0022/38:799; 8:68!7;rcZttttf|jSr:)rrr-rRrSs r _number_argszengine._number_args sDcND$6777rc||_dSr:)rR)r4r*s rrUzengine._number_argss rsingularOptional[Word]pluralintc|||||j||f|j||fdS)z= Set the noun plural of singular to plural. r)checkpatcheckpatpluralrLextendrOr4rWrYs rdefnounzengine.defnounsg h F### &&&'9::: &&'9:::qrs1p1s2p2s3p3cB|||||||||||||j||||||fdS)z Set the verb plurals for s1, s2 and s3 to p1, p2 and p3 respectively. Where 1, 2 and 3 represent the 1st, 2nd and 3rd person forms of the verb. r)r\r]rMr^)r4rarbrcrdrerfs rdefverbzengine.defverbs b b b B B B %%r2r2r2&>???qrc|||||j||fdS)zB Set the adjective plural of singular to plural. r)r\r]rNr^r_s rdefadjz engine.defadj7sK h F###  ''6(:;;;qrpatternch|||j|dfdS)zS Define the indefinite article as 'a' for words matching pattern. rrr\rPr^r4rks rdefaz engine.defaBs6 g $$gs^444qrch|||j|dfdS)zT Define the indefinite article as 'an' for words matching pattern. rrrmrns rdefanz engine.defanLs6 g $$gt_555qrc|dS tj|ddS#tj$r}t||d}~wwxYw)z5 check for errors in a regex pattern Nr)rematcherrorr')r4rkerrs rr\zengine.checkpatVs\ ? F ? HWb ! ! ! ! !x ? ? ?,W553 > ?sA<AcdS)z= check for errors in a regex replace pattern Nrrns rr]zengine.checkpatpluralas  rrrBwordlistSequence[Optional[Word]] Optional[str]c ^tt|dz ddD]}tjd||d|tj}|r\||dzdSt dtt||dz}| |cSdS)Nrr^$rz\\1) rangerFrssearch IGNORECASE DOLLAR_DIGITSsubrrBexpand)r4rrxrmopls rud_matchzengine.ud_matchgss8}}q("b11 % %A. ...bmDDB %AE?*44"&&DxA77yy}}$$$  %trc D|s t|_dSd|vrE|drt|_nt|_|D]\}}|t vr ||j|<t dS)a turn classical mode on and off for various categories turn on all classical modes: classical() classical(all=True) turn on or off specific claassical modes: e.g. classical(herd=True) classical(names=False) By default all classical modes are off except names. unknown value in args or key in kwargs raises exception: UnknownClasicalModeError Nr) all_classicalrrI no_classicalitemsrHr)r4kwargsrrs r classicalzengine.classicalts& "/"4"4"6"6D  F F??e} :&3&8&8&:&:##&2&7&7&9&9#LLNN 0 0DAqM!!)*#A&&//  0 0rNcountr4showr-c|D t||_n#t$r }t|d}~wwxYw||rt |Snd|_dS)z Set the number to be used in other method calls. Returns count. Set show to False to return '' instead. Nr)rZrJ ValueErrorr!r-)r4rrrvs rnumz engine.numsp   0(+E %% 0 0 0&C/ 0  5zz!%)D !rs 0+0rc4|tvr ||_dSt)a set the gender for the singular of plural pronouns can be one of: 'neuter' ('they' -> 'it') 'feminine' ('they' -> 'she') 'masculine' ('they' -> 'he') 'gender-neutral' ('they' -> 'they') 'feminine or masculine' ('they' -> 'she or he') 'masculine or feminine' ('they' -> 'he or she') N)singular_pronoun_gendersrQr+)r4rs rrz engine.genders! - - -#DNNN rct|tjr|jSt|tjr|jSt|tjrfd|jDSt|tjr tfd|jDSt|tj r|j Std|j d)z5 Return the value of the ast object. c:g|]}|Sr_get_value_from_astr;rr4s rrQz.engine._get_value_from_ast..s'BBBAD,,Q//BBBrc:g|]}|Srrrs rrQz.engine._get_value_from_ast..s'HHH!$22155HHHrzname 'z' is not defined)r?astNumnStrr,r eltsrtuple NameConstantvalue NameErrorid)r4objs` rrzengine._get_value_from_asts c37 # # 5L SW % % 5L SX & & BBBBBBB B SY ' ' HHHHsxHHHII IS- . . 9  9999:::rrr methods_dictDict[str, Callable]c|\}}||vr|Stj|}fd|jdjjD}fd|jdjjD}|||i|S)zD Return the string to be substituted for the match. c:g|]}|Srr)r;rr4s rrQz0engine._string_to_substitute..s7     $ $Q ' '   rrcPi|]"}|j|j#Sr)argrr)r;kwr4s rrz0engine._string_to_substitute..s=    FD,,RX66   r)groupsrparsebodyrargskeywords)r4rr matched_textf_namea_tree args_list kwargs_lists` r_string_to_substitutezengine._string_to_substitutes "yy{{ f  % % <((    [^).       k!n*3   $|F#Y>+>>>rtextc j}jjjjjjjjjj j j d t fd|}|_|S)a) Perform inflections in a string. e.g. inflect('The plural of cat is plural(cat)') returns 'The plural of cat is cats' can use plural, plural_noun, plural_verb, plural_adj, singular_noun, a, an, no, ordinal, number_to_words, and prespart ) rY plural_adj plural_noun plural_verb singular_nounrrrordinalnumber_to_wordspresent_participlerc0|Sr:)r)rrr4s rz engine.inflect.. st11"lCCr)rJrYrrrrrrrrrr FUNCTION_CALLr)r4rsave_persistent_countoutputrs` @rinflectzengine.inflects!% 5k/++!/&'|#3"&"98 - - "" C C C C CT  !6 rr5ct|}d|vr|d}t|ddt|ddkr:|d|jdd}nm|d}t |D]2\}}d|vr)|d|jd||<3n|d}t |dD]v\}}|dkr ||kr||||<||kr||||<wd|S)Nr8rrrrr)r-r3rFrI enumerate capitalizeupperr>)r4r5 inflected word_optionsresultrrs r postprocesszengine.postprocess s NN )  $??3//L<?((--..#l1o6K6KC6P6P2Q2QQQ"--d.A%.HIOOPSTT#--#,V#4#4TTKE4d{{(, 38KE8R(Su T__S))F%TZZ__55 6 6KE4s{{   D(( &u 8 8 : :u tzz||## &u 3 3 5 5u xxrTuple[str, str, str]ct|}|r>|d|d|dfSdS)Nrrr)rrr)PARTITION_WORDrgroup)r4rrs rpartition_wordzengine.partition_word9 sM  " "4 ( (  88A;; RXXa[[8 8:rOptional[Union[str, int, Any]]c||\}}}|s|S|||||p+|||p|||}|||S)z Return the plural of text. If count supplied, then return text if count is one of: 1, a, an, one, each, every, this, that otherwise return the plural. Whitespace at the start and end is preserved. )rr_pl_special_adjective_pl_special_verb_plnounr4rrprerpostrYs rrYz engine.plural@ s--d33T4 K!!   & &tU 3 3 )$$T511 )||D%((    %v%t%%%rc||\}}}|s|S|||||}|||S)a Return the plural of text, where text is a noun. If count supplied, then return text if count is one of: 1, a, an, one, each, every, this, that otherwise return the plural. Whitespace at the start and end is preserved. )rrrrs rrzengine.plural_nounX sc--d33T4 K!!$ T5(A(ABB%v%t%%%rc||\}}}|s|S|||||p|||}|||S)a Return the plural of text, where text is a verb. If count supplied, then return text if count is one of: 1, a, an, one, each, every, this, that otherwise return the plural. Whitespace at the start and end is preserved. )rrr_pl_general_verbrs rrzengine.plural_verbm s--d33T4 K!!   ! !$ . . T$2G2Ge2T2T  %v%t%%%rc||\}}}|s|S|||||p|}|||S)a Return the plural of text, where text is an adjective. If count supplied, then return text if count is one of: 1, a, an, one, each, every, this, that otherwise return the plural. Whitespace at the start and end is preserved. )rrrrs rrzengine.plural_adj sk--d33T4 K!!$(B(B4(O(O(WSWXX%v%t%%%rword1word2Union[str, bool]cjjjf}fd|D}tt d|dS)a compare word1 and word2 for equality regardless of plurality return values: eq - the strings are equal p:s - word1 is the plural of word2 s:p - word2 is the plural of word1 p:p - word1 and word2 are two different plural forms of the one word False - otherwise >>> compare = engine().compare >>> compare("egg", "eggs") 's:p' >>> compare('egg', 'egg') 'eq' Words should not be empty. >>> compare('egg', '') Traceback (most recent call last): ... typeguard.TypeCheckError:...is not an instance of inflect.Word c3FK|]}|VdSr:)_plequal)r;normr4rrs rr=z!engine.compare.. s3GG4==t44GGGGGGrNF)rrrnextfilter)r4rrnormsresultss``` rcomparezengine.compare sT2 $"2DOCGGGGGGGGGF4))5111rc:||||jS)az compare word1 and word2 for equality regardless of plurality word1 and word2 are to be treated as nouns return values: eq - the strings are equal p:s - word1 is the plural of word2 s:p - word2 is the plural of word1 p:p - word1 and word2 are two different plural forms of the one word False - otherwise )rrr4rrs r compare_nounszengine.compare_nouns }}UE4+;<<>> p = engine() >>> p.singular_noun('horses') 'horse' >>> p.singular_noun('knights') 'knight' Returns False when a singular noun is passed. >>> p.singular_noun('horse') False >>> p.singular_noun('knight') False >>> p.singular_noun('soldier') False rrF)r_sinounr) r4rrrrrrrrYs rrzengine.singular_noun s}B--d33T4 K||Df|== u  %%dD11F)6)4)) )urcb|j}t|_||krdS|||krdS|||krdSt|_|||krdS|||krdS||_||jks ||jkr0|||rdS|||rdS||jks ||jkr|||rdSdS)Neqzp:szs:pzp:pF) rIrrrrYr_pl_check_plurals_Nr_pl_check_plurals_adj)r4rrrclassvals rrzengine._plequal sK&++--+0022 E>>4 BBuII  5 2e99  5*//11 BBuII  5 2e99  5&mmoo   d&6 6 6''u55 u''u55 u   do 5 5))%77 uurpairstemsend1end2rNc jd|d|d|d|d|d }ttj||S)Nr,z)(z\|\1r8r0)rNrsr)r4rrrrrks r_pl_reg_pluralszengine._pl_reg_plurals+ sLBuBBBB$BBBB4BBBBIgt,,---rc0tddftddftddftddftd d ft d d ft d d ftdd ftddftddftdd ftddfddddf}tt||f}dd|DtvpQt"vp6t$vpt'fd|DS)Nasrrrr,rensrumsrrronsosexesrixesr%)z.*eaur,x)z.*ieur,r )z.*trixesces)z .{2,}[yia]nr gesr8c3$K|] }|jV dSr:)r0)r;rs rr=z-engine._pl_check_plurals_N..D s$44d 444444rc3PK|] \}}}|||V!dSr:)r)r;rrrrr4s rr=z-engine._pl_check_plurals_N..J sQ%E4$$T5$==r) pl_sb_C_a_atapl_sb_C_is_ides pl_sb_C_a_aepl_sb_C_en_ina pl_sb_C_um_a pl_sb_C_us_i pl_sb_C_on_apl_sb_C_o_i_stemspl_sb_C_ex_icespl_sb_C_ix_ices pl_sb_C_i pl_sb_C_immapr-r>pl_sb_irregular_svaluespl_sb_irregularpl_sb_irregular_capsany)r4rr stem_endingsr5rs` @rrzengine._pl_check_plurals_N/ sR D% ( dF + 3 $ UE * 5# & 63 ' 5# & c * ff - ff - S ! d #   # )! &EE5>**xx44e44444 %,,.. . --/// +22444 )5  rcf|dr|d|dnd}|dr|d|dnd}t|o:t|o+|||p|||S)N)z's'r%r)endswithrfindrNr)r4rrword1aword2as rrzengine._pl_check_plurals_adjP s.3nn[.I.IQ)S)))**r.3nn[.I.IQ)S)))**r LL V  ((88<++FF;;  rOptional[Union[str, int]]Union[str, int]c||j|j}|Pt|tvs5|jdr*t|t vrdnd}nd}|S)Nr rrr)rJr- pl_count_onerIr2 pl_count_zero)r4rs r get_countzengine.get_count] s~ =T2>)E  ZZ<//+F30 JJ,,..-??  EE rc||}|dkr|S|||j}||S|dkr|St|}|jt vr3t|jdkr| |dp|S|S|tvr|St D]\}}|j | d|vr|cS|jdr"|jtvr|St |}|rY|ddkr@||dd|dSd|j vs d|j vrt(|}|r|ddkr|ddkrh||dd|d||dSt|jdkr| |d}||St*|j }|rKt|d }||d|||dSt|jdkrO|jd d kr>d ||jg|jddzSt1jt45||j t9j|jdd cdddS#1swxYwYt< D]\}}|j | d|vrt> D]\} } |j d| | vrj|j |j d| |j | dgkr0|j d| tB|j | dzccS tD|j S#tF$rYnwxYw tB|j S#tF$rYnwxYw|jtHvr3t|j} |d| tH|jS|j} | tJvr)t| } |d| tJ| S|j d } d | d dtLvrqtd | d d} |d| tLd | d dS|j dddkr |dddS|j dddkr|jdr|dS|dddS|j dddkrxtN D]\}}|j | d|vr|dcStP D]\}}|| d|vr|dcS|dddS|j dddkr |dddS|j dddkrDtR*t|}|r|j |vr |dddS|dS|j dddkr |ddd S|j ddd!kr |ddd"S|j ddd#kr |ddd$S|j ddd%kr |ddd&S|j d'krd(S|j ddd)kr|S|j ddd*kr |dd d+S|j ddd,vr |dd d-Sd.tVddfd/tXd d0fd/tZd d0fd1t\d d+fdt^d d2fd3t`d d+fd+tbdd4ffD]U\}}}}|j d|kr=| D](\}}|j | d|vr|d||zccS)V|jd5r|j ddd6kr |ddd7S|j ddd8vr|d/S|j ddd9vr t|d:kr |ddd;Sd3tdd dfd?tvdd2fd3txd d+ff D]U\}}}}|j d|kr=| D](\}}|j | d|vr|d||zccS)Vtzdd2ft|dd@ffD]C\}}}| D](\}}|j | d|vr|d||zccS)D| t~vr|d-St D]\}}|j | d|vr|d-cS|j d dd-kr)|dA|dAAkr|d-S|j ddBkrPt D]\}}|j | d|vr|d-cS|j d ddBkr|dCS|j d ddDkr8t D]\}}|j | d|vr|dcS|j d ddEvs|j dd/kr|d-S|j dddFvr |dddGS|j dddHkr |j dddIkr |dddGS|j dddJvr |dd dGS|j dddKkr |dddGS|j ddLkr}|j d ddMvst|dkr|dS|jdNr:|j ddLkr)|dA|dAAkr|dS|dddS| tvr|dSt D]\}}|j | d|vr|dcS|j d ddOvr|dS|j dd?kr|d-S|dS)PNrrrrrrz a z-a- denominatorrdegreer-quyrBiespersonrr,oplemanmenmousemicer(r*goosegeesetoothteethfootfeettacotacosdiedicecepszoonr)cissisxisrhr rmrrrrtrixr )eauieu)ynxinxanxrrrtadesor%rzzesze)chshzzr)elfalfolfveseafd)nifelifewifearfr&aeiour)aoeoiooouo)Fr/rrLr-r0r2pl_sb_uninflected_completerFr/_handle_long_compoundspl_sb_uninflected_capspl_sb_uninflected_bysizerr.rIpl_sb_uninflected_herdPL_SB_POSTFIX_ADJ_STEMS_RErrrPL_SB_PREP_DUAL_COMPOUND_RE DENOMINATORr>r contextlibsuppressr_handle_prepositional_phrase functoolspartialpl_pron_acc_keys_bysizepl_prep_bysizer3 pl_pron_acc pl_pron_nomrr!r pl_sb_irregular_compoundpl_sb_U_man_mans_bysizepl_sb_U_man_mans_caps_bysizepl_sb_U_louse_lice_bysizegetpl_sb_U_ch_chs_bysizepl_sb_U_ex_ices_bysizepl_sb_U_ix_ices_bysizepl_sb_U_um_a_bysizepl_sb_U_us_i_bysizepl_sb_U_on_a_bysizepl_sb_U_a_ae_bysizepl_sb_C_en_ina_bysizepl_sb_C_ex_ices_bysizepl_sb_C_ix_ices_bysizepl_sb_C_um_a_bysizepl_sb_C_us_i_bysizepl_sb_C_us_us_bysizepl_sb_C_a_ae_bysizepl_sb_C_a_ata_bysizepl_sb_C_is_ides_bysizepl_sb_C_o_i_bysizepl_sb_C_on_a_bysizepl_sb_C_i_bysizepl_sb_C_im_bysizepl_sb_singular_s_completepl_sb_singular_s_bysizerpl_sb_z_zes_bysizepl_sb_ze_zes_bysizepl_sb_U_o_os_completepl_sb_U_o_os_bysize)r4rrrrrr handled_wordsrpkpvllen lowered_last dash_splitlastletrfnumendrs rrzengine._plnounr su%% A::K dD$;<<  L 2::KT{{ 9??   : : :4;1$$224q2AAITIK ) ) )K,2244  DAq|QBCC A%% &  v & 49??+<+<@V+V+VK( . .t 4 4  B"((1++##ll288A;;22ABHHQKKAA A DL ET\$9$9,33D99B bhhqkkR''BHHQKK2,=,=||BHHQKK333xx{{3||BHHQKK0033 t{  q  77A7FFM($$   - -  A//00Ell4<00@$uvv,@@ @ t{  q T[_%@%@88T\\$*556QRRHII I   , ,  44 !$,a888                ,1133 V VDAq|QBCC A%%,2244VVFB|CRC(B..<--// L"- L!-4 $(<!#4{4>D6TE6lE$8$CEE Ey(( ? * *|$$D6TE6lCOL$ACC C\'',, HHZ_ % % , , . .2J J JBCC))D$<S+SXXjo-F-F,M,M,O,OPSS  <  % %3B3i$$$ $ <  ( ("9- *zzz!ss))))) <  % %/5577 & &1<$))":::%%%*4::<< & &19>>":::%%%"3B3i$$$ $ <  ' '3B3i%%% % <  ' ')--c$ii88A *T\Q&&ss))))):::  <  ' '3B3i&&& & <  ' '3B3i&&& & <  & &3B3i%%% % <  & &3B3i&&& & <5 6 <  & &K <  & &3B3i??? " <  5 5 53B3i### #'s 3 ("f 5 ("f 5 %r3 / %r3 / %r3 / %tS 1) 4 4 $GQ|B7**GGII44DAq|QBCC(A--#GVG}t333333.  y ) 4|BCC F**ss)((((|BCC N22zzz!|BCC $999c$ii!mmss)((((+R7,b&9,b&9)2s3)2s3*D"5)45*D$7,b%8("c2)2s3 - 8 8(FD<#w.. ! 881<,11#'=4#7777772"4-"D$/$ 4 464GGII44DAq|QBCC(A--#GVG}t333333.4 4 4 4;;; +1133 # #DAq|QBCC A%%{{{"""& <  $ $aDGMMOO)C)C;;;  < s " "*0022 ' '1<$))";;;&&&*|BrE"c))|||# <  $ $+1133 & &1<$))":::%%%* <  8 8 8DL > >:::  < s " ";;; zzzs625N44N8;N8 R R*)R*.S S  S c||}t|dkrtd||t}|||dz p ||dz }d|d|dz ||||dggzd||dzdzS)a Given a word or phrase possibly separated by sep, parse out the prepositional phrase and apply the transform to the word preceding the prepositional phrase. Raise ValueError if the pivot is not found or if at least two separators are not found. >>> engine._handle_prepositional_phrase("man-of-war", str.upper, '-') 'MAN-of-war' >>> engine._handle_prepositional_phrase("man of war", str.upper, ' ') 'MAN of war' rz2Cannot handle words with fewer than two separatorsrrNr)r3rFr _find_pivotpl_prep_list_dar>)clsphrase transformseppartspivot transformeds rr{z#engine._handle_prepositional_phrase s S!! u::>>QRR R77ieai 011EU5195E xx +EAI+ #((Kur+J"K"K!L L  HHUEAI==) * *+ +rr-Union[str, None]cdkr|jn|jfdt|jdD}t |dS)aS Handles the plural and singular for compound `Words` that have three or more words, based on the given count. >>> engine()._handle_long_compounds(Words("pair of scissors"), 2) 'pairs of scissors' >>> engine()._handle_long_compounds(Words("men beyond hills"), 1) 'man beyond hills' rc 3K|]I\}\}}}|tvdtj|||g|VJdSrN)rr> itertoolschain)r;leadercandpreptrailerr inflections rr=z0engine._handle_long_compounds.. s   . tg&& HHZe,,d3  '&&&   rrN)rrrr/r)r4rr solutionsrs ` @rrrzengine._handle_long_compounds sj&+aZZT\\T\       2C4;PQ1R1R    It$$$rcfdtdtdz D} t|S#t$rt ddwxYw)Nc30K|]}|v |VdSr:r)r;r candidatesr5s rr=z%engine._find_pivot.. s:  5<:;U;UE;U;U;U;U  rrzNo pivot found)r~rFr StopIterationr)r5rpivotss`` rrzengine._find_pivot s     $QE Q77    9<<  9 9 9-..D 8 9s AAc|jdr*t|tvrdS||}|dkr|S|||j}||S t|}n#t$rYdSwxYw|j tvr0t|j |t|j dS|j tvr|S|j drO|j ddtvr9t|j ddd|t|j dS|j dr|St|}|rdSt |rdS|jdkrdS|jddd vs|jddd kr |dd S|jddd kr%t|d kr|jdddzS|jt&vs,|jddt(vs|jddt*vr |ddS|j dr"t|d kr|jdd St,|}|r|dSdS)Nr Frzn'tr5quizzesquizr:)chessheszzesssesr rr7rr&r>rBoes)rIr-r2r.r/rrMr- IndexErrorrplverb_irregular_presrFplverb_irregular_non_presr&PLVERB_SPECIAL_S_REr WHITESPACEr.r0 pl_v_oes_oepl_v_oes_oe_endings_size4pl_v_oes_oe_endings_size5 ENDS_WITH_Sr)r4rrrr5rs rrzengine._pl_special_verb s  v & 3u::+;+;+=+=+N+N5u%% A::K dD$:;;  L $KKEE   55  ;/ / /+EK8U%EK@P@P@R@R:SUU U ;3 3 3K ;   & & 5;ss+;?T+T+T(SbS)9://U[))++,//  ;   & & K! ' ' - -  5   T " " 5 =I % %6 M"## "B B B}RSS!U**":  =  & &3u::>>="%+ + J    + - -}RSS!%>>>}RSS!%>>>":  = ! !% ( ( &SZZ!^^="% %    & &  88A;; us5B BBcF||}|dkr|St|}|rIt|d|dSt |}|r|S|S)Nrr)r/plverb_ambiguous_pres_keysrplverb_ambiguous_presrr2plverb_ambiguous_non_pres)r4rrrs rrzengine._pl_general_verb! su%% A::K( . .t 4 4  P+BHHQKK,=,=,?,?@O"((1++OO O' - -d 3 3  K rcl||}|dkr|S|||j}||St|}|r2t |dSt|}|r2t|dSt|}|r?| |d}|ddkrdnd}|d|SdS)NrrBr,rr%F) r/rrNpl_adj_special_keysrpl_adj_specialrr2pl_adj_poss_keys pl_adj_possENDS_WITH_APOSTROPHE_Sr)r4rrrrr trailing_ss rrzengine._pl_special_adjective9 s*u%% A::K dD$<==  L! ' ' - -  7!"((1++"3"3"5"56 6 $ $T * *  4rxx{{00223 3 # * *4 0 0  (!!"((1++..B!"v}}#J'':'' 'urc(||}|dkr|S ||j}n|tvrtn!#tt f$r }t|d}~wwxYw|||j}||S|dkr|S|tvr |ddSt|}|j tvr3t|jdkr||dp|S|S|t vr|St"D]\}}|j| d|vr|cS|jdr"|j t*vr|S|j t,vr|jdr|nd St.|} | r[| ddkrB|| dd| | dSt7jt:5||jt?j |jd| d cdddS#1swxYwYt7jt:5||jt?j |jd| d cdddS#1swxYwYtBD]\}}|j| d|vrtDD]\} } |jd| | vrn|j#|jd| |j| dgkr4|jd| tId|j| d|zccS tId|j|S#tJ$rYnwxYw tId|j|S#tJ$rYnwxYw|j tLvr3t|j } |d| tL|j S|j tNvrWt|j } |d| tN|j S|j#d } d (| dd tRvrtd (| dd} d*|d| tRd (| dd S|jdddkr |dddzS|jdddkr |ddS|jdddkr |dddzS|jdddkrutVD]#\}}|j| d|vr |ddcS$tXD]\}}|| d|vr |ddcS|jdddkr |dddzS|jdddkr |ddd zS|jddd!kr?tZ.t|}|r|j|vr |ddd"zS|jddd#kr |ddd$zS|jddd%kr |ddd&zS|jddd'kr |ddd(zS|jd)krd*S|jddd+kr|S|jddd,kr |ddd-zSd.t^ddfd.t`dd/fd.tbdd0fd1tddd2fd3tfdd4fd1thdd-fd5tjddffD]U\}}}}|jd|kr=|D](\}}|j| d|vr|d||zccS)V|jdrF|jddd6kr |ddd7zS|jddd8vr |ddS|jddd9vr t|d:kr |ddd7zSd1tldd;fd.tndd/fd.tpdd0fd1trdd2fd3ttdd4fd.tvddfd5txddfd1tzddfd.t|dd.fd3t~ddks)|tvs |j tvr |ddS|tvs |j tvr |ddS|jddd?ks)|tvs |j tvr |ddS|tvs |j tvr |ddS|j tvr |ddStD]#\}}|j| d|vr |ddcS$|jddd@kr.|dA|dAMkr |ddS|j tvr |ddS|j tvr |ddS|jdddBkr |ddS|tvs |j tvr |ddS|jdddCvr |ddS|j tvr |ddS|jdddDkr |ddS|tvs |j tvr |ddS|jdddEkr|jdddFvr |dddGzS|jdddHkr|dddIkr |dddGzS|jdddJvr |dddKzS|jdddLkr |dddGzS|jdddMkrt|jdkr|jddNvr |ddS|jdOrA|jdddMkr.|dA|dAMkr |ddS|jdddPkr |dddzS|jdddQkr|j tvr |ddStD]#\}}|j| d|vr |ddcS$|jdddRvr |ddS|jdddSkr |ddS|tvr |dddTzS|jdd.kr |ddSd S)UNrrrBrrr1rrF)rrrr4rrrz{}{}r>quiesr5r&irr8peopler:rsonmansr=r<r@r?r*r(rBrArDrCrFrErJrIrKzoaonr,exixrumrrrtricesr )eauxieux)yngesingesangesrenrZrQhousesresesrr)rrr rd)elalolfearf)niliwifearysrkrr7r)aoseosiosoosuosrr)Xr/rQrr+rrrrOsi_sb_ois_oi_caser-r0r2rqrFr/rrrsrtrr.rIru pl_sb_C_us_usrvrrrryrzrr{r|r}si_pron_acc_keys_bysizerr3rrsi_sb_irregular_capssi_sb_irregularr>si_sb_irregular_compoundformatsi_sb_U_man_mans_bysizesi_sb_U_man_mans_caps_bysizesi_sb_U_louse_lice_bysizersi_sb_U_ch_chs_bysizesi_sb_U_ex_ices_bysizesi_sb_U_ix_ices_bysizesi_sb_U_um_a_bysizesi_sb_U_us_i_bysizesi_sb_U_on_a_bysizesi_sb_U_a_ae_bysizesi_sb_C_en_ina_bysizesi_sb_C_ex_ices_bysizesi_sb_C_ix_ices_bysizesi_sb_C_um_a_bysizesi_sb_C_us_i_bysizersi_sb_C_a_ae_bysizesi_sb_C_a_ata_bysizesi_sb_C_is_ides_bysizesi_sb_C_o_i_bysizesi_sb_C_on_a_bysizesi_sb_C_im_bysizesi_sb_C_i_bysizesi_sb_uses_use_casesi_sb_uses_usesi_sb_ies_ie_case si_sb_ies_iesi_sb_oes_oe_case si_sb_oes_oesi_sb_sses_sse_casesi_sb_sses_ssesi_sb_singular_s_completesi_sb_singular_s_bysizer si_sb_z_zes si_sb_zzes_zzsi_sb_ches_che_casesi_sb_ches_che si_sb_xes_xesi_sb_ves_ve_case si_sb_ves_vesi_sb_U_o_os_completesi_sb_U_o_os_bysize si_sb_es_is)r4rrrrvrr5rrrrrrrrrf unass_numendr class_numends rrzengine._sinoun^ sC u%% A::K *~777$$:& * * * c ) *  dD$;<<  L 2::K $ $ $9 d  :    !; ; ;5<  A%%2252BBJdJK ) ) )K,2244  DAq}aRSS!Q&& '  v & 5:+;+;+=+=AW+W+WK :     . ..y9D44u D( . .t 4 4  Q"((1++##ll288A;;&lAAP288A;;PP P   , ,  44 !$,aGGG                  , ,  44 !$,aGGG                ,1133  DAq}aRSS!Q&&,2244  FB}SbS)R// =..00!M#2#.!M1"##.5 $)=1"#5 %u}aRSS'9699$ uemV<< <    D  uemV<< <    D  :- - -uz??D6TE6lF$8$DFF F :     0 0uz''))**D6TE6lIOEJ4D4D4F4F$GII I]((-- HHZ_ % % , , . .2J J JBCC))D==VteV (#((:bcc?*C*C)J)J)L)LM  =  ( (9s? " =  * *9  =  ) )9v% % =  ' '/5577 % %1=!%**9$$$+4::<< % %19>>9$$$" =  & &9u$ $ =  ' '9w& & =  ' ')--c$ii88A +U]a''CRCy7** =  ( (9w& & =  ( (9w& & =  ' '9v% % =F " "5 =  ' 'K =  & &9t# #'R 0 ("d 3 ("d 3 %r4 0 %r4 0 %r4 0 %r2 ./ : : *GQ d}R G++GGII::DAq}aRSS)Q..#M\M2T999999/  y ) >}RSS!X--CRCy3&}RSS!%555CRCy }RSS!%@@@SYYQR]]CRCy3&+R6,b$7,b$7)2t4)2t4*D"5)2r2*B3,b#6("c2)2t4'R0&B/3 > >.L$=$// ! >>1 =!-22#'  #6#======3 M"## ( * ****z!!^339  $ $ $ (8(8(:(:l(J(J9  M"## ' ) )(((z!!\119  & & &%**:*:*<*<*N*N9  :    !: : :9 +1133 ! !DAq}aRSS!Q&&CRCy   ' =  ' 'DGtAw}},F,F9  :     , ,9  :     . .9  =  ' '9  & & &%**:*:*<*<*N*N9  = !1 1 19  :     - -9  =  & &9  $ $ $ (8(8(:(:l(J(J9  =  & &}RU#'999CRCy3&}RU#t++RU s0B0BCRCy3&}RU#'999CRCy4''}RU#t++CRCy3& =  % %5=!!A%%%-*;w*F*FCRCy "7+ %=%--$q'T!W]]__2L2L9$ =  & &9s? " =  % %z!!%:::CRCy +1133 % %1=!%**9$$$+}RSS!%HHHCRCy =  & &9  ;  9t# # =  # #9 us]:A AA'6I**I.1I.6KKK,O OOO)) O65O6rct|}|ra|d}|s|S|d}|d}|||}|||SdS)a Return the appropriate indefinite article followed by text. The indefinite article is either 'a' or 'an'. If count is not one, then return count followed by text instead of 'a' or 'an'. Whitespace at the start and end is preserved. rrrr)INDEFINITE_ARTICLE_TESTrr_indef_article)r4rrrrrrrs rrzengine.a s% + +D 1 1  *88A;;D  ((1++C88A;;D((u55F)6)4)) )rrrrUnion[int, str, Any]c||}|dkr|dS||j}||dSfd|jD}d}t ||S)Nrrc3VK|]#\}}||dV$dSr)r)r;regexenarticlers rr=z(engine._indef_article.. s[   ~~d##           rza )r/rrP_indef_article_casesr)r4rrmycountrmatchesfallbacks ` rr8zengine._indef_article s..'' a<<$$d$$ $ dD$9::  $$d$$ $    $($=   ;;GX&&&rOptional[Union[int, str]]c||j|j}|d}t|}|r@|d}|d}|d}nd}d}d}t |t vrd}||d||||S) a If count is 0, no, zero or nil, return 'no' followed by the plural of text. If count is one of: 1, a, an, one, each, every, this, that return count followed by text. Otherwise return count follow by the plural of text. In the return value count is always followed by a space. Whitespace at the start and end is preserved. Nrrrrrrr)rJrrrr-r2r.rY)r4rrrrrrs rrz engine.no s" =T2>)E =E  " "4 ( (  ((1++C88A;;D88A;;DDCDD u::     . .E?u??t{{477????rc||d}|}tD]'\}}|||\}}|r|dcS(|dS)zi Return the present participle for word. word is the 3rd person singular verb. ring)rPRESENT_PARTICIPLE_REPLACEMENTSsubn)r4rplvansr<replrs rrzengine.present_participlesstQ''< # #MGT||D#..HC #{{{""" #{{{rrUnion[Number, Word]cXtt|rt|tt fr#t ||krt |}nxdt|vrX t t|d}nC#t $r't t|dd}YnwxYwt |} t|dz}n #t$rt|dz}YnwxYw||S| |S)z Return the ordinal of num. >>> ordinal = engine().ordinal >>> ordinal(1) '1st' >>> ordinal('one') 'first' .rBNd ) DIGITrtr-r?floatrZrnthr_sub_ord)r4rrrs rrzengine.ordinal/s% ;;s3xx  &#s|,, !SSHH#c((??/ C --%///C" ../CA #1s7| # # #1r6{ #>4>> !==%% %s$9"B.C  C  C11D Drindc`|ttdz krtt|Sr>)rFmillr%)r4rTs rmillfnz engine.millfnPs' TQ  $ $CyrunitsmindexcJt|||Sr:)unitrW)r4rXrYs runitfnz engine.unitfnUs#u+4t{{622444rc|dkrBt|}|r|rd}nd}t|}||}||||St|t|S)Nrr4r)rr[rWteenrV)r4tensrXrY tens_parthyphen unit_part mill_parts rtenfnz engine.tenfnXs} 199D I  U I F++I???I?? ?u+-tF|---rhundredsr_c|rU|s|rd|jddnd}t|d||||||dS|s|r.|||||dSdS)Nrandwordrz hundred, )rUr[rdrW)r4rer_rXrYrgs rhundfnz engine.hundfnds  =ARUR9$+I69999PRG>DD7D::dE**D,0KK,?,?DDD   G5 Gjju--Ft{{6/B/BFFF Frrct|d}|dkrd|jddS|rt|dSd|jddS)Nrrrrhr )rZrrUr[r4rrXs r group1subzengine.group1subpsoBHHQKK   A::3t(/333 3  55k%%% %4t(0444 4rct|d}|rt|dSd|jddS)Nrrhrr )rZrr[rUrks r group1bsubzengine.group1bsubysMBHHQKK    55k%%% %4t(0444 4rc@t|d}t|d}|r|||dS|rd|jddt|dSd|jdd|jddS)Nrrrhrr )rZrrdrUr[)r4rr_rXs r group2subzengine.group2subs288A;;BHHQKK    2jju--111 1  CBt(0BB4;BBB BL4$V,LLt/@/HLLLLrct|d}t|d}t|d}|dkrd|jd}n-|rtt|}nd|jd}|r|||}n?|rd|jddt|}nd|jdd|jd}|d|dS)Nrrrrrr rh)rZrrUr-r[rd)r4rrer_rXhunwordtenwords r group3subzengine.group3subsrxx{{##288A;;BHHQKK   q==4$+E244GG  6$x.))GG5$+F355G  Rjju--GG  RC$+F3CCd5kCCGGQ$+F3QQd6G6OQQG''G''''rc  |t|dt|dt|d|j}|xjdz c_|S)Nrrr)rirZrrK)r4rrets rhundsubzengine.hundsubsmkk   c"((1++..BHHQKK0@0@$/   1 rc|t|dt|d|jdS)Nrrrh)rdrZrrKr4rs rtensubz engine.tensubsG**S!--s288A;;/?/?QQUUUUrc~|t|d|jdS)Nrrh)r\rZrrKrys runitsubzengine.unitsubs3++c"((1++..@@DDDDrrc|dkr"t|j|}n|dkrCt|j|}t|j|d}nu|dkrdt |j|}t|j|d}t|j|d}n t|dkr|j d}nt|dkr|j d}n| d}d|_ t |}|r=t|j|d}t |}|=t|j|d}t"|j|d}|S)Nrrrrr rr) DIGIT_GROUPrrl TWO_DIGITSrprn THREE_DIGITSrtrZrUlstriprKTHREE_DIGITS_WORDrrwTWO_DIGITS_WORDrzONE_DIGIT_WORDr|)r4rrrs renwordz engine.enwords A:://$.#66CC aZZ..55C//$/3::CC aZZ""4>377C..a88C//$.#q99CC XX]]#F+CC XX]]#E*CC**,,%%c**CDO"))#..B 3'++DL#qAA&--c22 3"%%dk3::C $$T\3::C rcRtd|}|d||kzzS)NcBt|dSr>)rr)rts rrz!engine._sub_ord..sWU[[^^-Drr) ordinal_suffr)r*news rrSzengine._sub_ords/DDcJJTSCZ(((rcx|r!|dkrdnd}|d|}n|g}||S)NrrBrrM)r3_remove_last_blank)rrdecimalr max_splitchunkss r _chunk_numzengine._chunk_numsK  #qjjaIYYsI..FFUF%%f---rc>|ddk}|r |ddn|}||fS)z Remove the last item from chunks if it's a blank string. Return the resultant chunks and whether the last item was removed. rBrNr)rremovedrs rrzengine._remove_last_blanks2*" '3Vwrcdddd|ddS)Nplusminus)+r4rr)rr)rs r _get_signzengine._get_signs,'**..szz||ACCCrF,andr rpointwantlistcommaUnion[Falsish, str]rgr thresholdUnion[str, List[str]]c ||d_t|}| t|| kr|dd} |r0td| d\| d<} | dkrn|0 | dd| dS#t $rt| dcYSwxYwdksdkrt|} |tvr|}|ddtv} | r |dd} ||\}}|dd k}| fd }t|||d||d<g}dkr|d|d }| r |r |d |d <|ddD]B}| ||||d C|r| ||r| gt| z|zS| r| d nd }rd |n)d |||}||zS)a Return a number in words. group = 1, 2 or 3 to group numbers before turning into words comma: define comma andword: word for 'and'. Can be set to ''. e.g. "one hundred and one" vs "one hundred one" zero: word for '0' one: word for '1' decimal: word for decimal point threshold: numbers above threshold not turned into words parameters not remembered from last call. Departure from Perl version. )rgr rNrMrz\1,\2rrrrctd|}|dkrd}dkrs|d}n|}|dddkr |dd}td|}dkr!rtdd |}t d|}|}rd|S) Nrrrrrrhrrz \1) NON_DIGITrrWHITESPACES_COMMA COMMA_WORD WHITESPACESstrip)chunkrgrrr4s r _handle_chunkz-engine.number_to_words.._handle_chunk sMM"e,,E{{zz%z E1-- E511RSSzT!!crc %))#u55Ezzez"'87'8'8'8%@@OOC//EKKMME LrrrBrh)rUr-rQr3FOUR_DIGIT_COMMArGrr#rnth_suffrrrSappendr^rNr>_render)r4rrrrrgr rrrspnumrsignmyordr finalpoint loopstartr numchunksrsignoutvaloutrs` ` ` @rrzengine.number_to_wordss<)0cJJ#hh  U3ZZ)%;%;IIc1%%E  0 5 5ha I I q166  %(//U1X/// % % %58}}$$$ % 199 ( (~~c"" (??CBCCH$  crc(C!__S'5AA 1IO !*]        4!yzz0BCCyzz A::q 5 44I  9Y 9 MM)B-88IbMABBZ 7 7E   W % % %   U[[E55 6 6 6 6  &   W % % %  36DJJ&2 2 $,T****" BDIIi i%@@AA  s=BB21B2c#K|d}|V|dup|| }|D]}||krd}n|r|Vd|VdS)NrFr)popr&)rrr first_itemrncs rrzengine._renderUsZZ]] 4Cz':':7'C'C#C  BW}}  b((NNNN   rTr5Optional[Sequence[Word]]r sep_spaced final_sepconj conj_spacedc`|sdSt|dkr|dS|r|dkrd}nd|d}t|dkr|d||dS|dd|vrd}nd}||}||}|r|dz }||dd ||d S) a Join words into a list. e.g. join(['ant', 'bee', 'fly']) returns 'ant, bee, and fly' options: conj: replacement for 'and' sep: separator. default ',', unless ',' is in the list then ';' final_sep: final separator. default ',', unless ',' is in the list then ';' conj_spaced: boolean. Should conj have spaces around it rrrrrNr;rB)rFr>)r4r5rrrrrs rr>z engine.joinas, 2 u::??8O  #rzz"4{{{ u::??Ah00eAh00 0 ;bggenn$$  I ($((   3JC((52;''??E"I???rr7)rWrXrYrXr.rZ)rarXrbrXrcrXrdrXrerXrfrXr.rZ)rkrXr.rZ)rkrXr.r%)rrBrxryr.rz)NN)rr4rr4r.r-)rr-r.r%)rr rrr.r-)rrBr.r-)r5r-r.r-)rr-r.rr:)rrBrrr.r-)rrBrrBr.r)rrBrrrrzr.r)rr-rr-r.r) rr-rr-rr-rr-r.rN)rr-rr-r.rN)rr*r.r+)rr-rr*r.r-)rr-rrZr.r)rr-rr*r.r)rr-rr*rrzr.r)r)rrBrrr.r-)rr-rr9r.r-)rrBrrBr.r-)rrBr.r-)rrKr.r-)r)rTrZr.r-)rXrZrYrZr.r-r.r-) rerZr_rZrXrZrYrZr.r-)rr r.r-)rr-rrZr.r-)Frrrr rrN)rrKrrNrrZrrrgr-r r-rr-rrrr4r.r)NTNrT)r5rrrzrrNrrzrr-rrNr.r-)]rrrr6propertyrUsetterrr`rhrjrorqr\r]rrrrrrrrrrYrrrrrrrrrrrrr/r classmethodr{rr staticmethodrrrrrrr A_ordinal_a A_ordinal_an A_explicit_an SPECIAL_AN SPECIAL_AA_abbrevSPECIAL_ABBREV_ANSPECIAL_ABBREV_A CONSONANTSARTICLE_SPECIAL_EUARTICLE_SPECIAL_ONCEARTICLE_SPECIAL_ONETIMEARTICLE_SPECIAL_UNITARTICLE_SPECIAL_UBAARTICLE_SPECIAL_UKR A_explicit_aSPECIAL_CAPITALSVOWELSA_y_consr>r8rrrrWr\rdrirlrnrprtrwrzr|rrSrrrrrr>rrrrFrFs < < < <88X8!!!   [ [0[[[ ? ? ? ?    [  0 0 0 0FBF,!!!!";;;,????@###[#N    <&&&&[&.BF&&&&[&(BF&&&&[&.BF&&&&[&(222[28 = = =[ = = = =[ = < < <[ <15 $ ''''['R4....    B     ,=A_____B ++[+2%%%%099\9=APPPPPf=A2=A"""""P,0 $ CCCCCN [. B c t  T C 4 D! 3 S S! s# #& s# c" c" s 3  49>''''0!@!@!@!@[!@J[$&&&[&@ 55555 . . . . .    55555555MMMM(((($VVVVEEEE:))\)..[.\DD\D%('.#'p p p p [p d  \ "#' 0@0@0@0@[0@0@0@rrF)r,r-r.r-)rN)r3r4r5r6r.r-)r5r@r.rAr )rJr@rKr-rLr4rMrNr(=rC __future__rrrCryr|rrsnumbersrtypingrrrrr r r r r rrrrmore_itertoolsr typeguardr compat.py38r Exceptionrr!r#r%r'r)r+r2r?rIrVrr updater!rrrlistrr3k1k2rrpl_sb_z_zes_listrpl_sb_ze_zes_listrpl_sb_C_is_ides_completepl_sb_C_is_ides_endingsrpl_sb_C_is_ides_listsi_sb_C_is_ides_listrrpl_sb_C_a_ata_listsi_sb_C_a_ata_listrrrpl_sb_U_a_ae_listsi_sb_U_a_ae_listrr pl_sb_U_a_aepl_sb_C_a_ae_listsi_sb_C_a_ae_listrrrpl_sb_C_en_ina_listsi_sb_C_en_ina_listrrrpl_sb_U_um_a_listsi_sb_U_um_a_listrr pl_sb_U_um_apl_sb_C_um_a_listsi_sb_C_um_a_listrrrpl_sb_U_us_i_listsi_sb_U_us_i_listrr pl_sb_U_us_ipl_sb_C_us_i_listsi_sb_C_us_i_listrrrrrpl_sb_U_on_a_listsi_sb_U_on_a_listrr pl_sb_U_on_apl_sb_C_on_a_listsi_sb_C_on_a_listrrr pl_sb_C_o_irrrrr1pl_sb_U_o_os_endingsrr2pl_sb_U_ch_chs_listsi_sb_U_ch_chs_listr rpl_sb_U_ch_chspl_sb_U_ex_ices_listsi_sb_U_ex_ices_listrrpl_sb_U_ex_icespl_sb_U_ix_ices_listsi_sb_U_ix_ices_listrrpl_sb_U_ix_icespl_sb_C_ex_ices_listsi_sb_C_ex_ices_listrrrpl_sb_C_ix_ices_listsi_sb_C_ix_ices_listrrrpl_sb_C_i_listsi_sb_C_i_listrrrpl_sb_C_im_listsi_sb_C_im_listrrrpl_sb_U_man_mans_listpl_sb_U_man_mans_caps_listsi_sb_U_man_mans_listr rsi_sb_U_man_mans_caps_listr rpl_sb_U_louse_lice_listsi_sb_U_louse_lice_listr rpl_sb_uninflected_s_completepl_sb_uninflected_s_endingspl_sb_uninflected_srurqrspl_sb_uninflected_endingsrtrpl_sb_singular_s_endingsrr(si_sb_singular_s_endingsr)pl_sb_singular_s_esr>pl_sb_singular_srr r!r"r#r$r%r*r+r,r-r.r&r'r/r0plverb_special_s_pl_sb_postfix_adj_defnr+r8pl_sb_postfix_adj_stemsr3 pl_prep_listrrpl_preppl_sb_prep_dual_compoundrrrrpl_pron_acc_keysr~_thecase_plur_gend_singrsi_pron_acc_keysrrrrcompilerrrrrrrr.r-rrrrVERBOSErrrrrrrRrErrdictrrr[r^rrVrHrrstring_to_constantrrrrvrwrxrrrrr7rrrrrrrrrrrrrr~rrrrrrrrrrrFrPr-r-Falsish_STATIC_TYPE_CHECKINGrBtyper;rFrrrr4sK444l#"""""   -,,,,,!!!!!!""""""             y        Y                        Y        Y   @@@@@** !-!-!-!-!-N!       " Z" """% "  H "  L " N" N" " X" " &" ;" "$"  ^!""##""$ i%"& N'"( X)"* W+","-".-/"0-1"2z3"4 5"6-7"8 j9": Y;"< H=">z?"@ 6A"B iC""H()))    *+EF>>o&;&;&=&=>>> o  A axxB4CA4FFob1 A HH+?+E+E+G+GHHHPP/G/M/M/O/OPPP & ' '((A axxB $Q '  $'?'C %Q ' 'V,--f.//   ( #N#N6M#N#N#NN02II )61GGG  @'22  &T22  ,&T22  5(%33   &Q//  L&Q//   &Q//  ,&Q//   vm,,  &Q//  "&Q//     VK((V??;???@@HR--DCC@@*?@@@DDDHIDLf122fDD/CDDDEE 5(#t44  3 )6155 * )6155   )6155 %)6155  /BRBRCCC?!#3Y.FVFVT4GGC#%6  EGG    EGG *C%HHH  /duMMM   L ,faEJJJ ) ) ) Z  3661666B,!-!2:& ' ."6";<< !!!BC!H!$<*AA &!9::II/HIIIGG.FGGG &!9::"m7HH! 6 65 6 6 6 7  +R@]~H V$ && 9 .: C  7HH    $ ! ! " 2 1 1 2LMMN  ! ggg $$:Q$$$Achh'899@@@ C J016  !3!3!33(( '#((?++ , ,SSSS k 5     6 | &| & l F  F  W!" H#$ 8%& 8'( h) 0 3 3{0022 3 3 3=t       7388K0011 &--99[%6%6%8%8999&$0$0!HeUE@0*/% '' 000#%% */% '''0 7388GEN3344 &00           ! 5! E! W! g !  5 !  F ! 5! U! F! f! W! g! W! g! F!  V!!" F#!$            A!!!F(RZ?''#((011 2 2??? "'BJ7 E ,&+ H VWgNN bj/''#((>** + +///        2:FGGCHH[,A,A$B$BFFF VV 2: J    2:BBM R Rrz:BMJJ  7 rz2BMBB bj3R]CC               3szz||   $        rz5sxx0055566 TSS         $ ET5% 10-000 00-000 #UDAA :&&  /?? 233'RZ' #''')bj( $((("-bj<==  bj!;'7!;!;!;<< RZ   bj77 #L11$"*%F VV RZ+R] ; ; BJ,bm < < BJ5r}EE2:mR];; RZ r} 5 5 RZ 2=99!rz+r}==$"*]BMBB!rz"4bmDD bj!:BMJJ bj"-882:.// K / /bj!! RZ $ $ rz/** BJ788"*122,--2:455 BJu   BJw'' RZ ( ( bj  RZ 6 RZ x(RZ&!RZ C RZ  %(RZ V$RZ X&RZ h'RZRZ344mD#"  5 $ $ $ $ $C $ $ $ & / S<< =DDDDDDDDDDD/////////U@U@U@U@U@U@U@U@U@U@s\**!] ]