§
    ]ö6i¡B ã                   ó~  — d dl Z d dlZd dlZd dlZd„ Z e¦   «          d dlmZ d dlmZ d dlmZ dddd	d
dddddddœZd„ Z	d„ Z
d„ Zd„ Zd„ ZddddddddddddœZd„ Z G d„ d ej        ¦  «        Z G d!„ d"e¦  «        Z G d#„ d$e¦  «        Z G d%„ d&e¦  «        Z G d'„ d(e¦  «        Z G d)„ d*e¦  «        Z G d+„ d,e¦  «        Z G d-„ d.ej        ¦  «        Z G d/„ d0e¦  «        Z G d1„ d2e¦  «        Z G d3„ d4e¦  «        Z G d5„ d6e¦  «        Z G d7„ d8e¦  «        Z G d9„ d:e¦  «        Z G d;„ d<e¦  «        Z G d=„ d>e¦  «        Z  G d?„ d@e¦  «        Z!e"dAk    �ràd dlmZ dBZ#dCZ$dDZ% ej&        e#¦  «        Z'e' (                    dEdFdGdH )                    e#¬I¦  «        ¬J¦  «         e' (                    dKe$dLdM¬N¦  «         e' (                    dOdPdQdR¬S¦  «         e' (                    dTdUdQdV¬S¦  «         e' (                    dWdXdQdY¬S¦  «         e' *                    ¦   «         Z+e+j,        se+j-        e+_,         ej.        e+¦  «        Z/ ej0        e+e#¦  «        Z1 e¦   «         Z2e2 3                    e/¦  «         e2j4        r<dZ„ Z5 ej6        e+d[e+j7        z   ¦  «        Z8 ej9        e+j,        e8e5e1d\d]g¬^¦  «         e8gZ:ng Z:e+j;        re:d_gz  Z:d`„ Z< ej6        e+e+j7        ¦  «        Z= ej9        e+j,        e=e<e1d\g da¢e:¬b¦  «         dc„ Z>g Z?e+j;        re?g dd¢z  Z? ej6        e+e%¦  «        Z@ ej9        e+j-        e@e>e1dee?e=g¬b¦  «         dS dS )fé    Nc                  óÜ  — t           j                             t          j        t          j        ¦   «         ¦  «        ¦  «        } t           j                             | d¦  «        }t           j                             t           j                             t           j         	                    |¦  «        ¦  «        ¦  «        }|t          j        vr"t          j                             d|¦  «         d S d S )Nz..r   )ÚosÚpathÚdirnameÚinspectÚgetfileÚcurrentframeÚjoinÚnormpathÚabspathÚrealpathÚsysÚinsert)ÚcurrentpathÚ
searchpaths     úz/home/metal/girl-os/anki/victor/victor-clad/victorEmitters/../../victor-clad/tools/message-buffers/emitters/CPP_emitter.pyÚ_modify_pathr      s¡   € Ý”'—/’/¥'¤/µ'Ô2FÑ2HÔ2HÑ"IÔ"IÑJÔJ€KÝ”—’˜k¨4Ñ0Ô0€JÝ”×!Ò!¥"¤'§/¢/µ"´'×2BÒ2BÀ:Ñ2NÔ2NÑ"OÔ"OÑPÔP€JØ�œÐ!Ð!ÝŒ�Š˜˜:Ñ&Ô&Ð&Ð&Ð&ð "Ð!ó    )Úast)Úclad)ÚemitterutilÚboolÚint8_tÚint16_tÚint32_tÚint64_tÚuint8_tÚuint16_tÚuint32_tÚuint64_tÚfloatÚdouble)r   Úint_8Úint_16Úint_32Úint_64Úuint_8Úuint_16Úuint_32Úuint_64Úfloat_32Úfloat_64c                 óÖ  — t          | t          j        ¦  «        rG| j        t          vr't          d                     | j        ¦  «        ¦  «        ‚t          | j                 S t          | t          j        ¦  «        rdS t          | t          j        ¦  «        st          | t          j	        ¦  «        �r$t          | j
        t          j        ¦  «        sMt          | j
        t          j        ¦  «        st          | j
        t          j	        ¦  «        rt          d¦  «        ‚t          | t          j        ¦  «        r(d                     t          | j
        ¦  «        ¬¦  «        S t          | j        t          ¦  «        r.d                     t          | j
        ¦  «        | j        ¬¦  «        S d                     t          | j
        ¦  «        | j        ¬¦  «        S |                      ¦   «         S )	Nú;Error: {0} was expected to be a primitive type, but is not.zstd::stringú*Error: Arrays of arrays are not supported.zstd::vector<{member_type}>©Úmember_typez8std::array<{member_type}, static_cast<size_t>({length})>©r1   Úlengthz#std::array<{member_type}, {length}>)Ú
isinstancer   ÚBuiltinTypeÚnameÚ_type_translationsÚ
ValueErrorÚformatÚPascalStringTypeÚVariableArrayTypeÚFixedArrayTyper1   Úcpp_value_typer3   ÚstrÚfully_qualified_name©Útypes    r   r=   r=   3   s¼  € Ý�$�œÑ(Ô(ð +ØŒyÕ.Ð.Ð.ÝÐZ×aÒaÐbfÔbkÑlÔlÑmÔmÐmÝ! $¤)Ô,Ð,Ý	�D�#Ô.Ñ	/Ô	/ð +Øˆ}Ý	�D�#Ô/Ñ	0Ô	0ð +µJ¸tÅSÔEWÑ4XÔ4Xñ +Ý˜4Ô+­SÔ-AÑBÔBð 	(Ý˜DÔ,­cÔ.CÑDÔDð	(å˜4Ô+­SÔ-?Ñ@Ô@ð	(õ ÐIÑJÔJÐJÝ˜�cÔ3Ñ4Ô4ð 	(Ø/×6Ò6Ý*¨4Ô+;Ñ<Ô<ð 7ñ >ô >ð >õ ˜$œ+¥sÑ+Ô+ð (ØR×YÒYÝ .¨tÔ/?Ñ @Ô @Øœ;ð Zñ (ô (ð (ð =×CÒCÝ .¨tÔ/?Ñ @Ô @Øœ;ð Dñ (ô (ð (ð ×(Ò(Ñ*Ô*Ð*r   c                 ó*  — t          | t          j        ¦  «        rG| j        t          vr't          d                     | j        ¦  «        ¦  «        ‚t          | j                 S t          | t          j        ¦  «        rdS t          | t          j        ¦  «        st          | t          j	        ¦  «        rÜt          | j
        t          j        ¦  «        sMt          | j
        t          j        ¦  «        st          | j
        t          j	        ¦  «        rt          d¦  «        ‚t          | t          j        ¦  «        r(d                     t          | j
        ¦  «        ¬¦  «        S d                     t          | j
        ¦  «        | j        ¬¦  «        S | j        S )Nr.   Úbasic_stringr/   zvector<{member_type}>r0   zarray<{member_type}, {length}>r2   )r4   r   r5   r6   r7   r8   r9   r:   r;   r<   r1   r=   r3   r@   s    r   Úcpp_value_type_destructorrD   N   sj  € Ý�$�œÑ(Ô(ð ØŒyÕ.Ð.Ð.ÝÐZ×aÒaÐbfÔbkÑlÔlÑmÔmÐmÝ! $¤)Ô,Ð,Ý	�D�#Ô.Ñ	/Ô	/ð Øˆ~Ý	�D�#Ô/Ñ	0Ô	0ð µJ¸tÅSÔEWÑ4XÔ4Xð Ý˜4Ô+­SÔ-AÑBÔBð 
	$Ý˜DÔ,­cÔ.CÑDÔDð
	$å˜4Ô+­SÔ-?Ñ@Ô@ð
	$õ ÐIÑJÔJÐJÝ˜�cÔ3Ñ4Ô4ð 	$Ø*×1Ò1Ý*¨4Ô+;Ñ<Ô<ð 2ñ >ô >ð >ð 4×:Ò:Ý*¨4Ô+;Ñ<Ô<Ø”{ð ;ñ $ô $ð $ð ŒyÐr   c                 ój   — t          | t          j        ¦  «        pt          | t          j        ¦  «        S ©N)r4   r   r5   ÚDefinedTyper@   s    r   Úis_trivial_typerH   d   s%   € Ý�d�CœOÑ,Ô,ÐQµ
¸4ÅÄÑ0QÔ0QÐQr   c                 ó    — t          | ¦  «        S rF   )rH   r@   s    r   Úis_pass_by_valuerJ   g   s   € Ý˜4Ñ Ô Ð r   c                 ó„   — t          | ¦  «        rt          | ¦  «        S d                     t          | ¦  «        ¬¦  «        S )Nzconst {value_type}&)Ú
value_type)rJ   r=   r9   r@   s    r   Úcpp_parameter_typerM   j   s@   € Ý˜ÑÔð MÝ˜dÑ#Ô#Ð#à$×+Ò+µ~ÀdÑ7KÔ7KÐ+ÑLÔLÐLr   zasBool()zasInt()z	asInt64()zasUInt()z
asUInt64()z	asFloat()z
asDouble()c                 ó   — t          | t          j        ¦  «        rG| j        t          vr't          d                     | j        ¦  «        ¦  «        ‚t          | j                 S t          | t          j        ¦  «        rdS d S )Nr.   z
asString())r4   r   r5   r6   Ú_jsoncpp_as_method_translationsr8   r9   r:   r@   s    r   Újsoncpp_as_methodrP   ~   sq   € Ý�$�œÑ(Ô(ð ØŒyÕ;Ð;Ð;ÝÐZ×aÒaÐbfÔbkÑlÔlÑmÔmÐmÝ.¨t¬yÔ9Ð9Ý	�D�#Ô.Ñ	/Ô	/ð Øˆ|àˆtr   c                   ó.   — e Zd ZdZej        dfd„Zd„ ZdS )ÚBaseEmitterzBase class for emitters.Nc                 ó"   — || _         || _        d S rF   )ÚoutputÚoptions)ÚselfrT   rU   s      r   Ú__init__zBaseEmitter.__init__‹   s   € ØˆŒØˆŒˆˆr   c                 ó   — d S rF   © ©rV   ÚnodeÚargsÚkwargss       r   Úvisit_IncludeDeclzBaseEmitter.visit_IncludeDecl�   ó   € Øˆr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚstdoutrW   r^   rY   r   r   rR   rR   ˆ   sD   € € € € € ØÐà!œj°$ð ð ð ð ð
ð ð ð ð r   rR   c                   ó8   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	ÚHNamespaceEmitterc                 ó<  — d}|                      ¦   «         D ]f\  }}|r4t          |t          j        ¦  «        s| j                             d¦  «          | j        |g|¢R i |¤Ž t          |t          j        ¦  «        }Œg|r| j                             d¦  «         d S d S )NFú
)Úchildrenr4   r   ÚIncludeDeclrT   ÚwriteÚvisit)rV   r[   r\   r]   Úlast_was_includeÚc_nameÚcs          r   Úvisit_DeclListz HNamespaceEmitter.visit_DeclList•   s¹   € Ø ÐØŸš™œð 	>ð 	>‰IˆF�AØð (­
°1µc´oÑ(FÔ(Fð (Ø”×!Ò! $Ñ'Ô'Ð'ØˆDŒJ�qÐ*˜4Ð*Ð*Ð* 6Ð*Ð*Ð*Ý)¨!­S¬_Ñ=Ô=ÐÐØð 	$ØŒK×Ò˜dÑ#Ô#Ð#Ð#Ð#ð	$ð 	$r   c                 ó¨   — t          j        |j        | j        j        ¦  «        }| j                             d                     |¦  «        ¦  «         d S )Nz#include "{0}"
)r   Úget_included_filer6   rU   Úheader_output_extensionrT   rk   r9   )rV   r[   r\   r]   Únew_header_file_names        r   r^   z#HNamespaceEmitter.visit_IncludeDeclŸ   sH   € Ý*Ô<¸T¼YÈÌÔHlÑmÔmÐØŒ×ÒÐ,×3Ò3Ð4HÑIÔIÑJÔJÐJÐJÐJr   c                 óô   — | j                              d                     |j        ¬¦  «        ¦  «          | j        |g|¢R i |¤Ž | j                              d                     |j        ¬¦  «        ¦  «         d S ©Nznamespace {namespace_name} {{

)Únamespace_namez"}} // namespace {namespace_name}

)rT   rk   r9   r6   Úgeneric_visitrZ   s       r   Úvisit_NamespaceDeclz%HNamespaceEmitter.visit_NamespaceDecl£   sƒ   € ØŒ×ÒÐ=×DÒDÐTXÔT]ÐDÑ^Ô^Ñ_Ô_Ð_ØˆÔ˜4Ð1 $Ð1Ð1Ð1¨&Ð1Ð1Ð1ØŒ×ÒÐ@×GÒGÐW[ÔW`ÐGÑaÔaÑbÔbÐbÐbÐbr   c                 óX   —  t          | j        | j        ¦  «        j        |g|¢R i |¤Ž d S rF   )ÚHEnumEmitterrT   rU   rl   rZ   s       r   Úvisit_EnumDeclz HNamespaceEmitter.visit_EnumDecl¨   s9   € Ø5��T”[ $¤,Ñ/Ô/Ô5°dÐL¸TÐLÐLÐLÀVÐLÐLÐLÐLÐLr   c                 óX   —  t          | j        | j        ¦  «        j        |g|¢R i |¤Ž d S rF   )ÚHStructEmitterrT   rU   rl   rZ   s       r   Úvisit_MessageDeclz#HNamespaceEmitter.visit_MessageDecl«   ó9   € Ø7��t”{ D¤LÑ1Ô1Ô7¸ÐN¸tÐNÐNÐNÀvÐNÐNÐNÐNÐNr   c                 óX   —  t          | j        | j        ¦  «        j        |g|¢R i |¤Ž d S rF   )ÚHUnionEmitterrT   rU   rl   rZ   s       r   Úvisit_UnionDeclz!HNamespaceEmitter.visit_UnionDecl®   s9   € Ø6��d”k 4¤<Ñ0Ô0Ô6°tÐM¸dÐMÐMÐMÀfÐMÐMÐMÐMÐMr   c                 óX   —  t          | j        | j        ¦  «        j        |g|¢R i |¤Ž d S rF   )ÚHEnumConceptEmitterrT   rU   rl   ©rV   r[   r\   Úkargss       r   Úvisit_EnumConceptDeclz'HNamespaceEmitter.visit_EnumConceptDecl±   s:   € Ø<Õ˜DœK¨¬Ñ6Ô6Ô<¸TÐRÀDÐRÐRÐRÈEÐRÐRÐRÐRÐRr   N)
r`   ra   rb   rp   r^   ry   r|   r   rƒ   rˆ   rY   r   r   rf   rf   “   s‘   € € € € € ð$ð $ð $ðKð Kð Kðcð cð cð
Mð Mð MðOð Oð OðNð Nð NðSð Sð Sð Sð Sr   rf   c                   ó,   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚCPPNamespaceEmitterc                 ó   — d S rF   rY   rZ   s       r   r^   z%CPPNamespaceEmitter.visit_IncludeDecl¶   r_   r   c                 óX   —  t          | j        | j        ¦  «        j        |g|¢R i |¤Ž d S rF   )ÚCPPEnumEmitterrT   rU   rl   rZ   s       r   r|   z"CPPNamespaceEmitter.visit_EnumDecl¹   r€   r   c                 óX   —  t          | j        | j        ¦  «        j        |g|¢R i |¤Ž d S rF   )ÚCPPStructEmitterrT   rU   rl   rZ   s       r   r   z%CPPNamespaceEmitter.visit_MessageDecl¼   s:   € Ø9Õ˜œ d¤lÑ3Ô3Ô9¸$ÐPÀÐPÐPÐPÈÐPÐPÐPÐPÐPr   c                 óX   —  t          | j        | j        ¦  «        j        |g|¢R i |¤Ž d S rF   )ÚCPPUnionEmitterrT   rU   rl   rZ   s       r   rƒ   z#CPPNamespaceEmitter.visit_UnionDecl¿   s9   € Ø8�˜œ T¤\Ñ2Ô2Ô8¸ÐOÀÐOÐOÐOÈÐOÐOÐOÐOÐOr   c                 óX   —  t          | j        | j        ¦  «        j        |g|¢R i |¤Ž d S rF   )ÚCPPEnumConceptEmitterrT   rU   rl   r†   s       r   rˆ   z)CPPNamespaceEmitter.visit_EnumConceptDeclÂ   s:   € Ø>Õ˜dœk¨4¬<Ñ8Ô8Ô>¸tÐTÀdÐTÐTÐTÈeÐTÐTÐTÐTÐTr   N)r`   ra   rb   r^   r|   r   rƒ   rˆ   rY   r   r   rŠ   rŠ   ´   sm   € € € € € ðð ð ðOð Oð OðQð Qð QðPð Pð PðUð Uð Uð Uð Ur   rŠ   c                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )r{   c                 ód  — t          |j        |j        t          |j                             ¦   «         ¦  «        d¬¦  «        }|                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |  	                    ||¦  «         |  
                    ||¦  «         d S ©Nr   )Ú	enum_nameÚ	enum_hashÚenum_storage_typeÚenum_member_count)Údictr6   Úhash_strr=   Ústorage_typeÚbuiltin_typeÚ
emitPrefixÚ
emitHeaderÚemitMembersÚ
emitFooterÚ
emitSuffix©rV   r[   Úglobalss      r   r|   zHEnumEmitter.visit_EnumDeclÇ   s«   € ÝØ”iØ”mÝ,¨TÔ->×-KÒ-KÑ-MÔ-MÑNÔNØð	
ñ 
ô 
ˆð 	�Š˜˜gÑ&Ô&Ð&Ø�Š˜˜gÑ&Ô&Ð&Ø×Ò˜˜wÑ'Ô'Ð'Ø�Š˜˜gÑ&Ô&Ð&Ø�Š˜˜gÑ&Ô&Ð&Ð&Ð&r   c                 óz   — | j         j        r.| j                             t	          j        d¦  «        ¦  «         d S d S )Nz¤            #ifndef CLAD_CPP_WARN_UNUSED_RESULT
            #define CLAD_CPP_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
            #endif

            )rU   ÚemitJSONrT   rk   ÚtextwrapÚdedentr¤   s      r   rŸ   zHEnumEmitter.emitPrefixÕ   sP   € ØŒ<Ô ð 	àŒK×Ò�hœoð /ñ ô ñ ô ð ð ð ð	ð 	r   c                 óô   — |j         r9| j                              t          j        d¦  «        j        di |¤Ž¦  «         d S | j                              t          j        d¦  «        j        di |¤Ž¦  «         d S )Nzt                // ENUM {enum_name}
                enum class {enum_name} : {enum_storage_type} {{
                zn                // ENUM {enum_name}
                enum {enum_name} : {enum_storage_type} {{
                rY   )Ú	cpp_classrT   rk   r¨   r©   r9   r¤   s      r   r    zHEnumEmitter.emitHeaderß   sÂ   € ØŒNð 		)ØŒK×Òð �hœoð /ñ ô ô ð'ð 'ð &ð'ð 'ñ (ô (ð (ð (ð (ð
 ŒK×Òð �hœoð /ñ ô ô ð'ð 'ð &ð'ð 'ñ (ô (ð (ð (ð (r   c                 ó:   — | j                              d¦  «         d S )Nú};

©rT   rk   r¤   s      r   r¢   zHEnumEmitter.emitFooterì   s   € ØŒ×Ò˜(Ñ#Ô#Ð#Ð#Ð#r   c                 óÞ  — d|d<   | j                              d¦  «        5  |                     ¦   «         r g }|                     ¦   «         D ]o}d                     |j        ¬¦  «        }d                     t          |j        ¦  «        ¬¦  «        }d}|dxx         dz  cc<   |                     |||f¦  «         Œp| j                              |¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )	Nr   rš   é   ú{member_name}©Úmember_nameú = {initializer},©ÚinitializerÚ )	rT   ÚindentÚmembersr9   r6   r>   ÚvalueÚappendÚwrite_with_aligned_whitespace)rV   r[   r¥   ÚpiecesÚmemberÚstartÚmiddleÚends           r   r¡   zHEnumEmitter.emitMembersï   sT  € Ø'(ˆÐ#Ñ$ØŒ[×Ò Ñ"Ô"ð 	Bð 	BØ�|Š|‰~Œ~ð 
BØ�Ø"Ÿlšl™nœnð 8ð 8�FØ+×2Ò2¸v¼{Ð2ÑKÔK�EØ0×7Ò7ÅCÈÌÑDUÔDUÐ7ÑVÔV�FØ�CØÐ/Ð0Ð0Ô0°AÑ5Ð0Ð0Ñ0à—M’M 5¨&°#Ð"6Ñ7Ô7Ð7Ð7à”×9Ò9¸&ÑAÔAÐAð	Bð 	Bð 	Bñ 	Bô 	Bð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bøøøð 	Bð 	Bð 	Bð 	Bð 	Bð 	Bs    B5C"Ã"C&Ã)C&c                 óŽ  — | j                               dj        d
i |¤Ž¦  «         | j                               dj        d
i |¤Ž¦  «         | j        j        re| j                              d¦  «         | j                               dj        d
i |¤Ž¦  «         | j                               dj        d
i |¤Ž¦  «         n| j                              d¦  «         | j                               dj        d
i |¤Ž¦  «         | j                               dj        d
i |¤Ž¦  «         | j                               d	j        d
i |¤Ž¦  «         d S )Nz/const char* EnumToString(const {enum_name} m);
z[inline const char* {enum_name}ToString(const {enum_name} m) {{ return EnumToString(m); }}

zmtemplate<typename T>
CLAD_CPP_WARN_UNUSED_RESULT bool EnumFromString(const std::string& str, T& enumOutput);
zjCLAD_CPP_WARN_UNUSED_RESULT bool {enum_name}FromString(const std::string& str, {enum_name}& enumOutput);

z8{enum_name} {enum_name}FromString(const std::string&);

rh   z.extern const char* {enum_name}VersionHashStr;
z2extern const uint8_t {enum_name}VersionHash[16];

zLconstexpr {enum_storage_type} {enum_name}NumEntries = {enum_member_count};

rY   )rT   rk   r9   rU   r§   r¤   s      r   r£   zHEnumEmitter.emitSuffixþ   sÆ  € ØŒ×ÒÐSÐLÔSÐ^Ð^ÐV]Ð^Ð^Ñ_Ô_Ð_ØŒ×Òð  AÐyô  Að  Lð  Lð  DKð  Lð  Lñ  	Mô  	Mð  	MØŒ<Ô ð 	$ØŒK×Òð  Pñ  Qô  Qð  QØŒK×Òð  Tð  Mô  Tð  _ð  _ð  W^ð  _ð  _ñ  `ô  `ð  `ØŒK×ÒÐaÐZÔaÐlÐlÐdkÐlÐlÑmÔmÐmÐmàŒK×Ò˜dÑ#Ô#Ð#ØŒ×ÒÐRÐKÔRÐ]Ð]ÐU\Ð]Ð]Ñ^Ô^Ð^ØŒ×ÒÐWÐPÔWÐbÐbÐZaÐbÐbÑcÔcÐcØŒ×ÒÐqÐjÔqÐ|Ð|Ðt{Ð|Ð|Ñ}Ô}Ð}Ð}Ð}r   N)	r`   ra   rb   r|   rŸ   r    r¢   r¡   r£   rY   r   r   r{   r{   Å   sv   € € € € € ð'ð 'ð 'ðð ð ð
)ð 
)ð 
)ð$ð $ð $ðBð Bð Bð~ð ~ð ~ð ~ð ~r   r{   c                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )r�   c                 ó|  — t          |j        |j        t          |j                             ¦   «         ¦  «        d¬¦  «        }|                      ||¦  «         |                      ||¦  «         |                      ||¦  «         | j	        j
        r|                      ||¦  «         |                      ||¦  «         d S r–   )r›   r6   rœ   r=   r�   rž   ÚemitToStringHeaderÚemitToStringMembersÚemitToStringFooterrU   r§   ÚemitStringToEnumr£   r¤   s      r   r|   zCPPEnumEmitter.visit_EnumDecl  s¾   € ÝØ”iØ”mÝ,¨TÔ->×-KÒ-KÑ-MÔ-MÑNÔNØð	
ñ 
ô 
ˆð 	×Ò  gÑ.Ô.Ð.Ø× Ò   wÑ/Ô/Ð/Ø×Ò  gÑ.Ô.Ð.ØŒ<Ô ð 	1Ø×!Ò! $¨Ñ0Ô0Ð0Ø�Š˜˜gÑ&Ô&Ð&Ð&Ð&r   c                 ót   — | j                               t          j        d¦  «        j        di |¤Ž¦  «         d S )Nzo            const char* EnumToString(const {enum_name} m)
            {{
            	switch(m) {{
            rY   ©rT   rk   r¨   r©   r9   r¤   s      r   rÅ   z!CPPEnumEmitter.emitToStringHeader  ó\   € ØŒ×Òð �(œ/ð +ñ ô ô ð	#ð #ð "ð	#ð #ñ 	$ô 	$ð 	$ð 	$ð 	$r   c                 ó^   — | j                              t          j        d¦  «        ¦  «         d S )Nzn            		default: return nullptr;
            	}
            	return nullptr;
            }

            ©rT   rk   r¨   r©   r¤   s      r   rÇ   z!CPPEnumEmitter.emitToStringFooter#  s9   € ØŒ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð 	ð 	r   c           	      óP  — d|d<   | j                              d¦  «        5  |                     ¦   «         D ]W}|dxx         dz  cc<   |j        s>| j                               t          j        d¦  «        j        dd|j        i|¤Ž¦  «         ŒX	 d d d ¦  «         d S # 1 swxY w Y   d S )Nr   rš   é   r°   z‚                        case {enum_name}::{member_name}:
                        	return "{member_name}";
                        r³   rY   )	rT   r¸   r¹   Úis_duplicaterk   r¨   r©   r9   r6   ©rV   r[   r¥   r¾   s       r   rÆ   z"CPPEnumEmitter.emitToStringMembers,  sJ  € Ø'(ˆÐ#Ñ$ØŒ[×Ò Ñ"Ô"ð 	Ið 	IØŸ,š,™.œ.ð Ið I�ØÐ+Ð,Ð,Ô,°Ñ1Ð,Ð,Ñ,ØÔ*ð IØ”K×%Ò%ð '$¥h¤oð 7ñ 'ô 'ô $ð'Hð 'Hð 17´ð'Hð @Gð'Hð 'Hñ Iô Ið IøðIð	Ið 	Ið 	Iñ 	Iô 	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	Ið 	Iøøøð 	Ið 	Ið 	Ið 	Ið 	Ið 	Is    A-BÂBÂ"Bc           
      óà  — | j                               t          j        d¦  «        j        ddt          |                     ¦   «         ¦  «        i|¤Ž¦  «         | j                              d¦  «        5  | j                               dj        di |¤Ž¦  «         |                     ¦   «         D ].}| j                               dj        dd|j        i|¤Ž¦  «         Œ/| j                              d¦  «         | j                               t          j        d¦  «        j        di |¤Ž¦  «         d d d ¦  «         n# 1 swxY w Y   | j                              d	¦  «         | j                               t          j        d
¦  «        j        di |¤Ž¦  «         | j                               t          j        d¦  «        j        di |¤Ž¦  «         | j                              d¦  «        5  | j                               t          j        d¦  «        j        dd|                     ¦   «         d         j        i|¤Ž¦  «         d d d ¦  «         n# 1 swxY w Y   | j                              d	¦  «         d S )Nzƒ            template<>
            bool EnumFromString(const std::string& str, {enum_name}& enumOutput)
            {{
            Ú
num_valuesr°   zOstatic const std::unordered_map<std::string, {enum_name}> stringToEnumMap = {{
z2	{{"{member_name}", {enum_name}::{member_name}}},
r³   r­   zî                auto it = stringToEnumMap.find(str);
                if(it == stringToEnumMap.end()) {{
                  return false;
                }}

                enumOutput = it->second;
                return true;
            ú}

z¥        bool {enum_name}FromString(const std::string& str, {enum_name}& enumOutput)
        {{
          return EnumFromString(str, enumOutput);
        }}

        zU        {enum_name} {enum_name}FromString(const std::string& str)
        {{
        aÖ              {enum_name} returnVal;
            if( !EnumFromString(str, returnVal) ) {{
              #ifndef NDEBUG
              std::cerr << "error: string '" << str << "' is not a valid {enum_name} value" << std::endl;
              #endif // NDEBUG
              assert(false && "string must be a valid {enum_name} value");
              return {enum_name}::{first_val};
            }}
            else {{
              return returnVal;
            }}
            Ú	first_valr   rY   )	rT   rk   r¨   r©   r9   Úlenr¹   r¸   r6   rÑ   s       r   rÈ   zCPPEnumEmitter.emitStringToEnum7  sÆ  € ØŒ×Òð �(œ/ð +ñ ô ô ð	Cð Cõ $' t§|¢|¡~¤~Ñ#6Ô#6ð	Cð ;Bð	Cð Cñ 	Dô 	Dð 	Dð Œ[×Ò Ñ"Ô"ð 	$ð 	$ØŒK×ÒÐwÐpÔwð  Cð  Cð  {Bð  Cð  Cñ  Dô  Dð  DØŸ,š,™.œ.ð Eð E�Ø”×!Ò!Ð"_Ð"XÔ"_ð  #Dð  #DÐlrÔlwð  #Dð  |Cð  #Dð  #Dñ  Eô  Eð  Eð  EØŒK×Ò˜hÑ'Ô'Ð'àŒK×Òð �hœoð /ñ ô ô ð#ð #ð "ð#ð #ñ $ô $ð $ð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð  	Œ×Ò˜'Ñ"Ô"Ð"àŒ×Òð �(œ/ð +ñ ô ô ðð ð ðð ñ 	 ô 	 ð 	 ð 	Œ×Òð �(œ/ð +ñ ô ô ðð ð ðð ñ 	 ô 	 ð 	 ð
 Œ[×Ò Ñ"Ô"ð 	Fð 	FØŒK×Òð �hœoð /ñ ô ô ðEð Eð #'§,¢,¡.¤.°Ô"3Ô"8ðEð =DðEð Eñ Fô Fð Fð	Fð 	Fð 	Fñ 	Fô 	Fð 	Fð 	Fð 	Fð 	Fð 	Fð 	Føøøð 	Fð 	Fð 	Fð 	Fð 	Œ×Ò˜'Ñ"Ô"Ð"Ð"Ð"s&   Á3B:D9Ä9D=Å D=Ç&AI	É	IÉIc           	      ó>  — | j                               dj        di |¤Ž¦  «         | j                               dj        di |¤Ž¦  «         t          j        |d         ¦  «        }| j                              d¦  «        5  t          |¦  «        D ][\  }}d}|t          |¦  «        dz
  k    rd}| j                              d                     t          |¦  «        |¬	¦  «        ¦  «         Œ\	 d d d ¦  «         n# 1 swxY w Y   | j                              d
¦  «         d S )Nz8const char* {enum_name}VersionHashStr = "{enum_hash}";

z/const uint8_t {enum_name}VersionHash[16] = {{ 
r˜   rÏ   ú,r°   r·   ú{hex_byte}{separator} ©Úhex_byteÚ	separatorú
};

rY   ©	rT   rk   r9   r   Údecode_hex_stringr¸   Ú	enumeraterÖ   Úhex©rV   r[   r¥   Úhex_dataÚiÚbyterÜ   s          r   r£   zCPPEnumEmitter.emitSuffixo  s•  € ØŒ×ÒÐ]ÐVÔ]ÐhÐhÐ`gÐhÐhÑiÔiÐiØŒ×ÒÐSÐLÔSÐ^Ð^ÐV]Ð^Ð^Ñ_Ô_Ð_ÝÔ0°¸Ô1EÑFÔFˆØŒ[×Ò Ñ"Ô"ð 	Xð 	XÝ$ XÑ.Ô.ð Xð X‘��4Ø�	Ø�˜X™œ¨Ñ*Ò+Ð+Ø "�IØ”×!Ò!Ð":×"AÒ"AÍ3ÈtÉ9Ì9ØLUð #Bñ #Wô #Wñ Xô Xð Xð Xð	Xð	Xð 	Xð 	Xñ 	Xô 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xøøøð 	Xð 	Xð 	Xð 	Xð 	Œ×Ò˜*Ñ%Ô%Ð%Ð%Ð%s   Á?A,C8Ã8C<Ã?C<N)	r`   ra   rb   r|   rÅ   rÇ   rÆ   rÈ   r£   rY   r   r   r�   r�     sr   € € € € € ð'ð 'ð 'ð$ð $ð $ðð ð ð	Ið 	Ið 	Ið5#ð 5#ð 5#ðp&ð &ð &ð &ð &r   r�   c                   óZ   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ ZdS )r~   r°   c                 óž  — t          |j        |j        |                     ¦   «                              ¦   «         ¬¦  «        }|                      ||¦  «         | j                             | j        ¦  «        5  |  	                    ||¦  «         |  
                    ||¦  «         |                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |                     ¦   «         dk    r"| j        j        r|                      ||¦  «         |                     ¦   «         dk    r=| j        j        r1|j        r*t)          j        |¦  «        r|                      ||¦  «         d d d ¦  «         n# 1 swxY w Y   |                      ||¦  «         d S )N)Úmessage_nameÚmessage_hashÚobject_typeÚ	structure)r›   r6   rœ   rê   Úupperr    rT   r¸   Úbody_indentr¡   ÚemitConstructorsÚemitPackÚ
emitUnpackÚemitSizeÚemitEqualityÚ
emitInvokerU   ÚemitPropertiesr§   Údefault_constructorr   Ú(_do_all_members_have_default_constructorÚemitJSONSerializerr¢   r¤   s      r   r   z HStructEmitter.visit_MessageDecl€  sþ  € åØœØœØ×(Ò(Ñ*Ô*×0Ò0Ñ2Ô2ð
ñ 
ô 
ˆð 	�Š˜˜gÑ&Ô&Ð&ØŒ[×Ò Ô 0Ñ1Ô1ð 	;ð 	;Ø×Ò˜T 7Ñ+Ô+Ð+Ø×!Ò! $¨Ñ0Ô0Ð0Ø�MŠM˜$ Ñ(Ô(Ð(Ø�OŠO˜D 'Ñ*Ô*Ð*Ø�MŠM˜$ Ñ(Ô(Ð(Ø×Ò˜d GÑ,Ô,Ð,Ø�OŠO˜D 'Ñ*Ô*Ð*Ø×ÒÑ!Ô! [Ò0Ð0°T´\Ô5PÐ0Ø×#Ò# D¨'Ñ2Ô2Ð2à×ÒÑ!Ô! [Ò0Ð0à”\Ô*ð ;ØÔ-ð;å ÔIÈ$ÑOÔOð;ð ×+Ò+¨D°'Ñ:Ô:Ð:ð!	;ð 	;ð 	;ñ 	;ô 	;ð 	;ð 	;ð 	;ð 	;ð 	;ð 	;øøøð 	;ð 	;ð 	;ð 	;ð$ 	�Š˜˜gÑ&Ô&Ð&Ð&Ð&s   Á6D*F,Æ,F0Æ3F0c                 ót   — | j                               t          j        d¦  «        j        di |¤Ž¦  «         d S )Nzi            // {object_type} {message_name}
            struct {message_name}
            {{
            rY   rÊ   r¤   s      r   r    zHStructEmitter.emitHeader�  rË   r   c                 óÎ   — | j                              d¦  «         | j                               dj        di |¤Ž¦  «         | j                               dj        di |¤Ž¦  «         d S )Nr­   z1extern const char* {message_name}VersionHashStr;
z5extern const uint8_t {message_name}VersionHash[16];

rY   ©rT   rk   r9   r¤   s      r   r¢   zHStructEmitter.emitFooter¤  sv   € ØŒ×Ò˜(Ñ#Ô#Ð#ØŒ×ÒÐUÐNÔUÐ`Ð`ÐX_Ð`Ð`ÑaÔaÐaØŒ×ÒÐZÐSÔZÐeÐeÐ]dÐeÐeÑfÔfÐfÐfÐfr   c                 óÞ  — |                      ¦   «         D ]½}| j                             d                     t	          |j        ¦  «        |j        ¬¦  «        ¦  «         |j        rT|j        }|j        }|j        dk    rt          |¦  «        nt          |¦  «        }| j                             d|z  ¦  «         | j                             d¦  «         Œ¾| j                             d¦  «         d S )Nú{member_type} {member_name}©r1   r³   rá   z = %sz;
rh   )r¹   rT   rk   r9   r=   rA   r6   Úinitrº   rá   r>   )rV   r[   r¥   r¾   Úinitial_valueÚ
member_valÚ
member_strs          r   r¡   zHStructEmitter.emitMembers©  sï   € Ø—l’l‘n”nð 		%ð 		%ˆFØŒK×ÒÐ;×BÒBÝ*¨6¬;Ñ7Ô7Ø"œKð Cñ )ô )ñ *ô *ð *ð Œ{ð 8Ø &¤�Ø*Ô0�
Ø0=Ô0BÀeÒ0KÐ0K�S ™_œ_˜_ÕQTÐU_ÑQ`ÔQ`�
Ø”×!Ò! '¨JÑ"6Ñ7Ô7Ð7ØŒK×Ò˜eÑ$Ô$Ð$Ð$àŒ×Ò˜$ÑÔÐÐÐr   c                 óæ   — d                      d„ |                     ¦   «         D ¦   «         ¦  «        }| j                             t	          j        d                     |¦  «        ¦  «        ¦  «         d S )Nz, c                 ó   — g | ]	}|j         ‘Œ
S rY   )r6   )Ú.0Úms     r   ú
<listcomp>z-HStructEmitter.emitInvoke.<locals>.<listcomp>¸  s   € Ð>Ð>Ð>¨!˜qœvÐ>Ð>Ð>r   z‘
            template <typename Callable>
            void Invoke(Callable&& func) const {{
               func({0});
            }}
            )r
   r¹   rT   rk   r¨   r©   r9   )rV   r[   r¥   Ú	paramsStrs       r   ró   zHStructEmitter.emitInvoke·  sp   € Ø—I’IÐ>Ð>¨t¯|ª|©~¬~Ð>Ñ>Ô>Ñ?Ô?ˆ	ØŒ×Ò�(œ/ð +÷
 ’�yÑ!Ô!ñ#ô #ñ 	$ô 	$ð 	$ð 	$ð 	$r   c           	      óâ  — | j                              t          j        d¦  «        ¦  «         t	          j        |¦  «        }|j        r9|r7| j                              t          j         dj        di |¤Ž¦  «        ¦  «         | j                              t          j         dj        di |¤Ž¦  «        ¦  «         |                     ¦   «         �rë| j                               dj        di |¤Ž¦  «         | j          	                    d¦  «        5  t          |                     ¦   «         ¦  «        D ]¨\  }}| j                              d                     t          |j        ¦  «        |j        ¬¦  «        ¦  «         |t          |                     ¦   «         ¦  «        dz
  k     r| j                              d¦  «         ŒŽ| j                              d	¦  «         Œ©	 d d d ¦  «         n# 1 swxY w Y   t          |                     ¦   «         ¦  «        D ]�\  }}|d
k    r| j                              d¦  «         n| j                              d¦  «         | j                              d                     |j        ¬¦  «        ¦  «         | j                              d¦  «         ŒŽ| j                              d¦  «         | j                              t          j         dj        di |¤Ž¦  «        ¦  «         d S )Nz1            /**** Constructors ****/
            z<                {message_name}() = default;
                ak              {message_name}(const {message_name}& other) = default;
            {message_name}({message_name}& other) = default;
            {message_name}({message_name}&& other) noexcept = default;
            {message_name}& operator=(const {message_name}& other) = default;
            {message_name}& operator=({message_name}&& other) = default;

            zexplicit {message_name}(r°   rü   rý   z,
z)
r   ú:rØ   z {member_name}({member_name})r²   rh   z{}

zŸ            explicit {message_name}(const uint8_t* buff, size_t len);
            explicit {message_name}(const CLAD::SafeMessageBuffer& buffer);

            rY   )rT   rk   r¨   r©   r   rö   rõ   r9   r¹   r¸   rà   rM   rA   r6   rÖ   )rV   r[   r¥   Ú$all_members_have_default_constructorrä   r¾   s         r   rî   zHStructEmitter.emitConstructorsÀ  sq  € ØŒ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	õ 0;Ô/cÐdhÑ/iÔ/iÐ,àÔ#ð 	(Ð(Lð 	(ØŒK×Ò�hœoð /ð /äð/&ð /&à$ð/&ð /&ñ 'ô 'ñ (ô (ð (ð 	Œ×Ò�(œ/ð +ð +ô ð+"ð +"ð !ð+"ð +"ñ #ô #ñ 	$ô 	$ð 	$ð �<Š<‰>Œ>ñ 	(ØŒK×ÒÐ?Ð8Ô?ÐJÐJÀ'ÐJÐJÑKÔKÐKð ”×#Ò# AÑ&Ô&ð 1ð 1Ý!*¨4¯<ª<©>¬>Ñ!:Ô!:ð 1ð 1‘I�A�vØ”K×%Ò%Ð&C×&JÒ&JÝ$6°v´{Ñ$CÔ$CØ$*¤Kð 'Kñ '1ô '1ñ 2ô 2ð 2ð �3˜tŸ|š|™~œ~Ñ.Ô.°Ñ2Ò2Ð2Øœ×)Ò)¨%Ñ0Ô0Ð0Ð0àœ×)Ò)¨%Ñ0Ô0Ð0Ð0ð1ð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1õ ' t§|¢|¡~¤~Ñ6Ô6ð (ð (‘	��6Ø˜’6�6Ø”K×%Ò% cÑ*Ô*Ð*Ð*à”K×%Ò% cÑ*Ô*Ð*Ø”×!Ò!Ð"A×"HÒ"HÐU[ÔU`Ð"HÑ"aÔ"aÑbÔbÐbØ”×!Ò! $Ñ'Ô'Ð'Ð'ØŒK×Ò˜hÑ'Ô'Ð'àŒ×Ò�(œ/ð +ð +ô ð	+"ð +"ð !ð	+"ð +"ñ #ô #ñ 	$ô 	$ð 	$ð 	$ð 	$s   ÄCG$Ç$G(Ç+G(c                 ó^   — | j                              t          j        d¦  «        ¦  «         d S )Nz¤            /**** Pack ****/
            size_t Pack(uint8_t* buff, size_t len) const;
            size_t Pack(CLAD::SafeMessageBuffer& buffer) const;

            rÍ   r¤   s      r   rï   zHStructEmitter.emitPackó  ó9   € ØŒ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð 	ð 	r   c                 ó^   — | j                              t          j        d¦  «        ¦  «         d S )Nz°            /**** Unpack ****/
            size_t Unpack(const uint8_t* buff, const size_t len);
            size_t Unpack(const CLAD::SafeMessageBuffer& buffer);

            rÍ   r¤   s      r   rð   zHStructEmitter.emitUnpackû  r  r   c                 ó:   — | j                              d¦  «         d S ©Nzsize_t Size() const;

r®   r¤   s      r   rñ   zHStructEmitter.emitSize  ó   € ØŒ×ÒÐ4Ñ5Ô5Ð5Ð5Ð5r   c                 ót   — | j                               t          j        d¦  «        j        di |¤Ž¦  «         d S )NzŒ            bool operator==(const {message_name}& other) const;
            bool operator!=(const {message_name}& other) const;
            rY   rÊ   r¤   s      r   rò   zHStructEmitter.emitEquality  ó\   € ØŒ×Òð �(œ/ð +ñ ô ô ð#ð #ð "ð#ð #ñ 	$ô 	$ð 	$ð 	$ð 	$r   c                 óÚ  — d„ }| j                              t          j        d¦  «        ¦  «         |                     ¦   «         D ]¦}t          |j        t          j        ¦  «        }|rt          |j        ¦  «        ndt          |j        ¦  «        z   dz   }| j                              t          j        d 
                    ||j         ||j        ¦  «        ¬¦  «        ¦  «        ¦  «         Œ§d S )Nc                 óì   — |                       d¦  «        } t          | ¦  «        D ]N\  }}|                     ¦   «         r5| d |…         | |                              ¦   «         z   | |dz   d …         z   c S ŒO| S )NÚ_r°   )Úlstriprà   ÚisalphaÚ
capitalize)r>   rä   ro   s      r   ÚprettifyNamez3HStructEmitter.emitProperties.<locals>.prettifyName  s‚   € Ø—*’*˜S‘/”/ˆCÝ! #™œð Eð E‘��1Ø—9’9‘;”;ð EØ˜r ˜rœ7 S¨¤V×%6Ò%6Ñ%8Ô%8Ñ8¸3¸qÀ¹s¸t¸t¼9ÑDÐDÐDÐDðEàˆJr   z(
        /**** Properties ****/
        zconst ú&zÂ                {member_type} Get{pretty_name}() const {{ return {member_name}; }};
                void Set{pretty_name}({member_type} __value) {{ {member_name} = __value; }};

                )r1   r³   Úpretty_name)rT   rk   r¨   r©   r¹   r4   rA   r   r5   r=   r9   r6   )rV   r[   r¥   r  r¾   Úis_basic_typer1   s          r   rô   zHStructEmitter.emitProperties  s  € ð	ð 	ð 	ð 	Œ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð —l’l‘n”nð 	=ð 	=ˆFÝ& v¤{µC´OÑDÔDˆMØ9FÐx�.¨¬Ñ5Ô5Ð5ÈHÕWeÐflÔfqÑWrÔWrÑLrÐuxÑLxˆKàŒK×Ò�hœoð /÷ ’FØ +Ø &¤Ø , ¨V¬[Ñ 9Ô 9ð ñ ;ô ;ñ	<ô <ñ =ô =ð =ð =ð		=ð 	=r   c                 ó^   — | j                              t          j        d¦  «        ¦  «         d S ©NzŠ            /**** JSON ****/
            Json::Value GetJSON() const;
            bool SetFromJSON(const Json::Value& json);

            rÍ   r¤   s      r   r÷   z!HStructEmitter.emitJSONSerializer$  r  r   N)r`   ra   rb   rí   r   r    r¢   r¡   ró   rî   rï   rð   rñ   rò   rô   r÷   rY   r   r   r~   r~   |  sÑ   € € € € € à€Kð'ð 'ð 'ð:$ð $ð $ðgð gð gð
 ð  ð  ð$ð $ð $ð1$ð 1$ð 1$ðfð ð ðð ð ð6ð 6ð 6ð$ð $ð $ð=ð =ð =ð0ð ð ð ð r   r~   c                   óZ   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ ZdS )r�   r   c                 óP   — | j                               dj        di |¤Ž¦  «         d S )Nz!// {object_type} {message_name}

rY   rú   r¤   s      r   r    zCPPStructEmitter.emitHeader2  s3   € ØŒ×ÒÐFÐ?ÔFÐQÐQÈÐQÐQÑRÔRÐRÐRÐRr   c           	      ór  — | j                              d¦  «         | j                               dj        di |¤Ž¦  «         | j                               dj        di |¤Ž¦  «         t          j        |d         ¦  «        }| j                              d¦  «        5  t          |¦  «        D ][\  }}d}|t          |¦  «        dz
  k    rd}| j                              d	                     t          |¦  «        |¬
¦  «        ¦  «         Œ\	 d d d ¦  «         n# 1 swxY w Y   | j                              d¦  «         d S )Nrh   z>const char* {message_name}VersionHashStr = "{message_hash}";

z2const uint8_t {message_name}VersionHash[16] = {{ 
ré   rÏ   rØ   r°   r·   rÙ   rÚ   rÝ   rY   rÞ   râ   s          r   r¢   zCPPStructEmitter.emitFooter5  s«  € ØŒ×Ò˜$ÑÔÐØŒ×ÒÐcÐ\ÔcÐnÐnÐfmÐnÐnÑoÔoÐoØŒ×ÒÐVÐOÔVÐaÐaÐY`ÐaÐaÑbÔbÐbÝÔ0°¸Ô1HÑIÔIˆØŒ[×Ò Ñ"Ô"ð 	Xð 	XÝ$ XÑ.Ô.ð Xð X‘��4Ø�	Ø�˜X™œ¨Ñ*Ò+Ð+Ø "�IØ”×!Ò!Ð":×"AÒ"AÍ3ÈtÉ9Ì9ØLUð #Bñ #Wô #Wñ Xô Xð Xð Xð	Xð	Xð 	Xð 	Xñ 	Xô 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xøøøð 	Xð 	Xð 	Xð 	Xð 	Œ×Ò˜*Ñ%Ô%Ð%Ð%Ð%ó   ÂA,DÄDÄDc                 ó   — d S rF   rY   r¤   s      r   r¡   zCPPStructEmitter.emitMembersD  r_   r   c                 óÄ  — d}|                      ¦   «         D ]¹}|j        d         j        }d|v r3|d|d         j        z   |                      |d         ¦  «        z   dz   z  }ŒKt	          |j        t          j        ¦  «        r|dz  }Œpt	          |j        t          j        ¦  «        st	          |j        t          j	        ¦  «        r|dz  }Œ´|dz  }Œº|d d	…         }|d
z  }|S )Nú(rA   Ú	type_declú rØ   z "",z {},z 0,éÿÿÿÿú))
r¹   Ú__dict__r6   Ú(_CPPStructEmitter__init_explicit_membersr4   rA   r   r:   r;   r<   )rV   r[   Úarg_listr¾   Úmember_dicts        r   Ú__init_explicit_membersz(CPPStructEmitter.__init_explicit_membersI  s÷   € ØˆØ—l’l‘n”nð 
	&ð 
	&ˆFØ œ/¨&Ô1Ô:ˆKØ˜kÐ)Ð)Ø˜C +¨kÔ":Ô"?Ñ?À$×B^ÒB^Ð_jÐkvÔ_wÑBxÔBxÑxÐ{~Ñ~Ñ~��å˜fœk­3Ô+?Ñ@Ô@ð &Ø Ñ&�H�HÝ ¤­SÔ-BÑCÔCð &ÅzÐRXÔR]Õ_bÔ_qÑGrÔGrð &Ø Ñ&�H�Hà Ñ%�H�HØ˜C˜R˜C”=ˆØ�C‰ˆØˆr   c           	      óÂ  — t          j        |¦  «        }d}|s�|                     ¦   «         D ]x}|j        d         j        }d|v r`|                      |d         ¦  «        }|dk    r |d                     |j        |¬¦  «        z  }ŒY|d                     |j        |¬¦  «        z  }Œy| j                             t          j
         dj        d	d|i|¤Ž¦  «        ¦  «         d S )
Nr·   rA   r&  z: {member_name}{arg_list})r³   r,  z, {member_name}{arg_list}a˜              {message_name}::{message_name}(const CLAD::SafeMessageBuffer& buffer)
            {explicit_constructors}
            {{
            	Unpack(buffer);
            }}
          
            {message_name}::{message_name}(const uint8_t* buff, size_t len)
            : {message_name}::{message_name}({{const_cast<uint8_t*>(buff), len, false}})
            {{
            }}
            
            Úexplicit_constructorsrY   )r   rö   r¹   r*  r+  r9   r6   rT   rk   r¨   r©   )rV   r[   r¥   r
  Úexplicit_membersr¾   r-  r,  s           r   rî   z!CPPStructEmitter.emitConstructorsZ  sV  € Ý/:Ô/cÐdhÑ/iÔ/iÐ,àÐà3ð 	`ð Ÿ,š,™.œ.ð 	`ð 	`�Ø$œo¨fÔ5Ô>�Ø +Ð-Ð-Ø#×;Ò;¸KÈÔ<TÑUÔU�HØ'¨2Ò-Ð-Ø(Ð,G×,NÒ,NÐ]cÔ]hØZbð -Oñ -dô -dñ dÐ(Ð(ð )Ð,G×,NÒ,NÐ]cÔ]hØV^ð -Oñ -`ô -`ñ `Ð(øð 	Œ×Ò�(œ/ð +ð +ô ð+Lð +Lð 0@ð+Lð DKð+Lð +Lñ Mô Mñ 	Nô 	Nð 	Nð 	Nð 	Nr   c                 ó   — d S rF   rY   r¤   s      r   ró   zCPPStructEmitter.emitInvoke|  r_   r   c           	      óÖ  — | j                              t          j         dj        di |¤Ž¦  «        ¦  «         | j                              d¦  «        5  t          | j         | j        ¦  «        }|                     ¦   «         D ]#}| 	                    |j
        |j        ¬¦  «         Œ$	 d d d ¦  «         n# 1 swxY w Y   | j                              t          j        d¦  «        ¦  «         d S )Na3              size_t {message_name}::Pack(uint8_t* buff, size_t len) const
            {{
            	CLAD::SafeMessageBuffer buffer(buff, len, false);
            	return Pack(buffer);
            }}

            size_t {message_name}::Pack(CLAD::SafeMessageBuffer& buffer) const
            {{
            r°   r²   z€            	const size_t bytesWritten {buffer.GetBytesWritten()};
            	return bytesWritten;
            }

            rY   )rT   rk   r¨   r©   r9   r¸   ÚCPPPackStatementEmitterrU   r¹   rl   rA   r6   ©rV   r[   r¥   Úvisitorr¾   s        r   rï   zCPPStructEmitter.emitPack  sX  € ØŒ×Ò�(œ/ð 	+ð 	+ô ð	+"ð 	+"ð !ð	+"ð 	+"ñ 	#ô 	#ñ 		$ô 		$ð 		$ð Œ[×Ò Ñ"Ô"ð 	Dð 	DÝ-¨d¬k¸4¼<ÑHÔHˆGØŸ,š,™.œ.ð Dð D�Ø—’˜fœk°v´{�ÑCÔCÐCÐCðDð	Dð 	Dð 	Dñ 	Dô 	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	Døøøð 	Dð 	Dð 	Dð 	Dð 	Œ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð 	ð 	ó   ÁAB2Â2B6Â9B6c                 óÖ  — | j                               t          j        d¦  «        j        di |¤Ž¦  «         | j                              d¦  «        5  t          | j         | j        ¦  «        }|                     ¦   «         D ]#}| 	                    |j
        |j        ¬¦  «         Œ$	 d d d ¦  «         n# 1 swxY w Y   | j                              t          j        d¦  «        ¦  «         d S )Na[              size_t {message_name}::Unpack(const uint8_t* buff, const size_t len)
            {{
            	const CLAD::SafeMessageBuffer buffer(const_cast<uint8_t*>(buff), len, false);
            	return Unpack(buffer);
            }}

            size_t {message_name}::Unpack(const CLAD::SafeMessageBuffer& buffer)
            {{
            r°   r²   zF            	return buffer.GetBytesRead();
            }

            rY   )rT   rk   r¨   r©   r9   r¸   ÚCPPUnpackStatementEmitterrU   r¹   rl   rA   r6   r5  s        r   rð   zCPPStructEmitter.emitUnpack•  sX  € ØŒ×Òð 	�(œ/ð 	+ñ 	ô 	ô ð	#ð 	#ð "ð	#ð 	#ñ 		$ô 		$ð 		$ð Œ[×Ò Ñ"Ô"ð 	Dð 	DÝ/°´¸T¼\ÑJÔJˆGØŸ,š,™.œ.ð Dð D�Ø—’˜fœk°v´{�ÑCÔCÐCÐCðDð	Dð 	Dð 	Dñ 	Dô 	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	Døøøð 	Dð 	Dð 	Dð 	Dð 	Œ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð 	ð 	r7  c                 ó<  — | j                               t          j        d¦  «        j        di |¤Ž¦  «         | j                              d¦  «        5  t          | j         | j        ¦  «        }|                     ¦   «         D ]V}| j                              d                     |j	        ¬¦  «        ¦  «         | 
                    |j        |j	        ¬¦  «         ŒW	 d d d ¦  «         n# 1 swxY w Y   | j                              t          j        d¦  «        ¦  «         d S )Nzk            size_t {message_name}::Size() const
            {{
            	size_t result = 0;
            r°   z// {member_name}
r²   ú7            	return result;
            }

            rY   )rT   rk   r¨   r©   r9   r¸   ÚCPPSizeStatementEmitterrU   r¹   r6   rl   rA   r5  s        r   rñ   zCPPStructEmitter.emitSizeª  s‚  € ØŒ×Òð �(œ/ð +ñ ô ô ð	#ð #ð "ð	#ð #ñ 	$ô 	$ð 	$ð
 Œ[×Ò Ñ"Ô"ð 	Dð 	DÝ-¨d¬k¸4¼<ÑHÔHˆGØŸ,š,™.œ.ð Dð D�Ø”×!Ò!Ð"6×"=Ò"=È&Ì+Ð"=Ñ"VÔ"VÑWÔWÐWØ—’˜fœk°v´{�ÑCÔCÐCÐCðDð	Dð 	Dð 	Dñ 	Dô 	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	Døøøð 	Dð 	Dð 	Dð 	Dð
 	Œ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð 	ð 	s   ÁBC%Ã%C)Ã,C)c           	      óh  — | j                              t          j         dj        di |¤Ž¦  «        ¦  «         |                     ¦   «         �r| j                              d¦  «        5  | j                              d¦  «         | j                              d¦  «        5  t          |                     ¦   «         ¦  «        D ]X\  }}|dk    r| j                              d¦  «         | j                              d                     |j        ¬¦  «        ¦  «         ŒY	 d d d ¦  «         n# 1 swxY w Y   | j                              d¦  «         d d d ¦  «         n# 1 swxY w Y   n| j                              d	¦  «         | j                              t          j         d
j        di |¤Ž¦  «        ¦  «         d S )Nzj            bool {message_name}::operator==(const {message_name}& other) const
            {{
            r°   zreturn (r   z &&
z*this->{member_name} == other.{member_name}r²   z);
úreturn true;
z´            }}

            bool {message_name}::operator!=(const {message_name}& other) const
            {{
            	return !(operator==(other));
            }}

            rY   )	rT   rk   r¨   r©   r9   r¹   r¸   rà   r6   )rV   r[   r¥   rä   r¾   s        r   rò   zCPPStructEmitter.emitEquality»  sf  € ØŒ×Ò�(œ/ð +ð +ô ð+"ð +"ð !ð+"ð +"ñ #ô #ñ 	$ô 	$ð 	$ð �<Š<‰>Œ>ñ 
	0Ø”×#Ò# AÑ&Ô&ð *ð *Ø”×!Ò! *Ñ-Ô-Ð-Ø”[×'Ò'¨Ñ*Ô*ð xð xÝ%.¨t¯|ª|©~¬~Ñ%>Ô%>ð xð x™	˜˜6Ø˜qš5˜5Ø œK×-Ò-¨gÑ6Ô6Ð6Øœ×)Ò)Ð*V×*]Ò*]ÐjpÔjuÐ*]Ñ*vÔ*vÑwÔwÐwÐwðxðxð xð xñ xô xð xð xð xð xð xð xøøøð xð xð xð xð
 ”×!Ò! &Ñ)Ô)Ð)ð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *øð ŒK×ÒÐ.Ñ/Ô/Ð/ØŒ×Ò�(œ/ð +ð +ô ð+"ð +"ð !ð+"ð +"ñ #ô #ñ 	$ô 	$ð 	$ð 	$ð 	$s7   Á'5EÂA;D$ÄEÄ$D(	Ä(EÄ+D(	Ä,EÅEÅEc                 ó   — d S rF   rY   r¤   s      r   rô   zCPPStructEmitter.emitPropertiesÕ  r_   r   c                 óP  — | j                               t          j        d¦  «        j        d%i |¤Ž¦  «         | j                              t          j        d¦  «        ¦  «         d„ }|                     ¦   «         D �]š}t          |j        t          j	        t          j
        f¦  «        �r
t          |j        t          j        ¦  «        së| j                              d¦  «        5  t          |j        j        t          j        ¦  «        r|j        j        j        dk    rd}d}nd}d	}| j                              t          j        d
¦  «                             |j                             d¦  «        |j         |d|j        j        ¦  «        ||¬¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   �Œ9| j                              d                     |j                             d¦  «        |j         ||j        |j        ¦  «        ¬¦  «        ¦  «         �Œœ| j                              t          j        d¦  «        ¦  «         | j                               t          j        d¦  «        j        d%i |¤Ž¦  «         | j                              d¦  «        5  |                     ¦   «         D �]¬}|j                             d¦  «        }| j                              d                     |¬¦  «        ¦  «         | j                              d¦  «        5  t#          |j        ¦  «        �I| j                              d                     ||j        t#          |j        ¦  «        ¬¦  «        ¦  «         �n¸t          |j        t          j	        t          j
        f¦  «        �rq| j                              d                     |¬¦  «        ¦  «         t          |j        t          j	        ¦  «        r3| j                              d                     |j        ¬¦  «        ¦  «         | j                              d¦  «         | j                              d¦  «        5  t#          |j        j        ¦  «        �M| j                              d                     |j        t#          |j        j        ¦  «        ¬¦  «        ¦  «         �n#t          |j        j        t          j        ¦  «        rˆ| j                              d¦  «        5  | j                              t          j        d¦  «                             |j        j        j        |j        ¬¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   nw| j                              d¦  «        5  | j                              t          j        d¦  «                             |j        ¬¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   | j                              d¦  «         �nt          |j        t          j        ¦  «        r„| j                              d¦  «        5  | j                              t          j        d ¦  «                             |j        j        ||j        ¬!¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   nx| j                              d¦  «        5  | j                              t          j        d"¦  «                             ||j        ¬#¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   | j                              d¦  «         �Œ®	 d d d ¦  «         n# 1 swxY w Y   | j                               t          j        d$¦  «        j        d%i |¤Ž¦  «         d S )&NzD            Json::Value {message_name}::GetJSON() const
            z.        {
        	Json::Value root;

        c                 óÆ   — t          |t          j        ¦  «        rd                     | ¬¦  «        S t          |t          j        ¦  «        rd                     | ¬¦  «        S | S )NzEnumToString({member_name})r²   z{member_name}.GetJSON())r4   r   rG   r9   ÚCompoundType)r³   r1   s     r   ÚtoJsonValuez8CPPStructEmitter.emitJSONSerializer.<locals>.toJsonValueã  s_   € Ý˜+¥s¤Ñ7Ô7ð #Ø4×;Ò;ÈÐ;ÑTÔTÐTÝ˜K­Ô)9Ñ:Ô:ð #Ø0×7Ò7ÀKÐ7ÑPÔPÐPà"Ð"r   r°   r   Úautoz(bool)zconst auto&r·   zÇ                        for({range_type} value : {member_name}) {{
                          root["{json_name}"].append({cast_prefix}{json_value});
                        }}
                        r  rº   )Ú	json_namer³   Ú
json_valueÚ
range_typeÚcast_prefixz%	root["{json_name}"] = {json_value};
)rE  r³   rF  z)
        	return root;
        }
        zx
            bool {message_name}::SetFromJSON(const Json::Value& root)
            {{
              try {{

            z&	if (root.isMember("{json_name}")) {{
)rE  z2	{member_name} = root["{json_name}"].{as_method};
)rE  r³   Ú	as_methodz)	auto& json_array = root["{json_name}"];
z*	{member_name}.resize(json_array.size());
r²   z;	for(Json::ArrayIndex i = 0; i < json_array.size(); i++) {
z/	{member_name}[i] = json_array[i].{as_method};
)r³   rI  zî                                    if (!{enum_name}FromString(json_array[i].asString(), {member_name}[i])) {{
                                      return false;
                                    }}
                                    )r—   r³   zØ                                    if (!{member_name}[i].SetFromJSON(json_array[i])) {{
                                      return false;
                                    }}
                                    ú	}
zÑ                            if (!{enum_name}FromString(root["{json_name}"].asString(), {member_name})) {{
                              return false;
                            }}
                            )r—   rE  r³   z»                            if (!{member_name}.SetFromJSON(root["{json_name}"])) {{
                              return false;
                            }}
                            )rE  r³   z¡
              }}
              catch(Json::LogicError) {{
                return false;
              }}

              return true;
            }}
            rY   )rT   rk   r¨   r©   r9   r¹   r4   rA   r   r;   r<   r:   r¸   r1   r5   r6   r  rP   rG   )rV   r[   r¥   rC  r¾   rG  rH  rE  s           r   r÷   z#CPPStructEmitter.emitJSONSerializerØ  ss
  € ØŒ×Òð �(œ/ð +ñ ô äð#ð #à!ð#ð #ñ 	$ô 	$ð 	$ð 	Œ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð	#ð 	#ð 	#ð —l’l‘n”nð 	Bñ 	BˆFÝ˜&œ+­Ô(=½sÔ?QÐ'RÑSÔSñ BÕ\fÐgmÔgrÕtwô  uIñ  ]Jô  ]Jð BØ”[×'Ò'¨Ñ*Ô*ð >ð >õ " &¤+Ô"9½3¼?ÑKÔKð )ÐPVÔP[ÔPgÔPlÐpvÒPvÐPvØ%+˜
Ø&.˜˜à%2˜
Ø&(˜à”K×%Ò%¥h¤oð 7ñ 'ô '÷ $šV¨f¬k×.@Ò.@ÀÑ.EÔ.EØ06´Ø/:¨{¸7ÀFÄKÔD[Ñ/\Ô/\Ø/9Ø0;ð	 $ñ =ô =ñ	>ô >ð >ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >ùð* ”×!Ò!Ð"K×"RÒ"RÐ]cÔ]h×]oÒ]oÐpsÑ]tÔ]tð  CIô  CNð  [fð  [fð  gmô  grð  tzô  tñ  [@ô  [@Ð"Rñ  #Aô  #Añ  Bô  Bð  Bñ  BàŒ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð
 	Œ×Òð �(œ/ð +ñ ô ô
 ð#ð #ð
 "ð#ð #ñ 	$ô 	$ð 	$ð Œ[×Ò Ñ"Ô"ð 2	+ð 2	+àŸ,š,™.œ.ð 0+ñ 0+�Ø"œK×.Ò.¨sÑ3Ô3�	à”×!Ò!Ð"L×"SÒ"SÐ^gÐ"SÑ"hÔ"hÑiÔiÐiØ”[×'Ò'¨Ñ*Ô*ð +Wð +WÝ(¨¬Ñ5Ô5ÐAØœ×)Ò)Ð*`×*gÒ*gÐr{ð  JPô  JUõ  arð  syô  s~ñ  aô  aÐ*gñ  +@ô  +@ñ  Aô  Að  Añ  AÝ# F¤Kµ#Ô2GÍÔI[Ð1\Ñ]Ô]ñ (WØœ×)Ò)Ð*W×*^Ò*^ÐirÐ*^Ñ*sÔ*sÑtÔtÐtå% f¤kµ3Ô3HÑIÔIð ~Ø œK×-Ò-Ð.\×.cÒ.cÐpvÔp{Ð.cÑ.|Ô.|Ñ}Ô}Ð}àœ×)Ò)Ð*iÑjÔjÐjà!œ[×/Ò/°Ñ2Ô2ð Jð JÝ0°´Ô1HÑIÔIÐUØ $¤× 1Ò 1Ð2e×2lÒ2lÐyô  zEõ  Qbð  ciô  cnô  czñ  Q{ô  Q{Ð2lñ  3|ô  3|ñ  !}ô  !}ð  !}ñ  !}Ý!+¨F¬KÔ,CÅSÄ_Ñ!UÔ!Uð JØ%)¤[×%7Ò%7¸Ñ%:Ô%:ð !rð !rØ$(¤K×$5Ò$5µh´oð G(ñ 7)ô 7)÷ *0ª¸&¼+Ô:QÔ:VÐdjÔdo¨Ñ)pÔ)pñ	%rô %rð %rð!rð !rð !rñ !rô !rð !rð !rð !rð !rð !rð !røøøð !rð !rð !rð !røð &*¤[×%7Ò%7¸Ñ%:Ô%:ð !Jð !JØ$(¤K×$5Ò$5µh´oð G(ñ 7)ô 7)÷ *0ª¸F¼K¨Ñ)HÔ)Hñ	%Jô %Jð %Jð!Jð !Jð !Jñ !Jô !Jð !Jð !Jð !Jð !Jð !Jð !Jøøøð !Jð !Jð !Jð !JðJð Jð Jñ Jô Jð Jð Jð Jð Jð Jð Jøøøð Jð Jð Jð Jð$ œ×)Ò)¨'Ñ2Ô2Ð2Ñ2Ý# F¤Kµ´ÑAÔAð WØ!œ[×/Ò/°Ñ2Ô2ð sð sØ œK×-Ò-­h¬oð ? ñ /!ô /!÷ "(¢°&´+Ô2BÈiÐekÔep Ñ!qÔ!qñ	sô sð sðsð sð sñ sô sð sð sð sð sð sð søøøð sð sð sð søð "œ[×/Ò/°Ñ2Ô2ð Wð WØ œK×-Ò-­h¬oð ? ñ /!ô /!÷ "(¢°)ÈÌ Ñ!UÔ!Uñ	Wô Wð WðWð Wð Wñ Wô Wð Wð Wð Wð Wð Wð Wøøøð Wð Wð Wð WðM+Wð +Wð +Wñ +Wô +Wð +Wð +Wð +Wð +Wð +Wð +Wøøøð +Wð +Wð +Wð +WðX ”×!Ò! 'Ñ*Ô*Ð*Ñ*ða0+ð2	+ð 2	+ð 2	+ñ 2	+ô 2	+ð 2	+ð 2	+ð 2	+ð 2	+ð 2	+ð 2	+øøøð 2	+ð 2	+ð 2	+ð 2	+ðh 	Œ×Òð �(œ/ð +ñ ô ô ð#ð #ð "ð#ð #ñ 	$ô 	$ð 	$ð 	$ð 	$s  Ã#B8F'Æ'F+	Æ.F+	ÊA:]$ÌD>\0ÑB%W"	Ó1AUÕW"	ÕUÕW"	ÕUÕW"	Õ9AWÖ?W"	×W×W"	×W×W"	×\0×"W&×&\0×)W&×*A\0ÙAZ 	Ú\0Ú Z$Ú$\0Ú'Z$Ú(\0ÛA\	Ü\0Ü\Ü\0Ü \Ü!\0Ü$]$Ü0\4Ü4]$Ü7\4Ü8]$Ý$](Ý+](N)r`   ra   rb   rí   r    r¢   r¡   r+  rî   ró   rï   rð   rñ   rò   rô   r÷   rY   r   r   r�   r�   .  sÙ   € € € € € à€KðSð Sð Sð&ð &ð &ðð ð ð
ð ð ð" Nð  Nð  NðDð ð ðð ð ð,ð ð ð*ð ð ð"$ð $ð $ð4ð ð ðt$ð t$ð t$ð t$ð t$r   r�   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚUnionDiscovererFc                 ó   — d S rF   rY   ©rV   r[   s     r   r^   z!UnionDiscoverer.visit_IncludeDeclR  r_   r   c                 ó   — d| _         d S )NT)ÚfoundrN  s     r   rƒ   zUnionDiscoverer.visit_UnionDeclU  s   € ØˆŒ
ˆ
ˆ
r   N)r`   ra   rb   rP  r^   rƒ   rY   r   r   rL  rL  N  s7   € € € € € à€Eðð ð ðð ð ð ð r   rL  c                   óz   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )r‚   c           
      ó¤  — t          |j        |j        d                     |j        ¬¦  «        |                     ¦   «         d                     |                     ¦   «         ¬¦  «        d|j        ¬¦  «        }| j                              t          j	        d¦  «        j        di |¤Ž¦  «         | 
                    ¦   «         D ]_}t          d|j        t          |j        ¦  «        dœ|¤Ž}| j                              t          j	        d¦  «        j        di |¤Ž¦  «         Œ`|                      ||¦  «         | j                             d¦  «         | j                             d	¦  «        5  |                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |                      ||¦  «         | j        j        r*t9          j        |¦  «        r|                      ||¦  «         d d d ¦  «         n# 1 swxY w Y   | j                             d
¦  «         | j                             d	¦  «        5  |                      ||¦  «         |                       ||¦  «         |  !                    ||¦  «         d d d ¦  «         n# 1 swxY w Y   |  "                    ||¦  «         d S )Nú{union_name}Tag©Ú
union_nameÚUNION©rU  Ú
union_hashÚtag_nameÚqualified_union_nameÚqualified_tag_namerê   Údupes_allowedz¸            // "Lookup Tables" for getting type by tag using template specializations
            template<{union_name}Tag tag>
            struct {union_name}_TagToType;

            )r³   rL   z¼                template<>
                struct {union_name}_TagToType<{union_name}Tag::{member_name}> {{
                	using type = {value_type};
                }};
                zpublic:
r°   z	private:
rY   )#r›   r6   rœ   r9   r?   r\  rT   rk   r¨   r©   r¹   r=   rA   r    r¸   ÚemitUsingTagrî   ÚemitDestructorÚ
emitGetTagÚemitTemplatedGetÚemitTemplatedCreateÚemitAccessorsrð   rï   rñ   rò   rU   r§   r   rö   r÷   ÚemitClearCurrentÚemitTagMemberÚemitUnionMembersr¢   ©rV   r[   r¥   r¾   Úlocalss        r   rƒ   zHUnionEmitter.visit_UnionDeclZ  s  € åØ”yØ”}Ø&×-Ò-¸¼Ð-ÑCÔCØ!%×!:Ò!:Ñ!<Ô!<Ø0×7Ò7À4×C\ÒC\ÑC^ÔC^Ð7Ñ_Ô_ØØÔ,ð.ñ .ô .ˆð 	Œ×Òð �(œ/ð +ñ ô ô
 ð#ð #ð
 "ð#ð #ñ 	$ô 	$ð 	$ð —l’l‘n”nð 	'ð 	'ˆFÝð Ø"œKÝ)¨&¬+Ñ6Ô6ðð ð ðð ˆFð
 ŒK×Òð �hœoð /ñ ô ô
 ð&ð &ð
 %ð&ð &ñ 'ô 'ð 'ð 'ð 	�Š˜˜gÑ&Ô&Ð&ð 	Œ×Ò˜+Ñ&Ô&Ð&ØŒ[×Ò Ñ"Ô"ð 	7ð 	7Ø×Ò˜d GÑ,Ô,Ð,Ø×!Ò! $¨Ñ0Ô0Ð0Ø×Ò  gÑ.Ô.Ð.Ø�OŠO˜D 'Ñ*Ô*Ð*Ø×!Ò! $¨Ñ0Ô0Ð0Ø×$Ò$ T¨7Ñ3Ô3Ð3Ø×Ò˜t WÑ-Ô-Ð-Ø�OŠO˜D 'Ñ*Ô*Ð*Ø�MŠM˜$ Ñ(Ô(Ð(Ø�MŠM˜$ Ñ(Ô(Ð(Ø×Ò˜d GÑ,Ô,Ð,ð Œ|Ô$ð 7­Ô)]Ð^bÑ)cÔ)cð 7Ø×'Ò'¨¨gÑ6Ô6Ð6ð!	7ð 	7ð 	7ñ 	7ô 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7øøøð 	7ð 	7ð 	7ð 	7ð& 	Œ×Ò˜,Ñ'Ô'Ð'ØŒ[×Ò Ñ"Ô"ð 	1ð 	1Ø×!Ò! $¨Ñ0Ô0Ð0Ø×Ò˜t WÑ-Ô-Ð-Ø×!Ò! $¨Ñ0Ô0Ð0ð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð
 	�Š˜˜gÑ&Ô&Ð&Ð&Ð&s&   Å,D)J!Ê!J%Ê(J%Ë AL/Ì/L3Ì6L3c                 ót   — | j                               t          j        d¦  «        j        di |¤Ž¦  «         d S )Nze
            // {object_type} {union_name}
            class {union_name}
            {{
            rY   rÊ   r¤   s      r   r    zHUnionEmitter.emitHeader™  s\   € ØŒ×Òð �(œ/ð +ñ ô ô
 ð#ð #ð
 "ð#ð #ñ 	$ô 	$ð 	$ð 	$ð 	$r   c                 óÎ   — | j                              d¦  «         | j                               dj        di |¤Ž¦  «         | j                               dj        di |¤Ž¦  «         d S )Nú};
z/extern const char* {union_name}VersionHashStr;
z3extern const uint8_t {union_name}VersionHash[16];

rY   rú   r¤   s      r   r¢   zHUnionEmitter.emitFooter¡  sv   € ØŒ×Ò˜&Ñ!Ô!Ð!ØŒ×ÒÐSÐLÔSÐ^Ð^ÐV]Ð^Ð^Ñ_Ô_Ð_ØŒ×ÒÐXÐQÔXÐcÐcÐ[bÐcÐcÑdÔdÐdÐdÐdr   c                 óP   — | j                               dj        di |¤Ž¦  «         d S )Nzusing Tag = {tag_name};
rY   rú   r¤   s      r   r]  zHUnionEmitter.emitUsingTag¦  s3   € ØŒ×ÒÐ<Ð5Ô<ÐGÐG¸wÐGÐGÑHÔHÐHÐHÐHr   c                 óâ   — | j                               t          j        d¦  «        j        di |¤Ž¦  «         | j                               t          j        d¦  «        j        di |¤Ž¦  «         d S )Nae              /**** Constructors ****/
            {union_name}() :_tag(Tag::INVALID) {{ }}
            explicit {union_name}(const CLAD::SafeMessageBuffer& buff);
            explicit {union_name}(const uint8_t* buffer, size_t length);
            {union_name}(const {union_name}& other);
            {union_name}({union_name}&& other) noexcept;
            z‘            {union_name}& operator=(const {union_name}& other);
            {union_name}& operator=({union_name}&& other) noexcept;

            rY   rÊ   r¤   s      r   rî   zHUnionEmitter.emitConstructors©  s®   € ØŒ×Òð �(œ/ð +ñ ô ô ð#ð #ð "ð#ð #ñ 	$ô 	$ð 	$ð 	Œ×Òð �(œ/ð +ñ ô ô ð	#ð #ð "ð	#ð #ñ 	$ô 	$ð 	$ð 	$ð 	$r   c                 óP   — | j                               dj        di |¤Ž¦  «         d S )Nz&~{union_name}() {{ ClearCurrent(); }}
rY   rú   r¤   s      r   r^  zHUnionEmitter.emitDestructor¹  s3   € ØŒ×ÒÐJÐCÔJÐUÐUÈWÐUÐUÑVÔVÐVÐVÐVr   c                 ó:   — | j                              d¦  «         d S )Nz%Tag GetTag() const { return _tag; }

r®   r¤   s      r   r_  zHUnionEmitter.emitGetTag¼  s   € ØŒ×ÒÐCÑDÔDÐDÐDÐDr   c                 óì   — | j                              d¦  «         | j                              d¦  «         | j                              d¦  «         | j                               dj        di |¤Ž¦  «         d S )Nz.// Templated getter for union members by type
zX// NOTE: Always returns a reference, even for trivial types, unlike untemplated version
ztemplate<Tag tag>
zBconst typename {union_name}_TagToType<tag>::type & Get_() const;

rY   rú   r¤   s      r   r`  zHUnionEmitter.emitTemplatedGet¿  sy   € ØŒ×ÒÐKÑLÔLÐLØŒ×ÒÐuÑvÔvÐvØŒ×ÒÐ/Ñ0Ô0Ð0ØŒ×ÒÐgÐ`ÔgÐrÐrÐjqÐrÐrÑsÔsÐsÐsÐsr   c                 ó¸   — | j                              d¦  «         | j                              d¦  «         | j                               dj        di |¤Ž¦  «         d S )NzI// Templated creator for making a union object out of one if its members
ztemplate <Tag tag>
zQstatic {union_name} Create_(typename {union_name}_TagToType<tag>::type member);

rY   rú   r¤   s      r   ra  z!HUnionEmitter.emitTemplatedCreateÅ  s�   € ØŒ×ÒÐfÑgÔgÐgØŒ×ÒÐ0Ñ1Ô1Ð1ØŒ×ÒÐvÐoÔvð  Bð  Bð  zAð  Bð  Bñ  	Cô  	Cð  	Cð  	Cð  	Cr   c           	      ó  — |                      ¦   «         D �]j}t          d
|j        t          |j        ¦  «        t          |j        ¦  «        dœ|¤Ž}| j                              dj        d
i |¤Ž¦  «         | j                              dj        d
i |¤Ž¦  «         | j	        r@| j	        j
        r4|d         r|j        s%| j                              dj        d
i |¤Ž¦  «         | j                              dj        d
i |¤Ž¦  «         | j                              dj        d
i |¤Ž¦  «         t          |j        ¦  «        s%| j                              dj        d
i |¤Ž¦  «         | j                             d	¦  «         �Œld S )N)r³   rL   Úparameter_typez/** {member_name} **/
zKstatic {union_name} Create{member_name}({value_type}&& new_{member_name});
r\  z9explicit {union_name}({value_type}&& new_{member_name});
z,{parameter_type} Get_{member_name}() const;
z<void Set_{member_name}({parameter_type} new_{member_name});
z:void Set_{member_name}({value_type}&& new_{member_name});
rh   rY   )r¹   r›   r6   r=   rA   rM   rT   rk   r9   rU   ÚhelperConstructorsÚhas_duplicatesrJ   rf  s        r   rb  zHUnionEmitter.emitAccessorsÊ  sÐ  € Ø—l’l‘n”nð 	$ñ 	$ˆFÝð Ø"œKÝ)¨&¬+Ñ6Ô6Ý1°&´+Ñ>Ô>ðð ð ð	ð ˆFð ŒK×ÒÐ>Ð7Ô>ÐHÐHÀÐHÐHÑIÔIÐIØŒK×ÒÐsÐlÔsÐ}Ð}Ðv|Ð}Ð}Ñ~Ô~Ð~ð Œ|ð q ¤Ô ?ð qÈÐQ`ÔIað qÐioÔi~ð qØ”×!Ò!Ð"eÐ"^Ô"eÐ"oÐ"oÐhnÐ"oÐ"oÑpÔpÐpàŒK×ÒÐTÐMÔTÐ^Ð^ÐW]Ð^Ð^Ñ_Ô_Ð_ØŒK×ÒÐdÐ]ÔdÐnÐnÐgmÐnÐnÑoÔoÐoõ $ F¤KÑ0Ô0ð rØ”×!Ò!Ð"fÐ"_Ô"fÐ"pÐ"pÐioÐ"pÐ"pÑqÔqÐqØŒK×Ò˜dÑ#Ô#Ð#Ñ#ð+	$ð 	$r   c                 ón   — | j                              d¦  «         | j                              d¦  «         d S )Nz.size_t Pack(uint8_t* buff, size_t len) const;
z5size_t Pack(CLAD::SafeMessageBuffer& buffer) const;

r®   r¤   s      r   rï   zHUnionEmitter.emitPackâ  s6   € ØŒ×ÒÐKÑLÔLÐLØŒ×ÒÐSÑTÔTÐTÐTÐTr   c                 ón   — | j                              d¦  «         | j                              d¦  «         d S )Nz6size_t Unpack(const uint8_t* buff, const size_t len);
z7size_t Unpack(const CLAD::SafeMessageBuffer& buffer);

r®   r¤   s      r   rð   zHUnionEmitter.emitUnpackæ  s6   € ØŒ×ÒÐSÑTÔTÐTØŒ×ÒÐUÑVÔVÐVÐVÐVr   c                 ó:   — | j                              d¦  «         d S r  r®   r¤   s      r   rñ   zHUnionEmitter.emitSizeê  r  r   c                 ót   — | j                               t          j        d¦  «        j        di |¤Ž¦  «         d S )Nzˆ            bool operator==(const {union_name}& other) const;
            bool operator!=(const {union_name}& other) const;
            rY   rÊ   r¤   s      r   rò   zHUnionEmitter.emitEqualityí  r  r   c                 ó^   — | j                              t          j        d¦  «        ¦  «         d S r  rÍ   r¤   s      r   r÷   z HUnionEmitter.emitJSONSerializeró  r  r   c                 ó:   — | j                              d¦  «         d S )Nzvoid ClearCurrent();
r®   r¤   s      r   rc  zHUnionEmitter.emitClearCurrentû  s   € ØŒ×ÒÐ2Ñ3Ô3Ð3Ð3Ð3r   c                 ó:   — | j                              d¦  «         d S )NzTag _tag;

r®   r¤   s      r   rd  zHUnionEmitter.emitTagMemberþ  s   € ØŒ×Ò˜/Ñ*Ô*Ð*Ð*Ð*r   c           	      óŽ  — | j                              d¦  «         | j                              d¦  «        5  |                     ¦   «         D ]H}| j                              d                     t          |j        ¦  «        |j        ¬¦  «        ¦  «         ŒI	 d d d ¦  «         n# 1 swxY w Y   | j                              d¦  «         d S )Nzunion {
r°   z{member_type} _{member_name};
rý   rj  )rT   rk   r¸   r¹   r9   r=   rA   r6   rÑ   s       r   re  zHUnionEmitter.emitUnionMembers  s  € ØŒ×Ò˜+Ñ&Ô&Ð&ØŒ[×Ò Ñ"Ô"ð 	.ð 	.ØŸ,š,™.œ.ð .ð .�Ø”×!Ò!Ð"C×"JÒ"JÝ .¨v¬{Ñ ;Ô ;Ø &¤ð #Kñ #-ô #-ñ .ô .ð .ð .ð.ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð
 	Œ×Ò˜&Ñ!Ô!Ð!Ð!Ð!s   µAB Â B$Â'B$N)r`   ra   rb   rƒ   r    r¢   r]  rî   r^  r_  r`  ra  rb  rï   rð   rñ   rò   r÷   rc  rd  re  rY   r   r   r‚   r‚   X  s;  € € € € € ð='ð ='ð ='ð~$ð $ð $ðeð eð eð
Ið Ið Ið$ð $ð $ð Wð Wð WðEð Eð Eðtð tð tðCð Cð Cð
$ð $ð $ð0Uð Uð UðWð Wð Wð6ð 6ð 6ð$ð $ð $ðð ð ð4ð 4ð 4ð+ð +ð +ð"ð "ð "ð "ð "r   r‚   c                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )ÚTagHUnionTagEmitterc                 óL  — t          ¦   «         }|                     |¦  «         |j        ry| j                             d                     |j        ¬¦  «        ¦  «          | j        |g|¢R i |¤Ž | j                             d                     |j        ¬¦  «        ¦  «         d S d S rv   )rL  rl   rP  rT   rk   r9   r6   rx   )rV   r[   r\   r]   Ú
discoverers        r   ry   z'TagHUnionTagEmitter.visit_NamespaceDecl  sº   € Ý$Ñ&Ô&ˆ
Ø×Ò˜ÑÔÐØÔð 	gØŒK×ÒÐA×HÒHÐX\ÔXaÐHÑbÔbÑcÔcÐcØˆDÔ˜tÐ5 dÐ5Ð5Ð5¨fÐ5Ð5Ð5ØŒK×ÒÐD×KÒKÐ[_Ô[dÐKÑeÔeÑfÔfÐfÐfÐfð	gð 	gr   c           	      óœ  — t          |j        d                     |j        ¬¦  «        |                     ¦   «         d                     |                     ¦   «         ¬¦  «        d¬¦  «        }|                     ¦   «         }|                      ||¦  «         | j                             t          j	         dj        di |¤Ž¦  «        ¦  «         d S )NrS  rT  rV  ©rU  rY  rZ  r[  rê   zO            const char* {tag_name}ToString(const {tag_name} tag);

            rY   )
r›   r6   r9   r?   r¹   ÚemitTagsrT   rk   r¨   r©   )rV   r[   r¥   r¹   s       r   rƒ   z#TagHUnionTagEmitter.visit_UnionDecl  sà   € ÝØ”yØ&×-Ò-¸¼Ð-ÑCÔCØ!%×!:Ò!:Ñ!<Ô!<Ø0×7Ò7À4×C\ÒC\ÑC^ÔC^Ð7Ñ_Ô_Øð!ñ !ô !ˆð —,’,‘.”.ˆØ�Š�d˜GÑ$Ô$Ð$ØŒ×Ò�(œ/ð +ð +ô ð+"ð +"ð !ð+"ð +"ñ #ô #ñ 	$ô 	$ð 	$ð 	$ð 	$r   c                 ór  — | j                               dj        di |¤Ž¦  «         | j                              d¦  «        5  g }|                     ¦   «         D ]Ã}|j        rj|j        j        dk    rt          |j        ¦  «        nt          |j        ¦  «        }d                     |j
        ¬¦  «        }d                     |¬¦  «        }nd                     |j
        ¬¦  «        }d	}d
                     |j        ¬¦  «        }|                     |||f¦  «         ŒÄ dj        di |¤Ž}d                     |j        ¬¦  «        }|                     ||f¦  «         | j                              |¦  «         d d d ¦  «         n# 1 swxY w Y   | j                              t          j        d¦  «        ¦  «         d S )Nz#enum class {tag_name} : uint8_t {{
r°   rá   r±   r²   r´   rµ   z{member_name},r·   z // {value})rº   ÚINVALIDz = {invalid_tag})Úinvalid_tagz            };

            rY   )rT   rk   r9   r¸   r¹   rþ   rA   rá   Útagr>   r6   r»   r†  r¼   r¨   r©   )	rV   r[   r¥   Úlinesr¾   r¶   r¿   rÀ   rÁ   s	            r   rƒ  zTagHUnionTagEmitter.emitTags#  s  € àŒ×ÒÐGÐ@ÔGÐRÐRÈ'ÐRÐRÑSÔSÐSàŒ[×Ò Ñ"Ô"ð 	=ð 	=ØˆEØŸ,š,™.œ.ð 	3ð 	3�Ø”;ð  Ø5;´[Ô5EÈÒ5NÐ5N¥# f¤j¡/¤/ /ÕTWÐX^ÔXbÑTcÔTc�KØ+×2Ò2¸v¼{Ð2ÑKÔK�EØ0×7Ò7ÀKÐ7ÑPÔP�F�Fà,×3Ò3ÀÄÐ3ÑLÔL�EØ�FØ#×*Ò*°´Ð*Ñ<Ô<�Ø—’˜e V¨SÐ1Ñ2Ô2Ð2Ð2à$�IÔ$Ð/Ð/ wÐ/Ð/ˆEØ'×.Ò.¸4Ô;KÐ.ÑLÔLˆFØ�LŠL˜% ˜Ñ)Ô)Ð)àŒK×5Ò5°eÑ<Ô<Ð<ð#	=ð 	=ð 	=ñ 	=ô 	=ð 	=ð 	=ð 	=ð 	=ð 	=ð 	=øøøð 	=ð 	=ð 	=ð 	=ð& 	Œ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð 	ð 	s   Á D4F Æ FÆFN)r`   ra   rb   ry   rƒ   rƒ  rY   r   r   r~  r~  
  sD   € € € € € ðgð gð gð$ð $ð $ðð ð ð ð r   r~  c                   ó   — e Zd Zd„ ZdS )ÚTagHHashEmitterc           	      óH  — t          |j        d                     |j        ¬¦  «        |                     ¦   «         d                     |                     ¦   «         ¬¦  «        d¬¦  «        }| j                              t          j        d¦  «        j        di |¤Ž¦  «         d S )NrS  rT  rV  r‚  a*              template<>
            struct std::hash<{qualified_tag_name}>
            {{
            	size_t operator()({qualified_tag_name} t) const
            	{{
            		return static_cast<std::underlying_type<{qualified_tag_name}>::type>(t);
            	}}
            }};

            rY   )r›   r6   r9   r?   rT   rk   r¨   r©   r¤   s      r   rƒ   zTagHHashEmitter.visit_UnionDeclA  s¿   € ÝØ”yØ&×-Ò-¸¼Ð-ÑCÔCØ!%×!:Ò!:Ñ!<Ô!<Ø0×7Ò7À4×C\ÒC\ÑC^ÔC^Ð7Ñ_Ô_Øð!ñ !ô !ˆð 	Œ×Òð 
�(œ/ð 
+ñ 
ô 
ô ð
#ð 
#ð "ð
#ð 
#ñ 
	$ô 
	$ð 
	$ð 
	$ð 
	$r   N)r`   ra   rb   rƒ   rY   r   r   rŠ  rŠ  ?  s#   € € € € € ð$ð $ð $ð $ð $r   rŠ  c                   óv   — e Zd Zej        ddfd„Zd„ Zd„ Zd„ Zdd
„Z	d„ Z
d„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )r‘   Nr·   c                 ó0   — || _         || _        || _        d S rF   )rT   rU   Úprefix)rV   rT   rU   rŽ  s       r   rW   zCPPUnionEmitter.__init__V  s   € ØˆŒØˆŒØˆŒˆˆr   c           
      ó  — t          |j        |j        d                     |j        ¬¦  «        |                     ¦   «         d                     |                     ¦   «         ¬¦  «        d|j        ¬¦  «        }|                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |  	                    ||¦  «         |  
                    ||¦  «         |                      ||¦  «         |                      ||¦  «         | j        j        r*t          j        |¦  «        r|                      ||¦  «         |                      ||¦  «         |                      ||¦  «         |                      ||¦  «         d S )NrS  rT  rV  rW  )r›   r6   rœ   r9   r?   r\  r    rî   rb  rð   rï   rñ   rò   rU   r§   r   rö   r÷   rc  ÚemitTagToStringr¢   r¤   s      r   rƒ   zCPPUnionEmitter.visit_UnionDecl[  s€  € åØ”yØ”}Ø&×-Ò-¸¼Ð-ÑCÔCØ!%×!:Ò!:Ñ!<Ô!<Ø0×7Ò7À4×C\ÒC\ÑC^ÔC^Ð7Ñ_Ô_ØØÔ,ð.ñ .ô .ˆð 	�Š˜˜gÑ&Ô&Ð&à×Ò˜d GÑ,Ô,Ð,Ø×Ò˜4 Ñ)Ô)Ð)Ø�Š˜˜gÑ&Ô&Ð&Ø�Š�d˜GÑ$Ô$Ð$Ø�Š�d˜GÑ$Ô$Ð$Ø×Ò˜$ Ñ(Ô(Ð(ð
 Œ<Ô ð 	3¥[Ô%YÐZ^Ñ%_Ô%_ð 	3Ø×#Ò# D¨'Ñ2Ô2Ð2à×Ò˜d GÑ,Ô,Ð,Ø×Ò˜T 7Ñ+Ô+Ð+à�Š˜˜gÑ&Ô&Ð&Ð&Ð&r   c                 ót   — | j                               t          j        d¦  «        j        di |¤Ž¦  «         d S )Nz7            // {object_type} {union_name}

            rY   rÊ   r¤   s      r   r    zCPPUnionEmitter.emitHeaderz  r  r   c           	      ór  — | j                              d¦  «         | j                               dj        di |¤Ž¦  «         | j                               dj        di |¤Ž¦  «         t          j        |d         ¦  «        }| j                              d¦  «        5  t          |¦  «        D ][\  }}d}|t          |¦  «        dz
  k    rd}| j                              d	                     t          |¦  «        |¬
¦  «        ¦  «         Œ\	 d d d ¦  «         n# 1 swxY w Y   | j                              d¦  «         d S )Nrh   z:const char* {union_name}VersionHashStr = "{union_hash}";

z0const uint8_t {union_name}VersionHash[16] = {{ 
rX  rÏ   rØ   r°   r·   rÙ   rÚ   rÝ   rY   rÞ   râ   s          r   r¢   zCPPUnionEmitter.emitFooter€  s«  € ØŒ×Ò˜$ÑÔÐØŒ×ÒÐ_ÐXÔ_ÐjÐjÐbiÐjÐjÑkÔkÐkØŒ×ÒÐTÐMÔTÐ_Ð_ÐW^Ð_Ð_Ñ`Ô`Ð`ÝÔ0°¸Ô1FÑGÔGˆØŒ[×Ò Ñ"Ô"ð 	Xð 	XÝ$ XÑ.Ô.ð Xð X‘��4Ø�	Ø�˜X™œ¨Ñ*Ò+Ð+Ø "�IØ”×!Ò!Ð":×"AÒ"AÍ3ÈtÉ9Ì9ØLUð #Bñ #Wô #Wñ Xô Xð Xð Xð	Xð	Xð 	Xð 	Xñ 	Xô 	Xð 	Xð 	Xð 	Xð 	Xð 	Xð 	Xøøøð 	Xð 	Xð 	Xð 	Xð 	Œ×Ò˜*Ñ%Ô%Ð%Ð%Ð%r"  ÚTagúGetTag()úbreak;
c                 ór  — | j                              d                     |¬¦  «        ¦  «         |                     ¦   «         D ]s}| j                              d                     |j        |¬¦  «        ¦  «         | j                              d¦  «        5   ||¦  «         d d d ¦  «         n# 1 swxY w Y   Œt| j                              d¦  «         | j                              d¦  «        5  | j                              |¦  «         d d d ¦  «         n# 1 swxY w Y   | j                              d¦  «         d S )Nzswitch({argument}) {{
©Úargumentz case {tag_type}::{member_name}:
)r³   Útag_typer°   z	default:
ú}
)rT   rk   r9   r¹   r6   r¸   )rV   r[   r¥   Úcallbackr™  r˜  Údefault_caser¾   s           r   Ú
emitSwitchzCPPUnionEmitter.emitSwitch�  s£  € ØŒ×ÒÐ3×:Ò:ÀHÐ:ÑMÔMÑNÔNÐNà—l’l‘n”nð 	!ð 	!ˆFØŒK×ÒÐA×HÒHÐU[ÔU`ÐksÐHÑtÔtÑuÔuÐuØ”×#Ò# AÑ&Ô&ð !ð !Ø�˜Ñ Ô Ð ð!ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !øð 	Œ×Ò˜,Ñ'Ô'Ð'ØŒ[×Ò Ñ"Ô"ð 	,ð 	,ØŒK×Ò˜lÑ+Ô+Ð+ð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,ð 	Œ×Ò˜%Ñ Ô Ð Ð Ð s$   ÂB+Â+B/	Â2B/	Ã+DÄDÄDc                 óþ  ‡ ‡— ‰ j                               t          j        d¦  «        j        di |¤Ž¦  «         ˆ fd„Šˆˆ fd„}‰ j                               t          j        d¦  «        j        di |¤Ž¦  «         ‰ j                              d¦  «        5  ‰                      ||‰d¬¦  «         d d d ¦  «         n# 1 swxY w Y   ‰ j                              t          j        d¦  «        ¦  «         ‰ j                               t          j        d	¦  «        j        di |¤Ž¦  «         ‰ j                              d¦  «        5  ‰                      |||d¬¦  «         d d d ¦  «         n# 1 swxY w Y   ‰ j                              t          j        d
¦  «        ¦  «         ‰ j                               t          j        d¦  «        j        di |¤Ž¦  «         ‰ j                              d¦  «        5  ‰                      ||‰d¬¦  «         d d d ¦  «         n# 1 swxY w Y   ‰ j                              t          j        d¦  «        ¦  «         ‰ j                               t          j        d¦  «        j        di |¤Ž¦  «         ‰ j                              d¦  «        5  ‰                      |||d¬¦  «         d d d ¦  «         n# 1 swxY w Y   ‰ j                              t          j        d¦  «        ¦  «         d S )Na¬              {union_name}::{union_name}(const CLAD::SafeMessageBuffer& buff)
            : _tag(Tag::INVALID)
            {{
            	Unpack(buff);
            }}

            {union_name}::{union_name}(const uint8_t* buffer, size_t length)
            : _tag(Tag::INVALID)
            {{
            	CLAD::SafeMessageBuffer buff(const_cast<uint8_t*>(buffer), length);
            	Unpack(buff);
            }}

            c           	      óÚ  •— t          | j        ¦  «        ra‰j                             d                     d                     | j        ¬¦  «        | j        t          | j        ¦  «        ¬¦  «        ¦  «         nZ‰j                             d                     d                     | j        ¬¦  «        t          | j        ¦  «        ¬¦  «        ¦  «         ‰j                             d¦  «         d S )Nz-this->{private_name} = other.{private_name};
ú_{member_name}r²   )Úprivate_namer³   r1   zBnew(&(this->{private_name})) {member_type}(other.{private_name});
©r¡  r1   r•  ©rH   rA   rT   rk   r9   r6   r=   ©r¾   rV   s    €r   Ú	copy_bodyz3CPPUnionEmitter.emitConstructors.<locals>.copy_body®  së   ø€ Ý˜vœ{Ñ+Ô+ð >Ø”×!Ò!Ð"R×"YÒ"YØ!1×!8Ò!8ÀVÄ[Ð!8Ñ!QÔ!QØ &¤Ý .¨v¬{Ñ ;Ô ;ð #Zñ #=ô #=ñ >ô >ð >ð >ð
 ”×!Ò!Ð"g×"nÒ"nØ!1×!8Ò!8ÀVÄ[Ð!8Ñ!QÔ!QÝ .¨v¬{Ñ ;Ô ;ð #oñ #=ô #=ñ >ô >ð >ð ŒK×Ò˜jÑ)Ô)Ð)Ð)Ð)r   c                 ó0  •— t          | j        ¦  «        r ‰| ¦  «         nZ‰j                             d                     d                     | j        ¬¦  «        t          | j        ¦  «        ¬¦  «        ¦  «         ‰j                             d¦  «         d S )NzMnew(&(this->{private_name})) {member_type}(std::move(other.{private_name}));
r   r²   r¢  r•  r£  )r¾   r¥  rV   s    €€r   Ú	move_bodyz3CPPUnionEmitter.emitConstructors.<locals>.move_bodyº  sœ   ø€ Ý˜vœ{Ñ+Ô+ð >Ø�	˜&Ñ!Ô!Ð!Ð!à”×!Ò!Ð"r×"yÒ"yØ!1×!8Ò!8ÀVÄ[Ð!8Ñ!QÔ!QÝ .¨v¬{Ñ ;Ô ;ð #zñ #=ô #=ñ >ô >ð >ð ŒK×Ò˜jÑ)Ô)Ð)Ð)Ð)r   z|            {union_name}::{union_name}(const {union_name}& other)
            : _tag(other._tag)
            {{
            r°   z_tag = Tag::INVALID;
break;
©rœ  z            }

            z€            {union_name}::{union_name}({union_name}&& other) noexcept
            : _tag(other._tag)
            {{
            z>            	other.ClearCurrent();
            }

            zÙ            {union_name}& {union_name}::operator=(const {union_name}& other)
            {{
            	if(this == &other) {{ return *this; }}
            	ClearCurrent();
            	_tag = other._tag;
            z6            	return *this;
            }

            zÝ            {union_name}& {union_name}::operator=({union_name}&& other) noexcept
            {{
            	if(this == &other) {{ return *this; }}
            	ClearCurrent();
            	_tag = other._tag;
            zY            	other.ClearCurrent();
            	return *this;
            }

            rY   ©rT   rk   r¨   r©   r9   r¸   r�  )rV   r[   r¥   r§  r¥  s   `   @r   rî   z CPPUnionEmitter.emitConstructors�  sõ  øø€ ØŒ×Òð �(œ/ð +ñ ô ô ð#ð #ð "ð#ð #ñ 	$ô 	$ð 	$ð 
	*ð 
	*ð 
	*ð 
	*ð 
	*ð	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	Œ×Òð �(œ/ð +ñ ô ô ð	#ð #ð "ð	#ð #ñ 	$ô 	$ð 	$ð
 Œ[×Ò Ñ"Ô"ð 	eð 	eØ�OŠO˜D '¨9ÐCcˆOÑdÔdÐdð	eð 	eð 	eñ 	eô 	eð 	eð 	eð 	eð 	eð 	eð 	eøøøð 	eð 	eð 	eð 	eàŒ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð 	Œ×Òð �(œ/ð +ñ ô ô ð	#ð #ð "ð	#ð #ñ 	$ô 	$ð 	$ð
 Œ[×Ò Ñ"Ô"ð 	eð 	eØ�OŠO˜D '¨9ÐCcˆOÑdÔdÐdð	eð 	eð 	eñ 	eô 	eð 	eð 	eð 	eð 	eð 	eð 	eøøøð 	eð 	eð 	eð 	eàŒ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð 	Œ×Òð �(œ/ð +ñ ô ô ð#ð #ð "ð#ð #ñ 	$ô 	$ð 	$ð Œ[×Ò Ñ"Ô"ð 	eð 	eØ�OŠO˜D '¨9ÐCcˆOÑdÔdÐdð	eð 	eð 	eñ 	eô 	eð 	eð 	eð 	eð 	eð 	eð 	eøøøð 	eð 	eð 	eð 	eàŒ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð 	Œ×Òð �(œ/ð +ñ ô ô ð#ð #ð "ð#ð #ñ 	$ô 	$ð 	$ð Œ[×Ò Ñ"Ô"ð 	eð 	eØ�OŠO˜D '¨9ÐCcˆOÑdÔdÐdð	eð 	eð 	eñ 	eô 	eð 	eð 	eð 	eð 	eð 	eð 	eøøøð 	eð 	eð 	eð 	eàŒ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð 	ð 	sH   ÂB<Â<C ÃC ÅE*Å*E.Å1E.Ç2HÈHÈHÊ KËK
ËK
c           
      ó:  — t          ¦   «         }|                     ¦   «         D �]ö}t          d|j        d                     |j        ¬¦  «        t	          |j        ¦  «        t          |j        ¦  «        dœ|¤Ž}| j                              t          j
        d¦  «        j        di |¤Ž¦  «         | j        r¢| j        j        r–|d         r|j        s‡|d         }||v r?t          j        |j        d                     |||         j        |j        ¦  «        ¦  «         |||<   | j                              t          j
        d¦  «        j        di |¤Ž¦  «         | j                              t          j
        d	¦  «        j        di |¤Ž¦  «         | j                             d
¦  «        5  t%          |j        ¦  «        s&| j                              dj        di |¤Ž¦  «         n%| j                              dj        di |¤Ž¦  «         d d d ¦  «         n# 1 swxY w Y   | j                              t          j
        d¦  «        j        di |¤Ž¦  «         |d         }| j                              t          j
        d¦  «        j        di |¤Ž¦  «         | j                              t          j
        d¦  «        j        di |¤Ž¦  «         t'          |j        ¦  «        s7| j                              t          j
        d¦  «        j        di |¤Ž¦  «         �Œød S )Nr   r²   )r³   r¡  rL   rr  zÿ              {union_name} {union_name}::Create{member_name}({value_type}&& new_{member_name})
              {{
              	{union_name} m;
              	m.Set_{member_name}(new_{member_name});
              	return m;
              }}

              r\  rL   zgType-based helper constructors are being generated, but there are two objects of type {0}: {1} and {2}.a                       {union_name}::{union_name}({value_type}&& new_{member_name})
                    {{
                    	new(&this->{private_name}) {value_type}(std::move(new_{member_name}));
                    	_tag = Tag::{member_name};
                    }}

                    a                  {parameter_type} {union_name}::Get_{member_name}() const
                {{
                	assert(_tag == Tag::{member_name});
                	return this->{private_name};
                }}

                void {union_name}::Set_{member_name}({parameter_type} new_{member_name})
                {{
                	if(this->_tag == Tag::{member_name}) {{
                		this->{private_name} = new_{member_name};
                	}}
                	else {{
                		ClearCurrent();
                rÏ   z<new(&this->{private_name}) {value_type}(new_{member_name});
z*this->{private_name} = new_{member_name};
ze                		_tag = Tag::{member_name};
                	}}
                }}

                a                  template<>
                const {value_type}& {union_name}::Get_<{union_name}::Tag::{member_name}>() const
                {{
                	assert(_tag == Tag::{member_name});
                	return this->{private_name};
                }}

                zü                template<>
                {union_name} {union_name}::Create_<{union_name}::Tag::{member_name}>({value_type} member)
                {{
                	return Create{member_name}(std::move(member));
                }}

                a(                      void {union_name}::Set_{member_name}({value_type}&& new_{member_name})
                    {{
                    	if (this->_tag == Tag::{member_name}) {{
                    		this->{private_name} = std::move(new_{member_name});
                    	}}
                    	else {{
                    		ClearCurrent();
                    		new(&this->{private_name}) {value_type}(std::move(new_{member_name}));
                    		_tag = Tag::{member_name};
                    	}}
                    }}

                    rY   )r›   r¹   r6   r9   r=   rA   rM   rT   rk   r¨   r©   rU   rs  rt  r   Úexit_at_coordÚcoordr¸   rH   rJ   )rV   r[   r¥   Úvalue_typesr¾   rg  rL   s          r   rb  zCPPUnionEmitter.emitAccessorsÿ  sb  € Ý‘f”fˆØ—l’l‘n”nð j	+ñ j	+ˆFÝð Ø"œKØ-×4Ò4ÀÄÐ4ÑMÔMÝ)¨&¬+Ñ6Ô6Ý1°&´+Ñ>Ô>ð	ð ð
 ðð ˆFð ŒK×Òð �hœoð /ñ ô ô ð$ð $ð #ð$ð $ñ %ô %ð %ð Œ|ð + ¤Ô ?ð +ÈÐQ`ÔIað +ÐioÔi~ð +Ø# LÔ1�
Ø Ð,Ð,ÝÔ-¨f¬lð >NßOUÊvØ&Ø'¨
Ô3Ô8Ø"œKñP)ô P)ñ*ô *ð *ð
 +1�˜JÑ'à”×!Ò!ð # ¥(¤/ð 3ñ #ô #ô  ð#*ð #*ð #)ð#*ð #*ñ +ô +ð +ð ŒK×Òð �hœoð /ñ ô ô ð&ð &ð %ð&ð &ñ 'ô 'ð 'ð  ”×#Ò# AÑ&Ô&ð fð fÝ& v¤{Ñ3Ô3ð fØ”K×%Ò%Ð&lÐ&eÔ&lÐ&vÐ&vÐouÐ&vÐ&vÑwÔwÐwÐwà”K×%Ò%Ð&ZÐ&SÔ&ZÐ&dÐ&dÐ]cÐ&dÐ&dÑeÔeÐeð	fð fð fñ fô fð fð fð fð fð fð føøøð fð fð fð fð ŒK×Òð �hœoð /ñ ô ô
 ð&ð &ð
 %ð&ð &ñ 'ô 'ð 'ð   Ô-ˆJØŒK×Òð �hœoð /ñ ô ô ð&ð &ð %ð&ð &ñ 'ô 'ð 'ð ŒK×Òð �hœoð /ñ ô ô ð&ð &ð %ð&ð &ñ 'ô 'ð 'õ $ F¤KÑ0Ô0ð +Ø”×!Ò!ð # ¥(¤/ð 3ñ #ô #ô  ð#*ð #*ð #)ð#*ð #*ñ +ô +ð +ùð{j	+ð j	+s   Æ*A HÈH	ÈH	c                 ó¢  ‡ ‡— t          ‰ j        ‰ j        ¦  «        Šˆ ˆfd„}‰ j                              t	          j        d¦  «        j        di |¤Ž¦  «         ‰ j                             d¦  «        5  ‰                      |||¦  «         d d d ¦  «         n# 1 swxY w Y   ‰ j                             t	          j        d¦  «        ¦  «         d S )Nc                 ó¦   •— ‰                      | j        d                     | j        ¬¦  «        ¬¦  «         ‰j                             d¦  «         d S ©Nr   r²   r•  ©rl   rA   r9   r6   rT   rk   ©r¾   rV   r6  s    €€r   Úbodyz&CPPUnionEmitter.emitPack.<locals>.bodyo  óW   ø€ Ø�MŠM˜&œ+Ø,×3Ò3ÀÄÐ3ÑLÔLð ñ Nô Nð NàŒK×Ò˜jÑ)Ô)Ð)Ð)Ð)r   aP              size_t {union_name}::Pack(uint8_t* buff, size_t len) const
            {{
            	CLAD::SafeMessageBuffer buffer(buff, len, false);
            	return Pack(buffer);
            }}

            size_t {union_name}::Pack(CLAD::SafeMessageBuffer& buffer) const
            {{
            	buffer.Write(_tag);
            r°   zI            	return buffer.GetBytesWritten();
            }

            rY   )	r4  rT   rU   rk   r¨   r©   r9   r¸   r�  ©rV   r[   r¥   r³  r6  s   `   @r   rï   zCPPUnionEmitter.emitPackm  sA  øø€ Ý)¨$¬+°t´|ÑDÔDˆð	*ð 	*ð 	*ð 	*ð 	*ð 	*ð
 	Œ×Òð 
�(œ/ð 
+ñ 
ô 
ô ð
#ð 
#ð "ð
#ð 
#ñ 
	$ô 
	$ð 
	$ð Œ[×Ò Ñ"Ô"ð 	1ð 	1Ø�OŠO˜D '¨4Ñ0Ô0Ð0ð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1àŒ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð 	ð 	ó   Á4BÂBÂBc                 ó¦  ‡ ‡— t          ‰ j        ‰ j        ¦  «        Šˆ ˆfd„}‰ j                              t	          j        d¦  «        j        di |¤Ž¦  «         ‰ j                             d¦  «        5  ‰                      |||d¬¦  «         d d d ¦  «         n# 1 swxY w Y   ‰ j                             t	          j        d¦  «        ¦  «         d S )Nc                 ój  •— d                      | j        ¬¦  «        }t          | j        ¦  «        r‰                     | j        |¬¦  «         �nJt          | j        t          j        ¦  «        r¼‰j         	                    t          j        d¦  «                              |t          | j        ¦  «        ¬¦  «        ¦  «         ‰j                             d¦  «        5  ‰                     | j        |¬¦  «         d d d ¦  «         n# 1 swxY w Y   ‰j         	                    d¦  «         no‰j         	                    t          j        d¦  «                              |t          | j        ¦  «        ¬¦  «        ¦  «         ‰                     | j        |¬¦  «         ‰j         	                    d¦  «         d S )	Nr   r²   z½                    if (newTag != oldTag) {{
                    	new(&(this->{private_name})) {member_type}(buffer);
                    }}
                    else {{
                    r¢  r°   rš  z¿                    if (newTag == oldTag) {{
                    	ClearCurrent();
                    }}
                    new(&(this->{private_name})) {member_type}();
                    r•  )r9   r6   rH   rA   rl   r4   r   rB  rT   rk   r¨   r©   r=   r¸   )r¾   r¡  rV   r6  s     €€r   r³  z(CPPUnionEmitter.emitUnpack.<locals>.body‰  sø  ø€ Ø+×2Ò2¸v¼{Ð2ÑKÔKˆLÝ˜vœ{Ñ+Ô+ð EØ—’˜fœk°|�ÑDÔDÐDÑDÝ˜FœK­Ô)9Ñ:Ô:ð EØ”×!Ò!¥(¤/ð 3ñ #ô #÷
  šØ%1Ý$2°6´;Ñ$?Ô$?ð  ñ Aô AñBô Bð Bð ”[×'Ò'¨Ñ*Ô*ð Ið IØ—M’M &¤+¸<�MÑHÔHÐHðIð Ið Iñ Iô Ið Ið Ið Ið Ið Ið Iøøøð Ið Ið Ið Ià”×!Ò! %Ñ(Ô(Ð(Ð(ð ”×!Ò!¥(¤/ð 3ñ #ô #÷
  šØ%1Ý$2°6´;Ñ$?Ô$?ð  ñ Aô AñBô Bð Bð —’˜fœk°|�ÑDÔDÐDØŒK×Ò˜jÑ)Ô)Ð)Ð)Ð)s   ÃDÄDÄDa#              size_t {union_name}::Unpack(const uint8_t* buff, const size_t len)
            {{
            	const CLAD::SafeMessageBuffer buffer(const_cast<uint8_t*>(buff), len, false);
            	return Unpack(buffer);
            }}

            size_t {union_name}::Unpack(const CLAD::SafeMessageBuffer& buffer)
            {{
            	Tag newTag {{Tag::INVALID}};
            	const Tag oldTag {{GetTag()}};
            	buffer.Read(newTag);
            	if (newTag != oldTag) {{
            		ClearCurrent();
            	}}
            r°   ÚnewTagr—  zb            	_tag = newTag;
            	return buffer.GetBytesRead();
            }

            rY   )	r9  rT   rU   rk   r¨   r©   r9   r¸   r�  rµ  s   `   @r   rð   zCPPUnionEmitter.emitUnpack‡  sV  øø€ Ý+¨D¬K¸¼ÑFÔFˆð	*ð 	*ð 	*ð 	*ð 	*ð 	*ð: 	Œ×Òð �(œ/ð +ñ ô ô ð#ð #ð "ð#ð #ñ 	$ô 	$ð 	$ð" Œ[×Ò Ñ"Ô"ð 	Dð 	DØ�OŠO˜D '¨4¸(ˆOÑCÔCÐCð	Dð 	Dð 	Dñ 	Dô 	Dð 	Dð 	Dð 	Dð 	Dð 	Dð 	Døøøð 	Dð 	Dð 	Dð 	DàŒ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð 	ð 	s   Á4BÂBÂ!Bc                 ó¢  ‡ ‡— t          ‰ j        ‰ j        ¦  «        Šˆ ˆfd„}‰ j                              t	          j        d¦  «        j        di |¤Ž¦  «         ‰ j                             d¦  «        5  ‰                      |||¦  «         d d d ¦  «         n# 1 swxY w Y   ‰ j                             t	          j        d¦  «        ¦  «         d S )Nc                 ó¦   •— ‰                      | j        d                     | j        ¬¦  «        ¬¦  «         ‰j                             d¦  «         d S r°  r±  r²  s    €€r   r³  z&CPPUnionEmitter.emitSize.<locals>.bodyÂ  r´  r   z{            size_t {union_name}::Size() const
            {{
            	size_t result {{1}}; // tag = uint_8
            r°   r;  rY   )	r<  rT   rU   rk   r¨   r©   r9   r¸   r�  rµ  s   `   @r   rñ   zCPPUnionEmitter.emitSizeÀ  sA  øø€ Ý)¨$¬+°t´|ÑDÔDˆð	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	Œ×Òð �(œ/ð +ñ ô ô ð	#ð #ð "ð	#ð #ñ 	$ô 	$ð 	$ð
 Œ[×Ò Ñ"Ô"ð 	1ð 	1Ø�OŠO˜D '¨4Ñ0Ô0Ð0ð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1àŒ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð 	ð 	r¶  c           	      ó„  ‡ — ˆ fd„}‰ j                               t          j        d¦  «        j        di |¤Ž¦  «         ‰ j                              d¦  «        5  ‰                      |||d¬¦  «         d d d ¦  «         n# 1 swxY w Y   ‰ j                              t          j         dj        di |¤Ž¦  «        ¦  «         d S )Nc                 óš   •— d                      | j        ¬¦  «        }‰j                             d                      |¬¦  «        ¦  «         d S )Nr   r²   z5return this->{private_name} == other.{private_name};
©r¡  )r9   r6   rT   rk   ©r¾   r¡  rV   s     €r   r³  z*CPPUnionEmitter.emitEquality.<locals>.bodyÖ  s[   ø€ Ø+×2Ò2¸v¼{Ð2ÑKÔKˆLØŒK×ÒÐV×]Ò]Ø)ð ^ñ +ô +ñ ,ô ,ð ,ð ,ð ,r   zÀ            bool {union_name}::operator==(const {union_name}& other) const
            {{
            	if (this->_tag != other._tag) {{
            		return false;
            	}}
            r°   r>  r¨  z°            }}

            bool {union_name}::operator!=(const {union_name}& other) const
            {{
            	return !(operator==(other));
            }}

            rY   r©  ©rV   r[   r¥   r³  s   `   r   rò   zCPPUnionEmitter.emitEqualityÕ  sa  ø€ ð	,ð 	,ð 	,ð 	,ð 	,ð
 	Œ×Òð �(œ/ð +ñ ô ô ð#ð #ð "ð#ð #ñ 	$ô 	$ð 	$ð Œ[×Ò Ñ"Ô"ð 	Pð 	PØ�OŠO˜D '¨4Ð>NˆOÑOÔOÐOð	Pð 	Pð 	Pñ 	Pô 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pøøøð 	Pð 	Pð 	Pð 	PàŒ×Ò�(œ/ð +ð +ô ð+"ð +"ð !ð+"ð +"ñ #ô #ñ 	$ô 	$ð 	$ð 	$ð 	$s   ÁA>Á>BÂBc                 óà  ‡ — ‰ j                               t          j        d¦  «        j        di |¤Ž¦  «         ˆ fd„}‰ j                              d¦  «        5  ‰                      |||¦  «         d d d ¦  «         n# 1 swxY w Y   ‰ j                              t          j        d¦  «        ¦  «         ‰ j                               t          j        d¦  «        j        di |¤Ž¦  «         ‰ j                              d¦  «        5  |                     ¦   «         D �]}‰ j                              d                     |j        ¬¦  «        ¦  «         ‰ j                              d¦  «        5  d	                     |j        ¬¦  «        }‰ j                              d
                     |t          |j
        ¦  «        ¬¦  «        ¦  «         t          |j
        ¦  «        €©t          |j
        j        t          j        ¦  «        rQ|j
        j                             ¦   «         dk    r/‰ j                              d                     |¬¦  «        ¦  «         nu‰ j                              d                     |j        ¬¦  «        ¦  «         nA‰ j                              d                     |t          |j
        ¦  «        ¬¦  «        ¦  «         ‰ j                              d                     |j        ¬¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   ‰ j                              d¦  «         �Œ	 d d d ¦  «         n# 1 swxY w Y   ‰ j                              t          j        d¦  «        ¦  «         d S )Nzp            Json::Value {union_name}::GetJSON() const
            {{
            	Json::Value root;
            c                 ó®  •— d                      | j        ¬¦  «        }t          | j        ¦  «        €©t	          | j        j        t          j        ¦  «        rQ| j        j                             ¦   «         dk    r/‰j	         
                    d                      |¬¦  «        ¦  «         nb‰j	         
                    d                      | j        ¬¦  «        ¦  «         n.‰j	         
                    d                      |¬¦  «        ¦  «         ‰j	         
                    d                      | j        ¬¦  «        ¦  «         ‰j	         
                    d	¦  «         d S )
Nr   r²   rë   z'root = this->{private_name}.GetJSON();
r¾  z&// {member_name} is not serializable.
z&root["value"] = this->{private_name};
z root["type"] = "{member_name}";
r•  )r9   r6   rP   rA   r4   r&  r   ÚMessageDeclrê   rT   rk   r¿  s     €r   r³  z0CPPUnionEmitter.emitJSONSerializer.<locals>.bodyõ  s-  ø€ Ø+×2Ò2¸v¼{Ð2ÑKÔKˆLÝ  ¤Ñ-Ô-Ð5Ý˜fœkÔ3µS´_ÑEÔEð qÈ&Ì+ÔJ_×JkÒJkÑJmÔJmÐq|ÒJ|ÐJ|Ø”K×%Ò%Ð&P×&WÒ&WÐeqÐ&WÑ&rÔ&rÑsÔsÐsÐsà”K×%Ò%Ð&O×&VÒ&VÐciÔcnÐ&VÑ&oÔ&oÑpÔpÐpÐpà”×!Ò!Ð"K×"RÒ"RÐ`lÐ"RÑ"mÔ"mÑnÔnÐnØŒK×ÒÐA×HÒHÐU[ÔU`ÐHÑaÔaÑbÔbÐbØŒK×Ò˜jÑ)Ô)Ð)Ð)Ð)r   r°   z(        	return root;
        }
        aÀ  
            bool {union_name}::SetFromJSON(const Json::Value& json)
            {{
              ClearCurrent();

              bool result = false;

              if(json.isMember("type")) {{
                std::string tagStr = json["type"].asString();

                try {{

                  if(tagStr == "INVALID") {{
                    // Already cleared, do nothing.
                    result = true;  
                  }}
            é   z&else if(tagStr == "{member_name}") {{
r²   r   z,new(&(this->{private_name})) {member_type};
r¢  rë   z1result = this->{private_name}.SetFromJSON(json);
r¾  zJ// {member_name} is not a structure, is not serializable.
result = false;
zAthis->{private_name} = json["value"].{as_method};
result = true;
)r¡  rI  z_tag = Tag::{member_name};
rš  z¶
                }
                catch(Json::LogicError) {
                  result = false;
                }
              }

              return result;
            }

        rY   )rT   rk   r¨   r©   r9   r¸   r�  r¹   r6   r=   rA   rP   r4   r&  r   rÃ  rê   )rV   r[   r¥   r³  r¾   r¡  s   `     r   r÷   z"CPPUnionEmitter.emitJSONSerializerî  sÛ  ø€ ØŒ×Òð �(œ/ð +ñ ô ô ð	#ð #ð "ð	#ð #ñ 	$ô 	$ð 	$ð
	*ð 
	*ð 
	*ð 
	*ð 
	*ð Œ[×Ò Ñ"Ô"ð 	1ð 	1Ø�OŠO˜D '¨4Ñ0Ô0Ð0ð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	Œ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð
 	Œ×Òð �(œ/ð +ñ ô ô  ð!#ð #ð  "ð!#ð #ñ 	$ô 	$ð 	$ð$ Œ[×Ò Ñ"Ô"ð 	)ð 	)ØŸ,š,™.œ.ð )ñ )�Ø”×!Ò!Ð"K×"RÒ"RÐ_eÔ_jÐ"RÑ"kÔ"kÑlÔlÐlØ”[×'Ò'¨Ñ*Ô*ð 
fð 
fØ#3×#:Ò#:ÀvÄ{Ð#:Ñ#SÔ#S�LØ”K×%Ò%Ð&U×&\Ò&\Ðjvõ  ESð  TZô  T_ñ  E`ô  E`Ð&\ñ  'aô  'añ  bô  bð  bÝ(¨¬Ñ5Ô5Ð=Ý% f¤kÔ&;½S¼_ÑMÔMð ^ÐRXÔR]ÔRg×RsÒRsÑRuÔRuð  zEò  SEð  SEØ œK×-Ò-Ð.b×.iÒ.ið  xDÐ.iñ  /Eô  /Eñ  Fô  Fð  Fð  Fà œK×-Ò-Ð.|÷  /Dò  /Dð  QWô  Q\ð  /Dñ  /]ô  /]ñ  ^ô  ^ð  ^ð  ^àœ×)Ò)Ð*o×*vÒ*vð  EQõ  ]nð  ouô  ozñ  ]{ô  ]{Ð*vñ  +|ô  +|ñ  }ô  }ð  }Ø”K×%Ò%Ð&D×&KÒ&KÐX^ÔXcÐ&KÑ&dÔ&dÑeÔeÐeð
fð 
fð 
fñ 
fô 
fð 
fð 
fð 
fð 
fð 
fð 
føøøð 
fð 
fð 
fð 
fð ”×!Ò! %Ñ(Ô(Ð(Ñ(ð)ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð" 	Œ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð 	ð 	sJ   ÁA<Á<B ÂB ÄA%L7Å)FLË7L7ÌLÌL7Ì
LÌL7Ì7L;Ì>L;c                 ój  ‡ — ˆ fd„}‰ j                               t          j        d¦  «        j        di |¤Ž¦  «         ‰ j                              d¦  «        5  ‰                      |||¦  «         d d d ¦  «         n# 1 swxY w Y   ‰ j                              t          j        d¦  «        ¦  «         d S )Nc                 ó  •— t          | j        ¦  «        sZ‰j                             d                     d                     | j        ¬¦  «        t          | j        ¦  «        ¬¦  «        ¦  «         ‰j                             d¦  «         d S )Nz!{private_name}.~{member_type}();
r   r²   r¢  r•  )rH   rA   rT   rk   r9   r6   rD   r¤  s    €r   r³  z.CPPUnionEmitter.emitClearCurrent.<locals>.body:  s�   ø€ Ý# F¤KÑ0Ô0ð Ià”×!Ò!Ð"F×"MÒ"MØ!1×!8Ò!8ÀVÄ[Ð!8Ñ!QÔ!QÝ 9¸&¼+Ñ FÔ Fð #Nñ #Hô #Hñ Iô Ið Ið ŒK×Ò˜jÑ)Ô)Ð)Ð)Ð)r   zI            void {union_name}::ClearCurrent()
            {{
            r°   z=            	_tag = Tag::INVALID;
            }

            rY   r©  rÀ  s   `   r   rc  z CPPUnionEmitter.emitClearCurrent9  s(  ø€ ð	*ð 	*ð 	*ð 	*ð 	*ð 	Œ×Òð �(œ/ð +ñ ô ô ð#ð #ð "ð#ð #ñ 	$ô 	$ð 	$ð Œ[×Ò Ñ"Ô"ð 	1ð 	1Ø�OŠO˜D '¨4Ñ0Ô0Ð0ð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1àŒ×Ò�(œ/ð +ñ ô ñ 	ô 	ð 	ð 	ð 	s   ÁA<Á<B ÂB c           	      ó^  ‡ ‡— ˆˆ fd„}‰ j                               t          j        d¦  «        j        d	i ‰¤Ž¦  «         ‰ j                              d¦  «        5  ‰                      |‰|‰d         dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   ‰ j                              d¦  «         d S )
Nc                 ó`   •— ‰j                               dj        dd| j        i‰¤Ž¦  «         d S )Nzreturn "{member_name}";
r³   rY   ©rT   rk   r9   r6   )r¾   r¥   rV   s    €€r   r³  z-CPPUnionEmitter.emitTagToString.<locals>.bodyO  s<   ø€ ØŒK×ÒÐ@Ð9Ô@ÐdÐdÈVÌ[ÐdÐ\cÐdÐdÑeÔeÐeÐeÐer   zP            const char* {tag_name}ToString(const {tag_name} tag) {{
            r°   rY  r‡  zreturn "INVALID";
)r™  r˜  rœ  rš  rY   r©  rÀ  s   ` ` r   r�  zCPPUnionEmitter.emitTagToStringN  sC  øø€ ð	fð 	fð 	fð 	fð 	fð 	fð 	Œ×Òð �(œ/ð +ñ ô äð#ð #à!ð#ð #ñ 	$ô 	$ð 	$ð Œ[×Ò Ñ"Ô"ð 	bð 	bØ�OŠO˜D '¨4Ø  Ô,°uÐK`ð ñ bô bð bð	bð 	bð 	bñ 	bô 	bð 	bð 	bð 	bð 	bð 	bð 	bøøøð 	bð 	bð 	bð 	bð 	Œ×Ò˜%Ñ Ô Ð Ð Ð s   Á"BÂBÂB)r“  r”  r•  )r`   ra   rb   r   rd   rW   rƒ   r    r¢   r�  rî   rb  rï   rð   rñ   rò   r÷   rc  r�  rY   r   r   r‘   r‘   U  s  € € € € € Ø!œj°$¸rð ð ð ð ð
'ð 'ð 'ð>$ð $ð $ð&ð &ð &ð!ð !ð !ð !ð`ð `ð `ðDl+ð l+ð l+ð\ð ð ð47ð 7ð 7ðrð ð ð*$ð $ð $ð2Ið Ið IðVð ð ð*
!ð 
!ð 
!ð 
!ð 
!r   r‘   c                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )r4  c                 ób   — | j                              d                     |¬¦  «        ¦  «         d S )Nz#buffer.Write(this->{member_name});
r²   rú   ©rV   r[   r³   s      r   Úvisit_BuiltinTypez)CPPPackStatementEmitter.visit_BuiltinType\  s1   € ØŒ×ÒÐ@×GÒGÐT_ÐGÑ`Ô`ÑaÔaÐaÐaÐar   c                 ó    —  | j         |i |¤Ž d S rF   ©rÍ  ©rV   r\   r]   s      r   Úvisit_DefinedTypez)CPPPackStatementEmitter.visit_DefinedType_  ó    € ØˆÔ Ð/¨Ð/Ð/Ð/Ð/Ð/r   c                 óˆ   — | j                              d                     t          |j        ¦  «        |¬¦  «        ¦  «         d S )Nz9buffer.WritePString<{length_type}>(this->{member_name});
©Úlength_typer³   ©rT   rk   r9   r=   rÕ  rÌ  s      r   Úvisit_PascalStringTypez.CPPPackStatementEmitter.visit_PascalStringTypeb  sP   € ØŒ×ÒÐV×]Ò]Ý& tÔ'7Ñ8Ô8Ø#ð ^ñ %ô %ñ 	&ô 	&ð 	&ð 	&ð 	&r   c                 ób   — | j                              d                     |¬¦  «        ¦  «         d S )Nz"this->{member_name}.Pack(buffer);
r²   rú   rÌ  s      r   Úvisit_CompoundTypez*CPPPackStatementEmitter.visit_CompoundTypeg  ó1   € ØŒ×ÒÐ?×FÒFÐS^ÐFÑ_Ô_Ñ`Ô`Ð`Ð`Ð`r   c                 ó  — t          |j        t          j        ¦  «        rN| j                             d                     |j        t          |j        j	        ¦  «        |¬¦  «        ¦  «         d S t          |j        t          j
        ¦  «        rU| j                             t          j        d¦  «                             |t          |j        ¦  «        ¬¦  «        ¦  «         d S t          |j        t          ¦  «        rI| j                             d                     |j        t          |j        ¦  «        |¬¦  «        ¦  «         d S | j                             d                     |j        t          |j        ¦  «        |¬¦  «        ¦  «         d S )NzPbuffer.WritePStringFArray<{length}, {string_length_type}>(this->{member_name});
©r3   Ústring_length_typer³   ú€                for ({parameter_type} m : {member_name}) {{
                	m.Pack(buffer);
                }}
                ©r³   rr  zWbuffer.WriteFArray<{member_type}, static_cast<size_t>({length})>(this->{member_name});
©r3   r1   r³   zBbuffer.WriteFArray<{member_type}, {length}>(this->{member_name});
)r4   r1   r   r:   rT   rk   r9   r3   r=   rÕ  rB  r¨   r©   rM   r>   rÌ  s      r   Úvisit_FixedArrayTypez,CPPPackStatementEmitter.visit_FixedArrayTypej  s²  € Ý�dÔ&­Ô(<Ñ=Ô=ð 	.ØŒK×ÒÐq×xÒxØ”{Ý#1°$Ô2BÔ2NÑ#OÔ#OØ'ð yñ )ô )ñ *ô *ð *ð *ð *õ ˜Ô(­#Ô*:Ñ;Ô;ð 	.ØŒK×Ò�hœoð /ñ ô ÷ ’V¨Ý#5°dÔ6FÑ#GÔ#Gð ñ Iô Iñ	Jô Jð Jð Jð Jõ ˜$œ+¥sÑ+Ô+ð 	.Ø”×!Ò!Ð"|÷  #Dò  #DØœ;Ý .¨tÔ/?Ñ @Ô @Ø +ð #Dñ #-ô #-ñ .ô .ð .ð .ð .ð
 ”×!Ò!Ð"g×"nÒ"nØœ;Ý .¨tÔ/?Ñ @Ô @Ø +ð #oñ #-ô #-ñ .ô .ð .ð .ð .r   c                 ó  — t          |j        t          j        ¦  «        r[| j                             d                     t          |j        ¦  «        t          |j        j        ¦  «        |¬¦  «        ¦  «         d S t          |j        t          j	        ¦  «        r–| j                             d                     t          |j        ¦  «        |¬¦  «        ¦  «         | j                             t          j        d¦  «                             |t          |j        ¦  «        ¬¦  «        ¦  «         d S | j                             d                     t          |j        ¦  «        t          |j        ¦  «        |¬¦  «        ¦  «         d S )	Nz[buffer.WritePStringVArray<{array_length_type}, {string_length_type}>(this->{member_name});
©Úarray_length_typerÝ  r³   zFbuffer.Write(static_cast<{array_length_type}>({member_name}.size()));
)rä  r³   rÞ  rß  zGbuffer.WriteVArray<{member_type}, {length_type}>(this->{member_name});
©r1   rÕ  r³   )r4   r1   r   r:   rT   rk   r9   r=   rÕ  rB  r¨   r©   rM   rÌ  s      r   Úvisit_VariableArrayTypez/CPPPackStatementEmitter.visit_VariableArrayTypeƒ  s¡  € Ý�dÔ&­Ô(<Ñ=Ô=ð 	*ØŒK×ÒÐ|÷  Dò  DÝ"0°Ô1AÑ"BÔ"BÝ#1°$Ô2BÔ2NÑ#OÔ#OØ'ð Dñ )ô )ñ *ô *ð *ð *ð *õ ˜Ô(­#Ô*:Ñ;Ô;ð 	*ØŒK×ÒÐg×nÒnÝ"0°Ô1AÑ"BÔ"BØ'ð oñ )ô )ñ *ô *ð *ð ŒK×Ò�hœoð /ñ ô ÷ ’V¨Ý#5°dÔ6FÑ#GÔ#Gð ñ Iô Iñ	Jô Jð Jð Jð Jð ŒK×ÒÐh×oÒoÝ*¨4Ô+;Ñ<Ô<Ý*¨4Ô+;Ñ<Ô<Ø'ð pñ )ô )ñ *ô *ð *ð *ð *r   N©	r`   ra   rb   rÍ  rÑ  r×  rÙ  rá  ræ  rY   r   r   r4  r4  Z  st   € € € € € ðbð bð bð0ð 0ð 0ð&ð &ð &ð
að að að.ð .ð .ð2*ð *ð *ð *ð *r   r4  c                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )r9  c                 ób   — | j                              d                     |¬¦  «        ¦  «         d S )Nz"buffer.Read(this->{member_name});
r²   rú   rÌ  s      r   rÍ  z+CPPUnpackStatementEmitter.visit_BuiltinType›  rÚ  r   c                 ó    —  | j         |i |¤Ž d S rF   rÏ  rÐ  s      r   rÑ  z+CPPUnpackStatementEmitter.visit_DefinedTypež  rÒ  r   c                 óˆ   — | j                              d                     t          |j        ¦  «        |¬¦  «        ¦  «         d S )Nz8buffer.ReadPString<{length_type}>(this->{member_name});
rÔ  rÖ  rÌ  s      r   r×  z0CPPUnpackStatementEmitter.visit_PascalStringType¡  sP   € ØŒ×ÒÐU×\Ò\Ý& tÔ'7Ñ8Ô8Ø#ð ]ñ %ô %ñ 	&ô 	&ð 	&ð 	&ð 	&r   c                 ób   — | j                              d                     |¬¦  «        ¦  «         d S )Nz$this->{member_name}.Unpack(buffer);
r²   rú   rÌ  s      r   rÙ  z,CPPUnpackStatementEmitter.visit_CompoundType¦  s1   € ØŒ×ÒÐA×HÒHÐU`ÐHÑaÔaÑbÔbÐbÐbÐbr   c                 ó  — t          |j        t          j        ¦  «        rN| j                             d                     |j        t          |j        j	        ¦  «        |¬¦  «        ¦  «         d S t          |j        t          j
        ¦  «        rI| j                             d                     t          |j        ¦  «        |j        |¬¦  «        ¦  «         d S t          |j        t          ¦  «        rI| j                             d                     |j        t          |j        ¦  «        |¬¦  «        ¦  «         d S | j                             d                     |j        t          |j        ¦  «        |¬¦  «        ¦  «         d S )NzObuffer.ReadPStringFArray<{length}, {string_length_type}>(this->{member_name});
rÜ  zMbuffer.ReadCompoundTypeFArray<{member_type}, {length}>(this->{member_name});
)r1   r3   r³   zVbuffer.ReadFArray<{member_type}, static_cast<size_t>({length})>(this->{member_name});
rà  zAbuffer.ReadFArray<{member_type}, {length}>(this->{member_name});
)r4   r1   r   r:   rT   rk   r9   r3   r=   rÕ  rB  r>   rÌ  s      r   rá  z.CPPUnpackStatementEmitter.visit_FixedArrayType©  s¡  € Ý�dÔ&­Ô(<Ñ=Ô=ð 	.ØŒK×ÒÐp×wÒwØ”{Ý#1°$Ô2BÔ2NÑ#OÔ#OØ'ð xñ )ô )ñ *ô *ð *ð *ð *õ ˜Ô(­#Ô*:Ñ;Ô;ð 	.ØŒK×ÒÐn×uÒuÝ+¨DÔ,<Ñ=Ô=ØœØ(ð vñ *ô *ñ +ô +ð +ð +ð +õ
 ˜$œ+¥sÑ+Ô+ð 	.Ø”×!Ò!Ð"{÷  #Cò  #CØœ;Ý .¨tÔ/?Ñ @Ô @Ø +ð #Cñ #-ô #-ñ .ô .ð .ð .ð .ð
 ”×!Ò!Ð"f×"mÒ"mØœ;Ý .¨tÔ/?Ñ @Ô @Ø +ð #nñ #-ô #-ñ .ô .ð .ð .ð .r   c                 óŒ  — t          |j        t          j        ¦  «        r[| j                             d                     t          |j        ¦  «        t          |j        j        ¦  «        |¬¦  «        ¦  «         d S t          |j        t          j	        ¦  «        rV| j                             d                     t          |j        ¦  «        t          |j        ¦  «        |¬¦  «        ¦  «         d S | j                             d                     t          |j        ¦  «        t          |j        ¦  «        |¬¦  «        ¦  «         d S )NzZbuffer.ReadPStringVArray<{array_length_type}, {string_length_type}>(this->{member_name});
rã  zRbuffer.ReadCompoundTypeVArray<{member_type}, {length_type}>(this->{member_name});
rå  zFbuffer.ReadVArray<{member_type}, {length_type}>(this->{member_name});
)
r4   r1   r   r:   rT   rk   r9   r=   rÕ  rB  rÌ  s      r   ræ  z1CPPUnpackStatementEmitter.visit_VariableArrayTypeÀ  sS  € Ý�dÔ&­Ô(<Ñ=Ô=ð 	*ØŒK×ÒÐ{÷  Cò  CÝ"0°Ô1AÑ"BÔ"BÝ#1°$Ô2BÔ2NÑ#OÔ#OØ'ð Cñ )ô )ñ *ô *ð *ð *ð *õ ˜Ô(­#Ô*:Ñ;Ô;ð 		*ØŒK×ÒÐs×zÒzÝ*¨4Ô+;Ñ<Ô<Ý*¨4Ô+;Ñ<Ô<Ø'ð {ñ )ô )ñ *ô *ð *ð *ð *ð
 ŒK×ÒÐg×nÒnÝ*¨4Ô+;Ñ<Ô<Ý*¨4Ô+;Ñ<Ô<Ø'ð oñ )ô )ñ *ô *ð *ð *ð *r   Nrç  rY   r   r   r9  r9  ™  st   € € € € € ðað að að0ð 0ð 0ð&ð &ð &ð
cð cð cð.ð .ð .ð.*ð *ð *ð *ð *r   r9  c                   ó@   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dd	„Z
d
S )r<  c                 óx   — | j                              d                     |j        |j        ¬¦  «        ¦  «         d S )Nzresult += {size}; // {type}
)ÚsizerA   )rT   rk   r9   rñ  r6   rÌ  s      r   rÍ  z)CPPSizeStatementEmitter.visit_BuiltinTypeÓ  sH   € ØŒ×ÒÐ9×@Ò@Ø” ¤ð Añ ,ô ,ñ 	-ô 	-ð 	-ð 	-ð 	-r   c                 ó    —  | j         |i |¤Ž d S rF   rÏ  rÐ  s      r   rÑ  z)CPPSizeStatementEmitter.visit_DefinedType×  rÒ  r   c                 óÈ   — | j                              t          j        d¦  «                             |j        j        |j        j        |j        j        |¬¦  «        ¦  «         d S )Nz—            result += {length_size}; // {length_type} (string length)
            result += this->{member_name}.length(); // {member_type}
            )Úlength_sizerÕ  r1   r³   )	rT   rk   r¨   r©   r9   rÕ  rñ  r6   r1   rÌ  s      r   r×  z.CPPSizeStatementEmitter.visit_PascalStringTypeÚ  sm   € ØŒ×Ò�(œ/ð +ñ ô ÷ ’Ø Ô,Ô1Ø Ô,Ô1Ø Ô,Ô1Ø'ð	 ñ )ô )ñ	*ô 	*ð 	*ð 	*ð 	*r   c                 ón   — | j                              d                     ||j        ¬¦  «        ¦  «         d S )Nz0result += this->{member_name}.Size(); // {type}
)r³   rA   rÉ  rÌ  s      r   rÙ  z*CPPSizeStatementEmitter.visit_CompoundTypeä  sF   € ØŒ×ÒÐM×TÒTØ#¨$¬)ð Uñ 5ô 5ñ 	6ô 	6ð 	6ð 	6ð 	6r   c                 óè  — t          |j        t          j        ¦  «        rm| j                             d                     |j        j        j        |j        j        j	        |j
        |¬¦  «        ¦  «         |                      ||d¦  «         d S t          |j        t          j        ¦  «        r|                      ||¦  «         d S t          |j
        t          ¦  «        rK| j                             d                     |j        j        |j        j	        |j
        ¬¦  «        ¦  «         d S | j                             d                     |j        j        |j        j	        |j
        ¬¦  «        ¦  «         d S )NzTresult += {string_length_size} * {length}; // {string_length_type} (string lengths)
)Ústring_length_sizerÝ  r3   r³   r3   zUresult += {member_size} * static_cast<size_t>({length}); // {member_type} * {length}
)Úmember_sizer1   r3   z@result += {member_size} * {length}; // {member_type} * {length}
)r4   r1   r   r:   rT   rk   r9   rÕ  rñ  r6   r3   ÚemitRecursiveSizerB  r>   rÌ  s      r   rá  z,CPPSizeStatementEmitter.visit_FixedArrayTypeè  s…  € Ý�dÔ&­Ô(<Ñ=Ô=ð 	)ØŒK×ÒÐu×|Ò|Ø#'Ô#3Ô#?Ô#DØ#'Ô#3Ô#?Ô#DØ”{Ø'ð	 }ñ )ô )ñ *ô *ð *ð
 ×"Ò" 4¨°hÑ?Ô?Ð?Ð?Ð?Ý˜Ô(­#Ô*:Ñ;Ô;ð 	)Ø×"Ò" 4¨Ñ5Ô5Ð5Ð5Ð5å˜$œ+¥sÑ+Ô+ð 	)Ø”×!Ò!Ð"z÷  #Bò  #BØ $Ô 0Ô 5Ø $Ô 0Ô 5Øœ;ð #Bñ #(ô #(ñ )ô )ð )ð )ð )ð
 ”×!Ò!Ð"e×"lÒ"lØ $Ô 0Ô 5Ø $Ô 0Ô 5Øœ;ð #mñ #(ô #(ñ )ô )ð )ð )ð )r   c                 óŽ  — | j                              d                     |j        j        |j        j        ¬¦  «        ¦  «         t          |j        t          j	        ¦  «        rg| j                              d                     |j        j        j        |j        j        j        |¬¦  «        ¦  «         |  
                    ||d¦  «         d S t          |j        t          j        ¦  «        r|  
                    ||¦  «         d S | j                              d                     |j        j        |j        j        |¬¦  «        ¦  «         d S )Nz9result += {length_size}; // {length_type} (array length)
)rô  rÕ  úfresult += {string_length_size} * this->{member_name}.size(); // {string_length_type} (string lengths)
©r÷  rÝ  r³   r3   zGresult += {member_size} * this->{member_name}.size(); // {member_type}
)rø  r1   r³   )rT   rk   r9   rÕ  rñ  r6   r4   r1   r   r:   rù  rB  rÌ  s      r   ræ  z/CPPSizeStatementEmitter.visit_VariableArrayTypeþ  s^  € ØŒ×ÒÐV×]Ò]ØÔ(Ô-ØÔ(Ô-ð ^ñ /ô /ñ 	0ô 	0ð 	0õ �dÔ&­Ô(<Ñ=Ô=ð 	*ØŒK×Òð  H÷  Oò  OØ#'Ô#3Ô#?Ô#DØ#'Ô#3Ô#?Ô#DØ'ð Oñ )ô )ñ *ô *ð *ð ×"Ò" 4¨°hÑ?Ô?Ð?Ð?Ð?Ý˜Ô(­#Ô*:Ñ;Ô;ð 	*Ø×"Ò" 4¨Ñ5Ô5Ð5Ð5Ð5àŒK×ÒÐh×oÒoØ Ô,Ô1Ø Ô,Ô1Ø'ð pñ )ô )ñ *ô *ð *ð *ð *r   c                 óÐ   — | j                              d                     |j        j        j        |j        j        j        |¬¦  «        ¦  «         |                      ||d¦  «         d S )Nrû  rü  r3   )rT   rk   r9   r1   rÕ  rñ  r6   rù  rÌ  s      r   ÚemitPascalStringArraySizez1CPPSizeStatementEmitter.emitPascalStringArraySize  sy   € ØŒ×Òð  D÷  Kò  KØ#Ô/Ô;Ô@Ø#Ô/Ô;Ô@Ø#ð Kñ %ô %ñ 	&ô 	&ð 	&ð 	×Ò˜t [°(Ñ;Ô;Ð;Ð;Ð;r   ÚSizec                 óÄ   — | j                              t          j        d¦  «                             |j        j        t          |j        ¦  «        ||¬¦  «        ¦  «         d S )Nzƒ            for ({parameter_type} m : this->{member_name}) {{
            	result += m.{size_method}();
            }}
            )r1   rr  r³   Úsize_method)rT   rk   r¨   r©   r9   r1   r6   rM   )rV   r[   r³   r  s       r   rù  z)CPPSizeStatementEmitter.emitRecursiveSize  sl   € ØŒ×Ò�(œ/ð +ñ ô ÷ ’Ø Ô,Ô1Ý1°$Ô2BÑCÔCØ'Ø'ð	 ñ )ô )ñ		*ô 	*ð 	*ð 	*ð 	*r   N)rÿ  )r`   ra   rb   rÍ  rÑ  r×  rÙ  rá  ræ  rþ  rù  rY   r   r   r<  r<  Ñ  s‘   € € € € € ð-ð -ð -ð0ð 0ð 0ð*ð *ð *ð6ð 6ð 6ð)ð )ð )ð,*ð *ð *ð$<ð <ð <ð	*ð 	*ð 	*ð 	*ð 	*ð 	*r   r<  c                   ó   — e Zd Zd„ Zd„ ZdS )r…   c                 ó¤   — t          |j        |j        t          |j        j        ¦  «        |j        ¬¦  «        }|                      ||¦  «         d S ©N)Úenum_concept_nameÚenum_concept_hashÚenum_concept_return_typeÚenum_concept_type)r›   r6   rœ   r=   Úreturn_typerA   Úenumr    r¤   s      r   rˆ   z)HEnumConceptEmitter.visit_EnumConceptDecl$  sR   € ÝØ"œiØ"œmÝ%3°DÔ4DÔ4IÑ%JÔ%JØ"œið	
ñ 
ô 
ˆð 	�Š˜˜gÑ&Ô&Ð&Ð&Ð&r   c                 óˆ   — t          j        |d         ¦  «        }| j                              dj        dd|i|¤Ž¦  «         d S )Nr  z�{enum_concept_return_type} {enum_concept_name}(const {enum_concept_type}& {argument_name}, const {enum_concept_return_type}& defaultValue);

Úargument_namerY   )r   Ú_lower_first_char_of_stringrT   rk   r9   )rV   r[   r¥   r  s       r   r    zHEnumConceptEmitter.emitHeader.  s   € Ý#Ô?ÀÐH[Ô@\Ñ]Ô]ˆØŒ×Òð  sð  lô  sð  [ð  [ð  BOð  [ð  SZð  [ð  [ñ  	\ô  	\ð  	\ð  	\ð  	\r   N)r`   ra   rb   rˆ   r    rY   r   r   r…   r…   "  s7   € € € € € ð'ð 'ð 'ð\ð \ð \ð \ð \r   r…   c                   ó   — e Zd Zd„ Zd„ ZdS )r“   c                 ó¤   — t          |j        |j        t          |j        j        ¦  «        |j        ¬¦  «        }|                      ||¦  «         d S r  )r›   r6   rœ   r=   r	  rA   r
  Úemitr¤   s      r   rˆ   z+CPPEnumConceptEmitter.visit_EnumConceptDecl5  sR   € ÝØ"œiØ"œmÝ%3°DÔ4DÔ4IÑ%JÔ%JØ"œið	
ñ 
ô 
ˆð 	�	Š	�$˜Ñ Ô Ð Ð Ð r   c                 óª  — t          j        |d         ¦  «        }| j                              dj        dd|i|¤Ž¦  «         | j                             d                     |¬¦  «        ¦  «         |                     ¦   «         D ]f}| j                              dj        dd|j        i|¤Ž¦  «         | j                             d                     |j        j        ¬	¦  «        ¦  «         Œg| j                             d
¦  «         | j                             d¦  «         | j                             d¦  «         | j                             d¦  «         d S )Nr  zŽ{enum_concept_return_type} {enum_concept_name}(const {enum_concept_type}& {argument_name}, const {enum_concept_return_type}& defaultValue)
{{
r  z	switch({argument_name}) {{
)r  z+		case {enum_concept_type}::{member_name}:
r³   z			return {member_value};
)Úmember_valuez		default:
z			return defaultValue;
rJ  rÔ   rY   )r   r  rT   rk   r9   r¹   r6   rº   )rV   r[   r¥   r  r¾   s        r   r  zCPPEnumConceptEmitter.emit>  s|  € Ý#Ô?ÀÐH[Ô@\Ñ]Ô]ˆØŒ×Òð  tð  mô  tð  \ð  \ð  CPð  \ð  T[ð  \ð  \ñ  	]ô  	]ð  	]ØŒ×ÒÐ:×AÒAÐP]ÐAÑ^Ô^Ñ_Ô_Ð_à—l’l‘n”nð 	hð 	hˆFØŒK×ÒÐUÐNÔUÐyÐyÐbhÔbmÐyÐqxÐyÐyÑzÔzÐzØŒK×ÒÐ>×EÒEÐSYÔS_ÔSeÐEÑfÔfÑgÔgÐgÐgàŒ×ÒÐ*Ñ+Ô+Ð+ØŒ×ÒÐ8Ñ9Ô9Ð9àŒ×Ò˜'Ñ"Ô"Ð"ØŒ×Ò˜'Ñ"Ô"Ð"Ð"Ð"r   N)r`   ra   rb   rˆ   r  rY   r   r   r“   r“   3  s2   € € € € € ð!ð !ð !ð#ð #ð #ð #ð #r   r“   Ú__main__zC++z.hz.cppz-rz--header-output-directoryÚdirz9The directory to output the {language} header file(s) to.)Úlanguage)ÚmetavarÚhelpz--header-output-extensionÚextzOThe extension to use for header files. (Helps work around a CMake Xcode issue.))Údefaultr  r  z"--output-union-helper-constructorsrs  Ú
store_truez3Emits helper union constructor, one for each member)ÚdestÚactionr  z--output-propertiesrô   z<Emits accessors and mutators for all members of a structure.z--output-jsonr§   zNEmits code to serialize all members in a structure to and from jsoncpp values.c                 ó|   — t           t          fD ],} || t          ¬¦  «                             t          ¦  «         Œ-d S ©N)rU   )r~  rŠ  rU   rl   Útree)rT   Úemitter_types     r   Útag_output_header_callbackr!  k  sJ   € Ý!4µoÐ Fð Bð B�Ø�˜V­WÐ5Ñ5Ô5×;Ò;½DÑAÔAÐAÐAðBð Br   r“  TÚ
functional)Úuse_inclusion_guardsÚsystem_headerszjson/json.hc                 ób   — t          | t          ¬¦  «                             t          ¦  «         d S r  )rf   rU   rl   r  ©rT   s    r   Úmain_output_header_callbackr'  |  s)   € Ý˜&­'Ð2Ñ2Ô2×8Ò8½Ñ>Ô>Ð>Ð>Ð>r   )ÚarrayÚcassertÚcstdintÚstringÚvectorzCLAD/SafeMessageBuffer.h)Úcomment_linesr#  r$  Úlocal_headersc                 ób   — t          | t          ¬¦  «                             t          ¦  «         d S r  )rŠ   rU   rl   r  r&  s    r   Úmain_output_source_callbackr0  ˆ  s)   € Ý˜F­GÐ4Ñ4Ô4×:Ò:½4Ñ@Ô@Ð@Ð@Ð@r   )Úunordered_mapÚlimitsÚiostreamF)Ar   r   r   r¨   r   r   r   r   r7   r=   rD   rH   rJ   rM   rO   rP   ÚNodeVisitorrR   rf   rŠ   r{   r�   r~   r�   rL  r‚   r~  rŠ  r‘   r4  r9  r<  r…   r“   r`   r  Údefault_header_extensionÚsource_extensionÚStandardArgumentParserÚoption_parserÚadd_argumentr9   Ú
parse_argsrU   Úheader_output_directoryÚoutput_directoryÚparser  Úget_comment_linesr-  Úunion_discovererrl   rP  r!  Úget_output_filers   Útag_output_headerÚwrite_c_fileÚ main_output_header_local_headersr§   r'  Úmain_output_headerr0  Úcfile_system_headersÚmain_output_sourcerY   r   r   ú<module>rG     sž  ðð( €€€Ø 	€	€	€	Ø 
€
€
€
Ø €€€ð'ð 'ð 'ð €�„€à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð ØØØØØØØØØØðð Ð ð+ð +ð +ð6ð ð ð,Rð Rð Rð!ð !ð !ðMð Mð Mð ØØØØØØØØØØð#ð #Ð ðð ð ð	ð 	ð 	ð 	ð 	�#”/ñ 	ô 	ð 	ðSð Sð Sð Sð S˜ñ Sô Sð SðBUð Uð Uð Uð UÐ+ñ Uô Uð Uð"D~ð D~ð D~ð D~ð D~�;ñ D~ô D~ð D~ðLo&ð o&ð o&ð o&ð o&�\ñ o&ô o&ð o&ðbnð nð nð nð n�[ñ nô nð nðd^$ð ^$ð ^$ð ^$ð ^$�~ñ ^$ô ^$ð ^$ð@	ð ð ð ð �c”oñ ô ð ðp"ð p"ð p"ð p"ð p"�Kñ p"ô p"ð p"ðd3ð 3ð 3ð 3ð 3˜+ñ 3ô 3ð 3ðj$ð $ð $ð $ð $�kñ $ô $ð $ð,C!ð C!ð C!ð C!ð C!�kñ C!ô C!ð C!ðJ=*ð =*ð =*ð =*ð =*˜kñ =*ô =*ð =*ð~6*ð 6*ð 6*ð 6*ð 6* ñ 6*ô 6*ð 6*ðpO*ð O*ð O*ð O*ð O*˜kñ O*ô O*ð O*ðb\ð \ð \ð \ð \˜+ñ \ô \ð \ð"#ð #ð #ð #ð #˜Lñ #ô #ð #ð4 ˆzÒÑØ Ð Ð Ð Ð Ð à€HØ#ÐØÐà6�KÔ6°xÑ@Ô@€MØ×Ò˜tÐ%@È%ØH×OÒOÐYaÐOÑbÔbð ñ dô dð dà×ÒÐ:ÐD\ÐfkØ^ð ñ `ô `ð `à×ÒÐCÐJ^ÐgsØBð ñ Dô Dð Dà×ÒÐ4Ð;KÐT`ØKð ñ Mô Mð Mà×Ò˜°ZÈØ]ð ñ _ô _ð _ð ×&Ò&Ñ(Ô(€GØÔ*ð CØ*1Ô*BˆÔ'àˆ;Ô˜WÑ%Ô%€DØ1�KÔ1°'¸8ÑDÔD€Mà&�Ñ(Ô(ÐØ×Ò˜4Ñ Ô Ð àÔð .ð	Bð 	Bð 	Bð 8˜KÔ7¸ÀÈÔIhÑAhÑiÔiÐØ ˆÔ  Ô!@ÐBSØ&Ø°Ø(˜>ð	+ñ 	+ô 	+ð 	+ð
 ->Ð+>Ð(Ð(à+-Ð(àÔð <Ø(¨]¨OÑ;Ð(ð?ð ?ð ?ð 5˜Ô4°W¸gÔ>]Ñ^Ô^ÐØ€KÔ˜WÔ<Ð>PØ#Ø#Ø!ØfÐfÐfØ6ð8ñ 8ô 8ð 8ðAð Að Að ÐØÔð HØÐ GÐ GÐ GÑGÐà4˜Ô4°WÐ>NÑOÔOÐØ€KÔ˜WÔ5Ð7IØ#Ø#Ø"Ø+Ø)Ð*ð,ñ ,ô ,ð ,ð ,ð ,ðG Ðr   