Ë †ÿö C2ܺãóð—dZddlmZddlZddlmZmZmZmZm Z ee Z ee e dfZ eee e fe e dffZee efZdZdZdZd!d „ZGd „d «ZGd „d e«ZGd„de«ZGd„de«ZGd„d«ZGd„d«ZGd„de«ZGd„de«ZdZeeeeefZeeeefZeeeefZ eeefZ!eeefZ"eefZ#eeeeeefZ$eeeeeeefZ%d"d„Z&d#d„Z'd$d„Z(d%d„Z)d&d„Z*d'd „Z+y)(zÛ This tool is for checking the security hardening options of the Linux kernel. SPDX-FileCopyrightText: Alexander Popov SPDX-License-Identifier: GPL-3.0-only This module is the engine of checks. é)Ú annotationsN)ÚUnionÚOptionalÚListÚDictÚTuple.zzzcóÒ—|�tjj«s|S|jd«rt}n"|jd«s Jd|›d�«‚t }|›|›t ›�S)NÚOKzFAIL:zunexpected result "Ú")ÚsysÚstdoutÚisattyÚ startswithÚ GREEN_COLORÚ RED_COLORÚ COLOR_END)Ú input_textÚcolors úD/usr/lib/python3.12/site-packages/kernel_hardening_checker/engine.pyÚcolorize_resultrsl€ØÐ¤§¡×!2Ñ!2Ô!4ØÐØ×јTÔ"܉à×$Ñ$ WÔ-ÐSÐ2EÀjÀ\ÐQRÐ0SÓSÐ-܈؈W�Z�L¤  Ð ,Ð,ócóF—eZdZdd„Zed d„«Zd d„Zd d„Zd d„Zd d„Z y)ÚOptCheckcót—|r?t|t«r/||j«k(rt|j ««dk(s!Jd|›d|j j ›�«‚||_|r?t|t«r/||j«k(rt|j ««dk(sJd|›d|›d�«‚||_|r?t|t«r/||j«k(rt|j ««dk(sJd|›d|›d�«‚||_ |r#t|t«r||j«k(sJd|›d|›d �«‚t|j ««}|d k(r|d vs9Jd|›d|›d �«‚|d k(r|dk(s!Jd|›d|›d�«‚|dk(sJd|›d|›d�«‚||_ d|_ d|_ y)Nézinvalid name "ú" for zinvalid decision "ú" for "ú" checkzinvalid reason "zinvalid expected value "z " check (1)é)ú is not setú is not offz " check (2)éú is presentz " check (3)z " check (4)) Ú isinstanceÚstrÚstripÚlenÚsplitÚ __class__Ú__name__ÚnameÚdecisionÚreasonÚexpectedÚstateÚresult)Úselfr-r,r+r.Úval_lens rÚ__init__zOptCheck.__init__)s€Ùœ  4¬Ô-Ø�t—z‘z“|Ò#¬¨D¯J©J«LÓ(9¸QÒ(>ð Fà ˜v V¨D¯N©N×,CÑ,CÐ+DÐEó Fð?ðˆŒ áœJ x´Ô5ؘ8Ÿ>™>Ó+Ò+´°H·N±NÓ4DÓ0EÈÒ0Jð Cà# H :¨W°T°F¸'ÐBó CðKð!ˆŒ áœ* V¬SÔ1ؘŸ™›Ò'¬C°· ± ³Ó,?À1Ò,Dð ?à! & ¨°°°gÐ>ó ?ðEðˆŒ áœJ x´Ô5¸(ÀhÇnÁnÓFVÒ:Vð MØ)¨(¨°7¸4¸&À ÐLó MÐVä�h—n‘nÓ&Ó'ˆØ �aŠ<ØÐ;Ñ;ð QØ-¨h¨Z°w¸t¸fÀKÐPó QÐ;à ˜Š\ؘ|Ò+ð QØ-¨h¨Z°w¸t¸fÀKÐPó QÐ+ð˜a’<ð QØ-¨h¨Z°w¸t¸fÀKÐPó Q�<à ˆŒ àˆŒ ؈� rcó—t‚©N©ÚNotImplementedError©r1s rÚopt_typezOptCheck.opt_typeJs€ä!Ð!rcóf—|�(t|t«sJd|›d|j›d�«‚||_y)Nzinvalid state "rr)r$r%r+r/©r1Údatas rÚ set_statezOptCheck.set_stateNs<€Øˆ|œz¨$´Ô4ð AØ    g¨d¯i©i¨[¸Ð@ó AÐ4àˆ� rcó~—|jjd«r¢|jjd«r‡|j€d|_y|jj d«}|jj d«j d«}||vrd|j›�|_yd|j›�|_y|jdk(r|j€d|_yd |_y|jd k(re|jd k(rd |_y|jd vrd|j›d�|_y|j€d|_yd|j›d�|_y|j|jk(rd|_y|j€|jdk(rd|_yd|_yd|j›d�|_y)NÚ*úFAIL: is not foundr Ú,úOK: in ú FAIL: not in r#úFAIL: is not presentúOK: is presentr!Úoffú FAIL: is off)Ú0r zFAIL: is off, "úFAIL: is off, not foundzOK: is not off, "r r úOK: is not foundúFAIL: ")r.rÚendswithr/r0r&r()r1ÚvalÚval_lists rÚcheckzOptCheck.checkSs£€ð �=‰=× #Ñ # CÔ (¨T¯]©]×-CÑ-CÀCÔ-HØ�z‰zÐ!Ø2�” ØØ—-‘-×%Ñ% cÓ*ˆCØ—z‘z×'Ñ'¨Ó,×2Ñ2°3Ó7ˆHØ�h‰Ø '¨¯ ©  |Ð4�” ð ð!.¨d¯j©j¨\Ð:�” Ø ð �=‰=˜LÒ (Ø�z‰zÐ!Ø4�” ð ð/�” Ø ð �=‰=˜LÒ (Ø�z‰z˜UÒ"Ø,�” ð ð —‘Ð2Ñ2Ø /°· ± ¨|¸1Ð=�” ð ð —‘Ð#Ø7�” ð ð!2°$·*±*°¸QÐ?�” Ø ð �=‰=˜DŸJ™JÒ &؈D�KØ �Z‰ZÐ Ø�}‰}  Ò,Ø0�• à2�• à# D§J¡J <¨qÐ1ˆD�Krc óô—t|jd›d|jd›d|jd›d|jd›d|j d›� d¬«|r$td t |j«›�d¬«yy) Nz<38Ú|z^7z^18z^10z^12Ú©Úendú| )Úprintr+r9r-r,r.rr0)r1Ú_modeÚ with_resultss rÚ table_printzOptCheck.table_print�su€Ü �—‘˜3�˜q §¡¨rÐ 2°!°D·K±KÀÐ3DÀAÀdÇmÁmÐTWÐEXÐXYÐZ^×ZgÑZgÐhkÐYlÐmÐsuÕvÙ Ü �B” t§{¡{Ó3Ð4Ð5¸2Ö >ð rcóX—|jsJd|j›�«‚|j|j|j|j|jdœ}|rM|j sJd|j›�«‚|j |d<|j j d«|d<|S)Nzunexpected empty opt_type in )Ú option_nameÚtyper-r,Ú desired_valúunexpected empty result in Ú check_resultr Úcheck_result_bool)r9r+r-r,r.r0r©r1rXÚdumps rÚ json_dumpzOptCheck.json_dump†s˜€Ø�}Š}ÐJÐ!>¸t¿y¹y¸kÐJÓJˆ}àŸ9™9Ø—M‘MØ—k‘kØŸ ™ ØŸ=™=ñ  ˆñ Ø—;’;Ð JÐ#>¸t¿y¹y¸kÐ!JÓ J�;Ø#'§;¡;ˆD�Ñ Ø(,¯ © ×(>Ñ(>¸tÓ(DˆDÐ$Ñ %؈ rN) r-r%r,r%r+r%r.r%ÚreturnÚNone)rdÚ StrOrNone)r<rfrdre©rdre©rWrfrXÚboolrdre©rXrirdzDict[str, StrOrBool]) r*Ú __module__Ú __qualname__r3Úpropertyr9r=rOrYrc©rrrr(s1„óðBò"óð"óó ,2ó\?ô rrcó2‡—eZdZdˆfd„ Zedd„«ZˆxZS)Ú KconfigCheckcóF•—t‰|�|Žd|j›�|_y)NÚCONFIG_)Úsuperr3r+)r1Úargsr)s €rr3zKconfigCheck.__init__—s"ø€Ü ‰Ñ˜$ÑØ˜dŸi™i˜[Ð)ˆ� rcó—y)NÚkconfigrnr8s rr9zKconfigCheck.opt_type›ó€àr)rtr%rdre©rdr%)r*rkrlr3rmr9Ú __classcell__)r)s@rrprp–sø„õ*ðòóôrrpcó—eZdZedd„«Zy)Ú CmdlineCheckcó—y)NÚcmdlinernr8s rr9zCmdlineCheck.opt_type¡rwrNrx©r*rkrlrmr9rnrrr{r{ s„Ø òóñrr{có—eZdZedd„«Zy)Ú SysctlCheckcó—y)NÚsysctlrnr8s rr9zSysctlCheck.opt_type§s€àrNrxr~rnrrr€r€¦s„Ø òóñrr€có>—eZdZdd„Zedd„«Zd d„Zd d„Zd d„Zy) Ú VersionCheckcóÆ—|rt|t«rt|«dk(s Jd|›d�«‚tt d„|««s Jd|›d�«‚||_d|_d|_y)Nrzinvalid expected version "ú" for VersionCheck (1)có"—t|t«Sr5©r$Úint©Úxs rÚz'VersionCheck.__init__..°ó €¤¨A¬sÔ!3rú" for VersionCheck (2))rrr)r$Útupler'ÚallÚmapÚ ver_expectedÚverr0)r1r’s rr3zVersionCheck.__init__­sy€Ù¤ ¨<¼Ô ?ÄCÈ ÓDUÐYZÒDZð QØ+¨L¨>Ð9OÐPó QÐZä”3Ñ3°\ÓBÔCð QØ+¨L¨>Ð9OÐPó QÐCà(ˆÔ؈ŒØˆ� rcó—y)NÚversionrnr8s rr9zVersionCheck.opt_type¶rwrcó°—|rt|t«rt|«dk\s Jd|›d�«‚tt d„|««s Jd|›d�«‚|dd|_y)Nrzinvalid version "r†có"—t|t«Sr5rˆrŠs rrŒz(VersionCheck.set_state..½r�rrŽ)r$r�r'r�r‘r“r;s rr=zVersionCheck.set_stateºsm€Ùœ  4¬Ô/´C¸³IÀ²Nð @Ø" 4 &Ð(>Ð?ó @ÐBä”3Ñ3°TÓ:Ô;ð @Ø" 4 &Ð(>Ð?ó @Ð;à˜˜�8ˆ�rcóf—|jddk\sJd«‚|jd|jdkDrd|j›�|_y|jd|jdkrd|j›�|_y|jd|jdkDrd|j›�|_y|jd|jdkrd|j›�|_y|jd|jdk\rd|j›�|_yd|j›�|_y)Nrr"znot initialized kernel versionzOK: version >= zFAIL: version < r)r“r’r0r8s rrOzVersionCheck.checkÁs2€Ø�x‰x˜‰{˜aÒÐBÐ"BÓBÐØ �8‰8�A‰;˜×*Ñ*¨1Ñ-Ò -Ø+¨D×,=Ñ,=Ð+>Ð?ˆDŒKØ Ø �8‰8�A‰;˜×*Ñ*¨1Ñ-Ò -Ø,¨T×->Ñ->Ð,?Ð@ˆDŒKØ à �8‰8�A‰;˜×*Ñ*¨1Ñ-Ò -Ø+¨D×,=Ñ,=Ð+>Ð?ˆDŒKØ Ø �8‰8�A‰;˜×*Ñ*¨1Ñ-Ò -Ø,¨T×->Ñ->Ð,?Ð@ˆDŒKØ à �8‰8�A‰;˜$×+Ñ+¨AÑ.Ò .Ø+¨D×,=Ñ,=Ð+>Ð?ˆDŒKØ Ø(¨×):Ñ):Ð(;Ð<ˆ� rcóŒ—d|j›�}t|d›d¬«|r$tdt|j«›�d¬«yy)Nzkernel version >= z<89rRrSrU)r’rVrr0)r1rWrXÚver_reqs rrYzVersionCheck.table_printÖsF€Ø& t×'8Ñ'8Ð&9Ð:ˆÜ �˜�  BÕ'Ù Ü �B” t§{¡{Ó3Ð4Ð5¸2Ö >ð rN)r’zTuple[int, int, int]rdrerx)r<zTuple[int, ...]rdrergrh) r*rkrlr3rmr9r=rOrYrnrrr„r„¬s*„óðòóðóó=ô*?rr„cób—eZdZd d„Zed d„«Zed d„«Zed d„«Zd d„Zd d„Z d d„Z y)ÚComplexOptCheckcód—||_|jsJd|jj›d�«‚t|j«dk7s!Jd|jj›d|›�«‚t |jdt «s!Jd|jj›d|›�«‚d|_y)Nzempty z checkrzuseless z check: rzinvalid )Úoptsr)r*r'r$ÚSimpleNamedOptCheckTypesr0)r1ržs rr3zComplexOptCheck.__init__Þs±€ØˆŒ Ø�yŠyð 8ؘŸ™×/Ñ/Ð0°Ð7ó 8ˆyä�4—9‘9‹~ Ò"ð Bؘ$Ÿ.™.×1Ñ1Ð2°(¸4¸&ÐAó BÐ"ä˜$Ÿ)™) A™,Ô(@ÔAð Bؘ$Ÿ.™.×1Ñ1Ð2°(¸4¸&ÐAó BÐAàˆ� rcó—y)NÚcomplexrnr8s rr9zComplexOptCheck.opt_typeèrwrcój—t|jdd«sJ‚|jdjS)Nrr+)Úhasattrržr+r8s rr+zComplexOptCheck.nameìs.€ä�t—y‘y ‘| VÔ,Ð,Ð,Ø�y‰y˜‰|× Ñ Ð rcój—t|jdd«sJ‚|jdjS)Nrr.)r£ržr.r8s rr.zComplexOptCheck.expectedñs.€ä�t—y‘y ‘| ZÔ0Ð0Ð0Ø�y‰y˜‰|×$Ñ$Ð$rcó—t‚r5r6r8s rrOzComplexOptCheck.checkös€Ü!Ð!rcó˜—|dk(r~d|jj›d�}td|d›�d¬«|r#tdt|j«›�d¬«|j D]}t«|j ||«Œ y|j d }|j |d «|r$tdt|j«›�d¬«yy) NÚverbosez<<< z >>>z Ú85rRrSrUrF)r)r*rVrr0ržrY)r1ÚmoderXÚ class_nameÚos rrYzComplexOptCheck.table_printùsµ€Ø �9Ò Ø §¡× 7Ñ 7Ð8¸Ð=ˆJÜ �D˜ B˜Ð(¨bÕ 1Ùܘœ?¨4¯;©;Ó7Ð8Ð9¸rÕBØ—Y”Y�ܔؗ ‘ ˜d LÕ1ñð— ‘ ˜!‘ ˆAØ �M‰M˜$ Ô &Ùܘœ?¨4¯;©;Ó7Ð8Ð9¸rÖBðrcó—t|jdd«sJ‚|jdjd«}|rM|jsJd|j›�«‚|j|d<|jj d«|d<|S)NrrcFr^r_r r`)r£ržrcr0r+rras rrczComplexOptCheck.json_dumps€Ü�t—y‘y ‘| [Ô1Ð1Ð1Ø�y‰y˜‰|×%Ñ% eÓ,ˆÙ à—;’;Ð JÐ#>¸t¿y¹y¸kÐ!JÓ J�;Ø#'§;¡;ˆD�Ñ Ø(,¯ © ×(>Ñ(>¸tÓ(DˆDÐ$Ñ %؈ rN)ržÚAnyOptCheckTyperdrerxrg)r©rfrXrirdrerj) r*rkrlr3rmr9r+r.rOrYrcrnrrrœrœÝsS„óðòóððò!óð!ðò%óð%ó"ó Côrrœcó—eZdZdd„Zy)ÚORcóΗt|j«D�]®\}}|j«|jsJd«‚|jj d«sŒF|j|_|dk7�rRt |t «r1|jj d«sJd|j›�«‚y|jdk(r$d|j›d|j›d�|_y|jj d «r2d |jjd «›d |j›�|_y|jd k(rd|j›d�|_y|jdk(rd|j›d�|_y|jj d«sJd|j›d�«‚d|j›d�|_y|jdj|_y)Nz+unexpected empty result of the OR sub-checkr rz OK: versionúunexpected VersionCheck result zOK: z is "r rBzOK: "r?z" is in rJz is not foundrEz is presentzOK: is not offzunexpected OK description "z is not off) Ú enumerateržrOr0rr$r„r+r.r&©r1ÚiÚopts rrOzOR.checks¾€Ü § ¡ ×*‰FˆAˆsØ �I‰IŒKØ—:’:Ð MÐ MÓ M�:Ø�z‰z×$Ñ$ TÕ*Ø!Ÿj™j�” ؘ“6ä! #¤|Ô4Ø"Ÿz™z×4Ñ4°]ÔCðNØ!@ÀÇÁÀ ÐMóNÐCñ ðŸ:™:¨Ò-Ø,0°·±° ¸%ÀÇ Á ¸~ÈQÐ*O˜DœKñð!ŸZ™Z×2Ñ2°9Ô=Ø,1°#·,±,×2DÑ2DÀSÓ2IÐ1JÈ(ÐSV×S[ÑS[ÐR\Ð*]˜DœKñð!ŸZ™ZÐ+=Ò=Ø,0°·±° ¸-Ð*H˜DœKñð !ŸZ™ZÐ+;Ò;Ø,0°·±° ¸+Ð*F˜DœKñ ð$'§:¡:×#8Ñ#8Ð9IÔ#JðOØ%@ÀÇÁÀ ÈAÐ#NóOÐ#Jà,0°·±° ¸+Ð*F˜DœKÙð1+ð2—i‘i ‘l×)Ñ)ˆ� rNrg©r*rkrlrOrnrrr¯r¯s„ô *rr¯có—eZdZdd„Zy)ÚANDcóö—ttt|j«««D�]Î\}}|j «|j sJd«‚|dk(r|j |_y|j j d«rŒ^t|t«rB|j j d«sJd|j ›�«‚|j |_y|j j d«s|j dk(r$d|j›d |j›d �|_y|j j d «r2d|jjd «›d |j›�|_y|j dk(rd|j›d�|_y|j dvrd|j›d�|_y|j dk(sJd|j ›d �«‚d|j›d�|_yy)Nz,unexpected empty result of the AND sub-checkrr z FAIL: versionr±rKr@zFAIL: z is not "r rCr?z " is not in rDz is not present)rGzFAIL: is off, "0"zFAIL: is off, "is not set"z is offrIzunexpected FAIL description "z is off, not found) ÚreversedÚlistr²ržrOr0rr$r„r+r.r&r³s rrOz AND.check;s΀ܜt¤I¨d¯i©iÓ$8Ó9×:‰FˆAˆsØ �I‰IŒKØ—:’:Ð NÐ NÓ N�:Ø�AŠvØ!Ÿj™j�” ÙØ—:‘:×(Ñ(¨Õ.ô˜c¤<Ô0ØŸ:™:×0Ñ0°ÔAðJØ<¸S¿Z¹Z¸LÐIóJÐAà"%§*¡*�D”Kñð—z‘z×,Ñ,¨ZÔ8¸C¿J¹JÐJ^Ò<^Ø(.¨s¯x©x¨j¸ À#Ç,Á,ÀÈqÐ&Q˜œ ñðŸ™×.Ñ.¨Ô?Ø(/°· ± ×0BÑ0BÀ3Ó0GÐ/HÈ ÐUX×U]ÑU]ÐT^Ð&_˜œ ñðŸ™Ð'=Ò=Ø(.¨s¯x©x¨j¸Ð&H˜œ ñð Ÿ™Ð'jÑjØ(.¨s¯x©x¨j¸Ð&@˜œ ñ ð #Ÿz™zÐ-FÒFðMØ!>¸s¿z¹z¸lÈ!ÐLóMÐFà(.¨s¯x©x¨jÐ8JÐ&K˜œ Ùñ7;rNrgr¶rnrrr¸r¸5s„ô rr¸)rvr}r‚r•cóX—|jdk7sJd|j›d|›�«‚|jtvsJd|j›d�«‚|tvs Jd|›d�«‚||jk7ry|dvrkt|t«s Jd|›�«‚t|t«sJd |j›d�«‚|j |j |jd««yt|t«s Jd |›�«‚t|t«r|d k(s Jd |›d�«‚|j |«y) Nr¡zunexpected opt_type "rzinvalid opt_type "r zinvalid data_type ")rvr}r‚zunexpected data with data_type z'unexpected VersionCheck with opt_type "z&unexpected verion data with data_type r•zunexpected data_type ") r9ÚSIMPLE_OPTION_TYPESr$ÚdictrŸr=Úgetr+r�r„)rµr<Ú data_types rÚpopulate_simple_opt_with_datarÁmsI€Ø �<‰<˜9Ò $ÐXÐ)>¸s¿|¹|¸nÈFÐSVÐRWÐ'XÓXÐ $Ø �<‰<Ô.Ñ .ÐUÐ3EÀcÇlÁlÀ^ÐSTÐ1UÓUÐ .Ø Ô+Ñ +ÐPÐ0CÀIÀ;ÈaÐ.PÓPÐ +à�C—L‘LÒ ØàÐ4Ñ4ܘ$¤Ô%ð =Ø0°° Ð<ó =Ð%ä˜#Ô7Ô8ð IØ8¸¿¹¸ÀaÐHó IÐ8à � ‰ �d—h‘h˜sŸx™x¨Ó.Õ/ä˜$¤Ô&ð DØ7¸ °{ÐCó DÐ&ä˜#œ|Ô,°¸iÒ1Gð 5Ø'¨  {°!Ð4ó 5ÐGà � ‰ �dÕrcóЗ|jdk7sJd«‚|jdk7r6t|t«sJd|›d|j›d�«‚t|||«yt|t«sJd|›d|j›d�«‚|j D]T}|jdk7r6t|t«sJd|›d|j›d�«‚t|||«ŒHt |||«ŒVy)Nr•z a single VersionCheck is uselessr¡zunexpected object z with opt_type "r )r9r$ÚSimpleOptCheckTypesrÁÚComplexOptCheckTypesržÚpopulate_opt_with_data)rµr<rÀr«s rrÅrŃsù€Ø �<‰<˜9Ò $ÐIÐ'IÓIÐ $Ø ‡|�|�yÒ Ü˜#Ô2Ô3ð IØ# C 5Ð(8¸¿¹¸ÀaÐHó IÐ3ä% c¨4°Õ;ä˜#Ô3Ô4ð IØ# C 5Ð(8¸¿¹¸ÀaÐHó IÐ4à—”ˆAØ�z‰z˜YÒ&Ü! !Ô%8Ô9ðMØ+¨A¨3Ð.>¸q¿z¹z¸lÈ!ÐLóMÐ9ä-¨a°°yÕAô' q¨$° Õ:ñrcó,—|D]}t|||«Œyr5)rÅ)Ú checklistr<rÀrµs rÚpopulate_with_datarÈ–s€ÛˆÜ˜s D¨)Õ4ñrcóè—|D]m}|j|k(sŒt|t«r||_Œ+|jD]4}t|t«s Jd|›d�«‚|j|k(sŒ.||_Œ6Œoy)Nz"overriding an expected value for "z" is not supported yet)r+r$rŸr.rž)rÇr+Únew_valrµr«s rÚoverride_expected_valuerË›ss€ÛˆØ �8‰8�tÓ Ü˜#Ô7Ô8Ø&�• ð Ÿœ�AÜ% aÔ)AÔBðZØ?À¸sÐBXÐYóZÐBà—v‘v “~Ø%,˜� ñ "ñrcó2—|D]}|j«Œyr5)rO)rÇrµs rÚperform_checksrͬs€ÛˆØ � ‰ � ñrc óæ—g}|D�]7}t|t«rL|jdk7s J|›d�«‚t|t«rJd«‚|j |j «Œ`|j D]É}t|t«rA|jdk7s J|›d�«‚t|d«r|j |j «ŒT|j D]g}t|t«sJd|j ›�«‚|jdk7s J|›d�«‚t|d«sŒM|j |j «ŒiŒË�Œ:|j«D]\}}||vsŒ td|›d|›d|›d �«Œ!y) Nr¡z with complex opt_typez single VersionCheck in checklistr+z"unexpected ComplexOptCheck inside z[?] No check for z option z (Ú)) r$rÃr9r„Úappendr+ržr£ÚitemsrV) rÇÚparsed_optionsr9Ú known_optionsÚo1Úo2Úo3ÚoptionÚvalues rÚprint_unknown_optionsrÙ±sm€Ø€MäˆÜ �bÔ-Ô .Ø—;‘; )Ò+Ð K°°Ð4JÐ.KÓ KÐ+Ü! "¤lÔ3Ð XÐ6XÓ XÐ3Ø × Ñ  §¡Ô )Ø Ø—'”'ˆBܘ"Ô1Ô2Ø—{‘{ iÒ/ÐO°R°DÐ8NÐ2OÓOÐ/ܘ2˜vÔ&Ø!×(Ñ(¨¯©Ô1ØØ—g”g�Ü! "Ô&9Ô:ðFØ;¸B¿G¹G¸9ÐEóFÐ:à—{‘{ iÒ/ÐO°R°DÐ8NÐ2OÓOÐ/ܘ2˜vÕ&Ø!×(Ñ(¨¯©Õ1ñ ò ð ð&(×-Ñ-Ö/‰ ˆ�Ø ˜Ò &Ü Ð% h Z¨x¸°x¸rÀ%ÀÈÐJÕ Kñ0r)rrfrdrf)rµÚSimpleOptCheckTyper<Ú DictOrTuplerÀr%rdre)rµr­r<rÛrÀr%rdre)rÇúList[ChecklistObjType]r<rÛrÀr%rdre)rÇrÜr+r%rÊr%rdre)rÇrÜrdre)rÇrÜrÒzDict[str, str]r9r%rdre),Ú__doc__Ú __future__rr Útypingrrrrrr%rfr‰Ú TupleOrNonerÛriÚ StrOrBoolrrrrrrpr{r€r„rœr¯r¸r½rÚrÃÚSimpleNamedOptCheckTyperŸÚComplexOptCheckTyperÄÚChecklistObjTyper­rÁrÅrÈrËrÍrÙrnrrÚrås‹ðñõ#Û ç5Õ5Ø �S‰M€ Ø�u˜S #˜X‘Ñ'€ Ø�D˜˜c˜‘N E¨#¨s¨(¡OÐ3Ñ4€ Ø �#�t�)Ñ € à€ Ø € Ø € ó-÷kñkô\�8ôô�8ôô �(ô÷ .?ñ.?÷b3ñ3ôl*ˆô*ôD"ˆ/ô"ðNBÐØ˜<¨°{ÀLÐPÑQÐØ# \°;À ÐMÐØ  ¨l¸KÐ GÑHÐØ(¨,¸ ÐDÐð˜B ˜G‘nÐØ˜C�yÐð˜ |°[À"ÀcÐIÑJÐ𘠠l°KÀÈrÐSVÐVÑW€óó,;ó&5ó -ó"ô Lr