����JFIFXX�����    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222����"��4�� ���,�PG"Z_�4�˷����kjز�Z�,F+��_z�,�© �����zh6�٨�ic�fu���#ډb���_�N�?��wQ���5-�~�I���8����TK<5o�Iv-�����k�_U_�����~b�M��d����Ӝ�U�Hh��?]��E�w��Q���k�{��_}qFW7HTՑ��Y��F�?_�'ϔ��_�Ջt��=||I ��6�έ"�����D���/[�k�9���Y�8ds|\���Ҿp6�Ҵ���]��.����6�z<�v��@]�i%��$j��~�g��J>��no����pM[me�i$[����s�o�ᘨ�˸ nɜG-�ĨU�ycP�3.DB�li�;��hj���x7Z^�N�h������N3u{�:j�x�힞��#M&��jL P@_���� P��&��o8������9�����@Sz6�t7#O�ߋ �s}Yf�T���lmr����Z)'N��k�۞p����w\�Tȯ?�8`�O��i{wﭹW�[�r�� ��Q4F�׊���3m&L�=��h3����z~��#�\�l :�F,j@�� ʱ�wQT����8�"kJO���6�֚l����}���R�>ډK���]��y����&����p�}b��;N�1�m�r$�|��7�>e�@B�TM*-iH��g�D�)� E�m�|�ؘbҗ�a��Ҿ����t4���o���G��*oCN�rP���Q��@z,|?W[0�����:�n,jWiE��W��$~/�hp\��?��{(�0���+�Y8rΟ�+����>S-S����VN;�}�s?.����� w�9��˟<���Mq4�Wv'��{)0�1mB��V����W[�����8�/<� �%���wT^�5���b��)iM� pg�N�&ݝ��VO~�q���u���9� ����!��J27����$O-���! �:�%H��� ـ����y�ΠM=t{!S�� oK8������t<����è:a������[�����ա�H���~��w��Qz`�po�^ ����Q��n� �,uu�C�$ ^���,������8�#��:�6��e�|~���!�3�3.�\0��q��o�4`.|� ����y�Q�`~;�d�ׯ,��O�Zw�������`73�v�܋�<���Ȏ�� ـ4k��5�K�a�u�=9Yd��$>x�A�&�� j0� ���vF��� Y�|�y��� ~�6�@c��1vOp�Ig����4��l�OD���L����� R���c���j�_�uX6��3?nk��Wy�f;^*B� ��@�~a�`��Eu������+���6�L��.ü>��}y���}_�O�6�͐�:�YrG�X��kG�����l^w���~㒶sy��Iu�!� W ��X��N�7BV��O��!X�2����wvG�R�f�T#�����t�/?���%8�^�W�aT��G�cL�M���I��(J����1~�8�?aT ���]����AS�E��(��*E}� 2��#I/�׍qz��^t�̔���b�Yz4x���t�){ OH��+(E��A&�N�������XT��o��"�XC��'���)}�J�z�p� ��~5�}�^����+�6����w��c��Q�|Lp�d�H��}�(�.|����k��c4^�"�����Z?ȕ ��a<�L�!039C� �Eu�C�F�Ew�ç ;�n?�*o���B�8�bʝ���'#Rqf���M}7����]����s2tcS{�\icTx;�\��7K���P���ʇ Z O-��~��c>"��?�������P��E��O�8��@�8��G��Q�g�a�Վ���󁶠�䧘��_%#r�>�1�z�a��eb��qcPѵ��n���#L��� =��׀t� L�7�`��V���A{�C:�g���e@�w1 Xp3�c3�ġ����p��M"'-�@n4���fG��B3�DJ�8[Jo�ߐ���gK)ƛ��$���� ���8�3�����+���� �����6�ʻ���� ���S�kI�*KZlT _`���?��K����QK�d����B`�s}�>���`��*�>��,*@J�d�oF*����弝��O}�k��s��]��y�ߘ��c1G�V���<=�7��7����6�q�PT��tXԀ�!9*4�4Tހ3XΛex�46���Y��D ����� �BdemDa����\�_l,��G�/���֌7���Y�](�xTt^%�GE�����4�}bT���ڹ�����;Y)���B�Q��u��>J/J �⮶.�XԄ��j�ݳ�+E��d ��r�5�_D�1 ��o�� �B�x�΢�#���<��W�����8���R6�@g�M�.��� dr�D��>(otU��@x=��~v���2� ӣ�d�oBd��3�eO�6�㣷�����ݜ6��6Y��Qz`��S��{���\P�~z m5{J/L��1������<�e�ͅPu�b�]�ϔ���'������f�b� Zpw��c`"��i���BD@:)ִ�:�]��hv�E�w���T�l��P���"Ju�}��وV J��G6��. J/�Qgl߭�e�����@�z�Zev2u�)]կ�����7x���s�M�-<ɯ�c��r�v�����@��$�ޮ}lk���a���'����>x��O\�ZFu>�����ck#��&:��`�$�ai�>2Δ����l���oF[h��lE�ܺ�Πk:)���`�� $[6�����9�����kOw�\|���8}������ބ:��񶐕��I�A1/�=�2[�,�!��.}gN#�u����b��� ~��݊��}34q����d�E��Lc��$��"�[q�U�硬g^��%B �z���r�pJ�ru%v\h1Y�ne`ǥ:g���pQM~�^�Xi� ��`S�:V29.�P���V�?B�k�� AEvw%�_�9C�Q����wKekPؠ�\�;Io d�{ ߞo�c1eP����\� `����E=���@K<�Y���eڼ�J���w����{av�F�'�M�@/J��+9p���|]�����Iw &`��8���&M�hg��[�{��Xj��%��Ӓ�$��(����ʹN���<>�I���RY���K2�NPlL�ɀ)��&e����B+ь����( � �JTx���_?EZ� }@ 6�U���뙢ط�z��dWI�n` D����噥�[��uV��"�G&Ú����2g�}&m��?ċ�"����Om#��������� ��{�ON��"S�X��Ne��ysQ���@Fn��Vg���dX�~nj�]J�<�K]:��FW��b�������62�=��5f����JKw��bf�X�55��~J �%^����:�-�QIE��P��v�nZum� z � ~ə ���� ���ة����;�f��\v���g�8�1��f24;�V���ǔ�)����9���1\��c��v�/'Ƞ�w�������$�4�R-��t���� e�6�/�ġ �̕Ecy�J���u�B���<�W�ַ~�w[B1L۲�-JS΂�{���΃������A��20�c#��@ 0!1@AP"#2Q`$3V�%45a6�FRUq��� ����^7ׅ,$n�������+��F�`��2X'��0vM��p�L=������5��8������u�p~���.�`r�����\���O��,ư�0oS ��_�M�����l���4�kv\JSd���x���SW�<��Ae�IX����������$I���w�:S���y���›R��9�Q[���,�5�;�@]�%���u�@ *ro�lbI �� ��+���%m:�͇ZV�����u�̉����θau<�fc�.����{�4Ա� �Q����*�Sm��8\ujqs]{kN���)qO�y�_*dJ�b�7���yQqI&9�ԌK!�M}�R�;������S�T���1���i[U�ɵz�]��U)V�S6���3$K{�ߊ<�(� E]Զ[ǼENg�����'�\?#)Dkf��J���o��v���'�%ƞ�&K�u�!��b�35LX�Ϸ��63$K�a�;�9>,R��W��3�3� d�JeTYE.Mϧ��-�o�j3+y��y^�c�������VO�9NV\nd�1 ��!͕_)a�v;����թ�M�lWR1��)El��P;��yوÏ�u 3�k�5Pr6<�⒲l�!˞*��u־�n�!�l:����UNW ��%��Chx8vL'��X�@��*��)���̮��ˍ��� ���D-M�+J�U�kvK����+�x8��cY������?�Ԡ��~3mo��|�u@[XeY�C�\Kp�x8�oC�C�&����N�~3-H���� ��MX�s�u<`���~"WL��$8ξ��3���a�)|:@�m�\���^�`�@ҷ)�5p+��6���p�%i)P M���ngc�����#0Aruz���RL+xSS?���ʮ}()#�t��mˇ!��0}}y����<�e� �-ή�Ԩ��X������ MF���ԙ~l L.3���}�V뽺�v�����멬��Nl�)�2����^�Iq��a��M��qG��T�����c3#������3U�Ǎ���}��לS�|qa��ڃ�+���-��2�f����/��bz��ڐ�� �ݼ[2�ç����k�X�2�* �Z�d���J�G����M*9W���s{��w���T��x��y,�in�O�v��]���n����P�$�JB@=4�OTI�n��e�22a\����q�d���%�$��(���:���: /*�K[PR�fr\nڙdN���F�n�$�4�[�� U�zƶ����� �mʋ���,�ao�u 3�z� �x��Kn����\[��VFmbE;�_U��&V�Gg�]L�۪&#n%�$ɯ�dG���D�TI=�%+AB�Ru#��b4�1�»x�cs�YzڙJG��f��Il��d�eF'T� iA��T���uC�$����Y��H?����[!G`}���ͪ� �纤Hv\������j�Ex�K���!���OiƸ�Yj�+u-<���'q����uN�*�r\��+�]���<�wOZ.fp�ێ��,-*)V?j-kÊ#�`�r��dV����(�ݽBk�����G�ƛk�QmUڗe��Z���f}|����8�8��a���i��3'J�����~G_�^���d�8w������ R�`(�~�.��u���l�s+g�bv���W���lGc}��u���afE~1�Ue������Z�0�8�=e�� f@/�jqEKQQ�J��oN��J���W5~M>$6�Lt�;$ʳ{���^��6�{����v6���ķܰg�V�cnn �~z�x�«�,2�u�?cE+Ș�H؎�%�Za�)���X>uW�Tz�Nyo����s���FQƤ��$��*�&�LLXL)�1�" L��eO��ɟ�9=���:t��Z���c��Ž���Y?�ӭV�wv�~,Y��r�ۗ�|�y��GaF�����C�����.�+� ���v1���fήJ�����]�S��T��B��n5sW}y�$��~z�'�c ��8 ��� ,! �p��VN�S��N�N�q��y8z˱�A��4��*��'������2n<�s���^ǧ˭P�Jޮɏ�U�G�L�J�*#��<�V��t7�8����TĜ>��i}K%,���)[��z�21z ?�N�i�n1?T�I�R#��m-�����������������1����lA�`��fT5+��ܐ�c�q՝��ʐ��,���3�f2U�եmab��#ŠdQ�y>\��)�SLY����w#��.���ʑ�f��� ,"+�w�~�N�'�c�O�3F�������N<���)j��&��,-� �љ���֊�_�zS���TǦ����w�>��?�������n��U仆�V���e�����0���$�C�d���rP �m�׈e�Xm�Vu� �L��.�bֹ��� �[Դaզ���*��\y�8�Է:�Ez\�0�Kq�C b��̘��cө���Q��=0Y��s�N��S.���3.���O�o:���#���v7�[#߫ ��5�܎�L���Er4���9n��COWlG�^��0k�%<���ZB���aB_���������'=��{i�v�l�$�uC���mƎҝ{�c㱼�y]���W�i ��ߧc��m�H� m�"�"�����;Y�ߝ�Z�Ǔ�����:S#��|}�y�,/k�Ld� TA�(�AI$+I3��;Y*���Z��}|��ӧO��d�v��..#:n��f>�>���ȶI�TX��� 8��y����"d�R�|�)0���=���n4��6ⲑ�+��r<�O�܂~zh�z����7ܓ�HH�Ga롏���nCo�>������a ���~]���R���̲c?�6(�q�;5%� |�uj�~z8R=X��I�V=�|{v�Gj\gc��q����z�؋%M�ߍ����1y��#��@f^���^�>N�����#x#۹��6�Y~�?�dfPO��{��P�4��V��u1E1J �*|���%���JN��`eWu�zk M6���q t[�� ��g�G���v��WIG��u_ft����5�j�"�Y�:T��ɐ���*�;� e5���4����q$C��2d�}���� _S�L#m�Yp��O�.�C�;��c����Hi#֩%+) �Ӎ��ƲV���SYź��g |���tj��3�8���r|���V��1#;.SQ�A[���S������#���`n�+���$��$I �P\[�@�s��(�ED�z���P��])8�G#��0B��[ى��X�II�q<��9�~[Z멜�Z�⊔IWU&A>�P~�#��dp<�?����7���c��'~���5 ��+$���lx@�M�dm��n<=e�dyX��?{�|Aef ,|n3�<~z�ƃ�uۧ�����P��Y,�ӥQ�*g�#먙R�\���;T��i,��[9Qi歉����c>]9�� ��"�c��P�� �Md?٥��If�ت�u��k��/����F��9�c*9��Ǎ:�ØF���z�n*�@|I�ށ9����N3{'��[�'ͬ�Ҳ4��#}��!�V� Fu��,�,mTIk���v C�7v���B�6k�T9��1�*l� '~��ƞF��lU��'�M ����][ΩũJ_�{�i�I�n��$���L�� j��O�dx�����kza۪��#�E��Cl����x˘�o�����V���ɞ�ljr��)�/,�߬h�L��#��^��L�ф�,íMƁe�̩�NB�L�����iL����q�}��(��q��6IçJ$�W�E$��:������=#����(�K�B����zђ <��K(�N�۫K�w��^O{!����)�H���>x�������lx�?>Պ�+�>�W���,Ly!_�D���Ō�l���Q�!�[ �S����J��1��Ɛ�Y}��b,+�Lo�x�ɓ)����=�y�oh�@�꥟/��I��ѭ=��P�y9��� �ۍYӘ�e+�p�Jnϱ?V\SO%�(�t� ���=?MR�[Ș�����d�/ ��n�l��B�7j� ��!�;ӥ�/�[-���A�>�dN�sLj ��,ɪv��=1c�.SQ�O3�U���ƀ�ܽ�E����������̻��9G�ϷD�7(�}��Ävӌ\�y�_0[w ���<΍>����a_��[0+�L��F.�޺��f�>oN�T����q;���y\��bՃ��y�jH�<|q-eɏ�_?_9+P���Hp$�����[ux�K w�Mw��N�ی'$Y2�=��q���KB��P��~������Yul:�[<����F1�2�O���5=d����]Y�sw:���Ϯ���E��j,_Q��X��z`H1,#II ��d�wr��P˂@�ZJV����y$�\y�{}��^~���[:N����ߌ�U�������O��d�����ؾe��${p>G��3c���Ė�lʌ�� ת��[��`ϱ�-W����dg�I��ig2��� ��}s ��ؤ(%#sS@���~���3�X�nRG�~\jc3�v��ӍL��M[JB�T��s3}��j�Nʖ��W����;7��ç?=X�F=-�=����q�ߚ���#���='�c��7���ڑW�I(O+=:uxq�������������e2�zi+�kuG�R��������0�&e�n���iT^J����~\jy���p'dtG��s����O��3����9* �b#Ɋ�� p������[Bws�T�>d4�ۧs���nv�n���U���_�~,�v����ƜJ1��s�� �QIz��)�(lv8M���U=�;����56��G���s#�K���MP�=��LvyGd��}�VwWBF�'�à �?MH�U�g2�� ����!�p�7Q��j��ڴ����=��j�u��� Jn�A s���uM������e��Ɔ�Ҕ�!)'��8Ϣ�ٔ��ޝ(��Vp���צ֖d=�IC�J�Ǡ{q������kԭ�߸���i��@K����u�|�p=..�*+����x�����z[Aqġ#s2a�Ɗ���RR�)*HRsi�~�a &f��M��P����-K�L@��Z��Xy�'x�{}��Zm+���:�)�) IJ�-i�u���� ���ܒH��'�L(7�y�GӜq���� j��� 6ߌg1�g�o���,kر���tY�?W,���p���e���f�OQS��!K�۟cҒA�|ս�j�>��=⬒��˧L[�� �߿2JaB~R��u�:��Q�] �0H~���]�7��Ƽ�I���(}��cq '�ήET���q�?f�ab���ӥvr� �)o��-Q��_'����ᴎo��K������;��V���o��%���~OK ����*��b�f:���-ťIR��`B�5!RB@���ï�� �u �̯e\�_U�_������� g�ES��3�������QT��a����x����U<~�c?�*�#]�MW,[8O�a�x��]�1bC|踤�P��lw5V%�)�{t�<��d��5���0i�XSU��m:��Z�┵�i�"��1�^B�-��P�hJ��&)O��*�D��c�W��vM��)����}���P��ܗ-q����\mmζZ-l@�}��a��E�6��F�@��&Sg@���ݚ�M����� ȹ 4����#p�\H����dYDo�H���"��\��..R�B�H�z_�/5˘����6��KhJR��P�mƶi�m���3�,#c�co��q�a)*Pt����R�m�k�7x�D�E�\Y�閣_X�<���~�)���c[[�BP����6�Yq���S��0����%_����;��Àv�~�| VS؇ ��'O0��F0��\���U�-�d@�����7�SJ*z��3n��y��P����O���������m�~�P�3|Y��ʉr#�C�<�G~�.,! ���bqx���h~0=��!ǫ�jy����l�O,�[B��~��|9��ٱ����Xly�#�i�B��g%�S��������tˋ���e���ې��\[d�t)��.+u�|1 ������#�~Oj����hS�%��i.�~X���I�H�m��0n���c�1uE�q��cF�RF�o���7� �O�ꮧ� ���ۛ{��ʛi5�rw?׌#Qn�TW��~?y$��m\�\o����%W� ?=>S�N@�� �Ʈ���R����N�)�r"C�:��:����� �����#��qb��Y�. �6[��2K����2u�Ǧ�HYR��Q�MV��� �G�$��Q+.>�����nNH��q�^��� ����q��mM��V��D�+�-�#*�U�̒ ���p욳��u:�������IB���m���PV@O���r[b= �� ��1U�E��_Nm�yKbN�O���U�}�the�`�|6֮P>�\2�P�V���I�D�i�P�O;�9�r�mAHG�W�S]��J*�_�G��+kP�2����Ka�Z���H�'K�x�W�MZ%�O�YD�Rc+o��?�q��Ghm��d�S�oh�\�D�|:W������UA�Qc yT�q������~^�H��/��#p�CZ���T�I�1�ӏT����4��"�ČZ�����}��`w�#�*,ʹ�� ��0�i��課�Om�*�da��^gJ݅{���l�e9uF#T�ֲ��̲�ٞC"�q���ߍ ոޑ�o#�XZTp����@ o�8��(jd��xw�]�,f���`~�|,s��^����f�1���t��|��m�򸄭/ctr��5s��7�9Q�4�H1꠲BB@l9@���C�����+�wp�xu�£Yc�9��?`@#�o�mH�s2��)�=��2�.�l����jg�9$�Y�S�%*L������R�Y������7Z���,*=�䷘$�������arm�o�ϰ���UW.|�r�uf����IGw�t����Zwo��~5 ��YյhO+=8fF�)�W�7�L9lM�̘·Y���֘YLf�큹�pRF���99.A �"wz��=E\Z���'a� 2��Ǚ�#;�'}�G���*��l��^"q��+2FQ� hj��kŦ��${���ޮ-�T�٭cf�|�3#~�RJ����t��$b�(R��(����r���dx� >U b�&9,>���%E\� Ά�e�$��'�q't��*�א���ެ�b��-|d���SB�O�O��$�R+�H�)�܎�K��1m`;�J�2�Y~9��O�g8=vqD`K[�F)k�[���1m޼c��n���]s�k�z$@��)!I �x՝"v��9=�ZA=`Ɠi �:�E��)`7��vI��}d�YI�_ �o�:ob���o ���3Q��&D&�2=�� �Ά��;>�h����y.*ⅥS������Ӭ�+q&����j|UƧ����}���J0��WW< ۋS�)jQR�j���Ư��rN)�Gű�4Ѷ(�S)Ǣ�8��i��W52���No˓� ۍ%�5brOn�L�;�n��\G����=�^U�dI���8$�&���h��'���+�(������cȁ߫k�l��S^���cƗjԌE�ꭔ��gF���Ȓ��@���}O���*;e�v�WV���YJ\�]X'5��ղ�k�F��b 6R�o՜m��i N�i����>J����?��lPm�U��}>_Z&�KK��q�r��I�D�Չ~�q�3fL�:S�e>���E���-G���{L�6p�e,8��������QI��h��a�Xa��U�A'���ʂ���s�+טIjP�-��y�8ۈZ?J$��W�P� ��R�s�]��|�l(�ԓ��sƊi��o(��S0��Y� 8�T97.�����WiL��c�~�dxc�E|�2!�X�K�Ƙਫ਼�$((�6�~|d9u+�qd�^3�89��Y�6L�.I�����?���iI�q���9�)O/뚅����O���X��X�V��ZF[�یgQ�L��K1���RҖr@v�#��X�l��F���Нy�S�8�7�kF!A��sM���^rkp�jP�DyS$N���q��nxҍ!U�f�!eh�i�2�m���`�Y�I�9r�6� �TF���C}/�y�^���Η���5d�'��9A-��J��>{�_l+�`��A���[�'��յ�ϛ#w:݅�%��X�}�&�PSt�Q�"�-��\縵�/����$Ɨh�Xb�*�y��BS����;W�ջ_mc�����vt?2}1�;qS�d�d~u:2k5�2�R�~�z+|HE!)�Ǟl��7`��0�<�,�2*���Hl-��x�^����'_TV�gZA�'j� ^�2Ϊ��N7t�����?w�� �x1��f��Iz�C-Ȗ��K�^q�;���-W�DvT�7��8�Z�������� hK�(P:��Q- �8�n�Z���܃e貾�<�1�YT<�,�����"�6{/ �?�͟��|1�:�#g��W�>$����d��J��d�B��=��jf[��%rE^��il:��B���x���Sּ�1հ��,�=��*�7 fcG��#q� �eh?��2�7�����,�!7x��6�n�LC�4x��},Geǝ�tC.��vS �F�43��zz\��;QYC,6����~;RYS/6���|2���5���v��T��i����������mlv��������&� �nRh^ejR�LG�f���? �ۉҬܦƩ��|��Ȱ����>3����!v��i�ʯ�>�v��オ�X3e���_1z�Kȗ\<������!�8���V��]��?b�k41�Re��T�q��mz��TiOʦ�Z��Xq���L������q"+���2ۨ��8}�&N7XU7Ap�d�X��~�׿��&4e�o�F��� �H����O���č�c�� 懴�6���͉��+)��v;j��ݷ�� �UV�� i��� j���Y9GdÒJ1��詞�����V?h��l����l�cGs�ځ�������y�Ac�����\V3�? �� ܙg�>qH�S,�E�W�[�㺨�uch�⍸�O�}���a��>�q�6�n6����N6�q������N ! 1AQaq�0@����"2BRb�#Pr���3C`��Scst���$4D���%Td�� ?���N����a��3��m���C���w��������xA�m�q�m���m������$����4n淿t'��C"w��zU=D�\R+w�p+Y�T�&�պ@��ƃ��3ޯ?�Aﶂ��aŘ���@-�����Q�=���9D��ռ�ѻ@��M�V��P��܅�G5�f�Y<�u=,EC)�<�Fy'�"�&�չ�X~f��l�KԆV��?�� �W�N����=(� �;���{�r����ٌ�Y���h{�١������jW����P���Tc�����X�K�r��}���w�R��%��?���E��m�� �Y�q|����\lEE4���r���}�lsI�Y������f�$�=�d�yO����p�����yBj8jU�o�/�S��?�U��*������ˍ�0������u�q�m [�?f����a�� )Q�>����6#������� ?����0UQ����,IX���(6ڵ[�DI�MNލ�c&���υ�j\��X�R|,4��� j������T�hA�e��^���d���b<����n�� �즇�=!���3�^�`j�h�ȓr��jẕ�c�,ٞX����-����a�ﶔ���#�$��]w�O��Ӫ�1y%��L�Y<�wg#�ǝ�̗`�x�xa�t�w��»1���o7o5��>�m뭛C���Uƃߜ}�C���y1Xνm�F8�jI���]����H���ۺиE@I�i;r�8ӭ����V�F�Շ| ��&?�3|x�B�MuS�Ge�=Ӕ�#BE5G�����Y!z��_e��q�р/W>|-�Ci߇�t�1ޯќd�R3�u��g�=0 5��[?�#͏��q�cf���H��{ ?u�=?�?ǯ���}Z��z���hmΔ�BFTW�����<�q�(v� ��!��z���iW]*�J�V�z��gX֧A�q�&��/w���u�gYӘa���; �i=����g:��?2�dž6�ى�k�4�>�Pxs����}������G�9��3 ���)gG�R<>r h�$��'nc�h�P��Bj��J�ҧH� -��N1���N��?��~��}-q!=��_2hc�M��l�vY%UE�@|�v����M2�.Y[|y�"Eï��K�ZF,�ɯ?,q�?v�M 80jx�"�;�9vk�����+ ֧�� �ȺU��?�%�vcV��mA�6��Qg^M����A}�3�nl� QRN�l8�kkn�'�����(��M�7m9و�q���%ޟ���*h$Zk"��$�9��: �?U8�Sl��,,|ɒ��xH(ѷ����Gn�/Q�4�P��G�%��Ա8�N��!� �&�7�;���eKM7�4��9R/%����l�c>�x;������>��C�:�����t��h?aKX�bhe�ᜋ^�$�Iհ �hr7%F$�E��Fd���t��5���+�(M6�t����Ü�UU|zW�=a�Ts�Tg������dqP�Q����b'�m���1{|Y����X�N��b �P~��F^F:����k6�"�j!�� �I�r�`��1&�-$�Bevk:y���#yw��I0��x��=D�4��tU���P�ZH��ڠ底taP��6����b>�xa����Q�#� WeF��ŮNj�p�J* mQ�N����*I�-*�ȩ�F�g�3 �5��V�ʊ�ɮ�a��5F���O@{���NX��?����H�]3��1�Ri_u��������ѕ�� ����0��� F��~��:60�p�͈�S��qX#a�5>���`�o&+�<2�D����: �������ڝ�$�nP���*)�N�|y�Ej�F�5ټ�e���ihy�Z �>���k�bH�a�v��h�-#���!�Po=@k̆IEN��@��}Ll?j�O������߭�ʞ���Q|A07x���wt!xf���I2?Z��<ץ�T���cU�j��]��陎Ltl �}5�ϓ��$�,��O�mˊ�;�@O��jE��j(�ا,��LX���LO���Ц�90�O �.����a��nA���7������j4 ��W��_ٓ���zW�jcB������y՗+EM�)d���N�g6�y1_x��p�$Lv:��9�"z��p���ʙ$��^��JԼ*�ϭ����o���=x�Lj�6�J��u82�A�H�3$�ٕ@�=Vv�]�'�qEz�;I˼��)��=��ɯ���x �/�W(V���p�����$ �m�������u�����񶤑Oqˎ�T����r��㠚x�sr�GC��byp�G��1ߠ�w e�8�$⿄����/�M{*}��W�]˷.�CK\�ުx���/$�WPw���r� |i���&�}�{�X� �>��$-��l���?-z���g����lΆ���(F���h�vS*���b���߲ڡn,|)mrH[���a�3�ר�[1��3o_�U�3�TC�$��(�=�)0�kgP���� ��u�^=��4 �WYCҸ:��vQ�ר�X�à��tk�m,�t*��^�,�}D*� �"(�I��9R����>`�`��[~Q]�#af��i6l��8���6�:,s�s�N6�j"�A4���IuQ��6E,�GnH��zS�HO�uk�5$�I�4��ؤ�Q9�@��C����wp�BGv[]�u�Ov���0I4���\��y�����Q�Ѹ��~>Z��8�T��a��q�ޣ;z��a���/��S��I:�ܫ_�|������>=Z����8:�S��U�I�J��"IY���8%b8���H��:�QO�6�;7�I�S��J��ҌAά3��>c���E+&jf$eC+�z�;��V����� �r���ʺ������my�e���aQ�f&��6�ND��.:��NT�vm�<- u���ǝ\MvZY�N�NT��-A�>jr!S��n�O 1�3�Ns�%�3D@���`������ܟ 1�^c<���� �a�ɽ�̲�Xë#�w�|y�cW�=�9I*H8�p�^(4���՗�k��arOcW�tO�\�ƍR��8����'�K���I�Q�����?5�>[�}��yU�ײ -h��=��% q�ThG�2�)���"ו3]�!kB��*p�FDl�A���,�eEi�H�f�Ps�����5�H:�Փ~�H�0Dت�D�I����h�F3�������c��2���E��9�H��5�zԑ�ʚ�i�X�=:m�xg�hd(�v����׊�9iS��O��d@0ڽ���:�p�5�h-��t�&���X�q�ӕ,��ie�|���7A�2���O%P��E��htj��Y1��w�Ѓ!����  ���� ࢽ��My�7�\�a�@�ţ�J �4�Ȼ�F�@o�̒?4�wx��)��]�P��~�����u�����5�����7X ��9��^ܩ�U;Iꭆ 5 �������eK2�7(�{|��Y׎ �V��\"���Z�1� Z�����}��(�Ǝ"�1S���_�vE30>���p;� ΝD��%x�W�?W?v����o�^V�i�d��r[��/&>�~`�9Wh��y�;���R��� ;;ɮT��?����r$�g1�K����A��C��c��K��l:�'��3 c�ﳯ*"t8�~l��)���m��+U,z��`(�>yJ�?����h>��]��v��ЍG*�{`��;y]��I�T� ;c��NU�fo¾h���/$���|NS���1�S�"�H��V���T���4��uhǜ�]�v;���5�͠x��'C\�SBpl���h}�N����� A�Bx���%��ޭ�l��/����T��w�ʽ]D�=����K���ž�r㻠l4�S�O?=�k �M:� ��c�C�a�#ha���)�ѐxc�s���gP�iG��{+���x���Q���I= �� z��ԫ+ �8"�k�ñ�j=|����c ��y��CF��/��*9ж�h{ �?4�o� ��k�m�Q�N�x��;�Y��4膚�a�w?�6�>e]�����Q�r�:����g�,i"�����ԩA�*M�<�G��b�if��l^M��5� �Ҩ�{����6J��ZJ�����P�*�����Y���ݛu�_4�9�I8�7���������,^ToR���m4�H��?�N�S�ѕw��/S��甍�@�9H�S�T��t�ƻ���ʒU��*{Xs�@����f�����֒Li�K{H�w^���������Ϥm�tq���s� ���ք��f:��o~s��g�r��ט� �S�ѱC�e]�x���a��) ���(b-$(�j>�7q�B?ӕ�F��hV25r[7 Y� }L�R��}����*sg+��x�r�2�U=�*'WS��ZDW]�WǞ�<��叓���{�$�9Ou4��y�90-�1�'*D`�c�^o?(�9��u���ݐ��'PI&� f�Jݮ�������:wS����jfP1F:X �H�9dԯ���˝[�_54 �}*;@�ܨ�� ð�yn�T���?�ןd�#���4rG�ͨ��H�1�|-#���Mr�S3��G�3�����)�.᧏3v�z֑��r����$G"�`j �1t��x0<Ɔ�Wh6�y�6��,œ�Ga��gA����y��b��)��h�D��ß�_�m��ü �gG;��e�v��ݝ�nQ� ��C����-�*��o���y�a��M��I�>�<���]obD��"�:���G�A��-\%LT�8���c�)��+y76���o�Q�#*{�(F�⽕�y����=���rW�\p���۩�c���A���^e6��K������ʐ�cVf5$�'->���ՉN"���F�"�UQ@�f��Gb~��#�&�M=��8�ט�JNu9��D��[̤�s�o�~������ G��9T�tW^g5y$b��Y'��س�Ǵ�=��U-2 #�MC�t(�i� �lj�@Q 5�̣i�*�O����s�x�K�f��}\��M{E�V�{�υ��Ƈ�����);�H����I��fe�Lȣr�2��>��W�I�Ȃ6������i��k�� �5�YOxȺ����>��Y�f5'��|��H+��98pj�n�.O�y�������jY��~��i�w'������l�;�s�2��Y��:'lg�ꥴ)o#'Sa�a�K��Z� �m��}�`169�n���"���x��I ��*+� }F<��cГ���F�P�������ֹ*�PqX�x۩��,� ��N�� �4<-����%����:��7����W���u�`����� $�?�I��&����o��o��`v�>��P��"��l���4��5'�Z�gE���8���?��[�X�7(��.Q�-��*���ތL@̲����v��.5���[��=�t\+�CNܛ��,g�SQnH����}*F�G16���&:�t��4ُ"A��̣��$�b �|����#rs��a�����T�� ]�<�j��BS�('$�ɻ� �wP;�/�n��?�ݜ��x�F��yUn�~mL*-�������Xf�wd^�a�}��f�,=t�׵i�.2/wpN�Ep8�OР���•��R�FJ� 55TZ��T �ɭ�<��]��/�0�r�@�f��V��V����Nz�G��^���7hZi����k��3�,kN�e|�vg�1{9]_i��X5y7� 8e]�U����'�-2,���e"����]ot�I��Y_��n�(JҼ��1�O ]bXc���Nu�No��pS���Q_���_�?i�~�x h5d'�(qw52] ��'ޤ�q��o1�R!���`ywy�A4u���h<קy���\[~�4�\ X�Wt/� 6�����n�F�a8��f���z �3$�t(���q��q�x��^�XWeN'p<-v�!�{�(>ӽDP7��ո0�y)�e$ٕv�Ih'Q�EA�m*�H��RI��=:��� ���4牢) �%_iN�ݧ�l]� �Nt���G��H�L��� ɱ�g<���1V�,�J~�ٹ�"K��Q�� 9�HS�9�?@��k����r�;we݁�]I�!{ �@�G�[�"��`���J:�n]�{�cA�E����V��ʆ���#��U9�6����j�#Y�m\��q�e4h�B�7��C�������d<�?J����1g:ٳ���=Y���D�p�ц� ׈ǔ��1�]26؜oS�'��9�V�FVu�P�h�9�xc�oq�X��p�o�5��Ա5$�9W�V(�[Ak�aY錎qf;�'�[�|���b�6�Ck��)��#a#a˙��8���=äh�4��2��C��4tm^ �n'c���]GQ$[Wҿ��i���vN�{Fu ��1�gx��1┷���N�m��{j-,��x�� Ūm�ЧS�[�s���Gna���䑴�� x�p 8<������97�Q���ϴ�v�aϚG��Rt�Һ׈�f^\r��WH�JU�7Z���y)�vg=����n��4�_)y��D'y�6�]�c�5̪�\� �PF�k����&�c;��cq�$~T�7j ���nç]�<�g ":�to�t}�159�<�/�8������m�b�K#g'I'.W�����6��I/��>v��\�MN��g���m�A�yQL�4u�Lj�j9��#44�t��l^�}L����n��R��!��t��±]��r��h6ٍ>�yҏ�N��fU�� ���� Fm@�8}�/u��jb9������he:A�y�ծw��GpΧh�5����l}�3p468��)U��d��c����;Us/�֔�YX�1�O2��uq�s��`hwg�r~�{ R��mhN��؎*q 42�*th��>�#���E����#��Hv�O����q�}�����6�e��\�,Wk�#���X��b>��p}�դ��3���T5��†��6��[��@�P�y*n��|'f�֧>�lư΂�̺����SU�'*�q�p�_S�����M�� '��c�6�����m�� ySʨ;M��r���Ƌ�m�Kxo,���Gm�P��A�G�:��i��w�9�}M(�^�V��$ǒ�ѽ�9���|���� �a����J�SQ�a���r�B;����}���ٻ֢�2�%U���c�#�g���N�a�ݕ�'�v�[�OY'��3L�3�;,p�]@�S��{ls��X�'���c�jw�k'a�.��}�}&�� �dP�*�bK=ɍ!����;3n�gΊU�ߴmt�'*{,=SzfD� A��ko~�G�aoq�_mi}#�m�������P�Xhύ����mxǍ�΂���巿zf��Q���c���|kc�����?���W��Y�$���_Lv����l߶��c���`?����l�j�ݲˏ!V��6����U�Ђ(A���4y)H���p�Z_�x��>���e��R��$�/�`^'3qˏ�-&Q�=?��CFVR �D�fV�9��{�8g�������n�h�(P"��6�[�D���< E�����~0<@�`�G�6����Hг�cc�� �c�K.5��D��d�B���`?�XQ��2��ٿyqo&+�1^� DW�0�ꊩ���G�#��Q�nL3��c���������/��x ��1�1[y�x�პCW��C�c�UĨ80�m�e�4.{�m��u���I=��f�����0QRls9���f���������9���~f�����Ǩ��a�"@�8���ȁ�Q����#c�ic������G��$���G���r/$W�(��W���V�"��m�7�[m�A�m����bo��D� j����۳� l���^�k�h׽����� ��#� iXn�v��eT�k�a�^Y�4�BN��ĕ��0 !01@Q"2AaPq3BR������?���@4�Q�����T3,���㺠�W�[=JK�Ϟ���2�r^7��vc�:�9 �E�ߴ�w�S#d���Ix��u��:��Hp��9E!�� V 2;73|F��9Y���*ʬ�F��D����u&���y؟��^EA��A��(ɩ���^��GV:ݜDy�`��Jr29ܾ�㝉��[���E;Fzx��YG��U�e�Y�C���� ����v-tx����I�sם�Ę�q��Eb�+P\ :>�i�C'�;�����k|z�رn�y]�#ǿb��Q��������w�����(�r|ӹs��[�D��2v-%��@;�8<a���[\o[ϧw��I!��*0�krs)�[�J9^��ʜ��p1)� "��/_>��o��<1����A�E�y^�C��`�x1'ܣn�p��s`l���fQ��):�l����b>�Me�jH^?�kl3(�z:���1ŠK&?Q�~�{�ٺ�h�y���/�[��V�|6��}�KbX����mn[-��7�5q�94�������dm���c^���h� X��5��<�eޘ>G���-�}�دB�ޟ� ��|�rt�M��V+�]�c?�-#ڛ��^ǂ}���Lkr���O��u�>�-D�ry� D?:ޞ�U��ǜ�7�V��?瓮�"�#���r��չģVR;�n���/_� ؉v�ݶe5d�b9��/O��009�G���5n�W����JpA�*�r9�>�1��.[t���s�F���nQ� V 77R�]�ɫ8����_0<՜�IF�u(v��4��F�k�3��E)��N:��yڮe��P�`�1}�$WS��J�SQ�N�j�ٺ��޵�#l���ј(�5=��5�lǏmoW�v-�1����v,W�mn��߀$x�<����v�j(����c]��@#��1������Ǔ���o'��u+����;G�#�޸��v-lη��/(`i⣍Pm^���ԯ̾9Z��F��������n��1��� ��]�[��)�'������:�֪�W��FC����� �B9،!?���]��V��A�Վ�M��b�w��G F>_DȬ0¤�#�QR�[V��kz���m�w�"��9ZG�7'[��=�Q����j8R?�zf�\a�=��O�U����*oB�A�|G���2�54 �p��.w7� �� ��&������ξxGHp� B%��$g�����t�Џ򤵍z���HN�u�Я�-�'4��0��;_��3 !01"@AQa2Pq#3BR������?��ʩca��en��^��8���<�u#��m*08r��y�N"�<�Ѳ0��@\�p��� �����Kv�D��J8�Fҽ� �f�Y��-m�ybX�NP����}�!*8t(�OqѢ��Q�wW�K��ZD��Δ^e��!� ��B�K��p~�����e*l}z#9ң�k���q#�Ft�o��S�R����-�w�!�S���Ӥß|M�l޶V��!eˈ�8Y���c�ЮM2��tk���� ������J�fS����Ö*i/2�����n]�k�\���|4yX�8��U�P.���Ы[���l��@"�t�<������5�lF���vU�����W��W��;�b�cД^6[#7@vU�xgZv��F�6��Q,K�v��� �+Ъ��n��Ǣ��Ft���8��0��c�@�!�Zq s�v�t�;#](B��-�nῃ~���3g������5�J�%���O������n�kB�ĺ�.r��+���#�N$?�q�/�s�6��p��a����a��J/��M�8��6�ܰ"�*������ɗud"\w���aT(����[��F��U՛����RT�b���n�*��6���O��SJ�.�ij<�v�MT��R\c��5l�sZB>F��<7�;EA��{��E���Ö��1U/�#��d1�a�n.1ě����0�ʾR�h��|�R��Ao�3�m3 ��%�� ���28Q� ��y��φ���H�To�7�lW>����#i`�q���c����a��� �m,B�-j����݋�'mR1Ήt�>��V��p���s�0IbI�C.���1R�ea�����]H�6����������4B>��o��](��$B���m�����a�!=��?�B� K�Ǿ+�Ծ"�n���K��*��+��[T#�{E�J�S����Q�����s�5�:�U�\wĐ�f�3����܆&�)����I���Ԇw��E T�lrTf6Q|R�h:��[K�� �z��c֧�G�C��%\��_�a�84��HcO�bi��ؖV��7H �)*ģK~Xhչ0��4?�0��� �E<���}3���#���u�?�� ��|g�S�6ꊤ�|�I#Hڛ� �ա��w�X��9��7���Ŀ%�SL��y6č��|�F�a 8���b��$�sק�h���b9RAu7�˨p�Č�_\*w��묦��F ����4D~�f����|(�"m���NK��i�S�>�$d7SlA��/�²����SL��|6N�}���S�˯���g��]6��; �#�.��<���q'Q�1|KQ$�����񛩶"�$r�b:���N8�w@��8$�� �AjfG|~�9F ���Y��ʺ��Bwؒ������M:I岎�G��`s�YV5����6��A �b:�W���G�q%l�����F��H���7�������Fsv7��k�� 403WebShell
403Webshell
Server IP : 97.74.90.209  /  Your IP : 216.73.216.74
Web Server : Apache
System : Linux live.indianstaffingfederation.org 4.18.0-553.54.1.el8_10.x86_64 #1 SMP Tue May 27 22:49:52 EDT 2025 x86_64
User : indianstaffing ( 1003)
PHP Version : 8.3.22
Disable Function : exec,passthru,shell_exec,system
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/opt/nydus/ops/mysql/connector/aio/__pycache__/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/opt/nydus/ops/mysql/connector/aio/__pycache__/abstracts.cpython-39.pyc
a

Oh#h��@sUdZddlmZgd�ZddlZddlZddlZddlZddlm	Z	m
Z
ddlmZm
Z
ddlmZddlmZdd	lmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"d
dl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*d
dl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1d
d
l2m3Z3m4Z4d
dl5m6Z6m7Z7m8Z8m9Z9m:Z:d
dl;m<Z<m=Z=d
dlm>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHd
dlImJZJmKZKddlLmMZMddlNmOZOmNZNddlPmQZQe�r�ddlRmSZSmTZTejUdkZVe�W�ZXdeYd<eGdd�d��ZZGdd�de	�Z[Gdd�de	�Z\Gd d!�d!eJ�Z]dS)"z+Module gathering all abstract base classes.�)�annotations)�MySQLConnectionAbstract�MySQLCursorAbstract�
ServerInfoN)�ABC�abstractmethod)�	dataclass�field)�	signature)�
TracebackType)�
TYPE_CHECKING�Any�AsyncGenerator�BinaryIO�Callable�Dict�	Generator�Iterator�List�Mapping�NoReturn�Optional�Sequence�Tuple�Type�Union�)�DUPLICATED_IN_LIST_ERROR�KRB_SERVICE_PINCIPAL_ERROR�MYSQL_PY_TYPES�TLS_V1_3_SUPPORTED�TLS_VER_NO_SUPPORTED�TLS_VERSION_ERROR�TLS_VERSION_UNACCEPTABLE_ERROR)�
CONN_ATTRS_DN�DEFAULT_CONFIGURATION�OPENSSL_CS_NAMES�TLS_CIPHER_SUITES�TLS_VERSIONS�
ClientFlag)�MySQLConverter�MySQLConverterBase)�Error�InterfaceError�
InternalError�NotSupportedError�ProgrammingError)�UNACCEPTABLE_TLS_CIPHERSUITES�UNACCEPTABLE_TLS_VERSIONS)�BinaryProtocolType�DescriptionType�
EofPacketType�
HandShakeType�OkPacketType�ParamsSequenceType�
ResultType�RowType�StatsPacketType�
StrOrBytes�WarningType)�GenericWrapper�
import_object�)�MySQLAuthenticator)�Charset�charsets)�
MySQLProtocol)�MySQLTcpSocket�MySQLUnixSocket�posixz%weakref.WeakValueDictionary[Any, Any]�NAMED_TUPLE_CACHEc@s~eZdZUdZded<ded<edd�Zded	<ded
<ded<ded<ded
<ded<ded<dZded<dd�dd�ZdS)rz�Stores the server information retrieved on the handshake.

    Also parses and validates the server version, storing it as a tuple.
    �int�protocol�str�versionF)�initzTuple[int, ...]�
version_tupleZ	thread_id�charsetZstatus_flags�auth_plugin�bytesZ	auth_dataZcapabilities�bool�query_attrs_is_supported�None��returncCsdt�d�}|�|j�}|s"td��tdd�|��dd�D��}|dkrZtd|j�d	���||_d
S)z�Parse and validate server version.

        Raises:
            InterfaceError: If parsing fails or MySQL version is not supported.
        z$^(\d{1,2})\.(\d{1,2})\.(\d{1,3})(.*)zFailed parsing MySQL versioncss|]}t|�VqdS�N)rI)�.0�v�rZ�N/opt/nydus/tmp/pip-target-wgfnss67/lib/python/mysql/connector/aio/abstracts.py�	<genexpr>��z+ServerInfo.__post_init__.<locals>.<genexpr>r�)�r@zMySQL Version 'z' is not supportedN)�re�compile�matchrLr-�tuple�groupsrN)�selfZ
version_rerbrLrZrZr[�
__post_init__�s
zServerInfo.__post_init__N)	�__name__�
__module__�__qualname__�__doc__�__annotations__r	rNrSrfrZrZrZr[rvs
rc+@s�eZdZUdZddddddddddddddddidddddddddededdded	dddddded
dddd�)dd
d
ddd
d
d
d
d
dddddddddddddddddddddddddddddddd�)dd�Zdd�dd�Z�d	ddddd �d!d"�Zdd�d#d$�Zdd�d%d&�Z	dd�d'd(�Z
e�d
d
d*ddd+�d,d-��Ze
edd�d.d/���Ze
d
d�d0d1��Ze
d
d�d2d3��Ze
dd�d4d5��Ze
dd�d6d7��Ze
d
d�d8d9��Zejd
dd:�d;d9��Zd
d�d<d=�Zd
dd:�d>d?�Ze
dd�d@dA��Zejddd:�dBdA��Ze
dd�dCdD��Ze
dEd�dFdG��Ze
dd�dHdI��Ze
dJd�dKdL��Ze
dd�dMdN��Ze
dd�dOdP��Zejddd:�dQdP��Zdd�dRdS�Zddd:�dTdU�Z e
d
d�dVdW��Z!e!jd
dd:�dXdW��Z!d
d�dYdZ�Z"d
dd:�d[d\�Z#e
d
d�d]d^��Z$e$jd_dd:�d`d^��Z$d
d�dadb�Z%d_dd:�dcdd�Z&e
dd�dedf��Z'e'jddd:�dgdf��Z'e
dd�dhdi��Z(e(jddd:�djdi��Z(e
dd�dkdl��Z)e)jddd:�dmdl��Z)e
d
d�dndo��Z*e
d
d�dpdq��Z+edd�drds��Z,ed
dtdu�dvdw��Z-dd�dxdy�Z.�ddzddd{�d|d}�Z/ddd~�dd��Z0d
dd��d�d��Z1dd�d�d��Z2d�d�d�d��Z3dd�d�d��Z4edd�d�d���Z5edd�d�d���Z6e�dddddd��d�d���Z7d�dd��d�d��Z8d�dd��d�d��Z9d�dd:�d�d��Z:d
d�d��d�d��Z;dd�d�d��Z<dd�d�d��Z=dd�d�d��Z>d�d�du�d�d��Z?d�dd��d�d��Z@d�dd��d�d��ZAedd�d�d���ZB�d
dddd��d�d��ZCd�d�d�d��ZDedd�d�d���ZEeEZFd�eGd�<e�ddddd�ddd�d��d�d���ZHe�ddd�dd�dĜd�dƄ�ZIe�dddd�dd�d�dɜd�d˄�ZJedd�d�d̈́�ZKedd�d�dτ�ZLedd�d�dф�ZMed
d�dӜd�dՄ�ZNe�dd�ddddtd֜d�d؄�ZOd�d�dڜd�d܄ZPe�dddddݜd�d߄�ZQed�d�d�d�d��ZRe�dd�d�d�dd�d�d�d��ZSeddd�d�d��ZTeddd�d�d��ZUedd�d�d�d��ZVddd�dd��d�d��ZWed�d�d�d���ZXe�dddd��d�d���ZYed�d�d��d��ZZeddҐd��d�d��Z[e�dd��d�d��Z\ed�d��d�d��Z]dS(rz'Defines the MySQL connection interface.N�z	127.0.0.1i�F�allow_local_infile�allow_local_infile_in_path�connect_timeout�ssl_disabled))�user�password�host�port�database�	password1�	password2�	password3rO�	collationrP�client_flags�compress�consume_results�
autocommit�	time_zone�
conn_attrs�sql_mode�init_command�get_warnings�raise_on_warnings�buffered�raw�kerberos_auth_mode�krb_service_principal�webauthn_callbackrmrn�converter_class�converter_str_fallback�connection_timeout�unix_socket�ssl_ca�ssl_cert�ssl_key�ssl_verify_cert�ssl_verify_identityrp�tls_versions�tls_ciphersuites�loop�
Optional[str]rKrI�
Optional[int]rRzDict[str, str]z+Optional[Union[str, Callable[[str], None]]]zOptional[MySQLConverter]zOptional[bool]zOptional[List[str]]z#Optional[asyncio.AbstractEventLoop]c)*Cs�||_||_||_||_||_||_||_||_| |_||_	||_
|
|_||_||_
||_||_||_t�|_d|_d|_|	|_|
|_d|_|&|_|!|_|"|_|#|_|$|_|%|_|'|_|(|_||_ d|_!d|_"|)p�t#�$�|_%|p�t&�'�|_(|t)�*�|_+i|_,d|_-g|_.t/�|_0|�pt1|_2||_3||_4||_5||_6||_7||_8||_9||_:||_;d|_<d|_=d|_>d|_?d|_@d|_A||_Bd|_C|�D�dS)NFT)E�_userZ	_password�_host�_portZ	_databaseZ
_password1Z
_password2Z
_password3�_unix_socketZ_connection_timeout�_connection_attrs�	_compress�_consume_results�_autocommit�
_time_zone�	_sql_mode�
_init_commandrD�	_protocol�_socket�_charset�
_charset_name�_charset_collation�_ssl_active�
_ssl_disabled�_ssl_ca�	_ssl_cert�_ssl_keyZ_ssl_verify_certZ_ssl_verify_identity�
_tls_versions�_tls_ciphersuites�_auth_plugin�_auth_plugin_class�
_handshake�asyncioZget_event_loop�_loopr)�get_default�
_client_flags�weakref�WeakSet�_cursors�_query_attrsZ_query_attrs_supportedZ
_columns_descrAZ_authenticatorr*�_converter_class�_converter_str_fallback�_kerberos_auth_mode�_krb_service_principal�_allow_local_infile�_allow_local_infile_in_path�
_get_warningsr�Z	_buffered�_raw�_have_next_result�_unread_result�_use_unicode�_in_transactionZ_oci_config_fileZ_oci_config_profile�_webauthn_callback�	converter�_validate_connection_options)*rerqrrrsrtrurvrwrxrOryrPrzr{r|r}r~rr�r�r�r�r�r�r�r�r�rmrnr�r�r�r�r�r�r�r�r�rpr�r�r�rZrZr[�__init__�s~/
�
�z MySQLConnectionAbstract.__init__rUc�s|��s|��IdH|SrW)�is_socket_connected�connect�rerZrZr[�
__aenter__sz"MySQLConnectionAbstract.__aenter__�Optional[Type[BaseException]]�Optional[BaseException]�Optional[TracebackType]rT��exc_type�	exc_value�	tracebackrVc�s|��IdHdSrW��close�rer�r�r�rZrZr[�	__aexit__sz!MySQLConnectionAbstract.__aexit__c
Csr|jrFz|j��|_Wn.tyD}ztd�|�WYd}~n
d}~00|jrZ|�tjg�|jr�tj	�
|j�}|r�tj	�|�r�tj	�|�r�tj	�
|�r�td��|js�|jr�|�tjg�n|�tjg�|jdkr�td|j�d���|jr�tjdkr�d|_|j�r|jd	k�rtd
��t|jt��s.td��t|j|j|jg��r�t|j|jg��s^td��|jdu|jduk�r|td
��|jdu�r�|��|jdu�r�|� �t|j!t"��s�td��|j!�#�D]�\}}|t$v�rڐq�t|t%��s�td|�d|j!�d���t&|�dk�rtd|�d���|�'d��r0td��t|t%��sRtd|�d|�d���t&|�dk�r�td|�d|�d����q�|j(tj)@�r�|�*�|j+�r�t|j+t%��s�td��|j+�,�}|dk�r�tjdk�r�td��d|_-n|d k�r�d!|_-ntd"��|j.�rVt|j.t%��stt/j0d#d$���|j.d%k�r:tt/j0d&d$���d'|j.v�rVtt/j0d(d$���|j1�rn|�2d)|j1d*�dS)+zValidate connection options.z'user' must be a stringNz.allow_local_infile_in_path must be a directoryZauthentication_webauthn_client�'z5' cannot be used as the default authentication pluginrGTZmysql_clear_passwordzFClear password authentication is not supported over insecure  channelsz'TCP/IP port number should be an integerz:ssl_key and ssl_cert need to be both specified, or neitherz4ssl_key and ssl_cert need to be both set, or neitherzconn_attrs must be of type dictz+Attribute name should be a string, found: 'z' in '� zAttribute name 'z"' exceeds 32 characters limit size�_zNKey names in connection attributes cannot start with '_', found: '{attr_name}'zAttribute 'z
' value: 'z' must be a string typeiz$' exceeds 1024 characters limit sizez('kerberos_auth_mode' must be of type strZsspi�ntz6'kerberos_auth_mode=SSPI' is only available on WindowsZMySQLSSPIKerberosAuthPluginZgssapiZMySQLKerberosAuthPluginz@Invalid 'kerberos_auth_mode' mode. Please use 'SSPI' or 'GSSAPI'zis not a string)�errorrlzcan not be an empty string�/zis incorrectly formattedZwebauth_callbackr@)3r��strip�AttributeErrorr��set_client_flagsr)ZCOMPRESSr��os�path�abspath�exists�isdir�islinkr�ZLOCAL_FILESr�r-r��namer��
isinstancer�rI�anyr�r�r��allr��_validate_tls_versionsr��_validate_tls_ciphersuitesr��dict�itemsr$rK�len�
startswithr�ZCONNECT_ARGS�_add_default_conn_attrsr��lowerr�r�r�formatr��_validate_callable)re�errZinfile_in_path�	attr_name�
attr_valuer�rZrZr[r�s� �
�
�
�
����
���
����

�
�
���
�z4MySQLConnectionAbstract._validate_connection_optionscCs�g}|j}t|t�r||�d�r(|�d�s8td|�d���|dd��d�}|sVtd��|D]}|����}|rZ|�	|�qZn.t|t
tf�r�d	d
�|D�}ntd|�d���|jdur�t
dd�n|jdd�}|jd
d�|d}ggg}i}g}	t
dt
�|�d�D]"}
|�t|
�|	�t|
��q|D]�}d|v�rv||	v�rv|tdv�rf|d�	|�n|d�	|�nt||v�r�||}||v�r�ttjd|d���|tdv�r�|d�	||�n|d�	||�ntd|�d����q0|d�s
|d�s
td��|dD](}
|
td��v�rtd|
�d����q|dD](}
|
td��v�rDtd|
�d����qDd�|d�d�|d�g|_dS)z&Validates the tls_ciphersuites option.�[�]z)tls_ciphersuites must be a list, found: 'r�r@����,z6No valid cipher suite found in 'tls_ciphersuites' listcSsg|]}|r|�qSrZrZ)rX�tls_csrZrZr[�
<listcomp>�r]zFMySQLConnectionAbstract._validate_tls_ciphersuites.<locals>.<listcomp>zItls_ciphersuites should be a list with one or more ciphersuites. Found: 'NT)�reverser�-�TLSv1.3r���list�valuezThe value 'z1' in tls_ciphersuites is not a valid cipher suitez:No valid cipher suite found in the 'tls_ciphersuites' listzTLSv1.2zCipher z( when used with TLSv1.2 is unacceptable.z( when used with TLSv1.3 is unacceptable.�:)r�r�rKr��endswithr��splitr��upper�appendr�setr�r(�sort�index�updater'�extendr&rr�r1�valuesr/�join)rer�r�Ztls_cssZ_tls_csr�Z
newer_tls_verZtranslated_namesZiani_cipher_suites_namesZossl_cipher_suites_names�tls_verr�Ztranslated_nameZcipher_as_osslrZrZr[r��s�

����"�

��
��
�
��z2MySQLConnectionAbstract._validate_tls_ciphersuitescCs�g}|j}t|t�r�|�d�r(|�d�s8td|�d���|dd��d�}|D]:}|��}|dkrdqN||vr~ttj	d	|d
���|�
|�qN|dgkr�ts�tt�	|t
���n�t|t�r�|s�td��|D](}||vr�ttj	d	|d
���|�
|�q�n@t|t��r|D]}|�
|��qntd
d�t
��d|�d���|�s>td��g}g}g}|D]:}|t
v�rf|�
|�|tv�r||�
|�n
|�
|��qN|�r�|dgk�r�t�s�tt�	|t
���||_n.|�r�tt�	|t
���n|�r�tt�	|t
���dS)z"Validates the tls_versions option.r�r�z%tls_versions must be a list, found: 'r�r@r�r�rlr�rrzJAt least one TLS protocol version must be specified in 'tls_versions' listz>tls_versions should be a list with one or more of versions in z, z
. found: 'zdAt least one TLS protocol version must be specified in 'tls_versions' list when this option is givenN)r�r�rKr�rr�rr�rr�rr r!r(rr	rr2r/r#r")rer�Ztls_versionZtls_versrZuse_tls_versionsZunacceptable_tls_versionsZinvalid_tls_versionsrZrZr[r�s�

���
�
�������



���z.MySQLConnectionAbstract._validate_tls_versionsrzUnion[str, Callable])�option_name�callback�num_argsrVc
Cs�t|t�rHzt|�}Wn0tyF}zt|��|�WYd}~n
d}~00t|�s`td|�d���tt|�j�}||kr�td|�d|�d|����dS)a�Validates if it's a Python callable.

         Args:
             option_name (str): Connection option name.
             callback (str or callable): The fully qualified path to the callable or
                                         a callable.
             num_args (int): Number of positional arguments allowed.

        Raises:
             ProgrammingError: If `callback` is not valid or wrong number of positional
                               arguments.

        .. versionadded:: 8.2.0
        NzExpected a callable for 'r�z' requires z4 positional argument, but the callback provided has )	r�rKr?�
ValueErrorr0�callabler�r
�
parameters)rrrr�Z
num_paramsrZrZr[r�Ss
"��z*MySQLConnectionAbstract._validate_callablecCsdS)zMySQL connection ID.NrZr�rZrZr[�
connection_idvsz%MySQLConnectionAbstract.connection_idcCs|jS)z$User used while connecting to MySQL.)r�r�rZrZr[rq{szMySQLConnectionAbstract.usercCs|jS)z MySQL server IP address or name.)r�r�rZrZr[�server_host�sz#MySQLConnectionAbstract.server_hostcCs|jS)zMySQL server TCP/IP port.)r�r�rZrZr[�server_port�sz#MySQLConnectionAbstract.server_portcCs|jS)z MySQL Unix socket file location.)r�r�rZrZr[r��sz#MySQLConnectionAbstract.unix_socketcCstd��dS)�Get the current database.zoThe use of async properties are not supported by Python. Use `await get_database()` to get the database insteadN�r0r�rZrZr[ru�s�z MySQLConnectionAbstract.database)rrVcCstd��dS)�Set the current database.zsThe use of async properties are not supported by Python. Use `await set_database(name)` to set the database insteadNr�rerrZrZr[ru�s�c�s|�d�IdH}|dS)rzSELECT DATABASE()Nr��
info_query)re�resultrZrZr[�get_database�sz$MySQLConnectionAbstract.get_databasec�s|�d|���IdHdS)rzUSE N)�	cmd_queryrrZrZr[�set_database�sz$MySQLConnectionAbstract.set_databasecCs|jS)z"Returns whether to consume results)r�r�rZrZr[�can_consume_results�sz+MySQLConnectionAbstract.can_consume_resultscCst|t�sJ�||_dS)zSet if can consume results.N)r�rRr�rrZrZr[r$�scCs|jS)z(MySQL session has started a transaction.)r�r�rZrZr[�in_transaction�sz&MySQLConnectionAbstract.in_transactionzasyncio.AbstractEventLoopcCs|jS)zReturn the event loop.)r�r�rZrZr[r��szMySQLConnectionAbstract.loopcCs|jp|jduotS)z&Return True if is a secure connection.N)r�r��IS_POSIXr�rZrZr[�	is_secure�sz!MySQLConnectionAbstract.is_securez$List[Tuple[str, BinaryProtocolType]]cCst|j���S)zReturns query attributes list.)rr�r�r�rZrZr[�query_attrs�sz#MySQLConnectionAbstract.query_attrscCs|jS)zReturn if have next result.)r�r�rZrZr[�have_next_result�sz(MySQLConnectionAbstract.have_next_resultcCstd��dS)�$Get whether autocommit is on or off.zsThe use of async properties are not supported by Python. Use `await get_autocommit()` to get the autocommit insteadNrr�rZrZr[r}�s�z"MySQLConnectionAbstract.autocommitcCstd��dS)�Toggle autocommit.zxThe use of async properties are not supported by Python. Use `await set_autocommit(value)` to set the autocommit insteadNrrrZrZr[r}�s�c�s|�d�IdH}|ddkS)r*zSELECT @@session.autocommitNrr@rrrZrZr[�get_autocommit�sz&MySQLConnectionAbstract.get_autocommitc�s,|rdnd}|�d|���IdH||_dS)r+�ONZOFFzSET @@session.autocommit = N)r"r�)rer�switchrZrZr[�set_autocommit�sz&MySQLConnectionAbstract.set_autocommitcCstd��dS)�Gets the current time zone.zqThe use of async properties are not supported by Python. Use `await get_time_zone()` to get the time zone insteadNrr�rZrZr[r~�s�z!MySQLConnectionAbstract.time_zonecCstd��dS)�Sets the time zone.zxThe use of async properties are not supported by Python. Use `await get_autocommit(value)` to get the autocommit insteadNrrrZrZr[r~�s�c�s|�d�IdH}|dS)r0zSELECT @@session.time_zoneNrrrrZrZr[�
get_time_zone�sz%MySQLConnectionAbstract.get_time_zonec�s"|�d|�d��IdH||_dS)r1zSET @@session.time_zone = 'r�N)r"r�rrZrZr[�
set_time_zone�sz%MySQLConnectionAbstract.set_time_zonec�std��dS)�Gets the SQL mode.zoThe use of async properties are not supported by Python. Use `await get_sql_mode()` to get the SQL mode insteadNrr�rZrZr[r�s�z MySQLConnectionAbstract.sql_modezUnion[str, Sequence[int]]c�std��dS)�Sets the SQL mode.

        This method sets the SQL Mode for the current connection. The value
        argument can be either a string with comma separate mode names, or
        a sequence of mode names.

        It is good practice to use the constants class `SQLMode`:
        ```
        >>> from mysql.connector.constants import SQLMode
        >>> cnx.sql_mode = [SQLMode.NO_ZERO_DATE, SQLMode.REAL_AS_FLOAT]
        ```
        ztThe use of async properties are not supported by Python. Use `await set_sql_mode(value)` to set the SQL mode insteadNrrrZrZr[r�	s�c�s&|jdur |�d�IdHd|_|jS)r4NzSELECT @@session.sql_moder)r�rr�rZrZr[�get_sql_modes
z$MySQLConnectionAbstract.get_sql_modec�s:t|ttf�rd�|�}|�d|�d��IdH||_dS)r5r�zSET @@session.sql_mode = 'r�N)r�rrcrr"r�rrZrZr[�set_sql_mode"s

z$MySQLConnectionAbstract.set_sql_modecCs|jS)z�Get whether this connection retrieves warnings automatically.

        This method returns whether this connection retrieves warnings automatically.
        )r�r�rZrZr[r�4sz$MySQLConnectionAbstract.get_warningscCst|t�std��||_dS)aSet whether warnings should be automatically retrieved.

        The toggle-argument must be a boolean. When True, cursors for this connection
        will retrieve information about warnings (if any).

        Raises:
            ValueError: When the value is not a bool type.
        �Expected a boolean typeN)r�rRrr�rrZrZr[r�<s

cCs|jS)z�Get whether this connection raises an error on warnings.

        This method returns whether this connection will raise errors when MySQL
        reports warnings.
        )�_raise_on_warningsr�rZrZr[r�Jsz)MySQLConnectionAbstract.raise_on_warningscCs&t|t�std��||_|r"||_dS)a�Set whether warnings raise an error.

        The toggle-argument must be a boolean. When True, cursors for this connection
        will raise an error when MySQL reports warnings.

        Raising on warnings implies retrieving warnings automatically.
        In other words: warnings will be set to True. If set to False, warnings will
        be also set to False.

        Raises:
            ValueError: When the value is not a bool type.
        r8N)r�rRrr9r�rrZrZr[r�Ss

cCs|jS)z�Get whether there is an unread result.

        This method is used by cursors to check whether another cursor still needs to
        retrieve its result set.
        )r�r�rZrZr[�
unread_resulthsz%MySQLConnectionAbstract.unread_resultcCst|t�std��||_dS)z�Set whether there is an unread result.

        This method is used by cursors to let other cursors know there is still a
        result set that needs to be retrieved.

        Raises:
            ValueError: When the value is not a bool type.
        r8N)r�rRrr�rrZrZr[r:qs

cCs|jr|jjSdS)aReturn the character set for current connection.

        This property returns the character set name of the current connection.
        The server is queried when the connection is active.
        If not connected, the configured character set name is returned.
        �utf8�r�r�r�rZrZr[rOszMySQLConnectionAbstract.charsetcCs"|jdus|jjdvrdS|jjS)a^Return the Python character set for current connection.

        This property returns the character set name of the current connection.
        Note that, unlike property charset, this checks if the previously set
        character set is supported by Python and if not, it returns the equivalent
        character set that Python supports.
        N)Zutf8mb4Zutf8mb3�binaryr;r<r�rZrZr[�python_charset�s	z&MySQLConnectionAbstract.python_charsetcCsdS)z&Add the default connection attributes.NrZr�rZrZr[r��sz/MySQLConnectionAbstract._add_default_conn_attrsr9)�queryrVc�sdS)z�Execute a query.

        This method simply calls cmd_query() after checking for unread result. If there
        are still unread result, an InterfaceError is raised. Otherwise whatever
        cmd_query() returns is returned.
        NrZ)rer?rZrZr[�_execute_query�sz&MySQLConnectionAbstract._execute_queryc�sr|�|jj�IdH|�|j�IdH|jr>|�|j�IdH|jrV|�|j�IdH|j	rn|�
|j	�IdHdS)z�Executes commands after connection has been established.

        This method executes commands after the connection has been established.
        Some setting like autocommit, character set, and SQL mode are set using this
        method.
        N)�set_charset_collationr�Z
charset_idr/r�r�r3r�r7r�r@r�rZrZr[�_post_connection�sz(MySQLConnectionAbstract._post_connectionzOptional[Union[int, str]])rOryrVc�s\d}t|ttf�s(|dur(t|�d���t|t�sB|durBtd��|rt|rtt|t�r`t�|�jn|}t�||�|_	nj|r�t|t�r�t�|�|_	q�t|t�r�t�
|�|_	q�t|�d���n&|r�t�|�|_	ntd}t�
|�|_	|j	j|_
|j	j|_|�d|j	j�d|j	j�d��IdHz|�|j	j�Wnt�y>Yn0|j�rX|j�|j	j�dS)a�Set the character set and collation for the current connection.

        This method sets the character set and collation to be used for the current
        connection. The charset argument can be either the name of a character set as
        a string, or the numerical equivalent as defined in constants.CharacterSet.

        When the collation is not given, the default will be looked up and used.

        Args:
            charset: Can be either the name of a character set, or the numerical
                     equivalent as defined in `constants.CharacterSet`.
            collation: When collation is `None`, the default collation for the
                       character set is used.

        Examples:
            The following will set the collation for the latin1 character set to
            `latin1_general_ci`:
            ```
            >>> cnx = mysql.connector.connect(user='scott')
            >>> cnx.set_charset_collation('latin1', 'latin1_general_ci')
            ```
        z+{} should be either integer, string or NoneNrOz)collation should be either string or NonezSET NAMES 'z' COLLATE 'r�)r�rIrKrr�rCZ	get_by_idr�Zget_by_name_and_collationr�Zget_by_nameZget_by_collationr%r�ryr�r"Zset_character_set_namer�r��set_charset)rerOry�err_msgZcharset_strrZrZr[rA�s@��



�
z-MySQLConnectionAbstract.set_charset_collation)�flagrVcCs|j|@dkS)z|Checks if a client flag is set.

        Returns:
            `True` if the client flag was set, `False` otherwise.
        r)r�)rerErZrZr[�isset_client_flag�sz)MySQLConnectionAbstract.isset_client_flag)r�rVcCs
||_dS)zySet the path that user can upload files.

        Args:
            path (str): Path that user can upload files.
        N)r�)rer�rZrZr[�set_allow_local_infile_in_pathsz6MySQLConnectionAbstract.set_allow_local_infile_in_pathcCs|S)z�Return self for weakref.proxy.

        This method is used when the original object is needed when using
        weakref.proxy.
        rZr�rZrZr[�get_selfsz MySQLConnectionAbstract.get_selfzOptional[Tuple[int, ...]]cCs|jjS)z�Gets the MySQL version.

        Returns:
            The MySQL server version as a tuple. If not previously connected, it will
            return `None`.
        )Z_server_inforLr�rZrZr[�get_server_versionsz*MySQLConnectionAbstract.get_server_versionc	Cs*z|jdWSttfy$YdS0dS)z�Gets the original MySQL version information.

        Returns:
            The original MySQL server as text. If not previously connected, it will
            return `None`.
        Zserver_version_originalN)r��	TypeError�KeyErrorr�rZrZr[�get_server_infosz'MySQLConnectionAbstract.get_server_infocCsdS)z�Reports whether the socket is connected.

        Instead of ping the server like ``is_connected()``, it only checks if the
        socket connection flag is set.
        NrZr�rZrZr[r�(sz+MySQLConnectionAbstract.is_socket_connectedc�sdS)aReports whether the connection to MySQL Server is available.

        This method checks whether the connection to MySQL is available.
        It is similar to ``ping()``, but unlike the ``ping()`` method, either `True`
        or `False` is returned and no exception is raised.
        NrZr�rZrZr[�is_connected0sz$MySQLConnectionAbstract.is_connectedr@)�	reconnect�attempts�delayrVc�sdS)aCheck availability of the MySQL server.

        When reconnect is set to `True`, one or more attempts are made to try to
        reconnect to the MySQL server using the ``reconnect()`` method.

        ``delay`` is the number of seconds to wait between each retry.

        When the connection is not available, an InterfaceError is raised. Use the
        ``is_connected()`` method if you just want to check the connection without
        raising an error.

        Raises:
            InterfaceError: On errors.
        NrZ)rerNrOrPrZrZr[�ping9szMySQLConnectionAbstract.pingzUnion[int, Sequence[int]])�flagsrVcCsnt|t�r|dkr||_nNt|ttf�r`|D]0}|dkrN|jt|�M_q,|j|O_q,ntd��|jS)a�Set the client flags.

        The flags-argument can be either an int or a list (or tuple) of ClientFlag
        values. If it is an integer, it will set client_flags to flags as is.
        If flags is a list or tuple, each flag will be set or unset when it's negative.

        set_client_flags([ClientFlag.FOUND_ROWS,-ClientFlag.LONG_FLAG])

        Raises:
            ProgrammingError: When the flags argument is not a set or an integer bigger
                              than 0.
        rz+set_client_flags expect integer (>0) or set)r�rIr�rcr�absr0)rerRrErZrZr[r�Ls
z(MySQLConnectionAbstract.set_client_flagszOptional[Type[MySQLConverter]])�	convclassrVcCs>|r2t|t�r2||_||jj|j�|_|j|j_nt	d��dS)z�Set the converter class to be used.

        This should be a class overloading methods and members of
        conversion.MySQLConverter.

        Raises:
            TypeError: When the class is not a subclass of `conversion.MySQLConverter`.
        zAConverter class should be a subclass of conversion.MySQLConverterN)
�
issubclassr+r�r�r�r�r�r�Zstr_fallbackrJ)rerTrZrZr[�set_converter_classes	�z+MySQLConnectionAbstract.set_converter_classzTuple[str, BinaryProtocolType]cCs |\}}||jvr||j|<dS)aAdd element to the query attributes list on the connector's side.

        If an element in the query attributes list already matches
        the attribute name provided, the new element will NOT be added.

        Args:
            value: key-value as a 2-tuple.
        N�r�)rerr�r�rZrZr[�query_attrs_appendws	
z*MySQLConnectionAbstract.query_attrs_appendr3�r�rVcCs|j�|d�S)z�Remove element by name from the query attributes list.

        If no match, `None` is returned, else the corresponding value is returned.

        Args:
            name: key name.
        N)r��pop�rer�rZrZr[�query_attrs_remove�sz*MySQLConnectionAbstract.query_attrs_removecCs
i|_dS)z5Clears query attributes list on the connector's side.NrWr�rZrZr[�query_attrs_clear�sz)MySQLConnectionAbstract.query_attrs_clearc�s(|jr|��IdHn|jr$td��dS)z�Handle unread result.

        Consume pending results if is configured for it.

        Raises:
            InternalError: When there are pending results and they were not consumed.
        NzUnread result found)r�r|r:r.r�rZrZr[�handle_unread_result�sz,MySQLConnectionAbstract.handle_unread_resultc�s|jr|��IdHdS)zConsume pending results.N)r:�get_rowsr�rZrZr[r|�sz'MySQLConnectionAbstract.consume_resultsr<�Optional[RowType]c	�sh|jdd�IdH4IdH�4}|�|�IdH|��IdHWd�IdHS1IdHsZ0YdS)z&Send a query which only returns 1 row.T)r�N)�cursor�execute�fetchone)rer?rarZrZr[r�sz"MySQLConnectionAbstract.info_queryr)rarVcCs|j�|�dS)zAdd cursor to the weakref set.N)r��add�rerarZrZr[�
add_cursor�sz"MySQLConnectionAbstract.add_cursorcCs|j�|�dS)z#Remove cursor from the weakref set.N)r��removererZrZr[�
remove_cursor�sz%MySQLConnectionAbstract.remove_cursorc�sdS)zConnect to the MySQL server.NrZr�rZrZr[r��szMySQLConnectionAbstract.connect)rOrPrVc
�s�d}||kr�|d}z2|��IdH|��IdH|��IdHrDWq�WnJttfy�}z.||kr|d|�d|��}t|�|�WYd}~n
d}~00|dkrt�|�IdHqdS)a�Attempts to reconnect to the MySQL server.

        The argument `attempts` should be the number of times a reconnect is tried.
        The `delay` argument is the number of seconds to wait between each retry.

        You may want to set the number of attempts higher and use delay when you expect
        the MySQL server to be down for maintenance or when you expect the network to
        be temporary unavailable.

        Args:
            attempts: Number of attempts to make when reconnecting.
            delay: Use it (defined in seconds) if you want to wait between each retry.

        Raises:
            InterfaceError: When reconnection fails.
        rr@Nz!Can not reconnect to MySQL after z
 attempt(s): )�
disconnectr�rMr,�IOErrorr-r��sleep)rerOrP�counterr��msgrZrZr[rN�s"�� z!MySQLConnectionAbstract.reconnectrc�st�dS)akShuts down connection to MySQL Server.

        This method closes the socket. It raises no exceptions.

        Unlike `disconnect()`, `shutdown()` closes the client connection without
        attempting to send a `QUIT` command to the server first. Thus, it will not
        block if the connection is disrupted for some reason such as network failure.
        N)�NotImplementedErrorr�rZrZr[�shutdown�s	z MySQLConnectionAbstract.shutdownc�sdS)a�Close the connection.

        It closes any opened cursor associated to this connection, and closes the
        underling socket connection.

        `MySQLConnection.close()` is a synonymous for `MySQLConnection.disconnect()`
        method name and more commonly used.

        This method tries to send a `QUIT` command and close the socket. It raises
        no exceptions.
        NrZr�rZrZr[r��szMySQLConnectionAbstract.closezCallable[[], Any]riz#Optional[Type[MySQLCursorAbstract]])r�r��prepared�cursor_class�
dictionary�named_tuplerVc�sdS)a�Instantiate and return a cursor.

        By default, MySQLCursor is returned. Depending on the options while
        connecting, a buffered and/or raw cursor is instantiated instead.
        Also depending upon the cursor options, rows can be returned as dictionary or
        named tuple.

        It is possible to also give a custom cursor through the cursor_class
        parameter, but it needs to be a subclass of
        mysql.connector.aio.abstracts.MySQLCursorAbstract.

        Raises:
            ProgrammingError: When cursor_class is not a subclass of
                              CursorBase.
            ValueError: When cursor is not available.
        NrZ)rer�r�rprqrrrsrZrZr[ra�s
zMySQLConnectionAbstract.cursor�Optional[List[DescriptionType]]z1Tuple[Optional[RowType], Optional[EofPacketType]])r=�columnsr�rVc�sdS)a3Get the next rows returned by the MySQL server.

        This method gets one row from the result set after sending, for example, the
        query command. The result is a tuple consisting of the row and the EOF packet.
        If no row was available in the result set, the row data will be None.
        NrZ)rer=rur�rZrZr[�get_rowszMySQLConnectionAbstract.get_rowr
z-Tuple[List[RowType], Optional[EofPacketType]])�countr=rur��	prep_stmtrVc�sdS)z�Get all rows returned by the MySQL server.

        This method gets all rows returned by the MySQL server after sending, for
        example, the query command. The result is a tuple consisting of a list of rows
        and the EOF packet.
        NrZ)rerwr=rur�rxrZrZr[r_s	z MySQLConnectionAbstract.get_rowsc�sdS)zCommit current transaction.NrZr�rZrZr[�commit-szMySQLConnectionAbstract.commitc�sdS)zRollback current transaction.NrZr�rZrZr[�rollback1sz MySQLConnectionAbstract.rollbackc�sdS)z�Resets the session state without re-authenticating.

        Reset command only works on MySQL server 5.7.3 or later.
        The result is True for a successful reset otherwise False.
        NrZr�rZrZr[�cmd_reset_connection5sz,MySQLConnectionAbstract.cmd_reset_connectionr7)rurVc�sdS)z�Change the current database.

        This method changes the current (default) database by sending the INIT_DB
        command. The result is a dictionary containing the OK packet infawaitormation.
        NrZ)rerurZrZr[�cmd_init_db=sz#MySQLConnectionAbstract.cmd_init_db)r?r�r��
raw_as_stringrVc�sdS)a�Send a query to the MySQL server.

        This method send the query to the MySQL server and returns the result.

        If there was a text result, a tuple will be returned consisting of the number
        of columns and a list containing information about these columns.

        When the query doesn't return a text result, the OK or EOF packet information
        as dictionary will be returned. In case the result was an error, exception
        Error will be raised.
        NrZ)rer?r�r�r}rZrZr[r"Esz!MySQLConnectionAbstract.cmd_queryz!Generator[ResultType, None, None])�
statementsrVc�sdS)acSend one or more statements to the MySQL server.

        Similar to the cmd_query method, but instead returns a generator
        object to iterate through results. It sends the statements to the
        MySQL server and through the iterator you can get the results.

        statement = 'SELECT 1; INSERT INTO t1 VALUES (); SELECT 2'
        for result in await cnx.cmd_query(statement, iterate=True):
            if 'columns' in result:
                columns = result['columns']
                rows = await cnx.get_rows()
            else:
                # do something useful with INSERT result
        NrZ)rer~rZrZr[�cmd_query_iterYsz&MySQLConnectionAbstract.cmd_query_iter)�statement_id�rowsrVc�sdS)z�Fetch a MySQL statement Result Set.

        This method will send the FETCH command to MySQL together with the given
        statement id and the number of rows to fetch.
        NrZ)rer�r�rZrZr[�cmd_stmt_fetchksz&MySQLConnectionAbstract.cmd_stmt_fetchrQz/Mapping[str, Union[int, List[DescriptionType]]])�	statementrVc�sdS)z�Prepare a MySQL statement.

        This method will send the PREPARE command to MySQL together with the given
        statement.
        NrZ)rer�rZrZr[�cmd_stmt_preparessz(MySQLConnectionAbstract.cmd_stmt_preparerZzUnion[int, CMySQLPrepStmt]zSequence[BinaryProtocolType]rz&Optional[Union[Dict[str, Any], Tuple]])r��datarrRrVc�sdS)z#Execute a prepared MySQL statement.NrZ)rer�r�rrRrZrZr[�cmd_stmt_execute}sz(MySQLConnectionAbstract.cmd_stmt_execute)r�rVc�sdS)z}Reset data for prepared statement sent as long data.

        The result is a dictionary with OK packet information.
        NrZ�rer�rZrZr[�cmd_stmt_reset�sz&MySQLConnectionAbstract.cmd_stmt_resetc�sdS)z�Deallocate a prepared MySQL statement.

        This method deallocates the prepared statement using the statement_id.
        Note that the MySQL server does not return anything.
        NrZr�rZrZr[�cmd_stmt_close�sz&MySQLConnectionAbstract.cmd_stmt_close)�optionsrVc�sdS)a�Send the Refresh command to the MySQL server.

        This method sends the Refresh command to the MySQL server. The options
        argument should be a bitwise value using constants.RefreshOption.

        Usage example:
           RefreshOption = mysql.connector.RefreshOption
           refresh = RefreshOption.LOG | RefreshOption.INFO
           cnx.cmd_refresh(refresh)
        NrZ)rer�rZrZr[�cmd_refresh�sz#MySQLConnectionAbstract.cmd_refreshr)r��param_idr�rVc�sdS)aSend data for a column.

        This methods send data for a column (for example BLOB) for statement identified
        by statement_id. The param_id indicate which parameter the data belongs too.
        The data argument should be a file-like object.

        Since MySQL does not send anything back, no error is raised. When the MySQL
        server is not reachable, an OperationalError is raised.

        cmd_stmt_send_long_data should be called before cmd_stmt_execute.

        The total bytes send is returned.
        NrZ)rer�r�r�rZrZr[�cmd_stmt_send_long_data�sz/MySQLConnectionAbstract.cmd_stmt_send_long_datac�sdS)z�Close the current connection with the server.

        Send the QUIT command to the MySQL server, closing the current connection.
        NrZr�rZrZr[�cmd_quit�sz MySQLConnectionAbstract.cmd_quit)�
shutdown_typerVc�sdS)z�Shut down the MySQL Server.

        This method sends the SHUTDOWN command to the MySQL server.
        The `shutdown_type` is not used, and it's kept for backward compatibility.
        NrZ)rer�rZrZr[�cmd_shutdown�sz$MySQLConnectionAbstract.cmd_shutdownr;c�sdS)z�Send the statistics command to the MySQL Server.

        This method sends the STATISTICS command to the MySQL server. The result is a
        dictionary with various statistical information.
        NrZr�rZrZr[�cmd_statistics�sz&MySQLConnectionAbstract.cmd_statistics)�	mysql_pidrVc�sdS)z�Kill a MySQL process.

        This method send the PROCESS_KILL command to the server along with the
        process ID. The result is a dictionary with the OK packet information.
        NrZ)rer�rZrZr[�cmd_process_kill�sz(MySQLConnectionAbstract.cmd_process_killr5c�sdS)a-Send the DEBUG command.

        This method sends the DEBUG command to the MySQL server, which requires the
        MySQL user to have SUPER privilege. The output will go to the MySQL server
        error log and the result of this method is a dictionary with EOF packet
        information.
        NrZr�rZrZr[�	cmd_debug�sz!MySQLConnectionAbstract.cmd_debugc�sdS)z�Send the PING command.

        This method sends the PING command to the MySQL server. It is used to check
        if the the connection is still valid. The result of this method is dictionary
        with OK packet information.
        NrZr�rZrZr[�cmd_ping�sz MySQLConnectionAbstract.cmd_ping)NNN)r)NN)Fr@r)r@r)NNNNNN)FNN)NFNNN)FFF)r@)rZrZr)N)^rgrhrirjr%r�r�r�r�r�r��staticmethodr��propertyrrrqrrr�ru�setterr!r#r$r%r�r'r(r)r}r,r/r~r2r3r�r6r7r�r�r:rOr>r�r@rBrArFrGrHrIrLr�rMrQr�rVrXr\r]r^r|rrfrhr�rNror�rirkrarvr_ryrzr{r|r"rr�r�r�r�r�r�r�r�r�r�r�r�r�rZrZrZr[r�s�
��bs�
]Q�"

	�C		�


#
��
��	�		rc@s�eZdZdZdd�dd�Zdd�dd�Zdcd
ddd
d�dd�Zdd�dd�Zdd�dd�Ze	dd�dd��Z
e	dd�dd��Ze	dd�dd��Ze	d d�d!d"��Z
d d�d#d$�Ze	dd�d%d&��Ze	d'd�d(d)��Ze	d*d�d+d,��Ze	d-d�d.d/��Zed0d�d1d2��Zeddd5d6d-d
d7�d8d9��Zded5d6d:d;�d<d=�Zed>d?d
d@�dAdB��ZedCd�dDdE��ZedFd�dGdH��ZedfddJdK�dLdM��Zed-d�dNdO��Zdd�dPdQ�Zdgd-dSdT�dUdV�ZdWd�dXdY�Zd>dZd
d[�d\d]�Zd>dZd^�d_d`�Z d
d�dadb�Z!d	S)hrz#Defines the MySQL cursor interface.r)�
connectioncCsf||_|j|_d|_d|_d|_d|_d|_g|_g|_	d|_
d|_d|_d|_
d|_|j�|�dS)NrFr�)NNr@)�_connectionr�r��_description�_last_insert_id�	_warnings�_warning_count�	_executedZ_executed_listZ_stored_results�_binaryr��	_rowcountZ_nextrowZ	arraysizerf)rer�rZrZr[r��szMySQLCursorAbstract.__init__rUc�s|SrWrZr�rZrZr[r��szMySQLCursorAbstract.__aenter__Nr�r�r�rTr�c�s|��IdHdSrWr�r�rZrZr[r�szMySQLCursorAbstract.__aexit__zIterator[RowType]c�s|S)z�Iterate over result set.

        Iteration over the result set which calls self.fetchone()
        and returns the next row.
        rZr�rZrZr[�	__aiter__	szMySQLCursorAbstract.__aiter__r:c�s8z|��IdH}Wnty*td�Yn0|s4t�|S)zm
        Used for iterating over the result set. Calles self.fetchone()
        to get the next row.
        N)rcr-�StopAsyncIteration)re�rowrZrZr[�__next__szMySQLCursorAbstract.__next__rtcCs|jS)a�Return description of columns in a result.

        This property returns a list of tuples describing the columns in in a result
        set. A tuple is described as follows:

                (column_name,
                 type,
                 None,
                 None,
                 None,
                 None,
                 null_ok,
                 column_flags)  # Addition to PEP-249 specs

        Returns a list of tuples.
        )r�r�rZrZr[�descriptionszMySQLCursorAbstract.descriptionrIcCs|jS)a�Return the number of rows produced or affected.

        This property returns the number of rows produced by queries such as a
        SELECT, or affected rows when executing DML statements like INSERT or UPDATE.

        Note that for non-buffered cursors it is impossible to know the number of rows
        produced before having fetched them all. For those, the number of rows will
        be -1 right after execution, and incremented when fetching rows.
        )r�r�rZrZr[�rowcount2szMySQLCursorAbstract.rowcountr�cCs|jS)z�Return the value generated for an AUTO_INCREMENT column.

        Returns the value generated for an AUTO_INCREMENT column by the previous
        INSERT or UPDATE statement or None when there is no such value available.
        �r�r�rZrZr[�	lastrowid?szMySQLCursorAbstract.lastrowidzOptional[List[WarningType]]cCs|jS)zReturn warnings.�r�r�rZrZr[�warningsHszMySQLCursorAbstract.warningscCs|jS)zReturns Warnings.r�r�rZrZr[�
fetchwarningsMsz!MySQLCursorAbstract.fetchwarningscCs|jS)z�Return the number of warnings.

        This property returns the number of warnings generated by the previously
        executed operation.
        )r�r�rZrZr[�
warning_countQsz!MySQLCursorAbstract.warning_countzTuple[str, ...]cCs |jst�Stdd�|jD��S)z[Returns column names.

        This property returns the columns names as a tuple.
        css|]}|dVqdS)rNrZ)rX�drZrZr[r\br]z3MySQLCursorAbstract.column_names.<locals>.<genexpr>)r�rcr�rZrZr[�column_namesZsz MySQLCursorAbstract.column_namesr�c	CsD|jdurdSz|j����WSttfy>|j��YS0dS)z�Returns the executed statement

        This property returns the executed statement.
        When multiple statements were executed, the current statement in the iterator
        will be returned.
        N)r�r��decoder��UnicodeDecodeErrorr�rZrZr[r�ds
zMySQLCursorAbstract.statementrRcCs
t|j�S)z�Returns whether the cursor could have rows returned.

        This property returns True when column descriptions are available and possibly
        also rows, which will need to be fetched.
        )rRr�r�rZrZr[�	with_rowssszMySQLCursorAbstract.with_rowszIterator[MySQLCursorAbstract]cCsdS)z�Returns an iterator for stored results.

        This method returns an iterator over results which are stored when callproc()
        is called. The iterator will provide MySQLCursorBuffered instances.
        NrZr�rZrZr[�stored_results|sz"MySQLCursorAbstract.stored_resultsrZFr<z$Union[Sequence[Any], Dict[str, Any]])�	operation�params�multirVc�sdS)auExecutes the given operation.

        Executes the given operation substituting any markers with the given
        parameters.

        For example, getting all rows where id is 5:
          await cursor.execute("SELECT * FROM t1 WHERE id = %s", (5,))

        If the `multi`` parameter is used a `ProgrammingError` is raised. The method for
        executing multiple statements is `executemulti()`.

        If warnings where generated, and connection.get_warnings is True, then
        self._warnings will be a list containing these warnings.

        Raises:
            ProgramingError: If multi parameter is used.
        NrZ)rer�r�r�rZrZr[rb�szMySQLCursorAbstract.executez)AsyncGenerator[MySQLCursorAbstract, None])r�r�rVc�sdS)z�Execute multiple statements.

        Executes the given operation substituting any markers with the given
        parameters.
        NrZ)rer�r�rZrZr[�executemulti�sz MySQLCursorAbstract.executemultirKzSequence[ParamsSequenceType])r��
seq_paramsrVc�sdS)a=Prepare and execute a MySQL Prepared Statement many times.

        This method will prepare the given operation and execute with each tuple found
        the list seq_params.

        If the cursor instance already had a prepared statement, it is first closed.

        executemany() simply calls execute().
        NrZ)rer�r�rZrZr[�executemany�szMySQLCursorAbstract.executemanyr`c�sdS)z�Return next row of a query result set.

        Raises:
            InterfaceError: If there is no result to fetch.

        Returns:
            tuple or None: A row from query result set.
        NrZr�rZrZr[rc�szMySQLCursorAbstract.fetchonez
List[RowType]c�sdS)z�Return all rows of a query result set.

        Raises:
            InterfaceError: If there is no result to fetch.

        Returns:
            list: A list of tuples with all rows of a query result set.
        NrZr�rZrZr[�fetchall�szMySQLCursorAbstract.fetchallr@zList[Sequence[Any]])�sizerVc�sdS)a<Return the next set of rows of a query result set.

        When no more rows are available, it returns an empty list.
        The number of rows returned can be specified using the size argument, which
        defaults to one.

        Returns:
            list: The next set of rows of a query result set.
        NrZ)rer�rZrZr[�	fetchmany�szMySQLCursorAbstract.fetchmanyc�sdS)zClose the cursor.NrZr�rZrZr[r��szMySQLCursorAbstract.closecCs|jS)z�Return the value generated for an AUTO_INCREMENT column.

        Returns the value generated for an AUTO_INCREMENT column by the previous
        INSERT or UPDATE statement.
        r�r�rZrZr[�getlastrowid�sz MySQLCursorAbstract.getlastrowidTr
)�freerVc�sdS)zReset the cursor to default.NrZ)rer�rZrZr[�reset�szMySQLCursorAbstract.resetz.Optional[List[Tuple[str, BinaryProtocolType]]]cCs(t|d�r|jjSt|d�r$|jjSdS)z�Gets a list of query attributes from the connector's side.

        Returns:
            List of existing query attributes.
        �_cnxr�N)�hasattrr�r(r�r�rZrZr[�get_attributes�s


z"MySQLCursorAbstract.get_attributesr3)r�rrVcCsHt|t�std��|dur4t|t�s4td|�d���|j�||f�dS)a�Add a query attribute and its value into the connector's query attributes.

        Query attributes must be enabled on the server - they are disabled by default. A
        warning is logged when setting query attributes for a server connection
        that does not support them.

        Args:
            name: Key name used to identify the attribute.
            value: A value converted to the MySQL Binary Protocol.

        Raises:
            ProgrammingError: If the value's conversion fails.
        �&Parameter `name` must be a string typeNzObject z$ cannot be converted to a MySQL type)r�rKr0rr�rX)rer�rrZrZr[�
add_attribute�s

�z!MySQLCursorAbstract.add_attributerYcCst|t�std��|j�|�S)a'Removes a query attribute by name from the connector's query attributes.

        If no match, `None` is returned, else the corresponding value is returned.

        Args:
            name: Key name used to identify the attribute.

        Returns:
            value: Attribute's value.
        r�)r�rKr0r�r\r[rZrZr[�remove_attributes
z$MySQLCursorAbstract.remove_attributecCs|j��dS)z<Clears the list of query attributes on the connector's side.N)r�r]r�rZrZr[�clear_attributessz$MySQLCursorAbstract.clear_attributes)NNN)rZF)rZ)r@)T)"rgrhrirjr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rbr�r�rcr�r�r�r�r�r�r�r�r�rZrZrZr[r�sd�
	��

rc@seZdZdZdS)�CMySQLPrepStmtaPStructure to represent a result from `CMySQLConnection.cmd_stmt_prepare`.
    It can be used consistently as a type hint.

    `_mysql_connector.MySQLPrepStmt` isn't available when the C-ext isn't built.

    In this regard, `CmdStmtPrepareResult` acts as a proxy/wrapper entity for a
    `_mysql_connector.MySQLPrepStmt` instance.
    N)rgrhrirjrZrZrZr[r�sr�)^rj�
__future__r�__all__r�r�r`r��abcrr�dataclassesrr	�inspectr
�typesr�typingrr
rrrrrrrrrrrrrrZ	abstractsrrrr r!r"r#�	constantsr$r%r&r'r(r)�
conversionr*r+�errorsr,r-r.r/r0Ztls_ciphersr1r2r3r4r5r6r7r8r9r:r;r<r=�utilsr>r?ZauthenticationrArCrBrJrD�networkrErFr�r&�WeakValueDictionaryrHrkrrrr�rZrZrZr[�<module> sTH$	 4

"X:

Youez - 2016 - github.com/yon3zu
LinuXploit