Ë
    6üéj\  ã                   ó’   — d Z ddlZddlZddlZddlmZmZ dZ ed«      Z ed«      Z	dZ
dZd	Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zy)zIOffline reference codec/validator, NOT an installable receiver or writer.é    N)ÚdatetimeÚtimezonezyachtmemory.signalk-catalog/2)ÚnumberÚstringÚbooleanÚpositionÚobjectÚarrayÚnullÚunknown)ÚpathÚobservationÚsourceé   éd   i @  c                 óT   — t        j                  | dddd¬«      j                  d«      S )NT)ú,ú:F)Ú	sort_keysÚ
separatorsÚensure_asciiÚ	allow_nanzutf-8)ÚjsonÚdumpsÚencode©Úobjs    úprotocol/catalog_v2.pyÚ	canonicalr      s&   € Ü�:‰:�c T°jÈuÐ`eÔf×mÑmÐnuÓvÐvó    c                 óZ   — t        j                  t        | «      «      j                  «       S ©N)ÚhashlibÚsha256r   Ú	hexdigestr   s    r   Údigestr&      s   € Ü�>‰>œ) C›.Ó)×3Ñ3Ó5Ð5r    c                 ód   — t        | t        «      xr dt        | «      cxk  xr |k  nc xr d| vS )Nr   ú )Ú
isinstanceÚstrÚlen)ÚsÚ	max_charss     r   Únonblankr.      s+   € Ü�aœÓÒM !¤c¨!£fÖ"9°	Ô"9ÒM¸fÈA¸oÐMr    c                 ó´  — t        | t        «      r| j                  d«      t        vrt	        d«      ‚| d   }|dk(  rÖt        | j                  d«      d«      r| j                  d«      t        vrt	        d«      ‚d| v r�| d   }t        |t        «      st	        d«      ‚d	D ]h  \  }}||v r#||   �t        ||   t        «      st	        d
«      ‚t        |j                  |«      t        «      sŒMt        ||   «      |kD  sŒ_t	        d«      ‚ || d   dfS |dk(  rLt        | j                  d«      d«      rt        | j                  d«      d«      st	        d«      ‚|| d   | d   fS t        | j                  d«      d«      st	        d«      ‚dD ]C  }| j                  |«      €Œt        | |   t        «      rt        | |   «      dkD  sŒ:t	        d«      ‚ || d   dfS )NÚkindzinvalid kindr   éÿ   Ú
value_typezinvalid path recordÚmetadatazinvalid path metadata))ÚunitséP   )ÚdisplayNamer1   )Údescriptioni   zinvalid metadata fieldzmetadata too longÚ r   r   zinvalid observationzinvalid source)ÚtypeÚlabelÚsrczinvalid source metadata)	r)   ÚdictÚgetÚKINDSÚ
ValueErrorr.   ÚTYPESr*   r+   )Úrr0   ÚmÚkeyÚlimits        r   Ú
record_keyrE      sÉ  € Ü�aœÔ !§%¡%¨£-´uÑ"<Ü˜Ó(Ð(ØˆV‰9€DØˆv‚~Ü˜Ÿ™˜f› sÔ+¨q¯u©u°\Ó/BÌ%Ñ/OÜÐ2Ó3Ð3Ø˜‰?Ø�*‘ˆAÜ˜a¤Ô&Ü Ð!8Ó9Ð9ØZò :‘
��UØ˜!‘8  #¡Ð 2¼:ÀaÈÁfÌcÔ;RÜ$Ð%=Ó>Ð>Ü˜aŸe™e C›j¬#Õ.´3°q¸±v³;ÀÓ3FÜ$Ð%8Ó9Ð9ð	:ð
 �a˜‘i Ð$Ð$Øˆ}ÒÜ˜Ÿ™˜f› sÔ+´8¸A¿E¹EÀ(»OÈSÔ3QÜÐ2Ó3Ð3Ø�a˜‘i  8¡Ð-Ð-Ü�A—E‘E˜(“O SÔ)ÜÐ)Ó*Ð*Ø'ò 8ˆØ�5‰5�‹:Ñ!¬:°a¸±f¼cÔ+BÄcÈ!ÈCÉ&ÃkÐTWÓFWÜÐ6Ó7Ð7ð8ð �!�H‘+˜rÐ"Ð"r    c                 ó   — t        «       }| D ]-  }t        |«      }||v rt        d«      ‚|j                  |«       Œ/ | D �ch c]  }|d   dk(  sŒ|d   ’Œ }}| D ]  }|d   dk(  sŒ|d   |vsŒt        d«      ‚ yc c}w )Nzduplicate recordr0   r   r   zobservation path missingT)ÚsetrE   r?   Úadd)ÚrecordsÚseenrA   rC   Úpathss        r   Úvalidate_recordsrL   8   s    € Ü‹5€DØò ˆÜ˜‹mˆØ�$‰;ÜÐ/Ó0Ð0Ø�‰��ð	ð
 !(Ö?˜1¨1¨V©9¸Ó+>ˆQˆv‹YÐ?€EÐ?Øò 9ˆØˆV‰9˜Ó%¨!¨F©)¸5Ò*@ÜÐ7Ó8Ð8ð9ð ùò	 @s   ÁA;ÁA;c                 óZ  — t        | t        «      r| j                  d«      st        d«      ‚	 t	        j
                  | j                  dd«      «      }|j                  «       t        j                  j                  d «      k7  rt        d«      ‚|S # t        $ r}t        d«      |‚d }~ww xY w)NÚZztimestamp must be UTC Zz+00:00zinvalid timestampzinvalid UTC)
r)   r*   Úendswithr?   r   ÚfromisoformatÚreplaceÚ	utcoffsetr   Úutc)r,   ÚdtÚexcs      r   Ú_utc_timestamprV   F   s‘   € Ü�aœÔ Q§Z¡Z°¤_ÜÐ2Ó3Ð3ð7Ü×#Ñ# A§I¡I¨c°8Ó$<Ó=ˆð 
‡|�|ƒ~œŸ™×/Ñ/°Ó5Ò5Ü˜Ó'Ð'Ø€Iøô	 ò 7ÜÐ,Ó-°3Ð6ûð7ús   ®%B Â	B*ÂB%Â%B*c                 óJ  — t        j                  | «       t        j                  |«       t        |«       t        |«      t        usd|cxk  rdk  st        d«      ‚ t        d«      ‚t        |«      t        usd|cxk  rt        k  st        d«      ‚ t        d«      ‚t        |t        ¬«      }t        |«       t        dt        |«      |«      D �cg c]
  }||||z    ‘Œ c}xs g g}t        |«      t        kD  rt        d«      ‚g }t        |«      D ]U  \  }}	d|	i}
t        t        |
«      «      t        kD  rt        d	«      ‚|j!                  t"        | ||||	t%        |
«      d
œ«       ŒW t"        | |||dddt        |«      t        |«      t%        d|i«      dœ}||fS c c}w )Né   l   ÿÿ zinvalid revisionúinvalid chunk size©rC   r   ztoo many chunksrI   zchunk exceeds size limit)ÚprotocolÚ	vessel_idÚsnapshot_idÚrevisionÚchunk_indexrI   Úpayload_sha256úcurrent-selected-sourcesúselected-onlyT)r[   r\   r]   r^   Údiscovered_at_utcÚscopeÚinventory_coverageÚtransport_completeÚchunk_countÚrecord_countÚdocument_sha256)ÚuuidÚUUIDrV   r9   Úintr?   ÚMAX_RECORDS_PER_CHUNKÚsortedrE   rL   Úranger+   Ú
MAX_CHUNKSÚ	enumerater   ÚMAX_CHUNK_BYTESÚappendÚPROTOCOLr&   )r\   r]   r^   Ú	timestamprI   Ú
chunk_sizeÚiÚpartsÚchunksÚpartÚbodyÚheaders               r   Úbuildr}   R   s¡  € Ü‡I�IˆiÔÜ‡I�IˆkÔÜ�9ÔÜˆHƒ~œSÑ ¨¨XÔ(@¸Ò(@ÜÐ+Ó,Ð,ð )AÜÐ+Ó,Ð,ÜˆJÓœsÑ"¨!¨zÔ*RÔ=RÒ*RÜÐ-Ó.Ð.ð +SÜÐ-Ó.Ð.Ü�W¤*Ô-€GÜ�WÔä.3°A´s¸7³|ÀZÓ.PÖQ¨ˆW�Q�q˜‘|Ò$ÒQÒYÐVXÐUY€EÜ
ˆ5ƒz”JÒÜÐ*Ó+Ð+Ø€FÜ˜UÓ#ò 8‰ˆˆ4Ø˜4Ð ˆÜŒy˜‹Ó¤/Ò1ÜÐ7Ó8Ð8Ø�‰¤8¸)ÐT_Ø#+¸AÈ$Ü)/°«ñ7õ 	8ð	8ô #°È;Ø"¸Ø1ÈØ$(¼¸V»Ü! '›l¼vÀyÐRYÐFZÓ?[ñ	]€Fð
 �6ˆ>Ðùò! Rs   ÃF c                 ó®  ‡ ‡
— d}‰ j                  d«      t        k7  s;‰ j                  d«      dk7  s'‰ j                  d«      dk7  s‰ j                  d«      durt        d	«      ‚t        j                  ‰ d
   «       t        j                  ‰ d   «       t        ‰ d   «       ‰ j                  d«      }t        |«      t        us*d|cxk  r	t        k  rn t        d«      ‚t        |«      |k  rt        d«      ‚i }|D �]  Š
t        ˆ
ˆ fd„|D «       «      rt        d«      ‚‰
j                  d«      }t        |«      t        us
|dk  s||k\  rt        d«      ‚||v r0t        ||   «      t        ‰
«      k7  rt        d«      ‚t        d«      ‚‰
j                  d«      }t        |t        «      rt        |«      t        kD  rt        d«      ‚d|i}t        t        |«      «      t        kD  st!        |«      ‰
j                  d«      k7  rt        d«      ‚‰
||<   �Œ t#        |«      D ��cg c]  }||   d   D ]  }|‘Œ Œ }	}}t        ‰ j                  d«      «      t        ust        |	«      ‰ d   k7  rt        d«      ‚|	t%        |	t&        ¬«      k7  rt        d«      ‚t)        |	«       t!        d|	i«      ‰ j                  d«      k7  rt        d «      ‚|	S c c}}w )!N)r[   r\   r]   r^   r[   rd   ra   re   rb   rf   Tz#invalid snapshot scope/completenessr\   r]   rc   rg   rX   zincomplete snapshotc              3   ód   •K  — | ]'  }‰j                  |«      ‰j                  |«      k7  –— Œ) y ­wr"   )r=   )Ú.0ÚkÚcr|   s     €€r   ú	<genexpr>zreconstruct.<locals>.<genexpr>|   s&   øè ø€ Ò;¨Qˆq�u‰u�Q‹x˜6Ÿ:™: a›=Õ(Ñ;ùs   ƒ-0zcross snapshot chunkr_   r   zinvalid chunk indexzconflicting chunkzduplicate chunkrI   rY   r`   zinvalid chunk hash or sizerh   zwrong record countrZ   znoncanonical record orderri   zdocument hash mismatch)r=   rt   r?   rj   rk   rV   r9   rl   rp   r+   Úanyr   r)   Úlistrm   rr   r&   ro   rn   rE   rL   )r|   ry   ÚrequiredÚnÚindexedrw   rz   r{   rA   rI   r‚   s   `         @r   Úreconstructr‰   p   sÆ  ù€ ØC€HØ‡z�z�*Ó¤Ò)¨V¯Z©Z¸Ó-@ÐD^Ò-^Ðbh×blÑblð  nBó  cCð  GVò  cVð  Z`÷  Zdñ  Zdð  eyó  Zzð  BFñ  ZFÜÐ>Ó?Ð?Ü‡I�Iˆf�[Ñ!Ô"Ü‡I�Iˆf�]Ñ#Ô$Ü�6Ð-Ñ.Ô/Ø�
‰
�=Ó!€AÜˆAƒw”cÑ  aÔ!5¬:Ô!5ÜÐ.Ó/Ð/ô :=¸V»ÀqºÜÐ.Ó/Ð/Ø€GØó ˆÜÔ;°(Ô;Ô;ÜÐ3Ó4Ð4Ø�E‰E�-Ó ˆÜ�‹7œ#Ñ  Q¢¨!¨qª&ÜÐ2Ó3Ð3Ø�‰<Ü˜ ™Ó$¬	°!«Ò4Ü Ð!4Ó5Ð5ÜÐ.Ó/Ð/Ø�u‰u�YÓˆÜ˜$¤Ô%¬¨T«Ô5JÒ)JÜÐ1Ó2Ð2Ø˜4Ð ˆÜŒy˜‹Ó¤/Ò1´V¸D³\ÀQÇUÁUÐK[ÓE\Ò5\ÜÐ9Ó:Ð:Øˆ�‹
ð!ô"   ›(×B�Q¨G°A©J°yÑ,AÒB qŠqÐBˆqÐB€GÑBÜˆF�J‰J�~Ó&Ó'¬sÑ2´c¸'³lÀfÈ^ÑF\Ò6\ÜÐ-Ó.Ð.Ø”&˜¤jÔ1Ò1ÜÐ4Ó5Ð5Ü�WÔÜˆy˜'Ð"Ó# v§z¡zÐ2CÓ'DÒDÜÐ1Ó2Ð2Ø€Nùó Cs   È&K)é2   )Ú__doc__r#   r   rj   r   r   rt   Ú	frozensetr@   r>   rp   rm   rr   r   r&   r.   rE   rL   rV   r}   r‰   © r    r   ú<module>rŽ      si   ðÙ OÛ Û Û ß 'à*€ÙÐcÓd€ÙÐ3Ó4€Ø€
ØÐ Ø€òwò6òNò#ò:ò	óó<$r    