§
    ŠŸjQx  ã                   ó‚   — d dl Z d dlZddlmZ ddlmZmZ ddddd	d
ddœZ ej        d¦  «        Z	 G d„ de¦  «        Z
dS )é    Né   )ÚJsonSchemaDefinitionException)ÚCodeGeneratorÚenforce_listÚNoneTypeÚboolzint, float, DecimalÚintÚstrzlist, tupleÚdict)ÚnullÚbooleanÚnumberÚintegerÚstringÚarrayÚobjectz	(?<!\\)\$c                   óì   ‡ — e Zd ZdddddddœZdi d	d	d	fˆ fd
„	Zeˆ f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„ Zd„ Zd „ Zd!„ Zd"„ Zd#„ Zd$„ Zˆ xZ S )%ÚCodeGeneratorDraft04zk^\d{4}-[01]\d-[0-3]\d(t|T)[0-2]\d:[0-5]\d:[0-5]\d(?:\.\d+)?(?:[+-][0-2]\d:[0-5]\d|[+-][0-2]\d[0-5]\d|z|Z)\Zz.^(?!.*\.\..*@)[^@.][^@]*(?<!\.)@[^@]+\.[^@]+\Zzv^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9])\ZzS^((25[0-5]|2[0-4][0-9]|1?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\ZaÞ  ^(?:(?:[0-9A-Fa-f]{1,4}:){6}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|::(?:[0-9A-Fa-f]{1,4}:){5}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){,4}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}|(?:(?:[0-9A-Fa-f]{1,4}:){,6}[0-9A-Fa-f]{1,4})?::)\Zz^\w+:(\/?\/?)[^\s]+\Z)z	date-timeÚemailÚhostnameÚipv4Úipv6ÚuriNTc                 ó:  •— t          ¦   «                              |||¦  «         || _        || _        || _        | j                             d| j        fd| j        fd| j	        fd| j
        fd| j        fd| j        fd| j        fd| j        fd	| j        fd
| j        fd| j        fd| j        fd| j        fd| j        fd| j        fd| j        fd| j        fd| j        fd| j        fd| j        fd| j        fd| j        fd| j        fd| j        ff¦  «         d| _        d S )NÚtypeÚenumÚallOfÚanyOfÚoneOfÚnotÚ	minLengthÚ	maxLengthÚpatternÚformatÚminimumÚmaximumÚ
multipleOfÚminItemsÚmaxItemsÚuniqueItemsÚitemsÚminPropertiesÚmaxPropertiesÚrequiredÚdependenciesÚ
propertiesÚpatternPropertiesÚadditionalPropertiesr   ) ÚsuperÚ__init__Ú_custom_formatsÚ_use_formatsÚ_use_defaultÚ_json_keywords_to_functionÚupdateÚgenerate_typeÚgenerate_enumÚgenerate_all_ofÚgenerate_any_ofÚgenerate_one_ofÚgenerate_notÚgenerate_min_lengthÚgenerate_max_lengthÚgenerate_patternÚgenerate_formatÚgenerate_minimumÚgenerate_maximumÚgenerate_multiple_ofÚgenerate_min_itemsÚgenerate_max_itemsÚgenerate_unique_itemsÚgenerate_itemsÚgenerate_min_propertiesÚgenerate_max_propertiesÚgenerate_requiredÚgenerate_dependenciesÚgenerate_propertiesÚgenerate_pattern_propertiesÚgenerate_additional_propertiesÚ_any_or_one_of_count)ÚselfÚ
definitionÚresolverÚformatsÚuse_defaultÚuse_formatsÚdetailed_exceptionsÚ	__class__s          €úc/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/fastjsonschema/draft04.pyr4   zCodeGeneratorDraft04.__init__%   sp  ø€ Ý‰Œ×Ò˜ XÐ/BÑCÔCÐCØ&ˆÔØ'ˆÔØ'ˆÔØÔ'×.Ò.Ø�TÔ'Ð(Ø�TÔ'Ð(Ø�dÔ*Ð+Ø�dÔ*Ð+Ø�dÔ*Ð+Ø�DÔ%Ð&Ø˜$Ô2Ð3Ø˜$Ô2Ð3Ø˜Ô-Ð.Ø�tÔ+Ð,Ø˜Ô-Ð.Ø˜Ô-Ð.Ø˜4Ô4Ð5Ø˜Ô0Ð1Ø˜Ô0Ð1Ø˜DÔ6Ð7Ø�dÔ)Ð*Ø˜dÔ:Ð;Ø˜dÔ:Ð;Ø˜Ô/Ð0à˜TÔ7Ð8Ø˜4Ô3Ð4Ø  $Ô"BÐCØ# TÔ%HÐIð30
ñ 	ô 	ð 	ð6 %&ˆÔ!Ð!Ð!ó    c                 óB   •— t          ¦   «         j        }| j        |d<   |S )NÚcustom_formats)r3   Úglobal_stater5   )rS   ÚresrZ   s     €r[   r_   z!CodeGeneratorDraft04.global_stateG   s"   ø€ å‰gŒgÔ"ˆØ $Ô 4ˆÐÑØˆ
r\   c                 óì  — t          | j        d         ¦  «        }	 d                     d„ |D ¦   «         ¦  «        }n4# t          $ r'}t	          d                     |¦  «        ¦  «        ‚d}~ww xY wd}d|v sd|v rd	|vrd
                     | j        ¬¦  «        }|                      d||¦  «        5  |                      dd                     |¦  «        d¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z²
        Validation of type. Can be one type or list of types.

        .. code-block:: python

            {'type': 'string'}
            {'type': ['string', 'number']}
        r   z, c              3   ó0   K  — | ]}t           |         V — Œd S ©N)ÚJSON_TYPE_TO_PYTHON_TYPE)Ú.0Úts     r[   ú	<genexpr>z5CodeGeneratorDraft04.generate_type.<locals>.<genexpr>X   s(   è è € Ð$PÐ$PÀQÕ%=¸aÔ%@Ð$PÐ$PÐ$PÐ$PÐ$PÐ$Pr\   zUnknown type: {}NÚ r   r   r   z  or isinstance({variable}, bool))Úvariablez&if not isinstance({variable}, ({})){}:ú{name} must be {}z or ©Úrule)	r   Ú_definitionÚjoinÚKeyErrorr   r$   Ú	_variableÚlÚexc)rS   ÚtypesÚpython_typesrr   Úextras        r[   r:   z"CodeGeneratorDraft04.generate_typeM   ss  € õ ˜TÔ-¨fÔ5Ñ6Ô6ˆð	PØŸ9š9Ð$PÐ$PÈ%Ð$PÑ$PÔ$PÑPÔPˆLˆLøÝð 	Pð 	Pð 	PÝ/Ð0B×0IÒ0IÈ#Ñ0NÔ0NÑOÔOÐOøøøøð	Pøøøð ˆØ˜ÐÐ ¨eÐ!3Ð!3¸È%Ð9OÐ9OØ6×=Ò=ÀtÄ~Ð=ÑVÔVˆEà�VŠVÐ<¸lÈEÑRÔRð 	Kð 	KØ�HŠHÐ(¨&¯+ª+°eÑ*<Ô*<À6ˆHÑJÔJÐJð	Kð 	Kð 	Kñ 	Kô 	Kð 	Kð 	Kð 	Kð 	Kð 	Kð 	Kð 	Køøøð 	Kð 	Kð 	Kð 	Kð 	Kð 	Ks'   œ< ¼
A-Á"A(Á(A-Â0,C)Ã)C-Ã0C-c                 ó(  — | j         d         }t          |t          t          f¦  «        st	          d¦  «        ‚|                      d¦  «        5  |                      d|                      |¦  «        d¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z¨
        Means that only value specified in the enum is valid.

        .. code-block:: python

            {
                'enum': ['a', 'b'],
            }
        r   zenum must be an arrayzif {variable} not in {enum}:z{name} must be one of {}rk   N)rm   Ú
isinstanceÚlistÚtupler   rq   rr   Úe)rS   r   s     r[   r;   z"CodeGeneratorDraft04.generate_enumc   så   € ð Ô Ô'ˆÝ˜$¥¥u Ñ.Ô.ð 	IÝ/Ð0GÑHÔHÐHØ�VŠVÐ2Ñ3Ô3ð 	Lð 	LØ�HŠHÐ/°·²¸±´ÀFˆHÑKÔKÐKð	Lð 	Lð 	Lñ 	Lô 	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	Lð 	Løøøð 	Lð 	Lð 	Lð 	Lð 	Lð 	Ls   Á,BÂBÂBc                 ól   — | j         d         D ]%}|                      || j        | j        d¬¦  «         Œ&dS )a’  
        Means that value have to be valid by all of those definitions. It's like put it in
        one big definition.

        .. code-block:: python

            {
                'allOf': [
                    {'type': 'number'},
                    {'minimum': 5},
                ],
            }

        Valid values for this definition are 5, 6, 7, ... but not 4 or 'abc' for example.
        r   T©Úclear_variablesN)rm   Úgenerate_func_code_blockrp   Ú_variable_name)rS   Údefinition_items     r[   r<   z$CodeGeneratorDraft04.generate_all_ofs   sO   € ð   $Ô/°Ô8ð 	vð 	vˆOØ×)Ò)¨/¸4¼>È4ÔK^ÐptÐ)ÑuÔuÐuÐuð	vð 	vr\   c           	      ón  — | xj         dz  c_         | j         }|                      d|¬¦  «         | j        d         D ]°}|                      d|d¬¦  «        5  |                      dd¬	¦  «        5  |                      || j        | j        d
¬¦  «         |                      d|¬¦  «         ddd¦  «         n# 1 swxY w Y   |                      d¦  «         ddd¦  «         n# 1 swxY w Y   Œ±|                      d|d¬¦  «        5  |                      dd¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )a¯  
        Means that value have to be valid by any of those definitions. It can also be valid
        by all of them.

        .. code-block:: python

            {
                'anyOf': [
                    {'type': 'number', 'minimum': 10},
                    {'type': 'number', 'maximum': 5},
                ],
            }

        Valid values for this definition are 3, 4, 5, 10, 11, ... but not 8 for example.
        r   z"{variable}_any_of_count{count} = 0©Úcountr   z&if not {variable}_any_of_count{count}:F©rƒ   Úoptimizeútry:©r…   Tr|   z#{variable}_any_of_count{count} += 1Nú%except JsonSchemaValueException: passz,{name} cannot be validated by any definitionrk   ©rR   rq   rm   r~   rp   r   rr   )rS   rƒ   r€   s      r[   r=   z$CodeGeneratorDraft04.generate_any_of†   sH  € ð  	Ð!Ô! QÑ&Ð!Ô!ØÔ)ˆØ�ŠÐ3¸5ˆÑAÔAÐAØ#Ô/°Ô8ð 	@ð 	@ˆOà—’Ð@ÈÐX]�Ñ^Ô^ð @ð @Ø—V’V˜F¨U�VÑ3Ô3ð Oð OØ×1Ò1°/À4Ä>ÐSWÔSfÐx|Ð1Ñ}Ô}Ð}Ø—F’FÐ@È�FÑNÔNÐNðOð Oð Oñ Oô Oð Oð Oð Oð Oð Oð Oøøøð Oð Oð Oð Oð —’Ð>Ñ?Ô?Ð?ð	@ð @ð @ñ @ô @ð @ð @ð @ð @ð @ð @øøøð @ð @ð @ð @øð �VŠVÐ<ÀEÐTYˆVÑZÔZð 	Sð 	SØ�HŠHÐCÈ'ˆHÑRÔRÐRð	Sð 	Sð 	Sñ 	Sô 	Sð 	Sð 	Sð 	Sð 	Sð 	Sð 	Sð 	Søøøð 	Sð 	Sð 	Sð 	Sð 	Sð 	SsH   ÁC!Á.;B5Â)C!Â5B9Â9C!Â<B9Â=C!Ã!C%	Ã(C%	ÄD*Ä*D.Ä1D.c           	      ót  — | xj         dz  c_         | j         }|                      d|¬¦  «         | j        d         D ]°}|                      d|d¬¦  «        5  |                      dd¬	¦  «        5  |                      || j        | j        d
¬¦  «         |                      d|¬¦  «         ddd¦  «         n# 1 swxY w Y   |                      d¦  «         ddd¦  «         n# 1 swxY w Y   Œ±|                      d|¬¦  «        5  d}|                      d||d¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )a·  
        Means that value have to be valid by only one of those definitions. It can't be valid
        by two or more of them.

        .. code-block:: python

            {
                'oneOf': [
                    {'type': 'number', 'multipleOf': 3},
                    {'type': 'number', 'multipleOf': 5},
                ],
            }

        Valid values for this definition are 3, 5, 6, ... but not 15 for example.
        r   z"{variable}_one_of_count{count} = 0r‚   r   z&if {variable}_one_of_count{count} < 2:Fr„   r†   r‡   Tr|   z#{variable}_one_of_count{count} += 1Nrˆ   z'if {variable}_one_of_count{count} != 1:z9" (" + str({variable}_one_of_count{}) + " matches found)"z.{name} must be valid exactly by one definition)Úappend_to_msgrl   r‰   )rS   rƒ   r€   Údynamics       r[   r>   z$CodeGeneratorDraft04.generate_one_of¤   sP  € ð  	Ð!Ô! QÑ&Ð!Ô!ØÔ)ˆØ�ŠÐ3¸5ˆÑAÔAÐAØ#Ô/°Ô8ð 	@ð 	@ˆOà—’Ð@ÈÐX]�Ñ^Ô^ð @ð @Ø—V’V˜F¨U�VÑ3Ô3ð Oð OØ×1Ò1°/À4Ä>ÐSWÔSfÐx|Ð1Ñ}Ô}Ð}Ø—F’FÐ@È�FÑNÔNÐNðOð Oð Oñ Oô Oð Oð Oð Oð Oð Oð Oøøøð Oð Oð Oð Oð —’Ð>Ñ?Ô?Ð?ð	@ð @ð @ñ @ô @ð @ð @ð @ð @ð @ð @øøøð @ð @ð @ð @øð �VŠVÐ=ÀUˆVÑKÔKð 	sð 	sØQˆGØ�HŠHÐEÀuÐ\cÐjqˆHÑrÔrÐrð	sð 	sð 	sñ 	sô 	sð 	sð 	sð 	sð 	sð 	sð 	sð 	søøøð 	sð 	sð 	sð 	sð 	sð 	ssH   ÁC!Á.;B5Â)C!Â5B9Â9C!Â<B9Â=C!Ã!C%	Ã(C%	ÄD-Ä-D1Ä4D1c                 óð  — | j         d         }|du r|                      dd¬¦  «         dS |du rdS |s|                      dd¬¦  «         dS |                      dd¬	¦  «        5  |                      || j        | j        ¦  «         ddd¦  «         n# 1 swxY w Y   |                      d
¦  «         |                      d¦  «        5  |                      dd¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )aT  
        Means that value have not to be valid by this definition.

        .. code-block:: python

            {'not': {'type': 'null'}}

        Valid values for this definition are 'hello', 42, {} ... but not None.

        Since draft 06 definition can be boolean. False means nothing, True
        means everything is invalid.
        r    Tú{name} must not be thererk   FNz-{name} must NOT match a disallowed definitionr†   r‡   rˆ   zelse:)rm   rr   rq   r~   rp   r   )rS   Únot_definitions     r[   r?   z!CodeGeneratorDraft04.generate_notÃ   sº  € ð Ô)¨%Ô0ˆØ˜TÐ!Ð!Ø�HŠHÐ/°eˆHÑ<Ô<Ð<Ð<Ð<Ø˜uÐ$Ð$ØˆFØð 	VØ�HŠHÐDÈ5ˆHÑQÔQÐQÐQÐQà—’˜¨�Ñ/Ô/ð cð cØ×-Ò-¨n¸d¼nÈdÔNaÑbÔbÐbðcð cð cñ cô cð cð cð cð cð cð cøøøð cð cð cð cà�FŠFÐ:Ñ;Ô;Ð;Ø—’˜‘”ð Vð VØ—’ÐHÈu�ÑUÔUÐUðVð Vð Vñ Vô Vð Vð Vð Vð Vð Vð Vð Vøøøð Vð Vð Vð Vð Vð Vs$   Á#"BÂBÂBÃC+Ã+C/Ã2C/c                 ó~  — |                       d¦  «        5  |                      ¦   «          t          | j        d         t          t
          f¦  «        st          d¦  «        ‚|                       d¦  «        5  |                      dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )Núif isinstance({variable}, str):r!   zminLength must be a numberz if {variable}_len < {minLength}:z={name} must be longer than or equal to {minLength} charactersrk   ©rq   Úcreate_variable_with_lengthrw   rm   r	   Úfloatr   rr   ©rS   s    r[   r@   z(CodeGeneratorDraft04.generate_min_lengthÞ   s^  € Ø�VŠVÐ5Ñ6Ô6ð 	lð 	lØ×,Ò,Ñ.Ô.Ð.Ý˜dÔ.¨{Ô;½cÅ5¸\ÑJÔJð RÝ3Ð4PÑQÔQÐQØ—’Ð:Ñ;Ô;ð lð lØ—’ÐXÐ_j�ÑkÔkÐkðlð lð lñ lô lð lð lð lð lð lð løøøð lð lð lð lð		lð 	lð 	lñ 	lô 	lð 	lð 	lð 	lð 	lð 	lð 	lð 	løøøð 	lð 	lð 	lð 	lð 	lð 	ló6   –A B2Á6BÂB2ÂB	ÂB2Â!B	Â"B2Â2B6Â9B6c                 ó~  — |                       d¦  «        5  |                      ¦   «          t          | j        d         t          t
          f¦  «        st          d¦  «        ‚|                       d¦  «        5  |                      dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )Nr‘   r"   zmaxLength must be a numberz if {variable}_len > {maxLength}:z>{name} must be shorter than or equal to {maxLength} charactersrk   r’   r•   s    r[   rA   z(CodeGeneratorDraft04.generate_max_lengthæ   s^  € Ø�VŠVÐ5Ñ6Ô6ð 	mð 	mØ×,Ò,Ñ.Ô.Ð.Ý˜dÔ.¨{Ô;½cÅ5¸\ÑJÔJð RÝ3Ð4PÑQÔQÐQØ—’Ð:Ñ;Ô;ð mð mØ—’ÐYÐ`k�ÑlÔlÐlðmð mð mñ mô mð mð mð mð mð mð møøøð mð mð mð mð		mð 	mð 	mñ 	mô 	mð 	mð 	mð 	mð 	mð 	mð 	mð 	møøøð 	mð 	mð 	mð 	mð 	mð 	mr–   c                 óä  — |                       d¦  «        5  | j        d         }|                     dd¦  «                             dd¦  «        }t                               d|¦  «        }t          j        |¦  «        | j        |<   |                       dt          |¦  «        ¦  «        5  |  	                    d	|d¬
¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )Nr‘   r#   ú\z\\ú"z\"z\\Zz-if not REGEX_PATTERNS[{}].search({variable}):z{name} must match pattern {}rk   )
rq   rm   ÚreplaceÚDOLLAR_FINDERÚsubÚreÚcompileÚ_compile_regexpsÚreprrr   )rS   r#   Úsafe_patternÚend_of_string_fixed_patterns       r[   rB   z%CodeGeneratorDraft04.generate_patternî   s…  € Ø�VŠVÐ5Ñ6Ô6ð 	Wð 	WØÔ& yÔ1ˆGØ"Ÿ?š?¨4°Ñ8Ô8×@Ò@ÀÀeÑLÔLˆLÝ*7×*;Ò*;¸FÀGÑ*LÔ*LÐ'Ý-/¬ZÐ8SÑ-TÔ-TˆDÔ! 'Ñ*Ø—’ÐGÍÈgÉÌÑWÔWð Wð WØ—’Ð7¸ÈI�ÑVÔVÐVðWð Wð Wñ Wô Wð Wð Wð Wð Wð Wð Wøøøð Wð Wð Wð Wð	Wð 	Wð 	Wñ 	Wô 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wøøøð 	Wð 	Wð 	Wð 	Wð 	Wð 	Ws6   –BC%Â(CÃC%ÃC	ÃC%ÃC	ÃC%Ã%C)Ã,C)c                 ó~  — | j         sdS |                      d¦  «        5  | j        d         }|| j        v r…| j        |         }t	          |t
          ¦  «        r|                      ||dz   |¦  «         �n1|                      d|¦  «        5  |                      d|d¬¦  «         ddd¦  «         n# 1 swxY w Y   nê|| j        v r(| j        |         }|                      ||dz   |¦  «         n¹|dk    r‘d	g| _	        |                      d
d¬¦  «        5  |                      d¦  «         ddd¦  «         n# 1 swxY w Y   |                      d¦  «        5  |                      dd¬¦  «         ddd¦  «         n# 1 swxY w Y   n"t          d                     |¦  «        ¦  «        ‚ddd¦  «         dS # 1 swxY w Y   dS )zô
        Means that value have to be in specified format. For example date, email or other.

        .. code-block:: python

            {'format': 'email'}

        Valid value for this definition is user@example.com but not @username
        Nr‘   r$   Ú_re_patternz(if not custom_formats["{}"]({variable}):rj   rk   Úregexz	import rer†   Fr‡   zre.compile({variable})zexcept Exception:z{name} must be a valid regexzUnknown format: {})r6   rq   rm   r5   rw   r
   Ú_generate_formatrr   ÚFORMAT_REGEXSÚ_extra_imports_linesr   r$   )rS   Úformat_Úcustom_formatÚformat_regexs       r[   rC   z$CodeGeneratorDraft04.generate_format÷   s  € ð Ô ð 	ØˆFØ�VŠVÐ5Ñ6Ô6ð 	Zð 	ZØÔ& xÔ0ˆGà˜$Ô.Ð.Ð.Ø $Ô 4°WÔ =�Ý˜m­SÑ1Ô1ð NØ×)Ò)¨'°7¸]Ñ3JÈMÑZÔZÐZÑZàŸšÐ JÈGÑTÔTð Nð NØŸšÐ!4°gÀH˜ÑMÔMÐMðNð Nð Nñ Nô Nð Nð Nð Nð Nð Nð Nøøøð Nð Nð Nð Nøà˜DÔ.Ð.Ð.Ø#Ô1°'Ô:�Ø×%Ò% g¨w¸Ñ/FÈÑUÔUÐUÐUà˜GÒ#Ð#Ø-8¨M�Ô)Ø—V’V˜F¨U�VÑ3Ô3ð 5ð 5Ø—F’FÐ3Ñ4Ô4Ð4ð5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5à—V’VÐ/Ñ0Ô0ð Lð LØ—H’HÐ;À(�HÑKÔKÐKðLð Lð Lñ Lô Lð Lð Lð Lð Lð Lð Løøøð Lð Lð Lð Løõ 4Ð4H×4OÒ4OÐPWÑ4XÔ4XÑYÔYÐYð+	Zð 	Zð 	Zñ 	Zô 	Zð 	Zð 	Zð 	Zð 	Zð 	Zð 	Zð 	Zøøøð 	Zð 	Zð 	Zð 	Zð 	Zð 	Zs   ŸA+F2Â
B/Â#F2Â/B3	Â3F2Â6B3	Â7AF2ÄD3Ä'F2Ä3D7	Ä7F2Ä:D7	Ä;F2ÅE7Å+F2Å7E;	Å;F2Å>E;	Å?&F2Æ2F6Æ9F6c                 ó  — | j         d         |k    rn|| j        vrt          j        |¦  «        | j        |<   |                      d|¦  «        5  |                      d|d¬¦  «         d d d ¦  «         d S # 1 swxY w Y   d S d S )Nr$   z.if not REGEX_PATTERNS["{}"].match({variable}):rj   rk   )rm   r    rž   rŸ   rq   rr   )rS   Úformat_nameÚregexp_nameÚregexps       r[   r§   z%CodeGeneratorDraft04._generate_format  sè   € ØÔ˜HÔ%¨Ò4Ð4Ø $Ô"7Ð7Ð7Ý57´ZÀÑ5GÔ5G�Ô% kÑ2Ø—’ÐHÈ+ÑVÔVð Jð JØ—’Ð,¨kÀ�ÑIÔIÐIðJð Jð Jñ Jô Jð Jð Jð Jð Jð Jð Jð Jøøøð Jð Jð Jð Jð Jð Jð 5Ð4s   ÁA3Á3A7Á:A7c                 ó,  — |                       d¦  «        5  t          | j        d         t          t          t
          j        f¦  «        st          d¦  «        ‚| j                             dd¦  «        rE|                       d¦  «        5  |  	                    dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   nD|                       d	¦  «        5  |  	                    d
d¬¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )Nú1if isinstance({variable}, (int, float, Decimal)):r%   zminimum must be a numberÚexclusiveMinimumFzif {variable} <= {minimum}:z${name} must be bigger than {minimum}rk   zif {variable} < {minimum}:z0{name} must be bigger than or equal to {minimum}©
rq   rw   rm   r	   r”   ÚdecimalÚDecimalr   Úgetrr   r•   s    r[   rD   z%CodeGeneratorDraft04.generate_minimum"  s  € Ø�VŠVÐGÑHÔHð 	að 	aÝ˜dÔ.¨yÔ9½CÅÍÌÐ;XÑYÔYð PÝ3Ð4NÑOÔOÐOØÔ×#Ò#Ð$6¸Ñ>Ô>ð aØ—V’VÐ9Ñ:Ô:ð Uð UØ—H’HÐCÈ)�HÑTÔTÐTðUð Uð Uñ Uô Uð Uð Uð Uð Uð Uð Uøøøð Uð Uð Uð Uøð —V’VÐ8Ñ9Ô9ð að aØ—H’HÐOÐV_�HÑ`Ô`Ð`ðað að añ aô að að að að að að aøøøð að að að að	að 	að 	añ 	aô 	að 	að 	að 	að 	að 	að 	að 	aøøøð 	að 	að 	að 	að 	að 	aóZ   –A2D	ÂB,Â D	Â,B0	Â0D	Â3B0	Â4D	ÃC1Ã%D	Ã1C5	Ã5D	Ã8C5	Ã9D	Ä	DÄDc                 ó,  — |                       d¦  «        5  t          | j        d         t          t          t
          j        f¦  «        st          d¦  «        ‚| j                             dd¦  «        rE|                       d¦  «        5  |  	                    dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   nD|                       d	¦  «        5  |  	                    d
d¬¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )Nr²   r&   zmaximum must be a numberÚexclusiveMaximumFzif {variable} >= {maximum}:z%{name} must be smaller than {maximum}rk   zif {variable} > {maximum}:z1{name} must be smaller than or equal to {maximum}r´   r•   s    r[   rE   z%CodeGeneratorDraft04.generate_maximum-  s  € Ø�VŠVÐGÑHÔHð 	bð 	bÝ˜dÔ.¨yÔ9½CÅÍÌÐ;XÑYÔYð PÝ3Ð4NÑOÔOÐOØÔ×#Ò#Ð$6¸Ñ>Ô>ð bØ—V’VÐ9Ñ:Ô:ð Vð VØ—H’HÐDÈ9�HÑUÔUÐUðVð Vð Vñ Vô Vð Vð Vð Vð Vð Vð Vøøøð Vð Vð Vð Vøð —V’VÐ8Ñ9Ô9ð bð bØ—H’HÐPÐW`�HÑaÔaÐaðbð bð bñ bô bð bð bð bð bð bð bøøøð bð bð bð bð	bð 	bð 	bñ 	bô 	bð 	bð 	bð 	bð 	bð 	bð 	bð 	bøøøð 	bð 	bð 	bð 	bð 	bð 	br¸   c                 óŠ  — |                       d¦  «        5  t          | j        d         t          t          t
          j        f¦  «        st          d¦  «        ‚t          | j        d         t          ¦  «        r|                       d¦  «         n|                       d¦  «         |                       d¦  «        5  |                      dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   |                       d	¦  «        5  |                      d
d¬¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )Nr²   r'   zmultipleOf must be a numberzBquotient = Decimal(repr({variable})) / Decimal(repr({multipleOf}))z$quotient = {variable} / {multipleOf}zif int(quotient) != quotient:z'{name} must be multiple of {multipleOf}rk   z-if {variable} / {multipleOf} == float("inf"):zinifinity reached)	rq   rw   rm   r	   r”   rµ   r¶   r   rr   r•   s    r[   rF   z)CodeGeneratorDraft04.generate_multiple_of8  s'  € Ø�VŠVÐGÑHÔHð 	Að 	AÝ˜dÔ.¨|Ô<½sÅEÍ7Ì?Ð>[Ñ\Ô\ð SÝ3Ð4QÑRÔRÐRõ ˜$Ô*¨<Ô8½%Ñ@Ô@ð ?Ø—’Ð[Ñ\Ô\Ð\Ð\à—’Ð=Ñ>Ô>Ð>Ø—’Ð7Ñ8Ô8ð Wð WØ—’ÐBÈ�ÑVÔVÐVðWð Wð Wñ Wô Wð Wð Wð Wð Wð Wð Wøøøð Wð Wð Wð Wð —’ÐGÑHÔHð Að AØ—’Ð,°<�Ñ@Ô@Ð@ðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að Að	Að 	Að 	Añ 	Aô 	Að 	Að 	Að 	Að 	Að 	Að 	Að 	Aøøøð 	Að 	Að 	Að 	Að 	Að 	AsZ   –B"D8Â8CÃD8ÃC 	Ã D8Ã#C 	Ã$D8Ã<D ÄD8Ä D$	Ä$D8Ä'D$	Ä(D8Ä8D<Ä?D<c                 ó¦  — |                       ¦   «          |                      d¦  «        5  t          | j        d         t          t
          f¦  «        st          d¦  «        ‚|                      ¦   «          |                      d¦  «        5  |                      dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )Núif {variable}_is_list:r(   zminItems must be a numberzif {variable}_len < {minItems}:z-{name} must contain at least {minItems} itemsrk   ©	Úcreate_variable_is_listrq   rw   rm   r	   r”   r   r“   rr   r•   s    r[   rG   z'CodeGeneratorDraft04.generate_min_itemsH  so  € Ø×$Ò$Ñ&Ô&Ð&Ø�VŠVÐ,Ñ-Ô-ð 	[ð 	[Ý˜dÔ.¨zÔ:½SÅ%¸LÑIÔIð QÝ3Ð4OÑPÔPÐPØ×,Ò,Ñ.Ô.Ð.Ø—’Ð9Ñ:Ô:ð [ð [Ø—’ÐHÈz�ÑZÔZÐZð[ð [ð [ñ [ô [ð [ð [ð [ð [ð [ð [øøøð [ð [ð [ð [ð		[ð 	[ð 	[ñ 	[ô 	[ð 	[ð 	[ð 	[ð 	[ð 	[ð 	[ð 	[øøøð 	[ð 	[ð 	[ð 	[ð 	[ð 	[ó6   ªA CÂ
B.Â"CÂ.B2	Â2CÂ5B2	Â6CÃC
ÃC
c                 ó¦  — |                       ¦   «          |                      d¦  «        5  t          | j        d         t          t
          f¦  «        st          d¦  «        ‚|                      ¦   «          |                      d¦  «        5  |                      dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )Nr½   r)   zmaxItems must be a numberzif {variable}_len > {maxItems}:z:{name} must contain less than or equal to {maxItems} itemsrk   r¾   r•   s    r[   rH   z'CodeGeneratorDraft04.generate_max_itemsQ  sp  € Ø×$Ò$Ñ&Ô&Ð&Ø�VŠVÐ,Ñ-Ô-ð 	hð 	hÝ˜dÔ.¨zÔ:½SÅ%¸LÑIÔIð QÝ3Ð4OÑPÔPÐPØ×,Ò,Ñ.Ô.Ð.Ø—’Ð9Ñ:Ô:ð hð hØ—’ÐUÐ\f�ÑgÔgÐgðhð hð hñ hô hð hð hð hð hð hð høøøð hð hð hð hð		hð 	hð 	hñ 	hô 	hð 	hð 	hð 	hð 	hð 	hð 	hð 	høøøð 	hð 	hð 	hð 	hð 	hð 	hrÀ   c                 ó†  — | j         d         }|sdS |                      ¦   «          |                      d¦  «        5  |                      d¦  «         |                      ¦   «          |                      d¦  «        5  |                      dd¬¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )a²  
        With Python 3.4 module ``timeit`` recommended this solutions:

        .. code-block:: python

            >>> timeit.timeit("len(x) > len(set(x))", "x=range(100)+range(100)", number=100000)
            0.5839540958404541
            >>> timeit.timeit("len({}.fromkeys(x)) == len(x)", "x=range(100)+range(100)", number=100000)
            0.7094449996948242
            >>> timeit.timeit("seen = set(); any(i in seen or seen.add(i) for i in x)", "x=range(100)+range(100)", number=100000)
            2.0819358825683594
            >>> timeit.timeit("np.unique(x).size == len(x)", "x=range(100)+range(100); import numpy as np", number=100000)
            2.1439831256866455
        r*   Nr½   zØdef fn(var): return frozenset(dict((k, fn(v)) for k, v in var.items()).items()) if hasattr(var, "items") else tuple(fn(v) for v in var) if isinstance(var, (dict, list)) else str(var) if isinstance(var, bool) else varzNif {variable}_len > len(set(fn({variable}_x) for {variable}_x in {variable})):z {name} must contain unique itemsrk   )rm   r¿   rq   r“   rr   )rS   Úunique_definitions     r[   rI   z*CodeGeneratorDraft04.generate_unique_itemsZ  s{  € ð !Ô,¨]Ô;ÐØ ð 	ØˆFà×$Ò$Ñ&Ô&Ð&Ø�VŠVÐ,Ñ-Ô-ð 	Qð 	QØ�FŠFð4ñ5ô 5ð 5ð ×,Ò,Ñ.Ô.Ð.Ø—’ÐhÑiÔið Qð QØ—’Ð;À-�ÑPÔPÐPðQð Qð Qñ Qô Qð Qð Qð Qð Qð Qð Qøøøð Qð Qð Qð Qð	Qð 	Qð 	Qñ 	Qô 	Qð 	Qð 	Qð 	Qð 	Qð 	Qð 	Qð 	Qøøøð 	Qð 	Qð 	Qð 	Qð 	Qð 	Qs5   »?B6Á:BÂB6ÂB"	Â"B6Â%B"	Â&B6Â6B:Â=B:c                 óÔ  — | j         d         }|du rdS |                      ¦   «          |                      d¦  «        5  |                      ¦   «          |du rF|                      d¦  «        5  |                      dd¬¦  «         ddd¦  «         n# 1 swxY w Y   �n´t          |t          ¦  «        �rt          |¦  «        D ]Û\  }}|                      d	|¦  «        5  |                      d
|¦  «         |                      |d 	                    | j
        |¦  «        d 	                    | j        |¦  «        ¦  «         ddd¦  «         n# 1 swxY w Y   | j        rBt          |t          ¦  «        r-d|v r)|                      dt          |d         ¦  «        ¦  «         ŒÜd| j         v �r| j         d         du rT|                      d	t          |¦  «        ¦  «        5  |                      dd¬¦  «         ddd¦  «         n# 1 swxY w Y   �nF|                      dt          |¦  «        ¦  «        5  |                      | j         d         d 	                    | j
        ¦  «        d 	                    | j        | j
        ¦  «        ¦  «        }|dk    r|                      d¦  «         ddd¦  «         n# 1 swxY w Y   n—|r•|                      d¦  «        5  |                      |d 	                    | j
        ¦  «        d 	                    | j        | j
        ¦  «        ¦  «        }|dk    r|                      d¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )aÓ  
        Means array is valid only when all items are valid by this definition.

        .. code-block:: python

            {
                'items': [
                    {'type': 'integer'},
                    {'type': 'string'},
                ],
            }

        Valid arrays are those with integers or strings, nothing else.

        Since draft 06 definition can be also boolean. True means nothing, False
        means everything is invalid.
        r+   TNr½   Fzif {variable}:rŽ   rk   zif {variable}_len > {}:z!{variable}__{0} = {variable}[{0}]ú{}__{}z{}[{}]Údefaultzelse: {variable}.append({})ÚadditionalItemsz({name} must contain only specified itemszFfor {variable}_x, {variable}_item in enumerate({variable}[{0}:], {0}):z{}_itemz{}[{{{}_x}}]r   Úpassz;for {variable}_x, {variable}_item in enumerate({variable}):)rm   r¿   rq   r“   rr   rw   rx   Ú	enumerater~   r$   rp   r   r7   r   r¡   Úlen)rS   Úitems_definitionÚidxÚitem_definitionrƒ   s        r[   rJ   z#CodeGeneratorDraft04.generate_items{  s  € ð$  Ô+¨GÔ4ÐØ˜tÐ#Ð#ØˆFà×$Ò$Ñ&Ô&Ð&Ø�VŠVÐ,Ñ-Ô-ð '	+ð '	+Ø×,Ò,Ñ.Ô.Ð.Ø 5Ð(Ð(Ø—V’VÐ,Ñ-Ô-ð Gð GØ—H’HÐ7¸g�HÑFÔFÐFðGð Gð Gñ Gô Gð Gð Gð Gð Gð Gð Gøøøð Gð Gð Gð GùåÐ,­dÑ3Ô3ñ "+Ý,5Ð6FÑ,GÔ,Gð 	`ð 	`Ñ(�C˜ØŸšÐ 9¸3Ñ?Ô?ð ð ØŸšÐBÀCÑHÔHÐHØ×5Ò5Ø+Ø$ŸOšO¨D¬N¸CÑ@Ô@Ø$ŸOšO¨DÔ,?ÀÑEÔEñô ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð Ô(ð `­Z¸ÍÑ-NÔ-Nð `ÐS\Ð`oÐSoÐSoØŸšÐ<½dÀ?ÐS\ÔC]Ñ>^Ô>^Ñ_Ô_Ð_øà$¨Ô(8Ð8Ñ8ØÔ'Ð(9Ô:¸eÐCÐCØ!ŸVšVÐ$=½sÐCSÑ?TÔ?TÑUÔUð _ð _Ø ŸHšHÐ%OÐV]˜HÑ^Ô^Ð^ð_ð _ð _ñ _ô _ð _ð _ð _ð _ð _ð _øøøð _ð _ð _ð _ùð "ŸVšVÐ$lÕnqð  sCñ  oDô  oDñ  Eô  Eð /ð /Ø$(×$AÒ$AØ $Ô 0Ð1BÔ CØ )× 0Ò 0°´Ñ @Ô @Ø .× 5Ò 5°dÔ6IÈ4Ì>Ñ ZÔ Zñ%ô %˜Eð
  %¨šz˜zØ $§¢ v¡¤ ð/ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /øð $ð +ØŸšÐ ]Ñ^Ô^ð +ð +Ø $× =Ò =Ø,Ø%×,Ò,¨T¬^Ñ<Ô<Ø*×1Ò1°$Ô2EÀtÄ~ÑVÔVñ!ô !˜ð
 ! Aš:˜:Ø ŸFšF 6™NœN˜Nð+ð +ð +ñ +ô +ð +ð +ð +ð +ð +ð +øøøð +ð +ð +ð +ðA'	+ð '	+ð '	+ñ '	+ô '	+ð '	+ð '	+ð '	+ð '	+ð '	+ð '	+ð '	+øøøð '	+ð '	+ð '	+ð '	+ð '	+ð '	+sÊ   ½.MÁ+BÂMÂB	ÂMÂB	ÂAMÃA EÄ<MÅEÅMÅEÅB	MÇG=Ç1MÇ=H	ÈMÈH	È(MÈ-A4J-Ê!MÊ-J1	Ê1MÊ4J1	Ê5MËA)MÌ9MÍM		Í	MÍM		ÍMÍM!Í$M!c                 ó¦  — |                       ¦   «          |                      d¦  «        5  t          | j        d         t          t
          f¦  «        st          d¦  «        ‚|                      ¦   «          |                      d¦  «        5  |                      dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )Núif {variable}_is_dict:r,   zminProperties must be a numberz$if {variable}_len < {minProperties}:z7{name} must contain at least {minProperties} propertiesrk   ©	Úcreate_variable_is_dictrq   rw   rm   r	   r”   r   r“   rr   r•   s    r[   rK   z,CodeGeneratorDraft04.generate_min_properties»  sp  € Ø×$Ò$Ñ&Ô&Ð&Ø�VŠVÐ,Ñ-Ô-ð 	jð 	jÝ˜dÔ.¨Ô?Å#ÅuÀÑNÔNð VÝ3Ð4TÑUÔUÐUØ×,Ò,Ñ.Ô.Ð.Ø—’Ð>Ñ?Ô?ð jð jØ—’ÐRÐYh�ÑiÔiÐið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rÀ   c                 ó¦  — |                       ¦   «          |                      d¦  «        5  t          | j        d         t          t
          f¦  «        st          d¦  «        ‚|                      ¦   «          |                      d¦  «        5  |                      dd¬¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )NrÏ   r-   zmaxProperties must be a numberz$if {variable}_len > {maxProperties}:zD{name} must contain less than or equal to {maxProperties} propertiesrk   rÐ   r•   s    r[   rL   z,CodeGeneratorDraft04.generate_max_propertiesÄ  sp  € Ø×$Ò$Ñ&Ô&Ð&Ø�VŠVÐ,Ñ-Ô-ð 	wð 	wÝ˜dÔ.¨Ô?Å#ÅuÀÑNÔNð VÝ3Ð4TÑUÔUÐUØ×,Ò,Ñ.Ô.Ð.Ø—’Ð>Ñ?Ô?ð wð wØ—’Ð_Ðfu�ÑvÔvÐvðwð wð wñ wô wð wð wð wð wð wð wøøøð wð wð wð wð		wð 	wð 	wñ 	wô 	wð 	wð 	wð 	wð 	wð 	wð 	wð 	wøøøð 	wð 	wð 	wð 	wð 	wð 	wrÀ   c           	      óN  ‡ — ‰                       ¦   «          ‰                      d¦  «        5  t          ‰ j        d         t          t
          f¦  «        st          d¦  «        ‚t          ‰ j        d         ¦  «        t          t          ‰ j        d         ¦  «        ¦  «        k    rt          d¦  «        ‚‰ j         	                    dd¦  «        sCˆ fd„‰ j        d         D ¦   «         }|r(t          d 
                    ‰ j        |¦  «        ¦  «        ‚‰                      d	¦  «         ‰                      d
¦  «        5  d}‰                      d‰                      ‰ j        d         ¦  «        d|¬¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         d S # 1 swxY w Y   d S )NrÏ   r.   zrequired must be an arrayz%required must contain unique elementsr2   Tc           	      ó¸   •‡— g | ]UŠ‰‰j                              d i ¦  «        v¯t          ˆfd„‰j                              di ¦  «        D ¦   «         ¦  «        °S‰‘ŒVS )r0   c              3   óB   •K  — | ]}t          j        |‰¦  «        V — Œd S rc   )rž   Úsearch)re   r¦   Úprops     €r[   rg   zDCodeGeneratorDraft04.generate_required.<locals>.<listcomp>.<genexpr>Ú  s/   øè è € Ð#vÐ#v¸u¥B¤I¨e°TÑ$:Ô$:Ð#vÐ#vÐ#vÐ#vÐ#vÐ#vr\   r1   )rm   r·   Úany)re   r×   rS   s    @€r[   ú
<listcomp>z:CodeGeneratorDraft04.generate_required.<locals>.<listcomp>Õ  s€   øø€ ð  ð  ð  àà DÔ$4×$8Ò$8¸ÀrÑ$JÔ$JÐJÐJÝ #Ð#vÐ#vÐ#vÐ#vÈÔHX×H\ÒH\Ð]pÐrtÑHuÔHuÐ#vÑ#vÔ#vÑ vÔ vð Kð ð KÐJÐJr\   z){}: items {} are required but not allowedz>{variable}__missing_keys = set({required}) - {variable}.keys()zif {variable}__missing_keys:z5str(sorted({variable}__missing_keys)) + " properties"z{name} must contain )rl   r‹   )rÑ   rq   rw   rm   rx   ry   r   rÊ   Úsetr·   r$   rp   rr   rz   )rS   Únot_possiblerŒ   s   `  r[   rM   z&CodeGeneratorDraft04.generate_requiredÍ  sa  ø€ Ø×$Ò$Ñ&Ô&Ð&Ø�VŠVÐ,Ñ-Ô-ð 	ð 	Ý˜dÔ.¨zÔ:½TÅ5¸MÑJÔJð QÝ3Ð4OÑPÔPÐPÝ�4Ô# JÔ/Ñ0Ô0µC½¸DÔ<LÈZÔ<XÑ8YÔ8YÑ4ZÔ4ZÒZÐZÝ3Ð4[Ñ\Ô\Ð\ØÔ#×'Ò'Ð(>ÀÑEÔEð 	Jð ð  ð  ð  à $Ô 0°Ô <ð ñ  ô  �ð  ð JÝ7Ð8c×8jÒ8jÐkoÔkyð  |Hñ  9Iô  9Iñ  Jô  Jð  JØ�FŠFÐSÑTÔTÐTØ—’Ð6Ñ7Ô7ð ð ØQ�Ø—’Ð/°·²¸Ô8HÈÔ8TÑ1UÔ1UÐ\fÐv}�Ñ~Ô~Ð~ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð!	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s6   «DFÄ<:FÅ6FÆF	ÆFÆ	F	Æ
FÆFÆ!Fc                 óT  — |                       ¦   «          |                      d¦  «        5  |                      ¦   «          | j        d                              ¦   «         D �]¯\  }}t          j        dd|¦  «        }t          |t          t          f¦  «        s(t          d                     | j        |¦  «        ¦  «        ‚|                      d|                      |¦  «        ¦  «        5  |                      d|                      |¦  «        ¦  «         |                      d||                      |¦  «        ¦  «         |                      |d	                     | j        |¦  «        d
                     | j        |                      |¦  «        ¦  «        d¬¦  «         ddd¦  «         n# 1 swxY w Y   | j        rVt          |t          ¦  «        rAd|v r=|                      d|                      |¦  «        t#          |d         ¦  «        ¦  «         �Œ±	 ddd¦  «         dS # 1 swxY w Y   dS )a  
        Means object with defined keys.

        .. code-block:: python

            {
                'properties': {
                    'key': {'type': 'number'},
                },
            }

        Valid object is containing key called 'key' and value any number.
        rÏ   r0   z($[^a-zA-Z]|[^a-zA-Z0-9])rh   z{}[{}] must be objectzif "{}" in {variable}_keys:z{variable}_keys.remove("{}")z#{variable}__{0} = {variable}["{1}"]rÅ   z{}.{}Tr|   NrÆ   zelse: {variable}["{}"] = {})rÑ   rq   Úcreate_variable_keysrm   r+   rž   r�   rw   r   r   r   r$   rp   rz   r~   r   r7   r¡   )rS   ÚkeyÚprop_definitionÚkey_names       r[   rO   z(CodeGeneratorDraft04.generate_propertiesã  s–  € ð 	×$Ò$Ñ&Ô&Ð&Ø�VŠVÐ,Ñ-Ô-ð 	ið 	iØ×%Ò%Ñ'Ô'Ð'Ø(,Ô(8¸Ô(F×(LÒ(LÑ(NÔ(Nð iñ iÑ$��_Ýœ6Ð">ÀÀCÑHÔH�Ý! /µD½$°<Ñ@Ô@ð rÝ7Ð8O×8VÒ8VÐW[ÔWeÐgoÑ8pÔ8pÑqÔqÐqØ—V’VÐ9¸4¿6º6À#¹;¼;ÑGÔGð ð Ø—F’FÐ9¸4¿6º6À#¹;¼;ÑGÔGÐGØ—F’FÐ@À(ÈDÏFÊFÐSVÉKÌKÑXÔXÐXØ×1Ò1Ø'Ø Ÿš¨¬¸ÑAÔAØŸš tÔ':¸D¿FºFÀ3¹K¼KÑHÔHØ(,ð	 2ñ ô ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð Ô$ð i­°OÅTÑ)JÔ)Jð iÈyÐ\kÐOkÐOkØ—F’FÐ8¸$¿&º&À¹+¼+ÅtÈOÐ\eÔLfÑGgÔGgÑhÔhÐhùðið	ið 	ið 	iñ 	iô 	ið 	ið 	ið 	ið 	ið 	ið 	ið 	iøøøð 	ið 	ið 	ið 	ið 	ið 	is8   ªB=HÃ'B2F%ÆHÆ%F)Æ)HÆ,F)Æ-A"HÈH!È$H!c                 ór  — |                       ¦   «          |                      d¦  «        5  |                      ¦   «          | j        d                              ¦   «         D ]!\  }}t          j        |¦  «        | j        |<   Œ"|                      d¦  «        5  | j        d                              ¦   «         D ]Ñ\  }}|                      dt          |¦  «        ¦  «        5  |                      d¦  «        5  |                      d¦  «         ddd¦  «         n# 1 swxY w Y   |  	                    |d 
                    | j        ¦  «        d	 
                    | j        | j        ¦  «        d
¬¦  «         ddd¦  «         n# 1 swxY w Y   ŒÒ	 ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )a4  
        Means object with defined keys as patterns.

        .. code-block:: python

            {
                'patternProperties': {
                    '^x': {'type': 'number'},
                },
            }

        Valid object is containing key starting with a 'x' and value any number.
        rÏ   r1   z9for {variable}_key, {variable}_val in {variable}.items():z-if REGEX_PATTERNS[{}].search({variable}_key):z%if {variable}_key in {variable}_keys:z&{variable}_keys.remove({variable}_key)Nz{}_valú{}.{{{}_key}}Tr|   )rÑ   rq   rÝ   rm   r+   rž   rŸ   r    r¡   r~   r$   rp   r   )rS   r#   rT   s      r[   rP   z0CodeGeneratorDraft04.generate_pattern_properties  sÇ  € ð 	×$Ò$Ñ&Ô&Ð&Ø�VŠVÐ,Ñ-Ô-ð 	ð 	Ø×%Ò%Ñ'Ô'Ð'Ø'+Ô'7Ð8KÔ'L×'RÒ'RÑ'TÔ'Tð Eð EÑ#�˜Ý13´¸GÑ1DÔ1D�Ô% gÑ.Ð.Ø—’ÐSÑTÔTð 
ð 
Ø+/Ô+;Ð<OÔ+P×+VÒ+VÑ+XÔ+Xð 	ð 	Ñ'�G˜ZØŸšÐ OÕQUÐV]ÑQ^ÔQ^Ñ_Ô_ð ð Ø!ŸVšVÐ$KÑLÔLð Mð MØ ŸFšFÐ#KÑLÔLÐLðMð Mð Mñ Mô Mð Mð Mð Mð Mð Mð Møøøð Mð Mð Mð Mà×5Ò5Ø&Ø$ŸOšO¨D¬NÑ;Ô;Ø+×2Ò2°4Ô3FÈÌÑWÔWØ,0ð	 6ñ ô ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øð	ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð		ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s€   ªA+F,ÂAFÃE;	Ã3DÄ	E;	ÄDÄE;	ÄDÄAE;	Å/FÅ;E?Å?FÆE?ÆFÆF,ÆF	ÆF,ÆF	ÆF,Æ,F0Æ3F0c                 óx  — |                       ¦   «          |                      d¦  «        5  |                      ¦   «          | j        d         }|du s|i k    r	 ddd¦  «         dS |røt	          | j                             di ¦  «                             ¦   «         ¦  «        }|                      d¦  «        5  |                      d|¦  «        5  |                      d¦  «         |                      |d	                     | j	        ¦  «        d
                     | j
        | j	        ¦  «        ¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   nD|                      d¦  «        5  |                      dd¬¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )aŸ  
        Means object with keys with values defined by definition.

        .. code-block:: python

            {
                'properties': {
                    'key': {'type': 'number'},
                }
                'additionalProperties': {'type': 'string'},
            }

        Valid object is containing key called 'key' and it's value any number and
        any other key with any string.
        rÏ   r2   TNr0   z&for {variable}_key in {variable}_keys:zif {variable}_key not in {}:z1{variable}_value = {variable}.get({variable}_key)z{}_valuerâ   zif {variable}_keys:z;{name} must not contain "+str({variable}_keys)+" propertiesrk   )rÑ   rq   rÝ   rm   rx   r·   Úkeysr~   r$   rp   r   rr   )rS   Úadd_prop_definitionÚproperties_keyss      r[   rQ   z3CodeGeneratorDraft04.generate_additional_properties#  s  € ð  	×$Ò$Ñ&Ô&Ð&Ø�VŠVÐ,Ñ-Ô-ð 	yð 	yØ×%Ò%Ñ'Ô'Ð'Ø"&Ô"2Ð3IÔ"JÐØ" dÐ*Ð*Ð.AÀRÒ.GÐ.GØð		yð 	yð 	yñ 	yô 	yð 	yð 	yð 	yð
 #ð yÝ"& tÔ'7×';Ò';¸LÈ"Ñ'MÔ'M×'RÒ'RÑ'TÔ'TÑ"UÔ"U�Ø—V’VÐDÑEÔEð ð ØŸšÐ >ÀÑPÔPð ð ØŸšÐRÑSÔSÐSØ×5Ò5Ø/Ø&×-Ò-¨d¬nÑ=Ô=Ø+×2Ò2°4Ô3FÈÌÑWÔWñô ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øð —V’VÐ1Ñ2Ô2ð yð yØ—H’HÐZÐaw�HÑxÔxÐxðyð yð yñ yô yð yð yð yð yð yð yøøøð yð yð yð yð!	yð 	yð 	yñ 	yô 	yð 	yð 	yð 	yð 	yð 	yð 	yð 	yøøøð 	yð 	yð 	yð 	yð 	yð 	ys…   ª-F/Á$AF/Â5EÃA#D;Ä/EÄ;D?Ä?EÅD?ÅEÅF/ÅE	ÅF/ÅE	ÅF/Å3FÆF/ÆF	ÆF/ÆF	ÆF/Æ/F3Æ6F3c                 ó\  — |                       ¦   «          |                      d¦  «        5  d}| j        d                              ¦   «         D �]/\  }}|g k    s|du rŒd}|                      d|                      |¦  «        ¦  «        5  |du r|                      d|d¬¦  «         n¾t          |t          ¦  «        r†|D ]‚}|                      d|                      |¦  «        ¦  «        5  |                      d	|                      |¦  «        |                      |¦  «        d¬¦  «         d
d
d
¦  «         n# 1 swxY w Y   Œƒn#|                      || j	        | j
        d¬¦  «         d
d
d
¦  «         n# 1 swxY w Y   �Œ1|r|                      d¦  «         d
d
d
¦  «         d
S # 1 swxY w Y   d
S )aþ  
        Means when object has property, it needs to have also other property.

        .. code-block:: python

            {
                'dependencies': {
                    'bar': ['foo'],
                },
            }

        Valid object is containing only foo, both bar and foo or none of them, but not
        object with only bar.

        Since draft 06 definition can be boolean or empty array. True and empty array
        means nothing, False means that key cannot be there at all.
        rÏ   Tr/   Fzif "{}" in {variable}:z{} in {name} must not be thererk   zif "{}" not in {variable}:z#{name} missing dependency {} for {}Nr|   rÈ   )rÑ   rq   rm   r+   rz   rr   rw   rx   r~   rp   r   )rS   Úis_emptyrÞ   ÚvaluesÚvalues        r[   rN   z*CodeGeneratorDraft04.generate_dependenciesG  s²  € ð$ 	×$Ò$Ñ&Ô&Ð&Ø�VŠVÐ,Ñ-Ô-ð 	ð 	ØˆHØ#Ô/°Ô?×EÒEÑGÔGð yñ y‘��VØ˜R’<�< 6¨T > >ØØ �Ø—V’VÐ4°d·f²f¸S±k´kÑBÔBð yð yØ ��ØŸšÐ!AÀ3È^˜Ñ\Ô\Ð\Ð\Ý# F­DÑ1Ô1ð yØ%+ð Að A˜EØ!%§¢Ð(DÀdÇfÂfÈUÁmÄmÑ!TÔ!Tð Að AØ $§¢Ð)NÐPT×PVÒPVÐW\ÑP]ÔP]Ð_c×_eÒ_eÐfiÑ_jÔ_jÐq ñ  !Aô  !Að  !AðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að AøðAð ×5Ò5°f¸d¼nÈdÔNaÐswÐ5ÑxÔxÐxðyð yð yñ yô yð yð yð yð yð yð yøøøð yð yð yð yùð ð Ø—’�v‘”�ð!	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s\   ªAF!ÂA E0Ã(A D4Ä(E0Ä4D8Ä8E0Ä;D8Ä<(E0Å$F!Å0E4Å4F!Å7E4Å8F!Æ!F%Æ(F%)!Ú__name__Ú
__module__Ú__qualname__r¨   r4   Úpropertyr_   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   r§   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rO   rP   rQ   rN   Ú__classcell__)rZ   s   @r[   r   r      sW  ø€ € € € € ð DØBð NØfð rØ'ðð €Mð -1¸"È$Ð\`Ðvzð  &ð  &ð  &ð  &ð  &ð  &ðD ðð ð ð ñ „Xðð
Kð Kð Kð,Lð Lð Lð vð vð vð&Sð Sð Sð<sð sð sð>Vð Vð Vð6lð lð lðmð mð mðWð Wð Wð!Zð !Zð !ZðHJð Jð Jð	að 	að 	að	bð 	bð 	bðAð Að Að [ð [ð [ðhð hð hðQð Qð QðB>+ð >+ð >+ð@jð jð jðwð wð wðð ð ð,ið ið iðBð ð ð>"yð "yð "yðH#ð #ð #ð #ð #ð #ð #r\   r   )rµ   rž   Ú
exceptionsr   Ú	generatorr   r   rd   rŸ   rœ   r   © r\   r[   ú<module>ró      s¶   ðØ €€€Ø 	€	€	€	à 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2ð ØØ#ØØØØðð Ð ð �”
˜<Ñ(Ô(€ðT	ð T	ð T	ð T	ð T	˜=ñ T	ô T	ð T	ð T	ð T	r\   