
    j<P                       U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZ ddlmZ ddlmZmZ dZded	<   d
Zded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZ ded<   dZ!ded <   d!Z"ded"<   d#Z#ded$<    ed%      Z$ded&<    ed'      Z%ded(<   d)Z&ded*<   d+d,d-d.Z'ded/<    ed0      Z(ded1<   d2d3d4Z)ded5<   d6Z*d7Z+d8Z, e
jZ                  d9      Z.d:Z/d;Z0 e1ed<d      Z2 G d= d>e3      Z4 G d? d@e4      Z5 edAB       G dC dD             Z6dbdEZ7dcdFZ8dddGZ9dedHZ:dedIZ;dfdJZ<dgdKZ=dhdLZ>didMZ?djdNZ@dAdOdkdPZAdldQZBdmdRZCdndSZDdodTZEdpdUZF G dV dW      ZGdqdXZHdrdYZIdsdZZJdtd[ZKdud\ZLdvd]ZMdwd^ZNdxd_ZOdydzd`ZPeQdak(  r eR eP             y){zCEvent-first observer for the exact Task26 replacement consent card.    )annotationsN)	dataclass)Path)Finalcast@2e0894eac92bc396cc4723bf1f18ebc653b95018dd41574df435941c235da925r   	CANDIDATE@af4a9d0a1ffffb6eb7551c1d6dc2b32853ca6d024332a4f8f5702bbf992f141bWHEEL@d816dbbd6a27d5826b251d279a9831de096ef7cd79b5fd131ceff7253b7369bePLAN@8416cd7c83cab5540af2e1e01dbcc5b1bdfd49a59d8ef21ea49512c28d749218	GOLDEN_V6@a2e15845764e7041957ae4518096fe73f87ec35b57021980cdd4df3ea18ac00dRECOVERY_V6cb_PCczfFXoI4GjvCxLBs1oRA
SESSION_ID@53b4f95b5b4db9a611128976a7b951bbe22d9619e05b2ff07fadf5b02f9a5380SID_HASH%task26_live_2e_r2_20260815_8527916639CUSTOMER_KEY
8527916639ACTOR_IDCHAT_ID0TOPIC_ID158CLAIM_MESSAGE_ID159CARD_MESSAGE_ID
8693203710OWNER_ID@5e3067fe3c865224fc73ff5a9a65058c87960f05d9af53bddccaf6f32dc83939CONSENT_RECEIPT_SHA256z:data/onboarding/telegram-customer-bootstrap-v1/ledger.jsonLEDGER_RELATIVEzcustomers/registry.jsonREGISTRY_RELATIVEz(task26-consent-stage-observer-receipt-v1SCHEMA@b41060dea28eb3bbb83217068f5218d5df2c879dba00e73c9ca4e577a6049dad@145515d5e110dcebb94fcaa554bcee29544b3a75dcfe058fae944ea3b70042b2@07f868adf9fe0565e6eac89fd76b09601adea315e2a122a09ee748614d912c2f)zgateway/platforms/telegram.pyz0gateway/platforms/telegram_customer_bootstrap.pyz'gateway/platforms/nutrition_coaching.pyRUNTIME_HASHESzK/home/cube/projects/richard/hermes-agent/.venv/lib/python3.12/site-packages	VENV_SITE@fe4a8725be379e47b1b2fab3029147705d7def887d94af747e5057c93322c40f@d1f848d1fa8bc71e018f45c83e8e19e93671dfa83157d3feff15b8f7ec0f1d8a)z3workspace/checkin_cli/checkin_cli/customer_admin.pyz9workspace/checkin_cli/checkin_cli/nutrition_onboarding.pyPROFILE_MODULE_HASHES   i @  i   iIIIi  i  
O_NOFOLLOWc                      e Zd ZdZy)ObserverErrorz'Fail-closed consent observer violation.N__name__
__module____qualname____doc__     L.omo/evidence/task26/task26-consent-observer-st_01a007da/consent_observer.pyr4   r4   :   s    1r;   r4   c                      e Zd ZdZy)ObserverTimeoutzBounded event wait expired.Nr5   r:   r;   r<   r>   r>   >   s    %r;   r>   T)frozenc                  J    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   y	)
Baselinedict[str, object]registryledgersessionstrregistry_sha256ledger_sha256expected_consent_receipt_sha256N)r6   r7   r8   __annotations__r:   r;   r<   rA   rA   B   s&    %((r;   rA   c                R    t        j                  | dddd      j                         S )NFT),:)ensure_ascii	sort_keys
separators	allow_nan)jsondumpsencodevalues    r<   canonical_bytesrW   L   s#    ::e%4Jbghooqqr;   c                Z    t        j                  t        |             j                         S N)hashlibsha256rW   	hexdigestrU   s    r<   digest_jsonr]   P   s    >>/%01;;==r;   c                d    t        j                  | j                               j                         S rY   )rZ   r[   
read_bytesr\   )paths    r<   sha256_filera   T   s!    >>$//+,6688r;   c                   | j                         rt        | d      | j                         }t        j                  |j                        r0|j
                  t        j                         k7  s|j                  dk7  rt        | d      t        j                  |j                        t        k7  rt        | d      y )N is a symlink   z# is not one owner-held regular filez is not private 0600)
is_symlinkr4   statS_ISREGst_modest_uidosgetuidst_nlinkS_IMODEPRIVATE_FILEr`   labelinfos      r<   _private_regularrr   X   s    ug]34499;D<<%		)Ct}}XYGYug%HIJJ||DLL!\1ug%9:;; 2r;   c                d   | j                         rt        | d      | j                         }t        j                  |j                        r!|j
                  t        j                         k7  rt        | d      t        j                  |j                        t        k7  rt        | d      y )Nrc   z is not an owner-held directoryz is not private 0700)
re   r4   rf   S_ISDIRrh   ri   rj   rk   rm   PRIVATE_DIRro   s      r<   _private_dirrv   b   s    ug]34499;D<<%		)Cug%DEFF||DLL![0ug%9:;; 1r;   c                   t        | |       t        j                  | t        j                  t        j                  z  t
        z        }	 t        j                  |      }t        j                  ||j                  dz         }t        |      |j                  k7  s|j                  dkD  rt        | d      	 t        j                  |       	 t        j                  |      }t!        |t"              st        | d      |t%        j&                  |      j)                         fS # t        j                  |       w xY w# t        t        j                  f$ r}t        | d      |d }~ww xY w)Nrd   i   z changed during stable readz is invalid JSONz is not a JSON object)rr   rj   openO_RDONLY	O_CLOEXECr2   fstatreadst_sizelenr4   closerR   loadsUnicodeDecodeErrorJSONDecodeError
isinstancedictrZ   r[   r\   )r`   rp   fdrq   rawrV   excs          r<   
_load_jsonr   l   s,   T5!	r{{R\\1J>	?Bxx|ggb$,,*+s8t||#t||6F'F5')D EFF (G 	A

3 eT"ug%:;<<'..%//111 	  4 45 Aug%567S@As%   
A-D& E  &D= E-E((E-c                   t        |       h dk7  s| j                  d      dk7  rt        d      | j                  d      }t        |t              r#| j                  d      t        | d   |d      k7  rt        d      |D cg c].  }t        |t              s|j                  d	      t        k(  s-|0 }}t        |      d
k7  rt        d      |d   S c c}w )N>   digestschemasessionsr   ztelegram-customer-bootstrap-v1zbootstrap ledger schema driftr   r   r   r   zbootstrap ledger digest drift
session_idrd   z&exact bootstrap session is unavailabler   )	setgetr4   r   listr]   r   r   r~   )rD   rowsrowmatchess       r<   _sessionr      s    
6{66&**X:NRr:r;<<::j!DdD!VZZ%9[TZ[cTdrvIw=x%x;<<"ddsjd&;@UYc@csdGd
7|qDEE1: es   CC2Cc                   | j                  d      }t        |t              st        d      |D cg c].  }t        |t              s|j                  d      t
        k(  s-|0 }}t        |      dk7  rt        d      |d   S c c}w )N	customerszregistry schema driftcustomer_keyrd   z&exact registry customer is unavailabler   )r   r   r   r4   r   r   r~   )rC   r   r   r   s       r<   	_customerr      s|    [)Ii&344'mis:c4+@SWW^E\`lElsiGm
7|qDEE1: ns   BB Bc            	     Z    t        d d t        t              t        t              ddd      S )N   
privacy-v1)chat_idtopic_idcustomer_user_idconsent_card_message_idbootstrap_generationnotice_version)r]   intr   r    r:   r;   r<   _expected_receipt_digestr      s/    M#&#7 !&  r;   c                    t         j                         D ](  \  }}t        t        |z        |k7  st	        d|        t
        j                         D ]$  \  }}t        | |z        |k7  st	        d|        y )Nzloaded runtime hash drift: zprofile authority hash drift: )r+   itemsra   r,   r4   r/   )profilerelativeexpecteds      r<   validate_runtimer      s~    ,224(y8+,8"=hZ HII 5 499;(w)*h6"@
 KLL <r;   enforce_runtimec               6   | j                         s| j                         } t        | d       t        | t        z  j                  d       t        | t
        z  j                  d       |rt        |        t        | t        z  d      \  }}t        | t
        z  d      \  }}t        |      }|j                  d      }t        |t              st        d      dt        t        t        t         d	g}|j                  d
      t"        k7  s|j                  d      t$        k7  s|j                  d      t        k7  s|j                  d      dk7  s|j                  d      dk7  s}|j                  d      t&        k7  se|j                  d      |k7  sQ|j                  d      dk7  s=|j                  d      t(        k7  s%|j                  d      g k7  s|j                  d      t        d      t+        |      }	|j                  d      t&        t&        ddk7  sO|	j                  d      dus<|	j                  d      t        t        t        dk7  s|	j                  d      dd d d k7  rt        d!      t-               }
|
t.        k7  rt        d"      t1        ||||||
      S )#Nzprofile rootzregistry parentzbootstrap authority parentcustomer registrybootstrap ledgercustomer_draftz&current customer draft authority driftcustomer)roleuser_idr   r   
message_idsid_hashr   r   stateAWAITING_CONSENT
generation   owner_idrole_claimsconsent_publication_attemptrd   r   recovery_attemptsfailure_codez2current consent card/session/claim authority driftownerr   )r   r   r   enabledFtelegramai_processing_consentgrantedrecorded_onr   z7current disabled registry consent/route authority driftz*sealed exact callback receipt digest drift)is_absoluteresolverv   r&   parentr%   r   r   r   r   r   r   r4   r   r   r   r   r   r   r"   r    r   r   r$   rA   )r   r   rC   registry_hashrD   ledger_hashr   draftclaimr   r   s              r<   arm_baseliner      sG    //#.)'--557HI'O+335QR!(3D)DFYZHm$W%>@RSFK
6
CGG$%EeT"DEE X'"2BD EE 	
x'99^$499'(H47771177< A%77:(*77=!U*7701Q677,-@77&'2-77>".PQQ"HWX(X[!\\<<	"%/<<
#8]e'ff<</0VZnr4ssUVV')H))HIIHfc=+xPPr;   c                   t        |       t        |      }}t        t        t        t        f   t        j                  t        j                  |                  }|j                  d      }t        |t              st        d      d|j                  d      dd|d<   t        |t              r|j                  d      nd }t        |t              rt        |      dk7  rt        d      t        j                  t        j                  |             }t        d	 t        |d
         D              }||d
   |<   ||k7  rt        d      |S )Nr   z"registry consent commit is invalidTr   r   r   
   z'registry consent commit date is invalidc              3  X   K   | ]"  \  }}|j                  d       t        k(  s| $ yw)r   N)r   r   .0ir   s      r<   	<genexpr>z/validate_registry_transition.<locals>.<genexpr>   s)     v!Jvq#cggVdNeiuNu!J    **r   z6registry changed beyond exact privacy-v1 consent grant)r   r   r   rF   objectrR   r   rS   r   r   r4   r~   next	enumerate)	beforeafterold_customernew_customerr   consentrecordedexpected_registryindexs	            r<   validate_registry_transitionr      s   !*6!2Ie4D,LDf%tzz$**\2J'KLH67Ggt$@AAM(B&)H$% .8-Fw{{=)DHh$H(;EFF

4::f#56v+<[+I!JvvE,4k"5)!!TUUOr;   c                ,   t        |       t        |      }}t        j                  t        j                  |            }|j	                  ddd |j                  d      d       t        |j                  d      t              r||k(  rt        d      ||k7  rt        d      t        j                  t        j                  |             }|d   }t        d t        |      D              }|||<   t        |d	   |d
      |d<   ||k7  rt        d      |S )NAWAITING_ACTIVATIONr   
updated_at)r   r   r   r   z-bootstrap consent commit timestamp is invalidzBbootstrap transition is not exact generation 4 to 5 consent commitr   c              3  X   K   | ]"  \  }}|j                  d       t        k(  s| $ yw)r   N)r   r   r   s      r<   r   z-validate_ledger_transition.<locals>.<genexpr>   s%     Xvq#CGGL4IZ4Wr   r   r   r   z5bootstrap ledger changed beyond exact consent session)r   rR   r   rS   updater   r   rF   r4   r   r   r]   )r   r   oldnewr   expected_ledgerr   r   s           r<   validate_ledger_transitionr      s    %Czz$**S/*HOO&a#'sww|7L  cggl+S1SCZKLL
h`aajjF!34O:&DX4XXEDK +x7P^b,c dOHSTTJr;   c                     t        j                  d d      } | j                  t        j                  t        j
                  z        }|dk  r t        dt        j                                t        |      S )NT	use_errnor   zinotify_init1 failed: errno )	ctypesCDLLinotify_init1rj   rz   
O_NONBLOCKr4   	get_errnor   )libcr   s     r<   _inotify_initr      s\    ;;tt,D			BLL2==8	9B	Av:6;K;K;M:NOPPr7Nr;   c                    t        j                  d d      }|j                  | t        j                  |      t
              }|dk  r t        dt        j                                t        |      S )NTr   r   z inotify_add_watch failed: errno )	r   r   inotify_add_watchrj   fsencodeIN_MOVED_TOr4   r   r   )r   r`   r   watchs       r<   
_add_watchr     s]    ;;tt,D""2r{{4'8+FEqy>v?O?O?Q>RSTTu:r;   c                   g }d}|t         j                  z   t        |       k  rt         j                  | |      \  }}}}|t         j                  z  }| |||z    j	                  dd      d   j                  dd      }||z  }|t        z  rt        d      |t        z  rt        d      |j                  |||f       |t         j                  z   t        |       k  r|S )Nr       rd   zutf-8strictzinotify queue overflowzauthority watch invalidated)
EVENTsizer~   unpack_fromsplitdecodeIN_Q_OVERFLOWr4   
IN_IGNOREDappend)r   resultoffsetr   mask_cookielengthnames           r<   _eventsr    s    FF
5::
S
)','8'8f'E$tWf%**6&6/*00:1=DDWhW&- 899* =>>udD)* 5::
S
) Mr;   c                  ,    e Zd ZddZddZddZd	dZy)
ConsentWatcherc               t    |j                         | _        || _        d| _        d| _        d| _        d | _        y )N)r   r   r   r   registry_watchledger_watchbaseline)selfr   r   s      r<   __init__zConsentWatcher.__init__   s6    (. )-r;   c                v   t               | _        t        | j                  | j                  t        z  j
                        | _        t        | j                  | j                  t        z  j
                        | _        t        | j                  | j                        | _        	 t        j                  | j                  d      }t        |      D ]M  \  }}}||f| j                  t        j                   f| j                  t        j                   fhv sDt#        d       | j                  S # t        $ r d}Y tw xY w)Nr      r;   z.authority changed across subscription baseline)r   r   r   r   r&   r   r  r%   r  r   r   r  rj   r|   BlockingIOErrorr  r  r4   )r  queuedr   _maskr  s        r<   armzConsentWatcher.arm(  s   /(4<<BS3S2[2[\&tww1O0W0WX$T\\4CWCWX	WWTWWe,F #*&/E5$t}$"5"57H7M7M!N"&"3"3_5I5I!J!L L#$TUU #2 }}  	F	s   # D* *D87D8c                   | j                   t        d      t        j                         |z   }d}d}d}t	        j
                         }|j                  | j                  t        j                         	 	 |t        j                         z
  }|dk  rt        d      |j                  |      }|st        d      t        t        j                  | j                  d            D ]  \  }	}
}|	| j                  k(  rr|t        j                   k(  r_t#        | j$                  t        z  d      \  }}|| j                   j&                  k(  r|rft)        | j                   j&                  |      }d}|	| j*                  k(  s|t,        j                   k(  s|st        d	      t#        | j$                  t,        z  d
      \  }}t/        | j                   j0                  |      }||||fc |j3                          S  # |j3                          w xY w)Nzobserver is not armedF Tr   z"bounded monotonic deadline expiredr  r   z9bootstrap consent commit preceded registry consent commitr   )r  r4   time	monotonic	selectorsDefaultSelectorregisterr   
EVENT_READr>   selectr  rj   r|   r  r&   r  r   r   rC   r   r  r%   r   rD   r   )r  timeoutdeadlineregistry_seenr   registry_after_hashselector	remainingreadyr   r  r  r   ledger_after_hashr   s                  r<   waitzConsentWatcher.wait7  s   ==  788>>#g- ,,.$''9#7#78	$t~~'77	>)*NOO 	2)*NOO*1"''$''52I*J&E5$ 3 33@Q@V@V8V5?O`@`bu5v22 DMM$:$::}$&B4==CYCY[`&a(,$"3"33@T@T8T,"/0k"ll3=dll_>\^p3q0089M9MuU*C1DFWWWNN +K * NNs    4DG8 <G8 AG8 5G8 8H
c                p    | j                   dk\  r't        j                  | j                          d| _         y y )Nr   r  )r   rj   r   )r  s    r<   r   zConsentWatcher.closeX  s)    77a<HHTWWDG r;   N)r   r   r   boolreturnNone)r0  rA   )r%  floatr0  z'tuple[str, dict[str, object], str, str])r0  r1  )r6   r7   r8   r  r  r-  r   r:   r;   r<   r  r    s    .Br;   r  c                 >    t         t        t        t        t        ddS )N)	golden_v6recovery_v6)	candidatewheel_sha256plan_sha256runbook_sha256)r	   r   r   r   r   r:   r;   r<   bindingsr:  ^  s    "E$,5kRT Tr;   c                 \    t         t        t        t        t        t
        t        t        ddd
S )N!canonical_customer_consent_acceptr   )
actor_idr   r   r   claim_message_idr   r   r   actionr   )r   r   r   r    r   r   r   r   r:   r;   r<   callback_authorityr@  c  s'     W()?O$(L9\[ [r;   c                v   | j                         } t        | j                  d       t        j                  t        j
                  z  t        j                  z  t        j                  z  t        z  }t        j                  | |t              }	 t        |      dz   }t        j                  ||       t        j                  |       t        j                  t        j                   |      j"                        t        k7  rt%        d      	 t        j&                  |       y # t        j&                  |       w xY w)Nzreceipt parent   
zreceipt mode drift)r   rv   r   rj   O_WRONLYO_CREATO_EXCLrz   r2   rx   rn   rW   writefsyncrf   rm   r{   rh   r4   r   )r`   rV   flagsr   r   s        r<   _secure_writerI  j  s    <<>D./KK"**$ryy02<<?*LE	ul	+Be$u,
S
<<,,-= 455 > 	s   A=D! !D8c                r    | 5t        j                  | t        |             t        j                  |        y y rY   )rj   rF  rW   r   )r   rV   s     r<   _ready_wirerK  y  s*    	~
_U+,
 r;   c                    t         dddt               t               | j                  | j                  | j
                  ddddd	S )	NREADY_BEFORE_CONSENTz)inotify-established-before-human-callback  r   r   )rG   bootstrap_ledger_sha256bootstrap_stater   z!no-raw-update-no-token-no-network)	r   statusevent_subscriptionsafe_window_secondsr:  r@  rI   r  privacy)r'   r:  r@  rI   rG   rH   )r  s    r<   ready_receiptrU    sN    (>"M#'XZ"4"6/7/W/W,4,D,D4<4J4J,>XY[ ;< <r;   c                    g }t        d | j                  d      D              D ]6  }|j                  t        |j	                  |             t        |      f       8 t        |      S )Nc              3  B   K   | ]  }|j                         s|  y wrY   )is_file)r   items     r<   r   ztree_digest.<locals>.<genexpr>  s     J4<<>ts   *)sortedrglobr  rF   relative_tora   r]   )rootvaluesr`   s      r<   tree_digestr`    sV    FJ

3JJs4++D12K4EFG Kvr;   c                   t        | j                  | j                         }	 |j                         }t	        |      }| j
                  dk(  r(t        | j                  |       ||j                          S t        | j                  |       t        | j                  |       t        t        |      j                         d       |j                  | j                         \  }}}}t"        ddt%               t'               d|d|j)                  d	      d u |||j*                  d
dd}t        | j                  |       ||j                          S # |j                          w xY w)Nr   arm-onlyT)flushPASS_CONSENT_COMMITTEDzinotify-before-human-callbackzgranted/privacy-v1z+AWAITING_CONSENT:g4->AWAITING_ACTIVATION:g5r   )registry_consentr   bootstrap_transitionconsent_card_retiredregistry_sha256_afterbootstrap_ledger_sha256_afterconsent_receipt_sha256z*redacted-no-raw-update-no-token-no-network)r   rQ  rR  r:  r@  commitrT  )r  r   skip_runtime_hashesr  rU  moderI  receiptr   r+  rK  ready_fdprintrW   r  r-  r%  r'   r:  r@  r   rI   )	argswatcherr  r+  r   r   registry_afterledger_afterrn  s	            r<   runru    s'   T\\t?W?W;WXG;;=h'99
"$,,.& 	% 	djj%(DMM5)oe$++-T:9@dll9S6S.,06BZ)H'zASAU2F-86c69gg>W6X\`6`7E?K8@8`8`b K
&L 	dllG,s   AE 6CE E!c                 z   t        j                  t              } | j                  dd      }|j	                  d      }|j                  dt        d       |j                  dt        d       |j                  d	d
t         j                         |j	                  d      }|j                  dt        d       |j                  dt        d       |j                  dt        d       |j                  dt        d       |j                  dt               |j                  d	d
t         j                         | S )N)descriptionrm  T)destrequiredrb  z	--profile)typery  z	--receiptz--skip-runtime-hashes
store_true)r?  helpobservez--readyz	--timeoutz
--ready-fd)rz  )
argparseArgumentParserr9   add_subparsers
add_parseradd_argumentr   SUPPRESSr2  r   )r  subr  r}  s       r<   parserr    s   $$9F


Vd

;C
..
$C[td;[td;,\HYHYZnnY'G4$?=4$?54@C00HL]L]^Mr;   c                   t               j                  |       }	 |j                  dk(  r)|j                  dk  s|j                  dkD  rt	        d      t        |      }t        t        |      j                                y# t        $ r(}t        d| t        j                         Y d }~yd }~wt        t        t        t        f$ r(}t        d| t        j                         Y d }~yd }~ww xY w)	Nr}  r   rN  ztimeout must be in (0, 1800]zFAIL: )file      )r  
parse_argsrm  r%  r4   ru  r>   rp  sysstderrOSError
ValueErrorKeyErrorrW   r  )argvrq  rn  r   s       r<   mainr    s    8t$D	99	!t||q'8DLL4<O >??d) 
/'
"
)
)
+,  sen3::.7J9 sen3::.s$   AB 	C1
B--C1	C,,C1__main__)rV   r   r0  bytes)rV   r   r0  rF   )r`   r   r0  rF   )r`   r   rp   rF   r0  r1  )r`   r   rp   rF   r0  ztuple[dict[str, object], str])rD   rB   r0  rB   )rC   rB   r0  rB   )r0  rF   )r   r   r0  r1  )r   r   r   r/  r0  rA   )r   rB   r   rB   r0  rF   )r   rB   r   rB   r0  rB   )r0  r   )r   r   r`   r   r0  r   )r   r  r0  zlist[tuple[int, int, str]])r0  rB   )r0  zdict[str, str])r`   r   rV   rB   r0  r1  )r   z
int | NonerV   rB   r0  r1  )r  rA   r0  rB   )r^  r   r0  rF   )rq  zargparse.Namespacer0  rB   )r0  zargparse.ArgumentParserrY   )r  zlist[str] | Noner0  r   )Sr9   
__future__r   r~  r   rZ   rR   rj   r   rf   structr  r  dataclassesr   pathlibr   typingr   r   r	   rJ   r   r   r   r   r   r   r   r   r   r   r   r    r"   r$   r%   r&   r'   r+   r,   r/   r   r  r  Structr   rn   ru   getattrr2   RuntimeErrorr4   r>   rA   rW   r]   ra   rr   rv   r   r   r   r   r   r   r   r   r   r   r  r  r:  r@  rI  rK  rU  r`  ru  r  r  r6   
SystemExitr:   r;   r<   <module>r     sV   I "     	    
  !  U	5 UQu QPe PU	5 UWU W/
E /T% T=e =%  %  %  %  b  bZ[ [ 9: 5 :: :%g8z/q 
 ef	5 f;} BD  u 
 
fRq)
2L 2&m & $) ) )r>9<<2&	M <@ )QX** < <~T
[	<:"  z
TV
 r;   