Ë
    qûàg¶ù  ã                   óp  — d Z ddlZddlZddlZddlmZmZmZmZ ddl	m
Z
 ddlmZmZ ddlmZ ddlmZ ddlmZmZmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZ  edd¬«      Ze e!ffd„Z"d„ Z# G d„ d«      Z$ G d„ de$«      Z% G d„ de$«      Z& G d„ de$«      Z' G d„ de$«      Z(e(e(e(e&e'e%dœZ) G d„ de«      Z*y)ae  
sqldiff.py - Prints the (approximated) difference between models and database

TODO:
 - better support for relations
 - better support for constraints (mainly postgresql?)
 - support for table spaces with postgresql
 - when a table is not managed (meta.managed==False) then only do a one-way
   sqldiff ? show differences from db->table but not the other way around since
   it's not managed.

KNOWN ISSUES:
 - MySQL has by far the most problems with introspection. Please be
   carefull when using MySQL with sqldiff.
   - Booleans are reported back as Integers, so there's no way to know if
     there was a real change.
   - Varchar sizes are reported back without unicode support so their size
     may change in comparison to the real length of the varchar.
   - Some of the 'fixes' to counter these problems might create false
     positives or false negatives.
é    N)ÚDictÚUnionÚCallableÚOptional)Úapps)ÚBaseCommandÚCommandError)ÚOutputWrapper)Úno_style)Ú
connectionÚtransactionÚmodels)ÚUniqueConstraint)Ú	AutoFieldÚIntegerField)Únormalize_together)ÚsignalcommandÚ_orderT)Únullc                 ó  — t        | «      }t        | «      } d}|t        | «      k  rZt        | |   |«      r7| |   s| j	                  |«       |dz  }n| |   | ||dz    t        | |   |«      rŒ7|dz  }|t        | «      k  rŒZ || «      S )Nr   é   )ÚtypeÚlistÚlenÚ
isinstanceÚpop)ÚlstÚltypesÚltypeÚis       úk/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/django_extensions/management/commands/sqldiff.pyÚflattenr"   *   s—   € Ü�‹I€EÜ
ˆs‹)€CØ	€AØ
Œc�#‹hŠ,Ü˜˜Q™ Ô(Ø�q’6Ø—‘˜”
Ø�Q‘�Øà" 1™v��A�a˜!‘e�ô ˜˜Q™ Õ(ð 	
ˆQ‰ˆð Œc�#‹h‹,ñ �‹:Ðó    c                 ó  — g }| j                   r7| j                  D ]&  }|j                  t        |j                  «      «       Œ( |S | j
                  D ],  }|j                  t        ¬«      }|€Œ|j                  |«       Œ. |S ©N©r   )	ÚproxyÚparentsÚextendÚall_local_fieldsÚ_metaÚlocal_fieldsÚdb_typer   Úappend)ÚmetaÚ
all_fieldsÚparentÚfÚcol_types        r!   r*   r*   :   s‡   € Ø€JØ‡z‚zØ—l‘lò 	>ˆFØ×ÑÔ.¨v¯|©|Ó<Õ=ð	>ð Ðð ×"Ñ"ò 	!ˆAØ—y‘y¬J�yÓ7ˆHØÐØØ×Ñ˜aÕ ð		!ð
 Ðr#   c                   ó€  — e Zd Zi ZdgZg d¢Zddddddd	d
ddddddd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d*„ Z d+„ Z!dCd,„Z"dDd-„Z#d.„ Z$d/„ Z%d0„ Z&d1„ Z'd2„ Z(d3„ Z)d4„ Z*dEd5„Z+d6„ Z,d7„ Z-d8„ Z.d9„ Z/d:„ Z0dEd;„Z1dEd<„Z2d=„ Z3d>„ Z4d?„ Z5 e6«       fd@„Z7dA„ Z8dB„ Z9y!)FÚSQLDiffÚdjango_migrations©ÚerrorÚcommentútable-missing-in-dbútable-missing-in-modelúfield-missing-in-dbúfield-missing-in-modelúfkey-missing-in-dbzfkey-missing-in-modelúindex-missing-in-dbúindex-missing-in-modelúunique-missing-in-dbúunique-missing-in-modelúfield-type-differúfield-parameter-differúnotnull-differzerror: %(0)szcomment: %(0)sz!table '%(0)s' missing in databaseztable '%(0)s' missing in modelsz6field '%(1)s' defined in model but missing in databasez6field '%(1)s' defined in database but missing in modelzBfield '%(1)s' FOREIGN KEY defined in model but missing in databasezBfield '%(1)s' FOREIGN KEY defined in database but missing in modelzJfield '%(1)s' INDEX named '%(2)s' defined in model but missing in databasezCfield '%(1)s' INDEX defined in database schema but missing in modelzKfield '%(1)s' UNIQUE named '%(2)s' defined in model but missing in databasezDfield '%(1)s' UNIQUE defined in database schema but missing in modelz9field '%(1)s' not of same type: db='%(3)s', model='%(2)s'z:field '%(1)s' parameters differ: db='%(3)s', model='%(2)s'z?field '%(1)s' null constraint should be '%(2)s' in the databasec                 ó
  ‡— ‰j                  d«      ›d‰j                   ||d   «      «      ›d‰j                  d«      ›d‰j                   ||d   «      «      ›ddj                  ˆfd„t	        |dd  «      D «       «      ›d	�
S )
NúALTER TABLEú r   ú
	ú
ADD COLUMNr   c              3   ór   •K  — | ].  \  }}|d k(  r‰j                  |«      n‰j                  |«      –— Œ0 y­w©r   N©ÚSQL_COLTYPEÚSQL_KEYWORD©Ú.0r    ÚaÚstyles      €r!   ú	<genexpr>z#SQLDiff.<lambda>.<locals>.<genexpr>w   ó7   øè ø€ ÒjÉdÈaÐQR¨¨aª�×"Ñ" 1Ô%°U×5FÑ5FÀqÓ5IÓIÑjùó   ƒ47é   ú;)rO   Ú	SQL_TABLEÚ	SQL_FIELDÚjoinÚ	enumerate©ÚselfrS   ÚqnÚargss    `  r!   ú<lambda>zSQLDiff.<lambda>r   sp   ø€ Ø×Ñ˜-Õ(Ø�‰™˜4 ™7›Õ$Ø×Ñ˜,Õ'Ø�‰™˜4 ™7›Õ$Ø�‰ÓjÔV_Ð`dÐefÐegÐ`hÓViÔjÕjð=€ r#   c                 óº   — |j                  d«      ›d|j                   ||d   «      «      ›d|j                  d«      ›d|j                   ||d   «      «      ›d�S )NrG   rH   r   rI   zDROP COLUMNr   rX   ©rO   rY   rZ   r]   s       r!   ra   zSQLDiff.<lambda>y   sN   € Ø×Ñ˜-Õ(Ø�‰™˜4 ™7›Õ$Ø×Ñ˜-Õ(Ø�‰™˜4 ™7›Õ$ð	@€ r#   c                 óØ  ‡— ‰j                  d«      ›d‰j                   ||d   «      «      ›d‰j                  d«      ›d‰j                   ||d   «      «      ›ddj                  ˆfd„t	        |dd  «      D «       «      ›d‰j                  d	«      ›d‰j                   ||d
   «      «      ›d‰j                   ||d   «      «      ›dt
        j                  j                  «       ›d�S )NrG   rH   r   rI   rJ   r   c              3   ór   •K  — | ].  \  }}|d k(  r‰j                  |«      n‰j                  |«      –— Œ0 y­wrL   rM   rP   s      €r!   rT   z#SQLDiff.<lambda>.<locals>.<genexpr>„   rU   rV   é   Ú
REFERENCESrW   ú (é   ú)rX   )rO   rY   rZ   r[   r\   r   ÚopsÚdeferrable_sqlr]   s    `  r!   ra   zSQLDiff.<lambda>   s¶   ø€ Ø×Ñ˜-Õ(Ø�‰™˜4 ™7›Õ$Ø×Ñ˜,Õ'Ø�‰™˜4 ™7›Õ$Ø�‰ÓjÔV_Ð`dÐefÐegÐ`hÓViÔjÕjØ×Ñ˜,Õ'Ø�‰™˜4 ™7›Õ$Ø�‰™˜4 ™7›Õ$Ü�‰×%Ñ%Õ'ð
<€ r#   c                 ó>  ‡— |j                  d«      ›d|j                   ‰|d   «      «      ›d|j                  d«      ›d|j                   ‰|d   «      «      ›d|j                  dj                  ˆfd	„|d
   D «       «      «      ›|j                  |d   «      ›d�S )NzCREATE INDEXrH   rW   rI   ÚONr   rh   ú, c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­w©N© ©rQ   Úer_   s     €r!   rT   z#SQLDiff.<lambda>.<locals>.<genexpr>�   ó   øè ø€ Ò!9¨A¡" Q§%Ñ!9ùó   ƒr   ri   ú);©rO   rY   rZ   r[   r]   s     ` r!   ra   zSQLDiff.<lambda>Š   s~   ø€ Ø×Ñ˜.Õ)Ø�‰™˜4 ™7›Õ$à×Ñ˜$Õ §¡±°D¸±G³Õ!=Ø�‰˜Ÿ	™	Ó!9°°a±Ô!9Ó9Ô:Ø×Ñ˜$˜q™'Õ"ð=€ r#   c                 ó`   — |j                  d«      ›d|j                   ||d   «      «      ›d�S )Nz
DROP INDEXrH   r   rX   ©rO   rY   r]   s       r!   ra   zSQLDiff.<lambda>’   s,   € Ø×Ñ˜,Õ'Ø�‰™˜4 ™7›Õ$ð@€ r#   c                 ó:  ‡— |j                  d«      ›d|j                   ‰|d   «      «      ›d|j                  d«      ›d|j                   ‰|d   «      «      ›d|j                  d«      ›d|j                  d	j                  ˆfd
„|d   D «       «      «      ›d�S )NrG   rH   r   rI   zADD CONSTRAINTrW   ÚUNIQUErh   ro   c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wrq   rr   rs   s     €r!   rT   z#SQLDiff.<lambda>.<locals>.<genexpr>œ   ru   rv   r   rw   rx   r]   s     ` r!   ra   zSQLDiff.<lambda>–   s|   ø€ Ø×Ñ˜-Õ(Ø�‰™˜4 ™7›Õ$Ø×ÑÐ*Õ+Ø�‰™˜4 ™7›Õ$Ø×Ñ˜(Õ#Ø�‰˜Ÿ	™	Ó!9°°a±Ô!9Ó9Õ:ð>€ r#   c                 óÞ   — |j                  d«      ›d|j                   ||d   «      «      ›d|j                  d«      ›d|j                  d«      ›d|j                   ||d   «      «      ›d�
S )	NrG   rH   r   rI   ÚDROPÚ
CONSTRAINTr   rX   rz   r]   s       r!   ra   zSQLDiff.<lambda>ž   s\   € Ø×Ñ˜-Õ(Ø�‰™˜4 ™7›Õ$Ø×Ñ˜&Õ!Ø×Ñ˜,Õ'Ø�‰™˜4 ™7›Õ$ðA€ r#   c                 óä   — |j                  d«      ›d|j                   ||d   «      «      ›d|j                  d«      ›d|j                   ||d   «      «      ›d|j                  |d   «      ›d�
S ©	NrG   rH   r   rI   ÚMODIFYr   rW   rX   ©rO   rY   rZ   rN   r]   s       r!   ra   zSQLDiff.<lambda>¥   s_   € Ø×Ñ˜-Õ(Ø�‰™˜4 ™7›Õ$Ø×Ñ˜(Õ#Ø�‰™˜4 ™7›Õ$Ø×Ñ˜$˜q™'Õ"ð;€ r#   c                 óä   — |j                  d«      ›d|j                   ||d   «      «      ›d|j                  d«      ›d|j                   ||d   «      «      ›d|j                  |d   «      ›d�
S r‚   r„   r]   s       r!   ra   zSQLDiff.<lambda>¬   s`   € Ø×Ñ˜-Õ(Ø�‰™˜4 ™7›Õ$Ø×Ñ˜(Õ#Ø�‰™˜4 ™7›Õ$Ø×Ñ˜$˜q™'Õ"ð@€ r#   c                 ó  — |j                  d«      ›d|j                   ||d   «      «      ›d|j                  d«      ›d|j                   ||d   «      «      ›d|j                  |d   «      ›d|j                  d«      ›d	�S )
NrG   rH   r   rI   rƒ   r   rW   úNOT NULLrX   rc   r]   s       r!   ra   zSQLDiff.<lambda>³   sm   € Ø×Ñ˜-Õ(Ø�‰™˜4 ™7›Õ$Ø×Ñ˜(Õ#Ø�‰™˜4 ™7›Õ$Ø×Ñ˜$˜q™'Õ"Ø×Ñ˜*Õ%ð8€ r#   c                 óN   — |j                  d|j                  |d   «      z  «      S )Nz-- Error: %sr   )ÚNOTICEÚERRORr]   s       r!   ra   zSQLDiff.<lambda>»   s$   € ¨e¯l©l¸>ÈEÏKÉKÐX\Ð]^ÑX_ÓL`Ñ;`Ó.a€ r#   c                 óN   — |j                  d|j                  |d   «      z  «      S )Nz-- Comment: %sr   )r‰   rY   r]   s       r!   ra   zSQLDiff.<lambda>¼   s(   € °·±Ð=MÐPU×P_ÑP_Ð`dÐefÑ`gÓPhÑ=hÓ0i€ r#   c                 ó0   — |j                  d|d   z  «      S )Nz-- Table missing: %sr   ©r‰   r]   s       r!   ra   zSQLDiff.<lambda>½   s   € ¸E¿L¹LÐI_ÐbfÐghÑbiÑIiÓ<j€ r#   c                 ó0   — |j                  d|d   z  «      S )Nz-- Model missing for table: %sr   r�   r]   s       r!   ra   zSQLDiff.<lambda>¾   s   € ¸u¿|¹|ÐLlÐosÐtuÑovÑLvÓ?w€ r#   FNc                 óH  — d | _         || _        || _        |d   | _        || _        || _        t        j                  | _        g | _        i | _	        t        «       | _        i | _        t        «       | _        | j                  | j                  | j                   | j"                  | j$                  | j&                  | j(                  | j&                  | j*                  | j,                  | j.                  | j0                  | j2                  | j4                  | j6                  dœ| _        y )NÚdense_outputr7   )Úhas_differencesÚ
app_modelsÚoptionsÚdenseÚstdoutÚstderrr   ÚintrospectionÚdifferencesÚunknown_db_fieldsÚsetÚnew_db_fieldsr   ÚunsignedÚ	SQL_ERRORÚSQL_COMMENTÚSQL_TABLE_MISSING_IN_DBÚSQL_TABLE_MISSING_IN_MODELÚSQL_FIELD_MISSING_IN_DBÚSQL_FIELD_MISSING_IN_MODELÚSQL_FKEY_MISSING_IN_DBÚSQL_INDEX_MISSING_IN_DBÚSQL_INDEX_MISSING_IN_MODELÚSQL_UNIQUE_MISSING_IN_DBÚSQL_UNIQUE_MISSING_IN_MODELÚSQL_FIELD_TYPE_DIFFERÚSQL_FIELD_PARAMETER_DIFFERÚSQL_NOTNULL_DIFFERÚDIFF_SQL)r^   r’   r“   r•   r–   s        r!   Ú__init__zSQLDiff.__init__Ä   sú   € Ø#ˆÔØ$ˆŒØˆŒØ˜^Ñ,ˆŒ
ØˆŒØˆŒä'×5Ñ5ˆÔàˆÔØ!#ˆÔÜ ›UˆÔØˆŒ	Ü›ˆŒð —^‘^Ø×'Ñ'Ø#'×#?Ñ#?Ø&*×&EÑ&EØ#'×#?Ñ#?Ø&*×&EÑ&EØ"&×"=Ñ"=Ø%)×%DÑ%DØ#'×#?Ñ#?Ø&*×&EÑ&EØ$(×$AÑ$AØ'+×'GÑ'GØ!%×!;Ñ!;Ø&*×&EÑ&EØ"×5Ñ5ñ
ˆ�r#   c                 ó’  — t        j                  «       | _        | j                  j                  | j                  d   ¬«      | _        | j                  j                  | j                  «      D �cg c]  }|j                  ‘Œ c}| _        | j                  r| j                  «        | j                  r| j                  «        y y c c}w )NÚonly_existing)r®   )r   Úcursorr—   Údjango_table_namesr“   Údjango_tablesÚget_table_listÚnameÚ	db_tablesÚcan_detect_notnull_differÚ	load_nullÚcan_detect_unsigned_differÚload_unsigned)r^   Ú
table_infos     r!   ÚloadzSQLDiff.loadæ   sœ   € Ü ×'Ñ'Ó)ˆŒØ!×/Ñ/×BÑBÐQU×Q]ÑQ]Ð^mÑQnÐBÓoˆÔà<@×<NÑ<N×<]Ñ<]Ð^b×^iÑ^iÓ<jÖk¨j˜*Ÿ/›/ÒkˆŒà×)Ò)Ø�N‰NÔà×*Ò*Ø×ÑÕ ð +ùò ls   Á/Cc                 ó   — t        d«      ‚)Nzcload_null functions must be implemented if diff backend has 'can_detect_notnull_differ' set to True©ÚNotImplementedError©r^   s    r!   r¶   zSQLDiff.load_nullò   s   € Ü!ð  #Hó  Ið  	Ir#   c                 ó   — t        d«      ‚)Nzgload_unsigned function must be implemented if diff backend has 'can_detect_unsigned_differ' set to Truer¼   r¾   s    r!   r¸   zSQLDiff.load_unsignedõ   s   € Ü!ð  #Ló  Mð  	Mr#   c                 ó@   — | j                   j                  ||g f«       y rq   )r˜   r.   )r^   Ú	app_labelÚ
model_names      r!   Úadd_app_model_markerzSQLDiff.add_app_model_markerø   s   € Ø×Ñ×Ñ ¨J¸Ð ;Õ<r#   c                 ót   — || j                   v sJ d«       ‚| j                  d   d   j                  ||f«       y )NzUnknown difference typeéÿÿÿÿ)Ú
DIFF_TYPESr˜   r.   )r^   Ú	diff_typer`   s      r!   Úadd_differencezSQLDiff.add_differenceû   s=   € Ø˜DŸO™OÑ+ÐFÐ-FÓFÐ+Ø×Ñ˜Ñ˜RÑ ×'Ñ'¨°DÐ(9Õ:r#   c                 ó   — | j                   S rq   )ÚDATA_TYPES_REVERSE_OVERRIDEr¾   s    r!   Úget_data_types_reverse_overridez'SQLDiff.get_data_types_reverse_overrideÿ   s   € à×/Ñ/Ð/r#   c                 ó   — |S rq   rr   )r^   Úfield_namess     r!   Úformat_field_nameszSQLDiff.format_field_names  s   € ØÐr#   c                 ó`  — t        j                  «       }|j                  ||«       |j                  D �cg c]  }|d   ‘Œ	 }}| j	                  |«      }g }|j                  «       D ]@  }g }t        ||«      D ]  }	|j                  |	«       Œ |j                  t        |«      «       ŒB |S c c}w )z±
        Execute query and return a dict

        sql_to_dict(query, param) -> list of dicts

        code from snippet at https://www.djangosnippets.org/snippets/1383/
        r   )	r   r¯   ÚexecuteÚdescriptionrÎ   ÚfetchallÚzipr.   Údict)
r^   ÚqueryÚparamr¯   r³   Ú
fieldnamesÚresultÚrowÚrowsetÚfields
             r!   Úsql_to_dictzSQLDiff.sql_to_dict  s«   € ô ×"Ñ"Ó$ˆØ�‰�u˜eÔ$Ø*0×*<Ñ*<Ö= $�d˜1“gÐ=ˆ
Ð=Ø×,Ñ,¨ZÓ8ˆ
ØˆØ—?‘?Ó$ò 	(ˆCØˆFÜ˜Z¨Ó-ò %�Ø—‘˜eÕ$ð%à�M‰Mœ$˜v›,Õ'ð		(ð
 ˆùò >s   µB+c                 ó.   — |j                  t        ¬«      S r%   )r-   r   )r^   rÛ   s     r!   Úget_field_model_typezSQLDiff.get_field_model_type  s   € Ø�}‰}¬
ˆ}Ó3Ð3r#   c                 ó   — i S rq   rr   )r^   Úcurrent_kwargsrÑ   rÛ   Ú
table_nameÚreverse_types         r!   Úget_field_db_type_kwargsz SQLDiff.get_field_db_type_kwargs  ó   € Øˆ	r#   c           	      óì  — |d   }| j                  «       }||v r||   }n	 | j                  j                  ||«      }t        |«      r |«       }i }t        |t        «      r|j                  |d	   «       |d
   }|dk(  r|rt        |dd «      dk(  rd}t        |t        «      r|j                  |d   «       |d   }|dk(  r|d   r|d   |d<   |dk(  r'|d   |d<   |d   xr t        |d   «      xs |d   |d<   |d   rd|d<   |dvrd|d<   |rt        |dd«      rd|d<   |dk(  r<|d   }	| j                  j                  ||	«      \  }}
|
r|j                  |
«       d|z  }| j!                  |||||«      }|j                  |«       | j#                  |«      } |d#i |¤Žj%                  t&        ¬ «      }|j(                  }|sd!}|||j*                  f| j,                  v r| j.                  |vr|›d"| j.                  ›�}|S # t        $ ri | j	                  |«      }|sR| j
                  d   d d |d d f}|| j                  vr+d| j                  |<   | j                  dd|d   ›d|›d�«       Y y Y �Œ5w xY w)$Nr   rÅ   rW   r9   z!Unknown database type for field 'r   z' (rj   Úkwargsr³   i2B  Ú	geom_typeÚPOINTz.django.contrib.gis.db.models.fields.PointFieldÚ	CharFieldri   Ú
max_lengthÚDecimalFieldrf   Ú
max_digitsé   Údecimal_placesé   TÚblank)Ú	TextFieldré   r   Ú	geographyFÚGeometryFieldz&django.contrib.gis.db.models.fields.%sr&   ÚpublicrH   rr   )rË   r—   Úget_field_typeÚKeyErrorÚget_field_db_type_lookupr˜   r™   rÈ   Úcallabler   rÔ   ÚupdateÚgetattrÚtupleÚabsÚget_geometry_typerã   Úget_field_classr-   r   Údb_tablespaceÚcolumnrœ   Úunsigned_suffix)r^   rÑ   rÛ   rá   Ú	type_coderÊ   râ   Úkeyræ   Úgeo_colÚ
geo_paramsÚextra_kwargsÚfield_classÚfield_db_typeÚ
tablespaces                  r!   Úget_field_db_typezSQLDiff.get_field_db_type   sØ  € ð   ‘Nˆ	Ø&*×&JÑ&JÓ&LÐ#ØÐ3Ñ3Ø6°yÑA‰Lð
 Ø#×1Ñ1×@Ñ@ÀÈKÓX�ô �LÔ!Ù'›>ˆLàˆä�l¤DÔ)Ø�M‰M˜, xÑ0Ô1Ø'¨Ñ/ˆLà˜Ò¡%¬G°E¸;ÈÓ,MÐQXÒ,XØKˆLä�l¤EÔ*Ø�M‰M˜, q™/Ô*Ø'¨™?ˆLà˜;Ò&¨;°qª>Ø#.¨q¡>ˆF�<Ñ à˜>Ò)Ø#.¨q¡>ˆF�<Ñ Ø'2°1¡~Ò'M¼#¸kÈ!¹nÓ:MÒ'_ÐQ\Ð]^ÑQ_ˆFÐ#Ñ$à�qŠ>Ø"ˆF�7‰OØÐ#=Ñ=Ø!%��v‘á”W˜U K°Ô7Ø"&ˆF�;Ñà˜?Ò*Ø! !‘nˆGð (,×'9Ñ'9×'KÑ'KÈJÐX_Ó'`Ñ$ˆL˜*ÙØ—‘˜jÔ)ØCÀlÑRˆLà×4Ñ4°V¸[È%ÐQ[Ð]iÓjˆØ�‰�lÔ#à×*Ñ*¨<Ó8ˆÙ#Ñ- fÑ-×5Ñ5ÄÐ5ÓLˆà×(Ñ(ˆ
ÙØ!ˆJØ˜
 E§L¡LÐ1°T·]±]ÑBÀt×G[ÑG[ÐcpÑGpÚ'4°d×6JÒ6JÐKˆMàÐøô} ò  Ø#×<Ñ<¸YÓG�Ù#à×+Ñ+¨BÑ/°°Ð3°[ÀÀ!°_ÐE�CØ $×"8Ñ"8Ñ8Ø67˜×.Ñ.¨sÑ3Ø×+Ñ+©IÐfqÐrsÓftÒvð  8Aô  BÙò $ð ús   ¡H ÈA,I3É2I3c                  ó   — y rq   rr   )r^   r  s     r!   r÷   z SQLDiff.get_field_db_type_lookupj  s   € Ør#   c                 ó–   — d|v r6|j                  dd«      \  }}t        j                  |«      }t        ||«      S t        t        |«      S )Nú.r   )ÚrsplitÚ	importlibÚimport_modulerú   r   )r^   Ú
class_pathÚmodule_pathÚpackage_nameÚmodules        r!   rþ   zSQLDiff.get_field_classm  sK   € Ø�*ÑØ(2×(9Ñ(9¸#¸qÓ(AÑ%ˆK˜Ü×,Ñ,¨[Ó9ˆFÜ˜6 <Ó0Ð0ä”v˜zÓ*Ð*r#   c                 óš   — |j                   }|dk(  rd}|j                  xs |j                  }| j                  j	                  |||fd«      S )NÚ rô   Úfixme)rÿ   Ú	db_columnÚattnamer   Úget)r^   rÛ   rá   r	  r  s        r!   Úget_field_db_nullablezSQLDiff.get_field_db_nullableu  sH   € Ø×(Ñ(ˆ
Ø˜ÒØ!ˆJØ—/‘/Ò2 U§]¡]ˆØ�y‰y�}‰}˜j¨*°gÐ>ÀÓHÐHr#   c                 ó|   — |r9|dk7  r4|j                  d«      d   j                  d«      d   j                  «       S |S )Nzdouble precisionrH   r   ú()ÚsplitÚlower)r^   Ú
field_types     r!   Ústrip_parameterszSQLDiff.strip_parameters|  sB   € Ù˜*Ð(:Ò:Ø×#Ñ# CÓ(¨Ñ+×1Ñ1°#Ó6°qÑ9×?Ñ?ÓAÐAØÐr#   c                 óº   — t        t        |j                  «      «      }|j                  D ]  }|j	                  |j
                  «       Œ | j                  ||«      S rq   )r   r   Úindex_togetherÚindexesr.   ÚfieldsÚexpand_together)r^   r/   Úindexes_normalizedÚidxs       r!   Úget_index_togetherzSQLDiff.get_index_together�  sT   € Ü!Ô"4°T×5HÑ5HÓ"IÓJÐà—<‘<ò 	2ˆCØ×%Ñ% c§j¡jÕ1ð	2ð ×#Ñ#Ð$6¸Ó=Ð=r#   c                 óÜ   — t        t        |j                  «      «      }|j                  D ].  }t	        |t
        «      sŒ|j                  |j                  «       Œ0 | j                  ||«      S rq   )	r   r   Úunique_togetherÚconstraintsr   r   r.   r%  r&  )r^   r/   Úunique_normalizedÚ
constraints       r!   Úget_unique_togetherzSQLDiff.get_unique_together‰  sc   € Ü Ô!3°D×4HÑ4HÓ!IÓJÐà×*Ñ*ò 	<ˆJÜ˜*Ô&6Õ7Ø!×(Ñ(¨×):Ñ):Õ;ð	<ð ×#Ñ#Ð$5°tÓ<Ð<r#   c                 ór   ‡— g }t        |«      D ]%  }|j                  t        ˆfd„|D «       «      «       Œ' |S )Nc              3   óT   •K  — | ]  }‰j                  |«      j                  –— Œ! y ­wrq   )Ú	get_fieldr  )rQ   rÛ   r/   s     €r!   rT   z*SQLDiff.expand_together.<locals>.<genexpr>–  s    øè ø€ ÒH¸�d—n‘n UÓ+×3Õ3ÑHùs   ƒ%()r   r.   rû   )r^   Útogetherr/   Únew_togetherr%  s     `  r!   r&  zSQLDiff.expand_together’  s@   ø€ ØˆÜ(¨Ó2ò 	ˆFØ×ÑÜÓHÀÔHÓHõð	ð Ðr#   c                 óÀ  ‡— t        j                  t         «      }t        |«      D �]-  }|r|j                  |v rŒ|j                  sŒ"|j
                  sŒ/|j                  xs |j                  Š|j                  ‰i «      j                  d«      }|s$|r"t        ˆfd„|j                  «       D «       «      }‰|v r|rŒ—|j                  |‰g«      }	| j                  d|‰g|	dz   «       |j                  t         ¬«      }
|
j                  d«      r| j                  d|‰g|	dz   d	«       |
j                  d
«      s�Œ| j                  d|‰g|	dz   d«       �Œ0 | j                  |«      }t        |j!                  «       D �cg c]  }|d   sŒ	|d   rŒ|d   ‘Œ c}«      }|D ]7  }||v rŒ|r||v rŒ|j                  ||«      }	| j                  d|||	dz   «       Œ9 y c c}w )NÚuniquec              3   óB   •K  — | ]  \  }}‰g|d    k(  sŒ|d   –— Œ y­w©Úcolumnsr6  Nrr   ©rQ   Úcontraint_namer.  r  s      €r!   rT   z4SQLDiff.find_unique_missing_in_db.<locals>.<genexpr>£  óL   øè ø€ ò  *bÑC]À>ÐS]ð  @Gð  Hð  LVð  W`ñ  Laó  a¨*°XÕ*>ñ  *bùó   ƒ•
rA   Ú_uniqr&   Úvarcharr?   Ú_likeú varchar_pattern_opsÚtextú text_pattern_opsÚindexr9  ©r   ÚSchemaEditorClassr*   r  r6  Úmanagedr  r  ÚanyÚitemsÚ_create_index_namerÈ   r-   Ú
startswithr/  r   Úvalues©r^   r/   Útable_indexesÚtable_constraintsrá   Ú	skip_listÚschema_editorrÛ   Údb_field_uniqueÚ
index_namer-   r+  ÚvÚdb_unique_columnsÚunique_columnsr  s                  @r!   Úfind_unique_missing_in_dbz!SQLDiff.find_unique_missing_in_dbš  s  ø€ Ü"×4Ñ4´ZÓ@ˆÜ% dÓ+ó 	AˆEÙ˜UŸ]™]¨iÑ7ØØ�|‹| §£ØŸ/™/Ò:¨U¯]©]�Ø"/×"3Ñ"3°G¸RÓ"@×"DÑ"DÀXÓ"N�Ù&Ñ+<Ü&)ó  *bÐar×axÑaxÓazô  *bó  'b�OØ˜mÑ+±Øà*×=Ñ=¸jÈ7È)ÓT�
à×#Ñ#Ð$:¸JÈÈ	ÐS]Ð`gÑSgÔhØŸ-™-´:˜-Ó>�Ø×%Ñ% iÔ0Ø×'Ñ'Ð(=¸zÈGÈ9ÐV`ÐcjÑVjð  mCô  DØ×%Ñ% fÖ-Ø×'Ñ'Ð(=¸zÈGÈ9ÐV`ÐcjÑVjÐlö  Að%	Að( ×2Ñ2°4Ó8ˆÜ.ÐFW×F^ÑF^ÓF`ö  0DÀÐdeÐfnÓdoÐxyð  {Bó  yC°°)³ò  0Dó  EÐà-ò 		jˆNØÐ!2Ñ2Øá˜^¨yÑ8Øà&×9Ñ9¸*ÀnÓUˆJà×ÑÐ 6¸
ÀNÐT^ÐahÑThÕiñ		jùò 0Ds   Å?
GÆ
GÆGc                 ó„  — t        t        |«      D �cg c]  }|j                  |f‘Œ c}«      }| j                  |«      }|j	                  «       D ]i  \  }}	|	d   sŒ|	d   rŒ|	d   }
t        |
«      dk(  r$|j                  |
d   «      }|€n|j                  rŒIt        |
«      |v rŒW| j                  d||«       Œk y c c}w )Nr6  rD  r9  r   r   rB   )
rÔ   r*   r   r/  rI  r   r  r6  rû   rÈ   )r^   r/   rN  rO  rá   rÛ   r%  r+  Úconstraint_namer.  r9  s              r!   Úfind_unique_missing_in_modelz$SQLDiff.find_unique_missing_in_model¾  sÍ   € ÜÔ:JÈ4Ó:PÖQ°˜Ÿ™ eÒ,ÒQÓRˆØ×2Ñ2°4Ó8ˆà+<×+BÑ+BÓ+Dò 	XÑ'ˆO˜ZØ˜hÒ'ØØ˜'Ò"àà  Ñ+ˆGÜ�7‹|˜qÒ ØŸ
™
 7¨1¡:Ó.�Ø�=ØØ—\’\Øä˜“> _Ñ4Øà×ÑÐ 9¸:ÀÕWñ%	Xùò Rs   “B=c                 ól  — t        j                  t         «      }t        |«      D ]Â  }|j                  sŒ|j                  xs |j
                  }||vsŒ/|j                  ||g«      }| j                  d||g|d«       |j                  t         ¬«      }	|	j                  d«      r| j                  d||g|dz   d«       |	j                  d«      sŒª| j                  d||g|dz   d«       ŒÄ | j                  |«      }
t        |j                  «       D �cg c]  }|d	   sŒ	|d
   rŒ|d   ‘Œ c}«      }|
D ]1  }||v rŒ|j                  ||«      }| j                  d|||dz   d«       Œ3 |j                  D ]:  }|j                  |vsŒ| j                  d||j                  |j                  d«       Œ< y c c}w )Nr?   r  r&   r?  r@  rA  rB  rC  rD  r6  r9  Ú_idx)r   rF  r*   Údb_indexr  r  rJ  rÈ   r-   rK  r)  r   rL  r$  r³   r%  )r^   r/   rN  rO  rá   rQ  rÛ   r  rS  r-   r#  rT  Údb_index_togetherr9  rD  s                  r!   Úfind_index_missing_in_dbz SQLDiff.find_index_missing_in_dbÖ  sé  € Ü"×4Ñ4´ZÓ@ˆÜ% dÓ+ò 
	EˆEØ�~‹~ØŸ/™/Ò:¨U¯]©]�Ø -Ò/Ø!.×!AÑ!AÀ*ÈwÈiÓ!X�JØ×'Ñ'Ð(=¸zÈGÈ9ÐV`ÐbdÔeØ#Ÿm™m´z˜mÓB�GØ×)Ñ)¨)Ô4Ø×+Ñ+Ð,AÀ:ÐPWÈyÐZdÐgnÑZnð  qGô  HØ×)Ñ)¨&Õ1Ø×+Ñ+Ð,AÀ:ÐPWÈyÐZdÐgnÑZnð  qDõ  Eð
	Eð ×0Ñ0°Ó6ˆÜ.ÐFW×F^ÑF^ÓF`ö  0DÀÐdeÐfmÓdnÐwxð  zBó  xC°°)³ò  0Dó  EÐØ%ò 	eˆGØÐ+Ñ+ØØ&×9Ñ9¸*ÀgÓNˆJØ×ÑÐ 5°zÀ7ÈJÐY_ÑL_ÐacÕdð		eð —\‘\ò 	eˆEØ�z‰zÐ!2Ò2Ø×#Ñ#Ð$9¸:ÀuÇ|Á|ÐUZ×U_ÑU_ÐacÕdñ	eùò 0Ds   Ä
F1ÄF1Ä#F1c                 óV  — t        t        |«      D �cg c]  }|j                  |f‘Œ c}«      }|j                  D �cg c]  }|j                  ‘Œ }}| j                  |«      }	|j                  «       D �])  \  }
}|
|v rŒ|d   r|d   sŒ|d   }|j                  |d   «      }|d   r|d   s|€nÚt        |«      dk(  r¸|d   r|j                  rŒ]|d   r't        |t        j                  «      r|j                  rŒ‰|d   r|j                  rŒ›|d   r&|d   d	k(  r|j                  d
«      r|j                  rŒÆ|d   r|j                  rŒØ|d   r|j!                  t"        ¬«      rŒôt%        |dd«      r�Œ|d   rt'        |«      |	v r�Œ| j)                  d||
«       �Œ, y c c}w c c}w )Nr6  rD  r9  r   r   Úprimary_keyÚforeign_keyr   r(  ÚordersÚcheckr&   Úspatial_indexFr@   )rÔ   r*   r   r$  r³   r)  rI  r  r   ra  r   r   Ú
ForeignKeyÚdb_constraintr6  r]  Údb_checkr   rú   rû   rÈ   )r^   r/   rN  rO  rá   rÛ   r%  r(  Úmeta_index_namesr#  rY  r.  r9  s                r!   Úfind_index_missing_in_modelz#SQLDiff.find_index_missing_in_modelð  s­  € ÜÔ:JÈ4Ó:PÖQ°˜Ÿ™ eÒ,ÒQÓRˆØ04·±Ö=¨˜CŸH›HÐ=ÐÐ=Ø×0Ñ0°Ó6ˆà+<×+BÑ+BÓ+Dó !	WÑ'ˆO˜ZØÐ"2Ñ2ØØ˜(Ò#¨J°wÒ,?àà  Ñ+ˆGØ—J‘J˜w q™zÓ*ˆEØ˜8Ò$¨°GÒ)<ÀÀàÜ�W“ Ò"Ø˜mÒ,°×1BÒ1BØØ˜mÒ,´¸EÄ6×CTÑCTÔ1UÐZ_×ZmÒZmØØ˜hÒ'¨E¯LªLØØ˜gÒ&¨:°fÑ+=ÀÒ+FÈ:Ï>É>ÐZbÔKcÐhm×htÒhtð Ø˜gÒ&¨5¯>ª>ØØ˜gÒ&¨5¯>©>ÄZ¨>Ô+PØÜ˜5 /°5Ô9Ùà˜gÒ&¬5°«>¸^Ñ+KÙà×ÑÐ 8¸*ÀoÖVñC!	Wùò	 RùÚ=s
   “F!½F&c                 óN   — |D ]   }|d   |vsŒ| j                  d||d   «       Œ" y )Nr   r=   )rÈ   )r^   ÚfieldmapÚtable_descriptionrá   rÙ   s        r!   Úfind_field_missing_in_modelz#SQLDiff.find_field_missing_in_model  s6   € Ø$ò 	RˆCØ�1‰v˜XÒ%Ø×#Ñ#Ð$<¸jÈ#ÈaÉ&ÕQñ	Rr#   c                 ó*  — |D �cg c]  }|d   ‘Œ	 }}|j                  «       D �]h  \  }}||vsŒg }|j                  r‰|j                  |j                  j                  j                  j
                  |j                  j                  j                  j                  |j                  j                  «      j                  g«       d}	nd}	|j                  |j                  t        ¬«      «       | j                  d   rA|j                  «       r1|j                  d|j                  |j                  «       «      z  «       |j                   s|j                  d«        | j"                  |	||g|¢­Ž  | j$                  j'                  ||f«       �Œk y c c}w )Nr   r>   r<   r&   Úinclude_defaultsz
DEFAULT %sr‡   )rI  Úremote_fieldr)   Úmodelr+   Údb_tabler2  Ú
field_namer   r.   r-   r   r“   Úhas_defaultÚget_prep_valueÚget_defaultr   rÈ   r›   Úadd)
r^   rl  rm  rá   rÙ   Ú	db_fieldsrt  rÛ   Úfield_outputÚops
             r!   Úfind_field_missing_in_dbz SQLDiff.find_field_missing_in_db  s|  € Ø'8Ö9 �S˜“VÐ9ˆ	Ð9Ø!)§¡Ó!1ó 	AÑˆJ˜Ø Ò*Ø!�à×%Ò%Ø ×'Ñ'¨×);Ñ);×)AÑ)A×)GÑ)G×)PÑ)PÐRW×RdÑRd×RjÑRj×RpÑRp×RzÑRzð  |A÷  |Nñ  |N÷  |Yñ  |Yó  SZ÷  Sañ  Sað  )bô  cØ-‘Bà.�BØ×#Ñ# E§M¡M¼Z MÓ$HÔIØ—<‘<Ð 2Ò3¸×8IÑ8IÔ8KØ ×'Ñ'¨°u×7KÑ7KÈE×L]ÑL]ÓL_Ó7`Ñ(`ÔaØ—z’zØ ×'Ñ'¨
Ô3Ø#�×#Ñ# B¨
°JÐNÀÓNØ×"Ñ"×&Ñ&¨
°JÐ'?Ö@ñ	Aùò :s   …Fc                 ó”  — t        |D �cg c]	  }|d   |f‘Œ c}«      }t        |«      D ]—  }|j                  |vrŒ||j                     }| j                  |«      }	| j	                  |||«      }
|r ||||	|
«      \  }	}
| j                  |
«      | j                  |	«      k(  rŒy| j                  d||j                  |	|
«       Œ™ y c c}w )Nr   rC   )rÔ   r*   r³   rÞ   r
  r!  rÈ   )r^   r/   rm  rá   ÚfuncrÙ   ry  rÛ   rÑ   Ú
model_typer-   s              r!   Úfind_field_type_differzSQLDiff.find_field_type_differ0  sÒ   € ÜÐ3DÖE¨C˜3˜q™6 3š-ÒEÓFˆ	Ü% dÓ+ò 	fˆEØ�z‰z Ñ*ØØ# E§J¡JÑ/ˆKà×2Ñ2°5Ó9ˆJØ×,Ñ,¨[¸%ÀÓLˆGñ Ù&*¨5°+¸zÈ7Ó&SÑ#�
˜Gà×(Ñ(¨Ó1°T×5JÑ5JÈ:Ó5VÓVØ×#Ñ#Ð$7¸ÀUÇZÁZÐQ[Ð]dÕeñ	fùò Fs   ŠCc                 ót  — t        |D �cg c]	  }|d   |f‘Œ c}«      }t        |«      D �]  }|j                  |vrŒ||j                     }| j                  |«      }	| j	                  |||«      }
| j                  |	«      | j                  |
«      k(  sŒj|r ||||	|
«      \  }	}
|j                  t        ¬«      d   }d|
v rD|
j                  dd«      \  }
}|j                  «       j                  d«      j                  d«      }nd }|	|
k(  r||k(  rŒè| j                  d||j                  |	|
«       �Œ	 y c c}w )	Nr   r&   rd  z CHECKr   r  rj   rD   )rÔ   r*   r³   rÞ   r
  r!  Údb_parametersr   r  ÚstripÚlstripÚrstriprÈ   )r^   r/   rm  rá   r~  rÙ   ry  rÛ   rÑ   r  r-   Úmodel_checkrh  s                r!   Úfind_field_parameter_differz#SQLDiff.find_field_parameter_differA  s@  € ÜÐ3DÖE¨C˜3˜q™6 3š-ÒEÓFˆ	Ü% dÓ+ó 	kˆEØ�z‰z Ñ*ØØ# E§J¡JÑ/ˆKà×2Ñ2°5Ó9ˆJØ×,Ñ,¨[¸%ÀÓLˆGà×(Ñ(¨Ó4¸×8MÑ8MÈgÓ8VÒVØñ Ù&*¨5°+¸zÈ7Ó&SÑ#�
˜Gà×-Ñ-¼Ð-ÓDÀWÑMˆKØ˜7Ñ"Ø$+§M¡M°(¸AÓ$>Ñ!�˜Ø#Ÿ>™>Ó+×2Ñ2°3Ó7×>Ñ>¸sÓC‘à�à Ò(°¸xÓ0GØ×#Ñ#Ð$<¸jÈ%Ï*É*ÐV`ÐbiÖjñ/	kùò Fs   ŠD5c                 ó(  — | j                   sy t        |«      D ]w  }|j                  xs |j                  }||f| j                  v rŒ.| j                  ||«      }|j                  |k7  sŒP|j                  xr dxs d}| j                  d|||«       Œy y )Nr   ÚSETrE   )rµ   r*   r  r  r›   r  r   rÈ   )r^   r/   rm  rá   rÛ   r  r   Úactions           r!   Úfind_field_notnull_differz!SQLDiff.find_field_notnull_differ\  s’   € Ø×-Ò-Øä% dÓ+ò 	SˆEØ—o‘oÒ6¨¯©ˆGØ˜GÐ$¨×(:Ñ(:Ñ:ØØ×-Ñ-¨e°ZÓ@ˆDØ�z‰z˜TÓ!ØŸ™Ò.¨Ò7°%�Ø×#Ñ#Ð$4°jÀ'È6ÕRñ	Sr#   c                 ó   — i S rq   rr   )r^   r¯   rá   r—   s       r!   Úget_constraintszSQLDiff.get_constraintsi  rä   r#   c           
      óì  — | j                   d   rS| j                  d d «       | j                  D ]2  }|| j                  vsŒ|| j                  vsŒ!| j                  d|«       Œ4 d }| j                  D �]d  }|j                  }|j                  }|j                  }| j                   d   s|j                  rŒD||k7  r| j                  ||j                  «       || j                  vr| j                  d|«       Œ†t        | j                  d«      r'| j                  j                  | j                  |«      }n'| j                  | j                  || j                  «      }t!        t#        |«      D �cg c]"  }|j$                  xs |j'                  «       |f‘Œ$ c}«      }	|j(                  r	t*        |	d<   	 | j                  j-                  | j                  |«      }
i }|j9                  «       D ];  \  }}|d	   }t;        |«      d
k(  sŒ|d   |d   |j=                  d«      |dœ||d   <   Œ= | j?                  ||||«       | jA                  ||||«       | jC                  |	|
|«       | jE                  |	|
|«       | jG                  ||||«       | jI                  ||||«       | jK                  ||
|«       | jM                  ||
|«       | jO                  ||
|«       �Œg tQ        | jR                  D ���cg c]  \  }}}t;        |«      ‘Œ c}}}«      | _*        y c c}w # t.        $ rK}| j                  ddt1        |«      j3                  «       z  «       t5        j6                  «        Y d }~�Œöd }~ww xY wc c}}}w )NÚall_applicationsr;   Úinclude_proxy_modelsr:   r�  r   r8   zunable to introspect table: %sr9  r   ra  r6  r   )ra  r6  r   r;  r   )+r“   rÃ   r´   r±   ÚIGNORE_MISSING_TABLESrÈ   r’   r+   rs  rÁ   r'   Ú__name__Úhasattrr—   r�  r¯   rÔ   r*   r  Úget_attnameÚorder_with_respect_toÚORDERING_FIELDÚget_table_descriptionÚ	ExceptionÚstrrƒ  r   ÚrollbackrI  r   r  rZ  rj  rn  r|  rW  r_  r€  r‡  r‹  Úmaxr˜   r‘   )r^   ÚtableÚcur_app_labelÚ	app_modelr/   rá   rÁ   rO  rÛ   rl  rm  rt   rN  r;  Údctr9  Ú
_app_labelÚ_model_nameÚdiffss                      r!   Úfind_differenceszSQLDiff.find_differencesl  sP  € Ø�<‰<Ð*Ò+Ø×%Ñ% d¨DÔ1ØŸ™ò I�Ø × 2Ñ 2Ò2°uÀD×D^ÑD^Ò7^Ø×'Ñ'Ð(@À%ÕHðIð ˆØŸ™ó F	PˆIØ—?‘?ˆDØŸ™ˆJØŸ™ˆIà—<‘<Ð 6Ò7¸D¿JºJØà 	Ò)à×)Ñ)¨)°Y×5GÑ5GÔHà §¡Ñ/à×#Ñ#Ð$9¸:ÔFØä�t×)Ñ)Ð+<Ô=Ø$(×$6Ñ$6×$FÑ$FÀtÇ{Á{ÐT^Ó$_Ñ!à$(×$8Ñ$8¸¿¹ÀjÐRV×RdÑRdÓ$eÐ!äÔZjÐkoÓZpÖqÐQV˜eŸo™oÒD°×1BÑ1BÓ1DÀeÒLÒqÓrˆHð ×)Ò)Ü%3�˜Ñ"ðØ$(×$6Ñ$6×$LÑ$LÈTÏ[É[ÐZdÓ$eÐ!ð ˆMØ'8×'>Ñ'>Ó'@ò 	Ñ#� à˜i™.�Ü�w“< 1Ó$à'*¨=Ñ'9Ø"% h¡-Ø #§¡¨£Ø*8ñ	1�M '¨!¡*Ò-ð		ð ×-Ñ-¨d°MÐCTÐV`Ôaà×,Ñ,¨T°=ÐBSÐU_Ô`à×,Ñ,¨XÐ7HÈ*ÔUð ×)Ñ)¨(Ð4EÀzÔRà×*Ñ*¨4°Ð@QÐS]Ô^à×)Ñ)¨$°Ð?PÐR\Ô]ð ×'Ñ'¨Ð.?ÀÔLà×,Ñ,¨TÐ3DÀjÔQà×*Ñ*¨4Ð1BÀJÖOðMF	PôN  #ÐUY×UeÑUe×#fÐ#fÑ3Q°:¸{ÈE¤C¨¥JÔ#fÓgˆÕùòc røô ò Ø×#Ñ# GÐ-MÔPSÐTUÓPV×P\ÑP\ÓP^Ñ-^Ô_Ü×$Ñ$Ô&ÝûðüôR $gs%   Å-'L
Æ1&LË.M/Ì	M,Ì!A M'Í'M,c                 óh   — | j                   d   r| j                  |«       y| j                  |«       y)z Print differences to stdout ÚsqlN)r“   Úprint_diff_sqlÚprint_diff_text)r^   rS   s     r!   Ú
print_diffzSQLDiff.print_diff½  s*   € à�<‰<˜ÒØ×Ñ Õ&à× Ñ  Õ'r#   c                 ó  ‡— | j                   sE| j                  j                  ‰j                  d«      «       | j                  j                  d«       | j                  sE| j                  j                  ‰j                  d«      «       | j                  j                  d«       d }| j
                  D �]Ö  \  }}}|sŒ| j                  sG|rE||k7  r@| j                  j                  ‰j                  d«      ›d‰j                  |«      ›�«       |}| j                  s@|r>| j                  j                  ‰j                  d«      ›d‰j                  |«      ›�«       |D �]'  }|\  }}| j                  |   t        ˆfd„t        |«      D «       «      z  }	dj                  ˆfd	„t        |	j                  d«      «      D «       «      }	| j                  s0| j                  j                  ‰j                  d
«      ›d|	›�«       Œ¤|rg| j                  j                  ‰j                  d«      ›d‰j                  |«      ›d‰j                  d«      ›d‰j                  |«      ›d|	›�	«       �Œ| j                  j                  |	«       �Œ* �ŒÙ y )NzE# Detecting notnull changes not implemented for this database backendr  zF# Detecting unsigned changes not implemented for this database backendz+ Application:rH   z|-+ Differences for model:c           	   3   óª   •K  — | ]J  \  }}t        |«      ‰j                  t        |t        t        f«      rd j                  |«      n|«      f–— ŒL y­w)ro   N)r™  rY   r   r   rû   r[   ©rQ   r    rt   rS   s      €r!   rT   z*SQLDiff.print_diff_text.<locals>.<genexpr>Ø  sH   øè ø€ ò 9á˜˜1ô ˜“V˜UŸ_™_¼ZÈÌDÔRWÈ=Ô=Y¨T¯Y©Y°q¬\Ð_`ÓaÔbñ9ùs   ƒAAú'c              3   ób   •K  — | ]&  \  }}|d z  dk(  xr ‰j                  |«      xs |–— Œ( y­w)rW   r   N)rŠ   r«  s      €r!   rT   z*SQLDiff.print_diff_text.<locals>.<genexpr>Ü  s2   øè ø€ ÒjÁtÀqÈ!  A¡¨¡
Ò =¨u¯{©{¸1«~Ò BÀÓ BÑjùs   ƒ,/z|--+ÚAppÚModel)rµ   r•   Úwriter‰   r·   r˜   r”   rY   Ú
DIFF_TEXTSrÔ   r\   r[   r  )
r^   rS   r�  rÁ   rÂ   r¢  ÚdiffrÇ   Ú	diff_argsrB  s
    `        r!   r§  zSQLDiff.print_diff_textÄ  s,  ø€ Ø×-Ò-Ø�K‰K×Ñ˜eŸl™lÐ+rÓsÔtØ�K‰K×Ñ˜bÔ!à×.Ò.Ø�K‰K×Ñ˜eŸl™lÐ+sÓtÔuØ�K‰K×Ñ˜bÔ!àˆØ,0×,<Ñ,<ó 	0Ñ(ˆI�z 5ÙØØ—:’:¡)°ÀÒ0JØ—‘×!Ñ!¨U¯\©\Ð:JÕ-KÈUÏ_É_Ð]fÔMgÐ"hÔiØ )�Ø—:’:¡*Ø—‘×!Ñ!¨U¯\©\Ð:VÕ-WÐY^×YhÑYhÐisÔYtÐ"uÔvØó 0�Ø'+Ñ$�	˜9Ø—‘ yÑ1´Dó 9ä )¨)Ó 4ô9ó 5ñ �ð —x‘xÓjÌyÐY]×YcÑYcÐdgÓYhÓOiÔjÓj�Ø—z’zØ—K‘K×%Ñ%°·±¸fÕ1EÁtÐ&LÕMá ØŸ™×)Ñ)¸e¿l¹lÈ5Õ>QÐSX×SbÑSbÐclÕSmÐot×o{Ño{ð  }Dõ  pEð  GL÷  GVñ  GVð  Waõ  Gbñ  dhð  +iö  jàŸ™×)Ñ)¨$Ö/ò0ñ	0r#   c           	      ó*  — | j                   sE| j                  j                  |j                  d«      «       | j                  j                  d«       d }t        j
                  j                  }| j                  s8| j                  s+| j                  j                  |j                  d«      «       y y | j                  j                  |j                  d«      «       | j                  D ]ÿ  \  }}}|sŒ
| j                  sC||k7  r>| j                  j                  |j                  d|j                  |«      z  «      «       |}| j                  s>|r<| j                  j                  |j                  d|j                  |«      z  «      «       |D ]W  }|\  }}	 | j                  |   |||	«      }
| j                  r|
j                  dd«      }
| j                  j                  |
«       ŒY �Œ | j                  j                  |j                  d	«      «       y )
NzF-- Detecting notnull changes not implemented for this database backendr  z-- No differenceszBEGIN;z-- Application: %sz-- Model: %srI   rH   zCOMMIT;)rµ   r•   r°  r‰   r   rk   Ú
quote_namer‘   r”   rO   r˜   rY   r«   Úreplace)r^   rS   r�  r_   rÁ   rÂ   r¢  r²  rÇ   r³  rB  s              r!   r¦  zSQLDiff.print_diff_sqlå  s¬  € Ø×-Ò-Ø�K‰K×Ñ˜eŸl™lÐ+sÓtÔuØ�K‰K×Ñ˜bÔ!àˆÜ�^‰^×&Ñ&ˆØ×#Ò#Ø—:’:Ø—‘×!Ñ! %×"3Ñ"3Ð4GÓ"HÕIð ð �K‰K×Ñ˜e×/Ñ/°Ó9Ô:Ø04×0@Ñ0@ò ,Ñ,�	˜: uÙØØ—z’z m°yÒ&@Ø—K‘K×%Ñ% e§l¡lÐ3GÈ%Ï/É/ÐZcÓJdÑ3dÓ&eÔfØ$-�MØ—z’z¡jØ—K‘K×%Ñ% e§l¡l°>ÀEÇOÁOÐT^ÓD_Ñ3_Ó&`ÔaØ!ò ,�DØ+/Ñ(�I˜yØ3˜4Ÿ=™=¨Ñ3°E¸2¸yÓI�DØ—z’zØ#Ÿ|™|¨F°CÓ8˜Ø—K‘K×%Ñ% dÕ+ò,ð,ð �K‰K×Ñ˜e×/Ñ/°	Ó:Õ;r#   )NNN©NNrq   ):r’  Ú
__module__Ú__qualname__rÊ   r‘  rÆ   r±  r¡   r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r�   rž   rŸ   r    rµ   r·   r  r¬   rº   r¶   r¸   rÃ   rÈ   rË   rÎ   rÜ   rÞ   rã   r
  r÷   rþ   r  r!  r)  r/  r&  rW  rZ  r_  rj  rn  r|  r€  r‡  r‹  r�  r£  r   r¨  r§  r¦  rr   r#   r!   r5   r5   H   s�  „ Ø"$Ðð 	ðÐò€Jð$  Ø#ØBØ"CØWØ"ZØbØ!eØkØ"gØ mØ#iØXØ"^Ø[ñ€Jñ$Ðñ"Ðñ
ÐñÐñ"Ðñ Ðñ#ÐñÐñ"ÐñÐñ b€IÙi€KÙjÐÙ!wÐà %ÐØ!&ÐØ€Oò 
òD
!òIòMò=ò;ò0òòò(4óóHòTò+òIòò
>ò=òó"jòHXò0eò4&WòPRò
Aó&fó"kò6SòòOhñb  (›zó (ò0óB<r#   r5   c                   ó    — e Zd ZdZdZd„ Zd„ Zy)ÚGenericSQLDiffFc                  ó   — y rq   rr   r¾   s    r!   r¶   zGenericSQLDiff.load_null  ó   € Ør#   c                  ó   — y rq   rr   r¾   s    r!   r¸   zGenericSQLDiff.load_unsigned	  r½  r#   N)r’  r¸  r¹  rµ   r·   r¶   r¸   rr   r#   r!   r»  r»    s   „ Ø %ÐØ!&Ðòór#   r»  c                   ó\   ‡ — e Zd ZdZdZdZˆ fd„Zd„ Zd„ Zd„ Z	d„ Z
dˆ fd„	Zd	„ Zdd
„Zˆ xZS )Ú	MySQLDiffTÚUNSIGNEDc                 ó`   •— t         ‰| �  «        t        «       | _        | j	                  «        y rq   )Úsuperrº   rš   Úauto_incrementÚload_auto_increment©r^   Ú	__class__s    €r!   rº   zMySQLDiff.load  s"   ø€ Ü‰‰ŒÜ!›eˆÔØ× Ñ Õ"r#   c                 óH   — |D �cg c]  }|j                  «       ‘Œ c}S c c}w rq   )r  )r^   rÍ   r2   s      r!   rÎ   zMySQLDiff.format_field_names  s   € Ø#.Ö/˜a�—‘•	Ò/Ð/ùÒ/s   …c                 ó˜   — d}| j                   D ]9  }| j                  d|g«      }|D ]  }|||d   f}|d   dk(  | j                  |<   Œ! Œ; y )Nrô   z¸
                SELECT column_name, is_nullable
                FROM information_schema.columns
                WHERE table_schema = DATABASE()
                    AND table_name = %sÚcolumn_nameÚis_nullableÚYES©r´   rÜ   r   ©r^   r	  rá   rØ   r¹   r  s         r!   r¶   zMySQLDiff.load_null  ss   € Øˆ
ØŸ.™.ò 	DˆJØ×%Ñ%ð '+ð .8¨Ló	:ˆFð
 %ò D�
Ø! :¨z¸-Ñ/HÐI�Ø!+¨MÑ!:¸eÑ!C�—	‘	˜#’ñDñ	Dr#   c                 ó¤   — d}| j                   D ]?  }| j                  d|g«      }|D ]%  }|||d   f}| j                  j                  |«       Œ' ŒA y )Nrô   zá
                SELECT column_name
                FROM information_schema.columns
                WHERE table_schema = DATABASE()
                    AND table_name = %s
                    AND column_type LIKE '%%unsigned'rÊ  )r´   rÜ   rœ   rx  rÎ  s         r!   r¸   zMySQLDiff.load_unsigned&  sl   € Øˆ
ØŸ.™.ò 		'ˆJØ×%Ñ%ð '9ð
 <F¸,óHˆFð %ò '�
Ø! :¨z¸-Ñ/HÐI�Ø—‘×!Ñ! #Õ&ñ'ñ		'r#   c                 óž   — | j                   D ]>  }| j                  d|g«      }|D ]$  }||d   f}| j                  j                  |«       Œ& Œ@ y )NzÚ
                SELECT column_name
                FROM information_schema.columns
                WHERE table_schema = DATABASE()
                   AND table_name = %s
                   AND extra = 'auto_increment'rÊ  )r´   rÜ   rÄ  rx  )r^   rá   rØ   r¹   r  s        r!   rÅ  zMySQLDiff.load_auto_increment3  sg   € ØŸ.™.ò 		-ˆJØ×%Ñ%ð '3ð
 6@°LóBˆFð %ò -�
Ø! :¨mÑ#<Ð=�Ø×#Ñ#×'Ñ'¨Õ,ñ-ñ		-r#   c                 óD  •— t         ‰| �  |||«      }|sy |rˆ| j                  |«      }| j                  |«      dk(  r%| j                  |«      dk(  r|j	                  d«      }| j                  |«      dk(  r|dk(  rd}||j
                  f| j                  v r	d|vr|dz  }|S )NÚcharr?  ÚvarÚboolÚintegerÚAUTO_INCREMENTz AUTO_INCREMENT)rÃ  r
  rÞ   r!  r„  r   rÄ  ©r^   rÑ   rÛ   rá   r-   r   rÇ  s         €r!   r
  zMySQLDiff.get_field_db_typeB  s¸   ø€ Ü‘'Ñ+¨K¸À
ÓKˆÙØÙà×2Ñ2°5Ó9ˆJð ×$Ñ$ ZÓ0°FÒ:¸t×?TÑ?TÐU\Ó?]ÐajÒ?jØ!Ÿ.™.¨Ó/�ð ×$Ñ$ ZÓ0°FÒ:Ø˜iÒ'Ø$�Gà˜EŸL™LÐ)¨T×-@Ñ-@Ñ@ÐEUÐ]dÑEdØÐ,Ñ,�Øˆr#   c                 ó¼  — t        t        |«      D �cg c]  }|j                  |f‘Œ c}«      }|j                  D �cg c]  }|j                  ‘Œ }}| j                  |«      }	| j                  |«      }
|j                  «       D �]K  \  }}||v rŒ|d   r|d   sŒ|d   }|j                  |d   «      }t        |«      dk(  rÎ|s| j                  d||«       ŒT|d   r|j                  rŒf|d   r't        |t        j                  «      r|j                  rŒ’|d   r|j                   rŒ¤|d   r&|d	   d
k(  r|j                  d«      r|j                   rŒÏ|d   r|j"                  rŒá|d   r|j%                  t&        ¬«      rŒýt)        |dd«      r/�Œ|d   rt+        |«      |	v r�Œ |d   r|d   rt+        |«      |
v r�Œ9| j                  d||«       �ŒN y c c}w c c}w )Nr6  rD  r9  r   r   r@   ra  rb  r   r(  rc  rd  r&   re  F)rÔ   r*   r   r$  r³   r)  r/  rI  r  r   rÈ   ra  r   r   rf  rg  r6  r]  rh  r   rú   rû   )r^   r/   rN  rO  rá   rÛ   r%  r(  ri  r#  r+  rY  r.  r9  s                 r!   rj  z%MySQLDiff.find_index_missing_in_modelX  sà  € ÜÔ:JÈ4Ó:PÖQ°˜Ÿ™ eÒ,ÒQÓRˆØ04·±Ö=¨˜CŸH›HÐ=ÐÐ=Ø×0Ñ0°Ó6ˆØ×2Ñ2°4Ó8ˆà+<×+BÑ+BÓ+Dó &	WÑ'ˆO˜ZØÐ"2Ñ2ØØ˜(Ò#¨J°wÒ,?àà  Ñ+ˆGØ—J‘J˜w q™zÓ*ˆEô �7‹|˜qÒ Ùà×'Ñ'Ð(@À*ÈoÔ^ØØ˜mÒ,°×1BÒ1BØØ˜mÒ,´¸EÄ6×CTÑCTÔ1UÐZ_×ZmÒZmØØ˜hÒ'¨E¯LªLØØ˜gÒ&¨:°fÑ+=ÀÒ+FÈ:Ï>É>ÐZbÔKcÐhm×htÒhtð Ø˜gÒ&¨5¯>ª>ØØ˜gÒ&¨5¯>©>ÄZ¨>Ô+PØÜ˜5 /°5Ô9Ùà˜gÒ&¬5°«>¸^Ñ+KÙØ˜gÒ&¨:°hÒ+?ÄEÈ'ÃNÐVeÑDeÙà×ÑÐ 8¸*ÀoÖVñM&	Wùò RùÚ=s
   “G½Gc                 ó´  ‡— t        j                  t         «      }t        |«      D �]-  }|r|j                  |v rŒ|j                  sŒ"|j
                  sŒ/|j                  xs |j                  Š|j                  ‰i «      j                  d«      }|s$|r"t        ˆfd„|j                  «       D «       «      }‰|v r|rŒ—|j                  |‰g«      }	| j                  d|‰g|	dz   «       |j                  t         ¬«      }
|
j                  d«      r| j                  d|‰g|	dz   d	«       |
j                  d
«      s�Œ| j                  d|‰g|	dz   d«       �Œ0 | j                  |«      }t        |j!                  «       D �cg c]  }|d   sŒ	|d   ‘Œ c}«      }|D ]7  }||v rŒ|r||v rŒ|j                  ||«      }	| j                  d|||	dz   «       Œ9 y c c}w )Nr6  c              3   óB   •K  — | ]  \  }}‰g|d    k(  sŒ|d   –— Œ y­wr8  rr   r:  s      €r!   rT   z6MySQLDiff.find_unique_missing_in_db.<locals>.<genexpr>�  r<  r=  rA   r>  r&   r?  r?   r@  rA  rB  rC  r9  rE  rM  s                  @r!   rW  z#MySQLDiff.find_unique_missing_in_db†  sõ  ø€ ä"×4Ñ4´ZÓ@ˆÜ% dÓ+ó 	AˆEÙ˜UŸ]™]¨iÑ7ØØ�|‹| §£ØŸ/™/Ò:¨U¯]©]�Ø"/×"3Ñ"3°G¸RÓ"@×"DÑ"DÀXÓ"N�Ù&Ñ+<Ü&)ó  *bÐar×axÑaxÓazô  *bó  'b�OØ˜mÑ+±Øà*×=Ñ=¸jÈ7È)ÓT�
à×#Ñ#Ð$:¸JÈÈ	ÐS]Ð`gÑSgÔhØŸ-™-´:˜-Ó>�Ø×%Ñ% iÔ0Ø×'Ñ'Ð(=¸zÈGÈ9ÐV`ÐcjÑVjð  mCô  DØ×%Ñ% fÖ-Ø×'Ñ'Ð(=¸zÈGÈ9ÐV`ÐcjÑVjÐlö  Að%	Að( ×2Ñ2°4Ó8ˆô /ÐFW×F^ÑF^ÓF`Ö/pÀÐdeÐfnÓdo°°)³Ò/pÓqÐà-ò 	jˆNØÐ!2Ñ2Øá˜^¨yÑ8Øà&×9Ñ9¸*ÀnÓUˆJØ×ÑÐ 6¸
ÀNÐT^ÐahÑThÕiñ	jùò 0qs   Å?
GÆ
Gr·  rq   )r’  r¸  r¹  rµ   r·   r  rº   rÎ   r¶   r¸   rÅ  r
  rj  rW  Ú__classcell__©rÇ  s   @r!   rÀ  rÀ    s@   ø„ Ø $ÐØ!%ÐØ €Oô#ò
0ò
Dò'ò
-õò,,W÷\$jr#   rÀ  c                   óL   ‡ — e Zd ZdZdZd„ Zd„ Zd	ˆ fd„	Zd„ Zd„ Z	d
ˆ fd„	Z
ˆ xZS )ÚSqliteSQLDiffTFc                 ó”   — | j                   D ]9  }d}| j                  d|z  g «      D ]  }|||d   f}|d    | j                  |<   Œ Œ; y )Nrô   zPRAGMA table_info('%s');r³   ÚnotnullrÍ  )r^   rá   r	  r¹   r  s        r!   r¶   zSqliteSQLDiff.load_null±  se   € ØŸ.™.ò 	;ˆJà!ˆJð #×.Ñ.Ð/IÈJÑ/VÐXZÓ[ò ;�
Ø! :¨z¸&Ñ/AÐB�Ø%/°	Ñ%:Ð!:�—	‘	˜#’ñ;ñ	;r#   c                  ó   — y rq   rr   r¾   s    r!   r¸   zSqliteSQLDiff.load_unsigned»  r½  r#   c                 ó  •— |€g }t        |«      D �cg c])  }|j                  sŒ|j                  xs |j                  ‘Œ+ }}|j	                  «       D ]<  }|d   }	t        |	«      dk(  sŒ|	d   }
|
|v sŒ!|d   s|d   sŒ,|j                  |
«       Œ> | j                  |«      }t        |j	                  «       D �cg c]  }|d   sŒ	|d   ‘Œ c}«      }|D ]  }||v sŒ|j                  |«       Œ t        ‰| �)  |||||¬«       y c c}w c c}w )Nr9  r   r   r6  ra  )rP  )r*   r6  r  r  rL  r   r.   r/  r   rÃ  rW  )r^   r/   rN  rO  rá   rP  rÛ   rV  r.  r9  r   r+  rT  rU  rÇ  s                 €r!   rW  z'SqliteSQLDiff.find_unique_missing_in_dbÁ  s*  ø€ ØÐØˆIäHXÐY]ÓH^Öo¸uÐbg×bnÓbn˜%Ÿ/™/Ò:¨U¯]©]Ñ:ÐoˆÐoà+×2Ñ2Ó4ò 	-ˆJØ  Ñ+ˆGÜ�7‹|˜qÓ Ø  ™�Ø˜^Ò+°¸HÒ1EÈÐTaÓIbØ×$Ñ$ VÕ,ð	-ð ×2Ñ2°4Ó8ˆÜ.ÐFW×F^ÑF^ÓF`Ö/pÀÐdeÐfnÓdo°°)³Ò/pÓqÐà-ò 	1ˆNØÐ!2Ò2Ø× Ñ  Õ0ð	1ô 	‰Ñ)¨$°Ð?PÐR\ÐhqÐ)Õrùò! pùò 0qs   “D¥DÂ:
D
ÃD
c                  ó   — y rq   rr   ©r^   r/   rN  rO  rá   s        r!   r_  z&SqliteSQLDiff.find_index_missing_in_dbÙ  r½  r#   c                  ó   — y rq   rr   rä  s        r!   rj  z)SqliteSQLDiff.find_index_missing_in_modelÜ  r½  r#   c                 óÈ   •— t         ‰| �  |||«      }|sy |rJ| j                  |«      }| j                  |«      dk(  r%| j                  |«      dk(  r|j	                  d«      }|S )NrÒ  r?  rÓ  )rÃ  r
  rÞ   r!  r„  r×  s         €r!   r
  zSqliteSQLDiff.get_field_db_typeß  si   ø€ Ü‘'Ñ+¨K¸À
ÓKˆÙØÙØ×2Ñ2°5Ó9ˆJà×$Ñ$ ZÓ0°FÒ:¸t×?TÑ?TÐU\Ó?]ÐajÒ?jØ!Ÿ.™.¨Ó/�Øˆr#   rq   r·  )r’  r¸  r¹  rµ   r·   r¶   r¸   rW  r_  rj  r
  rÛ  rÜ  s   @r!   rÞ  rÞ  ­  s3   ø„ Ø $ÐØ!&Ðò;òõsò0ò÷	ñ 	r#   rÞ  c                   ó€   ‡ — e Zd ZdZdZdddœZdZdZd„ Zd„ Z	d	„ Z
ˆ fd
„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdˆ fd„	Zd„ Zˆ xZS )ÚPostgresqlSQLDiffTz*django.contrib.postgres.fields.HStoreFieldú(django.contrib.postgres.fields.JSONField)ÚhstoreÚjsonbaÚ  
        SELECT nspname, relname, conname, attname, pg_get_constraintdef(pg_constraint.oid)
        FROM pg_constraint
        INNER JOIN pg_attribute ON pg_constraint.conrelid = pg_attribute.attrelid AND pg_attribute.attnum = any(pg_constraint.conkey)
        INNER JOIN pg_class ON conrelid=pg_class.oid
        INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace
        ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END,contype,nspname,relname,conname;
    zÔ
        SELECT nspname, relname, attname, attnotnull
        FROM pg_attribute
        INNER JOIN pg_class ON attrelid=pg_class.oid
        INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace;
    c                 ó  — |j                  d«      ›d|j                   ||d   «      «      ›d|j                  d«      ›d|j                   ||d   «      «      ›d|j                  d«      ›d|j                  |d   «      ›d	�S ©
NrG   rH   r   rI   ÚALTERr   ÚTYPErW   rX   r„   r]   s       r!   ra   zPostgresqlSQLDiff.<lambda>  s
  € ÐUZ×UfÑUfÐgtÕUuÐw|÷  xGñ  xGñ  HJð  KOð  PQñ  KRó  HSõ  xTð  V[÷  Vgñ  Vgð  hoõ  Vpð  rw÷  rAñ  rAñ  BDð  EIð  JKñ  ELó  BMõ  rNð  PU÷  Pañ  Pað  bhõ  Pið  kp÷  k|ñ  k|ð  }Að  BCñ  }Dõ  kEð  ;F€ r#   c                 ó  — |j                  d«      ›d|j                   ||d   «      «      ›d|j                  d«      ›d|j                   ||d   «      «      ›d|j                  d«      ›d|j                  |d   «      ›d	�S rí  r„   r]   s       r!   ra   zPostgresqlSQLDiff.<lambda>  s  € ÐZ_×ZkÑZkÐlyÕZzð  }B÷  }Lñ  }Lñ  MOð  PTð  UVñ  PWó  MXõ  }Yð  [`÷  [lñ  [lð  mtõ  [uð  w|÷  wFñ  wFñ  GIð  JNð  OPñ  JQó  GRõ  wSð  UZ÷  Ufñ  Ufð  gmõ  Unð  pu÷  pAñ  pAð  BFð  GHñ  BIõ  pJð  @K€ r#   c                 ó  — |j                  d«      ›d|j                   ||d   «      «      ›d|j                  d«      ›d|j                   ||d   «      «      ›d|j                  |d   «      ›d|j                  d«      ›d	�S )
NrG   rH   r   rI   zALTER COLUMNr   rW   r‡   rX   rc   r]   s       r!   ra   zPostgresqlSQLDiff.<lambda>  s
  € ÐRW×RcÑRcÐdqÕRrÐty÷  uDñ  uDñ  EGð  HLð  MNñ  HOó  EPõ  uQð  SX÷  Sdñ  Sdð  esõ  Stð  v{÷  vEñ  vEñ  FHð  IMð  NOñ  IPó  FQõ  vRð  TY÷  Teñ  Teð  fjð  klñ  fmõ  Tnð  pu÷  pAñ  pAð  BLõ  pMð  8N€ r#   c                 óP   •— t         ‰| �  «        i | _        | j                  «        y rq   )rÃ  rº   Úcheck_constraintsÚload_constraintsrÆ  s    €r!   rº   zPostgresqlSQLDiff.load	  s    ø€ Ü‰‰ŒØ!#ˆÔØ×ÑÕr#   c                 óˆ   — | j                  | j                  g «      D ]#  }|d   |d   |d   f}|d    | j                  |<   Œ% y )NÚnspnameÚrelnamer  Ú
attnotnull)rÜ   ÚSQL_LOAD_NULLr   ©r^   rŸ  r  s      r!   r¶   zPostgresqlSQLDiff.load_null  sQ   € Ø×#Ñ# D×$6Ñ$6¸Ó;ò 	3ˆCØ�y‘> 3 y¡>°3°y±>ÐBˆCØ!$ \Ñ!2Ð2ˆD�I‰I�cŠNñ	3r#   c                  ó   — y rq   rr   r¾   s    r!   r¸   zPostgresqlSQLDiff.load_unsigned  s   € ð 	r#   c                 ó�   — | j                  | j                  g «      D ]'  }|d   |d   |d   f}d|d   v sŒ|| j                  |<   Œ) y )Nrö  r÷  r  ÚCHECKÚpg_get_constraintdef)rÜ   ÚSQL_LOAD_CONSTRAINTSró  rú  s      r!   rô  z"PostgresqlSQLDiff.load_constraints  sZ   € Ø×#Ñ# D×$=Ñ$=¸rÓBò 	2ˆCØ�y‘> 3 y¡>°3°y±>ÐBˆCØ˜#Ð4Ñ5Ò5Ø.1�×&Ñ& sÒ+ñ	2r#   c                 ó8   — dd | j                  |«      «       idœS )Nz)django.contrib.postgres.fields.ArrayFieldÚ
base_field)r³   ræ   )rþ   )r^   r  s     r!   Úget_data_type_arrayfieldz*PostgresqlSQLDiff.get_data_type_arrayfield  s*   € à?àÐ>˜d×2Ñ2°:Ó>Ó@ðñ
ð 	
r#   c                 óà   ‡ — i dd“dˆ fd„“dˆ fd„“dˆ fd„“d	ˆ fd
„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd„“dˆ fd „“d!ˆ fd"„“ˆ fd#„d$d%d&œ¥S )'Ni  ré   iè  c                  ó(   •— ‰ j                  d¬«      S )NÚBooleanField©r  ©r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>)  ó   ø€ ˜$×7Ñ7À>Ð7ÓR€ r#   ié  c                  ó(   •— ‰ j                  d¬«      S )NÚBinaryFieldr  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>*  s   ø€ ˜$×7Ñ7À=Ð7ÓQ€ r#   iê  c                  ó(   •— ‰ j                  d¬«      S ©Nré   r  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>+  ó   ø€ ˜$×7Ñ7À;Ð7ÓO€ r#   ií  c                  ó(   •— ‰ j                  d¬«      S ©Nr   r  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>,  r  r#   iî  c                  ó(   •— ‰ j                  d¬«      S r  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>-  r  r#   iï  c                  ó(   •— ‰ j                  d¬«      S r  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>.  r  r#   iñ  c                  ó(   •— ‰ j                  d¬«      S r  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>/  r  r#   iö  c                  ó(   •— ‰ j                  d¬«      S r  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>0  r  r#   i÷  c                  ó(   •— ‰ j                  d¬«      S r  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>1  r  r#   iø  c                  ó(   •— ‰ j                  d¬«      S )NÚBigIntegerFieldr  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>2  s   ø€ ˜$×7Ñ7ÐCTÐ7ÓU€ r#   iù  c                  ó(   •— ‰ j                  d¬«      S ©NÚ
FloatFieldr  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>3  ó   ø€ ˜$×7Ñ7À<Ð7ÓP€ r#   iý  c                  ó(   •— ‰ j                  d¬«      S r  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>4  r  r#   iþ  c                  ó(   •— ‰ j                  d¬«      S r  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>5  r  r#   i[  c                  ó(   •— ‰ j                  d¬«      S ©NÚDateTimeFieldr  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>6  ó   ø€ ˜$×7Ñ7À?Ð7ÓS€ r#   i¡  c                  ó(   •— ‰ j                  d¬«      S r  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>7  r   r#   iÏ  c                  ó(   •— ‰ j                  d¬«      S )Nrë   r  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>8  r  r#   c                  ó(   •— ‰ j                  d¬«      S )NÚDurationFieldr  r  r¾   s   €r!   ra   zCPostgresqlSQLDiff.get_data_types_reverse_override.<locals>.<lambda>:  r   r#   z0django.contrib.postgres.search.SearchVectorFieldré  )i¢  i  iÚ  rr   r¾   s   `r!   rË   z1PostgresqlSQLDiff.get_data_types_reverse_override&  sö   ø€ ð
Ø�+ð
àÓRð
ð ÓQð
ð ÓOð	
ð
 ÓRð
ð ÓRð
ð ÓRð
ð ÓOð
ð ÓOð
ð ÓOð
ð ÓUð
ð ÓPð
ð ÓPð
ð ÓPð
ð ÓSð
ð  ÓSð!
ð" ÓRð#
ó& TàDØ<ò-
ð 	
r#   c           
      óŒ  — i }|j                  dd|g«       |j                  «       D ]€  \  }}}}||vr^g |j                  «       dk(  |j                  «       dv |j                  «       dk(  rt        |d   j	                  dd«      «      nd	d
d
dœ||<   ||   d   j                  |«       Œ‚ |j                  dd|g«       |j                  «       D ],  \  }}||vrg d
d
d	dd
dœ||<   ||   d   j                  |«       Œ. |j                  d|g«       |j                  «       D ]!  \  }	}
}}|	|vsŒt        |
«      ||d	d
ddœ||	<   Œ# |S )zm
        Find constraints for table

        Backport of django's introspection.get_constraints(...)
        a�  
            SELECT
                kc.constraint_name,
                kc.column_name,
                c.constraint_type,
                array(SELECT table_name::text || '.' || column_name::text FROM information_schema.constraint_column_usage WHERE constraint_name = kc.constraint_name)
            FROM information_schema.key_column_usage AS kc
            JOIN information_schema.table_constraints AS c ON
                kc.table_schema = c.table_schema AND
                kc.table_name = c.table_name AND
                kc.constraint_name = c.constraint_name
            WHERE
                kc.table_schema = %s AND
                kc.table_name = %s
        rô   úprimary key)r&  r6  zforeign keyr   r  r   NF)r9  ra  r6  rb  rd  rD  r9  aê  
            SELECT kc.constraint_name, kc.column_name
            FROM information_schema.constraint_column_usage AS kc
            JOIN information_schema.table_constraints AS c ON
                kc.table_schema = c.table_schema AND
                kc.table_name = c.table_name AND
                kc.constraint_name = c.constraint_name
            WHERE
                c.constraint_type = 'CHECK' AND
                kc.table_schema = %s AND
                kc.table_name = %s
        Ta  
            SELECT
                c2.relname,
                ARRAY(
                    SELECT (SELECT attname FROM pg_catalog.pg_attribute WHERE attnum = i AND attrelid = c.oid)
                    FROM unnest(idx.indkey) i
                ),
                idx.indisunique,
                idx.indisprimary
            FROM pg_catalog.pg_class c, pg_catalog.pg_class c2,
                pg_catalog.pg_index idx
            WHERE c.oid = idx.indrelid
                AND idx.indexrelid = c2.oid
                AND c.relname = %s
        )rÐ   rÒ   r  rû   r  r.   r   )r^   r¯   rá   r—   r,  r.  r   ÚkindÚ	used_colsrD  r9  r6  Úprimarys                r!   r�  z!PostgresqlSQLDiff.get_constraints@  s¬  € ð ˆð 	�‰ð ð ˜
Ð#ô	%ð 4:·?±?Ó3Dò 	>Ñ/ˆJ˜  ià Ñ,à!Ø#'§:¡:£<°=Ñ#@Ø"Ÿj™j›lÐ.GÐGØHLÏ
É
ËÐXeÒHe¤5¨°1©×);Ñ);¸CÀÓ)CÔ#DÐkoØ"Ø"ñ+�˜JÑ'ð ˜
Ñ# IÑ.×5Ñ5°fÕ=ð	>ð 	�‰ð ð ˜
Ð#ô	%ð #)§/¡/Ó"3ò 	>ÑˆJ˜à Ñ,à!Ø#(Ø#Ø#'Ø!Ø"ñ+�˜JÑ'ð ˜
Ñ# IÑ.×5Ñ5°fÕ=ð	>ð 	�‰ð ð ˆ\ô	ð 06¯©Ó/@ò 		Ñ+ˆE�7˜F GØ˜KÒ'ä# G›}Ø#*Ø$Ø#'Ø"Ø!ñ&�˜EÒ"ð		ð Ðr#   c                 ó>  •— t         ‰
| �  |||«      }|sy |�r|j                  d«      rY|j                  xs |j                  }| j                  d||f«      d   d   }|j                  d«      r|j                  dd«      }|S |j                  rt        |t        «      r|dk(  rd}n|d	k(  rd
}|rè|j                  }|dk(  rd}|j                  xs |j                  }| j                  j                  |||fi «      j                  dd «      }|rŠ|j                  dd«      }|j                  dd«      }dj                  |j                  d«      D �	cg c]4  }	d|	v xr( dj                  d„ |	j                  dd«      D «       «      xs |	‘Œ6 c}	«      }|d|z   z  }|S c c}	w )Nz[]a`  SELECT attname, format_type(atttypid, atttypmod) AS type
                        FROM   pg_attribute
                        WHERE  attrelid = %s::regclass
                        AND    attname = %s
                        AND    attnum > 0
                        AND    NOT attisdropped
                        ORDER  BY attnum;
                    r   r   zcharacter varyingr?  rÕ  ÚserialÚbigintÚ	bigserialr  rô   rþ  z((r  z))rj   z("z" c              3   ó>   K  — | ]  }|j                  d «      –— Œ y­w)ú"N)rƒ  )rQ   Úps     r!   rT   z6PostgresqlSQLDiff.get_field_db_type.<locals>.<genexpr>Þ  s   è ø€ ÒHoÐZ[ÈÏÉÐQTÏÑHoùs   ‚rH   r   )rÃ  r
  Úendswithr  r  rÜ   rK  r¶  ra  r   r   rÿ   ró  r  r[   r  )r^   rÑ   rÛ   rá   r-   r  Úintrospect_db_typer	  Úcheck_constraintrt   rÇ  s             €r!   r
  z#PostgresqlSQLDiff.get_field_db_type³  sì  ø€ Ü‘'Ñ+¨K¸À
ÓKˆÙØÚØ×Ñ Ô%ð  Ÿ/™/Ò:¨U¯]©]�Ø%)×%5Ñ%5ðð   Ð)ó
&ð ñ
&ð ñ
&Ð"ð &×0Ñ0Ð1DÔEØ);×)CÑ)CÐDWÐYbÓ)cÐ&à)Ð)à× Ò ¤Z°´yÔ%AØ˜iÒ'Ø&‘GØ Ò(Ø)�GÙØ"×0Ñ0�
Ø Ò#Ø!)�JØŸ/™/Ò:¨U¯]©]�Ø#'×#9Ñ#9×#=Ñ#=¸zÈ:ÐW^Ð>_ÐacÓ#d×#hÑ#hÐið  BFó  $GÐ Ù#Ø'7×'?Ñ'?ÀÀcÓ'JÐ$Ø'7×'?Ñ'?ÀÀcÓ'JÐ$Ø'+§y¡yð  O÷  Uñ  Uð  VYó  Zö  2[Ðyz°#¸°(Ò2o¸t¿y¹yÑHoÐ_`×_fÑ_fÐgjÐlmÓ_nÔHoÓ?oÒ2tÐstÑ2tò  2[ó  (\Ð$à˜sÐ%5Ñ5Ñ5�GØˆùò 2[s   Å9Fc                 ó´   — 	 | j                  d|g«      d   d   }| j                  j                  |j                  d«      «      S # t        t
        f$ r Y y w xY w)Nz-SELECT typname FROM pg_type WHERE typelem=%s;r   ÚtypnameÚ_)rÜ   ÚDATA_TYPES_REVERSE_NAMEr  rƒ  Ú
IndexErrorrö   )r^   r  r³   s      r!   r÷   z*PostgresqlSQLDiff.get_field_db_type_lookupã  s`   € ð	Ø×#Ñ#Ð$SÐV_ÐU`ÓaÐbcÑdÐenÑoˆDØ×/Ñ/×3Ñ3°D·J±J¸s³OÓDÐDøÜœHÐ%ò 	Ùð	ús   ‚AA ÁAÁAr·  )r’  r¸  r¹  rµ   r·   r7  rÿ  rù  r¨   r©   rª   rº   r¶   r¸   rô  r  rË   r�  r
  r÷   rÛ  rÜ  s   @r!   rè  rè  ë  s~   ø„ Ø $ÐØ!%Ðð ?Ø;ñÐðÐð€Mñ FÐñ "KÐñ NÐô ò
3ò
ò
2ò
ò
ò4Yõf.ò`ór#   rè  )ÚpostgisÚpostgresql_psycopg2Ú
postgresqlÚmysqlÚsqlite3Úoraclec                   óT   ‡ — e Zd ZdZdZˆ fd„Zˆ fd„Zed„ «       Zˆ fd„Z	ˆ fd„Z
ˆ xZS )ÚCommanda£  Prints the (approximated) difference between models and fields in the database for the given app name(s).

It indicates how columns in the database are different from the sql that would
be generated by Django. This command is not a database migration tool. (Though
it can certainly help) It's purpose is to show the current differences as a way
to check/debug ur models compared to the real database tables and columns.Fc                 ó¢  •— t         ‰| �  |«       |j                  dd¬«       |j                  dddddd	¬
«       |j                  dddddd¬
«       |j                  dddddd¬«       |j                  dddddd¬«       |j                  ddddd¬«       |j                  ddddd¬«       |j                  d dd!dt        j                  ¬«       y )"NrÁ   Ú*)Únargsz--all-applicationsz-aÚ
store_trueFr�  z8Automaticly include all application from INSTALLED_APPS.)rŠ  ÚdefaultÚdestÚhelpz--not-only-existingz-eÚstore_falseTr®   z_Check all tables that exist in the database, not only tables that should exist based on models.z--dense-outputz-dr�   zRShows the output in dense format, normally output is spreaded over multiple lines.)rŠ  rF  rE  rG  z--output_textz-tr¥  z:Outputs the differences as descriptive text instead of SQLz--include-proxy-modelsr�  z!Include proxy models in the graphz--include-defaultsrp  z3Include default values in SQL output (beta feature)z--migrate-for-testsÚmigrate_for_tests)rÃ  Úadd_argumentsÚadd_argumentÚargparseÚSUPPRESS)r^   ÚparserrÇ  s     €r!   rJ  zCommand.add_arguments  s"  ø€ Ü‰Ñ˜fÔ%Ø×Ñ˜K¨sÐÔ3Ø×ÑØ  $¨|ØØ#ØKð	 	ô 	
ð 	×ÑØ! 4°ØØ Ørð	 	ô 	
ð 	×ÑØ˜d¨<¸nØØeð 	ô 	
ð
 	×ÑØ˜T¨-¸eØØMð 	ô 	
ð
 	×ÑØ$¨\Ð@VØØ4ð 	ô 	
ð
 	×ÑØ ¨Ð<NØØFð 	ô 	
ð
 	×ÑØ!¨,Ð=PØÜ×"Ñ"ð 	õ 	
r#   c                 ó2   •— t        ‰| �  |i |¤Ž d| _        y )Nr   )rÃ  r¬   Ú	exit_code)r^   r`   ræ   rÇ  s      €r!   r¬   zCommand.__init__1  s   ø€ Ü‰Ñ˜$Ð) &Ò)Øˆ�r#   c                 óv  — ddl m} |d   }d }t        |d«      r|j                  d   d   }n|j                  }|dk(  rt        d«      ‚|d	   rt        j                  d
¬«      }nj|st        d«      ‚t        |t        t        t        f«      s|g}g }|D ]8  }t        j                  |«      }|j                  |j                  d
¬«      «       Œ: |st        d«      ‚|d   }	|	rddlm}
  |
dg|¢­d
d
dœŽ |s"t         j"                  j%                  d«      d   }d|v r|j%                  d«      d   }t&        j)                  |t*        «      } |||| j,                  | j.                  ¬«      }|j1                  «        |j3                  «        |j4                  sd| _        |j9                  | j:                  «       y )Nr   )ÚsettingsrÁ   Ú	DATABASESrE  ÚENGINEÚdummyzÙDjango doesn't know which syntax to use for your SQL statements,
because you haven't specified the DATABASE_ENGINE setting.
Edit your settings file and change DATABASE_ENGINE to something like 'postgresql' or 'mysql'.r�  T)Úinclude_auto_createdzEnter at least one appname.z+Unable to execute sqldiff no models founds.rI  )Úcall_commandÚmigrate)Úno_inputÚ
run_syncdbr  éþÿÿÿrÅ   )r•   r–   )Údjango.confrR  r“  rS  ÚDATABASE_ENGINEr	   r   Ú
get_modelsr   r   rû   rš   Úget_app_configr)   Údjango.core.managementrW  r   r¸  r  ÚDATABASE_SQLDIFF_CLASSESr  r»  r•   r–   rº   r£  r‘   rP  r¨  rS   )r^   r`   r“   rR  Ú
app_labelsÚenginer’   rÁ   Ú
app_configrI  rW  ÚclsÚsqldiff_instances                r!   ÚhandlezCommand.handle5  s³  € å(à˜[Ñ)ˆ
ØˆÜ�8˜[Ô)Ø×'Ñ'¨	Ñ2°8Ñ<‰Fà×-Ñ-ˆFà�WÒô ð  aó bð bð Ð%Ò&ÜŸ™¸dÔC‰JáÜ"Ð#@ÓAÐAä˜j¬4´¼Ð*<Ô=Ø(˜\�
àˆJØ'ò T�	Ü!×0Ñ0°Ó;�
Ø×!Ñ! *×"7Ñ"7ÈTÐ"7Ó"RÕSðTñ ÜÐLÓMÐMà#Ð$7Ñ8ÐÙÝ;Ù˜ÐP ZÑP¸$È4ÓPáÜ×*Ñ*×0Ñ0°Ó5°bÑ9ˆFà�&‰=Ø—\‘\ #Ó& rÑ*ˆFä&×*Ñ*¨6´>ÓBˆÙ˜z¨7¸4¿;¹;ÈtÏ{É{Ô[ÐØ×ÑÔØ×)Ñ)Ô+Ø×/Ò/ØˆDŒNØ×#Ñ# D§J¡JÕ/r#   c                 óV  •— 	 t        ‰| �  |i |¤Ž y # t        $ rŒ}|d   r‚ t        | dd «      }|s.t	        t
        j                  | j                  j                  «      }|j                  |j                  j                  ›d|›�«       t        j                  d«       Y d }~y d }~ww xY w)NÚ	tracebackr–   z: rW   )rÃ  rÐ   r	   rú   r
   Úsysr–   rS   rŠ   r°  rÇ  r’  Úexit)r^   r`   r“   rt   r–   rÇ  s        €r!   rÐ   zCommand.executek  s‰   ø€ ð	Ü‰G‰O˜TÐ- WÓ-øÜò 		Ø�{Ò#Øô ˜T 8¨TÓ2ˆFÙÜ&¤s§z¡z°4·:±:×3CÑ3CÓD�Ø�L‰L Q§[¡[×%9Ó%9¹1Ð=Ô>Ü�H‰H�Q�K‰Kûð		ús   ƒ “	B(œBB#Â#B(c                 ób   •— t         ‰| �  |«       t        j                  | j                  «       y rq   )rÃ  Úrun_from_argvrj  rk  rP  )r^   ÚargvrÇ  s     €r!   rm  zCommand.run_from_argvy  s    ø€ Ü‰Ñ˜dÔ#Ü�‰�—‘Õ r#   )r’  r¸  r¹  rG  Úoutput_transactionrJ  r¬   r   rg  rÐ   rm  rÛ  rÜ  s   @r!   r@  r@  þ  sB   ø„ ðN€Dð Ðô'
ôRð ñ30ó ð30ôj÷!ð !r#   r@  )+Ú__doc__r  rj  rL  Útypingr   r   r   r   Údjango.appsr   r`  r   r	   Údjango.core.management.baser
   Údjango.core.management.colorr   Ú	django.dbr   r   r   Údjango.db.modelsr   Údjango.db.models.fieldsr   r   Údjango.db.models.optionsr   Ú"django_extensions.management.utilsr   r–  r   rû   r"   r*   r5   r»  rÀ  rÞ  rè  ra  r@  rr   r#   r!   ú<module>rz     sÈ   ðñó, Û 
Û ß 2Ó 2Ý ß <Ý 5Ý 1ß 5Ñ 5Ý -ß ;Ý 7å <á˜h¨TÔ2€ð ˜u˜ó ò ÷w
<ñ w
<ôt�Wô ô]j�ô ]jô@;�Gô ;ô|F˜ô FðT !Ø,Ø#ØØØñÐ ô}!ˆkõ }!r#   