From 2b21884aac4091a2fb5c34e49a96f8579e3dc161 Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Tue, 19 Nov 2024 18:29:27 -0300 Subject: [PATCH] version: 0.0.5 --- build/lib/evolutionapi/client.py | 43 ++++- build/lib/evolutionapi/models/message.py | 42 +++-- build/lib/evolutionapi/services/message.py | 172 +++++++++++++----- dist/evolutionapi-0.0.4.tar.gz | Bin 9182 -> 0 bytes ...hl => evolutionapi-0.0.5-py3-none-any.whl} | Bin 22951 -> 24142 bytes dist/evolutionapi-0.0.5.tar.gz | Bin 0 -> 10209 bytes evolutionapi.egg-info/PKG-INFO | 2 +- setup.py | 2 +- 8 files changed, 191 insertions(+), 70 deletions(-) delete mode 100644 dist/evolutionapi-0.0.4.tar.gz rename dist/{evolutionapi-0.0.4-py3-none-any.whl => evolutionapi-0.0.5-py3-none-any.whl} (65%) create mode 100644 dist/evolutionapi-0.0.5.tar.gz diff --git a/build/lib/evolutionapi/client.py b/build/lib/evolutionapi/client.py index 991d756..7bfdbd7 100644 --- a/build/lib/evolutionapi/client.py +++ b/build/lib/evolutionapi/client.py @@ -1,4 +1,5 @@ import requests +from requests_toolbelt import MultipartEncoder from .exceptions import EvolutionAuthenticationError, EvolutionNotFoundError, EvolutionAPIError from .services.instance import InstanceService from .services.instance_operations import InstanceOperationsService @@ -62,11 +63,43 @@ class EvolutionClient: response = requests.get(url, headers=self._get_headers(instance_token)) return self._handle_response(response) - def post(self, endpoint: str, data: dict = None, instance_token: str = None): - """Faz uma requisição POST.""" - url = self._get_full_url(endpoint) - response = requests.post(url, headers=self._get_headers(instance_token), json=data) - return self._handle_response(response) + def post(self, endpoint: str, data: dict = None, instance_token: str = None, files: dict = None): + url = f'{self.base_url}/{endpoint}' + headers = self._get_headers(instance_token) + + if files: + # Remove o Content-Type do header quando enviando arquivos + if 'Content-Type' in headers: + del headers['Content-Type'] + + # Prepara os campos do multipart + fields = {} + + # Adiciona os campos do data + for key, value in data.items(): + fields[key] = str(value) if not isinstance(value, (int, float)) else (None, str(value), 'text/plain') + + # Adiciona o arquivo + file_tuple = files['file'] + fields['file'] = (file_tuple[0], file_tuple[1], file_tuple[2]) + + # Cria o multipart encoder + multipart = MultipartEncoder(fields=fields) + headers['Content-Type'] = multipart.content_type + + response = requests.post( + url, + headers=headers, + data=multipart + ) + else: + response = requests.post( + url, + headers=headers, + json=data + ) + + return response.json() def put(self, endpoint, data=None): """Faz uma requisição PUT.""" diff --git a/build/lib/evolutionapi/models/message.py b/build/lib/evolutionapi/models/message.py index 739460f..cd4a82a 100644 --- a/build/lib/evolutionapi/models/message.py +++ b/build/lib/evolutionapi/models/message.py @@ -53,28 +53,34 @@ class MediaMessage(BaseMessage): def __init__( self, number: str, - mediatype: str, - mimetype: str, - caption: str, - media: str, - fileName: str, - delay: Optional[int] = None, + media: dict = None, + mediatype: Optional[str] = None, + caption: str = None, + mimetype: str = None, + fileName: str = None, + delay: Optional[Union[int, float, str]] = None, quoted: Optional[QuotedMessage] = None, mentionsEveryOne: Optional[bool] = None, mentioned: Optional[List[str]] = None ): - super().__init__( - number=number, - mediatype=mediatype, - mimetype=mimetype, - caption=caption, - media=media, - fileName=fileName, - delay=delay, - quoted=quoted.__dict__ if quoted else None, - mentionsEveryOne=mentionsEveryOne, - mentioned=mentioned - ) + data = { + 'number': number, + 'mediatype': mediatype, + 'caption': caption, + 'mimetype': mimetype, + 'fileName': fileName, + 'quoted': quoted.__dict__ if quoted else None, + 'mentionsEveryOne': mentionsEveryOne, + 'mentioned': mentioned + } + + if delay is not None: + data['delay'] = delay + + if media and media != {}: + data['media'] = media + + super().__init__(**{k: v for k, v in data.items() if v is not None}) class StatusMessage(BaseMessage): def __init__( diff --git a/build/lib/evolutionapi/services/message.py b/build/lib/evolutionapi/services/message.py index f151259..79efaae 100644 --- a/build/lib/evolutionapi/services/message.py +++ b/build/lib/evolutionapi/services/message.py @@ -1,70 +1,118 @@ from typing import Union, BinaryIO from ..models.message import * +from requests_toolbelt import MultipartEncoder +import mimetypes +import requests class MessageService: def __init__(self, client): self.client = client def send_text(self, instance_id: str, message: TextMessage, instance_token: str): + # Preparar os dados como JSON + data = { + 'number': message.number, + 'text': message.text + } + + if hasattr(message, 'delay') and message.delay is not None: + data['delay'] = message.delay + + # Usar o método post do cliente que já trata JSON corretamente return self.client.post( f'message/sendText/{instance_id}', - data=message.__dict__, + data=data, instance_token=instance_token ) def send_media(self, instance_id: str, message: MediaMessage, instance_token: str, file: Union[BinaryIO, str] = None): - payload = { - 'data': message.__dict__, - 'instance_token': instance_token + # Preparar os dados do formulário + fields = { + 'number': (None, message.number, 'text/plain'), + 'mediatype': (None, message.mediatype, 'text/plain'), + 'mimetype': (None, message.mimetype, 'text/plain'), + 'caption': (None, message.caption, 'text/plain'), + 'fileName': (None, message.fileName, 'text/plain'), } + # Adicionar delay apenas se existir + if hasattr(message, 'delay') and message.delay is not None: + fields['delay'] = (None, str(message.delay), 'text/plain; type=number') + + # Adicionar o arquivo se fornecido if file: if isinstance(file, str): - with open(file, 'rb') as f: - payload['files'] = {'file': f} + mime_type = mimetypes.guess_type(file)[0] or 'application/octet-stream' + fields['file'] = ('file', open(file, 'rb'), mime_type) else: - payload['files'] = {'file': file} - - return self.client.post( - f'message/sendMedia/{instance_id}', - **payload + fields['file'] = ('file', file, 'application/octet-stream') + + # Criar o multipart encoder + multipart = MultipartEncoder(fields=fields) + + # Preparar os headers + headers = self.client._get_headers(instance_token) + headers['Content-Type'] = multipart.content_type + + # Fazer a requisição diretamente + url = f'{self.client.base_url}/message/sendMedia/{instance_id}' + response = requests.post( + url, + headers=headers, + data=multipart ) + + return response.json() def send_ptv(self, instance_id: str, message: dict, instance_token: str, file: Union[BinaryIO, str] = None): - payload = { - 'data': message, - 'instance_token': instance_token - } + fields = {} + + # Adiciona todos os campos do message como text/plain + for key, value in message.items(): + if key == 'delay' and value is not None: + fields[key] = (None, str(value), 'text/plain; type=number') + else: + fields[key] = (None, str(value), 'text/plain') if file: if isinstance(file, str): - with open(file, 'rb') as f: - payload['files'] = {'file': f} + mime_type = mimetypes.guess_type(file)[0] or 'application/octet-stream' + fields['file'] = ('file', open(file, 'rb'), mime_type) else: - payload['files'] = {'file': file} - - return self.client.post( - f'message/sendPtv/{instance_id}', - **payload - ) + fields['file'] = ('file', file, 'application/octet-stream') + + multipart = MultipartEncoder(fields=fields) + headers = self.client._get_headers(instance_token) + headers['Content-Type'] = multipart.content_type + + url = f'{self.client.base_url}/message/sendPtv/{instance_id}' + response = requests.post(url, headers=headers, data=multipart) + return response.json() def send_whatsapp_audio(self, instance_id: str, message: dict, instance_token: str, file: Union[BinaryIO, str] = None): - payload = { - 'data': message, - 'instance_token': instance_token - } + fields = {} + + # Adiciona todos os campos do message como text/plain + for key, value in message.items(): + if key == 'delay' and value is not None: + fields[key] = (None, str(value), 'text/plain; type=number') + else: + fields[key] = (None, str(value), 'text/plain') if file: if isinstance(file, str): - with open(file, 'rb') as f: - payload['files'] = {'file': f} + mime_type = mimetypes.guess_type(file)[0] or 'application/octet-stream' + fields['file'] = ('file', open(file, 'rb'), mime_type) else: - payload['files'] = {'file': file} - - return self.client.post( - f'message/sendWhatsAppAudio/{instance_id}', - **payload - ) + fields['file'] = ('file', file, 'application/octet-stream') + + multipart = MultipartEncoder(fields=fields) + headers = self.client._get_headers(instance_token) + headers['Content-Type'] = multipart.content_type + + url = f'{self.client.base_url}/message/sendWhatsAppAudio/{instance_id}' + response = requests.post(url, headers=headers, data=multipart) + return response.json() def send_status(self, instance_id: str, message: StatusMessage, instance_token: str): return self.client.post( @@ -73,17 +121,39 @@ class MessageService: instance_token=instance_token ) - def send_sticker(self, instance_id: str, message: dict, instance_token: str): - return self.client.post( - f'message/sendSticker/{instance_id}', - data=message, - instance_token=instance_token - ) + def send_sticker(self, instance_id: str, message: dict, instance_token: str, file: Union[BinaryIO, str] = None): + fields = {} + + # Adiciona todos os campos do message como text/plain + for key, value in message.items(): + if key == 'delay' and value is not None: + fields[key] = (None, str(value), 'text/plain; type=number') + else: + fields[key] = (None, str(value), 'text/plain') + + if file: + if isinstance(file, str): + mime_type = mimetypes.guess_type(file)[0] or 'application/octet-stream' + fields['file'] = ('file', open(file, 'rb'), mime_type) + else: + fields['file'] = ('file', file, 'application/octet-stream') + + multipart = MultipartEncoder(fields=fields) + headers = self.client._get_headers(instance_token) + headers['Content-Type'] = multipart.content_type + + url = f'{self.client.base_url}/message/sendSticker/{instance_id}' + response = requests.post(url, headers=headers, data=multipart) + return response.json() def send_location(self, instance_id: str, message: LocationMessage, instance_token: str): + data = message.__dict__.copy() + if 'delay' in data and data['delay'] is not None: + data['delay'] = int(data['delay']) + return self.client.post( f'message/sendLocation/{instance_id}', - data=message.__dict__, + data=data, instance_token=instance_token ) @@ -102,22 +172,34 @@ class MessageService: ) def send_poll(self, instance_id: str, message: PollMessage, instance_token: str): + data = message.__dict__.copy() + if 'delay' in data and data['delay'] is not None: + data['delay'] = int(data['delay']) + return self.client.post( f'message/sendPoll/{instance_id}', - data=message.__dict__, + data=data, instance_token=instance_token ) def send_list(self, instance_id: str, message: ListMessage, instance_token: str): + data = message.__dict__.copy() + if 'delay' in data and data['delay'] is not None: + data['delay'] = int(data['delay']) + return self.client.post( f'message/sendList/{instance_id}', - data=message.__dict__, + data=data, instance_token=instance_token ) def send_buttons(self, instance_id: str, message: ButtonMessage, instance_token: str): + data = message.__dict__.copy() + if 'delay' in data and data['delay'] is not None: + data['delay'] = int(data['delay']) + return self.client.post( f'message/sendButtons/{instance_id}', - data=message.__dict__, + data=data, instance_token=instance_token ) \ No newline at end of file diff --git a/dist/evolutionapi-0.0.4.tar.gz b/dist/evolutionapi-0.0.4.tar.gz deleted file mode 100644 index f9451f6919868913fac44170f5f8133b61a19bd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9182 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 diff --git a/dist/evolutionapi-0.0.4-py3-none-any.whl b/dist/evolutionapi-0.0.5-py3-none-any.whl similarity index 65% rename from dist/evolutionapi-0.0.4-py3-none-any.whl rename to dist/evolutionapi-0.0.5-py3-none-any.whl index e5087e31302c07d880989f48c636754285efbf7d..3a29bd5df03598230b4530a13e7466cdae20210c 100644 GIT binary patch delta 5965 zcmZXYbyO70*T-S$?sn;=SsDbSJ4I?)KuWs1VFf8^SyBNPS&)+Mjz>DBOBzMG#HDZ@6)`8H9tHgAv=hUGmVtVdwX zrISFoB7Xet^q5)@=cx)_S}^A7@YBOAItDYn_^(aU;njU~o~n`og9NuSI3b8nS^_6m zgoy?h9evMpdI+o2ZTbR7PM3%sy07#Ni(Yk#VBm~CHYy|N#d4r+*}?1i2D`YZ4_}sK zECC zP7}MM%#nZjz_S42R~GfLFpVWYg4d6YV|t*ZsP*K)FFBVix}We_Fs$b5Ba^O)|~mpIL+XrE5tMo z!lciT;%4ss^S`DR)Sk%;oRIs12x>hzM=7l2nKrmhh+Rq3Yng5rEMWmG_-u=irl+8F z=X!&)V*UKPQf0FGlfKta!wkIKG3PyFSp~3)x3c#*7D8-fau0#ONG}p)Ct1IxYU+WU zvFY2~7wSgD4-Wt&<-8ehjpfs#+QaVb_keo(F*#usG*LaE9g=iP-_*_o3jn%Y>)vwV zyI_6}LU-nJBso$L1OrqjP?>(Y9rWLvlBn8&%T4+Cw+&(nBtFSLe6vk5%v;iOyP#>m zGsRZiZHd*d_x4rssI39%ZT1hVAr9uM!EpIoQf<3W}o9x6qcPq>Z$Dm9kGyU%}eVR>9`KMN;@te#WSl z1$%1&Jbu_;ZPK&7smi|EZ_nVqndS;-d#Y1{rHAp>!;M2rl1NJDem2QjUk&ffy?(NR zTuKUq;EdQ~$#JRez#^}O-MD-VhvY+u+qsp6DQkXNIEzFzl{9nY1wmQMGn0{Rm*`62 zz0MbxBs@ax(y)RjB91EpgWpNj0xIqvEkn+|4h7oIt1*h_$$x~r)?+UW#4?E4nOiNB zIf+4^NGkjp`+|Bxh$CAI1J2RjDR!W;P-s&tf;ISPOrBc1&p3MOSE&D$7`R2G=8JFz zjcUJ6boX+(_f##DP2|Qj7bUnP`9rJmo5}c(WU?~sSL}pX(-LAA zCQ+hNLpiZ5w08(AJuh-K896awSH07l6;- z^jGI?hkbgqv1vl3G?HF!j3Td0-p`0urM*(45DG!Q4S1r9nf^@p(|WiT(7!TkS4=hA zI5Y9g>VrhtsOWKJoN*t$^N7RQ=)Kn+O64ZDK;($&6VuX*-@hv(8i+)1qjayAe>nTK z1#38n8p6Eg?r7>*IIi%>yvlr_l}vK=fmmp0dkko3jBt4_8o0b5Aq?uVB~BVXQDt>* z!zl>32o~zb;q+<*lRNA`ZhKA}p`hifX+r%RIMkYOdo`Y#uB`8UkShaFrXLHXAJ-W^ zR|eyyoP)?lGPH%i-~@Xluef%QpStzP(KyYqWR+_VW~%_bffxl5EF&hQHKIFC5nyOY z$PZO;AlE`*$EKS(Y#q_2w(j9Mbu-DCevkla+qsFqa`Ig2QvRBU+cMKWJp$iPxc5vv z(8ETh4J?Kipm<(D^RLSW?$)TDY+2Ubaq`c#$pX0;N0eAb?8a?#Q3>XkYOh3IhF9gs zWEJ*kcsvGP%9+2vQtke&aGIiK8S}CG_Y?ZWsh3P*O|X?V82!(x8|r&bP)qyuinLtb z{g>mgYryDx0)k}dut4D3$je|<>co&QkIfsMkB8}M=fsjv%vb8R#l^5UnedZ~r}Z$= zq=zA?^k45Azo$tHXW>D8Uy=$<9Rpt{3QYe*C-brW$eu|@H=Hf^h|>Nxb0jggKef?r zrbo4$I&>A}2$PTHOTw@N>7>Fi!Z&#u7g6z?hp!6tskjPGEXxqP7WCpVhR2SX6uG)6 z%$&Saq}CU{(rgn2M&4~QGc#~p^92HMSGs9iklQ_b`X-Ksi6WfySI6ZS?ctK-&)8@| zOI=$-*TTDPo$Cv)fHLS^?)c4$a+#6(`dA4+%m&D;VS`*2=8gCaMi2->N#*iWg;9mV z80!p~g$H zGQ)$r!hKyp+#Rw=o_{pu13gtK7X@`}%r&v_&q<{A>kMHP$+$6!!;|VxiVvN@p9*0| zfs3S*c_w*Q6&x{J*ncg(Be8RllSQ}ZGg;vfhNbjT&<)u#go3>a$PIFRf5=m-a5CE} zWcuSZvNDg;Qkr6EWC(P{linO(iZc*Wejb?uCU{pV>Qt1pgeU@qmlhH&5G7X!kwV&( z0!!F@M4?MFPR7+GDs9Z1<}*QM$5P*ft-kj$xIXa`y7*)pYYiBdamS>#4Z^jOIpd8; zgn7IJRRx*`H&EbTYi%uAiOCxHT6%q~ zx89rHWcd6!dZ79S?1lLI3opB?I{Ih?0#+_N&#AgP=Hi<;rOl~eRM6~#-E2p{p|e^@ zhI4-;QvS0eJNqgFCLP8|?J*h2<%Z%a{2pe{+5Y)e;uvc<;2j=PX<<2SNmd`uR&o4$ zyW%1g`L&K<4r~w>5?d2j035nm9VRLcvK7YN6jfKgM8~>hKgQXZJM($UTasE<4m)-! z%`>eh&?nIMbMrrlFK-QR^+D8eNmC$J)%sN5>v89?9~r89@*t4b?CW1VPNj8rN@jH} z#LL;d^X-Hg=V8k^S|y*53aLLzmeECD|H`^L9x1EAr~IV;+sZsD(HJSm=X>&<-H!nD zS&k^xPMaVtA^|Fz#SxJO+;%=m}=f zJ$6ZXVKo3eK7pq%ORqNt8r9Fu^It=tC+ImPcPe|UiMGNYj}!&xNh;D-==*df%+V_BRs{HlsM z6-VQh^ReVBrY}|);-XH~^$V|_;U+4BT-o(OPF2uUCW8a(h2ue{Wl2`<{mlj4Ob(S7 zvcGzLHd?~fihV#@HkCZ!aXbOuQo*&z z%!-ANlGCc3s>7R!FslCPl-=kJDx+P8H<17_?;DT+-J_BEwG(>P!g_=$oGoOW+khay z_Kqwfqb8Rfk7k8kqXhb9fSvy_1xKx~d9zGoo9&OmLRC|dH=vj>aot=3w-R+|Z(Z1j zr1;n89`D;Rzz)g@6N6eD&U14)A=}DAo@qR+VndGDRi%6&80zri(5o-wnNkmO-yQ?P zyt_kZ(9h|$g5EE04E(&0Ic`;Sa%xY+x^dUIKQzuGv z+XTOHO_D|@U$Te9Dn!jS@PIL>N(dX-em6g;ou=umw7yy#L8dN*3cQJ?jjrkbE}xrj z6O*a#LD@47Gk@(59w^~Cpv}S=&&9K+nigwu-#O=q!|BvMEoxgGJE*^D*hmZp8P+CF zkBRw4x$ehvaYzchtT}4Q@o1sdp!FCXjFEcveOEu@eDi0*X07#@B(HEs@rvRM@Tz>= zcnQhFMWZmo+q>lCx>OLTw1nvKyTivyuCA`ZLF+Z?^ENaLl=lEsrg@bn!==ROM|H=|nLYH5Kf@Uhrc& zSAabj&;T+S7FqmRRJrI*vtw0XbxgYFMZ$L1tIX+0)ccwVu;tSo{@i1}cj{n(M45+t zvWzDXrYY1!kwb595n-%4VuhHG#s2JOdoYl#uAU&mt>=(BTSW9sjVMt~u_eR6TtuIHd=Ohd zQv;gY(?~%z^#ty?d(tIbKk#w6Ln7>;oXI7#yVj6sHF&7frWS!k z2nzz!t8c|*NF`ziqOaIWT?(2MBH$eacbVW(`R3U0h6DeSSQob{kD@T6kmKr8nAMh& z=P?xhkde#JhWe_XE2;>c@^YQCm1*HNNFgaEm)$qttEDdwcr@b@E4{{hbQ?hg(=)w)dQkS25^NJrV@*4EBN&wg758H>8f-?LG|U=74aTiAv~c?3EIl*nU#mR=mB8EZ zs*@0B={qyDuZl~duBv$w$v#>qe)CIVh$v=bi1o}7+1mL_@&?kM;a4$1`w5Oe^KOfl4tOV#*aOF zj9y8z@c#SH=}Y^bOX?&PcC&>Q&*b4ptP}njLnBbt$sVT(yFJ_}lDaUZ zdURa#hnSYIXVwIlQ~{!k!67QFFtJ~Pc*+3Pq*hnKVIL8*nxS#uyuGxOD{VkricH71 z;xNw7#8l-1nmHh;lEWEM+Cg+6lBq%d(ZcN^r@xKE?h8Wn>8YMFhj{$MXE65Omw4#b zi=EwDv*HuvCG?(_JaX^m?dx1dz4=bJt&(t#yvg2ca#(t*ptl69gLulGs8Wgq_q!h# zvF(GhC4N$#cXc+Z-DOg`+iG>OaSqR-gmDs3c^zFFVh(<(!|Kp;8;j*&V_6BvS}vNN z76v9I8X6idnt3@~R+a7HLN==YfQQM_pUJ(d5Z>Pxep~oz`vU%0?a>2Zq{a%fK(H2a z!SNZ0tpss}pI%?&1?dKeXZl~pd~LZFj0{0pTiQN2m9sZH#?kGVnr1YGatm!WSC>vyv92w! zlr^e%2qHN2Zf*qQahO0eKth=}!SSxyPPojXipS1v#PP+mG1ASH#A3pC)VPDJj}bKx z(eu#99cm-ScB2%;tqo)_`4^76&)?J})UiDGEXFK*B-Ck>XC_EbrkLh&bc+41KcN^# zZpm?GQE=Rol)=;MdsWfI7U3_6osgcu=3*2J&3>5vS9_F>DuH^)+IbEgs& zH_(O}kklRC7`bE3^f_a!GB%eVPOC3MMFS2y(bW;E)GVx|fU z9&`_0x(ig*q#r@HxY4-Om|ym<#ZT0Aw*C@o+`a)9Pi0gb7TAM0S>t#{>-al_Rx4^g zwUa^UV%OP~I@n;ayr1U68RJWCc^$FO7O55jwKfy!Yg!PDI{l=4-S5k8`kp#QG1H!m zhl-q(nI{d0hd9e<%oy{e9In<=h^)%V*9YeApML-L7Nf+jlI3y7ZQc)RP(_Djm#@x> zQLXQ+47|&-DLUd9V$ThjB^bv@fD)%7V*~blmp+gY4y?(-Hs{Jmsu8L@CR)GEOci;RI8DuA>($vTzt}^yWUrs*4XHJgfiR6nQCsWCG1sGe`G7GYM4*RR~j4E@m9N{vQa`X70 z`)3`(IbN{quKKJp>+4K{4y?YZhypt9U_vQpbCOM~1z-em+9+j{onuK1gc%c&$tk_Ce$O0DZRecWIsgMJQgKiUHvsa-!AYIHux1rAq_$0Pql1bA;;&tIQ_>lJEOl< zu1_o36Kue*TYVH4O({zzuKWUIYn^#h65Lx1s5hs)1#g_|e$DC~s)}U*6}Q&c)^mKC z<>e+x&bHD-4_Sx$Hoql{EE2iYu8n;3DwWS}4PEo4TSn;yNa{;8Az~2(@w`+`O}q_u zZK^N@xi$9tkXv@o+_NUaE6s}9_E;ZI!Cc|_dfc~hrTBF--;*`J?KhNc+t@<+<+Fdk zT>juIvHIu5f6m9{^bmWV((?{PaI?ay2J2w z@0gdsJ==P!r-crn#Q0B?j5M@>K7>m+lRjP@SX&VL|CU%?^$h|3oNyVANAR!uJODW^ zxB?e7oY_DO5dOEMfx8k)q4MhPo5`QG0kr-g@KQhQj6p$35`4`Hs^^i07s^?Yp*Vb8_@k>Q`O17MaSsZC3?U#883_0b8CB84FU|#OsYz5=>Q?d!eSQ#1 zCfumElL8=+Xh8@B1upALQUfl8hWhwjP!Ep$+nEtKi4ttsQK{8SQr(bIz7=7sQZ-aK z%#tb0G7Y$BuZha0Ax*b7xR7qooX!(U7h3KSxD6?v8X^RE>26#~?s8Fcj&qWxPMl{VB)gBVtQYs#rmUET1*3jT z`r}D%&ci0>l)!mMOU@LrG1%?sSuK}@l$eNF8otdEqJbT|jlV-7GeQXZ2??eF&3~$e zY$Zoq^4#2+^U`B0Q}>VOrMh{uMs}XPOd8rgpLHO|HD^IvdQ5O<-~O>lF2ZmUr~ghH zzUsDX;G6z;aW2+X9ARZHq(w~qb;#Cpy;4$x?{S9X*{hDlvJ)qpVLdf$c+U=-LHtZR z?HKB&Z3Htf-g`5IQsiW(W7{MIoYjo|n_2BHtEG=bKW{foQC+tqWwu{*uJzZ&4O>k9 zW$1$?74QY|q8km@4kBl3LYwLwW;!7X!@lXw{cA60OPh%s#UGYuBH8?9yANiCT>Mox zFbCc%vWy2EQa2hl_GlVLA@w7=lAq>c)Vao@nhpkoaKZZ0QSp(!-L21Ld=uT$b8HgP zErwP~Zz3CcFuG#6TtI!>@Uxy4=a=TEro_z~-uYcE`#!uVX6(jN9$=$rB7IOH(@L%Q zXkN*|&HXTxj1N~j4Q5+Pb7+Irmhx1mtJzR_q5QM%I*9eU2PJG@zxvKF%gyVG9IdY& zkA(KpGk&_2%sTe;t*~@o#Lo!6saW{?bXOGo^8Qy5gYueB0el?2J&fos(H{o$V+aWx zB0zKDa8nCY$5!|cM6efT^wA7uV<4MFns~!N2z;EDH@;_WJedrHEH)7w9qY_gC~K+1 zBLwq)0@m%T=xQUq+I;V>Xz5f|jG0YlQSSx#y%eND;{?txJfq!$yc%LZbj{gVSA29A zup@9nMIjIfH-!5km}{kQI1s}s0yqSEgm0kBLjnvZND6%$x*NCEReboqqy!)k1@L!E z(L=tHAWwBgol)+Nic<^G z2PJd`55(BiinvKhWWI6l`*t2Nx|$c9*I|5&6-$YcTPK!C84A(*oq`3|j_ndnO<^4| zz?<{qUw#fh9hwkaP_&HUcT&UDH)h?Z=%bV5srRcwrV5SCA)Qze-ZY_Nd`!4V*OQYz zLDPMt(f{~>39z>H@uoAWPp5fHL9EYIY#y%5S17heI2NGM-bOPFNK`INr@gK9qkWg%gxF^Ee7VFp`Ef=zPBM2jExH(Cp z<|nlY%-g8XZgxIMxJbJjtqDo@etUNtjt&SfQIyBxPCdP*sc0o{t^Vy1s zZjHGd6Oqc=j^}6-rJP+j<-&(!7og8K;x7dg*9uds(+R)lZEqEyOS4nFbZb6Pb6@FV zdx(EhtZFy%V|;2DIja3~y`a%+5ea>@>_Yj$kD2*7lu2#V z$HL7z#3lTgmqKMbss^w~I?S`v|32YKy>^l*w^>H7@}jqauTV~SC-spR+9<4bl{4kK zVri7=(p@*GGH**n>R@0s=GOFD8A3qlOeDaez3&k9c%7weUHaTT4(o86Bi`Zwj*9 z{ZZD(OaaP>b@`MM_kl&}t8V^XKy-jKCttn3TI8NR4$osvveS0Tv<=Uw5jYuh)4w@3 z7WyEg_TGojRoQ1%NU|sPR2{|W9s^Z;YbgB@(%a?OJj3{27EKz#2;QBh@_3DkS_v&A z6744k6Ff5?%Ei{`L$tR@9!zJez5RQ~%VEixXDn_;nZ{6^TpbqsqSzg|!++ZM;48n{ z%NB+8;Oz(k*$r35Y#;Vw3Q{0ER6X+OXsmn7leM&~Z!#Rr(WKg|**;#cLO6b{n!Z-_ zzD%Xt&rPWjuadcG&Od*d+BSF4O(`BcrW?dIZXFoXF_~!}%FHPW7749>O?*o>(EY`a zFx;9`5g`)MIc8M8id(#~C;MWfwbP027goAyRIs|fn3Ss(r!iiqvRV21vRsryW24@{ zb1o+R?1;SY*6pgW$+$&AfdPec^3Iilm#^OCv0#^K<)CTj4}h*5Y75u)O}bFf^Wp_@ zvZM=M_pf)QUQpLSD;)^B+Wcaqhs^mz^XWgJjRqWuDg?PdQScLfj9$10z!${_()VTn z649b{FueyE9?Nqg>tzhHyhLuRZ1C@zf~@&~2@=gKba9k_X@<-C@zBFd(5+?hiaI-M z7|3le2>#&W0LY<1e-|@g9u1be5CCPx!ypEhDIEimBn-z%u*^jq^dM;h0hlA=zQYNy zodgG3RgT~i2?w;QAEicQQPA+5prFj*5Bkrc#lf+MyN4BEjyuv=>hgjkWDFpna|BVY z+5lY_3_c?P2D;*a16^>*RT8ATVgZ=mVQLBB4UR}YF0>P|^8)MVH43 a?SC1_|Fu{dchda3r4>EpV8Yhll>Y@trjTv` diff --git a/dist/evolutionapi-0.0.5.tar.gz b/dist/evolutionapi-0.0.5.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..550496754e3d5c9e30d87beaffdd0c695bb02f84 GIT binary patch literal 10209 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