� ���g�����ddlZddlZddlZddlZddlZddlZddlZddlmZmZddl m Z m Z m Z ddl mZmZddlZddlmZddlmZddlmZddlmZdd lmZmZmZdd lmZmZdd l m!Z!dd l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)dd l*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3ddl4m5Z5m6Z6m7Z7m8Z8ddl9m:Z: ddl;Z;n#e<$rddl=Z;YnwxYwej>eefZ?dZ@d�ZAdeBeCe ffd�ZDGd�deE��ZFd�ZGd�ZHdS)�N)�datetime� timedelta)�Any�Optional�Union)�UUID�uuid4)�tzutc)� string_types)�Consumer)�ExceptionCapture)�exc_info_from_error�exceptions_from_error_tuple� handle_in_app)�InconclusiveMatchError�match_feature_flag_properties)�Poller)� DEFAULT_HOST�APIError� batch_post�decide�determine_server_host�get� remote_config) �DecideResponse� FeatureFlag� FlagMetadata�FlagsAndPayloads� FlagValue�normalize_decide_response�to_flags_and_payloads� to_payloads� to_values)�SizeLimitedDict�clean�guess_timezone�remove_trailing_slash)�VERSIONiP�c�~�d}d}tj}|�d��r5d}ttd��rtj��d}|r|}n�|dkr5d}ttd��rtj��d}|r|}n�|�d ��r&d }t j��}|d r|d }nj|�d ��r+d }ttd��rtj��}n*|}ttd��rtj��}||fS)zr Returns standardized OS name and version information. Similar to how user agent parsing works in JS. ��win�Windows� win32_verr�darwinzMac OS X�mac_ver�linux�Linux�version�freebsd�FreeBSD�release) �sys�platform� startswith�hasattrr-r/�distro�infor5)�os_name� os_version� platform_name� win_version� mac_version� linux_infos �^/home/asafur/pinokio/api/open-webui.git/app/env/lib/python3.11/site-packages/posthog/client.py� get_os_inforC.sR�� �G��J��L�M�����&�&�,��� �8�[� )� )� )�"�,�.�.�q�1�K�� )�(� �� �(� "� "��� �8�Y� '� '� )�"�*�,�,�Q�/�K�� )�(� �� � !� !�'� *� *�,����[�]�]� � �i� � /�#�I�.�J�� � !� !�)� ,� ,�,��� �8�Y� '� '� ,�!�)�+�+�J�� �� �8�Y� '� '� ,�!�)�+�+�J� �J� ���returnc�~�t��\}}tj��dtjdd�z||d�S)Nz%s.%s.%s�)z$python_runtimez$python_versionz$osz $os_version)rCr7�python_implementationr6� version_info)r<r=s rB�system_contextrJYsG��%�-�-��G�Z�$�9�;�;�%��)9�"�1�"�)=�>��!�  � �rDc�(�eZdZdZejd��Z dAd �Zed���Z e j d���Z dBd�Z dCde e eee fffd�Z dCde e e ffd�Z dCdefd�Z dCdefd�Z dDd�ZdBd�ZdBd�Z dEd�ZdBd�Z dFd�Z dFd�Zd�Zd�Zd�Zd �Z d!�Z!d"�Z"iiidd#�de#fd$�Z$iiidddd%�d&�Z%iiidddd%�de&e#fd'�Z'd(e d)e d*e e e fd+e e e fd,e e e fde&e#f d-�Z(diiidddd.�d/�Z)d(e d)e d*e e e fd+e e e fd,e e e fd0e&ede*e&e+e&e ffd1�Z,d)e d(e d2e#d3e&e d4ed*e e e fd0e&ed5e&e d6e&e+fd7�Z-d(e fd8�Z.d(e d9e#de&e fd:�Z/iiiddd;�de&e e eee fffd<�Z0iiiddd;�defd=�Z1iiidd#�de*eeffd>�Z2d?�Z3d@�Z4dS)G�ClientzCreate a new PostHog client.�posthogNF�'T�d��?rG���c ���tj|��|_|p||_td|jt��||_||_||_| |_|pt|_ t|��|_ | |_ | |_d|_d|_d|_d|_||_||_d|_t-t.t0��|_||_||_||_||_||_||_||_ d|_!||_"|�' tGj$��}n#tJ$rd}YnwxYw||_&||_'|r8tQj)��|j*�+tPj,��n$|j*�+tPj-��|jrt]||j ���|_!| r d|_/dS|rtaj1|j2��tg| ��D]a}g|_/ti|j|j|j |||| | | |�� � }|j/�5|��|r|�6���bdS)N�api_key)� integrations)�host�on_error�flush_at�flush_interval�gzip�retries�timeout�historical_migration)7�queue�QueuerU�requirer rX�debug�send� sync_moder�raw_hostrrWr[r]�_feature_flags�feature_flags_by_key�group_type_mapping�cohorts� poll_interval�%feature_flags_request_timeout_seconds�pollerr$� MAX_DICT_SIZE�set�#distinct_ids_feature_flags_reported�disabled� disable_geoipr^�super_properties�enable_exception_autocapture�log_captured_exceptions�"exception_autocapture_integrations�exception_capture� privacy_mode�os�getcwd� Exception� project_root�personal_api_key�logging� basicConfig�log�setLevel�DEBUG�WARNINGr � consumers�atexit�register�join�ranger �append�start)�selfrUrWrb�max_queue_sizercrXrYrZr[� max_retriesrdr]�threadrjr|�project_api_keyrprqr^rkrrrsrtrur{rw�n�consumers rB�__init__zClient.__init__is���:�[��0�0�� �'�1�'�� �� �4�<��6�6�6� �� ��� ��� �"����,� �� �)�$�/�/�� ��� ��� �"���$(��!�"&����� �*���5Z��2��� �3B�=�RU�3V�3V��0� �� �*���$8��!� 0���,H��)�'>��$�2T��/�!%���(��� � � $�!�y�{�{� � ��� $� $� $�#� � � � $����)���!1��� � /� � � !� !� !� �H� � �g�m� ,� ,� ,� ,� �H� � �g�o� .� .� .� � ,� r�%5�d��Ip�%q�%q�%q�D� "� � %�!�D�N�N�N�� +���� �*�*�*��6�]�]� %� %��!#���#��J��L���%�%�#1��'�#�)=� � � ����%�%�h�/�/�/��%��N�N�$�$�$��% %� %s�D0�0 D?�>D?c��|jS)z9 Get the local evaluation feature flags. )rf�r�s rB� feature_flagszClient.feature_flags�s �� �"�"rDc�f�|pg|_d�|jD��|_|j� Jd���dS)z9 Set the local evaluation feature flags. c�J�i|] }|�d���|d|��!S)�key�r)�.0�flags rB� <dictcomp>z(Client.feature_flags.<locals>.<dictcomp>�s3��$v�$v�$v�4�Z^�Zb�Zb�ch�Zi�Zi�Zu�T�%�[�$�Zu�Zu�ZurDN�Dfeature_flags_by_key should be initialized when feature_flags is set)rfrg)r��flagss rBr�zClient.feature_flags�sI�� $�k�r���$v�$v�4�CV�$v�$v�$v��!� � %� 1� 1� Q� 2� 1� 1� 1� 1rDc���|�tjdtd���|pi}td|t��td|t ��|||d|d�}|�||��S)N�NThe 'context' parameter is deprecated and will be removed in a future version.��� stacklevel� distinct_id� propertiesz $identify�� timestampr��$set�event�uuid��warnings�warn�DeprecationWarningra�ID_TYPES�dict�_enqueue�r�r�r��contextr�r�rq�msgs rB�identifyzClient.identify�s��� � � �M�`�"�� � � � �  �%�2� �� �{�H�5�5�5�� �j�$�/�/�/�#�&�� ��  � ���}�}�S�-�0�0�0rDrEc�V�|�|||||��}t|��piS)zP Get feature flag variants for a distinct_id by calling decide. )� get_decider#�r�r��groups�person_properties�group_propertiesrq� resp_datas rB�get_feature_variantszClient.get_feature_variantss3�� �O�O�K��9J�L\�^k�l�l� ���#�#�)�r�)rDc�V�|�|||||��}t|��piS)zP Get feature flag payloads for a distinct_id by calling decide. )r�r"r�s rB�get_feature_payloadszClient.get_feature_payloads s3�� �O�O�K��9J�L\�^k�l�l� ��9�%�%�+��+rDc�R�|�|||||��}t|��S)zU Get feature flags and payloads for a distinct_id by calling decide. )r�r!)r�r�r�r�r�rq�resps rB�get_feature_flags_and_payloadsz%Client.get_feature_flags_and_payloadss.�� ���{�F�4E�GW�Yf�g�g��$�T�*�*�*rDc���td|t��|�|j}|rtd|t��ni}|||||d�}t |j|jfd|ji|��}t|��S)Nr�r�)r�r�r�r�rqr]) rar�rqr�rrUrWrkr )r�r�r�r�r�rq� request_datar�s rBr�zClient.get_decides��� � �{�H�5�5�5� � � �.�M� � � �H�f�d� +� +� +� +��F�'��!2� 0�*�  � � ��4�<���w�w�D�<f�w�jv�w�w� �(��3�3�3rDc ��|�tjdtd���i|pi�t���}t d|t ��t d|t ��t d|t��|||||d�} |r!t d|t ��|| dd <i} i} |rN |�||| � ��} n\#t$r'} |j � d | ����Yd} ~ n0d} ~ wwxYw|j r!|d kr|� ||pi| d ���} | pi���D] \}}|| d|��<�d�| pi���D��}|r|| d<| ri| �| d�| d<|�| | ��S)Nr�r�r�r�r�r�)r�r�r�r�r�r�z$groups)rqz0[FEATURE FLAGS] Unable to get feature variants: �$feature_flag_calledT)r�rq�only_evaluate_locally� $feature/c� �g|] \}}|du� |�� S)F�)r�r��values rB� <listcomp>z"Client.capture.<locals>.<listcomp>ms(��o�o�o� ��e�\a�in�\n�\n��\n�\n�\nrDz$active_feature_flags)r�r�r�rJrar�r�r r�rzr� exceptionr�� get_all_flags�itemsr�)r�r�r�r�r�r�r�r��send_feature_flagsrqr��extra_properties�feature_variants�e�feature�variant�active_feature_flagss rB�capturezClient.capture7sC�� � � �M�`�"�� � � � � @��)�r�?�n�.>�.>�?� �� �{�H�5�5�5�� �j�$�/�/�/���� �-�-�-�%�"�&���  � �� � 2� �H�f�d� +� +� +�+1�C� � �i� (�+-��BD�� � � [�#'�#<�#<�[�&�`m�#<�#n�#n� � ��� [� [� [���"�"�#Y�VW�#Y�#Y�Z�Z�Z�Z�Z�Z�Z�Z����� [����� � �E�-C�$C�$C�#�1�1��V�\�r�-�gk� 2� � � �"2�!7�R� >� >� @� @� >� >� �G�W�6=� �2��2�2� 3� 3�o�o�9I�9O�R�8V�8V�8X�8X�o�o�o�� � M�8L� �4� 5� � J� I�#3� I�s�<�7H� I�C� � ��}�}�S�-�0�0�0s�'C� C1� C,�,C1c���|�tjdtd���|pi}td|t��td|t ��|||d|d�}|�||��S)Nr�r�r�r�r�r�r�r�r�s rBrnz Client.setvs��� � � �M�`�"�� � � � �  �%�2� �� �{�H�5�5�5�� �j�$�/�/�/�#�&����  � ���}�}�S�-�0�0�0rDc���|�tjdtd���|pi}td|t��td|t ��|||d|d�}|�||��S)Nr�r�r�r�r�� $set_once)r�r�r�r�r�r�r�s rB�set_oncezClient.set_once�s��� � � �M�`�"�� � � � �  �%�2� �� �{�H�5�5�5�� �j�$�/�/�/�#�&�#� ��  � ���}�}�S�-�0�0�0rDc �l�|�tjdtd���|pi}td|t��td|t��td|t ��|rtd|t��nd�||��}d |||d �|||d �} |�| |��S) Nr�r�r�� group_type� group_keyr�r�z${}_{}z$groupidentify)z $group_type� $group_keyz $group_set)r�r�r�r�r�)r�r�r�rar�r��formatr�) r�r�r�r�r�r�r�rqr�r�s rB�group_identifyzClient.group_identify�s��� � � �M�`�"�� � � � �  �%�2� �� �j�(�3�3�3�� �Y��1�1�1�� �j�$�/�/�/� � A� �M�;�� 9� 9� 9� 9�"�/�/�*�i�@�@�K�&�)�'�(��� '�"��  �  ���}�}�S�-�0�0�0rDc���|�tjdtd���td|t��td|t��||d�|d|d�}|�||��S) Nr�r�r�� previous_idr�)r��aliasz $create_alias)r�r�r�r�)r�r�r�rar�r�)r�r�r�r�r�r�rqr�s rBr�z Client.alias�s��� � � �M�`�"�� � � � � � �{�H�5�5�5�� �{�H�5�5�5� +�$���#�$�&� � ���}�}�S�-�0�0�0rDc��|�tjdtd���|pi}td|t��td|t ��td|t ��||d<d||||d �}|�||��S) Nr�r�r�r�r��urlz $current_urlz $pageview)r�r�r�r�r�)r�r�r�rar�r�r r�) r�r�r�r�r�r�r�rqr�s rB�pagez Client.page�s��� � � �M�`�"�� � � � �  �%�2� �� �{�H�5�5�5�� �j�$�/�/�/���s�L�)�)�)�%(� �>�"�!�$�"�&��  � ���}�}�S�-�0�0�0rDc �d�|�tjdtd��� |pi}|�d|d<t��}t d|t ��t d|t ��|�t|��} ntj ��} | �| dkr|j � d ��dSt| ��} td d | ii|j� ��} | d d } | d �d��| d �d��| t!|j���d|j�d|��d�|�}|jr|j �||���|�|d|||||��S#t,$r(} |j �d| ����Yd} ~ dSd} ~ wwxYw)Nr�r�r�Fz$process_person_profiler�r�)NNNz"No exception information availabler��values)r{r�typer�z /project/z/person/)z$exception_typez$exception_messagez$exception_listz$exception_personURL)�extraz $exceptionzFailed to capture exception: )r�r�r�r rar�r�rr6�exc_infor�warningrrr{rr'rerUrtr�r�rz)r�r�r�r�r�r�r�r��kwargsr��all_exceptions_with_tracer��$all_exceptions_with_trace_and_in_appr�s rB�capture_exceptionzClient.capture_exception�s+�� � � �M�`�"�� � � � �0 D�#�)�r�J��"�8=� �4�5�#�g�g� � �M�;�� 9� 9� 9� �L�*�d� 3� 3� 3��$�.�y�9�9����<�>�>����8�/A�#A�#A��� � �!E�F�F�F���)D�H�(M�(M� %�"�� �";�"�� "�.� ���E�49��3E�h�3O� 0�$H��#J�#N�#N�v�#V�#V�&J�1�&M�&Q�&Q�RY�&Z�&Z�#G�+@���+O�+O�(}�(}�Z^�Zf�(}�(}�p{�(}�(}� �� � �J��+� <���"�"�9�F�"�;�;�;��<�<� �\�:�w�PY�[_�ag�h�h� h��� D� D� D� �H� � �B�q�B�B� C� C� C� C� C� C� C� C� C����� D���s�B E=�.CE=�= F/�F*�*F/c�^�|jrdS|d}|�!tjt�����}t d|t��t |��}|���|d<d|vr)|�d��}|rt|��|d<|� d��si|d<d|dd<t|dd <|�|j }|r d |dd <|j ri|d�|j �|d<t|� d d����|d <t|��}|j�d |��|jsd |fS|jrT|j�d|d��t%|j|j|j|j|g|j���d |fS |j�|d���|j�d|d��d |fS#t0j$r!|j�d��d|fcYSwxYw)z8Push a new `msg` onto the queue, return `(success, msg)`)Frpr�N��tzr�r�zposthog-pythonz$libz $lib_versionTz$geoip_disabler�z queueing: %szenqueued with blocking %s.r�)r[r]�batchr^F)�blockz enqueued %s.zanalytics-python queue is full)rpr�nowr rar&� isoformat�pop� stringify_idrr(rqrrr%rrbrcrdrrUrWr[r]r^r_�put�Fullr�)r�r�rqr�r�s rBr�zClient._enqueueCsq�� �=� %�$�$�� �$� � � � � ����0�0�0�I�� �Y��1�1�1�#�9�-�-� �$�.�.�0�0��K�� �S�=�=��7�7�6�?�?�D�� 1�*�4�0�0��F� ��w�w�|�$�$� #� "�C� � �$4��L��&�!�,3��L��.�)� � � �.�M� � 7�26�C� � �.� /� � � O� N�3�|�#4� N��8M� N�C� � �)�#�'�'�-��*F�*F�G�G��M���C�j�j�� ����~�s�+�+�+��y� ���9� � �>� � �H�N�N�7��W�� F� F� F� �� �� ��Y�� ��e�%)�%>�  � � � ���9� � � �J�N�N�3�e�N� ,� ,� ,� �H�N�N�>�3�w�<� 8� 8� 8���9� ���z� � � � �H� � �=� >� >� >��#�:� � � � ���s�;AG<�<-H,�+H,c��|j}|j��}|j��|j�d|��dS)z4Forces a flush from the internal queue to the serverz$successfully flushed about %s items.N)r_�qsizer�rrb)r�r_�sizes rB�flushz Client.flush�s@��� ���u�{�}�}���� � � � � ����=�t�D�D�D�D�DrDc���|jD];}|��� |����,#t$rY�8wxYw|jr|j���dSdS)zbEnds the consumer thread once the queue is empty. Blocks execution until finished N)r��pauser�� RuntimeErrorrl�stop)r�r�s rBr�z Client.join�s����� � �H� �N�N� � � � �� � ������� � � ��� ���� �;� � �K� � � � � � � � � s�4� A�Ac��|���|���|jr|j���dSdS)z2Flush all messages and cleanly shutdown the clientN)r�r�rv�closer�s rB�shutdownzClient.shutdown�sL�� � � � � � � � � � � � � � !� +� � "� (� (� *� *� *� *� *� +� +rDc�$� t|jd|j�d�|jd���}|dpg|_|dpi|_|dpi|_�n#t$r�}|jdkr3|j � d ��|j rtdd � ���np|jd krH|j � d ��g|_i|_i|_|j rtd d� ���n|j � d|����Yd}~nVd}~wt$rF}|j � d|jz��|j � |��Yd}~nd}~wwxYwtjt#�����|_dS)Nz*/api/feature_flag/local_evaluation/?token=z &send_cohorts� �r]r�rhrii�z�[FEATURE FLAGS] Error loading feature flags: To use feature flags, please set a valid personal_api_key. More information: https://posthog.com/docs/api/overviewz�You are using a write-only key with feature flags. To use feature flags, please set a personal_api_key More information: https://posthog.com/docs/api/overview)�status�messagei�z�[FEATURE FLAGS] PostHog feature flags quota limited, resetting feature flag data. Learn more about billing limits at https://posthog.com/docs/billing/limits-alertsz#PostHog feature flags quota limitedz-[FEATURE FLAGS] Error loading feature flags: z`[FEATURE FLAGS] Fetching feature flags failed with following error. We will retry in %s seconds.r�)rr|rUrWr�rhrirr r�errorrbr�rzrjrr�r �_last_feature_flag_poll)r��responser�s rB�_load_feature_flagszClient._load_feature_flags�s ��- ���%�X�T�\�X�X�X�� �� ���H�"*�'�!2�!8�b�D� �&.�/C�&D�&J��D� #�#�I�.�4�"�D�L�L��� T� T� T��x�3�������v�����:��"�"�!R��������S����� � �{����&(��"�*,��'�!�� ��:��"�"� E������ ����R�q�R�R�S�S�S����������� � � � �H� � �r��$�%� � � � �H� � �Q� � � � � � � � �����  ����(0�|�u�w�w�'?�'?�'?��$�$�$s%�AA� E'�!B.D� E'�!<E"�"E'c�T�|js#|j�d��g|_dS|���|jr|j���sItt|j ���|j���|_|j� ��dSdS)NzL[FEATURE FLAGS] You have to specify a personal_api_key to use feature flags.)�seconds)�interval�execute) r|rr�r�rrl�is_aliverrrjr�r�s rB�load_feature_flagszClient.load_feature_flags�s����$� � �H� � �k� l� l� l�!#�D� � �F� � � �"�"�"�� � �� � 4� 4� 6� 6� � �)�D�<N�*O�*O�*O�Y]�Yq�r�r�r�D�K� �K� � � � � � � � � rD�r�r�r��warn_on_unknown_groupsc��|�dd��rtd���|�d��sdS|�d��pi}|�d��}|��|j�t|����} | s5|j�d|�d|d ����td ���| |vrM|r%|j�d |d �d ���n$|j�d |d �d ���dS|| } t||| | ��St||||j��S) N�ensure_experience_continuityFz&Flag has experience continuity enabled�active�filters�aggregation_group_type_indexz)[FEATURE FLAGS] Unknown group type index z for feature flag r�z!Flag has unknown group type indexz2[FEATURE FLAGS] Can't compute group feature flag: z without group names passed in) rrrh�strrr�rbrri) r�� feature_flagr�r�r�r�r� flag_filtersr� group_name�focused_group_propertiess rB�_compute_flag_locallyzClient._compute_flag_locally�s��� � � �:�E� B� B� S�(�)Q�R�R� R�����)�)� ��5�#�'�'� �2�2�8�b� �'3�'7�'7�8V�'W�'W�$� '� 3��0�4�4�S�9U�5V�5V�W�W�J�� R��� � �F�@\�F�F�p|�~C�qD�F�F����-�-P�Q�Q�Q���'�'�*���H�$�$�A�\�Z_�M`�A�A�A������H�N�N�A�\�Z_�M`�A�A�A�����u�'7� �'C� $�0��v�j�?Q�Sk�l�l� l�0��{�L]�_c�_k�l�l� lrD�r�r�r�r��send_feature_flag_eventsrqc �b�|�||||||||���} | �dSt| ��S)Nr#)�get_feature_flag�bool) r�r�r�r�r�r�r�r$rqrs rB�feature_enabledzClient.feature_enabledsO���(�(� � ��/�-�"7�%=�'�)�  �  �� � ��4��H�~�~�rDc �t�td|t��td|t��td|t��|jrdS|�||||��\}}|�|||||��} d} d} | du} | s�|s� |�||||||��\} } | r| ���nd} |j � d|�d| ����n4#t$r'} |j � d| ����Yd} ~ nd} ~ wwxYw|r|� ||| pdd| ||| | � � | S) a# Get a feature flag value for a key by evaluating locally or remotely depending on whether local evaluation is enabled and the flag can be locally evaluated. This also captures the $feature_flag_called event unless send_feature_flag_events is False. r�r�r�NFz&Successfully computed flag remotely: #z -> #z-[FEATURE FLAGS] Unable to get flag remotely: )rar r�r�rp�&_add_local_person_and_group_properties�_locally_evaluate_flag�%_get_feature_flag_details_from_decide� get_valuerrbrzr��_capture_feature_flag_called)r�r�r�r�r�r�r�r$rqr� flag_details� request_id�flag_was_locally_evaluatedr�s rBr&zClient.get_feature_flag*s���& ��s�L�)�)�)�� �{�H�5�5�5���&�$�'�'�'� �=� ��4�.2�.Y�.Y� ��!2�4D�/ �/ �+��+��.�.�s�K��IZ�\l�m�m��� �� �%-�T�%9�"�)� X�2G� X� X�+/�+U�+U���f�.?�AQ�S`�,�,�(� �j�8D�N�<�1�1�3�3�3�������\��\�\�RZ�\�\�]�]�]�]��� X� X� X���"�"�#V�ST�#V�#V�W�W�W�W�W�W�W�W����� X���� $� � � -� -����!�E��*����� � � ��s� AC#�# D�-D�Dr�r�r�r�r�c���|j�|jr|���d}|jr�|j� Jd���|j�|��}|r� |�|||||���}|j�d|�d|����nf#t$r*}|j�d|�d|����Yd}~n7d}~wt$r'}|j� d|����Yd}~nd}~wwxYw|S)Nr��r�r�r�z$Successfully computed flag locally: z -> zFailed to compute flag z locally: z7[FEATURE FLAGS] Error while computing variant locally: ) r�r|rrgrr"rrbrrzr�) r�r�r�r�r�r�rr�r�s rBr+zClient._locally_evaluate_flaggsq�� � � %�$�*?� %� � #� #� %� %� %��� � � f��)�5�5�U�6�5�5��,�0�0��5�5�D�� f� f�#�9�9��#�%�*;�)9� :� � �H��H�N�N�#]�#�#]�#]�S[�#]�#]�^�^�^�^��-�Q�Q�Q��H�N�N�#O�S�#O�#O�A�#O�#O�P�P�P�P�P�P�P�P����� �f�f�f��H�&�&�'d�ab�'d�'d�e�e�e�e�e�e�e�e�����f�����s$�:B� C8� C� C8�C3�3C8)� match_valuer�r�r�r�r$rqc � �|jrdS|�4|�||||��\}}|�|||||��}d} d} d} d} |�|�||��} | du}|s}|s{ |�|||||| ��\} } | r | jjnd} | r| ���nd} n4#t$r'}|j � d|����Yd}~nd}~wwxYw|r|� ||| pd| ||| | | � � | S)NF�:[FEATURE FLAGS] Unable to get feature flags and payloads: ) rpr*r+�_compute_payload_locallyr,�metadata�payloadr-rzrr�r.)r�r�r�r4r�r�r�r�r$rqrr9r/r0r1r�s rB�get_feature_flag_payloadzClient.get_feature_flag_payload�s��� �=� ��4� � �26�2]�2]��V�%6�8H�3�3� /� �/��5�5�c�;��Pa�cs�t�t�K������ �� � � "��3�3�C��E�E�G�%,�D�%8�"�)� e�2G� e� e�+/�+U�+U���f�.?�AQ�S`�,�,�(� �j�<H�Q�,�/�7�7�T��7C�N�<�1�1�3�3�3������ e� e� e���"�"�#c�`a�#c�#c�d�d�d�d�d�d�d�d����� e���� $� � � -� -����!�E��*����� � � ��s�)AB/�/ C �9C�C rqc���|�|||||��}|�d��}|�d��} | r| �|��nd} | |fS)zK Calls /decide and returns the flag details and request id � requestIdr�N)r�r) r�r�r�r�r�r�rqr�r0r�r/s rBr,z,Client._get_feature_flag_details_from_decide�se���O�O�K��9J�L\�^k�l�l� ��]�]�;�/�/� �� � �g�&�&��).�8�u�y�y��~�~�~�D� ��Z�'�'rDrr9r1r0r/c ��|�dt|����} | |j|vr�d|d|d|d|��|i} |r|| d<|r|| d<t| t��rr| jr| jjr| jj| d<t| jt��r6| jjr| jj| d <| jj r| jj | d <|� |d | ||� ��|j|� | ��dSdS) N�_z $feature_flagz$feature_flag_response�locally_evaluatedr�z$feature_flag_payloadz$feature_flag_request_idz$feature_flag_reasonz$feature_flag_versionz$feature_flag_idr�)r�rq) rro� isinstancer�reason� descriptionr8rr2�idr��add) r�r�r�rr9r1r�rqr0r/�feature_flag_reported_keyr�s rBr.z#Client._capture_feature_flag_called�sk��(+�$<�$<�S��]�]�$<�$<�!� $�D�,T�U`�,a� a� a���(�(�#�%?�!�C�!�!�8� *�J�� >�6=� �2�3�� D�9C� �5�6��,� �4�4� R��&�Y�<�+>�+J�Y�9E�9L�9X�J�5�6��l�3�\�B�B�R�#�,�4�\�>J�>S�>[� �#:�;�#�,�/�R�9E�9N�9Q� �#5�6� �L�L��&���+� � � � � � 4�[� A� E� E�F_� `� `� `� `� `�; b� arDc� �|jrdS|j�|j�d��dS t |j|j||j���S#t$r(}|j�d|����Yd}~dSd}~wwxYw)Nz`[FEATURE FLAGS] You have to specify a personal_api_key to fetch decrypted feature flag payloads.r z>[FEATURE FLAGS] Unable to get decrypted feature flag payload: ) rpr|rr�rrWrkrzr�)r�r�r�s rB�get_remote_config_payloadz Client.get_remote_config_payloads��� �=� ��4� � � (� �H� � �r� � � ��4� e� ��%�� ���B� ��� �� � e� e� e� �H� � �c�`a�c�c� d� d� d� d� d� d� d� d� d����� e���s�!A� B�A=�=Br4c�,�d}|j�|S|j�|��}|rl|�d��pi}|�d��pi}t|t��r|rdnt |��}|�|d��}|S)Nr�payloads�true)rgrr@r'r)r�r�r4r9�flag_definitionr� flag_payloads� lookup_values rBr7zClient._compute_payload_locallys����� � $� ,��N��3�7�7��<�<�� � <�*�.�.�y�9�9�?�R�L�(�,�,�Z�8�8�>�B�M�&0� �T�%B�%B�h�{�h�6�6�X[�\g�Xh�Xh�L�#�'�'� �d�;�;�G��rD�r�r�r�r�rqc�H�|�||||||���}|dS)NrN� featureFlags)�get_all_flags_and_payloads)r�r�r�r�r�r�rqrs rBr�zClient.get_all_flags$s=���2�2� ��/�-�"7�'� 3� � ����'�'rDc�P�|jrddd�S|�||||��\}}|�||||���\}}|r`|s^ |�|||||���} t | ��S#t $r'} |j�d| ����Yd} ~ nd} ~ wwxYw|S)N�rP�featureFlagPayloadsr3)r�r�r�rqr6)rpr*�#_get_all_flags_and_payloads_locallyr�r!rzrr�) r�r�r�r�r�r�rqr�fallback_to_decide�decide_responser�s rBrQz!Client.get_all_flags_and_payloads9s�� �=� G�$(��F�F� F�.2�.Y�.Y� ��!2�4D�/ �/ �+��+�(,�'O�'O� ��:K�^n�(P�( �( �$��$� � e�&;� e� e�"&�/�/��!�&7�%5�"/� #2�#�#��-�_�=�=�=��� e� e� e���"�"�#c�`a�#c�#c�d�d�d�d�d�d�d�d����� e�����s� (A2�2 B#�<B�B#c ��td|t��td|t��|j�|jr|���i}i}d}|jr�|jD]�} |�| |||||���|| d<|�| d|| d��} | r | || d<�]#t$rd}Y�kt$r)} |j � d| ����d}Yd} ~ ��d} ~ wwxYwnd}||d�|fS) Nr�r�Frr�Tz;[FEATURE FLAGS] Error while computing variant and payload: rS) rar�r�r�r|rr"r7rrzrr�) r�r�r�r�r�rr�rIrVr��matched_payloadr�s rBrUz*Client._get_all_flags_and_payloads_locally]s��� � �{�H�5�5�5���&�$�'�'�'� � � %�$�*?� %� � #� #� %� %� %�&(��#%��"�� � � &��*� .� .��.�)-�)C�)C��#�%�*;�)9�/E� *D�*�*�E�$�u�+�&�'+�&C�&C�D��K�QV�W[�\a�Wb�Qc�&d�&d�O�&�@�0?���e��-���-�.�.�.�)-�&�&�&� �.�.�.��H�&�&�'h�ef�'h�'h�i�i�i�)-�&�&�&�&�&�&�����.����! .�("&� � %�h�G�G�I[�[�[s�&AC� D� D�C;�;Dc��|jS�N)r�r�s rB�feature_flag_definitionszClient.feature_flag_definitions�s ���!�!rDc�t�d|i|pi�}i}|r)|D]&}d||i|�|��pi�||<�'||fS)Nr�r�r�)r�r�r�r�r��all_person_properties�all_group_propertiesr s rBr*z-Client._add_local_person_and_group_properties�sy��!.� � Y�@Q�@W�UW� Y��!�� � �$� � � � �&��"4�4�'�+�+�J�7�7�=�2�4�$�Z�0�0� %�&:�:�:rD)NNFrNTNrOrPFrGFrQrRrSNNFTFrGNFFNNF)NNNNNN)NNNN) NNNNNNNFN)NNNNNNNN)NNNNNNN)5�__name__� __module__� __qualname__�__doc__r}� getLoggerrr��propertyr��setterr�r�rrr'r�r�rr�rr�r�rnr�r�r�r�r�r�r�r�rrrrr"r(rr&r+r:�tuplerr,r.rGr7r�rQrUr\r*r�rDrBrLrLds�������&�&� �'� �I� &� &�C�� ��� ���� ����������"�./��%*� %�+/���7q%�q%�q%�q%�f�#�#��X�#� ��R�R���R�1�1�1�1�.fj�*�*� �c�5��s��#�#� $�*�*�*�*�fj�,�,� �c�3�h��,�,�,�,�fj�+�+� �+�+�+�+�fj�4�4� �4�4�4�4�4����� �� ��=1�=1�=1�=1�~1�1�1�1�,1�1�1�1�0����� ���'1�'1�'1�'1�R1�1�1�1�0sw�1�1�1�1�:����� ��DD�DD�DD�DD�L@�@�@�DE�E�E� � � �+�+�+�0@�0@�0@�d  �  �  � ���#�,m�,m�,m� �,m�,m�,m�,m�f���#�!%�������@���#�!%��;�;�;� �)� �;�;�;�;�z � � �� ��S�#�X�� �  ��S��>� � �s�C�x�.� � �)� � � � � �N����#�!%��6�6�6�6�6�p(� �(��(��S�#�X�� (�  ��S��>� (� �s�C�x�.� (� ��~�(� �x� �$�h�s�m�3� 4�(�(�(�(�$+a��+a��+a�� +a� �#�� +a� %)� +a��S�#�X��+a� ��~�+a��S�M�+a��{�+�+a�+a�+a�+a�Ze�S�e�e�e�e�(�C��i��H�UX�M�����(���#��(�(�(� �$�s�E�$��)�,�,�-� .�(�(�(�(�2���#��"�"�"� �"�"�"�"�J&(�2�PR�kp�$\�$\�$\� ���%� &�$\�$\�$\�$\�L"�"�"� ;� ;� ;� ;� ;rDrLc�r�t||��s&d�|||��}t|���dS)z8Require that the named `field` has the right `data_type`z{0} must have {1}, got: {2}N)r@r��AssertionError)�name�field� data_typer�s rBrara�sC�� �e�Y� '� '�"�+�2�2�4��E�J�J���S�!�!�!�"�"rDc�V�|�dSt|t��r|St|��Sr[)r@r r)�vals rBr�r��s.�� �{��t��#�|�$�$��� � �s�8�8�OrD)Ir�r}�numbersrxr7r6r�rr�typingrrrr�rr r:� dateutil.tzr �sixr �posthog.consumerr �posthog.exception_capturer �posthog.exception_utilsrrr�posthog.feature_flagsrr�posthog.pollerr�posthog.requestrrrrrrr� posthog.typesrrrrrr r!r"r#� posthog.utilsr$r%r&r'�posthog.versionr(r_� ImportErrorr`�Numberr�rmrCr�rrJ�objectrLrar�r�rDrB�<module>rs��� � � � ��������� � � � ����� � � � �����(�(�(�(�(�(�(�(�'�'�'�'�'�'�'�'�'�'��������� � � � �������������%�%�%�%�%�%�6�6�6�6�6�6�c�c�c�c�c�c�c�c�c�c�W�W�W�W�W�W�W�W�!�!�!�!�!�!�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q�q� � � � � � � � � � � � � � � � � � � � � � �X�W�W�W�W�W�W�W�W�W�W�W�#�#�#�#�#�#���L�L�L�L���������������� �N�L�$� /��� �(�(�(�V��S�#�X������m;�m;�m;�m;�m;�V�m;�m;�m;�`!"�"�"�����s�&B+�+ B7�6B7
Memory