403Webshell
Server IP : 146.59.209.152  /  Your IP : 216.73.216.46
Web Server : Apache
System : Linux webm005.cluster131.gra.hosting.ovh.net 5.15.167-ovh-vps-grsec-zfs-classid #1 SMP Tue Sep 17 08:14:20 UTC 2024 x86_64
User : infrafs ( 43850)
PHP Version : 8.2.29
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/i/n/f/infrafs/INFRABIKEIT/wp-content/plugins/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/i/n/f/infrafs/INFRABIKEIT/wp-content/plugins/insert-headers-and-footers.tar
admin/images/upgrade-welcome-headers-footers.jpg000064400000231425151331545640015771 0ustar00���JFIF����C��C���j��	
���}!1AQa"q2���#B��R��$3br�	
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz������������������������������������������������������������������������	
���w!1AQaq"2�B����	#3R�br�
$4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�����������������������������������������������������������������������?��(��
��5��\[A�o��##�+�X�Dk��*
�݅�J�u'/gE}����-�Iu��$�v�]A�Es��]=m��e�]4�!��$�8�+py��c��I_�gϯ5���i�*���?��}��_�r��>^����K�?���6���O�-��2���aˊ�u���;Ŀ���o���r���_}O�L9q_ξ��A�x��#��m���\��|��ɇ.+��޿�<�����Ϳ�#�˖�ϙ}�?�0��:����_��������z9r��/���&���_z� �K�?���6���G.[�>e���×���_�w���?��������̾����r⿝}���/��G�|��=�o����S��\W��y�%�����G��-��2���aˊ�u���;Ŀ���o���r���_}O�L9q_ξ��A�x��#��m���\��|��ɇ.+��޿�<�����Ϳ�#�˖�ϙ}�?�0��:����_��������z9r��/���&���_z� �K�?���6���G.[�>e���×���_�w���?��������̾����r⿝}���/��G�|��=�o����S��\W��y�%�����G��-��2���aˊ�u���;Ŀ���o���r���_}O�L9q_ξ��A�x��#��m���\��|��ɇ.+��޿�<�����Ϳ�#�˖�ϙ}�?�0��:����_��������z9r��/���&���_z� �K�?���6���G.[�>e���×���_�w���?��������̾����r⿝}���/��G�|��=�o����S��\W��y�%�����G��-��2���aˊ�u���;Ŀ���o���r���_}O�L9q_ξ��A�x��#��m���\��|��ɇ.+��޿�<�����Ϳ�#�˖�ϙ}�?�0��:����_��������z9r��/���&���_z� �K�?���6���G.[�>e���×���_�w���?��������̾����r⿝}���/��G�|��=�o����S��\W��y�%�����G��-��2���aˊ�u���;Ŀ���o���r���_}O�L9q_ξ��A�x��#��m���\��|��ɇ.+��޿�<�����Ϳ�#�˖�ϙ}�?�0��:����_��������z9r��/���&���_z� �K�?���6���G.[�>e���×���_�w���?��������̾����r⿝}���/��G�|��=�o����S��\W��y�%�����G��-��2���aˊ�u���;Ŀ���o���r���_}O�L9q_ξ��A�x��#��m���\��|��ɇ.+��޿�<�����Ϳ�#�˖�ϙ}�?�0��:����_��������z9r��/���&���_z� �K�?���6���G.[�>e���×���_�w���?��������̾����r⿝}���/��G�|��=�o����S��\W��y�%�����G��-��2���aˊ�u���;Ŀ���o���r���_}O�L9q_ξ��A�x��#��m���\��|��ɇ.+��޿�<�����Ϳ�#�˖�ϙ}�?�0��:����_��������z9r��/���&���_z� �K�?���6���G.[�>e���×���_�w���?��������̾����r⿝}���/��G�|��=�o����S��\W��y�%�����G��-��2���aˊ�u���;Ŀ���o���r���_}O�L9q_ξ��A�x��#��m���\��|��ɇ.+��޿�<�����Ϳ�#�˖�ϙ}�?�0��:����_��������z9r��/���&���_z� �K�?���6���G.[�>e���×���_�w���?��������̾����r⿝}���/��G�|��=�o����S��\W��y�%�����G��-��2���aˊ�u���;Ŀ���o���r���_}O�L9q_ξ��A�x��#��m���\��|��ɇ.+��޿�<�����Ϳ�#�˖�ϙ}�?�0��:����_��������z9r��/���&���_z� �K�?���6���G.[�>e���×���_�w���?��������̾����r⿝}���/��G�|��=�o����S��\W��y�%�����G��-��2���aˊ�u���;Ŀ���o���r���_}O�L9q_ξ��A�x��#��m���\��|��ɇ.+��޿�<�����Ϳ�#�˖�ϙ}�?�0��:����_��������z9r��/���&���_z� �K�?���6���G.[�>e���×���_�w���?��������̾����r⿝}���/��G�|��=�o����S��\W��y�%�����G��-��2���aˊ�u���;Ŀ���o���r���_}O�L9q_ξ��A�x��#��m���\��|��ɇ.+��޿�<�����Ϳ�#�˖�ϙ}�?�0��:����_��������z9r��/���&���_z� �K�?���6���G.[�>e���×���_�w���?��������̾����r⿝}���/��G�|��=�o����S��\W��y�%�����G��-��2���aˊ�u���;Ŀ���o���r���_}O�L9q_ξ��A�x��#��m���\��|��ɇ.+��޿�<�����Ϳ�#�˖�ϙ}�?�0��:����_��������z9r��/���&���_z� �K�?���6���G.[�>e���×���_�w���?��������̾����r⿝}���/��G�|��=�o����S��\W��y�%�����G��-��2���aˊ�u���O�Ps����[�}��Ѓ�I�-��K�:���[��?�J�\�)
Z�y
�Q��'���0L����YA#����)�*9�ʔ�;wDߣZ�m�\kN-F�yn즾�������:v=�<�{W�u@P@	��������a��A���*_]�����1F΀���`�� 7N?*օ?mZ�;۞I7�-�J�"��!)vW��NCI�1���=��;onX.�	��bGU�+����{�騮U����EY/;��x{���)����W{����:B�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
�H�dh�P�����A�� r*�)BJQv�wM[w]E(�'+����ŝw�f������$c���,zd
ˎ�:����xs��TZNޮ�ղ(6���g.T��c�_�73��Gn���<w�GҸM��@��\לr?�����nGL`��:�<���I�.�w��}q����ڻ����K�����Øb�?�w�JE-;�<m��f�q?ǩ�/��C�(�X&~����(��_Ɵ���~!׭���m'H�<M�9��=���s�hVW��i~ls�����%��k^\��
|��
p����sC^<�V��].n_k*T!7J�ԔgU�Tq�i��2K����C��X�Wp��n_S�b�lf3���{5U`�b���,V+�T�R�5燍Z51*�:��/S�!���'��ko��|i�x�“�M�Mwg����$R\�捩��j�.�S�pl�++if������^Z\��d��S�x�966�7)ʜ�8N�X��J���j5R�e�Rr��R<��	K����0��>��\m�br<ڝ(baF��ס��Ur�,f��_���P�O�akՌ+R�����kR������aiku�-r-5�����(n/u�+o���6qM?���J�Z�̑��Y#G�N?�O��2��q<c��˧�s�J�#��}�/���Z�—4U\MUK
NR�9VUjS��xs�x���U��`'�Xu��:��ahsߒ5+֔)�I��R��Y%)(8FRV|�/�_4�?�p��H��b���Wc[��ẅf	!�c�����%��}�<	�Gx��V�;:����ԍmJ���5'N8�.�M�P��Y�t1Χ��S�ϗ.!�l���P�gx	��Z.t*sӭ��B6Rtqe:Sp援�����i�F��7�4U׼q�A�X�7٭�=��u����,-#���EQ�V�#�%Đ�w�W��
���7�ڎW��W�a��W��W�r�8L�\F"j>�G
n��:��|�/��S�����[�tr���1�r��ed�m#+�������7���'��7�t���R�%fH��&{weڷV�{]�Ff����7���5MNΩ��`�%��ա��fXT��
�0��T�J��,EV�3PuUG�g��p��'����nx5(N)��d�i�2�z^��_~v�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@im�KU�a����_��:����?�c�K��?�W��_�K:%`�=���9ϵy��x����=���g����P��h z?��<p9�
�>���$s�g��T�?�B9�j]���/��{�|��?���O�73G�g�n��QN��o��?���O����C��(�kC����|*���/�3��<U��^��a�+χ�'��t&��#��Z����D`��4mSI�..4d�n͝�4$j��_���	�X��N��9�<$�S��
8J4*ac;{8U�V�IJ�j|��yG�����qog	�\7��0T���g8�*�JPǪ�����f�(s}b���a����.���[	���p����(���
|n���[D�s�<�x2�Q����^oO�x�L���5�N��W�Ҡխ���72��,��D��~�Y���x�U��c�
�5�UL7�%WJ2J��Х��jIԅۢ��A����L߁xW.���q/G<��u0ӥV�U�̖[O�b�S��15热�����SJz�1�2._k���,^=�<Y=��υ�4
.��ӯ�./��L��V�i����ykt.%��G�����$��yo����<3��pfNx<���cg��+M^j��[��}��X��������?�|	Ͳ��+'�R�,چc���ùF5�4+R�Ɩ.vuaMS��N^gEӃ���ܷ�a�x�?x��oum�Yt�i���5i5+����-�m����4{�
}[�L�=ߡ'�>!�n/���z��HV�	���y�L����֎#�7��F�j|ʄ���s)U�W���m��-ʲXԥW7�b��%T�`��Q��k�_Z�Z��	Y�XyNւf'��^)��<�{[��	Xh�z=԰F�Z�ڴ���4��7}�u[g��)�U�G�|���1#}7�'�x��a��KG����,�嘊�iʥ�1�2X�W�`��ҧVq�9����8���*�^S�be*�*ri7u��/��\�7�p��cͿa/x���񅝝�t}Y�յW�X��]��U��h5) Fo"2c=���<7����\6G��̧3�f9��T�[N�>YJ�����U�K:Qo�S�s��r��q�����X�d�S�R5'f�'$�i���5��E�iؚ�K��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��3��٩j^�c�!?�~��<��W�����q2��}_���,�c�8�8�ߖ������\F�0F:v;29���;n2`?N���}(��q۩�������̞L����g��HG3�ɛi�%S��=����n������a����_�):w�x��!��m��=O�~��?‡�Qv�4*��Y��m��-�mّ����a/�#s��Z7Utb�GP�A���Y�3���T�tj��=Mh׭�����V�D�R�IҚ�ӌ��ZQn2W�M�t�*�@UU@UU`��*�3m��m���ն�m�ld��24Rƒ�����=a�A)ӭ	S�Ni�Zt�F3��iBI�Kɦ�JS��	E�2�q�}�Vi�1ʪ������UTUUUU@
q�a��!��1J1�b��*�E$�I$��nM�M��m�v�նޭ��optY��]J:8��ee �V� �A�(�q�'(�8�2JQ�d��$�i��VkF-�{
�(��"�8�1�"�8�}Q�4�ӥӥS�hB�cEv�b�b��HIY$��-�IV@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����8��HGl�^�^'��	�q���տ���f���������W���멲���������T=�����ǯ���C@
l��8�T���:��3�~��Bf��7^�Ƕ�q�C�kD�����r�򒬙���0=����������܌1—����#�ӿ�����kLO����E�?‹���P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@r�.ST���=�ȁ?�=��q?��_����������M�G�=��������n���N�z�y���?�CA2s�c�?�.����.���P}�|{�cק�׿9���7l0z�^Oq�85�v��K���^M�]AY�F���T��<�p{c��·
�j׌*����)�}���0������H��t�)�t�@�
��C�&���K���k��b��=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����=a��
��h�Яڗ�
�}^�S�a�������*O�B�j_�*!�x5O�
��#�޻���?Ə�
��ਇ���?�6�Xz���?�+�����W��T����j��Xj�L%ʴQ����#70�g$:`
j֝l=ϖ�u���U��kM�}?��(T��oH=]���h�7�g>��q�x��q3e�_�S��?(��q��ۦzVr��4S����ϭId����y�>Ã���f�p��OL}y�D��?��sw�#��]A�{ֱ!���������|w���ӽua�'�^�骆U~�?�^q�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@ylj��s����3���q�ܿ�h������^�
?�������=;��q��������z`w�}����߿�4�4�l����\q��Ҡ�j�N����?��f�rz��<z������r�zds���y�
l����i8Ԭ���Y���������[�L�2������z�y�PP@'~���ÿ���:�I�͎��][]״�|9�}�{����'�u�x�O�v�`��̿��#Eid��oo0�v��R���|[���/�'�������xc╯�|FҼ1�_̱h�_ĝ?ð}��/vdA,��.���\� `|��-~1���w��@�~��ͭ׉�գ���_��Zަ��b-`:Z�Eh�Iqs��F#!�>��ğ�^7�մ����~/�t���l</�_��n�s�ڵ��}w>�p�+F��G��Q�0"�>D��?n�ߴ��|E�?7�����$|�<=�����6
����o%���2i֖�3@Wayf�>���<
�MMgǾ3�4ygKX�_��H�֛%̿��Y���y��
�d||�h����пe�
~�~*�|;m�3I���@��v�}�x��?NOh�&ՠ�U��jڵ��xtƶ�� �K"\����m�b��>��s�t�6������ipj���a/�[WT���KK�<zw�Q-f#F���=��;�����a�ٿğ�߂��>ּ=�7��h�YnN�zl�a%��F-��P۱�p
���<]������Ǟ;�o�SV�[--�]��k�^8%m4��o����J�nd��p��4��x_�z�(��4
�V��ws�-kXӴ�
��@w3��i�[�e)4�X�(���/����_��Q�����u�/[�B��+��W6"RR'>Z�_�><��sx�O�?f?
�A<?�b����'�9u���F���V��6�5�i�ڑ]\��e��{;��nr:P���߆�7��<��B�>��=UU���^,�l|O�+3"���u�x��Ȧ��@YYG �>����n.��I�x~������[�6��\Y�_�k��/�m巷���Ť�*Gq7�g��:=OT�4[�WY�lt�.�	n��-N������2Mswyu$V��E��4�$q��f
	�[B������񏆾 �#�^�����z���/��n>׮X_�i��@ ��]'�/�4��χ��S�:W��~,�M�Y����+�ɣ�B�ڪh���jO��[�O��Yau�9Y1�'|j�'�M�S_x���0�|S�OM�}��:ݟ��;�e��&�mP�r�Fy��D_y�e_�[H���f/�����m��F���S⛭3X֭f�����Zȷ����Z���1��dH#P�v1��_�;������&|@��o�|:�Q�Mj�I������G�(��KR��5xV�(.�e��[]i��SI�&��?�ef���>|A���>:�w���ۖ��g��Oçݯ޵��E��K[��('h�ր!_��
�ŧ���
�
ܟ��4��n�v�l_�l�[#l���9�ô��+�6��O���E��H_���V��B�t�|=sk�j�ZD:��T�}�{��`��[�<��EH�?Ŀ�1��??���;�6�/?��%�l�$fg�?
��<k2���U�$(&�%����J��E�u��;X�RҴg�o�O�Y�i��h�S�\_Gt����ºU��]j
4Ki�D���
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�Nq��ӛx�����O^�ܿ�h������ş�i���<���3�����}k�.�Sk��c��G�'��Y=�-ѧo~z�~��銃Bz��C�?�� �9��_���4'���~��G�3��C[ǯ����S�Bv����~˞��N�����eW�������󎠠�?������a�gQ�ouυ?�7�y�|`[;K���˩ih|Wqgm�I!Ѧ�iO%�/Z�7�|
���~�>7׵߅W?�������/�~1���ׁ��+�o�'���ڎ��K��s�ڵ�V�����[�-_�v���m,�<Q�� �O����������u��}v��c�?��w~i�Z��ms'�m�"Mfm�ͅ𜺘�1�+hӾ�)V����C��q����	�u�e���
{�m�j�T�R���–�����6�W���Ʊp��e�X�Y�6�8�m��|K�sC��~꿰��T��u��!�ϋ�����N�%��������|$�f��{�n�"�|o�ѭ�Y�h����ako�}��D�#j��O���>x��o�a]#���3���
��4]cP����G�N�*Yx����Z�6��j	���֖�p5���p���)�?co��G��J�@��L�<+cọjo�x������X��(�̚$�G�������N(���a6��#��-�+��Q��>�A��%�t��!�Z��O���n�L���(̑�eHĿ�X�����/�k�^6�_��O|qѬ|S�Y��L��OQ��V1Cyv��t�K���_.��X��P/�WD�|s�B���O�o��i�?��£�m������c�C~|Ky�,��r��M]	���
]c�;i��I �[�7@���`_���%�O�kO��_����/��#�Z�q�'x�^����+Ƴ�:N�����Ú�����
i�����[��.HP�kW���3�
��߄���{?�x��>��-�j��U��?º�ȱ���|=oHuQ�_�v�� ԢX�/���1�Т�e�����^����v�����~-�w�4��Ϫ��v�B����Ļ8o�!�zn�|C�����X&�"\�m�M�,C��!x���h?~�����j��;��|O�b�������u�W��om�4=��o�j�W�h +t�Y�(��	�g��y���x3�ߴ}������M����wڄZ�|I�K׵������z��$�W������W��y�\�y�c���
㟇��o�^����A��m�k���W�4+?�?|K���扮�7ڍ���w\�̱\j>�Ki
��Yt�D���D� ���h�/����?�s��v>������h?����mK�{��L���-��7����l��
b�LE��%x!��>����5������~9�%�u���0���G�c�/�����G��|}�=#U�\"���C��j����d�6�\�h���i{-��~�z�੾,���/�WL������o�j��⶟�C��o�R��w6����>&��t�}��́l��"M�2~��*<'��-?fo��E����G��wB� [�;U�n�}U.,� o�X&_�D<0�?�?x#H�g����9�LJ��?�O¾���_�y�5�S�r�S�/l��J��h~ ��g�t�iA������[���'�'�=�����k?�o�9~4iu(5�	>�e�-b��׋��}w����q�c���x��Y#7�Xـ>�t���	K�o���tD�����}�z���u7�+/��	ЏS��J��Y�>U�F�"GKh#i.�Հ?D��0�O�}���)������د�>[km�i���6���-q��E�g�=S�W��j�X����h�D�@寁<�;���E�/|K���|t��������i�����;��4���l5)f�soe��c���L��{����ڀ~��˿>�`���~�^#����+�?���?���e�OQ�Q�N�>#�|0�st|q�iS}����ԭ�L�P�[���kh%iF4P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@y��?�3�p�����w/�Z?���9��j����Kaۿ��t��O�z��4�uV��g��~q�?�L��CR>��t?���;���51�}��h2~��p{��zS��}>g7y�H<�������o����fg4��������|s�؎�Ӈ��{���jU����q=~��(�
��6Z��曩Y��v�kqca}oݕ���O՝��$6�0I$7�F�M�r##@<[����8|��U��7��&Ԓx�|C�^�ֵ5��F�����Z^�c;Ə-�Gh��	e�=O�q��I�|_�=+�~�<C�;H|{�i����ao=��^/�-�c��,vV�WV����z��3�H��X��q�;��=�k~!�Q�[�g�m{Ħ_��k���υ�]Y&�]Ko{�i�wSZ5�?bi~�'e�I�P5��/�ͤ\^~�_�'�5�G�Z$��&�>��mb��V�
����FֵK�K[�GS�m�ݵ�����N�o��?~,]�sP�����k���w�;��'�~*�����o$�hW�}.��Iii$�bxD�Z�� g������Ol�s��K5���_��k/ÏIl��7&o����!��M����!��ܖ�O�.��Ɵ��#L��~"x#�=��^��O�<5�x�L�״�#izݝ��e}km��4��R�$��2�m挻d����|N�DŽ�$�#��+w5��߆|q�Ş���2�{�^��4٦������l���4�P��;�h҇�/���)
C.�'����M�3��(�g���٬���M�6�W;@�$Q���?��#xOI���<o��[B��xkDm.m�#C�tۭ7L�
��[_�[A�Z��=�3F@'о
�!�O�*�o��<_�Yxŏ�x�C��@�4��'��O���Z�4�$�.�Mԍ͕��M��m���5�.��>
m9�%�=|�̚?��t�4/�^ҥ�|Z�Ij�'�$�С�O�㴚[Hu{F��Y�)�1��~���<y�|Q�����'���Ik6���{�u_Y�bQ�&���Tڧ���h�|�r�`�ѡl����8<iu��F�w�-���|{��h�iw��Y���A��BY
r�E��v��K���a��X�W%�<w��?|9w��~	��
_<R^xkƞ�|O�\�o�Y��j��I`�Z$M�F�y�/N���g�"�RӴ��_4�?Z�_��+�^
�����j�A�$Z���t���ͤ,߽bO��:}O�O��kL�n���6���|9�ѵ��F���_����Y�~���Zt���Э#��F��"��L�D���U@?�O��?�|i�|�Q⟈0�6���E��Z׋Mkg�6�j:MΪm���-�]��Y��VdF�|+�/
x�_���x7º%��4_�WE�|=�"�;H-t�H��Ӭ-Ď���[E�fۖ$�bh
�xW���</��~����w��<!����ɬ��^xgNӭ�[��C�Ԗk'���B]� _���#��߄_
�.�0�Z>�W��)&�*�����t�9o��O�Gr��l��cS�΃�n���$����w�X>,K3]I�"/�����x�A%��"�CV�ѕ%x��E�ۥ���.0u~"�Q��*�ǎ�Y��'�e�3�>"�w�u�xFq(�M��Zuί�J'a&�yh�P$���.�f����D�>�$����u�{������{�E�	,�Sj�Q�c�P7F�(��9�?��;�3���_x�Ǻ7�<#�����XZ���zg��kx��J�+m2��^"���X֠ӭ����J��;8!�+u�8�@]@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P�x��C1�׼���������[�q�?�����G@H�x�����4�u:�Q����q���{��Ѫ����ׯ�#��Q�d���>���Ҁ3'�d��:�~��N;�����0~�ׁ��fs+�!;,��~���O^?�WN�����eW������:��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�6�F�c��x�>\��_���o��s���
?���à	��=��o�k�w:�_������Ҳ{�n�8��[�w��
K,��~��@���?��9�ߺq׏o����L�Nr�t��cp�EZ6\�`��*v���r�⺰���u���O�ʧ�oC�K������MO��=��:��^f���>ݯ��ɩ�����GG*�g�n��d�������y�3��k��2j���Q�ʼÙ�۵��5?��(��^a���������{��tr�0�~A����MO��=��:9W�s? �v��C&���~����9��}�_���S��?�U���>ݯ��ɩ�����GG*�g�n��d�������y�3��k��2j���Q�ʼÙ�۵��5?��(��^a���������{��tr�0�~A����MO��=��:9W�s? �v��C&���~����9��}�_���S��?�U���>ݯ��ɩ�����GG*�g�n��d�������y�3��k��2j���Q�ʼÙ�۵��5?��(��^a���������{��tr�0�~A����MO��=��:9W�s? �v��C&���~����9��}�_���S��?�U���>ݯ��ɩ�����GG*�g�n��d�������y�3��k��2j���Q�ʼÙ�۵��5?��(��^a���������{��tr�0�~A����MO��=��:9W�s? �v��C&���~����9��}�_���S��?�U���>ݯ��ɩ�����GG*�g�n��d�������y�3��k��2j���Q�ʼÙ�۵��5?��(��^a���������{��tr�0�~A����MO��=��:9W�s? �v��C&���~����9��}�_���S��?�U���>ݯ��ɩ�����GG*�g�n��d�������y�3��k��2j���Q�ʼÙ�۵��5?��(��^a���������{��tr�0�~A����MO��=��:9W�s? �v��C&���~����9��}�_���S��?�U���>ݯ��ɩ�����GG*�g�n��d�������y�3��k��2j���Q�ʼÙ�۵��5?��(��^a���������{��tr�0�~A����MO��=��:9W�s? �v��C&���~����9��}�_���S��?�U���>ݯ��ɩ�����GG*�g�n��d�������y�3��k��2j���Q�ʼÙ�۵��5?��(��^a���������{��tr�0�~A����MO��=��:9W�s? �v��C&���~����9��}�_���S��?�U���>ݯ��ɩ�����GG*�g�n��d�������y�3��k��2j���Q�ʼÙ�۵��5?��(��^a���������{��tr�0�~A����MO��=��:9W�s? �v��C&���~����9��}�_���S��?�U���>ݯ��ɩ�����GG*�g�n��d�������y�3��k��2j���Q�ʼÙ�۵��5?��(��^a���������{��tr�0�~A����MO��=��:9W�s? �v��C&���~����9��}�_���S��?�U���>ݯ��ɩ�����GG*�g�n��d�������y�3��k��2j���Q�ʼÙ�۵��5?��(��^a���������{��tr�0�~A����MO��=��:9W�s? �v��C&���~����9��}�_���S��?�U���>ݯ��ɩ�����GG*�g�n��d�������y�3��k��2j���Q�ʼÙ�۵��5?��(��^a���������{��tr�0�~A����MO��=��:9W�s? �v��C&���~����9��}�_���S��?�U���>ݯ��ɩ�����GG*�g�n��d�������y�3��k��2j���Q�ʼÙ�۵��5?��(��^a���庖�'����l���o�m*�l�aڼ�[�~f`;-l-��[�q^�g���Gcۿ��;�9�{��4:�l����lu������t>��;��4&�?A����>�矨���Jkq=������{��,�`m��39;���?���?���n�xo��:��j��O��އ���qP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@���#<�ӷ���Z�����o��f��?��o:+��'����g�����קA��ӿ=�?�����]
X�c���=�?#PY5F����?�(6|�<�c��8�_N;�[��9���>��?�~u�����F�>�������ǯ���7�nU��U�|?��?���(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
�/7��O��5�ݨ��������tv=G=ǯ���sӜ�=����-z=>��;��ONk'��ԏ�N�q�z���
	���}}h2~F}��=��q3����LzL{���h�~fl��9��=�����q�׆�#�_�5PΧ�oC�K�v���
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�
Sc�1}������o��f��?��o:+Îݎq���&���k��mק�ӿ�ON�f�@�z��zv=;OOq陡5G'A�����l�:z����Mn&sw� ������+tfrw�L����?�ua�7�
��f��O��އ���qV���M���u�k
>��{���⵳����纻��������i��(bG�GTR@eω�5g�C�;��v����[}v�V��F�+«i$:��e,wE�[:N�9u,2�@U����l�F���O�������x�l��by���xබ��7�y�t�����Y^��6�چ�wma{WVw�S�uiwm:	 ������6Y"�'x�F�T�@���
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
�7�|E�?�O����ݨ��������t�'��ey�c����W;��k��-}2�Ӱ���f�@�_��jFz{�`t?���Y�����d��Nx�?\UGq3�����z���z�8涏���������ǁ�u�����Ն���ʿ�f��O��އ���q��&c�]ٰ�|��U���эn�O�?�ƿ�����n��?�_
|?�i</�_�?/��M����ż��/�{xn���A�ȶ&G=�̴�m�v�����7�'�dk��i�>i��ѿf��V��ρ�7�o¾1��i�'H��~*|F�<W�k�}z=P����V�M�pj�u).��ػ�װ����_�wǿ	j��{���cҾig��_|
��W�<;�x����'���������� ����<������p�^K=�6�"�Ư��������G��⇃�|$��>x���	���ڇ�U�/���x�U�|Su�Yjz�b��4ͦ�$^���p]������+hy���k?ڊ}��߀��6������g��~����i|i�_x�WL�������¾��HT�Z �������I��,0̛{zl�;u�{����h/�������G�G��
h������7�t�jڗ�5��/��#��w��F��5�������:bX��w1i��B�׮�?gi�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P)��/���c���u��j?���3_ğ�a�����pz�|�鏯ι��/빯s��<w�{t��	���C�
t5#��������fY=G'o����7O|�_�~)����*��O�>�1��x�frS���{9����=9��ua���nU��U�|?��?���(�k�~���/���>1�WZ�<5��?�:;�^Y�����wZ.���ޟqi�Z���{uj�7v��	L��̩"�y���f߂�6�9�|�?���~�v>�t�>��[Xm,�"��xv���6� �i�gl�$����X�{���<���~��}w�3�_
��o��3��{o��E�].�$r���?�~ Ӽ3����$i��%[{�=��JX.̏��>�d�%�e�r�T�>!��C�k{��FмIqaek�����o����cekoa����%�9-���D�Y�x��	�|O�-�|m�cL�u�S�~���'��[?xkL�_Cҭ�I��^%�t�jF��k�kڽ�濧{�u8�4�>[R�?���	��$x������|	��0�ntO|A�ơ'ý!#�N�g�5?x�J�|]�ڤab��UֲT<��}���,��/~�_~��!��z_�<X�|1�_�7Z���|4�𵦃��������=���!Ow,J���(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�
3��o�o����G��V��Fk���?���3������zf���j��E�@:�t�g�~�>���
t5c��?�]9�qPY51��fO��:u�����Tw9���''��Ӹ�?�������'?�|G��Ls�z���+�
�O�r����gS�����Ļ\F�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P)���?��k�z~]������Fk���?��=?{p9��ێq�y�#^�QiӜ�϶p}���z��t��j��=���?�PhM@~������2{�*̸������ӎ���z��O�s�N�q��~�<d
�?����~�y��8?�w�9��5Ն�'��[�MT3������]�3@��!�x��i�m��A8$�v��,�쨊,��U�x��=K�g��is!�������M�9Xh��Կ��&�d�����iz����-��8$q؂?
9�r�O.�����M�s �a���#W��	�Žd�<���j��7�Q̃����@�_�&�
9�r���������G2V]��5���(�A��˿��F�����9Xyw����o�+.�����M�s �a���#W��	�Žd�<���j��7�Q̃����@�_�&�
9�r���������G2V]��5���(�A��˿��F�����9Xyw����o�+.�����M�s �a���#W��	�Žd�<���j��7�Q̃����@�_�&�
9�r���������G2V]��5���(�A��˿��F�����9Xyw����o�+.�����M�s �a���#W��	�Žd�<���j��7�Q̃����@�_�&�
9�r���������G2V]��5���(�A��˿��F�����9Xyw����o�+.�����M�s �a���#W��	�Žd�<���j��7�Q̃����@�_�&�
9�r���������G2V]��5���(�A��˿��F�����9Xyw����o�+.�����M�s �a���#W��	�Žd�<���j��7�Q̃����@�_�&�
9�r���������G2V]��5���(�A��˿��F�����9Xyw����o�+.�����M�s �a���#W��	�Žd�<���j��7�Q̃����@�_�&�
9�r���������G2V]��5���(�A��˿��F�����9Xyw����o�+.�����M�s �a���#W��	�Žd�<���j��7�Q̃����@�_�&�
9�r���������G2V]��5���(�A��˿��F�����9Xyw����o�+.�����M�s �a���#W��	�Žd�<���j��7�Q̃����@�_�&�
9�r���������G2V]��5���(�A��˿��F�����9Xyw����o�+.�����M�s �a���#W��	�Žd�<���j��7�Q̃����@�_�&�
9�r���������G2V]��5���(�A��˿��F�����9Xyw����o�+.�����M�s �a���#W��	�Žd�<���j��7�Q̃����@�_�&�
9�r���������G2V]��5���(�A��˿��F�����9Xyw����o�+.�����M�s �a���#W��	�Žd�<���j��7�Q̃����@�_�&�
9�r���������G2VS�J�1y�Ol�?��������������k�녣�_+�3%�Z�����ΓO���1�^�g�zW3��s���u�ۧ?ʳ{������0;ӌ��f����>�?��3'��=��*kq>�9y�[����������J�>c��l~\�z�7�?�ʿ�j��O��އ���q��Ǵ���Җ��R���a@wz/��m����(V�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��<������N���<��Z�_���o��s���
?���Ã��q����X?�ӹ�Zg�u���Z������Տ�~������f�	�������̟����5��C������zq���Ӷm����|����?�=�힬7�?�ʿ�j��O��އ���q���Ǵ���Җ��R���a@wz/��m����(V�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��<������{����k���������S�4���{q�t��?\A��b�CN�Sk�1�u��g�VOu��5���#����N�~_�?��?�~�����M	���v��x�=y��z�Ҷ����W39���:}����}Os�]xo��ܫ�������q/W�P@���{A�a]�Oz})l���-ѹY�r~7��?
�^'�muK�=6	���F��Q��`�k�<�!DH`�I'�ⷅ����j)>Tޮ��tu�:��a�[�jv��	����yÄ�w�r(�/��m����(V�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��<���������G��]�֏�|����w�Z����؃�N�s��� 0p?�i��m÷N���;���]
X�z��Ӹ��j&�ߵf��#�n�x��_f�9�ߺ��8�����?��?��?�q�����^����_�5S���3������]�#@��35o����º���R�]J[�r�,���>)��<5��zf�y��:��%����k����ō̉eg��ҵ�%Ǚ�甮��)|��i�e}5W��w�:f��xwI�u��3R�4�;{��t�*�xm!��W���4r��RodFrJ,k�+�[|���=E��m��o�%5h��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�|Q�!����?���⻗����[�q�?�O�o'���ϧ����/����
;�_�u���s�_�}�{�n�X����=;�=�ߥAd���?�(6nޙ>�_���ӎ�g7{�O#�Gqߠ+h���~fg%8�IOwc���?�2q�u�?�r����gS�����Ľ\F�@fj�����t?�=�����F�fXP@ދ� ���:Jՠ�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�6�?����?���~���Z�_���o��s���
?�����x�L���/��:�^G'����������sN>��Y���О�����8������ښܖsw�+v���c۞�G�ȆrW�Jc����s�����
�O�r����gS�����Ľ\f�@fj�����t?�=�����F�fY���S�5w}���M�Y�
֭�j6?�GO� -.�&�dق}]�_/N[�n����̳�;`��e{h���[y����R�.���~.���^���{��٬�[6���Ǽ��i%��Ե
i�ڦ�$d�u+����u{�n����ӣ��g�h��
������Q�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@m���x����G��W��G?�����y5�~����N�������i��m@#���Оߎ
��tjG��?Q����hM@|�_�ϭfN��O�ޜw9�߸}8���*����\���g׌�_�]xo�ە��C:����.%��4
(3V��h?�+����O�-��ԥ�7+2�o�^��t��Oؾ��}��[������i�-͜�s�]�]��Ή*�/���IQ�a4������

F��k�iiq���@�w������O2�T�����f��������
Ĉ�I+-�o�=?E��m��o�%5h��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(ͼN3�G�=����9��r�u��_+�#��^�4���[n08�ӂOSׯz�_�gUi��G���J��5�4Ө�z�����5��=1�z������?N}��_ӷzkq3������a��:�����w��~fg'?�|��zgn��$�
ua���nV��33������]�#@��35o����º���R�]J[�r�,�i���渖(!�n�Y�X�EY�r��z����"I��Ȫ��рete%YYH*��AP{���6��7����5h��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(ͼQ�!��;�|t��?q]�֏�|����w�Z����X�c�|�G���L�w:�^�x�	_��Y�����4������DO@~��_€3.=?��z~?��9�ߺG=Fy�9����[}�}~����)�~c�9�ߦ8�q�]xo��ܫ�������q/W�P@���{A�a]�Oz})l���-ѹY�y��h��|(��{�b�-N�xV�ú狢ӯai�V�1�ɡյ�.�p�wan'�9$��fH�&V���z&��e�2���:����z}��qiu�X`�P���'��W�Z��u(�mQ#��
[KkMKK�梋}��6��F�u�=�
ѭ��}:_t�-��_��f���R(ՠ�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�6�G�����x�g�?�����������S�4���[��U��=�X?�ӹ�Z���	�F}��2=k7��i��?ǧ�}�`�1PY=1����t�?O^������S[��9�ߺݹ�x�;p~�8����fr7����C���x�uῈ��W�L�3������^�#@��35o����º���R�]J[�r�,(��E��m��o�%j�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P�x��C1�׺������_���o��s���4���k1�Ls�ݾ�5��
;�M�N����{g��P��4��zq�/�ӵfhO@~��<��Pd��zc�:kq3�����OÏ����kh����O���q������_ʺ����*�骆u>�z�\K��hPf����WC��ޟJ[?�KtnVe���a�R�uGt���%���͙�5��o �s;���CK<�Ƨ,(vWf���umor�$kqS�s(YcYcYJ��,�k�f��恞����6��7����5h��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(ͼQ�!��:[���+���������S�4���k�����v���sC�����N���7��5����ޠК�#������͟���}{z�ӊkq?��/�����{���3��������7�_��ua�?�r�����Z�W�����Ľ\F�@fj�����t?�=�����F�fY���"�ImoSоŭ�Z�]iia,��h�K{�u[�Y�>ض�2B�$��+��7�����A��������SV�
ϊ/t{O�I�][[Z��qe�8mb�VA���ϰ,���wb��W��x��o���GIH�V�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��<������1�����ߎ����G��V��G;�-O���ɬ8۟a�^ǿ�~q���i��-sߞ:�y�Y�{����y$t�#��~=�2���ӿ_��(6~N{�?�?�n�㸟C��i��Ө�y��������������:�a���nU��U�|?��?���(��[�=��������>���R��ܬ�
(���o���GI@�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@��'���~�gLt�����r�u��_+�#����a���Xu���z��Φס��׷$zw���7���i�Q�~q������z̟��N�����L��>�g��<d�tⶏ����}�?|�3�u����:����*�隆u>�z�\K��hPf����WC��ޟJ[?�KtnVe�c�g[�f��|����4--���"�n-4�ˣ��u�qy��p����{�hbyY%��&m��w�Z+����w��G�t�T�jwB]OL�..t��]ŭh��i��B�]��旪�]�PGuq�j�����1��'Ꞗ�;==Q�:/��m����(�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@m��^������������S�4���k�9 {�\�>���V}�w:�^��qקN��~+7�-Ѫ�����9���j
	���������=���N;�����=���y>�}kh�w39)��Ov?�?�zs]xo��:��j��O��އ���q��Ǵ���Җ��R���f��1�x�OM7[��h!���-&����
?P�fk[�7T��l�-:�α�Y]A0I%�y�Y�4������x_I���+$��,����i�滹�������I��뛛�GP��{�B����{��I%e��z/��m����(�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@m�����x�Bƻ�����_�q�?�O�o%��~_Lv�};c���i��3����w�}}s�<VOp[�Q:����3��4&�?A����3'�t?���?�8�&s��u��ןN���:{V��ufg%>>�1��OL�8��/N�7�?�ʿ�j��O��އ���q��Ǵ���Җ��R���b$�$�I=���2��`A�AG ���E��m��o�%j�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P�x��CQ��t�u�]�֏�|����w�Y�����K`1�ב�}q�Q��ߌ
���4�uV�;���=1��ۮ8�Y���kti�Q���O���'���>��޴�?����矦=)�q>�9y���?����ӌ��/�͜��)�����ש�Һ����W�MT3������]�#@��35o����º���R�]J[�r�,񿎷�~[M*��M���G�>�a�_kwz?�/��u��t�5����ǧH��%���KёnAkr'~]:���Ӯ��j�Ư�m�\�K��U����/4��t=+X��<9��P�k���M�Γy,�:q�6��h�q��*�}-u}��Vv�{� ���:JE�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@��(���}��>������G��V��G;�-O����l9����=ǧ����_֦�Φ�qӷ����k���F}��OO���d�����T�?���s֜w9��m;�?���{�t�;��#3����1���s��:v ��
�ە��C:����.%��4
(3V��h?�+����O�-��ԥ�7+2€
��_��f���P�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@y��?�3L��1���c���������S�0�ۉ�;}A9�/�����
b��w�?��Sk��s���q��Ot5�Ԍ�?���۹��j&�߷�t�~@�l�9��=w���sw��o�#��Ҷ����3���>S�;_���׆�'��W�L�3������]�#@��35o����º���R�]J[�r�,���<;�D���A�/魪�?���h�F����M�&���7n��+�<��3�>��6��o��M��Z���m�ɥ�WzUђ�RXD�VS�iў�cռ�A4n�'uu~�鳷��=�A��Y��t�ՠ�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�5�G��c���d�3�޻�����[�q�?�O�o&���dc���n:���"Φ�q������{�n�H�z���j
	�9;s������?�=z�������r��l�y�~���=
m�#3����������y�]xo�ە��C:����.%��4
(3V��h?�+����O�-��ԥ�7+2�sźv���wTҴ�t�GR��
j3y����e�������VO;X9#���"�i���?�cKHҬ�='L�t�V�O�,,���ZX��mo
~H�A���mL��o���GI@�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@��(������?��ܿ�h������ş�i����=l�0:@�����X?��u:�^G`�8��S��Ȭ���ӏ��=}�\���A�=F������{��߯�����sw�p���#���G�����frW�����??��^k�
�O�r����gS�����Ļ\F�@fj�����t?�=�����F�fXP@ދ� ���:Jՠ�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�6�G��c������y���G��V��G;�-O����l;w��Ԏ��I��Z����Ϊ�s������3����jG�����=GX4&�?o���?�fO����Jq�O����>��Sӷ������������}��?���{]Xo�ە��C:����.%��4
(3V��h?�+����O�-��ԥ�7+2�+���MS�����F��|M��
6�\��b�[����E���Z�$��K�����4��y&6h����t����_CG�W��<s�m+�z�v�_\]�1ۤ�|�'�5M9n�&g��5+�4���M
���B�&��.������.�7�����=�E��m��o�%"�Z(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
�o��f?�������Wr�u��_k�#����!������	���߃X=�F����Sj8��=�?>�1t5�5S�>�������3,������:Pd�̞y�^÷=��q3���0�ԃ��?��L�J�>c�ϯ��2z�"�����W�MT3������]�#@��35o����º���R�]J[�r�,�<M�M�V��RGc�[�����j:~�h�%���������1Gq<{�@�M,2��GF�{����%�߆�o	i1h�
���Gqz�{��B��T���=B�P�'�����5�����˙�..'�I$$�I+#�t_��f���P3V�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��<���ُ����=s�+���������S�4���[�q�'�|��}���_�i��~����??OJ��5�4���oq��5,�z@1��f\s��ƚ�L��~��^=��OlV�39)��vc�dt�cӷ^+�
�O�r�����Ù����q/W�P@���{A�a]�Oz})l���-ѹY�Pw���6��7����5h��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(ͼPq�E�^��ܟ��]�֏�|����w�Z����X��G��=x����
��8�==G��x��'�.��v�>��N�j
	���}�fO����?��Қ�Otsw��c���q��?�G��L�N�?i�������sۧ^�������gS�����Ļ\F�@fj�����t?�=�����E�Y�M+S{�ɴ�t��Z�P�`�0���[��0Y�P4�1�P�o�Ne���|�픿5�w������lG�k���$
�]CW���Q׵)�ֵ=
[մ��"��7�|wV��&��������4�Jzߛ��_�����m��)�-u�����Q�dZ-��S��]xE<_��\{�%����ƒG{{�e��OkH�\�$�'��4�R~uݿQh��
������Y�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@m�l�y���nO�z�r�u��_+�#����i���=F=FO�Ǹ9��X?��u��u6�:�~����}
f��j���9��ɨ7�=O���@����#}1�|��qޚ�O��^����'���w�fr7���ހ�?^=}x�u�?�r����gS�����Ľ\F�@fj�����t?�=�����F�fX� x ��P�w���6��7����5h��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(ͼQβ����5ܿ�h������ũ��y5�Q�q��:t���Oz����-z=>��;��ONk'��ԏ�N�q�z���
	���}}h2~F}��=��q3����LzL{���h�~fl��9��=�����q�׆�#�_�5PΧ�oC�K�v���
�տ���
��{��Kg�u)n�K��k[��ۈml��溻���b����6�{��r8a�I$rY��	���Vy�|d�~��>">�s�tۛ�9���xod��fY`���MZi_ax#[ �C�����G<yy���?��="��
B��Ջ�_[Ayn�J���$�*�2��ԕ`��"�D��o���GI@�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@��(����?L�r�u��_+�#����i���=������Mb�CN�Sh~�?N��{�zt7����CӰ8���z{�L�	�9:�C�?΀3g��ԏ��_��kq3���O�e��oa[�3����c�}�,�����k�
��U��5�|?��?�k��(��[�=��������>���R��Ի7+it�P[��yͥ��̖v�"60Auw�����˲9�c���٥KK�Q�Y󝧃�//��&�f�ÿ
�S��.t�!���y�m��Q�x/��\D�Ds��f���4�J�J��+����	���%hݷoy����=��V� �𾍧���F�}:��O�Y�״���+h�#�5
�W%�X�� m-|���2�j������G���
������f�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@y��?�3�{�u�=?���֏�|����w�Y�����Mby�W��?�돥b��w:�_L����>��Y��.���y����������f����>��>S�?��Q�L��~�~��鞼9���}�g'?�|���t}�����ua�?�r����gS�����Ļ\F�@fj�����t?�=�����F�fXP@ދ� ���:Jՠ�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�6�G�����x��x�������G��W��G;�-O��o&��Uc1������ӹ�Z;�=�~������N{^{�,��#���J͛��O�������}n��?�ۧӟ^���v39)���=��u��Fz���溰���*�骆u>�z�\K��hPf����WC��ޟJ[?�Kti^�s
���V�yy�Ė�o2�-��D��\2�۬򄉦du�1r�2��<q�_��Ʊ<^	�A�x�W�u�����}C�/
ꚳK4���ef��d���L�%�c�B��[��$�}6=�ψu�'�!�t���KU���H!I����]�E�j��D���k�tv�յ��u���^��	��E�ڳ�ֶ��:/��m����)ՠ�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�6�A����쟦}�ϥw/�Z?���9��j����Ma�g�O@?/s���b�CE��-z���8>������k��l�����ӊ�ɨ��}h2n��ӯ׾j�����gi9<w�������w�f�99���>��zc��׌^q]Xo�ە��C:����.%��4
(3V��h?�+����O�-��ԥ�5n�V��Y�0M��g���MFe��2�
����@��*+2�%<t=gò_��}/^���u(�<e��$��w�$�3��/.J��
|�Ŋ(獣M��ЎEf�-]�{�����#L�Fӭt�.o��FD���g�o�V����<�l��ǽ���$T"����=OM��o���GI@�Z(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
�o�e?��?�{~]������_�q��
?�����9���n9�I���4�u�9�<�g܁�׬��O���}���>���5����9���'��ˎ��?ϯ���8�'�_ס�^��g<t��8��s�@���_���\g�1矘��Ӟ�3]Xo�ە���C:����.%��4
(3V��h?�+����O�-��ԥ�7+2€
��_��f���P�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@y���֣>��<��=Gr�u��_+��#����i��� }1�l���<cҰ�4�t��?�;t�Vop[�R3��a�q��О��ק��<�d�z`g�z�Mn'��/>�{����?�=~_���\��|��>͏˜��^�׆�'��W�MT3������]�#@��35o����º���R�]J[�r�,(��E��m��o�%j�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P�x��CQ�۠��=8���]�֏�|����w�Z����Xp}:>��+�w:�L���c��P�@�_�����߱�9���١51�}s���@�����ئ��s���:ON?�\zv����_����������<�t��G�=�Ն�'��W�MT3������]�3@��3�8�Kdج�U�r�Y��MJ��b�2��]�r�,@��c[��ڰ�����Qgٚ�݇�?�U��*,�0��~��N���TY�`u�_�4;{b�{ԑL������]�+��� ��ϳC�/����	���WQgـ�e������6����,�0�L�?�?7��&ֿ�]E�f�	��������+���?�2�����Z��u}��&^����k_���ϳ������y��mk���Y�`�x�~o?�M��>��/����	���WQgـ�e������6����,�0�L�?�?7��&ֿ�]E�f�	��������+���?�2�����Z��u}��&^����k_���ϳ������y��mk���Y�`�x�~o?�M��>��/����	���WQgـ�e������6����,�0�L�?�?7��&ֿ�]E�f�	��������+���?�2�����Z��u}��&^����k_���ϳ������y��mk���Y�`�x�~o?�M��>��/����	���WQgـ�e������6����,�0�L�?�?7��&ֿ�]E�f�	��������+���?�2�����Z��u}��&^����k_���ϳ������y��mk���Y�`�x�~o?�M��>��/����	���WQgـ�e������6����,�0�L�?�?7��&ֿ�]E�f�	��������+���?�2�����Z��u}��&^����k_���ϳ������y��mk���Y�`�x�~o?�M��>��/����	���WQgـ�e������6����,�0�L�?�?7��&ֿ�]E�f�	��������+���?�2�����Z��u}��&^����k_���ϳ������y��mk���Y�`�x�~o?�M��>��/����	���WQgـ�e������6����,�0�L�?�?7��&ֿ�]E�f�	��������+���?�2�����Z��u}��&^����k_���ϳ������y��mk���Y�`�x�~o?�M��>��/����	���WQgـ�e������6����,�0�L�?�?7��&ֿ�]E�f�	��������+���?�2�����Z��u}��&^����k_���ϳ������y��mk���Y�`�x�~o?�M��>��/����	���WQgـ�e������6����,�0�L�?�?7��&ֿ�]E�f�	��������+���?�2�����Z��u}��&^����k_���ϳ������y��mk���Y�`�x�~o?�M��>��/����	���WQgـ�e������6����,�0�L�?�?7��&ֿ�]E�f�	��������+���?�2�����Z��u}��&^����k_���ϳ������y��mk���Y�`�x�~o?�M��>��/����	���WQgـ�e������6����,�0�L�?�?7��&ֿ�]E�f�	��������+���?�2�����Z��u}��&^����k_���ϳ������y��mk���Y�`�x�~o?�M��>��/����	���WQgـ�e������6����,�0�L�?�?7��&ֿ�]E�f�	��������+���?�2�����Z��u}����Z�z�wVn��#̶��]>�]��6ͧ�8"�W����[�q�?�O�o5,9�Q���\�p=��
;�M��A�����QY=����N���؏�TPrt:���Pl�\u�w��ۭ4&s���������J�?��\��g����ϧ��<qϥu�?�r����gS�����Ľ\F�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P)���?\~������Q�������$�����A�n9��z�Q�8�3�
{�M���v����q��k��oQ��w�_�Ad�����u�ӯ_�����g9{�[����������|����n8�rz����ܫ���_��u>�z�\K��hP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@Q��>b�u��_��u��j?���3_ğ�a���%��^}8��=��&����[������-:�X瞿����������zw�{c�J�ɨ7��~?�Plݽ2}��Oa����n��F8L��@:V�/����Jq����ǟ��Ld����|��_�3PΧ�oC�K�z���
���<=��:�izδ4�<�{O}WZ��<�;O��{��}�R����:`�ݕ�ߒ��/~��Cg�<?�Cѧ�=��b�<G���Ku��Ҿ�-��.l5Q4z�6
�V�2�"��B��I-m��{X�6��[Q��z�����۫]{K����-#����R��-"]���$���i!*�`U���}zho��.�e&��k^��D$2�:��ݔb�1���i A|�n�l_��9�;��A��
�,�c��:(���WΜt�q�G�����M�����]�›���>��u)�]F[K�I��ۍb�����r���IK<m�,o2ȮU�iGž5���BK���I,�V���kd��|�o��ـ�j?pT�6������xv�Ş�.���wS��
������E���V��+�.6�
���q?���4L�JI��t�|E�M��Kr��zD:����\Y�jw�z]��]�v�u
Ϫ$HI�2���@��0m%s��>:�Ğ1��.�&�<Au�x�H�+�;ʷ[�XxwR�Q�y"[x�K6��7
6y �a)��_u���������[��5x?������U�֚��
���5��t����4���X/�?*h��!;@5$��������w���Z��|�o��Z^�e:<im4�m29�:�
�C�}QN/�Vw��xzi,����qkZl�if)��T�-�de3� U����.��&�>�W�t��[�o���O��{���s&�uf�}��/���[O�ΗV�~Y(��8�cb��k�D7_~Y�>�&�~�u_���w��M��^Z���!u�5��&���-ij|�2�W��tx��W�2��h�veդ�V��=-�;�Qt�e�d��.LEps�C��qV?���A����"�o2���Q[�-�Ϥ[kq.�:�]Ee���$�x���̻w\���u���ž�����]�Ʃx���T��w�c�X
�\����9�#��R	u���?<u�}7V�M��>?
O�O���R��ź�����Q�i�[����Au,�p-�Q��H�s�m_Uk�]�3��+�ӧ�lj4��N��:��Ɲ��or����G٢�\h��dVJ��]ouoSf	ຆ+�i����5��$Ia�'�H���I���U�)�#���_
�������V�mf6�c�]�+��]��G�����Л��ih�:�brI�}��:�|O�N�o�pǬ4��V��5B�*4�{�/I-����!�wD�]�S�D]gJmf~�.�5C��n@"y,�jHH ��Lws@]m}{h���6�r�2?XM���x�[�o,�ѭl�5�/�[]�it`�Ԇ��Zۭ��e&@8r�����~��lz*����+#(eu!����VH�pG"��q���Z��C�=[-�z��z����t��c��[�
��+p� �)���o�b���Q���o��R,Zu�ھ�����#��{���G���f�
!�wG/�/�oX�֙����x������{����i6�qt�rY�\X�o{oq�O��_5����5�G�V.e��f�������O&�
x�Bi�ef�"]Z���UN�$�UOn�@
!��ܹ��N�.N��iژ��{K����^�[������K'�q��l��J(F�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��������O�����G��V��Fk���?��>�9���0s������ry��~�>�Z��n�4���՞O�89��	���}��@��^�>��=���g7y·n�1���=��z��g%q���?�z�yG?��ں����*�骆u>�z�\K��hP@��0��C��XѴ˹�������i����W>����x�v�Ø��m
��i���%�#���~�\���}�o��y���-x�Y�.��=#�Iuo���Z����9ZO�O�?�4[[���c}�hZѕc��ͼ�n��.(��7}���mo�g��6�5�?��Ư������4?�?
hZ��c7��t���Z���9�q</mc��h�#[Eڤ�B8Ũ�4��h��k�����+i6�V���6�����U��i��~
��5�2�~]c]���uKI�`�==�����Mo�^�^�V7���P���ZKg˪���M��ӽ���a�xw�?��!�k�,�C���?
��i5O
�ZS���Y��ڞ�����(�tcz�L�o���A�#��Wq�����]���~x���/�P�8�t�M#���/����j�šU�����f�jz�������o�n짹��EM��!(�ޟ��+�W�ݟ�f{���#�v�����?h~��u=G_�t�}�&��x��^#�Ş
��v�
�
R��MҮ�ީygi�p<��(���l����FӺ��<sP��~-^i^7�d���t�s῎�Ua�vϿ���G����J~Ϥ�C��_Y�gm��X�EۃN�9k������_
>|C���}�z��c�e�o�����Z���-���3��K�X[G!��{�j�2*��H�y���(���'�����&y��3G�;�j�[x;Þ�����'�]���e�;�C����K�x\�Bڨ}~V��Q9�쭦�i�[�b�D�9_D�甹ﭝ�����5���]nMS��>��w��xV����~/
������_�Yd��U�N�6��sY�S�%�B
]�m-������W�gω>?�U�|?��E�u՗��0Z�x�M^��\��ߌ��LѼ7��M��gj���{&����춣Moޱs���%(�E/vWwշ������˾!�|S��
x}<lgdմ�ӭ����Z�����[��Y��m�,��I-�Yw�?���V�o�n��S1e��/�UҼ���2�aԴ_*�H�O	x7��m�i�!��s_��YM͠����q-ĉ����;����Jɥf�C���#�|�K����x'NԴ�G�>M��~�}��5=};@�՜���V�Ӥ�5k�V95	l��͜�����j�꒕�d��l����Y~��,~м{�~k��xKN��˛$��~�����͐�Nӥ7ֲ4�ۨ��~`�T˕إ�QY.k�����߳�4��;�-�
/Z~�������jC��K�t�/����*̱^�6��o�S�*@�h��A�eh���V6~5~��0��>/j������Uik����i��j񕦣�K;��X�s�h�G"���9��oo+���9A�'m%�=~v9����$�W�u/xv�|��?�
?���tص��@�|7���>!ӵ[j~�m�[]V�G}�M�q.:n�Ӳit�z��~���_���	�񗉾kVQy�_h�է�������5u���������%��ZDZ4��v�m�PB�H\�ȣwG�t��<��k�&Ծ�>'��+�
�#ƞ1�<O7����L�E���G�4�wW�O%�q�ɬa���P�#Cwq�*��'����YI�n����[���O�E��$v��z$��/�uo�>��	h�$���/�t�ȵ
o@�
Ɵ�O�j�L��R1�:�K��$B�F�G������VWo�}�Uc��w�����n�{k-+D#�^*�O�ڏ�-χ5�j��/e0i�ƷڲO%��z��%���}+HX�6�O���ܻj���Ů׾��}6:/|��a���>|8�l��|/����h>1�D^#��ך���E����[K�Z�����-㷺���0CPk쯃��ѻ�t����?������n��������kYş���R��_��[K��K�ڍֻ�[;	�uY����c�K=>�`������t^Kv����<?��V^��4M/P�gyg��u�]���xGP�����	-��o��5���։s���V��������.g��f�Zi���]+?+�z�V��6��ÿ����+��w�|D�?�Yx��������|C�j�~(���DѼ=gYY\X_����H�f�"��U�՝����ok�߷�oSKQ���s�|Iw��+�}����y񕾽�j�16�g�-/F�񾘉~F�p��vwz�N�6��&����E{7w��Pw�ʕ�����o���
�x#Ú��|:����[��Kk���o�e�$գ����&�[��X����̘Ϙ���ɫY+E���ooKn}����O�+��D�4��H�|�-���E�Ɖg�[k�w��]J'Ӗ[��Ϳ(䕣fCHǖRi$�V���{��H���
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��)M��c��~�κ����[�q��O�0��Ύ�?\��_�Q���k����M{�M�~��z����Y��n�H����3����	���1�O�����c���ӎ�g9{��t��o�[/�39+�����l����
�O�r����gS�����Ļ\F�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P)Fnb��.1��޺����[�q��O�0��Ί�ی�=�����޹��U�����+7����N���ӧ�o��f�������Pd�9��N����n�;[��O�x�:c����?�������q���ԓ��5Ն�'��[�L�Χ�oC�K�v���
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�
S��C��L���ݨ��������tv?��0Q�?�o�<���s���׎y��X���
n��#N<����;��Ad���>���(2���ǧ�:kq3����s�g�����n+e��g���������<��`���׆���ʿ�j��O��އ���qP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@�������}3�g��z����[�q��O�0��Ί�#o�F?��|g�l�3�
{�U��>���g��#ֳ{����c�zq�gۦ��������@s��������5��C����۟Ǐ÷�ӊ�=~Fg#q�1����?^!׌�^�����C:����.%��4
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��)M�1}���C�Eu��j?���3_ğ�a�����9�n�\���s�����?�l����F�x�N?/�zv��	���zg��̜w��L~_ӟ�Mn&s��p��q��m�39)��>�s�7��W^���_�5PΧ�oC�K�v���
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�
S��G��種���G��V��Fk���?���̞�˞��j�{�]�N��ӟ_�:�������Lg�_�_oz�Bj�N�ߏ��6������N)����8V�����s�L�F�>��s���}��5Ն���ʿ�f���k�_��އ���q�w푩j7�UkM�֛��_��KL�lg��O�,~������Im�nb�{y�u�)cI��=����a���+�
��"��Ծ��cǿ�g{����_�v����w����>�'�o-�@��I�V�v���c�iK�#w�������s�+��B���g�����G�����F��j��U��_�x�[�w��}hb[��B�[��OH4�u	
���Y�����b���o~�V��*�3�?�+��k��{�+���S��o��>�N�&�ݡ[�u-
-!�Դ�;=ZQl�Kn��!�V�7>q�C���~~�|I�wQ�w��>.x��׊��2�Z�|1�x��#��i�2MF�M
}%��K�ՒI��
5��f��B������ꖟ�S��^$�/�[o|+�q�|V�w�m/�4��>2��������m�7�5
gM��!�.ͬ0��j�76�g��+��m+���An��S������<�G��Z,9
hO�H<6�Rxv6�j|G�%�7��Ǭ���𛦱5�2��I��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@R��>#��=ǿ�]o�ڏ�|������'���Ga��z�=�;�s?�׹�Z�<u�����P�C]
H�H�G��8�{Ve���~��?�Pl���9����ݩ�q>�5z�����Q��[�g�u39)���?�?�!���|u���ܫ�������q/W�P@�_��G�߅�>k�z����N��>kw�<��j�:G�<=��oR��彵���Q��Ԧ��K�+�d�H�{[�����?���������}G�W᝷«赋��X�<7m�ǣ$�w�e��:��w+yakf�ޢ\[��U������Mυ����7�o��	t�>$�)�
3�滠^���x�O�G���?
�s���j���D�"֦Եqa�nD����/�/|(��wx῍���_�����O��߃~x/�V���|(е�
�-r�~𾁨j�����1��~#�կ-���$��o(H.ah��L���s���O�_5��Ym�xE�M�[Z�)՛[�|p�
6W�ԟ\�����/�p�r#��FP������}�n�]�k�7��S�����|_��h����/�uO
Ǥ�V����:g���uYZ�D���e�&[�8����=1P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P)��/\6:{z�Nk���Q�������$������:�����=k�����hu6�>��#Ӿ{�~����OSM:�O�����֠О��;�d�\�zw�O�4��g7y�[?�9�'ۧ����#�(9��韛�O��Q׆�'��W�L�3������^�#@��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(������{��=o�ڏ���#5�I���y�X���ߢ��?ʹ��t5�u���N��^�Vop[�U9�ׯ�r9Ͽ��P�>���@��S��{Oœw9˿�z�_Ü�}������frS�r��>��������u��C:����.%��4
(��3�ʈ��3��u$��
?��g�-?��U+�����_�������w]�ϰki�i��⨺�}�
ON#"�؏Q*��E�p��/����?����Ƌ��g�?����������4]w>��������_��Y��-?�-����]�ϰii��o�W�h��}��KO�������E�p���Z��[���.���`����������u�,�����?����Ƌ��g�?����������4]w>��������_��Y��-?�-����]�ϰii��o�W�h��}��KO�������E�p���Z��[���.���`����������u�,�����?����Ƌ��g�?����������4]w>��������_��Y��-?�-����]�ϰii��o�W�h��}��KO�������E�p���Z��[���.���`����������u�,�����?����Ƌ��g�?����������4]w>��������_��Y��-?�-����]�ϰii��o�W�h��}��KO�������E�p���Z��[���.���`����������u�,�����?����Ƌ��g�?����������4]w>��������_��Y��-?�-����]�ϰii��o�W�h��}��KO�������E�p���Z��[���.���`����������u�,�����?����Ƌ��g�?����������4]w>��������_��Y��-?�-����]�ϰii��o�W�h��}��KO�������E�p���Z��[���.���`����������u�,�����?����Ƌ��g�?����������4]w>��������_��Y��-?�-����]�ϰii��o�W�h��}��KO�������E�p���Z��[���.���`����������u�,�����?����Ƌ��g�?����������4]w>��������_��Y��-?�-����]�ϰii��o�W�h��}��KO�������E�p���Z��[���.���`����������u�,�����?����Ƌ��g�?����������4]w>��������_��Y��-?�-����]�ϰii��o�W�h��}��KO�������E�p���Z��[���.���`����������u�,�����?����Ƌ��g�?����������4]w>��������_��Y��-?�-����]�ϰii��o�W�h��}��KO�������E�p���Z��[���.���`����������u�,�����?����Ƌ��g�?����������4]w>��������_��Y��-?�-����]�ϰii��o�W�h��}��KO�������E�p���Z��[���.���`����������u�,�����?����Ƌ��g�?����������4]w>��������_��Y��-?�-����]�ϰii��o�W�h��}�y�O,o�"�:˕*��'���m�?+�#%�I���y�X��/�;�>���s��{�_�uV�>���ϯ�y���tj'Q�\���u����>���d�1����������r��<p:�����Oj�=������#�>���8����׆�'��W�MT3������]�#@��2�`
� �S��b���+)���:H<R�̥�7k2€
��_��f���P�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@y��?�5�O�^�ܿ�h������ş�i��Ķ=y'��p~����^�#N�UkӿN���ݺ㎕��]F�F�uA�?��J̲z�N�����@��zg��y�cҜw�s���{s�z���8�m����\qr�����=z��+�
�ە��C:����.%��4
(3V��h?�+����O�-��ԥ�7+2€
��_��f���P�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@y��?�3_������=����������S�4���[q�t���q��������s��t���}���j�Q�����0Y51��UfO�����n�N�O�q��'�������8�L}���{��>���|��_�5P�oC�K�v���
�տ���
��{��Kg�u)n��̳��G��=��Ğ)խ4MM��y�^����H�IGJ���*#7n&�U۲Fͭ���׶�	�n���e,�\F��"��x�X��@�B��o���GI@�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@�(���}3�t��ۏ���G��V��G;�-O��n'���<p����Ӱ5���i����M�z��L_����~�=��CR3���n緩�,��#~�_��{�@���<��qޚ�O���������J�?����N��O@�Ð:W^����_�3PΧ�oC�K�v���
�տ���
��{��Kg�u)n��̳�~*izι���,��_XѵM&��P�L���SӮ�P7s�]�5�\	v�BW]�7V�����-%v���5���>�-<C�â�}��qe���
�V�:^C�2��	���I����{�Ϣ��6��7������P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@�(���x?�읳�{{�r�u��_+�#����i�����s��`{���_S���Y�ڎ?���^y��oq�ѩo_���A�=G'n{�|��ހ3g���^�z���㸙�^����?��ߟǡ����frW����<����=k�
�O�r����gS�����Ļ\F�@fj�����t?�=�����F�fXP@ދ� ���:Jՠ�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�6�G��c��x���/���G��V��G;�,��O�o&��;d��Вx�ר�Oz��������8���Ǧz��NEf�@�F�}����珦*
	�7�}�?�؀gO�����4ПC����׎�x��=
o��S3������x��!��.z�]Xo�ە��C:����.%��4
(3V��h?�+����O�-��ԥ�7+2�_���t��|3a�����'�]ԛL�4�4�mCY��8�xt�dy��nk�ڂh#�&��Z[祗�S��.�i����h�nuky�{X�{YR˛H5-:y���m#Y��=cF�����M*���m��6m�ڵ��6�n��o���GIHf�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@y��?�3�p�����w/�Z?���9��j����Kaۿ��t��O�z��4�uV��g��~q�?�L��CR>��t?���;���51�}��h2~��p{��zS��}>g7y�H<�������o����fg%?�|�����y��G؊���ܫ�������q/W�P@���{A�a]�Oz})l���-ѹY�q�;�e���9s��c[�l�f���}]6;��-���r������iט��Oe"]A�	?t�+AIs+]�K}ڦ����t���%�MCY61F���������,���F���6KhV�N�E��+�W++]�7��cԴ_��f���P3V�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��<�������g��ܿ�h������ũ��Ķp8�:GE��<`��������ڎ��oÏϷLC�
n�T�ϧ~�}���&�?A��?玔�?�'�qן����jq�L�/81�� ����3��������������7�nU��U�|?��?�k��(��[�=��������>���R��ܬ�
(���o���GI@�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@��(���������]�֏�|����w�Z�����t��=;�g�s��b�CN�Uk����q��zVOq�ѧ8��{��?��e����}h2�|�4��g7{�N:��z{b����]6˅f鿯�W�q�s�<�]Xv�H��K�{.x��s|��|�����jV�ؿ\�4�j�6�}�'uu��H�35o����º���R�]J[�r�,�o��:u���e���;a��A7���e��F�Koc�Ϣi����]��lҢ�8��D�����o�����+W��x~�R��ԯ��K��{qp��?��u�#c�.?���ొ�n���-*;=n����[x��C�Z�uF�v߮��/��m����)j�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P����&�P�ȍ"b:os���R=G�'��8z1{��-�)����)/)'��ޥG�ݏ���[�˶=�����C�1ǽb�CC���?OQ�v�^?:�������C��ӿZ�Bjc�_�@��מ�zg?�?������I�������L�3Q�-�~:��遏sԎ���ĖS��"_�^7��v���Xv��S�{V�)�kI5�+�����z)��iK�w�q�&�Xt��>V���mf��WF�Ձ�C�\�h�:U?��ɥf�ӱ��ۏ޿-�ܾ����_��S���<?�?��3;T������B�B��`���DVv=T��ҕ*�����K����u�G�_�moO�/��?Ƴ�5��O�_�i���̊d���� �׊e�H�z:8ea�A{���/�x4�%�c�B�B(��B�q�DED\*��Ư�����K�����	���6ɧ@�q�2�ZXԌ�!��s����U?�	�s����/�5>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����>�i�?V���?�*�cW�}T��%�A����C{f�-wl�g�̽5F��R��)�����	���5Ӭc�	R��!�������T��I�T�O
�ԫ��˫��I[��6ԭ��[��U=!�y}�濙���ޖ<��Y&�Α����v=���'8ힸ��ܛow�%d��I$�I"`������gkb8# �����s���M�q�{���s���{��jG��9��Bjc�h6q��;����
5��O��^r�0Gcמ��$u���fqz��lu9x=�ߧ�kX��.�	
��9�<��~U��fr�2M�ܲ =B��8���	�ڷ���KK��FL�7`d\��9���~L?}
9��?[�6��_qP�^p~�q�O����{g�^��4���cii����j��}\t����}�Oj9���bӲ���j�������_.?�>�4s����������O�^����K���j9��KO6-;/�گO��\����C�G<����zv_r�^��������=?�=�w����V��܃�7��rx��������4��v_r�^�U�?뼼�r�(��K�~�/�@Ӳ��}���~������A���3���]N��A����������=h��K���=?�?r�^��\��q���秵������U������3��aG;�i}�z*��}���~�?������G<������Ӳ���W��s������s����Ӳ���j������m��{����_���cӲ���j�����/�o�3����
;/�>�{�?W#cϗ����=�G<��O�ŧe� �U������I����z9����N�e� �U�\{~�_�M�ϧQG<��_{���pӲ��}���~n�"O�/��z��/�{����܃�W��q��{���_�.���
;/����Ү=?�ˎ������/�����v_r�W��q�{�����ùs����CN��A���������?�Q�/��|�.��A����������G<��^Z�Ӳ���W��s������G4��_{������܃�W��q�^���c��\�g�����܃�W��q���_�>w������/��������_q����G;�g�� �W܄�M����􉿐~��أ�]%/������i����h���q���/������i������m�=��,~_ʎy4��=?�?p�޿j���>c�zQ�-�����
;/�گ��W?缿�_�ڎy3�ش��/گ����ˏ��M�i}��ǧ����W��s������Z�w���͋N��A���/W?��_�/�Q�/�{��܃�W��s���O�c��4���Յ�e� �M�\�1��_�/�(��/����܃�W�>�s���/>ܷJ9��߯��4��j������m�����h�����@Ӳ��}���~�;����}�Z9�����O�܃�W��W?��\~?7���G;�g���-;/�>�{��������L���Q��_{�ʾ�j�������/~��?����/�{�?븴��U�\���������i}�4��/گ����y}?�=���?������'گz�������G;�g��=N����������~n�|��/��i�}�>�{�������~?�qގy4���Ӹi�}�>�{�?W߿���w���Q�/����4��j����������'��s������e� �U�\�>����(��K���N��B�����O���_�z9��K��z��܄�U�\t���q��#��E�g���PӲ��}���~���O�sK�����=B˲��}���~n{���~?���/旖�4��U�\��}?�����/�����e� �U�\z�����2�8�<����ǧe� �U�\���o��O��3���+.��B����~nG����{���Q�����4�U�!>�z?����"o���Ƕ(�IK�w�ǧe��o�?j�ǯ�%�0��~4s������-;/��o����yOn���_�/��O���ڮ~�yO����s�ni}��N��A������O��/���_��-;/���������C�G<��_{�?/1����U�\��D��_�֣��4��bӲ��}�����������>�s���ǧe� �U�\�����c���/����ai�}�>�{�?W'������9��K�a�e� �U�O�\��Ϸ-Ҏy4����
;/�گ����yq��~�9��?�����4��j������|��_�֎y4�n����c� �U�G�U�����z{Q����kN���^�>n?��_�8�vs���ǧ�گ����ߩ��4s�����-;/�>�{�?W?��_�/��=�G<��_{
;/������?��_O���j9����=;/�	��޿j����F�A�?�����O@Ӳ���7��r1�<�_����4s���lZv_r�^�>�>�t����w��_�/�����v_r�^���Ƿ��t��us����_�
;/�گ���$�����g���i�}�>�{�?W��O���.�J9���0Ӳ���j��*��|���^�w����^��e�!>�{�?W?缾�}��;�G<�����4��j�������/?����i}��P���j������|���~4s���
;/�>�{�?W?��_O�����sK�����i�}�>�{�?W����{�=�8��/�{�1��}�>�{�?W��_�/��������˲���k������m���?>�s��{�
?�}�O�ޏ�z���H���:q�9��R��1��}�����us�_�K�����i37��e�}Ț;��q����y�����?�s�_�/���e��Mr�4�#We�9�-��N��3�zs?5vZK����Y/�I%Tu���߉<V/��ȥ��X �c����1��a/��e��lA�q��OS��3Y>������hu��}�{�g�Ԍ�/{�ƺz����9�O���=�.��Z@5�@�?����3�����8���0�Ԟy���Ӄ���G�_չ
B>c�8�29''�x��#e�d�����:��~}os[/̇�_���n`�#�ێ8�x���;'}?���%���$Е� ��#�=@���_6�dZ�}���S0�׹8�s׷zz_��o���;~�g���8�q%p�~��=������?���C�>��x��N�|�r����\���
�B���O|�g����3�sJ����}��y��g�ÿ��)��AO���<u�G�_��#�ǿ�[��~����b�������E�� �#���>=���XS��#��;��{�5p�'=��s�S�nH��z/�'�}=�/~9��9��.W�������E��a�}zr=:�˷�=���<���u��秦�������<����A����Q�_��|�AnO\��p{�����[���r?��_�)_���������~�F29��:p�胕��z��{�w�uq[�A����?�o����~������9�Y����/���y����On�����P�'��O�c��|�XO#�����.�b�=���z��s�0��9��<��4�h9E�1����u�G^��������8����鎟����#�����zqG���sߧ=>���SG�_���O������qE��'�������8��;��_��<��q�ǎ޿���G�(y_����4+y����x���#>��4��~��[���q��x�;��b��Dq�=���^�|��~!`�>�{�������/���/��^����_�|�2;������ڋ��0\r?ÿ�G��WP�s�۷8�<��w���`�zg�����L��>b�~@`���~=��\-�Gנ�#ө���z�ܿ��C��G_^zz`�>k��0�|�����=E5�|������8�G���O���y�#����"������|�<�����c#�����9X�G���g��~;wW��{��~c���_���/�z�����_N����p��y<�����?�P�{���?�;~���?��ɢ���/���G�<�?���Q<����ϯSK惔_#��۷^��u�O��,G�s��p;ޘ��P�?�?�=G�}��G=�s����u4}���\�a�A�Ȟ�ߧ\|�y?_Ϟ�G�s�|ӿ���H9C�>��x��N�|�r����\���
�B���O|�g����3�sJ����}��y��g�ÿ��)��AO���<u�G�_��#�ǿ�[��~����b�������E�� �#���>=���XS��#��;��{�5p�'=��s�S�nH��z/�'�}=�/~9��9��.W�������E��a�}zr=:�˷�=���<���u��秦�������<����A����Q�_��|�AnO\��p{�����[���r?��_�)_���������~�F29��:p�胕��z��{�w�uq[�A����?�o����~������9�Y����/���y����On�����P�'��O�c��|�XO#�����.�b�=���z��s�0��9��<��4�h9E�1������u�O�B��=�qۧl��8斛�,M=>S�q�{g�����7����ꍋh1�r03��{�F:��Ke%�:�>�������5�zz�Rߡ�XE�H�#�:��+��B���O�9�N}����i����I�1�C�ǧ����C���RZ�F>y<c<Ԏ�AD���n�߿��NQ��?��~UHF=�pG?���~^�K�,��a�p3��Nz���9�,��_���ړ�s�9��A�O��;Ꞅۿ��Z�ͦN3�9�C�g�>��T����E��lۯ0�ߜtt���w��IK�V6���l�קnO]H�?�:q�����۷B�.����>�O���{z��=�o�5�|�����?�?��Qf���ON��?Z/�\Z���]�x�q�oO��/�z��>�^����\�M�_��_����>���]wV
D�?��;g߹�?�	��b�_�����1�����^C����Y��>��}�0h���k�_��<�8�'�߷4_��
�>���${{���ӌ�u��a��c#?&;���1ǯ|t�^���5���q�$u�����E�i���,���Ƿ�>�{w����P�_��q����^������a�}���������Qu���aE�?��N�����ۨ࿧�_ װC����^�}}�.���>�G��篱<c�}E_��Q>����_Ӝf��>���>��O���W�o���.���?����?Ϯ8��.����P��<u�r8��zt.���P�����ߨ�zb�������3��=��}:��=_������Ol����֋��QE�_��Q���3�ph��j/��ɞqӟ�O9�8�/�j-F�>9N3��3׮?�S���Q~��O�q�\~_�0:�u�~��>����=}}x��B�>��gN:c����_�n����_��}��n	9<����z
/n�x��|�����?�?��Qf���ON��?Z/�\Z���]�x�q�oO��/�z��>�^����\�M�_��_����>���]wV
D�?��;g߹�?�	��b�_�����1�����^C����Y��>��}�0h���k�_��<�8�'�߷4_��
�>���${{���ӌ�u��a��c#?&;���1ǯ|t�^���5���q�$u�����E�i���,���Ƿ�>�{w����P�_��q����^������a�}���������Qu���aE�?��N�����ۨ࿧�_ װC����^�}}�.���>�G��篱<c�}E_��Q>����_Ӝf��>���>��O���W�o���.���?����?Ϯ8��.����P��<u�r8��zt.���P�����ߨ�zb�������3��=��}:��=_������Ol����֋��QE�_��Q���3�ph��j/��ɞqӟ�O9�8�/�j-F�>9N3��3׮?�S���Q~��O�q�\~_�0:�u�~��>����=}}x��B�>��gN:c����_�n����_��}��n	9<����z
/n�x��|�����?�?��Qf���ON��?Z/�\Z���]�x�q�oO��/�z��>�^����\�M�_��_����>���]wV
D�?��;g߹�?�	��b�_�����1�����^C����Y��>��}�0h���k�_��<�8�'�߷4_��
�>���${{���ӌ�u��a��c#?&;���1ǯ|t�^���5���q�$u�����E�i���,���Ƿ�>�{w����P�_��q����^������a�}���������Qu���aE�?��N�����ۨ࿧�_ װC����^�}}�.���>�G��篱<c�}E_��Q>����_Ӝf��>���>��O���W�o���.���?����?Ϯ8��.����P��<u�r8��zt.���P�����ߨ�zb�������3��=��}:��=_������Ol����֋��QE�_��Q���3�ph��j/�9^���2ps�zt/�j-���A�(y�㎞�:s����Z1�~��z���R��o�y_������x<|���瑌dt�c�.E��:+S�9�8	�Ӟ=+6����ii�k�~�]e��s�~��Ԁx����Rw.+���'���zu��*����oÏ\��x���������t�P�@!�Pzs�s�z���t���Rs��S@g�#��O�Ϯ1�EW��_�O��y�6��#���t�U�&���v�б$��L���9�6��Ifņs���Ͽ�ddu�����%�����p�Gl���l�ۯ��&����+��q���^�8�=E����~�y�=�t�����������w�?��ӑ�on�0�����{z�����K�,��ϰ<c�����H,����O��c�=h��V`4�}q���g��{����Ç�	O���:}9���[���g��O^>_�8��۟Ύ`�����鷧��Q��
߀X_��8==�s�:y��?^�Q��>o�_��N8�(���R��/��;����q���>������V�<��;��08���O7�a�?��zc���������_�	��y89���׶y�֟0r�,�����Ӓ�ZN_տ��g�F1��s����
|�֡a?��x���z�H=8�`���1�ezz~��1ێ�,��=3������lw9���,�����ЏO^q�����1N��Ƿ��y=�������,O'�GN���_���>`�g���צ;qۿ�������C���-�` s���?\{�������O�~^��=�9������������qK�����������3۾޾�$�0)�(g���w����4s����<睿玜{�R��y�9�}�=8ǯ�9���g��r3����S��ol}�޽9��{����s��Ǯ>�s_�0:y��G���Z9����
<�\w�?��;��7��n;_��GS�Ƿ?㎟Nrsyh�����'�׏��88���,'�y��zm��s�q��G7��<�NOs��a�{��ן��c�O������+ӎ?�����������4�9�t�>�0GO�>o/�����<z����9<s���Xv�Ǟ���=q�.o�����g�F{z�u�z������;r3���c֓��o�f�瑌c���Ƿ<�~��7��XO��==3���N��9��L~^���'�v��1��L�:eF:�����o��1?��{`t#�לt�h���S���9���OA�h�������G�Ӡ����=qO�,��$���v�ǽ.o�`��}8�`��8�h�z������)�/����?��l�rNGj9���,/�y�zd��G�\R���}�a?��﷯�?�#�
|����<���������a���9�o�������B���y��y_oON1�No�-����~����{w�������w��A�>������?1돭�����z1��=F8�֎o���fO'����{���[���8}�������Ӝ��Z���y�����=����	��}�z{�~8������?Ӂ����G0XC�����������~J�4�����=�.o�_�c�
<�y��G0�L��O����a����=���O��sV��?��:����O\qK����� ���瑃��޾�{g��i�(����܌�}9 ~���[�Y��y�c�g8�q��?����j�<�OL���<d�Ӏh�_�a����W�������_���<�Q�����v�s�����O����?Z9��0���{���q�9����t�q���t�8���\S��y��=zc����K���X>�_N>�t<�?9�ޡ�9�y��ǹ�|��_�D������#ܓ�ڎo����N=zg����})s_��X�s����\nx<��G7��_x[Btӳ�x����z�{��?���w_�cF
��2��}�x�Z�"�����ս�R8�ϯL��$�rx�Chv:+[l��?"�=zT7�K��
�x�9��!��P�Hԍp3�nN��N�,���ezt�^��?���R1���׃��s�#��N}89���@�3�:~>�<~�� U/�F|�g��˯}{c?�4�o���5�l�?�<v��qU��Q[�Ft�@����zc w�錊��b��``�}�r�{����_�>bh���h?N��>�{�89��_�Xi��`��������?���O=�^^��x�0��A�H��?�};q�qE�����f��gzg������Qp��l8�:������>o0�����ӏ��z�/�~�'�r�|���_o^i\:p����RG�y�<㹢��g/�^q��{�����g�{���=GN���N_�g>�>�O���_ ��ϯ��^8�}��p���|y���zQ0����'��dc�N�`'�r�C�c��翯a�E�� Ӕ�C����3����E��/�r���:~|z����������c�nN:q�}:�˿��p���;~]?C����@?�G�}�n�s�Ϸ��j�N�L�q����\�9H���8w��^h���ws���{��_���@���Oa�?�^y<qE�_���a�#��8�׏�_4sX���Y�g�z�ϧ�֝�?�����<�;�;�.;�O�0O���JW����z���׷��;�������r0)_����/ӡ�<����Q}��@���0:���랠��0���Lc���=��h���?���O=�^^��x�0��A�H��?�};q�qE�����f��gzg������Qp��l8�:������>o0�����ӏ��z�/�~�'�r�|���_o^i\:p����RG�y�<㹢��g/�^q��{�����g�{���=GN���N_�g>�>�O���_ ��ϯ��^8�}��p���|y���zQ0����'��dc�N�`'�r�C�c��翯a�E�� Ӕ�C����3����E��/�r���:~|z����������c�nN:q�}:�˿��p���;~]?C����@?�G�}�n�s�Ϸ��j�N�L�q����\�9H���8w��^h���ws���{��_���@���Oa�?�^y<qE�_���a�#��8�׏�_4sX���Y�g�z�ϧ�֝�?�����<�;�;�.;�O�0O���JW����z���׷��;�������r0)_����/ӡ�<����Q}��@���0:���랠��0���Lc���=��h���?���O=�^^��x�0��A�H��?�};q�qE�����f��gzg������Qp��l8�:������>o0�����ӏ��z�/�~�'�r�|���_o^i\:p����RG�y�<㹢��g/�^q��{�����g�{���=GN���N_�g>�>�O���_ ��ϯ��^8�}��p���|y���zQ0����'��dc�N�`'�r�C�c��翯a�E�� Ӕ�C����3����E��/�r���:~|z����������c�nN:q�}:�˿��p���;~]?C����@?�G�}�n�s�Ϸ��j�N�L�q����\�9H���8w��^h���ws���{��_���@���Oa�?�^y<qE�_���a�#��8�׏�_4sX���Y�g�z�ϧ�֝�?�����<�;�;�.;�O�0O���JWF�?�z�OÞǨ��`8X�1��:g����g����@$[��u���b� �B�vc�8�1��pOs�)�v��CF+Q鞿��O��銛����~f�Pc@�1��}1���*[_пm�\����_Ny���q����N;w��P@
##?�|��d�[N c��q�_�?O������'�y�d~��<9灟_N���)���~�W��������F�zv��zr{����A�fs��zrs���q���]���~�>̹~��GJ.�b}�z�s�8��|�?����(�1�O�����A�ldQ�1ہӎL��==�`�����s����ПΎo0��_�O�>�:c�t�>��Q̃�!�\t����N`����e�#�������d?�>ʽ@�n����>���s�>ʸ���`:������>mC^����>���OC�җ2�5���8�Q�};r?9��>��e�~^����>�h�V����mG��OQ���]�_�A�q���O�����Z��@;���Ooj\��C쫜m�ϧ�_�s�|���e����]
�����'��s�>ʾ��������}�zu���?�s�S����'ن}��9��S�Z��>�t��+��_��������<�T]���e������:s��j|���G�����]_���x�����s ����e��?,����G2��^a�Q��=��j9�������G=q���=�G0�a�Q���L�ϡ�����_?�����t�8<���#����C�#?��o����0���q���]?���Q�c�0>�Qϡ��̃��>ȣ<c�����^z{���[�@��ӯ�?��a��x}�tǨ��}����Cj��3�������e��1~�=G�'������>�}�z���1��F}=����}�q�{z�u���9�׊|چ���G�0}3���ӥ.d��je�q���v�~sE�|���>�;���?��}z�����WڏO~����9�غ��f�����ҟ2���Z��G^�v?�s���Թ����W8ۓ�ON������������R��/�Wӏ��O9�(��}�}a���={�1G2�(���3ۦ�����?�O��P1�s��>�0�Q�}8���:W��eS����Ǯy����a>�=;��Üt�������A��l���Һ�e_��9�8��=(�A�m�>�?�=:~Y�ӷ�Z�d?���죦��{��s�eS����z�?��{f�a���9�?��C�!G0����y�@�;zpy?�1�G99�z��FF����9�	�a�?���8���� ��W죰�`}>��C�K���}�Fx�nN83뎼�9�������?@�_B:9���]>�0�Q������G2���q�g�۷����9�˿�b��z�`0Ooßǚ9�|��*��c�{��0�*���=���ӎsӯ��
{���L`�g�9�=�J\�?����>�?���=F9���8拠��_x}�wQ�z?�����-�[���!���=�G�sӱt1~�=��珥>d?��j3ʎ����==��s���q�'>���)��'ٗ��_�֥t+X_����ܞs�Q�0�*�ç��z��b�d�Q���g�L����O��>��f�>�c���}N`j���qӷ��t�1~ʧ��;Ϗ\�Qt��}�zw��8������e���#�t!~ʿ��s�$pO�zQ̃��}�tzt��ϧo�����y��W�����=��}�ON��g��qڋ�_�r�aE�<�}{�ݰA�E����q���~��
�y���}���q��_�qJ���а���#���>�I�y`(9���N����4�J3����#��֐@P�zi���c1���7g�_�_L�g�OA�O`��{�������Z@0����=�~����	�>SӰ\�=�����+���Ԏ���.1<�z_����ל�+.��{?��z~����}��@�/���8�?�s�zd���.��O�s���׷c���<�c�?w��==����<�L�C��קj5�酗`��~0:�ߠΞ�@(��G���?ȥ���]���������@#�>�8'�o�?���y~����z5��O/�s��v}}3Ө��^ad^:�'�A�9��~��P�<�O\�{g�9�=ӽ�z��d�8�\�G�Q� �=�z~]������y_Q�GӾ=��J>����,��==���>���_�����x>����������8����,Z�_��X�kL��s�~�~��,ǎ�������k�_�Yv���q�~�Ҟ�[\,�����}?ɥ��y^�����֍|��<���8���=��z�yc�קA�x�8���h_�3�A������_���{���N{�4k�0�_+9�c?(?������,���ߗ�~�9}�/������4y_����}}��ӟ�^p�����x�g�s�zQ�]�<��n���<����_/�,���}>�=�:z^ݏ�� �\������� �2=?�^�������]�g=���;{~�:z��0{1C�ێx�"��_�Yv/����?����@Y�g��t�=��TjA�7��=����!<�9�_A�q���N��pk�y��yx�����珩�f�C@�=q�����N�k�������s��F�,������v��������}G�N���=(�����P�,t�>���k�_��/9��_���S����Z
"���~�v���ik�Wyc��}3�;����
�<�;;���;������~!e�O/�Qǹ��Jz�mp�(z���&��A�{��Ӟ�Z5� �����py�A�^����a�y~��Q��<v�{Q�_נ��/Ol}9�ѯ��A|��1����~����C_ ��_�~^���<�`Q�<����__���_�`����_N~�y��b��W��g����G�t �a�����?צM|���_��8��{v>�,��=s�O��ޏ�,�����8�=zv�_/��Yv
��������������}On9�Z�~e�<�:�<�^���d1�s�ӂx���Q�Y��ߗ�[���_/�,���=}a���=:�9����A��bz��S�>��5
�����{�s�};ѯ��hVOC�e�����/�O���g��ڏ�����};�����MB�<������s�Q���[�<����}�zqO_/�O!h(�z�a�������\a����'���<w�G�+ ��x�ۯ��~������a<��=G��)����<��/����_pY���N{�h��,�����ߓۯ���Y�=�zt׎��Y���c<tG�����G��^�/�?��Q�z,g����P3�����;��x���S��N���9\ّ�py��׷~rqBml1�x������ސ����Q��@��
(��
(01��`zu�@	Ё����uP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@!�G'���}�q@P@P��admin/images/icon-wp-simple-pay.png000064400000004546151331545640013261 0ustar00�PNG


IHDR���>a�	pHYs��sRGB���gAMA���a�IDATx�KLTWǏՂ�8�ZH-CJ	��E�����BӅ��M莦�
Z�i��pU�b�Jp�Fl҆�IJB��|�Uy����p�Ý{���s�=~�/!��0s��^����8�/�	�,o�4,��� �8,��� �8,��� �8,���K��XU��p�}QR�C���5qud^�ݾ'L"���Ac�X϶�-Jv�&Z�v"��p@qX�a�@��,�X&������KaF$�S�+�gp:�'w��KY
4
#p��%���=��cV�2D4U���
�_�zlh쑈�,���sa
,�-RR�S|y�N
���cVp`$!L��0��v4�hi��k�ܹ���&L
�����5tvѺ�V�R��S��"RZ ���0���.�0c��X�l�y��J�OY��Qk`���~G�E����`O<�ԧD�a�����9-u�VV.����8�����4����_��s}Z\<]�|o-@+F
�u���\�S��/��Lf�I�
X���2�B�x!���^�C<`�
 �!�ꊃ�W�_��e��L�Y�
�k}�H �:�r����ɧ��ڄ�>R>������N sAg�x�J�F
>?nGG=H�Z�*<]��x�+�p��'��)fg�"�l{�;ZV��
�����ݸb�7<H#P��`�.�I7W��uEP�������11�W�_7�ߒ����A�к�[�"(Bk.ߜ��^�&T�r�6��rP�����S��Y���b�x�f!��\��A�u��:���p��#�6d7�ÓOB�f��A��R0qX�a�@qX�a�@�@���J�J�&BZ�j����`�� �8�����z�y}��Q�͞�����U�CF��oʀύ�v�����_��3�w��ʰ�
$��:/��,���)`_`���}��M!��@��� �U�
#e�b��
i�fP����]qX�a�@qX�a������B�b�ڪ"�l�
���UP���:˸�<�L4��ozg��r{��	u70F�Ԉ�DD>1��W#���4�u�������g��l��+�c�^˅P'P`���X�h�)I=�
��@�jm�g�ԡH��l؅K�v�Ao���}�����=��	u��+H��t���*DkmE�qX�+?ߓ���^h&�W��\v��L���*�}�]�dh�q`
&�`a
R�a�Hi2=�8�z-���*`Γؕv�_ױ��ѳ�x=�o�+O��j���
�u�k�{��q�8N�V�n���w�� ��7g��.��g�3��}�s!�M�ha9
���bׁ�K�u��-�^	�i����7���t�c�p�r�kX����-@��Λ0�7���G���G���I�S5j̦>��{��-[UCh�S�@�_0\���ݲ��p�V|�ɶrz	��~þ@O:�;4pFy֭-����dV� ��?N�ɇ��l��/AE�/t�&p�>h=g��"Ԗ�h[�wh"��B1�u�4�������39>H,n���o���>����Z�������@N�nx,��˓9d��z�ܲ����>i圚]@웑���
�pud^��U:~Iu�"j�U&aΡ�����e�nO-��sZ�w��N���·;�o�[�0bZ�p;������e�;��ϟ;\�i 4Nf�$QZ
����x�}��

����J��n�P�J#��Iߘ،e�p�p"�?�k�����;�ఀ<�I�SsɌ�~{�+��G�
��;�N�Zf��1�3<��wA
B�;ʜ:F�"+��||�A'�BRl�i�� }Uǁ��.����:�~ewT�"���4T(��Ε4;(����3s��X��q�OTp�	}�����z��"��&�&��E�W��V�&�TS�:=ק]_��zMbh�@�W�HB��~�
�},����.=�SW�K3h<��ʷ렝,Nd�m��{j9�R�d҃-La.s����`	.�%e�dl�<n���}�$жqr�[��o݆U7S�+���â�Z+SA#�m�Wc��B뱮d���2��\�{/���UEA�n����$�fϹX��T�a�a�{g���=��),T���3L�\:����� �8,��� �8,��� �8,��� ������;fIEND�B`�admin/images/icon-charitable.jpg000064400000012773151331545640012650 0ustar00���ExifII*��DuckyF��1http://ns.adobe.com/xap/1.0/<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156797, 2014/08/20-09:53:02        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2014 (Macintosh)" xmpMM:InstanceID="xmp.iid:4918C28331B111E5AAB3F4228B4D052E" xmpMM:DocumentID="xmp.did:4918C28431B111E5AAB3F4228B4D052E"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:4918C28131B111E5AAB3F4228B4D052E" stRef:documentID="xmp.did:4918C28231B111E5AAB3F4228B4D052E"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>��Adobed����
				






�������	1!AQaq�"��2B#��Rb�rU��3CS�$D%!1AQaq������2��"BR3br�S$�#4��?�W�c��@@@@@@@@@@�GA]q���SKU(�Y�^���	&^Xڮ]�i�,̉-{���l:+l7�t��QO9�k��{�AQ
[$njkT��	V�=�]�z�6�� � � ϴ�]n��e&���Վ�Nm��Xr��J��_�4��8�.e���9S�po��
�}���dA)��-{��=�2�}��z�^{#}
DD��ڻ5�^�&�(}J��j����a��w�[��Q��Ep�w	"s���s�tU��Y#uYgwno�9>�X���$n�fͻm��;4�Ʋ�i.̀������W�S�-E�O3>Z�MJj���H*�j�_�ҝ�f�H ��e� � � �<sS0n���!�r����֞�rV��#G3�K�_b��;WAZ�3ek��E�wϱ�ǻ�w���N�-�����d��&�^���7��R�����F�.�:��嬥E�u����
���*�{]E��Km[�ja2�Z�=��q�8^��u4���e�mKl&��<i#p[l��Z��+����r�ƌ���pl�cŧ�<����䣙$gJkM\
�6UD�wB�Rտ��ut�oK�o��5�
2;�y,O����Xs�(�ck`�?ͱu�.�&�{�����ݫ�6K-!@@�c�{c���<������fVQVĽTª"Z�=�jZ��7�-���Im��1�}�d�}W�,�Ҧ���|Wf	��Uf2�?Х�K�0N��B�n���[�(�"-�i�
#Oʉ�|I]��QuUY���'ӡ���񰑂��,���~�һ�y��=�n��E�A���e��o��t<�&���}O\]���9��n��&
�L����@�oc�a��sL�,��zJܝm��r��[P$�@h[�`����s���Ly���&�GF��a]=�T����{$E�~��K��U�)��Z���T�v���]�ٮuV���i�,Ֆ���hUR����:'bճ��c��������Z��@@4�:��h!t�R�3�$��+�$���әˠ�fD�{��CI����knE�
�3q���q�[����W���c��'T�5pO��t��>j�F}�+��Cn�~c��US!�:e�p?g�6�=^�T�y��[�}�MMO�����ep�/К]�~7%��m۴B����,��$��N<���hh"���4޺WyϪ�$�;�rhMĚ�4�G�Z3O�>�
]<o���~��/�a��mE��ޗ����{o*v�|�k�5��O�$�����%\��Z�[*"�l�r�d�7H���Kn&�ž��>����Q�)�sXO�8;rR��GSF�wX��n��}oS�[j;R��SP�A[L�5�6X��a�(X�tOG����JIdj��9,/�e�Cp����6�����rv�lǯ
M�+��bl̊��=,^��N������%3�bڝ��x�� � %,;~��E�<p��;�������#A��Y'$i�t&�J��*Vs�w&��_+n�O.�$��Ckw�
�ǀDg�a��1��MUO��b��|�]��U⧟4zI7�`�����2�*��,����rT<�ڃ��ro-Yt(̯&�1�2�"�]�fޣ0�"�g�'2h��vu�-
%��:*[,CLq�`��Z�p@�X�br�4�Y_+��[UN��ys���k������S��6C�;�ݴ�вT����n����5��ޔ�R�O,s��3D���'0�x\яV9���_�r*.
~�}Ɔﴤ�O�誨�$������]���P��򹊫�y��V�����:�?;�9ขeM"������E�Κ���½Q��K����(Tj��̣�D�/��3�C-�@�i�*��T�.�{m9UTyc�Kq��w)̧(���+�w�m�"s,ɔ���8�,w��o�Q���@�xj.,��8�:�8��S��T�����L_�t��u�yd����]
�6u��e�p��˾�a�����/<����^�7��MR�b�׵�:�,�<F[~�j�^=F�ֵ�k��4ց�d]!,B������ O3+&
��}�6�MX���^���G�zJ���h�s��So^jLSe3ލ�5��w�n�Q�;5+(��4�6_@���T�vL��j15��ü��{n&�+�����Nl����ٹ���|j��5һ
E���߀��p�-�U.gG$-������/��ӥK&�,oS����j:�i*[���)Xy=�����7+r�l^��ǵ�G7KP�7���2�*mm{�0��qqՃ�e��m�|��J~o��ύ
o���z�}vbF�pм��>�t��~UU(s�ӡ�O����7[,��or��U=��#d��]��P&��4��{�=�$}ʒ��[�l-Mw2"�>���V�%�ʚВ��2髑�	9�p'�@ob�L�$g�w��R���
|MI�W�wE�m;|��֩�۸�p��l���1d&3�8sq�Ks�\/����j�&����kg����ߥ�^���/Wm�b��ʺ8�B�Oc��J�W��R�c�V+ԗ��j	�?-���GYC���Ѫ;	w!QVp�6{ܩ�~�L gK�'�M�3;��W�D�n��{$\+�|'����n�qT��Ҫ�������B�M������z�l�Qd��cl_�ۗ�.L�Џ�U��w�;Fc�)L���u
�0�ɭ4�B>��*�X��y�d�SO��DKA\�
���u����z�U�ܴMw-\W��[gb�ἂȪ�-���3�3�G-�v�W�W�,��S�ڿ��������O�y^.!���O���U��ϒ���'i%����j@F��rl���y�UK��@��:ۇc�G�_2�r�iW���ޟ��)������&�����Qi/Wz
Ih(�%�����7h%�i�G�J��[<LX�kUoD���K�G���L-8I$���OOYZ��X@�hn�-�K`�0�mڰX�F�	~d��!Z2�ٰ�i�Nh_�|;�B2�]+�hW�V����H�˶���ڊi]���C_c�rk��=j?2�V���^x��ra�v��5�P��NY�o��	C�f��]8���*<4�t�=g,O�~���]��"�P�+g��'iS���8[�s��N�>�WO4��ڕ�ݯ$��R�{�˥m�-mo*"j>��5�w�j�ŭ2@A��!��v��)l�0Z*��/L����;1�J�U�.(�K�~ʱn��w�Xa���'��b�qwC���ح����Y�eD�Z��7�sY��Ҩ�W���N?���'s֯�)����c�$_�݇��;��:N�қ����"��*W��v�mU�5�
��v�D��<xqU��Q��=SE�,Rv���1z�Mwn.-�F6H��=��p��x�0r�'�eT�%m���__rƋbƽa�P\X��i�֌\��s<Q}�*%�+z�'�c[�7u�N�Xg�qi���q8T8#��x�U�hW?��M7踰U�6�Qɪ��Cw�%K�dVo�3�q���X��/.7M�) ���6�nS=����oi�mC���QZɛʸ��V��[P֗<��Q]�LN���>T�|_�p��R��!��x�z�_j���$�kt؜Oo�L��1�]�#�un+=��ݟ�]���Հ�$8�@w�\}����s!��-���M�W
{��3K7�<�kup�Bt�K-!@��8�����yY�E���X��#yl�!�p'����r�ڋzV���j7:(<ʲSݭ�c7>U+�n�e�@�\�:L-Ω�,J�3�7^��AI�WeS�r[�=mE��R�n�;�h0Z��&�1����X:�Aã�
�8�˓�z\��v���JϖRV��սt�{��7~�a����2AC˞'<�@�˭f�9���cn\Q���]]F!��(��rޚ\�wA`�PA嵖��us�kY�)C��
��;fi`nKN饳�zX�x�z��]�̑Go�յW���4�=�I#�#�s�I��I�\��s�UV�.��D���[����u��.p�đ�N(�i�ŀ@@4
�]Kk-󾚥�I���FDu�D�=��M(x�&o+��֗͋�"W�SV��cq�P�
��*,��gȮI��mc���U����(�����t����%�eB������?nB�k��v���uҥ՗��Ի9$8�:�����I;��r��K0���s-s� � � � � � � � � � � � � � � ?��admin/images/upgrade-welcome-generator.jpg000064400000406642151331545640014672 0ustar00���JFIF����C��C������	
���}!1AQa"q2���#B��R��$3br�	
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz������������������������������������������������������������������������	
���w!1AQaq"2�B����	#3R�br�
$4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�����������������������������������������������������������������������?�����}���.�_Y��z�+|=/mZ0�=e��3�>H9u�z������k���w�s����
���Z��!�nupZ+E7$����sEI'Q���i/$�[�F��<��������G���G�z?��K��#O��������G���C����&����F��<������똏��a�ȇ��'�M/��?�x��/�G�1������O��_����?��_�.��b?��%��"W����4��?�4�����]\�?�K�D>�G�?�i�di������>�������}^����0��������t}s���,?����ɥ�a������e����#���X�!�z?��K��#O��������G���C����&����F��<������똏��a�ȇ��'�M/��?�x��/�G�1������O��_����?��_�.��b?��%��"W����4��?�4�����]\�?�K�D>�G�?�i�di������>�������}^����0��������t}s���,?����ɥ�a������e����#���X�!�z?��K��#O��������G���C����&����F��<������똏��a�ȇ��'�M/��?�x��/�G�1������O��_����?��_�.��b?��%��"W����4��?�4�����]\�?�K�D>�G�?�i�di������>�������}^����0��������t}s���,?����ɥ�a������e����#���X�!�z?��K��#O��������G���C����&����F��<������똏��a�ȇ��'�M/��?�x��/�G�1������O��_����?��_�.��b?��%��"W����4��?�4�����]\�?�K�D>�G�?�i�di������>�������}^����0��������t}s���,?����ɥ�a������e����#���X�!�z?��K��#O��������G���C����&����F��<������똏��a�ȇ��'�M/��?�x��/�G�1������O��_����?��_�.��b?��%��"W����4��?�4�����]\�?�K�D>�G�?�i�di������>�������}^����0��������t}s���,?����ɥ�a������e����#���X�!�z?��K��#O��������G���C����&����F��<������똏��a�ȇ��'�M/��?�x��/�G�1������O��_����?��_�.��b?��%��"W����4��?�4�����]\�?�K�D>�G�?�i�di������>�������}^����0��������t}s���,?����ɥ�a������e����#���X�!�z?��K��#O��������G���C����&����F��<������똏��a�ȇ��'�M/��?�x��/�G�1������O��_����?��_�.��b?��%��"W����4��?�4�����]\�?�K�D>�G�?�i�di������>�������}^����0��������t}s���,?����ɥ�a������e����#���X�!�z?��K��#O��������G���C����&����F��<������똏��a�ȇ��'�M/��?�x��/�G�1������O��_����?��_�.��b?��%��"W����4��?�4�����]\�?�K�D>�G�?�i�di������>�������}^����0��������t}s���,?����ɥ�a������e����#���X�!�z?��K��#O��������G���C����&����F��<������똏��a�ȇ��'�M/��?�x��/�G�1������O��_����?��_�.��b?��%��"W����4��?�4�����]\�?�K�D>�G�?�i��a6�˧�%��WgIq���1铒
����Ƥ�i'�x���N����$�J���os�Ӯ��i
�>g_�G𲝮9�p��y��^Ƭ���OU�4mN~�
]���/V&�@P@P@P@P@P@P@P@P@Pl�s�����q���3�M�P���03�C���}s]�z�h��U?#��5�8�d��<~��_�_�{L�_��?��e��.%�ѭ͆��jz����{m#A�Ե9-��ι�DY��8����r�F�w��8�8я��Z�F�'T)ը�����]Y�?�~���+��N���˩Ʈ6��`�X\4js{8��f�.5*r�JN����ػ��/���>.�L�����zO����=Ş��NM�[R�v�+2�5�ţ#�k���܏�ƹ��fe�G6�chV˥N�g�SQ�
t�ueVS�^�E���+�M�$|�p�pv}��%�1�N{��N�|�O�׬��*NP�N��t�є�Կ�&e�W�w��xs�~+��5�L��E��<�Ce5ռ0_*���$�H�k����.4��p�qN��u�]^�)r�x:تh�b���T��i�f�ٛ��Xfy�Q[
��/・�ϝ^*�(ԝJ
������?�?
>˧����h�:�M�������5`�;[�ַR�n��Z�d�'�^�x���T�����Y_w�����ez���eU�P�T�F2iJ�H’n�g����bk*nye)5��Riy�/3��5�'ĚM���jڦ��ۥՅ���-������{��
���ʳ\�<˰��S���e��1�a1�j����q�kt�M&��Ui֧���Nk�2��k�կ@���
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��	q�ę9N{c��9��`�ڧ��B2�	z����t��ǿ=����C�k��$��
(��
(��
(��
(��
(��
(��
(��
(��
(���Rq�1�댒9��1ϵ4.�8�Zm�4=�0���8W��_����͈���3v��s����;>$~ٺ����-�O����/E���օ�˻�
���R�QK�/l�����I�M�r��H�4x��32���2�V�#Fxy���t�Μ�:�q�!Q�iɧx;�����S�IpςX>$�8�)̱Yvy���R�2�41�=z8h�B�
��ʥ	Ɯ%W�$ܥi^���7쁩��߲��O��[�%�����]%�m?O�|]����=��;[YZY[K�q�i���z97���xu�pN3(�������a\��e�e���S
�i^�9*�mE���#��f����r��x<�+�K��0��Mb1l�S	�U7*j�z��BQ���IB<ҵ�o���w�<�#N�W�5�&M+@���Ol�/y0�B.a���-��"yӒ�@<f��|"�)�Wx��qN��Ur��S����"X�}exQX�5(�z\���C�V��Rz3��<`�����v^aJ4q/
J�����N5%*��IE�S����ړ�[�o�/i^/�Es�o��i���$V�73�wm4]a�]:����#>bm��~���K�,��8o2��֥�P��XҵjcN�j�a��եJ�����R����`��yl����W�#R	�j��Q��E������յ��w���U�����j7:5��^^(a����Υv W%��;��#�V9�_�x]�s�r����|��ybq)5Nx�f*�;��7%B����8��]����˝�R�G)��V�NM/#ԫ��Р�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�-}���v��Y�N�\�ƞ`��%ۖ?r;�a���W����bF3��#�\�?������s�^Eʑ�P@P@P@P@P@P@P@P@PE�����#��*�_�����#��r�q��y��1��3�ҽ,�_�{��j��_�Nʲ:�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(���>s�ul�}�z\�V��i�a����f�e��=Ų��c��{�OזΝ���w�7_��Fi-P@P@P@P@P@P@P@P@PM�
qמz�={�p=z\w^�����y~��@�Km�VW�%YrT��A�9�Som�nO��9q�}N?�=s��W?���5�:����"ss�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/��H��	\��K�����Ϫ�.��s�����=s��W?���4{:����"�y��r�0���\�����MΟ������ȇ<�����?�#�?�%s�}/�G���>����!�?�/�;MF��#�����ze���FO��8�+��/��IGV����Þ���*����x�/Z�__����k/A�(Z(��
(��
(��
(��
(��
(��
(��
(��
(���=��;c��?_����D��O��<@?q??��\���ʽ<��3������y�z� P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@z_�~��`�$������?�va��)~g�ؒ��lu��'�~+�}}YԿ����TZ(��
(��
(��
(��
(��
(��
(��
(��
(����9�3�����ɫ�����x�>T���9���k��g.#����y�z� P@P@P@P@P@P@P@P@P@P@P@P@	�:�`t�Ѣ�ut����m�{��V*��*,j�,��+���d}�9q���4~95��M���ZI��׺�֌I��ߚ��{W��X�$T]'Nڣ}�7��#;}Y���+�wZ��i�~	�w�pZrG�C��to��k�Ʃ{z���������b���	�?���Q����2���H��+���F��N�����j�o_�U����0��G�_�غ7�t����T{z�����$?�?�
� ��ѿ�����������d��9!����W��.��@�3�-��޿�����'�a����?�to��k�ƨ����_�?�H$��A����'L��_�5G���?�����rC�#�����]��:g�Z��=���W�O�Ò���b���	�?���Q����2���H��+���F��N�����j�o_�U����0��G�_�غ7�t����T{z�����$?�?�
� ��ѿ�����������d��9!����W��.��@�3�-��޿�����'�a����?�to��k�ƨ����_�?�H$��A����'L��_�5G���?�����rC�#�����]��:g�Z��=���W�O�Ò���b���	�?���Q����2���H��+���F��N�����j�o_�U����0��G�_�غ7�t����T{z�����$?�?�
� ��ѿ�����������d��9!����W��.��@�3�-��޿�����'�a���ȱ��X�#����L0ڃ>����)�O�����V�/D�d"/�E_����H�P@P@P@P@P@P@P@P@P@N?Ƞ���}y�3���qܗ�yo�?�O�\eϱ����~U��?��nL��|?��O8�\�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
()3���o����\����O�T���e���ʼ��›��c��L��r�ꏐo{]w�?���t�k������?i^��]����=��>���Vz��d��0�DS���
��,����#����_?o�_��x7ľ�k�w�2�:���@�<i����O���ë����
E��gøt_h��1K����m���O��Pc[���>�g���m_Z>4����)�_��ux{T���m�{����k[{۹E���76�\^�zU��_��Y�g�5_h7���~�GӼ9�dκ=������x��=f�N�`��$�`��~v�}�H��]����:~�-����&��#���J����/���O�6?	-�K�.�U��{�/��q�2	�9�����o�����@>��"~�|i�V����<7��x
����:�Z�|C��/�T���-�\���k�-�;)<@��,R« �}P@P@P@P@P@P@P@P@P@P@P@P@P@T�M����	�s�ۏÿ^�Һbn��0e9�9�q�9�{�;�[���`�8�������?�2�L��W�_�r�ˈ���q^��P@P@P@P@P@P@P@P@P@P@P@P+�q��O�UR�D��ge���E��:<�4�$j[�8P�Tn�'h9�'W����S�����>�F����ң���������A��+�=��ӿ�����ii��e��P��?�������?���Zw����T�r��-;���*�9@����?�_����KN���/�
���P������A��(��ӿ�����ii��e��P��?�������?���Zw����T�r��-;���*�9@����?�_����KN���/�
���P������A��(��ӿ�����ii��e��P��?�������?���Zw����T�r��-;���*�9@����?�_����KN���/�
���P������A��(��ӿ�����ii��e��P��?�������?���Zw����T�r��-;���*�9@����?�_����KN���/�
���P������A��(��ӿ�����ii��e��P��?�������?���Zw����T�r��-;���*�9@����?�_����KN���/�
���P������A��(��ӿ�����ii��e��P��?�������?���Zw����T�r��-;���*�9@����?�_����KN���/�
���P������A��(��ӿ�����ii��e��P��?�������?���Zw����T�r��-;���*�9@����?�_����KN���/�
���P������A��(��ӿ�����ii��e��P����/�����̡1�D�+1B�:�qZAh��'f�{G=z��c8ǯ���5�~���=�����;�^)��_xu����<B?u?��)ϮA�������ˈ�?����뜁@P@P@P@P@P@P@P@P@P@P@P@f�p��{U�u�X��ܱ��t:����?2ք.����fo��#��K�ׂx���.��Yv;�a����#���]�
�z�����˰|�/�?�o\/Z,��~c����?�QF����09�����Yv�1ӟPz��ߊ4����OL��>�8�>�i�-��#�1�`g۟��E�`������˰���#<��s���ɣN�mmq1�<{~?�4���#�����]�@9<ds���F��ۆ����Qǯ�E�`���r:z�?����N�o0zdq��O�]�B0q��Qe�:
@���s��2}8i�,�1���&�;��p�?é��3�F���錎A���v�>����e�>bm�߯�8'��׽]�
Tu���q�Qe�t�8'=?���E�`��Q�`NG�����˰|��;I�u�<c�.�g�s��q�f�.���{���˰|��$s���N�aJ�Ђ:�����J4�l�Oo��E�`
��ӯ��s�Q�`8�����>�i�-�;h�����:��h��==~��Ӱ[o1�Gc�ςs�?�z,�Ϩ��C��Ӱ[�6��=����c�9�˰G=1����/z,��P�t���ӏ��
]��&2x�÷�_��]��R���zr:�?�Yv����On��N�o�ၜ�#���N����i�,!>��E�`�����?����{�e���?�]�����Ǯr?�i�-�)���=:��]��'ӷ��"�.���t�O�#��E�d��A��<�N�`���O^q���o���E�`�:��_J4�� ����~f�;����?班v?�6����	���q�E�`4�	��r�z�q�^�qّ'�^W��E��p;�=�x�v���e#E�mB���9���1�Dw�����>L���?�����O/����&sb>�z?ש�뜁@P@P@P@P@P@P@P@P@P@P@P@f��=��k�d?Ի�;i�Jl�x�{�;��%VuA˂B+�b�V�n'�`�ٞ� ����8ez�ӷ��#���!���fs�i7�%W���������_����I�O�o�>�sy/����|�����M����_�ڎo ��?�!ږ1��e���u�����sy~!��	�v���hY���I�t���9�����;R9����?��7�%�������Թ����?��7�]�_����?�<���/�������_?���p?�,���I�_�\�A�����HhY�&��|�_�����?�Կ�!g����W�����_?�	T�_R�rٛ�,����f�cd���i=w�ݻ�6�9������[>ԏ��,���I��z�ގo/�9|��"jC��Y��,�����C��?�Գ��/�������z9������?S�&y��7�%c����_���ڐ����LǤ��O���_?����_�e���7�}Oj9�������j_��ǧ�&��R��C�����j\���Ϟ�������y~!���!ڟ�,��n��~�x�o/�9|�>ԏ��,��o�J����?�~��A>���I��+�>o/�9|��!�v���hYg��t�����Q�������"I�г�&��ץ�_�r���E��?R��\�Ӥ���}�_�r��jC��e���~|ݞh��_?����B��I���~���������/�!��1��e���z�~��y~!�����H�BϮ��o�J���G7���b���B�&��\�AoO������LǤߟ�}��������Ԇ�,�?��n~��Tsy~!����_����I����G7���������,��ˤ���J\�A����Lg��?��7�O���_?���������$��K��9|��"�jG�b_O�M�O]���O���_?���co���I��.�o/�9|��"����B�&���tϮ{zQ��/��)�v��!e����]�A����C�/�Y��$ߏ��w��G7������jY���\�Ǥ��G7�r���C��K��]s���WJ9����?�!ڗ?�0���7�%Q�������H�Bϑ�������_?�jG��e���~������������<פ��O���_?���j\���#��&�c�>�Q��/�jG�b^��$�ү����A�����H��B�&��9������ԇMB��I������sy~!��'�!ږs��#�n�s��J����_?�S��L��B�&��R��B�/����H?�,���I���S��C����'�!ڗ?�\�Ӥߧ�Y���9|�� |���Y��$���K���_���E��;Ro������y/��O�C�?�Y���g�:����G7����Ү4����x�2���OIRy%$�� ��5��3��Z�gc��=�^Ǡ��8�u��]=Q%�<���s�}��ZQ���S�~��,�7��_����^�����������P��
(��
(��V��F�[��B�$�KF�H���ĉ���2�������P¸'RV�U���c9URj+N�\��"��@������V����d�W������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW������G�n�K�G��:���sW����F���V0��Nx4�"F3Ke�,�O��P����9�kC
^��+�v��\F�奻X���5
(6���W�D���Gkn���|:�]�+��?��_W��3��W�^����S�	g��$`�
��n������/��]����/�ꀺ����_��to�������>�e�?1�T�}��~b�����}����}PA��/������.��_����@]�uo3m�hݱ����z����!���7���@�P�Y�A��H#wqց]	��/������.��_����@]����/�ꀺ����_��to�������>�e�?1�T�}��~b�����}����}PA��/������.��_����@]����/�ꀺ����_��to�������>�e�?1�T�}��~b�����}����}PA��/������.��_����@]����/�ꀺ����_��tIݴ��9�v=0���X�eV��V*�S�7�(�߷���_��to�������>�e�?1�T�}��~b�����}����}PA��/������.��_����@]����/�ꀺ����_��to�������>�e�?1�T�}��~b�����}����}PA��/������.��_����@]����/�ꀺ����_��to�������>�e�?1�T�}��~b�����yk#I�fnC��3�u�.�4��>�hO��a��hy�:��=��2���f����=9�Fs�ďʢC[.����}���y���~=h��/�^�=�Y�!��0��?�<w�S/�/��3�����@��
(��
(�2�>+xo@��t��m^��фs=���¯�J������/o<�uCR�TӂOk��,�U��M��/գ#��?�����mU�*��O� O��i}���?�����mGԪ�5?�_��{xv�ܿ�?�w�S���!��M7���}J��S�����i}���?�����mGԪ�5?�_��{xv�ܿ�?�w�S���!��M7���}J��S�����i}���?�����mGԪ�5?�_��{xv�ܿ�?�w�S���!��M7���}J��S�����i}���?�����mGԪ�5?�_��{xv�ܿ�?�w�S���!��M7���}J��S�����i}���?�����mGԪ�5?�_��{xv�ܿ�?�w�S���!��M7���}J��S�����i}���?�����mGԪ�5?�_��{xv�ܿ�?�w�S���!��M7���}J��S�����i}���?�����mGԪ�5?�_��{xv�ܿ�?�w�S���!��M7���}J��S�����i}���?�����mGԪ�5?�_��{xv�ܿ�?�w�S���!��M7���}J��S�����i}���?�����mGԪ�5?�_��{xv�ܿ�?�w�S���!��M7���}J��S�����i}��v?<-yof���/s*B�Okd"W�����4� eclg��iKV)��vW��z�~cU��V���3�k��(��
(��
(��
(��3o~�}�Z����Gkn���_��j�sO�x���3:���}v�����*����[m�Wp
����s�@�=+���;���g��ïkL:]��Wv��ޙ<Z��RC��v�U����[E��#\]���Ρ��嵛ˆTQ���\�_hZ�:��%��p^�Y!���.�WM[y&���J?�s�u���Y��O����.�k[=R{ۄk�1Y蚵���AU����#��$�Hі6 ko��CM~�{�:��i�y�]�mf���Q�%�`�7W����h$�	w~�I$S��O×����йO�ISH��&�113/�7��-�4ʑ�]����+��.����}B��ᠲ��Z&���m�\Eoe4�\Z@c[�5g�\����sƎ�
{E�=��<���+��g���㹶 M�<qȬ�����Z����i�|��P��<��_�
H�w�US��2�	������p=(�W�0��n?�M��pP2�"���� ���/@=��x�Bh�D_�jl������+�yq��4��W�(���i�|��P��<��_�ˏ�y����@���O��€.?����\��?�
<����+�yq��4��W�(���i�|��P��<��_�ˏ�y����@���O��€.?����\��?�
<����+�yq��4��W�(���i�|��P��<��_�
7Ѣ�W����+�i�X@e%[�H<S]}�F�!��Tq�g��9BOʼ����7�5֚���sd�G�2F��=�=�or�Wl���F&G���T �顎��)`�E�)��Y]�$qʬQ�v!U�3'��3m.�(�'�!�O,�\��7۝�e%)#P�8�%�%W�Ҁ+��a{�g5��;�ε���"s���M�H�܎
�@<����+�U�t����;۔�K{7�����Cn�%�"4e�X���.?����\��?�
<����+�yq��4��W�(���i�|��P��<��_�ˏ�y����@���O��€.?����\��?�
<����+�yq��4��W�(���i�|��P
F8�10D���2���"�28� �#�Mu���4iR�k���>�?oW?�i�2�2���f����>���<p1�۞�2�G_}�~�^s����sB��S������}b���8�k����nL��|��O7�\�
(��
(��
���5)��D�o._縴�Y2줚�5jEZ3�]��%�/WߡO���е���EW���?'��0�p�U��!��kF��?��=�o��?�	����?���Z7�A��Q�����L=�?�}��G���Zѿ��"�o[�~O�a����B<�B֍���{z����g�_p����o������������{8*�����е���E޷�������W��x?���� ��(������&�ʾ��#���-h��G���?'��0�p�U��!��kF��?��=�o��?�	����?���Z7�A��Q�����L=�?�}��G���Zѿ��"�o[�~O�a����B<�B֍���{z����g�_p����o������������{8*�����е���E޷�������W��x?���� ��(������&�ʾ��#���-h��G���?'��0�p�U��!��kF��?��=�o��?�	����?���Z7�A��Q�����L=�?�}�����[xI�x�<r�e�0��2�G"��U��I4�M�$�_q�VEP@P@P@Pm��o�*�ȏ�_�7~��m���Iۡ�74�w��}_�LΜ/�e�^����.$�5�\<r�Mk�n�3&�YY�������|�Fz�V�Nv}��j����/k�Y^}�-F���n�B���4;^k[�dx�-ܘ���]H�pŽ�|���{�+˻�!�k��-%�I Ʌ��NӞ�E����D�G�������4��K'��o}�*������H��k�f�H�͸����$�y4�xD���in�YM���8���QW�0[�}�3n�%�[���džmZpY���*���DI��KF���b�#�y���xS��|�־��;KX�?�h�-��$Ty
nq�ƒ�rIp�?�
�4h�=��Ҵ��S,��-l������QI�9�c���[�}�hi��<����o@������o4
p�wv^Ts�'��g��UL[FX�[{J@<��n?�M��pP�C�</���D��b��{!�	5��ʱV$[k)��p�� �[#�W���mi��Z�D��ºγ�3mw�mISI�|�]i�tY�I��<7�K�
ߌ�F�ρ<�^�ب�]�����_̾;����KA��_�WB�}ׇf�E޽�
k�3����i`�am�\�k�`�9q#��9/�7������N���G�5��o����?_�W>�S����k8"��4�\���hVe�],x<�4zn�������_���ğ~hZ���>&���_���"����&O�3�<�4־�Ñ��|��~�k`$;�[��_�S-O���[�o
�c�W�#���m�wT�4oɫ�]XXG�L.��;��Y�m�-ͽŊ�e��h�	�+�_�c��}kƺE�Nj��0�[�~u�@�})l�M��y2�K��]Դ靝�r���04?�Qm�k���>�N���>����mvi�F��$�Ս��i>��Ky�?[x�V�K�KJk�面 P���C�\_���ksl�)��l��|?��^M6?
Z��ٵՖ��JY��ɼG�1��?�/��O��%��=*�Tֵ�>��&׼;y��)o����[��ݓ��<'g��x��N1j���iW6��5��@?L�i�=�~x&�⎳���<=�I�MMc���I5�R��j�Q�j�p�4�Z#H���
(�h��
(��
(�
7�r�����)���{��z��+�A����fjop?%>)�;�*x��_�Z�[��	�k���f���p��xc]�^����H"�X�h/�~,�u�������b��Z���^�mg��zō�Ǐ|�KQ��.�}.�^��>��xwD��Ke76������嘀y�����'�i��~*�^��k�$Ҵi~%x����%�[Ar��h7^>���D�g΅��XA˙K{���گ�V�<?�/�9�)iؾkj�p|1�;e�����[����̖�R$���o;��x�:����k���~!|>�eg��^	�=ƅ�K�[xb}7�z��Ro�qi�N�Z����I�H_ ��B�|�E��?�G���>����~��9��4�O��?�"�?��|e7��=K�POrmo�=s�넀�t�=���1���S���>x��f��_���֏�χ�?�g�\x�Ǟ��<9���Gÿk�-`_�~,�k��#�R��$��Χ��?mY|-�?k�i�1�n���	|_�{�]6�W������.:��v
����K�,%1@����?�:���|U6�o�����7�<��yss��8n���Kȯ���ٌ~e��*M���Ҁ)�.��?k�M��B�?i_7�<'g�7�Ph�;��� Ҽ?��?K���Rk����ݝֽ=�=�j��ɍ�~���D@Y�*��b��@v<�e��NI�����
(��
(����_6��=)������~��O^���1�}~����+j�W幕Mף4���pq�����L�)t�C�S������?_nw�������������c(�u�����O�U�	�����߉�뜁@P@P@e�|V�ށ���7Vڽ�ͣ�{Kk7�_�
=���>^�x'���H����n��Y��F-��k�_�FG�.�
�?�?�	���ګ�U���/�@�o�����.�
�?�?�	���ڏ�U�j|�����/������C���o�-���_���o�����.�
�?�?�	���ڏ�U�j|�����/��{M���}N��O��[�[�㷊K�[!�W	s�<�`2�63��	
X:���pi&ݜ�e����m+K]6_�z�r�P@P@P@P@P@P@P@�{�[�*�ȏ�3w�w>6�9��K�?�ݿּ�����?�LΜ/�_�{�R>����2�	���g���羶H�S��K��ߣ(j���_���5����?�}c���7���o����h���g� ��?�o�����������?�������U���g�����܃��ɿ����%���G���?��?�����c�<���?�M�3��}a�'�M�?�[�y/����>�����>�����k7��_���4{���A��������o����h���܃��?�o��[��I����=1��v5�J\��wԸU�v嶗�]�����
��J�M�Z��x^�ץ��z�ȧ��N���.�����%�˪�e����3*/��cF!G,F&��9U�
PW�IƜ�yNJ1W�Z�)(A�_b�"��~���.���?�
sA_��Z��u}GI���<!�iڗ�}�ֆ��jlo��ta3�}�����t�E����O��/у��8l>%�\/AףJ����̽�/k���yMJ~�ܳ�u'd�g(�O�*�,p�*�)�6kS��p�����$�y�͌��ekǚ1���S����b_�&�������+<}�C~��������w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w���������b_�&����������7�O�-�����w����������7�,��_��</��/��OUҮ<y��	Xh��I�'��K�x���Q^vi���l���)'��%ƾq�u3����0TkR�Z9v+R�?l�aQ���`�̔_-G$�|�]�g"�%�|2�-}�!9��Q�9r$�T�b+5+]��'g����ܶ���?�(J�]u�>��e�C3���?��������$����=��S�ֶP�M>;��UmU��[�"'���Q����dGhX՜ *j>iK�ɨx�¶��)g�L�����It�B8��w��u����p�ed�_��[������奅�j�Q�K�I�}>��ex�R��,��{"�٥L=)���\ڬ~0���_M�g��^�q$���㴞w1�V�o�̑$:���5;�F��~��Ӡ��Q��_Ҟ
>��[����(nd� ��ē?�c�4�C����s�6�4W��ED�!��7���%&G�� (@a�u�����������V�pMuy<:����Z�޾�5���[�G�F�Mq6�~Ҧ�g�@����[Cy�x���v�*�m=ƿ�E��!�Cl�t��Uh��߱Օ�T��J�uC$�>�\ip�GI�14���G{��$1O�ƹx�h�‰�
�x:��[�xj�ݣI�u�.�^TD���t�F��D����BAS��o��
WO�O�N|1%���]K^�
b��i�~�`���|�,��i��:�\\[G4H�M�Ed`���;�in�|_���=�vz���ݸ/dOco$���oq
���$E�:��.|1�亊��~�,����K�V�Ohm�%�ẝ���ߺ�mTk�\��Kq)K}��I>4�+�Tmx�D��+�gu%��_i�"�;�'T֬��Fқ�ң���ک$�	�Y��D�~ʬ�9�s+�Ό�&�J�[��N�E�`��fa�G�r��P����������,u�ax�]a!����֊<�"�t��1H��r�+F���~��SMҼm�=GP�H�����:M���L�Iv��v�p�R��"F��aMVѾ&x^�y�<Id�[�Ǩ3��hBm.eV�Z�徜چ�r~ˮ��"�-�d ��c�/ꒈ4��oQ����a��t��Z+�ŭ��;{��ytE�����r!���-t�CR��t���_���_A?�~h�Hg'����Cc~����kj�C)���rFG8'=������G�}���~>��[��{�^G�x�>L����s��½L������\G�oD�@��
(��
(���sR����M6���{�H����.�I�#V�U�9%�;"\"�qM�����Z7�A��U{z����g�_p����o������������{8*�����е���E޷�������W��x?���� ��(������&�ʾ�{o�^�x�mt
*���YB�F�#ʰ�G"��VI�RM=�l9 �����((��
(��
(��
(��
(��
(��
(��
(��ߺ�_�W�D��M߅��;[r?����{�y٧��?���fua����ґ�v��/��#��F��������_�n��^+O���/��[��4�t�
�Oiz�Z��f�׵-���	�+o�-a��Z��Ag4v����o
axb�S�3z�:5�^���EbkPx�c=+sS�h�.y?c()�qr��G4���Ƀ�i��n���B��^MԞҋ��/yK�E�6�(��`[j^!�e�1�xw�b���-\����kag��V7�r`O�V��Ξxt�8�&א�o��������b]	MKA�	�J�*SP�oF^�iV���VS����U���:\�6�Q*ܜ��H���T�o�u_}�<S�#���~x?\��K�ƶ~1��G��=m�^��vIs��j'��ڷ���vӴkXJ\��Wbh$���L��(f��>'5�#<0�<L���a��Ǝ)�;%G.��U�JW�+��IŢ�b�Z5)�:�*թ%�a��Nt�>���N4���I�t�f�������	>+�궷��*hT�6n�d�
����?�u��RV��T?tW��rz5�k'�)ӕ
��s�Ucq1��g�uFˬl��x�Ӭ񱒚�O��ǖ�t)9Zۯh�{���s���P@���7jʷ��Q��z����T�Wq���C�</���D��f���J�'�����n+�������?����#�޷�y���H�,����_��?�q����	���z?�n'�uo�U���?�s��dP@P�_f߃�����2/
��Z�φn.�[K��c������wM�S����,�-ݴ�;oΐ<8����V}��0�l��2�b�
tj��?��u�Q�V��0�x,$'%e�����o��r���ƭ\b������8F�{\%:N��j�kהm{�;I�o�C��=�k�`��|"ז:Χq�Kjm�%�O�/�[m.�I7�6�7ؚ�Hw�#+��Z�|��BR�lj�Z�)B���M:�zX�V�Q�hG�*jO^}ƿ���P�jNPj�j%MB)�:����r�4?��Xt��W��/�o��	��!��X��V���|9���f��Z^;��Qֵ�H�Gζ��2��D˟�D�u�hp�.�lm\7<�sʆ
W4���V�H$��C��ҷ+�RNw��xEMW�ќ(B�*���Ԏ8�B1����JpW�F��Z|��A|!�>
��?F�Ε�e��moG��ɞG�?q!wY����d#6�����}��u�c��ٺ�����I$��d�(6��/��V�LJ�`!�b��&���{Jk�w�ůz/�Z���u�'�P@P����R1�>7�������M~s�a�HG�o�%f�����?���m�_��P��n�����|�Ԇg�_�����3S{��^2�#�Z�x�S�H&�/.tȧ�,��麞�y�j�Ŷ�<�M��j7����;с+�p�,�����[h�N�6���˭��./�/�J����dxٲ�2@# ��~~�z~��	X���d�vw�4���L��ԇ�^�y^L�l�h��X����)J�2n�Ҿ
���F���:���[���|R�G�b���)g�\�<��lf݃(��>xG�%���������^�Nm���O_ۭ��#-��{���iV�a(V�P������:�wwūIo~uoȂ�±��ܮkrvLs�)b€5t?���-�y�������j-���n"���H�.ZB"٭hZ,�Y��X��Q���sW���Y�'�����y|[<�'��f��E9����N��0U@`��>\�d�"�~��Au7�n�Xj3\Mqoenn�%���I���<K�<�?�]�ڳx��ԍ��l��kLj�	�/*���D��ʜ�{T�@����{9�Arl5k��xwP�-ޯw;ɥj>���]���]���%��q̊�t��_��>'6vڜ��h��ڏ�;���<p[i���VT��<q>��
r~ɟ���������l�z���X���a�F��@��Nk��Z�]��G���H���]�P�}�ݵ[���->�K�4�9o��66p������@2#��>�Ѽn��;�q�th/��\��0�$y9ARN�x �����]�{�V�T���O�t닉��ג�=#�_������./-t�*/*�@eK���a-ܤ�E�~�_�?����k�@���u-6�^�ڋ�*�;�k���Y�3D�+�L�o���������˳:��0��}?
Z�O�mE�Ӽ/
���������-��kuod?u
�W\I�
?���mG��]X�f�^�F����76�z�<�����<:�1�P�����~�
��{��|���	���E�C9=x�g�O����8?��+j{?S*��Fi���qؑ��<rx'"�[
m�}�X��Ԍ����-�Os�<BG�?�2���}8���e����������|/�q<�c�(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��ߺ�S���ɐ�Sw����ݿ�/�����<?���ft�?����ґ���\�m`�O�gp	�?�x��(^��vU��kZ�3(e�����u���g�/�1�����!��/��������������������r�~?����=�ܿ�>�>��	��7����{x�������?{� �˛��~o��Q�����]��D?��_���{x�+�?�=������s~/���=�{K�0�����!��7������dz�?�=������e���7��(���/���O�~��Ȗm,^	L��~RRI��\��TT��$��o�&��8J�_�Hi����
��J�
�Z��x^�ץ��z��^�]S�z��F��:%�-)e�e����6��]�a�ʣ�PHV<��#GB��q�^�I%�q�Hɥv���k�Τ\�Ԃ��NqW��J�Z������QI|U�Yt�|8�t�u�b[
N�◆��95����
E���I�+�;[���Oo��М�;��ª��ҍU���R�Q���TT�NR��S����ԜW�������[�Y���Z�3X�)J.n�J\�JJ�)EI_T��=�
�����;�}��c���]?�1����3��6;��3��aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ�������Â��?�N����w�&��o��?�3c����aſ��������3����E~�_����?�;��'�� ��O�ޏ�J��V����������.��-̖Т'���%~_��|
ż��r,Na���1YEU���iS�F����R�'d�)6ީ%s�/�3��>��9�,5,=
u�p�¬�)ǖ1�i߻m��?�[��m�_��P��n���=�̽Hf~�� �_���57�7���W�u��f��1�K�������`����n��(��w��M<�y0�(�V�D�!(
��٧�Z����
^\j�i��֢��[XU�d����7Alш.ĥ�U]�/�1�e����m7K�t�+��n|U��x�X�a�յ�V�|#��ao����m����]V�iW2_jM�x���@����Ğ-��w�
��7�ݵ��G��H��"$�;s
�W���!����߀S�Z&���x�Q�ύO���G��P�|Gi�`4��eŤZ6�6}*��,�]�]y70q��E��lm�O�^/��;u[����m���v�P��a,Kmqq;���[:Z���2���mg�t��?��Xkrx<i�_Gj�KY.'���X���WV�>�j�ʙ� �����O�ÑjWZ�x�ƻ紆��Ś�����10�5�$1���<�v�c@�:�>����xKI𕮣{��i�������[�n�UR�	|�f/+��,��MvTP@P@P@5/��O������Mu��W��rZ���Ly��~�}+j{K��{�Fi��%O<g��GLg�z�
t�D���n�d}��?�(��)�ZW�a���z�>����z��ۓ9q�<�c�(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��ߺ�j��27��3s�w��������^vi�����&gV����������>c���Q�'�'ĝ�^$��{{�
x�Ě��f��ty��S��������7���x�;{��4�K,3�����w��>%����5���H���m��š�w���a�	Oo>�ysn���ݘ��� ���WŽZ����o�YZj�s=��%��r�LJ��Q�޼����?�t0�H�YۑP�P@P@e�
�`���
�s��xA�f�X�c82# 8�8�q��K�V4X��Q�(@�P�
��b��3�N=h�k�����#�?�˱���z���0��>ת��!{��F�Yw�(�^��@����?�j��z���0���/���@	��W����?��k�����#�,����W����}?��@�_�(���?�j����_��ƨ�^��@��1}��,���ǽk����1���P��W������/�O�/�!���^��}�U�%�y��T�k����0���P��S���/��L!�!P-{�N�R���0����@�^��@����?�j��z���0��/^(��oMb��$�L�}�9��\H""��]��sM;_�]Q�Hf��v��l�jL��Q}{��wl1�^B�����^�����]�J@k�����#�,����W���}�����^��@����?�j��z�����a�?��ހ�z���0��/€�z��W�����k���?�#_O�_�k�����#�?�~~���z���0��>ת��!{�F�Yv�h�^��@����>���ӟҀ��ġ}��c=��k����1���P��W���b0�?�˷�@�_�/�a��T}�U��B����==�P����^���ӟ�e���@�_�/�a��T�k�����#�,���ȊFԮ������?>	Sy�R)�������<S��5��ڤ3�׿����o���?�������2���f���9�?}=;Z�
~�u�N�?���N�g�(���S��?������<���S�_�rg.#���y�z� P@P@P�=���u�x�Ú|~6F�%�������Ʃ6E�"W|��F�����~*qNK�y�U������ʅ	V�V�W;�q�B2w��PK����?���%�sU\tq�<j�T�4�MM�I��Xy8�Eh�̈�io����#���c��_ׯ�_?������O��?���߆<1�?��]�fߴ��Td���k)��Φ/���d�T2��!��`��<0��c��t?��p���`�g�z�֫�V�d�O�������?�]��(�1RڿW���u�[㯝<c�X\U�x�V�+w��~%��řKÞ�ʼn���(%~���_~�>Ҏ�S�o��>Q��w�
&݆3��u��J臊�?�-�Iw�W��(��to|~-z��ߗծc\�E�خo~6��x����;5��]�;�IZ�N_��c?����?-�J����Ø����Ky��������_���c}s#�T�D|E�"m%�`��x������
w�b�]���<�_����Zl|Tе�q��߇#��,����ǽu��f��2�.��T��\v�<�c����en��	?�ϒ~:�}m�|5se�?�^�]��c��|m�?�Zt[	M��jM�겴�#[2t��$�x���7����:�E,�9-YB����]���4����[v��g�`��,ҥGuR�8�>m}Y9k��׿�6�����ir�t��=̈́�2�|�sC?�����O�'�Bx���Ř갗5:
Q�ܖ�v�u�g�UȰ��VQ{�ҷ�K��~����\���q�=4߁���s/�a�|'���?����#�Z��1�m�w��=���P���eh���q�����fs����yS�	�%�?o��'�SI�U��\�]��s����P
7R�����+����,�x�;�K�]�s"��ȿ�H
�p�Svk'�Y�����=�)��?޻?=}
�C����~[<]�%�U�������u��3�Ŀh��m[C��V�qi���+mKĞ
��[k�}S�
{b�'�x���o<agys��"���^a:|�ᇼZU �I�柵Z|���"����N���%Δeo��=�������-�큯x���w�����5օ���~�G�{�1�ڭ�?N��Emyh��k��;�|�
�>,�'9�k	�����[J�;�{��ɣZ��Oⵒ����k����v��ി�[��~�y��E�Kc�����McK�4R�k�#K���<W�Y�&�]� ԋ[��:Ρ3^~e�y�&�/�Q��T�Ԝ&��HYW���n�ݫ[S��yeL]b^+��d�)B�!(9�	s:R\��WI��Ф�I(VDҙ]C+Y�T�A�] ��?�8��:YN��_��Ϻ��k��&�f6�G����|Q��ri����ǽ?���W�>�#���fs����f;�M/�f/�čy���m/������E�*��yO���?�dϘ�M/�g&_������<����z�8��}�?�I_���~�+���QK���Ǐ��Fß�w���*��|R���S���������B��a�������9��ly�$��_�x��}�?�I[����!�|�
)�9 ��!�l����X����%o�j�C���(�����5�{-����=B�_���ʿ�5�"�<�S����i��v��?��������*��J����/���E?�PZ_��A+i�1�;W�W����W��������F�\����S��Nju\gm�\��;U������K[����Q2K�X��?�PL<U��m����p֟����}��K[����D�?�������R�1m�~������)q/����5�%O��[������S�w���5�Ϭ��	k�P��|����>��(<S�E���o�9U�C����Y������_�6I���q���:��m�~���T�x�˼��	k�P��/Ic��ǧ���W�sŷ���;K�"��ϼ��	k�P��\�����>��)4�]~��P��q��V>\l��B�ɑ��^;u����:γ��]��a�Q�ԓ�B�:�ԩ9�ҕz��Z�����8���̫+�����¥%V�'T����(�����~�~tPm��?S����f��������I��כ�����I�Ӆ�+��o�JGԵ��j������V�V��M5
:��o�k����O��ڛ˿%$ܱ���PyCc�|/�u��qmc�
[Aw��uZM�[��1���f"f�顉�$���ѫH�FhgH��	�Ή�#J�+x�k{Y6�
`�˾$S��5�q)��/�
`���
(��
�?����S�\�N9<�'�P����!g�\�y���E�����?�t���������֋0��������>"���au�}������|E��R�����M7��?��/�.��f]��ںg�����_�U+>�u�}�����?���E�`�����?��"�⨳�]��ښo����O�t�0�������"��N����u������?��o�;>�.���?�t����������V}���WM���?_������ϰ]w_xj��g�?���E�`������Ϧ��/�*�>�u�}������E���Qg�.���?�t���������,��u������?����;>�.���?�t���������V}���SM���?�����gم�u������?����ҳ���$���i(o-e���4�&���fځ�6��h8��(�r�Q:����f
�G�b�=??Pz����u��������E��Qf]��ښo����L]��t�0�����?��"��Y��u������?����ӳ����WM���?O������g�.���?�4���������v}�]w_xj��g��T����SM���?O������gم�u������?�~����Jϰ]w_xji��g�<E���g�.���?�4����������au�}������E��Qgم�u������?����u�g�.���?�t����������,��u������?�~����E�`��������>"�⨳�]��ښo�����|���g�.���?�4����������,��u������?���Nϳ����]3���".��*Vau�}�Q����ѝ�*"��YَUC噏@$���0����9={�?�=�aӟ�O^����?�^���Mף4��0 ��nG�5�k��_r���u�ǷA��҅��_"���>L���_N�מ��z��ۓ��������S�+�9�
(��
(��?��(��O���?�O�5���U�t]�U���iα�[&����P�1�u5��}�y>/8��k�:�k��oyJ�M����Y�eC.�Q���)Ӥ����v��S�?l�AЫ|N�es��s(����_�N����S��y���������r9��ڛ���R&���§<&�x��(��p�K�_C��F�ٜ��.���R���S���5�|���0���뚈1�'�z�S��s,6��P�挥��%��u޽g'�ߩ���Ɨ7./|S��8c�I�^��;�Z����0�b�~�
߇�O��%�V���r��s���]�Y�/e���^�W$��K1<ըSJфR���~�����Mh��K0�)ۺF����D������]���@�di'*I��	����]�*�ש�mnrm���z��Y��w�+뭗��sba@@��:���]a-���+�on�f��g����2�n
Y0
�	Ӝf�=֋���s�qi�G/�[�M5�$
dy!���H綼�h��y�!�����G�{x�Bw
�)B�gk%���G,gI+��_������g�O���_�|�RM;M��?�>$�c@گ��;�S�5�Jy��p��Ӹ
$�l�3f���:��hԤ�(蒝���׷c<?5�M����n��[�U�y����7�~x�+��:�<7�j.�3A���_<a9&U�𷌵�i#$!Y*@�p��*A�vP���Ju��K�b"�#+��Pk]u�]=z��x�Y�x���cV���u�Y,q���+i_�y�q��&�%4�{�[���9]����}淍~!��\k���
r��G���G̑��iZtw���o�>��2�;���ƹ�j���.�ҷ����Y��覽�(6���M[�N���3x�O�>��iD�~(�q�
b�L�?���ת�$�K��[' ���K0��l~.�J*�z�^�o��X�S[�JZ�ta+���}n���?˯?�q��^��:tm��?����t�ّ+k��]F=;����d �r\M g���3��H:h_�WF�V���Z��E�!�I����t�$�8#�L��˱h8��ߟ�\��e�
4�Z�n5[�*�D�ods�)�D.�z�u��f8�~�C�_�C�\���f���?�+0�����>K���A_�����=N�����
ͽ���{U�r?��]Ǎ���ǝ�9��v�?�y����?���8_����gԵ����
�x���Z����Au��a"\�&ָK)o.R�����nR��g�&h%T$��W?|i��񟅣�E�y���[���j��fx�찗PTHv���6�bl�����7��^���r����Yy˺(�A��*��@5��_L��?[�o�uM#U���4�F�T����%����d%%�h�d��ᕁ�
(��
((��n?�M��pP�����K���	��奴L�Vffª�@Y���$�&�KDs�x��=�nj<)-��4� �"�4��P���G�TE��I�f�f O��Id��1���x��]��q�	���2��bo��iwүފ�P{Ŵ��{�;′�tKwd��̗6�
�ϰʳB��y���ep�n<�x�<���G�r�Xb���h��ڞ��i�6�n��5[�]:��
f���x�<�.O���K���ڵ������jZ}�bkK�>��;�� Koun�A4d���g �ͫ��
˱��������h�W�4OW�X�����{��
)]B���K�6
$`��� Ȁ�ː
ݫ��
˱��n�l�Ca�O2WH�<�,Q&�*����8�9yQAf�b]��?!@Yv
��?!@X6��G�(.��}�(����,�����,�����,�����,�����,�����,�����,Q�-�/�0@����8���	�e�C3�����g���S{��u��Gq5�<5i
�I%ܷZޗo�p�ͥL�Kr�
E�[Ϧ��X��͈���T+�����1�/	%��6�<C��c-㸉mT�g�E�J��g�K�@���cz
KK������.4����� �����+���K[��h.#�2F-�)fޞYm� Xv�}�i6W:��ye���q4�w���vV�'/5����(夕���b'Wѵ�uMS�5�2��-�&��Q���#C(���Y��1J��$m�##a���-���
˱���/>�7�`��7�-�k��E�i�k�[(����J\��Q4%�{u�	c�~�r������,��$�K<�C�4ҲGQF��Y�G ,��*�,�Ma�)��AA�A�,��}�(��e�6����`ھ���`ھ���j��P]�j��P]�j��P]�j��P]�j��P]��IWȏ�]Z�����_A?�~hѤ3�������
�j�L���f��9���q��:�lR�G_}���9���q���GW��[hyo�?�ϑ�,�#�ӽz��ۓ9q����<�c�(��
(��
(����pH��P�ڪE��ҿ�9?�-ҎJ��5�2�?�|�(�i���<;��k_���R���'���ּ�V+]nv5~��:8�h�@A8�qڴ����I�z�
>X�iK�:`�s�x��r��]�w�����˚���K'��0���Z]��(���i��6f
�)80��o֧D�m��V4ӧO�Գo}���*B� ��g>���[M�l��si&0w��V#�I����=G�Y�]=ˍ6�ݮE&�+ yK��2��dg��-S�W�_]���$�v++1���'�{~���]˧F���0�Z�����8���8��	=�s�om^�
z?�Z6��������p�TE�$L�4��*��w}�Us�>]'M�{Yj�G���T�۵�����m~�<C�K�S���P�.�{�K�[B��-�n����_&��,`�I]��*�1�0u'�2�%y��JRJ)�[�5k}�a�:��[uf�b�n�,��q�_fߋ_�o��j;{_���?`�>��㏉�w�o�2]$E&��k���0_ɨ\�j�ii����-����q9�-��.j����<����Rt��q�.���Դn������.XSïk��R�$�Q���ڿ.�kc���<,����!/��u��)��?����?x?ƞ0���]���:��4���u�j:>���Tv6�fiW�X�\��x�G%��Z5�Q��iR���U$�_+�p�U�,LI��Zp�(U��yT�'�i^�G�/�~.���z�� ���'������y�ҐNџ��9$��r��B������o��>~8���Iɻ-v���?�g�	C�ɼU�|���6�c�hDnߵ4Mj�M�s����p:��?�>�=�Aiy�o�߄d�y��>��r�3n�*T��jrq�����w���N����Zh�mfn��.�+���Ȓ��\����<��Z�������m�rt0���jw���s���ҷMi�1{�Rl��U���H�N�re=�5�fm�WBd��<6:�Z�����2j��X����`���E���s���C���cS)\���#�`���Y�ru�T�M�S�L�5����Y���\o����\m�"
���
��Q�U�,~(Pm��o��U��'�������v��]/����?��_c������׷��#�j�D�|Ӽq����U����t�
���G�ɩi�2k�����ս��W07�u�x�y3[��Ь��R��
.�����5���=��U�P�j3jmcah�����2��>6h��cWgq�P}��[�]K{�����I��jBK�"\\��I�ܔ��F���igM���-Y�k�,<����>��y���>����<��#�Z}����Y��0�[�<p�f�(��c2(��P��@P@G�Cq��*o�+��-j��{�^�?�%��i-�E"��Ku�цU��
�øe$�l���S�	����ƺ��S��0׾!���Z]�ZB�꨿��9e���+�~�ƍ)�ͫEq7��5���pF�?������/�}�}
�5�S�6��Aռ;����a��Yh~�����4首�I���g�����(��	��B���~��l�[_	i���]����|s���_��V[�
3Y���:��X�^�j2�vs_J�Nw��s��
W�?u��N��i�?������^$�ҵV�,��K�O�xo�٧<���	���0��@<3M��?k�_����Y\_�x���z�����O�ڏ�u�z$��9���D�]���M�����4���\zςc���7�����<Sm�x��V���k�_\�x���T	&��il/.m/d�.�Ǘu�i�$V�A���M#��o���ݮ��-�D��(�J��������ω7�C�f��ˮiW����þ�K��<Z��i��\G�Y%�n�'��}|��m���5�I}�_��	|c����F��ڮ����soc|�7��Ο�A�Xi��n�m�K�.5�f����=>?j�������M
��K�Ԭo�[���O�
g�1���h�[[�r���6Դ�m{eo���Eask3-��~Ο���/��t��F��w�MF���4����V֟B��y|[i��v��������h�=��k��L���P@P@P��m�_��P��_A=�̽Hf~�� �_���57��_��$���;�����v��U��-3��-A4�o
x����ac����\j�_ǟx��]Ʀ#�\ZY‹y��5_����e���s���>|Y�e�CP��_ּ!�Yj���'�χt���ړY�@��N&�}u>^`���N�wޙ,����t],>��
_�.�i��|]�g�go��;���'�WO�΁��&}�ZF��i�z*\8�x[�Z���ς�(�����Ƿ�/��^Ox��)�Oi2�ݵ�.���S�^1��u�6��Xi7���0[K<+��<�?�/��};\���ρ�kw�!�'�>\��C�'�;�kú���O<e�x�~!hZύ.%�Ӯ-u�	E�閺��P���ҿbo��:_�m���(ּG����W�����sP���tM;O�Ηb5�4��OW���I�1}�>���F�f������?��<u������>�����
z�_X�A��X��N���^���w�i^
m+�W����^Yvw_
Myi� u��DŽ���?i�ˮ;iQkW~7�CZҴ�U��I�R�Nw�"��ڥ��.�8ḍ��@���	�@x��^��_�M�?��&�.�o|[�j����?j>
��k{@�}Օ���u;�<�6}>�I7:|:��р{O¿����>4�|a��W�F���W��<is�qy�^���5��9�;k{�����izU��v�{q%���%P@P@CR��t���_���_A?�~h�Hg%���������
mO�k��2���f���G�s�8�q�|`�Q-�����9�1�Io�S������yD�QY٢�*��f$�y�^��WV�T�{��l��|6]g�����w�����J��
?�sr�_������w����{J��
?���W�0����]��4�Eҟ�����,����>�}�>W�
7�G�������a�/�s�_ϕ�M��Q�)�<?�(��r�_������w����{J��
?���W�0����]��4�Eҟ�����,����>�}�>W�
7�G�������a�/�s�_ϕ�M��Q�)�<?�(��r�_������w����{J��
?���W�3��਺��C����24�ёԫ)f�p��#�q���5\َ-�b�V�躣�pKA=�>�v|q�T/�@ G��q���:.�I�[����Ӓ��\X9���J*�h^�'��hg���a���3�s���_,���rw��X���~U��E��J[i����t:�…	�&Ns�=����BNW���H��=�y�v����f*FH����
7�n��^`�(�o�^e�u2S����m����''�XK	�m��ވ�8��mۮ�[Mo[h�}3Z�f��L�/o�؜-ᐓ�>�����B�zPIk�8��]�:)*�t�)O����X�s��9�T|V�;�|�S�H��&Z�C�Y 'hg7�Ep?ܷn{W���<���c�9%+ԓ�k%o�C���ٞ%Ǔ4��)�1_{����?����S���~xwJ��u]ZK�<Yi���n.�ēiq,�
>�̣x�*q�N4r�lUj�P��/g�O�toW���xR�N�.�(R�曊�i%~��Խ�9�(�h��:�#���t����O�m-<s�����k��g����h�s%���Z�qsoo8�Y�x��_J���53)'B�3��v��9]Ԫ���c����
GV2��C	s9ͯi�I�QIFV���=��~�~׾=xw�V�I��u��~1��u����~+��&���N��l�"�J��$��,�Z��)s�Dž����)�s�rX�U|\��Xb��P��y�V[��M��ɥ���i��,��6�<4kU��R�3�Pr��+��i�f�D���|9�C�W������7��������B��1x�Ek�o��pk�u%����:��[��K��fkye�����f8�f'R�l6O���r�h��{�F��VKsLv
�	��Ѧ�Jy�5{��N�{ɹEI�ݵ�3�)�-���`��4�vH�"[�v���Tc�$*���<���JM�Ш޺�������zqY2KhU�o-���ÍH����J��@q���~����~��c�d��[[��}�?�_�"M�]~��ُؼY�������#�搜{���C��+�4��~��S��[�Ԭ�����Z��������+��}?W�u5Ђ0?����ԙu�/E���ַ9Kj��s�@��`I����S'be����Q�����*����iF��=��[��D��b�}:��օ=+ɖU'���_�[)\V�{���T"el(��Α���_���!����?�@����P3���E��^�8�y\�rBƌ�@���PN��_}�K�𭴗�q��e�	w>O��y{+��
��}G�}���|���o�"��}�?��?�򿹇�/�������(������9e���a����i���=�?��Y+���{a��Ю��oO�*�R���
��_�C����ٛ��!�M�k|�����g8�(�s�{W���.�m(�ޭ�fgF?j�{7�˩�xG�P@P@PQ����
��J�Z��x^�ץ��z��,�
��!�El%rHH�����@����W���6��Y�Iw�X���oK[��>���p�.�xG���E�^�pe;ύ_ln�9�Y`d�tɵ�>H��KY�������Ɯ`y�+˄_��4�����O����.)O��5)��v;'h��c�i���;D^�[u���~0|87�vx�������g�6�����S��x�%�CH�62+�@�~'�R����tˋ&�N�L�.K��\M���LE�Vw�FR1c|%h͕Є9�3|-�+�������qp�"�}�gm�䒬�h7���`P�?��ÝWM�մ��WV1�R�O͛t��3ifHZ8�\J� ��(A�@�|\�m�B��0�!�m-�ٖY&�ev��mt��)��E$n�+#���|W�s=徟���/.�l��Yd2=֡7�c	����-�Qd�Z�I�V�X��o� �kY�W�G<sX����ܲ�	m�I����K"�q3�+@��~^��Z叉-��-&�X�����^�~X��5ɠ� ��<�Ǖ���~Ǧ���������__Kh%���&�]\ @�B���3��h�#���­r�o,�_��$���`w���;{uFB~�3�X`8�\;D�����h�˫��O7��$f=9>�=ս�4�2�L�Y��١AySr����s��K<>2�d�X�d�ϕ$�Z��#ܲ�qsq�@�̊QJ�%���[MWPҵNM.M>����E����R�A��as��6�5�wBD�P�y����6��/�K�2�V�|U��V��B���d���M2�ڼq�4���YC�^�h���H�O�^��_R��6�Z[���{k����i���p����ynw����%����i�,��L@:
�~�3�Z���
�KIw�Z��ҪUK[��bN���f���(��o����҄���	�e�C3���?������.�*��m2G_���X���4�w7��&еxʐ�P��r�U����#RB���ម�c��œX�K����&�{�ӌe�E���D�E���Cm+�[~gjZ��F�4�P��5;�v�+�WTmL�n�F��^�X�-�RG5�B�
?����-�x�O���+kxL�;\���Ʋ$���B�&�?޴b2�c�K����e�}>k->���P.P�
���۳E$34���D#�7�=հ(>���>C%�Rx�GY,ْ�����RGs+uT�B&<��L����X����|]��Eeo-��Id�o�4Y$4k<��^�F�4�6h�~�k�I��T�{������#��ͰY$�IŴ���ˆ䕼���O��pGQ@f����'����y�Wu�H�M�-�K"����\I2)Q5o�#xL����<M���ڰK�畓�8����R<�Es���m�r_����&�|[`�xSLֵ�f45�Zo��jwP[y~u�C�n��bR�E;���J���O][�Ok�K�cw7�@${�X$�(�Y�	�F^h�!o-ԗ����Ӿ:|,ԍ�Ŷ����]��%����R�I�pM"���8�{�[��%��~E�.�<K�}�l庆'60O%�Z�bI����ZM�%�3�v�R��`�d����p�;��mcO �b.QT���I�����PK���5k�/Q�%�K6��]^��A����N���^��4�V�Q�Eh�»2H���A�\[x�H�=&�P�/�rK�Cg�Y�h_N"h�I �?�V2C�u�B����5��6��G�k;}cM�����.�]�une�������ɖo6&��%��<y��Nm�/�z��pֆ+K�#���k� Q��H�Q�W&4Vߴ�(��
��{��|���	���E�C9=�?m	���}���9���L���f�������<��?�&�E-�������O����?���
����㊷��ޜ?��t�w�����:�桌�(��G���P@P@�Y��YQ������	6��ϩ�3�P��5�U�RnK��Z�������r�V9\�'�9<z��T��tҷ��3kɽ5v���.j��x�Q�n����!l��˦l�!�؎��熧խJ��:��zy˱j�z�Ч6��#)7�d�S��O�~4�ÿ	<w�cx�5�$d�<���?{ּ���I�W���a����_և]�3�/s	^�t�O���Lo��^Q��i.�o8e�
����wI\��Oɟj�|s�xg�-Wk���_[���{�ӒJ�+����}�����?QXf���7����2��1���|���-�����Ê��_�x*\��V��S�(B6�h�N��c��p*Vx�e(F�Ɣe)v�Q�W����"���G����9�]�m3)���-e#�ˊ�y1�38=s�|�+ļ�(a���b��ͽm�Cڡ��e6�Z��>�V�����O��~P��3�Nx�"�^k�Vfu���Ic�����c=x���qo���!-n����N�=�b�
��FO�ӗ��7�~|'�|3��'��4���:~�-����^U\v2��qX���7���0xZV�xzP���}�8c�TEDP����t1��t(�l�^G̟��]�%�~��y�nW᾽�Mn���$��!��e� ��#�{K9�n�KJ�׮��y���f5-�������;X�|�$I
��[�?*8��T��cM裁�I�$��,ѷ��w�k�o�����1���I<=m��{9�VM��P�q�>~x*\��-fH����Ez5]�c
�4����K�����h�w�Ub����e�b���
��k[���ip��W|���kO����F�
��2�|��k���?��o��	�[�9�o��)#o�����x��سv_ŧg�?����%���yq*�-��m��!���s����q���IY��?�}����2�]�K�n��D8���p�.U��O�s_Ϟ �AY���K����1�&��_j?����^�+�k���롫�
��u��-��'���s>X�-Œ'��ު-�܉��b�.G^�ץh`�d�G=���?�+$+~%���dd�����w��Չ�E�9ϧ���Z����sZ��ZjKBt4��'aw}j���a�,�����>k������~�ҋ���o����_�O�y�ٯ/�o���?J9י��������d.W�\�ς��Pl?��S��W���?�(�����2>[���I[��a���>ׯ����
̿����vKtf��}���:W�t���u��'�|��(|o��:��3◇�2I��k>��fS�}��6�)����K#�]��zN��Z���/�t���j堆�c�П~�@T����-:ɬSY��7~	�]��:�˶���|_>���aMJ��P�f!���C�
��>�m���j�!�O�1�<�󼱓��7m?.94=P@PQ����
��J�Z��x^�ץ��z��ƨ����kuW
�J4`0>���G�~/�C���U���h.ᶗW�5�����w}�g3���#M���{;4���a�&���x�-�x������CRУ�>��oD��\�c�P�Cs��@Aus�]�[�ij�&(̼P&������:��"Ӯ�
2�Ú��ͦ�o<ZT�=o����F��{�_x���u���Z��l�k��������/��T�/��mOI�|6zľ"�h%}ku��Y�茷����HԶ�R#ǔ7Ï����#������&�&�/&��y^�C�^�g��bh��������[[��_Z4�g�_Q��>_C"Og����Eo��o
Ɠi4�t�W#W'{G�̱4*€7#�5�w���åi:����&�i��ү&O���An��Mt�y�:k˔�@ig���I�x�mE��~��0æ�ٶ���]&x쭣��A�l�I�`��_���.yom�V����G���y�I�mO�ҴR�Q�&��j3�A墖�biZI���gO���R���WL�_=�D.�B%�T����l�����Y��y\�$џ,^��O��7gKҧnX��..|�6u��|K=�o)g����:��#,}�1����m'Y�mtw{-~��Kռ��yn��)��+'�1�ڀ����0���#v��o�%���?
VkJ�	���E��Z��y���` ��`'���H�0^�,��K�f�x�Soee?�"�ƥee�]]j~M����併�+��&��+.�q�`+1m�����K�{�Vү�餒��n�����<�Cl�<����Wf{hϙ[���0
�{����O>��rS���mƤ�[鷚�l�
�G����?�"�{����hT=�{�a�u}/F��KL�Ku�B���+�}J)�'�Eŵ�Z����S�[˸��D@�(�]�]1�q���wھ������3���umR�I-�//!�U�]:���L���S�_�skZ
��[��?��Vȡb��l.e�0���5̋&�a(`ĀK�
7�r�����)���{��z��+�A����fjop<#ƿ	~�G%Ǎu(��.��.mWS�������W����J!61k���s.��
��Ա�C4H����!�Þ��޷�Zhv�q��Z�����\�2�K$�nc���	�Y���1��wG�W��c�|@𶕭i�4�񞚚��[-;�:�> ��x"=:K�=���=��֓���wff����π-.��-/TҮ�=i�X5�~�D�$l�K}r�4j���>Kr�.1�D�1��|?�/��S�5}^#K�-յ��:Ţ�7�m͖��DcW��|�j7��z��w����8ml�Y�����=ZA��Ƃ�h/Ė�ͬP�]��7�B6�f��
ȍ�� U
a��/i~x~�P�ӕ-!ԡ��j?�vL����4�v��O��T��\�,+!���m�?�����e'�/�Ė�z�^��Ρ��^!�6�5˶�r�yj���}BHK��&2?�PkC�6| �%Ԛ+�o.�{c
���Η��n&��X�#kw�����@��u���h|�����_�(����t˛���\ڋ���
M�]V�@��[mN�E�ډ�ϴ�If�~��
��5����.%��}��\�ܤ��N�Ю�0�r�3�xz��G�X�ws	�y�ʠ�7�O��x����O�%zP�A5�lh����i֦4�����-%�*!y��q�$���K�?�s���#w3�u��a����|���F��[�Ȁ_����-��si�?����k��9�_@׾U�ؠ���O���̐��;M>����L����'�B�0 ��~��Io��Z=��Kg������5��$6��v�L�WDJ�@������u�;�7Q�զ�n�4�ca�� �tMI�햡yf��?���a-��N�,�5�Y�"ѿg��֡ug�s��w>�
��M͕Ιs�:(�D�_jJ�I0�܉|�b1d^�˟�I5;�e|E�_k7ֺ���j���o/ot�g�G�i�FN��7	�"ı���4aU@:�|�G�|Mg�]ͬ����`��0-Ρ�=����0B�&�-���W"�osr��p�CR��t���_���_A?�~h�Hg'�q}i��7���;�޶����ʦ���i�aN?��'��Q!���^�������r;f�w�O����9����G?�v�o��S�1�����+��
(��
(��
�E�l���t�����7�<!�����Vե���Iv�V3*�"A�GJ�p�.��A�`�c%N�*t��������?�xo���FK����J���s�m�NR�#'���O����a:o
	# �'��@�>i`{�#������l��:��޶��v>��G��k�M$�����}�|%�k�*����ٍ�
"�ǡ�kͩ���w���6��?��|pxjv�t���[�$zE���������q��l �~\V��M�����,�J�X֏j��s�T=�4Z+������&���}�L���2����Cր/@�y��֋a?�?w�f��?��/�N����l+/�~��e�o�L�#-��x��d���pZ�K�_���+�ތ�#����!�����-��U���w�Ὸ�����H�?a���Stҡ�2�{�"�8N�aM��CitN����:2�2���kKI)>�A'e��u=_���ƹ��n�$[h3�>	�<����M:��	d���%�y6�Z�k"��9��WN�U���=���_�˫�R�����u����31X�Jx�S�8$�J2���螟��<�T<?��k>�m�躕���k��V�#��R�r,5��c����m�o6;����Y%C���e��N�^��(I8<E	9)Fz8�KT��wK��a1�.qN&�<L_�xz��PW���[;]��������q�����[��;��/P麦��j�f�`�u;Y�˛dy-\�XgYm��WGW6Q��2�t1�t�׏4y�"�n�Zi�z_k4<�"���KW��y�J	��/��]5mz������E�����<s��Q����?jfhLj<�q���ka��̒���yl��&Y?x�5��I�q)a�Z*�Ӯ��}c.�m�?�>���V��[
�ͣs���v�oi%��-������:Cs����z�I��?
����(+��wK�H_�s�x66�h��=M:^���Q��?��j�c�K�@<�SZ4�`}x�_��,�*�sןJ���3�[��Q��yO�}��FN��~%�qǯ{��2���o_�]8�={��n3ǹ��|ț2\��I$��6К��Rm"l���,�z��~W)\i?��s��dL�AK�9X�#��s+={�d����
S�}ھۀ$�a����Y��e�*����o�:������3/��g���Ktf�:�F-+��]����B��?��J��(��
(��
(���!���7���@����K���ُH��"�H��X�ex� ��YI$Pd|�q��*�mBu�ى�u'��h-�ev��)40�Z�&-�5O�M2��!+-�r�g�/����,-4��/�a��]���붲�3�a�
�*,&k�1��^���@�?����i�?�{�|;�����������h�)��ᶺ�R�8l�]f��KK�[1��h�nPX��>���j���//�J�\��ėЇ��N�.Q�l`���\y*�"��������~���x�]�4�?L���4�t�}J�þ,�,5�h����M�ė�]��]�[��6��-��ݴw����|6�����/��`��Zw���Q���f��`�H�����8�l�4�ϴ]]F1y<��?�s�E��3��p����n�"�ol�Ys�I%�Qj��g��m�	��7vock�{k{��n�`���?cχvwi{�⇹KY-VY��'p���Kj�}����Vi&E��0�v6�XYZX�\�ekoi	v.�+h�˹�b
�yc�z��(��
(��
(�
7�r�����)���{��z��+�A����fjop>tֿd���޻}�;�u(�[����+�����ܗC*�[��i�$G[4�ذP߳��K���S鲾�a�mCh�x������)Ka��,��*��1@C�>xSM�u�G���~�𶷮�Ě��&��?�F����mF��:e��$
�����^$���rW߲7�[[�|G�k>)�u�<j2���D��ԭ��-���[�i�o�AmiQ�:���
�/���I�v��]ƞ!�t�}�_jzlZ`��˽GK�Ѯ�7WsY�#iڅ�I͜�f�[��+-`K��5���Y�b��խm����nU�hۖ�����dd[�TP��s�ZK�WRb�ܾ2�㶵���H�:V��E��;}R=F5Ӆ������u=wQ��^� �"��>�uk>'�j7�w0����
� �_:��[�F��K��K��@Nx_@O�Z7�����k
���E%ЅT$��fRX<�I7H^F��U�(��
(��
(��(j_���k��Қ��'������/�=�aߏ�O�:V�z��ʦ�њ�q���A8�8�Q��oΦ[
���8�k�צ?��Io�E=�����q�i���c�BG?Lκ�_��ocP���OK�p��
(��
(���]ߴ?�nq��~�փ�濒x�J���%��@���?�'2�����3�lC�q���n����Kn@i���C5�A��S*|�Uq���4�(҇!x���;�F������̖�SF�B0�?���*��K��cU��(�y�Xc�Yd��H�@Y���*��I'sZ~"J��W���!��>��.4��C��O5/u�����E�kk���b�9l�d͜l9.�P#=U�m*��z����u}7��-Q�t��ٽ6v��s�?���'�9Z]3P��=GD�>Uޛ�[�/ rC[K
K������xe���
��8NR��w��]��š�8J�yZot�i��_��
��H�4���>h���[M�Ğ�l���Uc���������,o���'	X$n�*r��\E:x�Q�R�/-^�w�9Yz�~���R��<5yЍ;rR�龼���������Ѵ?�R?|.���|%�ۥ��͕���&�\�u��	�&��*s�	
j�����-S�����^ֱ�/1�Z���b�ʚ��̯�~W��nKO����CQ��sd��J���2��CC&�`q��7��)b�y�B\�m�R�惏U�+�?�&��&>�m5g�|���M5g�Ns��-7�ֱ|R�\�/4�&�7�����%݂��$�pe�>A���ʞ~g�S�Ӗa�E�G���c��z���=Z[�W���T�[�Ϛv�b��w�v��M�9��v��^x{��m���1�Yˤ�������m�oowkso"�x�r0n�
�PG���:!8�FQi�E�$��5�[���skҜySR�J�Ik�k�]��W��0x�W�f�Ꮗ�M����7���)ey4Pɡ��/_P>W�f{������RL�‰!P�Q}����T!�ti��5i�Tp���e(��D����M3�2�5<�HF�t�T�8*r�$&ܮ�S��H���I���f�Edu?2� ��G�G� �+�+Q���*U�ʝH6�	��I�5N��iԍH�BJI�N�a#�?�f�4T�q���wE�� �ۏΙ��c�}j�� |��v������ۙz0?�-C!�9���}�:��@1�kU��#7�'��ꀓ9��-Z�Bf��~�!`:���>q�L
ņ�?\������]a�&x��~���o_m����eo����+�i������N�����OƂ�
̿����[�7�8�O�t���w������
?�#��S�ό�����)�/"�5=��N�s�K{���?�#oI��	i1��5!�/§��.�š$�ܗ��QLǟ��w+
[xGĖ�]V�Q4��h�+�`�m�!�Y����$B��h�n.�b�|-���3�S�־��[G&���7���<)��6W���n�C�����w�^,�Z���e��䕺0�&�>ˠ�
(��
�?����S�\~�/>�xs�ΆX�u��#&q��T��Iɳ;W?h����Ƿp(��/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5�/��g��3�5F�^�4+2[EsG34r�#�%����k�2�İڤ����� 2���-a���� U\�2�$�g8<� z��~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�~��<,��&o�F�g�P����F�x$vY�v	��L
�.X�N)�=�Ԥ3�׿�������[S�_��eSu��=;)��g�:s��*%��އރ�����3�}h[�_�L��[ӿ��t�9o�מ��We/���?C)�(�Ȟ�\�@P@P@�7�5!�����s��	U��~�h���8���>���?����Ip���yG��/�.g�Z�1��~Ü����?]O����:y>Q�Nx���h����cw��׎u<�����m���9�=�b�o�av����?Z�j#b8�Q�w�NRM�-[؆����d>$�,<
�G�x��iS�5�֨��\��o��u4Q�䏛����5��#���JZ��b�A���k�&�'��j���t�U^��?i$�G�t��h����i�����=Vh|,�
�Ko.��k��c,l����
��t7@��8�e��.�(b9׆Ѧ��mnݮ��ћS�,e8�Jp�+�7��e��X�v�N�ɂD�<~]�A���p�X�E
��Qc\;�c�nR�������)EF
��vW���|W��2x�[���Y������Aجw�6q�`�"��%��e�Rkf�v��L��*Z.-�y������~.�<O���\Iqqqa<�Ǚd}��x!��I'�F2@���iT��J��N�տᏗ�)��]�w��~��2?�~"���Ua�_]k	�Quo��Mq$�F����1&r�M��¡c�A݆�>v�,G��(^�i�t\˧2�שUh�C�O���N}S�ߕ��-���oƺ��7����'�<Ek��~'D��5�a�����G\��Cm,lʋp�!𧻓�8V�ʕ8V�pu,%9;(s$�f�����y�ll�jt+­GM��r�b��M�Ǖ9&������fms�Z�w>T�=������̌���qB̬���WdW5(b��CS��R��jӔzlԢ��^������fkBQ�N�T��>�gti�;����}���(�yt<9��H{���Ǹ�]:O�������"Z�^K�}c���y�����i�~Q�BX�6"��f�d�S�^>�F��v�R�z.�Z���,����t��')��J)^-Tnpz4��}5n�<����O���>����wS�y�i����þ/ҭ%��.��G�4�J�b)w<��G ��䙏צ믬`�N.�"����E�_����i�\�|�?�f�![
�CCݭ��^�R�T��M�e����H?��j����^��%P����6�Ӭ�7����d�泗�C��4,@�UQ+���wLjr7��Zx�,cR���J.R�NKY8��'&ڗ��l�x�2��g�9TQ�������	(���*�9sZ�J�^�C�9�1Ȏ����.�F^YN
��Ad�_�N�9ө
���8IZQ�]��������Q�c8�(�)E�SM]4���#'L���J�Q�I�����8���P�3�J���'�Wvs�ߨ��"�6�-+�$�����T@���G��l\�r˃����f�3U�N.NA�1G3TJ&�������*�9$�C��G<��I
�W�A�4]�V'�3�\��}:
.���#�'���%��	�������nO_k���o���/Ɵ�!��_��v'ޕ�~.Pe��0�=R�������J����n����kY�4(|O��D�
H~��n|�~�ш�-<�9�v�1��B�s�3@n4�2��KK�>�kimZ�H$���k7GF�*SAI|�6a�ɠ�x3¾�Η�_�:
�\��e����y$I��a�Z{��8���[��Q�(M@P@��7����Ҹ(FiVe��+o+ԬjX���PY�'Uu��
�2��}�Xdn��8��s@�5O������?��n��>���'�#�����i��R�<�S�}m?�*O�1@��ϭ��I���y������T��b�7T��[O�
���P����i��R�<�S�}m?�*O�1@��ϭ��I��(�uO������?��n��>���'����?������y������T��b�7T��[O�
�����5O������?��n��>���'����?������z<�S�}m?�*O�1@��ϭ��I��(>�y��hR)$Hw�p�:��,#B���
�0*�q��@�d	k2�\:��,EH��O�K/��'�]�?�,�礟�
u��h�Բ����5���R�zI���_�f��K/��'�]�?�,�礟�
u��h�Բ����5���R�zI���_�f��K/��'�]�?�,�礟�
u��h�Բ����5���R�zI���_�f��K/��'�]�?�,�礟�
u��h�Բ����5���R�zI���_�f��K/��'�]�?�,�礟�
u��h�Բ����5���R�zI���_�f����� ��v��0Y�wI�X�<�4z�9={�?�?��m��ӊ֟�/S*��Fii�A�8<���$p8��k�C�##�0}���O����e��������ߗ�vS�+ך��1����ҫ��
(��
(��
�x�i����e��kh?�$�y���K�H��%�_�M����Uf�@}��yҾS��8�H�m��FH�N�n�3UH�*hC,�̼��?
w�V����y�\�
2rH���UܔRrri$��oD�][3��M�M��V[�}���G�?|��%����>�g�\�hm�X|�tx/�y)$Y ����8?��9^
�m���kR�TI����J<�I^���^g�\CŸ��,�(r�B3t�V�juZ����zS����c|o���
�2��i�<1j��hZ<Vz~��|�"F��YY$���ag������R��og����J1VVK{+�L�HC��~�z���ov��޺8iZB�jt�Lv�`�J@�Q���#���~a�g�e5��Z��9ը��7��E:Q��Y(�$���������㴒ɼۆ�ܤ��P͔T���(�3�[�pY�1�7��z]����嶶���{*�E��dv�}�[�͉D@ 9�0=��a�B�\mj���᭡˘F��ז�=?.�Ξ9�0��,������89@Frt����*�]6��:o���M_D����rf�����^Ŋ��P�q�a�X��b���z?_�&��{-��^��g�f��S��u��C��-�'�t?�:�n�ɦ�j%їP�����}�Nh���i�T��իIG-��+��)��K��)u���|-ߩ8�=b#���1�������T**Rknh9=[W��R_>���+ҡ&�OӬ��!E%�R("��e�{O����I5��d*��4�J��R֤RK�$�����G�\9�J�y`��*g'BM�S�m�ݻY��W�s�g@���&|U�U�L�n�}�G�?�����5|C��;��j�L���d���>�N���b����Ҧ[^*T���M�=S�ҕ��qmߺ>��C0����T��f��k�R��>9��.xWş���m�K�'����wZ֍���VZ����լ�9���ݬ�os�$HT�9������[�ϲ�B�c*U�R�����V���I�kj~i��g8|U9ZtZ�^v�IOߋ�^��o�%��Ǭ~�?
�&h�,ңӼ]�O����$i�5+]�7�<�n"{��� Yxuq^_er|l5d��&o�ӊ�.�=_���<��b�x�<ӡKO�_Xԛ����>�ױ�o��"E��:��Fd�,�^Y��E\��G$��gǼ�F�u�Qj�r�6�5h�ۭ��iy��۞��4�����HakMۗ��)7�H�����A�ǭ~$�N�Y��������1��}=j��kT�n& ����֩ؒ�#�;��\��z��Mh.Yve�l����ϒ_��Cr<���Ŷ��#�y�P"A���"����A?�c�\R��
,Nri��3��.]HK��sAv�d8�랟�h>ǰ| �L���n���m_m��_�>_����)Ʃ�`b?��N�ł�
�����U-����8�O�����w������
�#�+S�|a��^� �߈nu+Sn|;�����}'�<-�	~�&��S�m}a:f�5�f'�t����Ir��j�>�7k��K�=��n��iJ��C��%ڱ��A� �6u�:���¾,C'�|E�kѭ���N�k~�iu=ݵ��6���X_A��k;����U@��
(��
((��n?�M��pP�C�</���D��c�A
������HV4i$`�n+j;�0���1M�G�W��PپɼAnu�z�R��ޓ��:=��uy�k=[U�Ǔ�&k����t��W��:ݬ���77�
���6��$��~����k��ڗ��_�^*��7��]CG���6��u-/[���G����M��lF��P�[��߲�N��\|h�&�5��9N��x�M���e��5i_�i�r.�?�cJ���X�R8aðw�X��i���H6�r�Ubn�/mm���D&�ӜE�E}D+����i"ݸ����7���|\�v��_�;�w�6ڝ�ZF�ky��;�n/�k�ex�kM.�c�����o��m.�9�����/�>(o�����[�|3���G�<7�o[�]�e5ǂ<G�Ak����Ә�J���X"k�ѭ�!�������>|$�rYEu7�'�1�����x��H�Q*�i�扬�d��F��j6��J������[�ItXλ�I���V��ׇ�O6����dj�����ivv:���I� �\��o.�i�T�͏�C����T�������'�|:��__C�Zi_dm@N5�J�->;R�f���J�����"�G���;)�'�}�)ao3��x�uV�'���ܬ3��
:�-�6ڥ�_��i�\�V��7�/�l 	��M��{�w�%ƙe�j���0��ΤM��к6��x�I�u�P�մmb��SҵM>�+�CO��.-/-.ag�{{�$Ia�7dtee$Ҡ�
(��
(��ܶ���?�(Jk�����^�3?J��}��s�ٚ��Q���$��<2MnTOr��	a�ƬZ2����)":H�����F�A#����2�<�ȃ��˨��n����6��l
��y��&�Yc�]�+��J��i��HE4SƲ�,sD�),N�F�%N�BU����pAE=�(,�*�$��I<;�@
�#���8���;LG��|�g���Vn���o-������Ke�&��m
��1�~VV��|�B(� !�A����Z(��
(��
(?R�P���h:`��_A?�~hФ3�׳��3�LX}>s�:�ح��22���f����=��gې3ۦqQ-�������\~=���3J;�Ч���[��oN�^?�d��_»i|���O��_?��OL��(��
(��
(���܏�#��C�O�[ZW�G���3�Q�i����/�&�_�\�+�m��s�Z�Wo��>�?5"l{s��Ph���Fմ��'�?C���]��8ݏ����C:?�s�V�c�^o����	cd��>�N6�%�ô��i}+��9fy�Z
X,%U)97i֍�N	uK�Eh��|g�P��Х6�U��)GxQjQ��ѷ���u߶/�u/jxwI5��̚}������RS�N���k���3�K�:�T�QM/�5��[�#��˥hrǛ����ٌ���w�~`���E��j�_�5N����%%k
�
Fv��vݪB�,����0��b�iI�pR�}���niw���{.��F1�^�I{I6��u�����VZ_�󮭧^�
����2lX-d[{��^F�̲{�/�!1�y/f���_�S�0|�Ϸ�˧̏H�5��Ⱥ����q}�z!�1S�\o�r@ϗ�O��u(5�#ʾ&�>����"��7�j7�y.��y�~Mz�ukMB�%7��M�6�M��㦩�:�Q�K���k��{Q�e���m�6�v��U��G>Y�.X�\�A5�:���V2���/�k��S��4_4[���B�I���Kx�,wD78?�q����梥�����}��vR}?����o��s��7�#k�T�>��O��:��	l��V�m6���@�򼖢�Y�ȑ���-$��0���^37�.q桁��6ҷ��\)+=M�}5�~�/ƙ��eS��_��5J+���Q�V��>�c���-��E$e$��220�����F��ti���_'����sr���Vi���~�D���ᆭ�	���o��#B7��OT`��Bȶw�|����f�`Z����)`�O������Z���rW�U��?N����g��(�^>�zJ�5��yAY;j֮��F�0>�g�Zi�X�|Z�f������E��ӯ
�UEޛoipB���UU��Ѹg<6O�U���U�z�~��={�����k�ZԒ���g����?F!Οpe@M��L�}��U��8<�9��Ղ������v<Z%M(I�A�������M�+�����A� ��A�W��OUf��Ѯ��S]N-���j�=�k�~V>V������m{�6�k;�yot����g��w.�<J���P6N?����i���8Vnx�%5�KYJ�(���T�]b����U	R�3��:v�D��RIBo��˶���X��9�D;J�2�U��AA���W䎜�JP�Bi��i�I�i٧�4�У58�BJQj���?4���2t���ۥR��8�W��y��Ɓ#==>�h���I��A��#�8��(W"�I��U��sL��Ey���[��g�d}i=��g��N~&i��;W��7����^(��63�L��8�I�G���蟠5�~&Pe��nqן��z��3gi��H�������ן��ZO�C�~��X���#�v�}�KXMcď�x|��
ͯ�:7���@�l^��Լ=i��7Y���/.�m�����H����]�q�����,u��^j�݈��[\�5
H���.�`�{sy%ű���v�,䷄� ��9-�(�={���+��ߎu;�/5�����QX�m`��д�<�����^^����5mR�
�l���P@P@G�Cq��*o�+��-j��{�^�?�%��&��D?��?�Pd|��~�߳����Ø�n�Os�>��ͭ��X�?5�k�;��M�S}>��w�
Җ�e�dҬ��
-m,�A�A|�����5�}7��|(�i~�?��gž�'�,u�1��R;?�=��WLPE�]�����R�y��~��o��^�O�o�2���
ݷ��Gy��zG��."��o�[�WQ��|/���妥{yizѵ�����X��e��y��3Ė�n�ͦ�
|E��>���:Sh�Ιy<�#�v��l��cʒ)��?�a$�o��<?�|-�w�|�r�_�W�
��ZG�5h׉�Ϫ�D0K�xsU�e�t
F+�d��u�.m_I��TM.���\���8Y�߳�ζ�����ͥ��Z�~'��h
�������O����`�����;ãO��Af�z����M��'��M/V���=Q�е�N���յ�kc��2��ˣ���j~w�,�|=��h��7�-y5�\C46��/�+�6���o�~#��?�l>�r/�lI�J�<c������ڍ�x��]F3��˨$��}5�Ŭ�=��#�_�N��x��9��I��67�^�mc��6�Z]��m<_5���fx����E-�Mu7�:z�
=m�`����N��_�Z?�.��/]д�
j�Xx�\��P�4+���&�Q�����TK_���jV�sjQ�2�_]—4�O�	��)���g����Oxr���`��;��@Ӣ��?+N��#:&���\=��g���{��p����V��Z��a��+xT��b�8Ա�$"��rz���
(��
(�
7�r�����)���{��z��+�A����fjop?*o?c��B����
|Q��;��8���'�F��x��7⯉l��;m.-_�/��3�|G�-�)�x�� M�0��a���2��&��xj����?�����
���|I��	_P�,t���K�iw:��>�����k���n�,���o�Q!�d�~�1'��J��e|K�#��'Լw��^�P����@o|wjN,_�o�~&iQxMz�������n��\z��d�A��X��/�����M_�g�Z�����#N�#�>���Ts�SA�t���մ�/Q�,5r�]�˹���j�:��|4���k�F�k��_
�i���é$��Lڞ���C|�Z��x��?
�ay��i��G�!�����|5�j6w���������x�ú�Ľ;��<_��:Uܞ?�?�����G_��m��Q�C4�����[d�)d1�0���(��`�ׄ4Ko�Rjw�n"O
jq����M���O��v�o�$��_x��7���e�@��o�۔񄒝R�����Nj�_�1���
�<_�
��>�����]��'����\/ù<v��=��&�g�&
iś��בew��~���C[��?j��Mw3iz�|@֭#ֵ�?�t�	kh�V��I�}?����/�f�Z�</�ti���t�Kg8�?�'�O|"�?�x�~"��g��k�}��C�x��^-��m�u���+���_����#��%��X�A�skT��P@P@P
K�=��m�zS]}�U���!����փ��?�]�⶧�TeSu��-7��@On�\�c�2���}��m�����|g�%�������[�oO����n������K�u��S|Q�����3ҫ��
(��
(��
�v�i�E�YS�<[8?Cog_�\o��g���/�"�	�7��$�ki��ǡj�?�'ѧ�/�˪�q�׭��敲�o=y����N�К���M���.ϗke��!�����N�09~/1�>��NRI�E�޲��$���ˌ�a�TeSV�N�RI��Q[�ݒK]O���VM;�π�m{)��O�v�H'�Ӎ��Y}�y������_Й�KC	���	BU'֤�״��n�V���o�����V�{֌�N?��B?$��O�/�=���zΨe{�9S�nd��ԇ�-��T)���=�W�q���2�F�����(Ei	꟟����6�JQN���Y�w	�r�7�/��{��
E�r	�X�����c-���$o�1־T$�u�~��ƴ�u�z|ϝ5���>�TҬ(�	_�o$���ԏz�Xj��ƍ
S�Rnф"ܛ�D����F�Z��8+�r|�|��w���~*�lu�o��u?��Y�Cw�i�v�^�>#���x�eu'2HѬ<��fC��LTc_8�G��+����7��n�}4>5�Td��i�[r��7�J6�QM^_5c�^���(�Ŀ���
��9u/h���2l��h
2s����~���|�/��N�Rժm�OEw'����|>#>���:��Jo�u-��$��c����kW�����h�kk�<[��om-����g;]͝�ҽo��s�{���,R��U#I�F[]j��vм6q��Ԍ�J�J�����gg���{����N���kZ���4��@�����Ԣ���"��IPG#���`�e�q_�p�//����>ʥ4\��7�c�g1��ma�ɻ���
��������6�f�Ao�Oy^7��{&Y�[Ka��I�Hzr@
g<��'���2�Jq�lSX���2J�_�U�rg�<S���4��.j8T��u�����ޓ��G�E���8�߷=�_L|���>$�;�ůx���4��;�]6}6��tY��W6���I�;�i�
�F�+*�)�)ʕX�Ӛ����]��F�k��ԍj3p�x�~O�{5��<'�?��t/i0�:W���M@Qeao��L��D����8(B�,!�.�*�|�8j�r�R�G�:�����>fu!D���z��֭�����RyZ�C�0��9������9�zzVi�{�߭�n�5��j>�{����I�='�z%ֱ�_Z�u����r�6�D�Yd!Q���RO�Z��FUk���>yͥ�{�{l5lehS�	T�-#'''��[��[�^G��#���g��w�]�:��N!���L�{m>�c���������^9Hc��?3�8ԥU�Z,v��+%Q'���韬�\;��J��ESiK�x����gf�7m��lч�	o�d�%���@����Myæ���}	���%:U�p��"���ʜ��%$���>֍|��"�)O�F#8��{�-���ž����oM�<���(��3
�i'f��k�{S�w��_��z���D&������{yE<g��:R�{5�|ɝ*�ݪBQ{٦��[#~�2}ܰ�?��Ό�����Z|�f��������!�J\̖��{�qϥ�C����sy�G#���֎a�dSr2~���.},3�?g�	���.8������]��9���
�`��2ϓ�o�'������~���I��P@z����>�Q��ߩ���ä��[��7^V���P�����X�5ͺL��<+<�1�Ҡ��2v�[{`s�4=!!Af 	$�$�xI=( �� �8 ����
(��
�?����S�\kP�����/@=�~���	ͧ�s�y�O��1���	l��u?�_��<M�|;�<M
���4���}5��q�5{�fE�}�N>��PRm/n�����f�X�/�a�E�ޥ��BV_�Z���Oe*�(��iR޴FK[��+o嗏a�����=ɠG;x
��m?^�-����d�ѯ|1�	�9l�H��)��}�����O�Y�W�<q�Bk��m}�e���5��Zw����&��Q��-��{�w/gk�'�]���/���;�$�|�A'��7�Q�k�>�WMKV����|$��Z���],ΣB�`�j?�i�+;ԋ��^j?`��ͬ��m�.3�&v�CZ�l�]3=���ʊs��ÿ~=�xs^�_�xl5�&oZ��-.�MD^X�>��Z�M=�1�0���
�N�|w�\���=a��?h�c��H�O=��Zm��i-��6�㰱�V���)-�K�+	�y����@6t~����i�{ai�A�x~	%�K�[���MB��CŲ4J����`y@����~��2�C�?Ǹ5�,�%�)��m٨��.�"v7�d6�K���w��$�kY%�'U��o~�zލ�i�DŽ&�5H�	4�nkڡ�ǖ{���PA;xF}Ny�Ob�6�[n��
M?�5����_	A��=���� �V�庖�)���hmlct���_g70-���x����
3W�%��{?�tM9�)��M
��b�uߴ�,��I�(��eq,r^�ܓ�v2�m��jk��C\��m!������tJ�m:�S��Q��RӠK��.`��4�y4	�2����q�+�ёX�N~��<L���(���$7�q��)��g���ʑ�x���DH� |M���Oþ'�}#�i�_�%kF�m��Ь#�N�ѭn ���P�6���x��xu{����$`����vV�-���wWz���-���B+�t�t���/����,���q�_YĨw9P
�x���u{ìx
/I��q�L��k⨡�^��n+�MNE��[��MH�x�.Z5����J��1�|7�7�Z��Z����ז��k�q��c�Ȃ��f�o�e�����a�<�w�
���_Q�G��/�>�H�_��S妊�L�tm:�]O�D���ꚽ�XY�i��%�[>������g��	Mu��|�Ԇg�_�����3S{���!���xDix�k�"�X�|W��xme���
����SGt�I<����cu{iq*�+k:HʥY�i_�3��Z��u�i���M�֕��SyS���p��m�l[�2�Ȩe�,�Q���_�v��x��P�g���0ּ�'P����A��iz�����Y�e��H�}��ϖ�P���>\�z~����z�����ĴmQ�0�F3<�O%ݼQ��֠��m��

Fs@����uK��5���b����Ok?j��o�-6+kV̾�r��&�`�!4�>�k檇��u/ګඏ��z��uGJ�������:���k Y!��*���J0$߇�i���&}B�M�o�L��zq�5_����$�)k�-7�My��<V��H�$	�����7��^��Q��u)�m4��
a��֝{-�ݵ�̵����*l���,�R	̹����I7����cw�W¾!�㰲�h.o&�[%ŭ�3��Kgt�O��t~ ������^.�}��Ab��\ߧ����9[Ju�T	}���gH��F�ʲ,��q��W|+�ck2��ν���_G��Ե]C�/7Iso�چ���b�1�3@��(��i���5�M^m1u���-��Z���6�d-t��[�}yo
���Ia�I�+���{v�P��4����U�j�j-�i�E��\ɤ�_�,]�m
F�|7�*�D֖�_�T�I�dP������F��|Iygq*�=�̶ϣY�K}��k��ڛ{�S̰��d�Ժ;i���.�`�M�o�ܿ�H5�c�H����Se�7�'a��b�P��:=C㷇4�j2iz��CA�ѦּT��e.���"�m�B/��y�iZ��4���,��I*�Z]G��~:|<�v���k�U�[�!恫��� үu�[���H`�i��:���J�n#��A�h����>����-{�q����Km��(.�8ڋ_��ky-�-�����%��Y&���me�Po�<�Ÿ�o���u���t�Mgub�w���w2�D!�l`r��������_6��=)������~��O^���<���?���ⵧ����2��/Fji�������G��	��[/_��[��8�N?=}���~���S����u�;��ӫg���]t��[���e�C��D��:�
(��
(��?�چ}��������q����������2��å����\'�$�Q�`��Ҧp7_�\�t�������|�>�*�GCeos|�]�O3�(�n}I��)�sj���Jؚ�v�8>X�Σ� ��$r�,[JU���XzqW�也�`�9?(�ľ"����C�:�6���V�&����۲2\G"!�"F�+�����>��F;�D�[�w��^���8�0�����~k�����Jt8�WO��u��6��e9tNw�_��8_��	��.�o	I$ooa�]]�N��5�p�,[��qr���08*?SʰT08H�ѧ�ԷZեz�w�w���>QT�b��Vc����k���8'ҝ8rӊ^QV�O��}A���`�*:���9�}k94�o[����������^7�������\\G���{X�
zf��
>Qmo��6��[��9�?������:�O�UQM��z��k��oo$z�9��_�W�N|�q���`��%�}n��rMg����-k%�1�"�W�����a^-��5�>c�xcc��x&S�X��JX��{sl�Z]-m[�]����[���ѵz׷��8�w}n�O�3<M�b�M�)�	[T�
��U'  �O���m\��~��p�]�AG��j5��w�I�Me+�����ϱ����՗����i��M�m��n�?�c�wC��rry8���ke�3���[�s������>�-c�_�4?[�X�o�ivZ�1����+ȥU����+)�%��5R�^��߁w�?<
��O�t?
�y�Mu��[i��K�!y"��4fC4�I^�z���4����mF�I��������c��5����6��<A��6�=GU;+Co2��N?��x��K�WQj<��$�՗�����

ŵ6�bӳM�_O#�^�8,�`��qAp�
���UGEPv��ME��>a��mݷv���6-n0�q�?^��(�C18�����u[h�-w�D�W�8=���q�ֵ�.W�ؙAIy�ϓqn�0ʎ�t9����t��o��;�ΔַӠۢ�e�YyUFb9�3��5P�M$��XRJ���c��#�{�i
%񟉼+��^u�M:��χ%�
%�5��s���$e��Q�C%����@�N{�xl�a^�z2ޜ�ԟ���9��T�n�<��KS�c��\9����غ2�jB�#�Z7�
.�6~��X�f~|_����4���I���]V���:�h�8�ֳ᫨�]��{%��ך#¬��Ԗ;q#���`��噇V�)sA�KOkJ�5ݫ�W��.�?r��,͔VJ�wnl=iEM;]����f���+��kFmZ][�M*��D��+��0@�) ���n3�3�|�n�N2Qm�]��~'��3�iMGu������
�"x�:m����hA��[�	 `��(T19��+��_V���R[�������"R�5	���]7������lth�h"�(�(�썔�l#h�B������{�;�M�ɮ�__��3�����{�gh�@�\[��*��n8����k�\?����7r�[l��jh���I�^�+�3���Xg$�����yU��]�뽺|��t�腟*���}9Ϭci-{�L��"?0�x~�c7���;�1��_�����(�$���~���	��l�Oϧ�Q��U�ߎ����������
4��7X�?��^��Q���\g��g�q�����������?C+�$�L(��co�
��3gi�#��%���?´���_���?C�+S�ό�u�O�>�f��mCV�%����z߉<
q�9�Is ��܉��\���M��w���^]j�&]6@4����D�o�A��-a���.�M�_]&{����"k{	�������n�˭[N�I����~���Ҵx>:k��x��S�M_�^"�y�+��O7��,���B�ln�D����K+�è���/6��i�>��6��D��n'�4};N�t,���E�(b��2�N&�7���
(���!���7���@����K���َV�,���U�
E��,�R3&���R�nwml`��G��"���,@o��^A.���\j�����ơd�OQf�~�i,ֿ�p][C&�a`mu{(g!:�|`���Yhz���;k�rڜz��Եk�_���T{+�Δ�V��et/>ύH�y'�V���?��uxW�6>+�_����[�v1j��x�S�L�wS��H����5[V1j�%֡q5�ŕ�`�?��ƫ��1��i������_���_h��"9%��=;S��-Sto)��<�왠�&(��w��N].(�x��cZ��l��u��v��Ԙ�:��?O
�����>�iu4�O�[�j���P�����~�!����o��Y�=旫x�};K��t�W��e͎�*^,K-�Q^^-��Yn�V A��|o�g*��N���i�\�a.��i�&��J��/<?yqm�h>���z�vM���Ɠ�z4��J4mf���>��x���z���W�v6חfi>�֟ያ��kkan�ma�ɤ��kY-�R�ֿ�'����/�k�\�[���\�vW�Vz��KmxkQ�bk+h.'7J�y�L*��<Aq�h^"��nt�_M���G�gk�:[��G������HY�l�o	%I1�J����
(��
(�
7�r�����)���{��z��+�A����fjop<3�%��4mM�<Ce�i5�n�}F[i|1ew{�]蚞��\�2>�Ѽ�n��]�ά�������7��_˧Xh��g��]B�N�
KzmՌf�X���o�ݤh�9C5¯��a�=�?���z�������{3�6�XjW&�������_ٲMGH����y������� }�g_˪]çxN
G—3%��&��/-	�e�b	�Vط�43Le�h>�_��x����n&��J��O�^����`�8�cj֋u)�TG���]���i�Y�k�2�x�H��寀W���4~�^;����w}9�\�!��X��k]x��p�/|Y�ܟ�:]ֆ��^0������K�5+kmRH�ն�It���Dd�ʚ(��"T�!���e�M:��2�[Gi��W7��]@�t��(�e��,�$��xM��a��N�^�֙�	5��<	7�t�d���=k��X�v�w'�tiپ�["9v��f���uk�O�70]}�U�oɪ^�<B0���OF�ڹ;fq�����n�д�i-�K�K�l�z��qo�Y]=��`��>)XJֶl����Hf@=���ӿ��M�,N�Ǭ5����^��H�#
���I^;�5]��A��|*²x#�.���n�������E�,F�eiif������*X���%�_K�t�ԙ�Q{
K�k��"�^���f�b�I��+/DP)?���2�����fds�z5�윣}�r��6����@g����������K��}J��4�EU���i-�gl��om�aUU�g�Oi�e��w�����mt
*q%ŽŜ�8��D�5��լ�&�%���LSH���
��"�|�&�>�	��VH�ؒ�"3 �����t�>�[]E�t;i�7[�u������8a�� ]����
z��Ǻ�ͯ��Jk����4_�3�׿���%�}�����mOᗩ��^���q�BH����;���D��yؒ��Y�z��3�}�Ij�Ч�8�s��8c�^�j��V��5Lg�C��E~g�W	�P@P@���:e���M�`���k����v"5$-�2Y��r@濘8�#�3�2�(e�:ت�^�~�>�W%5yI�).���r<����S[������{�վi;F+Vݺ#�G��̞+�K�Ń��f�N3�I!y�I�g�c�>�)��/��
�G�U����Wu��+'g%��n���|�c�x�b�<���wK�J2�ۚ��O[_����>3\��Ic��h7 h�5�)�
&>BFr<�<W�GCAa��-��\���$�9N�o���<%lMU���j�+7����ow�����s`�%�θ��[��y��yKs�I'�a�W��NRnm�ɻ���wS�,y"������Y�����g���סR:���䷳k����Ĵ����9+ˉ���,z�?ƱZ�~���<~.�g�W
�+�k�v��څ��0��!�B��q�^�Q]Q���gN�Q����4��y��':�7�V���}5kO/��w^��W�4�bD���EP��|����B3�p��8���#�R^��N��;���~�y��-�[�es��{z��5�oNZ[���7�^�s����v�g���m3PҴ���66r\����՜�n�'�(��۪�*��/��m�htF�V��׫>�����&�>�o/���<3
*z*߿�x�3N�m���H�U���n$i"�8��'%�� �m�C"a3�%p0h�����V��W~~����b��-��=[��:]�����:�5���GwR��n���=�dG,�9Yo����勗Yu�^.��ikd����T��8�0H۰=��_���I�'����(��.�!�m��0����
��YwF$N�
��A�_k����EY�v{>�;����r�\�Fr>h�F�eXO�	��[�ݿ"N�X��N���dI'@�;OC�W,��$tR���%̓����SR�KF���V���{F� ��ʼ�8q� F3�H\|��^��N�\�;-�k�y�*m�n��m?�_��N�t�,5�;}KN��˺���9���9U��<��S�8�Y���Y5�~���J��)FkiE�Kѫl9_�T��������/x�R��o5�Ɲ�	���<�k��Ԅ�m�K@Q&�q�9�G,E	}F��M9�>���=�5�=�R�R����A��/K.}���[��<?�l��^5��^,���t�LCO�W�u9�$d�X�UfP���ܘ�����^Τ+S����_}��c�Ѭ���W�IG�{ꕿ[�D����x�����b������2�V	�rs��5��/	<��n�2M�k��\q	-9�ۏW�w?`�/�5$��um�B6�s�v9�޴�R2I]^�u��G���(K��m��{F���y9 08��֞�J�jҽ�X�󍕟����d�o#��22NF�'�+��`iM=�[��^އ�B�6���������s��,�)#$d
���:�nP�{%��Qmw�"���W�3��\�G�^�My
i[��<���ҧ���[����~��=��zqף'ٯ?�y�x���V���
%iT6�`�y�t�I��=��sb~)i`�����/�O���xo�%N��q��bG����؏������?E��8�4(��C�[�©n��S���QiG��]�����_���?C�+P��
(��
(��2�����T�WZ�?����.�K�fM�����Ȗ�
���H���,�R�h�E��yn�Y3�i�@�@yy����g�姛���f7�g8��	@��tPq�;����͑���EO2W9yh�s�;e��I�	(��
(��
(��
��-���J���'�����ҿ�k�\��f���u?�?��J}_S�^�w���\�Ku+��w7��%q8�]��2F�Q�����@-����6~,�񅖑-����������=&�J���,7�'6r���ղ����~�_
tMF�U�����젱�G���X����Lvі�1y��62O"H^��󌒸�����j���P��Yuk��^�S�:IzRX㙖@%��7�f� ���)�u
E���WS�W�n�M�z��u���D�;��p�O�"�+���
�����6��M�f�a����Jݦ�n�1�-��I/��)�jM�?��j����5��Ե��[u�ޱ�}�%֣(1��Q�j7V\�_)���#G	�߅v��m�2ݞ�/��,�K��L��r8hK$HC��s@����B��ך�VZKc���y�嶚�B�&�W�G?i�΂��`�e��m�	���1xCO�+n�\���$0�����63@�
�Ul�I���򦬎I�n5�>�J�H
1
ڝ�Զ�leM���@��Z�ekogl�]��1����E
�M�K��e�'�@(��
(��
��Ǻ�ͯ��Jk����4_�3�׿�Ӿ`���#ߚڟ�Q�O�z3ON=����>�ڦ[
~�u��#�����Ҏ�=�.�Czw�|Q׿~ývR�+ך����(�Ȟ�\@P@P@P�+�a�G�����/�R���PJ��7���hY�@A�
˂0A,8���c�R�Z�g��3u(T�Q��uf���ѽ�S���R�*��O�({i�p��(="��-V��S�V=@\���%1��]��~b����'��^���m����~���IE-:/�e��#���u�JD��H�c-#ɷq�y +���p�*����[V���{���l"��+�!����H8RYB/ �b(<wɭ���X�n]�y_Տ�|SټC�Z���à•zƢ�Z�);ݭKI��w������^k�3�j)�h��e��;���FA^�����J/]$��V"��]���V?��9��W�[�cq�h�|I(��v��G��A�H�ge_���JP�{����u����)h��n���r�n�;~e`x��A�+Rӵ��3��
2A��R�l�F�vo"�[�u/�i��t��9g�ˊgf��X��MsUѥ��_��OT��ȿx[�~"���Y|e񾓤ߛ���m��������Fv��I���yT��-/a��sO���{�	��0��㦖��>�o�</��GD�c���WW�]�Α�i�d��.`��6�#	'1�V��+$�.*�K����DNn�n�/^��#���>�io��Q��
�((�b����o��ܝ��C��`�>�i�u$�;�?�M 6|�E�8��
�e������Z�'�f����?í_�qpe]��akh���	���/�4N�u�+5
�qm;$��E�YX��מSj-]�U��Y��<����u�G�mJ��U�%�5X�����f��H��|�bv�5Ś��E��줜I?�^����|��){h5([�_̿�����W��Z��4#qX020%��X��G5�s'�I���z�zR]i�ݱ�d�T�@� ��O*��eX
=b�Z=�^D8�׹��x��M��]���?���[Y��Ϧ�-�)���$�H���
�^Nm[?�Ur�e%8/{
��Jp��j�
q{������Gêj�y��*S�j��R�}�{Of��1Z}�π~)��R�~�}����	֭�X`k�>x�d^M�p�~R�!Ǚm4j�+�)����eC8�pʤd�)RUh9E/�>�U��j����aN��7�*�4T�B���r”������?j?�$/��&����	�������U�S�����t����yf�L~�61I��8b��q�q�[���<"'.hէ4ܖ�F-X��fa��Ntq��r����-�k��R�F��/�%����/x��扫ϣ\��-�����"��9n⸒4*@�;XU����m|a��Jt(����)E����h�o՟�`�N�kV�u������i�W�z��4�_–��$�E�3��"����$�,ppI95��E%v�����غt*^Ѿ��vV���[~�I���	YU�o@Fa�_�׬�ɫ]m�Fx�'u}tב���rT�I''�=�i҇;m�?�'-wM�e��덄+!6��񃌃���,,yu����6jzOEE����f���7>LG;�:�9�2}0:חSBM�SOM:����Gڋrw[�_��M�����)�3��W5��)���mv��v�+����zφ�%h.бkb��g>���Ü��U�U����������.�63��&@Dq�N�|�VT��z��Q���k�������+>��Xc-.�m?0WbB�`<�O'�52ɱ�_�7�x�]
X�,�璽�K׹쟳����=.K�X�7ZjHr3d�A��F���޾���'��j�b�V��z2KK.��q�j58�+���t�~���	��P@������;�7���bҿ����+Y�4(|O��D�
B�
(��
(��
�?����S�\�ʮ��+)VS�*��A��
J�+�(�����`��p)�������V�������%Qqr�1��y���3��*��}�|��?������J���p[�O�o����MG������.U�)��������?���oP�˶��_���Q��/� �^be[�K��j?��E�ʼ�:]������3�G��p���v�Ǚ��=G���4_��A��'�U��������T\\��S���i��=D+�/��y��]�1�_���Q�j��r����m�=/��i���U�y��]������3��*��}�ʼ�˶�����3��*��}�9W���v�Z_���Q��/�*��o����MG������.U�/�]��������T_��C����i��=D�;�/�*��*�z_���Q��/��y�M:�$I3s#Fw ���t
ټ��x�)�IRT�#4_���ܿHfM�z��)n��ʑ�#O4L�Ah��<��=��o�?�����J4�7���c��s��%y��O���������<�
����X��\���F�`�O���������<�
������\���F���S�}��.�D�O?�~��>�?�?�"Q����T��{����(���ߪϽ���Ȕi�o�?�����J4�7���c��s��%y��O���������<�
������\���F���S�}��.�D�O?�~��>�?�?�"Q����T��{����(���ߪϽ���Ȕi�o�?�����J4�7���c��s��%y�G,Z�Ȏ9R��������b�\��C��\�'%�t�C���Ԥ'�������|�+Z�L���f��zbs�~_�^��d5����Vx���nzz�t�j�"���U�����{��[�u�o��S�1�������
(��
(��
�A?nMNf��~<ZE,�x<}w�A9_�X��p��l.q������_�>�.����t����4�OR��������=�y�d��J�$����v�E�>��>�k�XľZ�Z?������ߊ��ӌU�v׳gz����_֣�QjX����?Zr���z�r��������~[�xX�����?y����uRm���ê=���Ͻp�����&��G"��"�Z��h�v���W�G��g�������3�
����eh�V�ld�a۵}�YV�_�����f4�S�+{�-��~��E|>
��^ң+�kE�����d��U$$�Y��z���H䌴K�����ᇃ�k{e�x�LMN�N�[kA#~�#��y@%�$�dVS�i_��94����~��I<�09��
�9���)(�9=�����#��7�����xoD��,��H1i�&6�S�sԒ���@?L��N��q�~���Nj�-8��_��1�g{�Á�j�:_�ǔ�7ջ��
�\E��=q��~:�3�Zj�)�����)�2��s@��|)�[��2Y�Vt]�I���zp0=�NM;�[�������-�z�#h>�|}��ZB���tL�laѡ`�'���!V��=:W��T��k�zҮ�A�]R_%��E���^1�o�~������V7:���$��>�r�����R!˱�2+5�ա�t]�O�����
�m�XՋ��{����4~�x[�0j��j]ٖ&9e�C���zy��0�ܧ��(��)�}�q�}5]V�>f�Sm5�ϣk��~�͵�Hn%M�s};��ҵ|�zh������2��o���0i�x�D��7!ڌI:����-��/nJ��+��r�gM��P�E�vJ�_x��Z��U��Y-e[��-S�;�J��Iӿ,����G�+|m�o�x��j~:�wo���j�։j��J�%%��V��4g��C��b02�l#u�r[����M%�W��c�L��0Y��k��ci;S�;+�r��{E�#��|S��������f�IN�Y8.��C�V�F|ML,�Tjqi��SO��#���R1i�/f����}�߉VW�,�\��e�gw�[���
�+m�_�C�QM���6�W;��VS�_5���rx�;U�?��t��G}{���U`-���ar�䁑��k��ւZ��}lj����ɻn�ӯ��;��4%<�_�`7c�2yu�+і*������3��e;�/�[��l�{E<@m-�u�=8���k̫R����������&�{zW649lom��\E���#�	'뚪1�;{�_K�Z�ʯ�`�]ټuK;VHĨ@9��?Q��ֺS�I�����I�$�k�\Է׭%bpH�����8�!V/g������T�R*�iܼu(I�lOq���[)��o/��0��^��z��� ��������H*?����+�^Y�$��_T���>w���+���Z?����S��@��(��C�[�����3gi�#��].���yZO�_!C�~��z%bjP@P@PQ����
��J�
FeEgbTf'UFI'�d�J�5(O+
���k++̬�����������h�я�}���o�&��������h�я�}���o�&��������h�я�}���o�&��������h�я�}���o�&��������h�я�}���o�&��������h�я�}���o�&��������h�я�}���o�&��������h�я�}���o�&��������h�я�}���o�&��������h�я�}���o�&��/"FRx�C�<�$�;N�.-�ӭ]���1�u*d�$VҼm�������@����_��M�1�ϵ���������_��M�1�ϵ���������_��M�1�ϵ���������_��M�1�ϵ���������_��M�1�ϵ���������_��M�1�ϵ���������_��M�1�ϵ���������_��M�1�ϵ���������_��M�1�ϵ���������_��M�1�ϵ�������dWK�|�Hզ��$2H�Q7�
؅PO,@�@������?�s�O�mOi���4��8=������~�2إ��:�;O�?�^q��֔w)�y]���ޝӛ�{��^@�����[�����c?���'���P@P@��~�;�~�?�b��?��.p�
�����n#O�y��o����k��9��;C���s��r3�z�1\�>�3Z��e���>��/�B:`��ЁК��=:o_����5�������z	�G[���KD|��H溆�0;��U���9�V�V���g�o���kc˵	Uaf]��ls�+�-��o����e����Gu""�#���A��f�|��ץ���z�_�nj㴎��YE��$B�O#sj�1�W����j�zk�Zo���<�uܭk5���W�c�����W�������U�I�7�<y�F�zu�MI&�k��y��r��y_��~Zx����������ye+D�+�?$��r��`ry$u�h��?�o�yV<�X�-
Y�חζ�*�Av�I�<ۃ\8ʱ�>DӔ����oo�S�I�^�c����#�߃Zb�s��pm1��{+���m99�sГ��Tc���~��8Ƥ��|��>��/K"��0����^����伙��M�*�;z�۵�__�������~�����
~ j�Q�kq!�nH6�>�����zi�ks��Zqk��+�IR=���XV��C�
$�+v�4�;NK�ِm���|ܧ���O��i^���|���M�C��Z<W_�58�}q#o\pw���n1����Vm��Z[����N�c����}��=����~�4�n�_�l�N�S�>U�H�y�����v�{[�浛`Y�u8�wQT���n��g������*\�N���{_oU��6� �d<��i�_4�ǧ�+K��KlDW6���ؗ�����뙠���XD�G�W�V�9��b���u�]��e,#�%Z��)��:s�}�[���M���~���;�)$X�3�
7(��AV�zWri���G�(��w=�Oխ�r�r��U�����] ��A9��ItzY��T�M5���ֻ���'���-5O|��]�a%̶�������甦��D�t�ۉJ��M<���=��r>k4�>�cN�ﵩ����~�գ�r>5��8lT��+(�;֢�^���h�g������6o�7�s�V����ӵv�๖�S�UP��e�n������$�������|-~�
�
�Vo�~�>��~���p�K���U�֍T�ɥ(�R����k�]o�i_����v��om��8����x�2���
�7��w��z�\��*K�rqWv��O�����;-6_��M=�;��nf]@d��v�u���=���w���m�yz���W��^�ݯ����w����
Y�y7� �<]ܻ����B�G�@�pke�x�k:�j�����y��~Κ����ܬy���K~4��ݽ��5�����v�,�o�Y2��s�u�MW
�p��N�ߧ�Ӿ��Q��J�Z����|��j�=���UOi�I��ZG��>n�ٹ�/��6:��:婐�h�ө�����gt*iV���̓�-��3��
�K�/mKT�@�1u
�U���'i\.<���R�ӻq�o��5�3$���}����z�������Φ!�>�o%Ī1
��I+��v)�~a�5���-e������!��&�-v���=�¿���F�ת��啦�w#6U\�u
�ְXڊZ�K��~���w����z����Y���x��v�cmv�K&��I�d�
��I������T��Ta$����I���1�ƖM^q��a���3����B�
˿�V��?N*��͜}���ZW�t���:��P��?O�=�5
(��
(��
((��n?�M��pP�C�</���D��d����3���f$@I$��x�[#H񇄵���мS��n����x4�oLԦ��M�?����Y�L��i�j��m���k��=#���s{ge�}�����WZ[}�x��E��h<�O:�g!"�=�H�*)'��x��:擧�"д[�zim�;[W����f��
&�����7V�X��g��@A�=��^�[�8����6���Ђh�6�+r���6c����ɶA��]���A�j�^�as��Z�����D��jZ�徟ai
��7�rCoJ9i%�G$����S���t��]CO��+�+������A$7�0<��A*2�R���C+A�T��X�e.b��l�J��pH���JuP@P@P��m�_��P��_A=�̽Hf~�� �_���57���xo[�մ��:����m���f�a}���f��֖��i��m�q^G�`�j�)��4弴�{[Y��yc���x���H!{���'a%��o�ʰ��p���"���$��p{z̸�4KI���X��cx�{{�B��I�ͅ&Y��)P�'΀�4z������IẴ��+�[�iR{{�y�e�x&��9��6Y"�6d�]��0m<c��fO���w� �9&�B��4ˍf8a8�Y4�n��#��#�P���(V����Mw]��W�n������e�6�z�r��-��˦^E���b9	��u}ec
�^�Z�@��ڬ�W[��7w�Z[���!���h�m�
�Mq,pƭ#��TP@P@P@5/��O������Mu��W��rZ�����7��5�=����^���G#�C����叩�Ċ[/R[��GQ�s��K_���n?�w���#�nG�]����ך��1������=.����
(��
(���0������]��a���s����K������������tk�� ��8#���4乑s�k�	�~�X�H������]I뮺������Q$έ���7~^��L䗭�	��?_���⛟��8V;�R��J�rU�my�yZ�R\�߯���y]̒ܔ�F;�ג��N�m����'L�)$b��݂zcӷ�>�/]��>�[��h�*ϵ��ܠ�4n�x�x��#ֻ0�ힻ��fu)�B�y=v]�~�����nj-�þv�G�pA��ꯦ�׼y[��Wk�g��(�|�ۯ�������>��|K��VZ��'hL�e��q�H�-�$WHo�qYׯRm����S\-78+�������>G�~��"�1	��(�� �+������W��j�KE{/D�u�=HQt����~�xwT��k*2�W݉����M{��S���o��A�O����1���?ɯB�~MX�n���CҴ��\�V�^���֛~�3MZ�Eq(��#v��{�d����"h�7չ�0iu�����Id�3�q�@#�TO�~�י�M�x���%Yo��#
�ʑA�����^km^�����R=��>C��
˩���������ǧ�^eey˺n���a�Tz�k�~g�~�Z�i^<��F��*�:e���N��NN5yz5��۩�d��suO���=�mc��dB���2�ʣ3��T�� �C�]y�U���(ÿ��82��W��vI�y��<C�i�|e��:��{��_�ɍ�@�X�������o`P��I˰��2͊�V�鸷u�yEywW��:�a�R.ܲ��e�ϳ�_3�_�J֭g(�B�3$�	'��\�M���@��Շ�Mz4�N�z��ߙ�T��rO���_Ug��n���'�X�4|���6s�g�*�M5�_�n�+[_�1>0��O�LxBo
|CЭ�(�nt�Is�h�$e.����K+-�*U܎�]��P���en�WO�t�֡wF�����&�G��f��5~ �Ԯ5.�?��ɦ����cV#m����i�!D�r�y�w�����[�z_����f��(�\L�[���t�����<C�-؊��KpH�#�F�Ap�r�O~}�Z�&�|�JIK��o��Fp�qus�Uv�������>e�fy��#�W:3�����I�xSS����X��	sg%Ŵ�}��1h/ h%	"d����J2|э��M]y=-��r��nw������s�F���>����?�����n�#�4�ڟ�u���
x���[KYg�eݧ���\E0+�y�G%��tr\�q|�jE���eu/�]7>�(���qp�:�jRMF�h��쮽�t�_��������]C�uM&�Sҡ�{OiP�ZE<�|�#����B��ےy�ʸ�6�
��_V�+B\��R~�uN��}^O�j3Q�D��=W*^�����	�@�[�b��2x��v���K�Y
�B(���'{�<9�E�2��?��.XB��Q���ou��*��׳"�]��+�<�_j:�y�u������:�Mk%���ĮגC���hߡ_q�^�L9�ɦ��G�^����W���k�>��_�;�:�u��:��l�H;�#@�^Ul�Gʴ��׽����c�V������s����H��?�׃�%-�i�<!�ˣ1��nn2�\�^�
`�P�)MŨ�B�{�v>{�14�dU�&�|3�]*��z���~�~>P^�p���ҩn��_S�����J����n��'�/���O�=�5
(��
(��
((��n?�M��pP�C�</���D��ds@n��mU�5̓��rB��a��Kg�x������m�����{���$Z7Ļ$�
��5
E5��?���4�h�,~�.�x-l.�[�j��O���ZTs3��"�y���S�p��,�|;��i�H�ޛ7V_O��MFo^��L5X�a��s�-'Hݥ�^2���	�k������a�p^�hl��>5��=�j�׷�/į�~$xwF��y~��o�?��
KpX��k6&Յ�WJ����'�aZC�kh?k��M^��5+���7w���<��Z5̥m�Y�XX�Hs�2�!���t�j3~�o����M�ާ�!�hZ����~���[��ޠ��9�/���sƿM��[h(��?���5�|'�ߍZ_ĭx�N��&����]V����m/�ֈ�xSY��kѤ+�"U_3�)�~��
���[]��K�#�ðj^���z<Pi���$�ƕ��n�.���u_
�����z&�m�� �¿���K��X��?j��%��[�;��X�53��}[j�>�-�
qk2�����5��P!��<�i�:�V�%����<M��A��I<_�ۤ���t_ �O�º��Um��G�}��-����r��|�]�o����>2�ߏ�O>��gR�=�ܳݮ���_Y[$wL�Vs�g	�cXBBa@�(��
(��
(��ܶ���?�(Jk�����^�3?J��}��s�ٚ�����;�.K���c��ox�ķФZ劦��x��߉gВ�K�n%��x�z��͙t�{�ݔ�aK]N��h߱W��o���M�/�薺����z��ƹq�K�[G�L��M���36�$2ʓ]il���7�4�?������W�F���J��6�ڭ͛����M���>�ys�U�o-ne�'�����lC�{
[*޵�Q��?`|[�|
�/|S>Լ�?N��!�u�|s������ڳ	C\�A�G=��82%�J��O��ƅ>�ce�F���
/�7��3�⵷�{?�7��e3y���P�jqi����{K����[�5��&/��{O�zƫ�K��V�V����m�����~��Z��������Ɍ�|ف��b��~�V���ޛ�M���Υ�B��/V�·���e�m�e��hSY�
�(3uic��v��c@�0��~-���G¿��⏆���U��|Q
��<I�G�Y��=���l4�b��Z�`
\BU� ̵�'�����~��������$��{��ō7����g����,�A&��;ht�˛Y�N��S��A|���h_�?�x��?��I�
i*ӼIᤗķ��I�j�w�a��դ{]6�9�F�E����
(��
(��(j_���k��Қ��'������}�̞з�?�?׏Ƶ��/Tc?��������~������>�2�
�A�ą?B9�bx���Dw���7���g�������ϥvR�o��S�2�������
(��
(��
�f�j�؇�����C�Ǟ�A}��3ľ0��|?�G�߇�Q�|��q���ԼUg�@��<��H%�rP	�lf]����R���m���WVZ��>��>��aia�ӝeF�q��������?lKd:����!w!�o���?4~+`@��Z�e����?���$o,�ݕhۿ%_�@��O؟����*~^y�0x��z��M�ַ��/�}?�
������T��G�~����e`�G})9'�*��$���R=z�3���Qo�ߤ���^a����*}��y��>?l��/D�o�S[J���ó�����9#�+e��f�=6\�4h����������_q�i��N�Ljq�w�GP��K1��rH�x��|t�?�x����K� �g���խ������=�M���j�i!w�Ex�J�^��FW�'���R��z��w��)���_X_�.��!c�|�~�Z}�k�3G.����g�8,��x�ERpF\�.2GM<�7E�{s����g���Uջ�T��>��ݚ=�֓��>�k3#!����R\t�l,��
m��K��k��c�tl��r�ݼ����X��R�LE�T꯽�~�L��_���W�Z���N�M�j���/���J�Q��,��$V�-���A��y���Kޜ�m}�[v����X����U"��+o��޿��/�<~�_��6���׬4yf�o���I��K[�ķW$1�v�Q����`�u��Pp���	/�,��Ê��n�k).�5"��B+��}g���
��k}�Eʏ�
)z�B�s�@��2V��_�y�\���ҿ]���
�(�8Y�91����p=8�sǮ+�
Q��NtZ�e�;jzn��@#��9Q����i�:�l?*��^�4�v��y�]߅|K41*�nX:�����\�I�F��j9��r��D�b�IjC*�̓�Ҟ��G2�-�2���?kV����Ӑ�h���9
�k���>�2wMw��Q�m�,�?~-�wB��e,F��
���_UP:�ʸeFwv^���CAZ�K�ݓ�>u�g�AjE������0+�xI2q��^Ny�	�q�j��������H��伹*~�7|�/|�<A�^���թ������G��1ȇ]r����]6"a'%%���ٽb+�0�)T��R拲垮��]{�c�W�W����t_
K��T�]CG����K�Bz�:W��Nt'+�춿���0�!
�h��v��M�������_>�/��.����k��
ך9�l5[� ��u�+���7V<����g^?J�'���m����C�G�/�CE������W�not��mKI:߆`�5��91\��ջ��L� ԭ��!7�$@�ш���wS
��wѵf��l=\��&�,��d�7(��Z��߃^��_�Z״}/Q��^�<�K�6���գ�E��u��.m$ �d�W8�[T ݇�G�S�)u��e��OO����T�(ӭз�5�ߣS�w���]+�^2��	4�b�$VIV����@���z���Eu���si��;y�$<Q��x�C���V�kGN��,��V�����0F 2��yV�BJP����j�My��}-���~[x��	�mo���4՜O��{%���j�"��sz��d�SHE��.^W���CC9�:1�)�iu�FO�-�����ӆ�j_�Z=mu�}�z3��Io�
�Cif�I
ޥ��m}��0�(�7�m���\`$V��j���J6��RW�U:���������C
�����<}�䯷� ��?b_��ॷ�/�_n��)����7	��o�iw�1_L���V�V�ӆ����&���U���뛒���+F[ig����<R�c]a�=Og9B�D��r(�Q�I'f��K�����;�}֍��-|%+]X�\Au����,ʭ,����Pq�޿�#�3l���eX7�T��Yƭ
\�����r��[��}�I��b��z�JN�&\˖Ҳ�	5g�#�o���#�.GGR���xt�+YN�C)� �
~j��Ӻɪ�f��Ϡ���g�r��f>��?���5-R��gzD�?�5o�l�<m�R���z]�D�ʶcL���;]9���r�=�!,�x�zUqx��O�s'��<�C�����(BO�p�Ծk�����s���
�
u���N���L�=���x���D�<������H{k���ʱ�� 	7C*��r��I{|���Z���s�z�2������O���䰓�Y�jF�Z�);y�a����	���?f��s���7|
�<��K�o�=3Q�
Ǎ�kP���^��Ҡ:w��e�����
�6G|��(�8����B�Z.P�����9F�Z3��.y�eؼ��>%T�*�����#4ۼ��*�_us��>(���o��!Uћ��u���ZW��w���ZO�^�P�����X��P@P@��7����Ҹ(֡����s��^�{0�|�;a�ɴ�v/�.���c���h��|��T�>�f��[���o��#�k�ԓO����V7���Sm�[\�d[�i��]�jpF-`Kk�P��O�;_���%�Y�w���>�-��a5����d�K�2�W���37�B#��e�}�0�?�ׂ&��5��B�K��:�Qť���>ֵ�EWR�4��n$Я�{}Jx,�}E�B��������S�^�4�B�C>�g�ޡs��Ț5��^B�&�pL�4ml$�k+	�'����"B��~�<A�éY�뱴�h���zWu�?^�;�uӦ�
�x��z.���K�lm�b��d��.�l߄�V���Ν�c�t�Y<��{Y�����X�܋fQ��ᕦ�7I�f#��:=����W���ٮ�����S�4�$�$���m��.u��?'�m��$�Ŵj��]�]�qh�Z��{�N��Kh�A������Igo�@�A���jV��.���G&�,�I,m���4r!O�\KL���j����t�J˨�wM��:#X���.��n�?�ǒt{�f���[�[I��SNp
z��k��I���/t���W�:l���5��V��h�n��D3I4om�ܷS�6ԃ�q�kz��
��k���}:
���v�
�r��K��Olu��-�+b��:��(.$��dE�r���w}���k�x��)[T{���&�K{{-:�K�a��S���/t�R�W�{	��}�<p��[�f����д]
��p�C]����]I�����6A���mUR��Yw�V��N�,��%�v�{E�'����\����?Þ/�ѼD��W�6:-͢h�Zn���V����R�S���Qyqƍ���:K��7��4_]E���x��Q���2YX��j
&XV����S��m���Q��w6�
/LԵ�V��$�
�?h���P�D�ݞ������o�u�L�kI4��f���I!T�Td��{��.l����8]?���L��ņ�����[é^}�>�t�.9&���Ishd�(,�y�f��4�������W����z�tM'�^�N�>�o�^[,�"�kmb+��1���n��
�ĺ��������;ku.�o�a|/�x�f�|ues���ۥ��V�W�:��Ƥu_������J򫏱�ˇD��x�G���=�Zݦ��Es%�Z�QAZ^��6����r����v��ug$�h��7������0
���m�_��P��_A=�̽Hf~�� �_���57��O�k��}7�~�R��W�:=ܺkZ�Rh�^�&��%�m�h��[]&�N�V�l�������MxfKO_i>��5q�B�c�i70L��Zd��ڶ�h��Eճ�y��0M�'�V?�G��G�(�M���sa�+�
=Mb��)�ӼC�7�a�awwif�.u1��ݚ�O�Ӽ�Ҁ,���u�;�u��>�}�1ᇷ�=-c��{�y.,�K�dh-�+4,�t�P9�[ҿi?jzn��6��K484�.����ڦ��5�Ic���[('���ZK.�u�Y�j>d3=DY�b^�ֿ��m�t�#Y]#(Ѭ
���!����d[K5��Vд��4M�jW�P^���x�I���ɦ��p�w��Gmu7�%Z?�-��mYu7ѓQ�ԼE�M7���+c����cK
S� 	�~�
4�c�ڭ�-���E�����m:h/o.u�}>�in-�"}�F��D�V�3g������t�K<��ڋ�ma�ܛm7Ni"����/5���6���o�_���V�[Ym..@:�~ҟ�%}�Yk�F�b�=��0�2@!Ҧ6ڤ�l��j�,nG��&�׌|�2+�|�8����qi㧱�ϋ��c�*[����U��|u�[[_�;��+L�ִ���K˃[�����):m#���οe�F�<?�M�x[A�׵=>�M��m�R&�R]J�w�mb5X�&�b�h�d��������M��z;�?I�;{;QŎ�������t���ҵh������j�Ү������m���#����4ۻ��*{���Y�k�W� �,༆������t���?ٚf��[\ۤ��y(��b�_�]���L��ѵ
r�a�M-,���mI��}e�=�����^���e�j�-������p�k/���N�≜i�귳[G�-���K�~�?�5�&�����^�;ϰEK���X2�'���g��f��xvY��A��zοi�]i�:{u�ܕ�զ��/��-!��D��ExY�G��O
��A�Km�_��ϤG��>&a��ZC{4�K�5���-���/���(�������a�/��	Zx[���SH��m"M=���!��.��5(���:ai!�g��K�2� UP
K�=��m�zS]}�U���!����և��8�����&���/Tc?���:o��p{���O_�52*=>_ש%�B�瞼�~��8�;���8�~u�<���?�9�k�����^*K↿��'�W	�P@P@P@P@P@P@P@P@P@P@P@Pe������֩n��S�����J����n��g�|��(|O��J��(��
(��
(���!���7���@����K���ي%�14�lQZ�db2qŽ��Pd|��?�Ww��/>�v�kz���V�J[[/=�X>v�-OM���u��o*��&�5t��u�vڋ#�Gv���m($�Or���F�6��6+&f ��s@¾��,+��)�I��Y[�X���9va�;i$�2~�r:��@<7�YV{mK��c�VXl��b��j�*�>R��A9&�/
�~�tM*(d��w�;d��]��2�`3@�H�b3 »���"}H��H�O�pV k����
�:P���Z
L�rC-͸���-�S����"���P�D|-�o�Gt\�\��ʹ�˅W-��K*"��
��P�|=�ۂ ���A�J|�+t̃�ćlc.Ҁǐ$pA�o�v��I�=*gr��6�X�wFr����OSҀ��7�b�t�ĩ4R��<w(��̓#�ȧ�V`F	��u�ch�Y\��M��\���vcܑ�d8��
�6�i�L-gFT�.F…p^�ݱ��G�k�φ�>֋b�.�l��R��A䩝�I�dzh�]�*��@V����I���t���⾇I�KhZԭd���<%q�9���������H��\��aro,��:���&�����"�?5>čs��$��&
��\�^9=���9�6��H�װb[�4A�����>�ߗ_i���E"�Ċ��E�AS*���J�d�&��y�M��m�y��h�ɏ;�bY[�b[9�4l���h��-�����mmC~d�,�#@���w��gvv�1$;��m�_��P��_A=�̽Hf~�� �_���57���X�i��iw�����8�uxu}����K��f:e���y,͕����`v������	�����+K1���N�vl���`k�G[����ۆ��J�3#����b���>�en-dk��->]>�Ai��.���>{���#m?Y�`�%ʑ.nm+��_�
��
OS�ĚL�xj��u�����΂9�2��!Y^P̊��z�3s��U�������[�=u���ũ�̚F�3�I[�m�Y��������,

?�o�?ߵ���A��v����.��U�ށ�ͥ���D�*��2�$P}��߀ͤ���>��ŭ��:���Ɩ"{-/Q�X�YU�-�+�\G�6W�G� �	%���JV���L����P��y/|6mjWZ|�En%�
q4v�+��Մ��h�<��5�Ɵw��F�G�����ӧ�=.(U�1B'1�!S,�Ѩ�s�J��;9�;���7:6�=Ď��4�6�J�"�Vgx�1
1�<P`�ׇ��߳�\>|����ۯ�mr�A&#��@I���+�P�xC�^�:F��[��#���vfaq��;>@$���_�Eݕ��tśO�����g����ܪD�mg��f��ousvO `��o��A��<ph�;+t)n�}��R�6�gR�
\��`��/�/x�K�ѼE�]S�u(_��cnc���q
�	��]�D�IQ�vw�oi?���1�Q��ۙ#������F�~�8���|,#1h�61�i֠4����.\d�� 	��A�&�i:w���a���]�Tv1�{K2O:����A�� 
������
M��y$M��J
�V�!�0��ʦ#���W�
���Ǻ�ͯ��Jk����4_�3���!g�\�C?��X|/����[��OM=�_q��9#���L������{q��^�zg��o��8�?�9�t�������e/���y����|�����u�tP@P@`^��A����Q�+��?*�B��c.��n��+�\EH�›q{;�_��37V�[NI5���"��&�����5�#U�G�>���H^ޗ���k�
��^��5Q�ϧ��C��oK����?�5��S�������������������c�����׿��G�q_���P����u�?��M|1�AT��k�F��8����(�A��:����&�����5�#Q�W���?� ��}���_�U?�������+�}?�
��{z_ξ�A�	��?�*��
{���}G�>���H=�/�_s� �����O����j>����O���$ޗ���k�
��^��5Q�ϧ��C��oK����?�5��S�������������������c�����׿��G�q_���P����u�?��M|1�AT��k�F��8����(�A��:����&�����5�#Q�W���?� ��}���_�U?�������+�}?�
��{z_ξ�A�	��?�*��
{���}G�>���H=�/�_s� �����O����j>����O���$ޗ���k�
��^��5Q�ϧ��C��oK����?�5��S�������������������c�����׿��G�q_���P����u�?��M|1�AT��k�F��8����(�A��:����&�����5�#Q�W���?� ��}���_�U?�������+�}?�
��{z_ξ�A�	��?�*��
{���}G�>���H=�/�_s� �����O����j>����O���$ޗ���k�
��^��5Q�ϧ��C��oK����?�5��S�������������������c�����׿��G�q_���P����u�?�:H'���E�PI�ʺ0�a�Er�.2q�jI٧�f���Z��d��P@Pe��1��!T�Fo���������w�����'�|С�?O�=�5
(��
(��
((��n?�M��pP�C�</���D��b�R��A(���8�I����Ҁ[#��
�.= �3N��Al��y5�����-s�]G��ao35�����!��('�>�;�]��M�佻}J]^}gW���Z��$�k�q5�0�hdl[�*,(��8�z�"ƉQA%�U@,ı �ORI�P@P@P@P@P��m�_��P��_A=�̽Hf~�� �_���57���sᶽz����[|5O�n���Ww�bִ�7�Z��Km�
U'�v�.>��t�Z@I{���R�Z�Y��9ﮯ.���;g��eķ
!�gh��r�ȸI�xw�v�I�+L����jgJ����R֮YuF��n�+��,+%�J�ʹXc{e��ŀ:�O��Ӭ����+�YHd3��_�V��d9h��+�%� �Ȧv�>���(���sa2xSN6�u��\���Jy���������7���k���,�p�w(���z6����Q��ok{h�%���4z�ywrMm5đOq,8���!8�T ����g��OhFMN���e�3�se��kqif�Ӽ���+�+YͺD�K4BY�Ggf��n�%ׅlnH�;�:�k��x�cI��[���o)V��iX]�0�:}����'Cҭ��e�+ �D�96�A|�W1�T�l���@P@P@CR��t���_���_A?�~h�Hg'���OO!��3�zt�};ִ�z�)�K�,��{}}>��?~�q���aXw��A�ׯ�B��S����N����9��+���[��T1����=.�N���
(��
(�b����u%�մ�y�dh� ͌n*�
�u5�O^�#%���k��Tiɶ֯{6�R���_��q��s��U���'����D_W���?����\�\��U�����.��a����������4����v{�@<5�>��?�G��'����D>�K�������������?�1?��!�z]���
ϵ���Q����h������xk�}�?�.�*��O�G��}^�g�����_��q��s��Thb�?�C��?��� ��k�������C���"W���?����\�\��U�����.��a����������4����v{�@<5�>��?�G��'����D>�K�������������?�1?��!�z]���
ϵ���Q����h������xk�}�?�.�*��O�G��}^�g�����_��q��s��Thb�?�C��?��� ��k�������C���"W���?����\�\��U�����.��a����������4����v{�@<5�>��?�G��'����D>�K�������������?�1?��!�z]���
ϵ���Q����h������xk�}�?�.�*��O�G��}^�g�����_��q��s��Thb�?�C��?��� ��k�������C���"W���?����\�\��U�����.��a����������4����v{�@<7�>��7�G��'����D>�K�����[�i6�.�`�c���W��');�M���j�I%�JȞ�a@P@f_���o^��K����Z�ť�[�?�yZO�a�?O�=�5
(��
(��
((��n?�M��pP��	�$	��"GP$B��pASV�U��T�\�!Fm�p9��;������������������������&��o��u��P�c��o��u����_��o��u����_��o��u����_�M��n���1�����@5]7������Ư��7������Ʊ��7������������|��TcX����|��tcX����|��tcX����|��tcX����|��tcX����|��tcX����|��tcX����|��t�F�3�.��C�1�6�h�:����3�b�i��
��m�شQ�Q�K�0�I�0]��b�%Ư��7������������|��TcX����|��tcW����|��tcW����|��J1�����@5�i����@5]7������Ư��7������Ʊ��7������Ư���_����_�M��n���1�{M��n���1��{M��n���1��{M��n�������������|��tcW����|��tcX����|��tcW����|��~�ǃQ�����%�_�Y��"�d�<�*��OPG"�=MZrz�~�f{y?!�=��eSu��=;�y���'�q��$5��>��z����~��Ao�)�*�?�zw#�>���+���W��T1�������
(��
(��
�s�>'�ԧ��֒Y�k��c�����2�ݜ��8�J�+N�cR�����+��RO��:Ue&�;'ӚJ�rfO�!�3���_�5��������
��ɑ�k���������~/���G�p_���U�L=�o����9����?���]W��h�����
��ɇ���?�?��C|g�A���k���-]��;��T�0�5�����A�o���?�
u_�E��/��*��&Ʒ��_���?�
������ȴ}w�@�Q�����������!�3���_�5��������?��{����s� ��7�������"�����G��c[�~/��������U��Z>����w�����a�k���������~/���G�p_���U�L=�o����9����?���]W��h�����
��ɇ���?�?��C|g�A���k���-]��;��T�0�5�����A�o���?�
u_�E��/��*��&Ʒ��_���?�
������ȴ}w�@�Q�����������!�3���_�5��������?��{����s� ��7�������"�����G��c[�~/��������U��Z>����w�����a�k���������~/���G�p_���U�L=�o����9����?���]W��h�����
��ɇ���?�?��C|g�A���k���-]��;��T�0�5�����A�o���?�
u_�E��/��*��&Ʒ��_���?�
������ȴ}w�@�Q�����������!�3���_�5��������?��{����s� ��7�������"�����G��c[�~/��������U��Z>����w�����a�k���������~/���G�p_���U�L=�o����9����?���]W��h�����
��ɇ���?�?�5tOx��R���֒kX�a[��(*@O.���H;�eq�9��ⰳ�(S��9+)rS���7�.�*��r�in����i#�+�:B�
(��
(2��7��5Ktf��u���ZW�t���u�^/ƴ���W�(|O��D�MB�
(��
(��
�?����S�\��B�+;1誠�'�I��@�+
�)�0���Q�p{d��Nޟz�~�/��?����_�j�z}���s�8���.�������~��p�Ͻ��]�-�����?���{�����T[��_����i�>���u�ƨ��޿�/�0�Ӈ�}����QoO��_��a��������ޟz�0����N�������5E�>��a_����?����_�j�z}���s�8���.�������~��p�Ͻ��]�-�����?���{�����T[��_����i�>���u�ƨ��޿�/�0�Ӈ�}����QoO��_��a��������ޟz�0����N�������5E�>��a_����?����_�j�z}���s�8���.�������~��p�Ͻ��]�-�����?���{�����T[��_�����ԭ�H�)uJ�P�isl��S#�#V8�C��?*�[��~�3WU�q�8�dBN,n��yCp�8#�ۊv��\_�8���.��������s�8���.�������~��p�Ͻ��]�-�����?���{�����T[��_����i�>���u�ƨ��޿�/�0�Ӈ�}����QoO��_��a��������ޟz�0����N�������5E�>��a_����?����_�j�z}���s�8���.�������~��p�Ͻ��]�-�����?���{�����T[��_����i�>���u�ƨ��޿�/�0�Ӈ�}����QoO��_��a��������ޟz�0����N�������5E�>��a_����?����_�j�z}���s�8���.�������~��p�Ͻ��]�-�����?���{�����T[��_����
R�tj�w�"D�-��'�#Eg1m]�@��(�$h��t4i��}��?�ŰFA���q�#V�z�O�^��ӹe?쟯@�9q�D��I/���g�����8�o�+��[�sO���k���W��T���c/���'��	�P@P@�:ߌu}3R�����hb $η�1������w��**5iFr�i=�t�w��5Jӄ�PV[7}|�2?�`k������V���?��G�j"���a�]�����������E�K����@8������?��Y������,
w��q�߻�?�����>�S��/��X���w�gP����}f��/�_��5��~�(�Ρ�?����O�_t��?�`k������Q��C������Ⱦ����������:���|�5?�}�0������?��yG�u�����j"���a�]�����������E�K����@8������?��Y������,
w��q�߻�?�����>�S��/��X���w�gP����}f��/�_��5��~�(�Ρ�?����O�_t��?�`k������Q��C������Ⱦ����������:���|�5?�}�0������?��yG�u�����j"���a�]�����������E�K����@8������?��Y������,
w��q�߻�?�����>�S��/��X���w�gP����}f��/�_��5��~�(�Ρ�?����O�_t��?�`k������Q��C������Ⱦ����������:���|�5?�}�0������?��yG�u�����j"���a�]�����������E�K����@8������?��Y������'��}KR�����P�X<��
bIL�.܀���e_F�)N5��n:�+[R�ל���}U��G�0�
(��
(�����G^�J��3gi�#��]n���yZ�����蕁�P@P@P@G�Cq��*o�+��-j��{�^�?�%����K#�q�n�H�B�"F���TI�I�����|)�nn<-�-��N-���uk�m9V)�9��#���$�llkJ�_�e����?����}��?�v��/?�[����O
͵�b[{�'���$�X匽����t3��2�1ʍ�u sw~:�e��׾(Э.-�.`���"��]��,O(t6��͕��́�u$q�H�+3�0
���fbp�Kx��J���#���|Y�kW։�\�麥���1��]�V}����J��AP[���	�:/~��On���x��V���{R��sZV}'I����A�-kn�$�VU*0쎩���ո�,mg������N�KM>p��+;��!��D����a�+y�hT���Y`��	&����6�*	"Ƭ^3"�
�C.A�'��
(��
(��(��o����҄���	�e�C3���?��������8����dI�,�$��g9 c'>����14/�{��w��gO�mc(�N���ȥ�ı�G���fs@��M6�}>�����V�:~�
���-��������Op,l/n���?�i<����[XҴ>�Vֵ-+L�����������%��fH�s��٠�ޑ�
:�W�;[K��Ogasխ�D��)bfV���?��X@y��z����ހ!�U��Z��Ʌ����m�t�I�;��
I$h�د"+0fP@&��-P@P@��Ǻ�կ��Jk����5��B��O^���OC�C��Aۜ��ꌪ|KњZi���.��8�*$5�����>��|��:��ވ�w)�_���?�;Ӈ����$���vR�*�|�1�����ǥ��P@P@�^��@Ӯ��PX�"��5���a=�����]��5�&"�T�N�{>h+��$�9V���f��O�V*�s�o�
䖣�ȕ_P�ϯ����&O�����,��?�9�?�KQ��J>����_�=?�L=�/��e�A�	υ��)��Z��"Q�W������a��?�K/��N|-�AO������b���OO��oK���Y��s�o�
䖣�Ȕ}C�>��z��{z_�������S�$��D��������������_��[����%���%P�ϯ����&ޗ�� ��������-G��(��+�}���0��%���'>����Ij?��G�1_��'��ɇ�����,��?�9�?�KQ��J>����_�=?�L=�/��e�A�	υ��)��Z��"Q�W������a��?�K/��N|-�AO������b���OO��oK���Y��s�o�
䖣�Ȕ}C�>��z��{z_�������S�$��D��������������_��[����%���%P�ϯ����&ޗ�� ��������-G��(��+�}���0��%���'>����Ij?��G�1_��'��ɇ�����,��?�9�?�KQ��J>����_�=?�L=�/��e�A�	υ��)��Z��"Q�W������a��?�K/��N|-�AO������b���OO��oK���Y��s�o�
䖣�Ȕ}C�>��z��{z_�������S�$��D��������������_��[����%���%P�ϯ����&ޗ�� ��������-G��(��+�}���0��%���'>����Ij?��G�1_��'��ɇ�����,��?�9�?�KQ��J>����_�=?�L=�/��e�A�	υ��)��Z��"Q�W������a��?�K/��N<-�AO���������OO��oK���Y��[�
�1\[Ȳ�2,�H����*� ��iFP����f�F���Mj���#
(��
(2��[~?�U-ћ�q֟�1iC�K��7^�'�/T(|O��D�MB�
(��
(��
�?����S�\kP�����/@=�Z��jZ-ޜd1
CK���q�]Z<@��y���g��@-�����)�U�,g�w�9��
��M������.4����ow&��Ce�h�:v�u�Ǩ�wz���^'�Zյ�+-�3���M��;�Qx�]�ǭ_�ֱ��~�4m]�v��[h!���Ƣ|w��+��h��	|ēkI�-��-��5�\��o�k��n-In�|3�]��Iӯ�����_�z���o�����ğ���A����p݉���Z�������~/�\�g�~&j~��T>���ݾ�-�����:g��I��n/�o��m��f��a+���NT�qq��6�"6��~��Nx�S��m&;Hn��K�[OX��[�|M�T���2�B��Z��S�;=k[���S�>���	��Vx�~�!����񅇊��<C��/�,��$���.�;X4B��wOyqt�q6��n��*��A�z/�Cⶑi���]�E�屳�U��w}w�V�S:߂���B��q��Z���x.�[�}"��?���$�����#�>*��(���N�w�χ�7�5?���-GV��-��%�����,�Ԥ���uP���c5���$Y�yg����,/5��x���v�G����j_�$м'��Z���S���j���Q�5�KP�hu/�m�{�a����KH��k�D�k�O�S_��u�^"���?� �H�$Qxb?�x��]Kö6V�af�Ҧ�u��m*���C8�=2~��
(��
(��
��-���J���'�������k�\��f������� ������(���t}WO�����F��=��υ<u
�:Ɖ�5��j���B+H�_��O��k<i���_��.~���~�^:�5E7��"�R���̖�6�ug��x�.t�����k�>�พ�%���3���'��<Uo�
g���t�z����:�ǶV�Wڏ�φ5&Օ�#L.u��x3Ğ�����4�E�izt��Ax�h��O?�	~%|-��_�(��/I�[�j^!Ь�7����^�G�A�"���:kZ�c�E��e�F7 V��	��O�.�u�_��t�N|G�&�iᛏ�:����o���WW;�h�>�v:Ə�h�e��6�����^��>��>-E�Oh�>8
KV�ﴛ�K����<1���n]R�V�=��|Yr5����Xj.��N��xbso,�p�:�	��_��֫�S��&��Y�w�t�xRk+�Z׍���O���-,�A��h�2�j�>��*�G����{Ÿ�M�h~$]SY���$x�D�_�;y⸬Z�º,�Jiwm�u	`�_���v55��xL:�ڜ���?��<�B�����/�Vk�M<n!�J��~��ue�cg�Zj���oir��o׬�濻��o�U����
��^��_���]oY�<S���]�Q7�K��W�"��T�-�!�,&�M�0��H��2�D����(��
(��
(����_6��=)������~��O^����܏zڞ��ʦ�њzw��q����=}�l5����p��~{}�JKr���������{d���j�+ך����(�Ȟ�\@P@P@P5}�R����њyNdt�h�c%cuR}I��x�E8�Bv��8���T�2�rwq��f�� ^��)�2�������"/��W��?��@�3�>R��e����_�?���/���0���?��/�]��>���u��C����W��?��@�3�>R��e����_�?���/���0���?��/�]��>���u��C����W��?��@�3�>R��e����_�?���/���0���?��/�]��>���u��C����W��?��@�3�>R��e����_�?���/���0���?��/�]��>���u��C����W��?��@�3�>R��e����_�?���/���0���?��/�]��>���u��C����W��?��@�3�>R��e����_�?���/���0���?��/�]��>���u��C����W��?��@�3�>R��e����_�?���/���0���?��/�]��>���u��C����W��?��@�3�>R��e����_�?���/���0���?��/�]��>���u��C����W��?��@�3�>R��e����_�?���/���0���?��/�]��>���u��C����W��?��@�3�>R��e����_�?���/���0���?��/�]��>���u��C����W��?��@�3�>R��e����_�?���/���0���?��/�]��>���u��C����W��?��@�3�>R��e����_�?���/���0���?��/�]��>���u��C����W��?��@�3�>R��e����_�?���/���0���?��/�]��>���u��C����W��?��@�3�>R��e����_�?���/���3�������A0����0�
䔜��'yI��v�RI$�IYT�(��
(�����?����j��3gi�#��]n���:�����B��?��:��(��
(��
(���!���7���@����K���ّ�p֚\�I��$�HW;�hm̋�'2
0	��l���?j�J�C]g�Z�ì���'it��i���m�\j���CE��b��Tl���]�qv�y�(���r��4}B��$�FԼ9s�i�c]F���N�s��UY�T?� N�VS
�@�i]��zo�#�޴�u�}/�����m6�V�5=N���dڽΘm�V����ݮ�3൵R���t�oQ�ltO���OH�&����g$I��gy-�
����w(c�y7-���l"�5���G�:����?�����5�C��~0�2���*<�Go�f}��5�(����<imq5υ�]oqr��Ň�,�d��Rಇ�"�On�tlaHQ���Sþ"�����%��I^b���V���l��a�9��9�ċ E���H�����ý�������M}<z-�����j�ݍ��-�n�l��r�u�j������KH��<?�����־�~��OiSj-g���<sxm���&��g�v�9�[H�*1P�j/	i�iy�5�׆�Ku���K,w��XY:[	<��x���`%�-��p
����״_�ֆ���J�N����>���\�,K��{}n�Y�x����-�@4����-Ğ�4�
ijŨ"��Ȗ�d�]�p۬�-�,�7�s���k�7÷���$�i�~��j�Ah%�=2�Y�t}FH"�aqo>���51+];���
���2i�;�=kB�^�,���>
�������=YGfbgӡ������J�] Kш��PC�_�E��/��%��t�oż�Ȥ�����q�I�.#�/`K�h���}�3!@k�U�q��a�O/�x�k�1�.��\��n�g�D��.���BY#f�xğ�e�Ã���Mf���*��I���}��]Oso{5��w���,�O{	���H�/�"���i?h0M}�-��"��O�Li�_x[�:߆5�iQ�Z}GF�Rq�=����j�TO��%�g��xKV��S��t��]n`{�4�WZ���*F�l�MÂ���b��h؀{�Q�����g��	Mu��|�Ԇg�_�����3S{��ω�i��6��jW���4�P�K���Mĺ���K}l1"�o��j`Ipd�b�̆e@$ߴu�ŗ�/�Okڝ��5��T��o,58t�eX�7�I~�%�"+M�Z�+�ߴ���/x��־��xR�C7�2�}�P���>�
�����V��l����;�x��D��-�~�z������y�|E��}�;����;���+l1����G���>`�_����������4X��Y��`no�OiB����*��[��	�C��6�z����u�Z^xg�V�Y_
=
ŚD�3>	P��I�#˹H����{�?�I���YO���<WG�%�V��KE��km�ψ�����u�%�҉����^�M���o�
J{�H�<������}?�ד���ky'��uk}����ۏ�����[�<��%ӵ
Rf��K�-l��$��͝HO��ͽЊ�
�k��wq-uQ~�~�Jӵ4мG��J��f�ݡ�-���.P�ռMogH�r&�e�C�0��~�����U�w���{K�n�kdY ������4�H�K�,W��2ȟe�3����?���T���:]��=�?hmF�Vh�-�2�-���b�d��H%��i�����7>���J�n����<�a���+]D$S(��G��-IJa��/3H�r�(��l,�7��x�P���У���-Z�u���^h��[��q1�����eB��iĥn@@�j+=�4���zN�'��76�m[C>���,�Wv)c,W�
pZCm��#����)���[�F��A�����h>�����oX�D�۟>�s5�2@�$�����MԤ}?Þ	�=��Ι������M��W�k�Inn#27�㲵��u�I�n�<�*�3I������4�/�⺇×^ �d�eȰ���n�b��3C|����Z�͙&��+�v˵@3�k�
G>��x?��Z���:��B$�5�nm�����doq|"�G�!*���- h��Z�}�F���k:�����跚��-����y���i3�ɧ��v]YA��b�z�~�Qy!DH���ڗ�{��|���	���E�C9-{o���o�����?�^���Mף54��q�:u<s��q��c�z�K��Gq�q�a���j�E=�&�niކ�s��O>���u�n�¡��(�Ȟ�\'@P@P@P�����Owg��6�c��o!1>�H#d uݜ��^�^�(�t[��J0���&��c�t�JMƥ��y+yhd��E�������������t��"}�o����K������z/�Կ��^�ω�_��{
���&���!+���_���>������t�� ����M/��B<W�A��?R��4}{	�>%����A�+���_��x�����~���h���|K����V����4��?��_�����K����'����������??�i���E��������O��/�K��a[�~�� ��#�����/�3Gװ���_�.��$·���ɥ�A�G���=��_�f��a?�Ŀ�]/�H=�o����K������z/�Կ��^�ω�_��{
���&���!+���_���>������t�� ����M/��B<W�A��?R��4}{	�>%����A�+���_��x�����~���h���|K����V����4��?��_�����K����'����������??�i���E��������O��/�K��a[�~�� ��#�����/�3Gװ���_�.��$·���ɥ�F΃�麔7w���mq$	qy9�r
Rx��vwp
c����Ҕ!E�N֓�#mw�[eӥR2NS������=�Ӡ(��
(��
(��
(��
(��@|��}=j���f�������:W��w����Z��
�#��P��
(��
(��2�����T�WZ�?����.�K�fx�l
̹[�y�R�#�1����v�¨$�&�[#��#��j�ZN�b����5V��4V���:n��z��/�c6����n�x����r�]dC0�[ğ�
�OZ��浾WOK�1m-��^������i�����
��#��ޓJ6F�h���[�'����Z�ݴ�
��5��ӧ}CV���O�cX��-��sG���"�� �~/| ����A�+�xZD�u�E
ݨ���4�%��-�ل;�_��Pq@���;M�t����ٴ]l_k6�������魴�J�C����͍��t)	��f_*(�����g�]Z�K������Zv�y=���ӛO���9���
^+K�[A"�O۵ݴ��p���U����/��^��=΍,���Ϥ]��^��{��K�U�>�'���ɸ�����
�2,E
�/>>|�k{��G5ӵt�m���{��e�Z���{]=��J��U��[m��C<n�]��B�i�CV�|!fR�@���.<+{�ķVsD�Ki-��g�Ɨy^}���.JHVfz�s��y�D��K4�Jt�3,�\�q+�a���?�Hļ��Z�$��4k"M���ZX�kX	Ki��l�ʉ2��<
x�o�F�jE��E��O]K[	�%�]>�Y�o"Ka����C�|�y�
�>��ݭ��Ɓ��k�ڵ��	ӭ^�:*{��)� ��U�ٱ
m(�\���X��]+M���U���1|�ȿ��%_��x�Y�p�Ե-'X��>���q6�pl�O��t��y1�vu�"
�SyorG�Hр��񮇣�rB�� �,�Io$�q$�
��I$��3��K�b�F�;��.O9G�]�o,���0$�x���S;IrM3M�i�O���N�d��}�u!��tg
s)2�G3HKɹ�h`�t�f�maen�C0h-`���&�˘�S�]�/��S4y���F��[����%5��Ou�/R���>�����M�κ���:F����Cĩ���2��wz��֎�m�:p-嬳�gj7儱����=��~Կ��LY�5m��!��e?��x`��k{r��}յ��yv<�-�QsupꐉI&�;-?�G���7\����ŧͣë؏jpjSKs�j�$�
�>���a����ao"ؾ�zI�X�R����.��!��l7���^?�u;&��Z�A�*9;�s�Zlf��k��,�~k�f���O��m{ma?��xnm.�ű_�֛c�cams⩤�4M^�m��o���/1�E��I@1u����t�By촭KS��o���!��eh�!0�А[2����7���o
|z�?�A��h��4�h�{���x:���|)}��cyecs��r�����$�K<��?��"�+���կl.<?���Zk3h�3|<��Y�Ӗ�S�� �$����t�[����FX]�+j�G��kZU�>��겤Vz�nm*��xL�"h�1Gx~�o��k�%�Ηw��\D�[O,Bh�W^��[K�4��B$մ�}&���?څ����oq,o�KƓ�z�|3Ს��2�$�!�l
�#��Q���E�)6,��P$���N�4�s.���p��q%��̻�-�V�Ȼ��8a�<�@O�i�"Qsagp'Yq=���Xd��%#	Ky��E|��Y"`Q�HV�t6h�m%��B[3i�e��?�a�J$��X���67s@]h�=��Ҵ��uuckp�n�c����1���8�VM��
CX�Ѵ��I��HF�f"{�¬w/�cO��L�ȁT+>G���}'M�3���Zś����/&%��{��3dO��.�R�l|-��{��CP�60�,�e?5L�(�^"�B��:�Y�6?���o�=t�y�7�e��%۳�s�e���ol�ߗ8�-��u�E����5���AnDP�1�U��Å��<l��7R��t���_���_A?�~h�Hg'���0�t�~��}�jڟ�/롕Mף4����y�3���ӜTKa��u�v�t��G��t�(��l���K���U�K�^*~�R���_#�~��	�P@P@P@P@P@P@P@P@P@P@P@Pe��o�
��3{������J�Z]���u��֓�>�G�~��z%bjP@P@PQ����
��J�Z��x^�ץ��z��`�y���(�8τ�/�mV_�Q�VK��;�]>�����Y�N���	m㍣Ԛ]&�Hu"������ĀW׾|;�>�q����c�����S�.���Qm��-}����v�i�"�I�bI|���?>��6z}���.b�� ���G����M�H�A{u�w�S�s%���spZy��vr|�3�?��>���V!�
�b�/�_����m�iڀ�~H�ݼ��P����W�{�:�J��:���W�ãX@%���(�"-
�e�U�F�y���	c�e�+y4�m<+�X��siw��,��[%����HĿe��8 Y7,Q�"��[��}�K�G�^����~�y��h͢��^��P�y����o�^Mus-�;���yYՋ�@+��?�n���Gu'�p���'�q2U�6�}���%��Ml��Ε47g��m:{m�g��M���2�-d����m@�H����7���
(��
(��(��o����҄���	�e�C3���?������e�k�{��&�G�%�^���tǻ{�R$�R�i������Wr�/q"J̪@f�~�Z6���;B�����,-�d�>U��p]Z�c�6�X�90�C��G¯�Z&�<;a��iMm�[\�q��]���%�Z�r��G$ڕդ/ ����4�d-,��6�^��i�xcA{֍�7Ҭ��u�yvM�Ly���;s

��P~�����=+G�ga�5�j���֥u1ws}w,w��M�B]J�E���;�"�R3��o��6�oټ�>���tM:3-�"�l�+n7ژ�c06cت�v�(��>�-�|Aq�[�
�ɩ]xn_
̈�E�*X�p�#e��6n�vڧ���{C�hgH>Jۺ�Q����N��k-B=N��t�%��F!<KYKī�@�dDY7k^��Z�i��?���G֏a:"Immd�$=����0[C�#@7�4�
*�;2��O��������2;I!��#M���FY�I4r�
(��
(��
��Ǻ�ͯ��Jk����4_�3����v����=?�L��z�T�z3OMt�`��Q�q�j$5��_}��|�?��G����������qV������S�A=?:��U��?#)|P���=*�N���
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��2��m�}*���8�O�t���w��ן��'�|С�=��#�+P��
(��
(��2�����T�Wh��abB���uE(H��@V�QET[�6���$�FO�98h�N��?����2�'R����?��@������L��Կ���&P��_�o����(�u/������ɔy:��������<�K�����eN��?����2�'R����?��@������L��Կ���&P��_�o����(�u/������ɔy:��������<�K�����eN��?����2�'R����?��@������L��Կ���&P}��G��^G$QH��q�y,��d7�U�$��ۑ�Ӿ�`h�.+;�#Xa��F��d]���ֻ�=v��
��Կ���&P��_�o����(�u/������ɔy:��������<�K�����eN��?����2�'R����?��@������L��Կ���&P��_�o����(�u/������ɔy:��������<�K�����eN��?����2�'R����?��@������L��Կ���&P��_�o����(�u/������ɔy:��������c��M��4K,R�Gg�yN.�s&�H�;l&��v4����:ѿ��g�~��=���Mף4��H�Г�R�H�n8���OU�u�:���s���ǿ���E>�o�!�;=~�?[���We/���5?C�z��'���P@P@�k<�I�'�:lӴ+I�Jǯʭ��>l�W�G/�jq��#mR從n�_#�x�	8�7n���3�u��&����z�._�?����G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y�������˗������ ��G����Y������Q��/�����A�������z=���Y�^"4ks
L��yC��n#�>��ԃ�9A��d���۱��-��b�@€
(��
̿���s���TwFovq��1i_���Mו���Q�ߧ��X�P@P@��7����Ҹ(V�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�׳��f��g��<�wڟ�/_�ʦ�њ�vF܎��߹�Lt�>���G�}���x���ޅ�ȧ���!�?=�r9�=�
�:�����_?������:�
(��
(��1�/|?�/�t����KE������o
x�Ӎg�S�ᡜ�M;I�v�W�K�����X���}��G�?��?��'�?�����=�/�1u@�ޟ�J�^�����X�������s��O�%�/	����?Əe��LG�P9����������@����G��&#��{��C�K������b���Tz=����?���?����Ɉ��=��P���h���h�X���}���z�(ixO�4��a�4{,_�b>��G�?��?��'�?�����=�/�1u@�ޟ�J�^�����X�������s��O�%�/	����?Əe��LG�P9����������@����G��&#��{��C�K������b���Tz=����?���?����Ɉ��=��P���h���h�X���}���z�(ixO�4��a�4{,_�b>��G�?��?��'�?�����=�/�1u@�ޟ�J�^�����X�������s��O�%�/	����?Əe��LG�P9����������@����G��&#��{��C�K������b���Tz=����?���?����Ɉ��=��P���h���h�X���}���z�(ixO�4��a�4{,_�b>��G�?��?��'�?�����=�/�1u@�ޟ�J�^�����X�������s��O�%'����ܢY�k���@�R�@䐉�8��L���暯�\�}�iғ�po���P@�p�
��
(��
��?շ��?�Z��3{���Fo���?����gQǭi?��~7�zbjP@P@PQ����
��J�
Z(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�K]e7��Yam�W,H�{7�[S�_���^��5t�y�>�Ny��n�-��z�o������>ԣ������ ����p��������׊����(��_��U�tP@P@qZ��t�V�{�/��H���v1�%�V�lz
�J��M�蜓��R_�a<<''+�7������+]�5O��i��u����O��'�i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~��t_���?��!��_�)}����i~�^�<	��w�_Eq,��Z5�Ha�+����b@'v�����V��M)h�R��k&T(FRNM����W	�P@P@f��g���T����\ZJ�6���	��>R2A0 �e9V�r+�	=�����M���O����u�a�Zi�/$W����j�U�Z���|�?R"k��3�ş��i����j����D�f��������������{�ɴ}R�/���5?���$'�-��;H��w���K�i��Y�����!�l�����O������>���A�������ψ?���߫�M��H4��������ψ?���߫�M��H4����X~?����|A�@�'��^��m?�C����}f�h~?����|A�@�#��^��mT��K� ��N��!?�l�����O������>���A�������B���������{�ɴ}R�/���5?���$V?5�v/?��1m��/�y�cJ��?雷n@8�x� ��?����jv���?�l�����G������>���A�������[^ ��v��~��6��!��?�>�S�a���B���������{�ɴ}R�/���5?���$'�-��;I��W���O�i��Y����$/�-��;I��W���G�!��?�>�S�?�H?�l�����O������>���A�������ψ?���߫�M��i~�Y����$/�-��;I��W���G�!��?�>�S�a���A�g������&�H4��������[> ��v��~��6��!��?�>�S�a���A�g������&��?�_���j,?�H���w���/B	���X�b9�����+i`)G�ߟ�I��������Tw�`�&���ҷ��^���h�c�E}��8����c�J�?�?���b��S�c�K��'�����?H��7�}�o��G�)�4����#���?s�0������3���q�_���?���D>�?���?�mk������v�T}R��K���"?��c����Z�<i�G����_n���|�}f�����/�-�������>�cG�)�4��(��!���,��ֿ�>G���#�uT������ȇ�g����?�mk�����rO����4}R��O�"Y�����/�-��?Hg�M�?�=G�)�4��(��!���,��[> ��~��2���~����|����?����k_��~���{���}R��O���"Y������$/�-�|g�%�G������c�T����ȏ�5?�?s�1?�l�����G������>�O����G����c���A�k_��~�ԏ�7���7ޏ�S�i���E���,~�a�g_���7�����ڏ�S�i�Q��G���,~���g���:g�U���z>�O�����֧����C�g_��~��~oO��h��/���G@��C�0|@N?�������J�?�?��}f����Z���#����KÚ>�O������O�c������� �#>�M�'Q�Jw������j,��[Z�O�9�<��N��J�?�?����?��a�k_��~��1����)}R��O�(��!���,~�a�k������^�K�y���|����?s�0���~�?��N��G�)�4��(��!���,~�b�� ��{�������h��?���D>�?��b���� �#�������T������ȇ֧�������-��i�Gn<�ܟ��oO�qG�)�4����#���?s�0����?�_�s�Lox���>�O����G����c�?��[Z�3���v��7�=�>�O�������X�?�/�-�����s�Lo�����T����ȋ�5?�?s�1?�mk�ĿH緕{����}R��O�"?��c�?�|Y��.�}a����G�)�4����"��C���k^��
#����}��z�j>�O����G����X���ψM;H?����h��/���D>�>��у�^�?��zdd�#����t�y����?V��'��K7�?s�6k�W����i%���q�3��Qrp�>���QV���QnWo�Z��/C��<{s��?�+�F맨��U���?��P��
�yU�������r���y����|��zUp�@P@P@q�Yx�mJ��$�!c�� ���YN��ON��J�L
�V������Mt9��M��,���d�f�H����:�����Y�������A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���A���#�~���?�*�k�"��&���F��-<e�Z�2X�RW��b\��� ��$񌎵ω�
T�qT���(��њSUԽ���O^��y�@P@P@P@F�w+�ҩt����V�2#
�������?�of�f���c�o���{�R{k����;����0LbNW��_����R9w�O���
/�/���g�����<�Q?Ň'���g���o��E��0�~a���*/��_P��?�?�J/�/�e��^�_��/���g?w���������/�Y�����E��?�/��L=��ߵ�����,�t�T����?����i���'���g���Q?������?��O������E��0����h�����e��Q?�9=E��>����a˾�e�����_��b��0�/������������_ŋ�ɋ���h���>W�ٟ�ʋ���r��G�	��Si���>�o�z�^��J�����
e�ۗ��K����vN�0?.�q�:�y����_�4��~����h
0�����z�JW_Պ���ه��'97�N��?Z\˻��-֩��!�?s�|��=q��<Ӻ��h9i~����rx8���4����ɶ�����kq�c>����Z9���?�+����#���G?M�i�/��9?����l�`���ǿ��+��i~�5��^���Q��s.��ryK�0��b~���
.����9i}�O���Ϗ�~T]y�����/�W�5�>Q�l7������>O��O5�b�f7�x�9�⋯������8����=x�g���!�ז_��ُ�����;v<Ӻ������5��F��~^��]wzO)~�ُ��?_B?�M>h�
���-/��5��{מ��������!��/����<}O��|��w]�/�×ɯ����9����?�A�t���!��/�O����p@?�^zM���٭���y
��.���!���?�C�6>��.�Z9��(94�z��i^��'�_֋���B�򗖨?�[���=�}��]��>O)~�������w~q�B���.O)~pg7�?C����9���r.�f����=9�9�>�]y����.����|�ϟ�w�拭}{�9ik�f���'��������.���ɾ��o�����А}����i�h?����`9Q����9�JW]�惓��!�O@������Ӻ�����v��~"�1���`�q����\˿⃗�j���hlXi�X9�A���1R�������j.��h�_����=H�*W��q��z{���7�֟ռ���Dی�y��x�z�q\�_��n��~�W������S[�{�T�ӽ������e+�:���c/�?��'���P@P@P@P@P@P@P@P@P@P@P@PR( ���;{t��b]ىO�ҭK���"�s������Z���_י�����_�O���]�`�����~������C�	{���q�O�_��Nߨa/?(�T��ÐQ�/�G���G���N�`��C��>���r�
�t~G��*~ч"�E��_��^ч'���*?�~G���(��9=C��?/�4{@���`��O�z�8��0�~�4<��o�ߟh�����~]i�F��`��L���ӌ�^>������	�>��O��W�%���{A�4%?�=>����?���������>�{@��%�?������a/�@��O�~�{@��������{@���?#K����_��5{�+����rA��;rp�:c�ڳҟ�?���?�l��Yi���4v6Z*�	U����z���s�_��iɯ�~���T��#ӧ\���c��T�=9랿��n�?f��`4E��@s�}y������@��E��^�G�<�>���s�o�9?���ւb!��	�<��=�?Ɵ;���r/�`��^�3��=�ܜ�N(�_�9?���"��>���?B(��g�\Q�)���G��c�֎}7���'�`�G��=��G;���/�q���21�'��.�ȼ���L�:{�{������8rW��pr�����}��/������C_��1�?��c�ris��ry~"
OX�=�.1�^��დ���)��=��?.ǧ�=���rW��U?�3�U?���Ў��S���9-�� �Ӳ��qװ��ӌ�9�r���v��?�3�Ǝ?�����D�ď��Ǹ��}zcs���_�b�ې}�a�����9���Q�?�0��C��03ߓ���{^���?�W1�����>�zQ�݇%�b&	*�a���{���K��������PtA���ˁ����j������J���^3���Q��]��*t���=��?Ο?w�~!��4D�Gӑ�Ony����� 
3¯�?�N?�J9�8z�������^y�~��Z9��������wc�W �������x�=���G��1�؈���a�n����rW�H���'�H�����\�@�"䍀����N��3�Q����/A��`m�����c��s���Q׾����p������n��e��Zu�
ؐ*��\�����Ͽ#c�O�i�������8�lm����n����J�ί�y��}�2���_"zep@P@P@P@P@P@P@P@P@P@P@P@F�N�Bm�#\V�����E��������ׯ�>ƾ������?������9}��������O�0�zzQ��o_��6i�t����[��1~ƾ�_��y_x}�O�Z�o��o/��Y�������������t��������O��������O�0��Q_��[�}�x��~�s���/��9�(���?�
��?��o_���i���1ӭ��?�O�����G0����cN�R��p��0�~��t�O����?�>ƾ��o��o'�	�5��Ts_�y?��"�
/�\-�i�g��5���N�~��$o_l��z
�ݩ׊�j?����5����E��3���]���Bv�sۜ��\�9ov�V����l��_�Ql�cї��8������o���5�^�����3E×�Ad���=~���Q��d�0��8^3�����QP���/��B���<�^�Z.._��Af=�A�t�N�?���K���k��?��rx�ӯ֋��_���?��\,!�t�~�IϷΟ0r��>ƣO��Һ�Kz*�C�{?Ϧ:�#�/��\����ux�g�r?J9�~��_!
��`�>ݹ��}h����09��>���_�9��� :�n��}x���K��������}d�_���>__Q~��O������\9}>�?����^��4_��_��� ���'�"�ar�|�f:��
s�v����9�/��!����N>���4_�����ð}��{����G0�����N}P�_�zQq8�
�A� =?)�ǧb�x��5_�>Ƹ����s���×���c�}�9��ʎoP��пb�޸'ϐ1��)\\��6���k����|��{���0�|��_����Q�Ӟ�&�`���E��f{�������.qǯ+����J9��H_��tS��g=x�=�s/�� �����q������_7��"ڀ�C�1ϦA�R����v,,AzN�t�A�G�ˌ�{�H���}�?_�ӿ>ַ��_��[�i����v��vR�o��S�1�����+��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�3�u�G#�_&��t��wV��_�C�M�ž���?�v�\�����׌�^���}M�e�>��b�@P@P@P@P@P@P@P@P@d�}�1�p��u��U��{w8x�Hu�	$!Qn�#��Gos޻(��Z�ҩ����3��/��[��zup�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P��*M��KG����A��r;t�85�[G��Qk��5��s��:�k���s`>U�����9�|����٬���?ӥ@Š�
(��
(��
(��
(��
(��
(��
(��
(��
ɾ��rO��ӓ����I�Ǘ�{�X�*W$��[#���n�4�W���̥�ϧ�c��3W�aKko|"U�/�P6��y#��`���
��q�dޮ��S}[��5�Yy�Ԋ�d�KE%};&�_�}�V���v���|M��4,.����Rگ�?��b���%��o?n�>���o���)���?�����|k�8·h	��.�~�}W
�O�ħ�ʃ�T��/�L_�]w�����7����\7�?�����H{j���e�ɉ�����v��?� �J>������2��*�{j���e�ɋ��������?��=i�W
�O��e?�Rڧ�?�	�b���m����q�Oj>������2��*mS�����0�����a����?�_������ʃ�U�����0��ר�ӧ��O�>�U���O������_����]���:��}>���}W
�O��e?�Rڧ�?��b����v�_�NL}?:>������2��*mS�����0��٨�
�'�|�4}W
�O��m?�Tڧ�?�	�b��w��%��O������������C�T��_�����Zs�O3~�/�������2��*�=�O��2������@;L�����������2��)mS����2���]�3��i��Ϗ�R���������=�_��2������@;_���9�U���O�����N���a�����hG�|O��֟�p���S��A�s���&���w����ÿ�K�o���)���?��/�L?�v_��-<��O����������6��*mW�����1Oƻ���w����q����������=�_��2���^�zhv�7_O������������=�O��2���]�3��i�As1���������2��)mW�����1?�u�����������������=�O��2��|k�;�v���'?�(��o���i���?������^��C�Ͻ��~{O�ǽU���O������_������g��{w����o���)�����������v��"�|�?���_���)���������]w�������zt�揪������C�T��/�L?�v_���'��{Q�\7�>�����P{j���e�ɋ�����v�?�������������=�_�w������Ӧ��\w����������=�O����|k������~4�����������=�_�w�����^��@+O���??OƟ�p���S��A�s���&����D��H��o���)���?���K���]������(���������=�O�������v���'��(���������=�O��2������@;N�n&����_U���O�������_�������L��E?�(����O������_�������KO��'�?���������2��)mS�����1ƽ@q��g�gi����?���������=�O��2�������a�u�|M����֏������ʃ�U�����1?�u��������}��4}W
�O��e?�Tڧ�?�	�b�����L����g��G�p���S��!�s���&'�.�C a�c���-���G�p���S��!�s���&�/��i�~&鞽=2h��������=�O��2�������a�u�|M��}h���������=�N��%�ɉ��P����M�����_�S��!�s���&/�.�����D��OO�?������ʃ�T�����0����C��������J_V���O�������_����/��k�~'���W�����P{j�����&/�.�����D�y�}=~��}W
�O��e?�Rگ�?��b���?�i�^'�|���������2��*mS�?�	�b������>�h�����\7�?�����mS�����0?��i������f��p���S��!�s���& �ר����L���җհ���S��A�s���&/�.�C�a����3@��G�p���S��!�s���&'�.�C��v��?��֧�\7�?�����P{j���e�ɇ�.�C�����D���h���������=�O��2����ר�ӷ��O�T��u��\7j��2��)mW�����1?�u���'���8��\/�?�����P{j���e�ɇ�.�C��v�?�P)}W
�O��e?�Tگ�?��a�������r?������O�o���)���?������]�����"o��p����!�s���&/�.�����D޸����p���S��!�ӿ�_�������o?�O�o���)���?��������C�u������������=�_�w�����l����?�"�'�\7j��2��*mW�����0����@;N���7�~?Nh���������=�O��2��ǧƝA�?��G����AG�p���Rگ�;��e�ɓ��#X�#�4V�X,���%��H�|�����s�*4�4#'%��IO��IF�����Nu'��I�ʜ[�F�m_��ׇ�e]��GV9�s�Ӟ}+�z�w�]��sh/����p{��*�}v�
Q���[�`T�Z(��
(��
(��
(��
(��
(��
(��
(��
(�˥���N�z���-��ֿ��������k�7�G����ֶ������_�S��bv����8\���pGr3�뱋_.�).���=q�G��N�����Rm���H��g��Nq��u��N���5��?q������yz]_xi��?�X�Lg�'=��R�^_ט�����5�펿O�zQ̿;��f�9���z�9���a��i�����?L~9//����
5� �p=����G4��w
?���f�>���c����G2��o�4�:ks:��}}h��Ю��'�k�p랞�s���//�?Mv��a���݁��l�]y~
}��?���׌�q�?����4�5��?��Eח�|�O�_�'�k�;��<}h�^_x���_p�s���ߧ4sGm?�o����볞�����̼������5��c�8�����O�im��t������1B�|��[����ٯ�<�N(�^^�
;����������;}:Q������t����}?�]|�Pio����䟩�v��g�9���!�[�Ͽ_����v_�i�����?�nSú�?�4���?�\�?�b�2�?1+>���M�v�v��>�(�]�-���|��{`���ۑ������N����su��>��=G�K�y}�����������*|���
?�Mq�������.e�ioɿ��5�0:���i�-6���s���c�=��8�K�yy/�tw�,'�k�������-��4���� ��?1֗2��i����q����9�륾�����n�?N?����|����4�
5����ǩ$��T����M?�������������c���4s+�V
;����? ���(�^_�i�-�ss��������?d1�u�߶:�h���N���_��+��������h�W����?�O����zg��Ϩ�(My}��W_����y��z��Z|��|��XO����1�׏ˊ.���/?�_����1�3���K�>���zy��[s�|{������A��_ s�����?�(�^_��M��_�x��ׯh揗އuo�`�ΐ���y�O�.�z
,���f�t�=���JJK�i����? ��zq����-/���������G2����������a���J|����qӜ��`}G����=�J�auo�a�M�u'�_�:}x�G2������`>�^:�Q̻/�O��s�1���x|��?�4�1���ǹ��;����̼���-?��[���^���z�q�s%�-���q�i�OQ���?��_�Ҏh���i��g7�9���G2򿨴���f�_/��^���y?���t��?/�����2��i��lO��?����?���M�.�O?��4�#9=��׷n(�^_����03�>����̶����?��t@O�Oҗ2������I�N@�2N�ۊNO�[�.��4�=��
�9�'�$d{�٬�-?����~g�h�쨡��#���\�����7~�?�����P�:���c�����ְwص�ЩP@P@P@P@P@P@P@P@P@W�r>o�r3�cד�c^�G;}e�8#�sӖ�^s�O=+D����qwz0vl�}�p	�8=Ny;Fo�/_�r����'�s�ю�r3�Ԩ�ӷ|�{N���!��|��{������){E�/�������Fz��׵�_����8�:F9���3�z�]h�����Fê3���E��J~�v�?�#���uA�9���{E�~���_����6�O�F=8�җ�_���_�GW���u#���{E� ��GTW��{����lS����9��.wc�#�=���4{E�� �b��8�
����=1�R��տ�+�tdq�P;u��⟴_�������#��˜���8秿����]�������à�x�}����S����9X��ޙ�9�v���/h���9��~��w9��h�����a���NG^;~���Q���/��?���3��g�c�cҏh�k�9��>^9�����?���=��?�9X�::���:���֏h���9X�6~_�q�H�<d���_����#����~_���ا��#����8�� v�i{E�����Ÿ�zv��9�?:=������uGQ�Q��`��Q�W��r�O�A����cz��~4{E����A�����:c<�gw��/�+��c+�\n�n�8���K�8��#� �zs�ڏh���`�b�9>�G���h����9X��(?w?��x��~�t��r�G�T����a���Z^�_����tc%z��4{E��V���C�=����{E����?�^N3����?:~�y}���_�G����8�~]�4���m�9X`d=8>��s�����V�>A�6��ی�=�����z�+��y����A��o�r�ޢ�:����Խ���_�a��8�#��<}J�\���_�����t�������_���W?2�����v��o��#��';GԯQ�q۩����9��m���Q�^�{E����������ӑ������K�r?�?�_N����ק����_����������>Խ����W�Ê<89�zg�t����9��/��F/�#�F��q��~�(���_������?N1�u��.߇���8�8��� ��׷���v����� �sێ����(�����A���tq�A��=N?h���_���_���6~^��~}y�ҏh���9X�r�G�>�⟴_�_��O�GG'oO�~����r{����9E>���9�{E�� �ê?���n��sگ��V���2?�?�oJ=���W�Ê<::�����4{E�/���s��=��o�u��/�/�A?�^��g�9������#�u3���w��~`�w��/�/�V;�������n��;�H9X����eGns���.����O�G��������G�^_w��a��봏����߯�=���_�r0��y@�9���OL����?�!,~=B��H9�>��}J=��H9z�z/���x�}��8�`��=��������}��s����#������#����h��_����B�F^��ל~ qϿ$TX�@P@P@P@P@P@P@P@P@�g�՟Ҁ+I|�q��Q�:q��zw���أ%��u\�����|��5I���(�|p:��@#$����&����g�ps�Ob�q�[��5y�G@z����N��V_�'�h���=q���^(���_�/�i����{���q֋�����7������>�J.�����f�ӯ?���8�J��a�1�~��������w��?� v7dv�'�n��]��o�!��1��=3؞=�y�⋿��g����@����l{�.����F�v9�{v�ۯ�����aF����c��ڝ��v��N�ϸ���t��u���'�p?�3��pF?����w��9F>^�����E�k� h9Œ�����;���[�����9�3����~ �����_�	��:l�\�?�9�t�c�����#�pq���]���t�0����9����h���렿٣����O��nE+���������v�=:}ON�M�W�����oo_Oӏ��Zw��V�>\g d���]�N����-�Ӹ/\c�lt����$��|��-����?����'���i��?�!���9>��c׿zW}�0��`��@q��O�ё���.��/�[���4J�O��=}>�]�WV@t��pO'�~�?Z.��c���8t�Ѐq�x�OO�������f���z����ý;��V�A����qߏ^�׵+��[�r����ӏ~�p)���+?��p8�:��y���5w�a����2~Px�s��<u����՗����﷎��pGӯ��]���C����(�A�o#�o�^��"�B�f�~^��FG��qJ��0�����=�zw縵������۞y�9�듏�ދ���[���;nr����^1۾)_��K�f��^H�9'9�?NqE���[���ٟ쎽3���������׿�4i���H�FN��_�F����m�p�u��?ϥ;���[���N
xP9���ןZ_?�5���F��(�~þ1�ӯOZ.��a���Q����{���.
�}�l(�?(���:qN���o��g(����pG��ik��
��?��/\����C��w������@�S�GQ��@h�����h �q������E�p�8g{���ӟ��w��1�_֢f�o_�=1�~�_����8tۏǷS�ҝ��Ճ�9x;}�=�yx�{һ���y�Հ�G�����;����M���#�܃�Qw������Յ:h�������+��������W8��װ�9��ǹw��ao������J�y�9������ӆG����.��ӏ�}�1��r��~�2Fyϧ�=����_���@i����GA�z�\t��[���4��d�=����p��a��˂
���q�ʝ�u����]<w��G�1���{��o밬YK5L�8620z��;��u��_�����^H@�8������s�E���,O��HŠ�
(��
(��
(��
(��
(��
(��
(��
(��
(���=@?���@>������?��?�����I��P��M�$��n��]�������ߝ.=��'��@>����1@��ƀ�{����@�r>��m�o΀c'�s�hǹC��ހ}3�4c��3��@	�{��z}OҀ
������(���L��@�ݿ3��?L�=1�?�=�Oj6���?����ߝ}������d�s�����=O����=��d[���o�~f�{������ݿ3@	�ݿ1���?�?�?�ހ{���Ҁh�?\��\{��"��x$��Ҁ�O��@	��ry�?�ns@�v����~t��?������b��	���}(+���րh�#�O��@	�ݿ3���q�?�O�=�z�O_ր}3�4c9?L�~��G�랿���'��<t����L��_�@:�y��_��1�zz���jM�����@
F{��M���~�m�i�?��!9<���G�'�@�ݿ:6��_S�P���f�
��M��O�����_�g��
7�'듞�@�;�I��P������
(��
(��
(��
(��
(��
(��
(��
(��
(��
��admin/images/syed.png000064400000036576151331545640010603 0ustar00�PNG


IHDR``�w8	pHYs%%IR$�sRGB���gAMA���a=IDATx�}Y�ו޹��^]U��;�nl�$q��ZC�䉱�G8<~?�Œ~��O�f���0��gDyF��H!�3�B"@�$��I,�^���%3��s��Z 	���D�����s�=�;�9����ҭr�R�Rt�Tp�"���~M�������x`S�Ǜv���U�i/�ZG�9+���]P��U�-���l"p������k�O�RK
g�)"�_�Kr��s�J�����Z��s�{��\z~y�~�ߨD���I��/����O�9;G���
����3Ak�G��sa���o�+���Q���7O{�~b:-�H+��q�"+�H�5���ǹ�������i�4Щ�T����Q�sa}��x�9�5o�6\�h��'�}�ؖ�}Q"W[+#,�̃7y����%d�6��ޏ�i^*S��4Q�>���N��d�r$'�E�3�=��Яi��(`��/ t�
���i��0ʼ�#5�O��7FN<�+�P�����"c��y����Ԙ4�%�(�~e����3��=C��*�����~&�m%��a�h
�(���[�S�Z���]7�ĦGF0�M
fe|����MY��
L��t�~d��S�C�!��K�	���~����/��3�	m�����_[�z�o����ʚ�J�&�zl��ij
��\e�氠��`ij����!�Zm
��j�P"�’����S>��t:E>f5
�PP FC�fDx?���ς��x�]��P��5Zgz��3O|����W��������>�\�ȗ��ȍ����\��h'��j�ǛL�!�B�`�Tm�imk�j��jZ��
z&��d>E��"������̚w�E��3t}u�t�&�^�(g��ϣx&�O`��GH1�>PH�� rV?�̿�O{���v���o<^�ۍ�����H�m�
���x-���.H(%� �KS��Еk�t}c�z�����v���S��Ẕ�]��O�b��f˴a��Re{�����e(�I;�m�w��V����"�xb��X	�+�?sd"�z�U�t�#�=�xק�Q�tG�;�����R��<�i��/NE�8�c��(kӡ��6�zi�޼r��7���HW��C�LO_�
`�~��Ċ�.�=E�O��I*�
T¬(d}J�24_��rfI���w\7FKZ���g��W�[}D<HYZ<z?e���G�(�}�����>�.����DݳxZ�"���8�� �R[�߻�^���Q��Ε���h�a������v`
����U�P��G>pl��SF���&Kyڻ��؏���e�,�C�>��B	�#�w"���"k��9�39��{7��'�|�>�@c�X
��������`��^�HP����]��������r�]z�{M��WbfX��Z
Ǿ}m��}������Г�ٴGIO���PM�Ą�k
y��{h>�P���w�Ki8k͐����Xy�pu( 6I8*LPqz?�邹>_��$��;��������PѳcojcW��%a�2���'��k�/�)�t�m���)����p�]\h�F�f���� �,���aa(� J@�	(3�𺘃�$#����y٬��
(t�Z�c������t��=T���y�83,{��D�ڜq��7C�(�T�‘�x�u[��J��G�>��_<�U��Y�\��q�U�3�g�t`���8ݷ�~���H��V�Ÿ�
@��J@�i��B"�r6IH;Ỹx�d(�&�}RP�@"�"�OBHJʔ�(�/Q7r��wW���_��N�x�S��g�{
63�u�r~<h��y2�LB��9+�g��lU�e0}}���V�m+`�͎Rg�M�����P����fY��m4�g�t��u��5�]��+�[�I(���C��f&�S1��P�JzSa6�	�|���,�x�K��̒�+Q�P"ob��xL���B�~�����J����t�(��Ĺ��bD�rwG�J0��̪��
`�`+�n�,�?u[��p�ٓ������!�vC	@/���x&0����x�����Q
�uA9ńC�2�w2l���=��&��;xYf��I��Ha@���49i(bb��<�a:�S{����._ߠ�����t`�2��>����l�g��X�iuk���Q�9�}jϑn�1߲V����Y���
_( �s5�@�A��4�a�N_���ߦ��Z��c
�tta�>}hLMB@6��C���	Q�ȱ�+"��(����O�:��4"�D2CN�@nv�|��Y1�@�w��Z�I��;��.��*N������i31ruJb�x�3Lգ�ͬ��\qR|j���+t�w+;]:��b���,��1�28(C8a-����������F@�m���}���%B`�NN���@N�F5�(	?�el"iĉ5��G���Ih��4�P83y<�Ӣ3m
���.��=�%������k+�޵M��z�>}�I�(��+�p"e��,��/���y���g/�?{j�ԣ�ݒ�^�t�!�(&҆�j��O�1�C�HapQ������֨�ء?�g�K�=x�k�iC��:E����v��0�G��C��x@�kF"ޤ�2�������{������~�M�l�N���9�?�t��/P:���,�q�J�q�_��|�(X5��/j��v��x�u����.��O�����C�a��G ����K������_��7p�n"A�_�Ho���С?������iT)�4F��`�B��֗Mő�k�P0w��)�g��@M�ۗG�Rm�V���:��ר�u��\�����}Z][����S�q:8n\�}���`"���^+�e������|�|?p���ӥ0TO�~?N���Î�642Ip�����^��뀗Z��?��p��0;�u;�/�0?bp0s$�uM��PЮ	� dz���`����P�F{������	q�!̡¬�t�oJ�t�����N�V��Bׯm��ԜMJ��r��,�H>!��RϮ^����}i�>�'�
`��_d�b�4B/k������.^Z�p�2��A�%5k,pCw#�8&�d0��8��f�hG�0К=Q��h��ѐ��~AlV(�(2��F�ކv�\��l���] o��u�_^�{�;N��Z��7Cq�9�Q$�o�V�����O��*`���?�}%>����Q����Ӂcde��x��շ�P�ݤO�K����.fA$�����&!v�_�Xp�Y���3�г��V����a�#y�$8�(��$O�\�TZ3\R��X#Mm��FD���U�����0\���`���л�:N��?8=}�st;
�}}z�ݵ���*`x�q�b�,dS�x�7^{̥OK��M����h  �G�dI�&�|\S� �r�,sM4�3Ã�C��j8"�i��{v�/�#¾�k��1�l�0��e�L&<j(4�mJ!�#Lm�T�T:�\�����'��dPr��з�t�fr��޼�wO�ǖl���qn��DC_��>�������@Kp�9ăy�E,Đ� �Y�X�&y���	9v���sGF��- Ա�a *Tv����"����8[���z4������ڢ��pBy{�)�ٿ�#�j�@�>�c��!�(o���_�e@kOkt�l�dm���þ�c����+�d�riHY8�<�&r@-��#���&=� *�r��0�Tc3(���kl3��HȌ��o�QZ��L�Xf��L�ގ��8�v9�Ŝ�ݕJ�B]G�8&ޘa���q�Ӌ$�#�	* 4WG�E<]�t��[�7���7�>	��d]h�A
�.0p�D1-͙$�>����ߒ�	s�� Xg?E����yb�ن3dda���F�����u���䨕g��+U�F���/y~��H�)
�	�Bad��Nb����|"	��%`�!�ck5��Ɵ����窡0�PX��\��"��'���T.�iC?4�\
��Q���
�hرI�67�1B��%6�(�
��I��'$�"�Fs��(�M��%Xs'��Ήu���/12�n2r�9u��Gm��Hv���Ȑj"I̪b>K�v*;C
D�W��'�H����Om�j&��*�QDDC��_�@T�:�8�ڒ[&5.`E��v���hpx���@1�(�IR�%���6
��!(Oy�M��&�hy��KB	<;xT�Q|o�k&#�N� |���胓8�~$���F29�Ǐ�.L��,��%�/���a�2I-����5� �f�T��ȟ#f�O�i�Q�u��ְ��1ش1z�~�'��{>wSh<�h��ȍc��~R�R��c���(�G$�Δ�A�&'�1�H�!��f_�x������(�$;c�ڌ&�$_ b�X�6h�ހp,$s6kMQ2��~�|/�T�����G�̤%�̚�XH9T����+��76׷q>]��y��T�v�4�,�d��pT��bXd��4^��A�翻�{_����i���xzc��
"+x݌	��q����)��§&&��5�Ӭ�;�]�+�רً����� ��o�
i$bR�r.��F�3=�L��RZ��iIFX;�D�ב�AS���yFs�x2�������龻R��3�3х.Ы�]�}��h�9�a��vh��4�O���QA�'�0':]�t�XZ>US�x:�)���%���3� ��#��&�?���8�8�v�MY/���,1�cX���ao�Tm(�BJ�!��ߝ&��-�7��2@�Q��O�D�m�&#�w��QI�jW�j�Ku�|I�x^>�!V�h]o�л��tpi�,CY���2�h0E�fc#X��U�_:"�[
�6���J��k.ހ-Sh0�����By|�4=I�X��`��KadbV�a�{+����i;�́�U!SLC��o#��?�)@HD���E��ڤ�W.�mÆDB5$�Hg��0)�ʹc��¨E~8��7�TJ�y�R�$F�޺V�J(F��T(f)�р�I�����kWis�A>��f�O?��&u�%C�@K�y����_Py.���^��;+�G>$��8hJ[&x�����'5�H�$��Nҍ�<�FK^�O�bzW��04%|R�VJ��żl�csc��h����8��)���"}��JJM�8����ɺ�$iq��P0v��6��OM�ҡ��_�J;�[`,�Կڑ�y`�E�1PH�,�G��T�\�<Fv��"a~r�2)�����	�A��T&�B��U�|ȵnH���(���K�ڵ���B6ˑ
�P�A�3r��Í}�{�8ub�ᜮT.K��(�r�3�P��뮩���E��50����-rPd�����-�y�����w�qڳ��z�y����?��p�uz��H��:S.ӕ�-�O��F]�Ez뗿�4�ya2C+�-j!���PT�d��9�uZ|db��@;�T�����t��5()�x$��
�����>'t��7�
�Y��i9N��5\/�p"&MAp4J�h[W= '��z�X�4c��?=�?g<k~N���/� #9�0򑩿&l����8�	9��(�R�y\3
Q���C��Q� 1¾�W^�nc��.�`���v@;��"u��- "�/R�դW^y
B^���(*���I�7�R�5�g�t/R
v ��FG`h��c��K@?Mڿo���OQ�nk�E3%i�D�y���iz��&��Gp���T��"���z$����B�%3.�x�L�o� ��Zȏ|~��wO�L7��ԭ�+��l��D� �X)\�㰹2�)r
� ��^�[�+ߢW�"PMB�I�v����D���hi�M�����mz���A(��.�u��<�+��痶h�~'����Od�t�ß���5�L�08��f�P����E�v�!ҝ�ٻī���
�<S ����􋟿L��?�G���U�M�D	�'aaw��zl��[�A
�3�Y��?���:�,�[�l��P<�}ǵ��R}��5=<U$
؅����f����t��������C��[F�T1��I�F��ч��ӱ�')�-P;B�L?'��=�R
���anZ8^��ґ��-'�>3��yI
8�����Ue���5*C�e�SY��O�b�hj�P>�z ��h�yZ����'��8Do��t��z�FW��x[x#G��y(˙��H
�v�95WlJ�3H����l�OF�L�h�C�X�fb�ȵބ�z2�\Qn(&�)�(ʑ�z[��K�st��A:t�0�
��O~J!`)���T)Z��	A���΋���S�5�l�Mオ*%��u1x��6u�s�M$st��~zs
�� 
�Q�T��II���,��Ⱥ%3�f��0R3T����)M�/`�q)���2��4���CSP�[�Pu�=��/��XUD�pF���1Mnr���p���IXc��(�<`6,��m[��3�qe�h�~8dT�D�g���KꭾC?�o��O��q&���
�KH�R05���zf3�D�b���8��䵹���C��{7M������$���e*@��F4'�:>�!��u�]����!�)���u���R�З��B6�x !%�E�����u���?p�FZ��u�(��c _
@��{o�b�em�qP&�Ү�V��Sr$F����v��i��۴w��%�rh�8SJxv2���&�F@S})C�1z�TD�y'1Gs�@E\z�Fw��L��8��H'H)�k1O;�-G��Q[��f�pI��2&Ag'Y9 �L&(M;on�ad)�(��8x��@d̎6�����=��G�zD�Z���H�N	��G�-y��KF��(���?�T�`t�C��U���G�P�$L�T�&PG#=�a���D��w�G/]x���;F�$��Q����Es�1�2i�$i��a�=��G(S*����Ǭ
�=���a��T���77��9��6L���9�d'`�A9á�l֩��E�9%uL�߃Op0S}��Ym��+��cX�V.�|��Ӗ>�w���՝ޒ����G�>4_�U\4&�r?:�-��2A��)	�ž%����WN��;Mk������������S�У�2�!�)�u�;�XW.W1�W�w���$%��%��]�;X(��>{�~��_�@A�S��`�p��T��$�uv��*�Z}����˧OP1�|g�`bx�L_����
��IQ�ؤLǤ42�G%�␭\�^1]��p-K/c�%�z�k̾,��Zf��p��#t��#��d*f�+�R���p�_xฐp/��Uz��S�Y9)�Ņ2��e"
$����}t�=ɠ�W0�eR��VFf��t`ҧ?���t�K�֕K�x2\�
�M�qρ���).S_��RF�%�}�h!��K=�*u�\��vUύ
�C���m\�oƬ��"^�2D����
{W
�D�zLf�E4��	�,~.GW߽$�H�<tAC$0+R>�^��O��4vv��A�"�H�؉�&�����xs�\
Ӣ�<�d���/sI{���u߾"�єp<�H�����! �3���@8/��}�p�	;� �uu�T�#39]����}�l�[AJ��iĽ�>E����h4g��37�� AχzC.3���'&�p&�'���<���OCr�ebb�\��.�a��x���	�A�b
@�B�Jh7���A��]�MK�mV�=��f�tD�#����qs}C z�0gv
�A�2�8�s�%�!����H�LELѮ��;!�
�(�L���%��i �!C��PƘ�EoP��jI%7��4�]�>�cj�O�������N��IVF��\0oũF���R�@�١����Bj#��t3����=0U����d����rB�3���i$i$^_�J���:u�h
�f�pEP2E�c�"Ȯ
�.>Wg��"б\�Z�̜��"'��ȫ�G.#��}��E�)��G��LF��*ǮJ����`�b�b4^P#X�wR))o7Z4с�Nr���gJR�g�l_���t�QM]��I?3=�d~�!S�z]"��3���o.ȁ0��������=O���n�G�l�rQ3&%���|2�;1ktd�E0�0T6��A��2��B::j|�ik�b���Ƈ�U?<�lW|(]���ad�r�*�A��0h�)pԌLo�*;䕒�
~��q�U��sAj��j�imcKLD6�Cb��^��V�*0C	��CK�
��f���W�Z�"��˗8h�U2]�%�%/��$K�f`�8�IYG�&Eb�<�.�?�A�S/LOS��z�&���/45�#����i�.���Viձݧd�:��q�Ѯoۙ2�cj$��i�;��&���~�	���d9h��>�D�l5��6�][ۀ"4M��DJyz_r�;�j}���9	2J��6f�f�*e)$�r��&�͘��;�����tk;Ԇ�*�?p������E%�ؠ����s�����w�{p��(a�S���\s�7�vya3��lZ���ѫ;�(��R��&���Ǝ>A�-�(cۭ�W�(�g�b��M�\*�0��7����3�V�hi�b� 녌�v���g&�S���K���Ay�b�S�L�)kȲ@:��\N i3��Jk��LB��b��]|3�U}����y��#�$Q���{afc��hW*�&#~��5U�������=��3#ڈv}�[���l_�@�K�F���>�,�e"N�.������kW*��e�Tc�
NG�;�7�
8��"��_ml�V�N���$�[�.���<�Yδ%���`�b���,W��\?�1
��HPM�,.���?)���+*���5ח�l��$��I|�n���.9�*tf���N�x_�P���s���a�̟�[G�H��5�|)C�4'�=�p�(c��V6i���u�Y�^�2b����}�1@0�OevJ�xDEi[�6�������- �Ҍ[u�I�a/O(*O�8a*�sVҫ	�L�"}��Q� ;{�I�t\�ixnZz|�6
?G�4m��d܊&E�!��Ѿ���H(g��:^�gjh4��ly/5w*H�l ϻ��w�$�„x��*5$Y.�7h������"2X3��L%�l
Q�N}��;���a�n���9�˚�OP>�94@���v�fWHWAU���M+[u*BQ��GwN�]�8
V��f�RZXFZtZ���,�
I7!���@Z���⨘E�EI�DZ�؋�P,xk[h�D������C���u�­
�N�$�t��K�2��H�SM{�[��C���yilW(�}� ��p��.����X>�'"�3'&ɓ��6F���m#rn֦A[�-������Jw�2W�4cɹ�.�,���}
F�� �W��d�ڃ���7q�+^��ѥ֣�n���n��l��P��t�<1'Ʃ7��}��?��8����_	��\���!�"8)�C39ځ�y�NM8�N�G=������ۀ�	^z������t�S�vj�js}I�>��fȽ�i�rBS��
y��=S���"42\�F��g��~$YW�+�(<��unI܌�"=Q��^��s!����a�(�@c�g����P#������v\���Y	����%EǔFz��Q�cݦ��'��#��Ry
Q�I#���؀�1�
|��:Ŵd}��ښ��1�����-B�����m�H�tpq�2P�đ��Ñz~�b�s����x�0�-��Q�Aƹ�Y�v* �FF01�k\�J�S���k+\�+ǖ}���M�3|:��
0�<��SN���'g�y���_���b�jfa*A�-8Z �9$�s�.5@EO͔(�#+6=皒��O��(8h5Q�ގO=m;p�)'C�"���|g
)����A�as_	0�6������Vy@�؇Hp���([����U#,�m(�$�D�T\�w�ǻKde?���Y�y�t7�E�sB'?3GΛ0�&�A'��Lee5K��d]���X+����Bn�B��i�@�=@�TN�
l^_��$][������tpI�
DHEڏ$����k@�9=�4yl[�$#�/Z^��p�3i�?@��c|F�5�"hig 
�{���W���V�WZ+=�}n�T"��g*!��@����z�I�t�=�d! k�����Y(S�ڡQ�6�X^O��c�&�K{��Q�� >���r�BT��9ۇb{�W?��&<�QIG:��yq}�6��Ș
�K�ߦ���7#�����牬�軩��o��)�aVM��������AY27��xAjH�I.���H�3�9��e�����S�"F%����0�	G!q�E)�QW��+�I�i%�ytsW\s�ٵƆ��eU���
.L��(�]����{�)K�!Mq����F�n�O�F]���0�0 |�Y��+!���a�&BlЃ�[����m��.�Hr�Za�\�������oP�[GʲF�f��.LZ��쾣 �NG��ZȮ5چ֖uh�"
V�,#�J͂��&N��"uè�ue���>�Nϯ��Au4��0N�9�Y"Y.�y���4�VB��wJ�(���mܾD�\�+)7+
��&dq��(��i�&S��������cz��{i�i
�Iq��2�5 ��J�6vZT*d�z!�X9�,�e�1UQ�#�,@�\Ql��p��:��q7Cj��N}'~����<���ߤ�l�p��GgF|��C�`�	.؍$�Y��nzi�2�bOJx�v�1%>(�z~�����"�r5��p��ZC�0�%|�?7(�d&/Wڄ�6�=�cf5�}�-�͂2]�d�1�-H�f���&��^�Y����Ef�������7Y!�f����9�wz�2�,��i���^1?����Qj��mf���,���uiM��*m&�]&�8YS�r1OY�J�xdÐ_�h��@3lGJq�ާR�}�/�,"���_C �>�H�7�s1�CǬ[�����7��������Ԏ�u�Fꂌl��ğ}�2F�^��|M�͆C/�]\��
�
h��+�?`����g������$U֮JWDB>�Pd�"I�äH��p�����{)	~:����E$m�9��	0�s�0x!_y��XM]o�@I��@�A��S���+=���
~�)�#�?�:LexW�/��0��GR�4n�t�/2��@3�=ޘ���ε�__�ӥ�#| "�H�2��,x������S�Y��:��VA|h?�P�T#��rye��4�%Ku�<?K׷PHJV�o7Y�P�U�=�^d�����yj!��&��X���rVn�撴FS��m��c�i�-���䎥@�R8fr�#� ԖpJ[���C��{_��o�ߤOp3-�I�������[�����Gבh1���v�%�%k1�{�Y�:	r��Bm��ܻ!���l����J�6[2J��JnR��b�}܍K��@�И34��ϵ�e�H���B�xRȝ����ȮP�A���ښ`v��Sf�,nP@�I�I���D6M#�;9bR��#���t�Zב�E�	P����%��8|)�E0j�taB�6yF@yU��F���F��YC�7�/\����їeI)N�H�"��&W��v6�0 ��_��K�����'�7���U7��ʴk�λ�܏��D�Ӎ��s'� "�R8�O���
.��1��}��SdY��d	�q����޽��u�҆�خ��z04���+�nש�)��J'd���m0
��	�C�A�l��MWk�#�LO��ag{��^�
�c
�{�!qlS�����m�5���tl�_pJ�p��W��佛���j2SG�mo��U=�>�����a:iq��.�����N¬L ڭnT}����s�a�s%C����b�Ղ�f\S�H@)u�����Z>S�TiO�GLO$e�HAZR:Z����tQ�v~h�=���k�}��:ae۩#NB�X��K�Ԭɏ��ƒg�V [=ou���6ƅkSI���m][�we4N���+!A�E
����da`��M�8�)p+%���C�H���A0��M��qL���	8˃�f)ԁ���Fh�‚�L�2˪`�*��4-9B�9.�8�x�ʴ�\��MC�)N����/���(變4#�����X��'���sҤ�L��/�����s���"�!�����f�'+f��4'��du��\H�t��fE�WBi+x�ϊP�=Gg��4R�ܹ<��H���1�D#SV��rۀ�'O�%�%�,2m�b��0O�ġ�]-,-�
H1�ΤK�μ�>�����.~��4w���jz3���/#:*��t�;u���^-�N�-9^�p�d�4����l�׸�(x�i�����*�2(p$U\/�T��(czFj$�w5q��O|�4Z"�h=��r7��*5����g�}o���6�K����7/~����q6��F[ܰ+
�O�V�,��sӞL:��̓_8}�m����r����{�s�P����b�:� �.�-��1�L��g\)i�dV���tus�N��2��)S�L�&�^t0��G2Zp��.V@��I@����6nM���il���ȾJu�4����æ�WTr�[v=�fY/cJh�^�� �Ҡ�J’rsiԤM�{�����t��J*�5��q�S	i���z��t�R��5����iC�y:x�!��D)S'WB0c*���e�5�6gh|0���,<�!���ι}7��d��(*��-����`K%0&�o�Ӄ��p��@���*��u*i9cVa*��$��J"A-�H&}��Wep
)��t$��Y���"/��bF]���y�Yۑ��"K6�Tm	;&ε�U����	UICY�@�߸�ܒ86hW.>
>�;��#l�dKV��4��y-1WH0u=S��x>�4�)N�s�Fu��؇��Vҗ
h^k˅��[��
H�Ǡ�D�sP�8�J8�o�߼�Ѡ#�!�{�hv׹������k-��2�����+�ӣ���ܚxc�X�Q�F��#l�?7����6�/�� $Ί�Y�w�4�a;/��WJ�bq�lRf���R�����Uf5.ׁ&q\6=r;-�,8�n*���-����A:���1dM[ݼsPr��$�/�5���{��d{�O�J�~s�[Yo3�r3G.�"�����
7\�8=vh΀�
�mN����WH�Ֆ�<������W�A3�,s��V&�>�	��K��/h�Wްcv�Y��+�~i�����[`�Z�5���N�/�� �29���>sK?�5��bS���o�>�<�-�Ny�5�'�
�ݰ�W���hX�j"_�1�$�A�k�P���!Gڦ�r�t
&C�	���҂��P24��$wJ�R�������`�!03���&�cf�
�ʴ��/<A���#{L��Ɏm�?waa_"u��Ѽ�܃Hw��H���mn�5�-�Bߤ5�c[wi����ͳ�K`Թ��W��(	tx^e�A;�
�Lc�3?"�X�M�u�]�]a��sL_a۹��� y�/—��0i���-��G�{�4u�!�WZ
G7�XL
>��
DeE
}�^��i��?�M|>�x%�2G�QRA��t;Eۻ�Pl�b�ppg�Hҁ�JeY%������M� +�m�+-�M{ɸ?u�v�eM���{0����JLRBV�s҄\*S�У�x�O�.���Y�i�<�)�7�{xmi�6Y@.(�Oe
SI�DC��9ҡs
"_q��0�\���+�1;-f��#7��d�ٗ��ܳg5��Z��h�D�`�mK���ti1�T��r+c�
�'�픽�����P�d�X~�E>g��氅�Pt�3_���b8O{Si����>�G�ԓ���sU��Ty~�}��c)�7v̪�yT�Ċr3"�6��iZ���CD�D2h^����P߳o/R��^��k��bzB3�-�6�SŴ$}i�Ζ�A�<��PZ���%5�0�-":��?���2��4rԠ���S�y/�-ݘb-~jf��Ͷ�����V��ԩvW���i&W<��Пl3� ŕU(��2�1=���H�Ͻ�x7���f�x��^J�I߬���٦�:^�*\N���jF,�4�~r2%�o�B7Ck�6e�G;�A�V��N�ߡ����V*��Ss�_��ƆI�e!����,�|"ۂ��&R�N��xv���o
o����� V�^���"
�_ϳA�6y��C��Ō��Q��X��1����F�� |s\?U���S{��������&(��) ���"�(��wĂ�?�7��q�n�"�T?���,��,-�!\��4���Z��c9��9�eg��Fq�1|2N�p�zs�@JQ�HL���S��Z��H��(V�3E�S�~�h�&���R�ĩ����;��q�%���?�$�ܧ�[��lҦ>�����}R�#wRꇲ��� ��q���Q.��c"jmU�F{�v�($�G$��i�L���ߑR��͝c�k;d�w�n8��щ���)%���'��x۳|�Ly~�2��5K����1R8���,j�c�N#Xmo_☨V���Z�&G{�e�F;�0]ѣ4�?�Y�PB��M�.���{����Ja�)Y4^'̿I4��x����riz�9��OT�V��wfrv�2��)���A�Mnjb���iv��TI��&6��ȴ}dnص�0q�ca��lv�����kV%p���S�x�aj�[�J�O�!޾z�^��O譋瑊\��X8�d(��{˥�����og��( ��3���,XOԫ��q���vБ��<@}�^��K\z�M��7�c�x���#n�m�dC7����"U=)��V�Pf�S����G���t�����GK$SSϖ��� �'�]���%�t��{����
��_�9%��hf2'6�G:�2�Gy\$k��1!�o��mh�Y~�^*�j�ISv�ꍺ�?`��^���n�9��SO���{��*`t�x���:�;kWO����=��j'�F�|+�<�N��Ǎ���Z:���!�Z��i��ӆ��*�2W@m�Sa�|���}�7&���F���~�t1W,��p��f�~̆"��BщT���ȇ*h�jO%���{��<���9�F�J�V��
:~[�{��.��IEND�B`�admin/images/mircea.png000064400000036767151331545640011101 0ustar00�PNG


IHDR``�w8	pHYs%%IR$�sRGB���gAMA���a=�IDATx�}�s]�qe���v� @��*��6Z�EF���Ʋ��q&�+IU�惭�@ҷ|�=U�L23e�<��d&��,�=qDy�,k�,K�(Jb_޾�e����$HQ�/��[���_����k�o�qq��a1�þo���M�����g����}[��y��ß��a�ߝ�<�Y�)ێ���6r�[x�[rP��T�ː{]�?��o�<^|���'x��_�n�i��B!�/�o�a�B�����S�㝪Ԋϭ,�N~��Ĥ��QP�^����s���[g��/r�.}�!�O���!�jU����ONKneU����j5i4��Y���%Y�e�6-��+���ɞD�q��<�̉I�
��[j�-y�B�j
h�緞�7Ǖ�y��<%��I'����$�rY�HT�\�)�BAL�+�6��4
�b�u��|�^�>~�ԏ�����жv��������SQa��n�}���[�4
%y��������k{22< �bA.��I�Tߌ��jVW�֭#xCN���ui"vԛ
1,[��$�q	ٶxMg2��lz��	���E粍��ů��}��ѩwR��g�w�r�x���'�;_Z]��|���~�rϑ�2ѕ����̌�a�.^�MJ�0%�I2��l.'�#
��u%�@9
�Ob��J%Yʭ�;987s2M<v���O�||�
���L�۲����r�(|����z�(�9+���_y�%Y^��QX}2!�ׄ�\�:?-[ƶ��7dfq��nH4�Z�.�RE����
�u�؆��)��㧍�P���L|w�Vi<69��	���D���;߀��s�{�f���䯕rU��ĭT�矗��I�/.I"���!�f`��e)U��+9?5��w�^�b�"�rE?+
����\��������A1��:\���D�dX�	��&'OM�M>n�����p��</s��]Ix�ޖ��e��9�����	IaiQj�e�2�EgdzjZzSii�,)�y�T���@?�����?|��J5���g|F��>�ܜ
�p88����L|VIJ&��Ǧ'on|��&�z�{����mhEx�¿MH�	a���g�S���⢄��$��ůWellH2�25?'�f�cp95y��oJ�=6��x�%t
ն�Qps���
S?��ل	�Ga�'��QQ���T��ij<c�mֿ=�?~k�)��r�7%��)+�.b|_o�}��IЕ?ք�hh
��#w����ق��G��?<�\MLb�'�āfM��t�B���%�ꕁd���)i�y�zM�\Z;L\�6�e�p��êm��T*	��Pvnh�b��yf�\��`UQ�tc�^���l[���ON�<,y��a�x���7L��u�+h-ua´��o��_KnaA�+�ғJ��{ge�'-!H.�G��?�����eaeI�@9�U�T��]����-�rD<~��c5�wX7WY�V�2^�8��!
����5A��:A0f|���;e�����s�Jn^���V@�ߟ�豫��7�g�[F`��<'o��%�=�.\�����o�##C}�ۦ��	Y�������e�-�!��L��쥐��==X�ӯ��D�[’�X�� /-����@Pv]��@�&�C�T@��2��`���AwER������r��
ǀ���5[���Z�-��%X��{�+���wKndu�b�ѯ�i���T�B�����BU�J���A1 �cқ��MXySQR��u!�CL�u�#�)E$�6���Ed�9��U@�<Va��a��s$*�BN)�U��`
����D�g���:wò��c*�{�U?������Pr9�8�_�(�o�Z^��sR-"�5�b@nSH��H���#?}�e��W/窰r��zzz%k�U�P�+��%]�Dc2��'����XmZ�#�q�� ��jVMY.�d�X��
�+1	�V,U�57�E7�]��������^]!���WWg�[	׽�
΃���0���G6�G@+�{��ՂX�Y���̬���g�VX�YX���~M�^�=�[$�0��f$�k�1���� A��h.�����gA���aK��PB����m�y��_�ܪ���$���@�)Y�C\����fK2�d��nB�M��ƚX��rM�3�X�񍱱�����\�;�.0�b	���{�6�
I*�
N�����,v�6eeyU���۷�â(�[.�=�ݥ�2s�܈AF x`uI��{/�U3��ҍUO�!l��FSW_+�� \��H"*�RtD��$��d���p~!��E|�J3��@���iH x�H˸hh�-N��:���;�NmV�V��lu�ܤ��d����r��/ ㄜݚ.�hĖ�3�%�;�_�~]��vvn�.�bQ��Ń�a����n(������, #���$7�P��6ͦ�C��C�c("�%��� �\���BlI�Dz<
��"���Xm��T����"s޹s��_�ʃG��ч'7#�M�PM��Ps�C�r� �2ѹ��5Y8{Bt��仲md+�s��|h�^�:�~N�a�nC�AM�=�h��P�O�<ҝ�Q$l��}��$a�I$Sb#��d;q�MQ��|:�g !�i�xz\�B�Ď�E_<.B[��PǪ�XBTo6��m;wG�������_8y�v-Qln��#�Q�j����EZ�@B����ϥג_]���-���U�Y��L$.s�s��I���R�	��!�ʐ6�n2�'��+.�C�gl��	�G�)E��z�g=��"�(o8B��s��>+&�V�}���s�C��3z����A_t$�`��RT	p�U�4����c������p��mH�)��6�$�a� �<�{���
�f�ڂՕ-@OP
=��ݐh�L"-U�:��@�w�!�n��mɸL`���>�hP}>I5�lj�p
��2�V�lEPs�R`DY�	1X���G �#��=ƚB#F����U�h�M�e���؎�T�ןk���}Ï߰Z~��I14�߂5����4�
$�ב��$�XA��=0$5���93���bIP5IA�Daӑ��V���[�e�V�>*��2kS4������d7�np�G�tA�TF
�)�g��X�3�����.���^'"��;Ś!gg���~Jec� ~�Q�24,�x�sU���1)7�8�G
ٸ8~#��b;)��v,��90����ʒE����ۢ�*�����E`�1X�X��w�6����X��+����-,_�Y����K	�� 7�Gb!]U�A�+�0!�&S�R��5�5}�R��hbu�}�!�EY����*`��m⢞Е�B�'�)W��W��\�����CC��d:-6QDh"�b�7�:�r�|eyh&
n�.�I\�"�H��9|Pn;�02->$W��}�!
��m�xC3Z
�<�����+ctS�-\�F!�A�n��Qۋ�'`.|�i�`�!�c�I?���b�����`u �t�.=�<�h�@o��;K�c��c'�zp�\�����s�_X	@s��)F�pTCA."�|�����eB�$����%m�r����;$�����������
9W�
�|?���VD����"݀��C*��S�(��3�!v�a$sx��������c똼S�}X};wˮ={e�-����RgXZ��I}'2!�U�Z��r=F�zTJhaG`�BQ�6?\DVʥlA�JNy�5a*��	3�!�>&��I`(��ƦZz�@�/����RNΞ���E�[XQi��aXll����Xi3 |�\�	_~)�kA��}
(��԰�Ӳ����E�۾S����}����h�ǁ�˜<�w�����onJ73�nt�Yl����FF
�]�\���A,�|�oE%^Ƈӭs���e8�%;w����rVH�8�;���Ճ;)����w���dW25�$�J���x_WN�}S���t���2,ۻ{dPX�P���B֋���\m��\���}�}�ѻŃ��M�Ⱦ[�$�z�3A>ub}��e
8��\h����&�:V@���\�.HP4����	��K_�V���<��Ӻ**X5�	�:�7�Ks�6	%���ǻn���#0WOf�OJcyEJ`O!�n+1��toX�/�,�)9�������Y�Cܸ}�8�-��}ZK`!F� ��3�s�U�Bx�Cj�(�X�O����q��g?��d	��`���:2N�m9�ͫ*��kfT�Q��I����m�@=?{�Ei�r򇰠[����+���/�1�'��y�Eᅽ=�=} �²k۠l�
�>�,wEl�S+�%\	�(��fh�9YZ�J�Z�e��: �ظx�,~}�����t+2�գԂ
�Dc���y�B��>q㨢�ʨ) G��$�L���m2:8�APgI.*��*�\�y��(+��a���rQ�A,�b��'²��e'0������A����n��7�G� �����2��M<E�Y�ѱQ�De���k^,�=�e��wM9��$��r
9�'��݊@�_Pז��:�I���wXG,X����_Bbf)3ʠ^S��P|��J�N|f
OB�v��7����E�H��n��]}��ѥ+��z_�p���6�һ�]nFP��E�JC�޲G�<�3�?��a٣60=)^iY�o���6��K��<��-��2�}9DD�EP�e�m��/ܨ�a�UY���W��ޝ�A�T��삼v���sp�$!���Y��� ���a"'�u���|s�{��~	�ȇ`
P�Q�)���A1y�'�x�yY��"w��.�ф� T����ד�)�Y/d�9�R�T�<X���Qy����}(/��e+�g
�}{v��i��uKCz
;
>& '�I�&��"��F��n��H"�Eg˹�`^�t�zL����ʋD�
��)}(����b@A�2ʞ8�*�펀�vU@]n�.)nӬV �ڶ�!#�l%{�Y���f;w���e��0n�hL+׷c�$�`u�d ��׋*9<"��֩��_�&o������r��J�+!;w��H�5�j٫cZ�>Z��2Pj�D�`��<�f���=Wf|���~�
O��BNBP��E-��L�8��.���ғL��ªL�_�<X٪�reMV�M��h� A~�<�*r�~,�D`0['vI1����A��e��/�5��y����AdK�B�ª8�.�}�2+�;3-�E^ꀥM�-�|t���V�/id�DP��t���< ̞ش��p����s��[�F���jaO���^-�O=�/p)��'�����6I��k���j
��B"X�m�IE ֠����O�e��ԧ�J����0r�
0*��$OEj^*ۤ����#J��r�U���D�_�<�V/��h���@S}}��JK�¤� i�7�Ed�!���A�+R��dd�v��'?)��x{H��Y)m=f���x�c��&}q�$
b-��	�V%0�w��ν�+��U����,�V���v�d(i�Xw\����6�E�9�,��J�3@U��d=�h���|!+O?�`rS�.���G>"����
����⟬��ǂF��
��cm��-�N%��|���Ns���KU�~T��gv������b��d+�Ў�2r�$P+0�`*�U.�r�h�I��A!�A��tue�pET��}k�����Ș�G���JIf��e��TԐ8,��l��1��K��|��
���d�#�Ɉ"!f�EOʖb�A���g�#�ڳ_R�C��R-�_���u��=a�dtL6}t�ɸ�b���PO�=���t����M�������K��!�"��=ci�yU�b�~C{�؅u�y�&›PSr��m�_�_�d�l	��$�H�J�h/VU�w��P�ԲeT��z]9�Մ�R��pOw�s����w$��n��c�]w��t�Gn���a���'�x�{�a�*�<�޻U����k�X)��\&/����_�:����[�̙����2"�\��":K�dY8�fZ?`��ԞN�%Jr5�0 B�z
����i�od��D�$1�(�'!�0�
xKtT�lEZ�\]6�J��=C�~es�R�� ���Yv��Ȧ��^X�c��|�sX>�c�!�E~��/��߹CF���+MsU\����X���n�H�ł���='���fL�|Ԉ
�жDdZ���\*��)I�g#_A��.�kU��.�{'$�2&�;�t�>P��<Ӛ0[ůj�-b�ű����^��=�c��m�Z㸎c�����6C�$�턡�����`+���`�~][��@!|#n�X����W�O_zl����ΖW�L�(�EF����A��D"!mC!��PG�B����]Z�JQ7��t�����2��?jc�D���#��� ����Q��:Ps��h)��>d�]���, ���@!���݇��֝;`�-��Zk+�#�^*J���������n�V��ё�{'�n�c���|�)�˿�k��/|Fz���ܬ��e�b	�z�hヲ����k��g]�X�^��kju�2.��#r �j�eܼ,�f%˧ۘ�A��ѐ$����n�02a��̸�����AWz�j�@E}=I��8�Xȭ[v��9p�\ֆ�K�%���@.tfd�_�*c-�^���M.WzB����b	��F^V�����#ѱ�.�z2��b���fJ
V����A|h0HW鋰���L�a�9ԗ�L�,#�2U-�Svd����춫��̔���;�e�H���!�22�`i���=Zٔ��Xݶ�22�$��ݲ{�lGv���7���9�6�evZ�����yG��;XY�l#��'��F�7	4R*	!�~��a���������K�)���A`1Xt�k/��da)+SKyy7[�Y��
ʌۀ�w��)C(�'�×N�*?}�PpD���#��srK����@Bu����—"	9�pA���v���(j|�%A��eP�uKS�!��+A�T�tɇ|P����"���,�	�&�7�C��a}�R���f�8�^eJV��nV����	<����������Ep!�l��B��-I(��'�x�̖1YX�U:�W��*��e9�g�̣>0?�J!)�c�$��v�Gd��WΟ9/�dJ��D_?ܖ�[#H8��L����.�//�(	�2bGLio/2ֹ��ː���6'I'A+K�K���^8�a"3�$�.��Y�r��p�� r��úrE|+��JiX;�׳%p9���8궙�܍ ڳu��_��TD�]U�˯�VG2�/����<VSC�8�K5��6q^�w�˭_�CޚY���U��k�=�b�wASi	YQ�:� #H��E*t>ޮ�Z����@	��Od՞��e��3J/��`�f��Ӄ�t�{Vk�\�RC���6��+x�:�m��#��8@@{H,�tu�
r��w̘����n��T�Jl�\��3?��?�"އ]��	�m$��
\R~fTtZư*�Z�϶\�pe�]�H�6O_�Wzܿ(ϵ��U;�.>�Y[�w������F�3�(��:�$��iaiv��!�64qc1�Î�zk���.C��~y���Gݹ	�;_����"n[RpeDA��~��Kpqye�X].�Gb�D6��d����0Εzw�(h�Zbil��ktt�6����q��X�z)_��T�q����赇G��~ELI$�$���ˆ�T��PF�eU�Kf�4�":��H[�I���왫��‹HIX!��"�~0����
%���	�;��)�X�(�{��A�[`��/
�g �+"���yU�݆ٶ�+��}mS�\VZ�ތKZ{�	�%��(���/.i$cȄ�F�m�n.,���*����e�"rN@������]0�g��>�:���m(�#`#'���y����`8�9y��o*�6ԛ�A��a�{�~Pk��5�r�߅�
ry�
�%�r3�S$�QA�cBpWG��ٮ�^T�qY����3I��-Oz�32��Yx�����A��c[I���ܺdW�'Y�l�(ո05�D,-%\��4�%p�⣺2ړ�C����Qda�P�P�Ξ���:)6��?q��)7enqNj�PRL��rrXYyrT�8�J�����}�;+	:&6U���Ʈ����Gg�@�U�Q`6֕��#��G�~��g�s�a}&�;�yk������HOHw����Y�A�ʕ�P��0�G�@?\�pE�"������R���.#(���s��S�,���8�^�*��4ӈC�O"�J�C�����G�j2�NW9���;(\��bl�6w:�a�ȃ�4�P�$=?؏K^(���2�G�@� �.�f+
�䖗c20Ї�"�E�X��'H��[�{��b�!z���^94����8Qٱk���&,=&	0����0�%>�8p��;�A�E�]-<^�0��W�M73V��
 �d�nT�€�.apk�s���2s��aY�(�G�b��������۰�L��	#��@g���SB2 `�	������E�"�<�� �n�"�&��yy�32�߉��mMؒ`8���^(e���C�i��P�%,S���� �I|�?%�:�F�Db.������P�+�#
��Q8��'�N��\Y]D��	�9��|�����|>�9$�~"ٔ
������1{�\Y��-���$�•���&��L�)U�G
A��>�����q��ذ䛋xr���w�����Hΐ�̵�0�<u�_�"�ڞL�ytw��s���X������
s���N���#��08�F3�#�8v��b}=R��fa�����(�5'9Z;,67bq;�Ū�'�|��,� �*�EY��r�t GQ~�<��&W�c��'zҲ%F����8rn���{cp���D�&���J����K�)���6z�lp�Z�7�])���uuSjoz㜞4�o\>eK�<%�l~h��!ϝ�dN3x~Pn��"����Ɗ'!0�[�G�\E���(�4�l�e/��C��C����Z+ҪY
�W��22�4uBk�4H�}�e��&mϳNY렋�h�*.�zrG���#�/����g/H,�p��[5en�n�n�&�eT�P�%�䔴��ߜD^���|��yIC���n��f+%)�Y�ps�`2#w��2��h�cLi<�O`U
���F����)`5���ˑ�S��H��Ղ���b�)�X�$\W�5�ތ#4�R��H��NBQ��i1%��9��f4�k���ўvFp�59��%�a����Mv!J�&�ג�r]*M_���̮==8 |�$�j��-pQ�c)��3$��%��sD�N*���
�������ԭ9*�#;�����1�uc�@Y�-r�W��{<x���kkq�5���-F���F��A�Z���O��~]%�c���R����U*(��j��+(a�,.g�Hg�@��h����缷��'*��pFe�Aq�ˎ�j󬨌��A�F�fC�67v@�
��u�;VC�oXn���X���3pGc��޸��u��f��?�C~1��r�u��S!k���I���i^�!>��t�`��Lwo�f����H���oF���m��ύ���wN �W��Bx*.Q��%��(��jY&dlϖ���<WB�$�*�a�d�u�Z�{s�@�*���"Y���z�q�C�%C��*�+aĔ̠�{��$ʓ�R�n�>0[
g-��%�6�Y���HV:ΠEEx'!�;�`\����3Pq�_l|�,�����礛�M�����o=W��M���`=��ǃ�	AYl+�$+��s|4�Pn�}�@Rn��"Ӎ�݄�"�h��>�(7V�i����VX�#�F>Ѓ��d\�
Z��{G�;�َe*�KMӿ�6�'���TF���db��k���r�T���(����Mnn�a
�.���$�/v��CR�9/.���Mu;�\�M!�����b+��A`U�܅i�����po@���<ضNH,U�Jws�S?s�%�P�s� �V��,��Q��,���*H>p�:{%�;?�	����m�.-x��k�'��j�>�)�`�c0��M��T���;n��lJ�y���Nä��%5�d���.9����5�Xpj~�Å#��U�7�|��	�>�%1��
�h��ٌ���~����67�a�Pㄠ��g��
VP�xB��w� .L�/K�e��A�۳O�����Z�nס����ur_wlrM��~[�f��';��u�JE֘R��15���L!D�2B�>�^F���n�*�|�wev��ؐF%�hK�_o��P�1�hip���yd��Z�JX���BI)W��AU�����`"
N'�"?'t��J��+��Y����^�*,���(�zw�z���?���-:��v����w��s_c��s��e��铵��u�<�ml������k�� �Ejx:��n�	��V���^�4������O~(}@Ei����4k��^XΕ��g	�t�T��Q�)C�>qY�P7���[S+�m)3kX��* n�wtH+gpD�䒾��9a�dވ���-G���{@;%��jZZ�%2^�Y�����nӝ�7��K՛gW��;�[�|�����c��:�g�D��2�`�E��vK��y��2�p3��`.Lɛ����*��x_X%��E��
k�^��<!P�)d���:B2�P�S	�V��F�ak{�����QKS��M$wq@��@��y�]rn;���Um�:2��/g�nFm%H�d�)������D�K*b�b�1;>�A)u��\Q��8xwr�d&���U�l�<�D<��]��S��=M���(�-{d��Uy��I�	�)f�h�a}E{~<Xk
���Vv��u(��+�Ή���/���3�f�pʡ;�b��pQ�}r�������=���EM�m�}.���8��%��]���[	�Ó�^��;�������N�ˍ������������/����WK�K����.y��<��c��ؘ�R!�X�̶�2�~�g��0�+� \��Y'�1'�8J�Y��H�0
��¡��p�gU���Q��$�jv[��:`�$�
:�ӟ��|�}�K��=~PP2�����X������3y�
�+�x�o���5�:�P���A��s��F{OO�Es;(�]b^����$%`���T[�Bx}ÌJ��ò��g�I�P���6�rL�e[~8cnn��$n�e�`,hF+o�@�@^�����g��m���{�s_�c�u�h���<��)�D�b��aɝJ�Q������u�L�~�m�4'ShT���<f�E+�(?�F�
v��v]��0�i�Z2�T�b�.� $��7ut��C2���s�"��9�a���M\Y.C�E�x8���esj:�3��(jө�D=��I�dB�/���lEi1���k�tڭsr�{�u���җ�����,�?~$g8�c��E*�(�T�wً�zr�Å5S��a[�C�s!��XE-�3�n���^;����y>��!���%T�p-.7��ƹ?Mat�r�=;0�^Tn����>d�����+�����#_��?��-�@'|f�cSb;�l'�7����s��g��9,�q
1������n�_+@c�� Cg4[-�u��:���
�w-�k׀[HC�[I]���&���/ɿ�K	#��{qI# �e�g%q�s�7D?�B�Q�\�,(�Ў
�s�a������n�
�·m� .&ZF��^��P������F\�/(l~����*/�}�
W���ay*|�nh�gG#JsA�����
* �m<-(�s|�@q�F�l6����O|N~��H��m�M�Wi
��4��y~�`K�����㦧팑�A��c���G�Z�VC�9I��R?���(�+Z?�+����D��$w��
��ʐ邘}�
�Y�Ō*/��;�j8&�K�H/��	�JoȚ�DO�s�u�W�2�CI���I�wL
u��\S_�`���+��Dҏ��b���vwI<�zn�ܻO�?���ڗ�Ҳ�1�W���<[nR��}才|�5�:�ö�EBiqAպ�r^��~`� �ٺqfas�'��KPՀmi���:aPGE����d3l?\"��[`@���/���{w ���A�]�-Wf9���,�4/��Q#�=�{�+A����Z����0ׄ~���[
�㘄�>v�'\UǏ��<�a�fON�o܋��42G�p�#��C�E�����&{y���{���٪��0��9�Հ{��(Q�p`�=���Ի������}�����;�N�
΅@�&�k�`dF�ᬗȴ������nQ�+nȦv>nt���)�+��
���}'�����p)_S�o2}�њ�����Y3P�`bI��੶����v�0ԟ�&p��1J���2?uAf'���+����xH�—��7҅��r+�|��MM�w������``�4w]R�L\t�`p]�v��v��
�����u����\Ϧ�#�<Zw���I����{����3I��mU|��p�CBp�(��u1'j,�"��v�٢4�y	�_���,��+e@F�:��MC��>����w����ܓ'���ݠ��'̃�^)� ġ=�ϲ�xu�}�i���#�U\��b���s2T=��'n�c�~��q����`���i�$���z�E6�+_�V�n�x*���e�=k󀚓���K��%,�&�aj��^ߋP�h����=<�
�#Ź����]����'nPG��ܡ1�!��wo�� ێ�{���=�c��Qd�ɺ�	�2{�dl�L��<~-��>6}
��~��r������E&�x�@ljv���yj�Zp�b|��55B0����ܼ<�����/�X�B1���7Xkh��a�>��%��p<�BV��oH����%3��@c��I���r�ȁ3i")c�OIG�@⭬��ȐDp^˿�@Q0�DJ�3;7]���Z�_��I���i��q]��w�f�+_��)��01�>m]ٔ��������2M��B�U���'�^��g�Za�ZC����$�8H8�A�+)�xXR,�s36�����?Nj�E�!X��X����D���ژT��2�)��D��m��/cM�Z�0��&��mMt�|	�3r�u_E������?�#�~�q9!уV���2�`�7n�d�n �`��
�\�
ɹ}���b܈&p���a��Iy׸�8�Q�Uϝמx%�$S/I�9�	������R#���5�.��-(�ιC����ʸTp}������.c�?��o_��?�j�S��U���:�ʶ֖g0��ֈ�ٚ�l��&�`M����i�}=N�e��͚B�#�6l[�Q���r6X�<�6ʓʓp	ꎖ`�W$'�p�6%Nr��e��d&#m�����0:���E9S�7t����w��{��'S0���ܲzK-�l���fZ�Z\ |�%�K����|�R1����KcC��I���ɣ��ֈCX�sd��;k<Y `��#��X)m@�������q`_,�T"�"b����hx�A���!��o���s |ݖ�>Ly����'�J��[.O�6E�[T���l
��Nr�gā��EC�8�R�	IE�^)Hմ��	��}�$�����a��x8�ZIG4��(3�U���ν{��m�1��b~UV9؃�aYQ3��FIK��������[^�C|(�/խ�^ڷ�LD�o
�P,:�cX_>(��W��
y�q����@\��������I�q����P�X�J {F��6�K
熆���J_�����/�l�U�'
���,jܿEΟ��b��R�E�fsRee�bgaoR‰�Ā�B�~I�Jzh�����(w�euqI�D(�ډ�s�i�Gvw�7}��+�R�<�����?y>4Wtw���+5���#d���D��ITF����N]e��ư�n�O�
����@����KUV/Lk�n�_�Wdf5�U�@)2-��-��=�elb��O��ۑS�KYz1�W�ȗ�:�1A�E�o���/�
��K���v5���8�����?<J|��s���Y�
�Q,�<!(�ñk&LA����?��]��9��fu9w����X����"�u(��8h���t�\O�_��v���(�1�(kz��Ne5��8�r���� V�n,�k�q�?��}�����M�[��O�:�;���:��֕u�gk��n�`xEF�]�'�6Y��@53^p�:60p�m��h^M	q����W��4T�F�eT�v�= �>~\�+�ZEc{Yiq��W�2�UY�ޜ	���Ceۡ�!t�lл�)$�xҩ;o6����Q@�x�����q�~����V�0B��
�xsx%k����P
��9XmL�73ǐ��ڋr�ܛ:�����J��J����ȯΞ�MJ\L.�7i��dk�J��]��G%>4$�8��q_{��L�(��]�������??��C����b6�j����ЁRX�dF�M�l1�@&�̼�2/��W8�ӳT$��[������GA�dn~Jʵ��U���!֐޷
6g�o	��d�jJ��Kv�vH-�h�怬%���ށ�
a��9>����x�!�#��8�:���9
��"JEhe�]u�HI�C�H%��D�ٲ��d�U=�*��y)󪫵�^|!_lH=�������^n$�`�H�xE&�{����OH
E2� �&a�߲ˡ�۾�~�U����/փ����x2{V�g���
H��)gEp�
G��У��,[i���d��)�@Y�#n�S(�)�޲U/Q��˯ @f��8na@���"c�k�2t�خ���\�(�}<����D��ex��c����#g�#�%��K�dh1�%PO[�]�_�<$So����/�A��0	c�
��]'����������~rϭG�3?4k��*�� r@=�s+�V�æ*���T!��Vu/�Sš��l���.�rA���܊^C����:F\F&vM��|�䶁��RQy�>�z��[����O����sض�î�[��
u��a�@�GW�P�yU�F#�-����C~��T�ќ�A��<��o�V|��e��F�]SIEND�B`�admin/images/wpcode-logo.png000064400000022451151331545640012041 0ustar00�PNG


IHDR��h�	pHYs,K,K�=��sRGB���gAMA���a$�IDATx�Ml\�y��s�ƒR�C��-j��"�e
�"Y�5������h�!�dӠ�H�h6)D.Zu
�����e
i Y�ZĔ݅��.ki��$7�=��sg(��{Ι�7w��(i.��o�y��EY���@��i��	L��(�����v��L��ʪn�p��-�h���e!��B"& ���{z�-M$�����]x^@�����a�@�Q,�]m�ɳ�a����S�#}�&`�дL�P}I�L��'0���z\�̟/ �0��H]pG!���}5O���.@Ԣ�.D�i�"�InD��x�R�r )�ĠF@Lp""��rN@@�xo  �
����7��@@�x���D+�η�����Q�?�/ ־O��V*"N��!��O�¸��a�ݳŃ ��ƻO�辚
�,�9B��)��05�^��_��`�%�Xq��ݷ]�D��`؍"}E�^!M-R4 ��Nn�}ܣ
h����B���Z%���Ձ"�KG7���>�O6��+��t��D�Kr��Cϕ�/�?ZU-�?;T��_^}7!��;`t�$�nNQ爎��6)������>�i<�>����<���J��~�b~�l6�+z�o��~��ϼ~�����f���W��DZ�/^W�6�o�v�cu��A�u��QZ�T8<?�e~ �T�>��ۖ}"9�>��$���(����`�H�MHw�<��`"@�hň.����?��Z�Q�>�cJ3���j��9}O�H�:���D#��.�;�/Nr��ʠ�D�x�����\�!�~�Q����'~f�k�Ï�ȁT(�F(�zIbfk1ՌQ�.��.�T�IOXT!E5UpD�c��p�D#�(�|��A�\�A�E<��z��U*�H%.5��d�J�c�xF�����˶&�R/x�\U*�����q�G��~\\X���C�nm� �|���w.^^�^�s�h���VӮc��O����G�/D����;JEW�8�{x0Y�Ф�<6oѹ�:��›+���
�B�vY��,D��p�!���ș�����g�8��g��GJ�����B8άC�z��E�O��Q;{	��3�8�LkaqM]0¡�(��\�/,�G4ԅF	)��  ĕ����V�HT���}��KEPiѤ2/KD���O����H��H��M��:0�V4IM��G��"l�Ө6��k�M�7(������
�`�{T<h��
�?�M2��:�L�Ƈh�q�CA�]&>��U9}�&OX�#�w9�vp�P?˟�D�$դ�8�����*Z��
>/y>ȢQ�ɛ��!PҮ�u}~��2ۿJ����ݑ���J�V����#qS[ED�^_��h���t9�
sJ�<zDޝ��ï���X�}��FT}g���w���
hL
#�x2����OKZ���S�b_u��U��έ�ka|����9�[��~/�(�1���=<ܻ��}5M}8�KB�,"n�R<��CuW��\��T]�Tx�AR;���W5ʨ�Z��ۀ�%�����]-�U�WHQA�)�Ha�bY!œ�ߺo+ˁ��I���y� ���p��"�VȢj�V�0O5�Yώ�ݧA��t$̩�K
�H�Xu>W��(b#-�<����Xy_v]�ߧ���Z�(B����"��m���xy�{���.P�+�#I]�Ov�M��<���)n���AG��O/��kZ*i��M��-�U��{T$:��TL"�~���[a����*)m%Ӊ����5Y�����np��eH(��o�4��X�>y㒾����?_[a^�	��o��1�9x!��H�-�!���T2(>8�_�t�k��4">&��0k�d9��x IYT#N2����Q�����9�z3�B"��O��D<HzĆ���oV�$O�9�E&$�n��Os}�"$��z'��5�hSJ�dm����֩��QDPS/ ���O��Y�wu@D��)�E���3���w�҄[Ls�w�TZV�<��H�a�ͤ.2�8:�9��~�FDm�y9��{L/S/ �^%o6����)DD /�ȟv^����oU�>���0�TV�o?U�_��]jն��i>�d�j��p����)!�c���n�z?�O�Γ7��4F���t��*�IMW��4���_�\Ɉ>�|2k�&���5E�HJ#R�U��<��d�Z@\)�AV�"�q�$o�Y*ľz�{E��V�i��'�"QD��г�zsZ�aWRy�Y���
��z�/Ŀa��1* �_�])���)�;:�S���}j���0�/ɑ��s��}�C����
����""\�T�$6���R�r�_�R���b�%o�>�/�}�L���wB�pfjDH�u�՝�VꄈpG\)ɓI�9'�����D����P��2��s�E�-�Fv�E��>��T:Q��X�Y8K~f���fRY�D����Xi%��rR�I�-�9����Ԍ�.�>�����Y���>B!g}��*���G{�`Ρnf*D��Y�R%!����7�vIOb!=�}u�$)���PL���J�߱{ �&m�`��X䞞;O|�<�WH�t�n����x������L=K�H�M�>�3��b��G%K,��|m:c�%�A8����1�K�Q�ɜ:!œo�}
DD�H��ҁ��R�F�#_�U��B�'
I�Lw�注��#BJ;	��h��w�Dk���̚ܛOe�~��٘b�6o�UJ>g	��[�d�bB�&s"�t�D'��,d�I���M���.$k�Нm��v��c���%k,�b�V�$QΝHSW�k�$�m�$��HD�&�8¼��=[.c�"�}R����}r,*`�N�}]���o���s��x��PQ�AN�)���V�/^^�){�le�s2�e��h�����qV�s4�j�:�w���9�1:u!�/+��En��N���L����C�Ʒxr�n!�P4�ǚ!���t[��iv�<�I)=���MTV�g�:�!��ݎ�3��iP:��@��T02^\X���C3�:,�nGˌ��PH��d�Bp���s_��]�gg���>�Q<��~��J����={P��`�ok�U��S�>��+�F�!��"�C��ҨGn�q�Dl�w.~g��9�(�3����1B�D�$��(s��T<m��;��Ǟ���:O�Q!��Q�Y;��*���_����uD�7jѨ�=���:p�\�篭��cEGơZ���IM�N����v�8&���/8q|�J�??�q"ij�O�XW�~K�Q����b��s�L�L��G���uZ��}��.�c��kZI�3ǽD20)	�;���W���t-��~�?<�W�e��#�N�n������oSN�s�/ax*
����"�$!׈��Y'E��ɯ�*�#�+"�H��ta�O�.�
�3�GZ���b�9�YB�\�w2""fW�]9�d�y��ZJ��>������H+�Ǿ�&��z���߆æ1��mz4g]wcX��i�v��P%��iݑtƃ��_�	���x���ݏe8�R���EQ|��pD��b����Tvj��"�ʙ��ѐ�ڤ^���e��-��{'��F@TY<i""��!�Q�K��K^���h��rݯ��u?sK���F�O�zZ�P��J��Q�}vCH�6י�2�MG��C�{�Ͽ��5PI:�����}�������
Zm3?K#!�&��h;�|�G������ea5�dxM{��z��u)��j����e�"�Z<�+A@�~�9"���D�
�����/�-��Z��;��}Rf<�-0���D�S.-�iw�xMA�b�̬�>�������y���q�m9+��P��
H[�hV,����޲��2{�.�D_����<q�Fu�c	�|��V��T-G{Ot�LE"�x��)�J^��;����+'zR[\)y0�Ax={;w�������:�p�����T�>���_���<9J�vġ`s>T��kN���p7��'Y�K�4��`�)���Ů�>����y��u�9�|�7�lu�3�D�w&D2��q�f�DH�'�
�P~^0RPܺ�ׇ�;�Q�D)z��G dP
q���N������1��vN߅!�*����~�@��%��fض3���}S*��|���ׇ�=ݜ*�}�jx�(#���l����DD�H�e��B`�'
�
"{���]u�!�"��xQ��^��G�*�ɉ��"K�&ǭ�2�������O��KD��v:#�$)�u��kଁڳK�\�>y���0����y�r���a8��O&��0�/��-���ND�E�1Gr�oRd��"b9�tF�걩�+�9p.ڲ�6�O�DH��GT)y�D�%�.!���^�cr�&g����_Ki��jR�ה�˫#Y���Q6��3?d��F!�[��ڠ�l=���i�����AT���c�d�����Z@���P��[H@ɏ<D�D B�?�@�+e�:iy�K�(=�P�gN΃���z�r�KV5�}���JA���٫MH�E�.Nc)kB
��͙�p�u��^�Q�aZ&��M�&�d7^�4F���[�t^Q-�CD\�Q!�R�Z'���� �v�x�1l��]�c�W����%0Y����i�	�[pqt�L�R�I"c��xY�AT���֢��N��R@�n������ր4Wʱ�����0�9'����쇠�ܧY]5�8>��(*=Sd.,Vn�+;Ҙ-��ۉ�[���A������L%%\[!����ʋIED�"�$������k_m{�7�2��B��?4�}�S�c���i��Ȏ�yc�4��n��-_r�sz�&��P�k�ʭ���&(u}#!�������x�_)�ٍ@����G�t�o��K��g;g�}�mil�����=�����1�ٺ��X��ƶ��){���ze�+��m����O��"�x��ч"z�7���t�h��t��BE�:��k3�V�f�IOb10zx�����_}�b��^H�2�:������ǜ�UQ���s��Π�4���Z���!����~�B�C����61��c���3����Y��}�S��oz�tm�R~�oV�>Y|%U!�T8�X$v.�i5c�b���*)���$��
k��.�����*��i5�3TK+�+�#o�Z�—IŃ�>��URC���̴u�8��e_�Q�$�Je�0x�Ǣf�"h�����ͧ��a���f��ў";K�gѲ�z�f��}g�$���ㅞ-J$p�U�T.�6g=���N@��dH�d�N3�x�^ӣ�HM�"�>ӣ,Q沈���$��8	�g�7�&E���}�#���S�˘����4;�m/V|m%Zpv4�%j�{!��uN��_�]�n3�\�+k��Y���l�A�bM���JE���}�O��o;���:"���c��>�����A�h˪�Qh����Z�R<�}Q�A67��a}�:�$ĕrd��T6��=���"��Wjk�e���nͰ�dhN�X^n�,�@b�)�V/�{M����<��5�V��y#�ud����F��R��ߕr��{�D��Ww��fx�:���tx�?�bfo��2��Z	��?$o��<��x�cZ�%����sF�
ϟ�/~m����BFϽ���O�Ll}U���
�gr�6E��R<Y��<��j��)��?�_X�}f�QX%w����g�//\M�X�����>�;/r
�+[��)��"0��/ǿ�D��|�
A+�S�n>�k# B��R<	�P��-�=���FM���G��3��>Y�V�x���]R��Զ$R�E�_*����ŖV����%��Ha�On��*�DB\)��;ܨ��M�
`��''����Z�[^�T@؊!tS���ȫ��)�<�}��"|�}>���R:3A���+F�4�}�t�-��ʨMIJ�|�(�ɔ�y��4m�#��
�,־O�H�B��x��c���ӈx@������'���c��A�fndxvp��J��93���ʶ�����f5�-�v�uy��η�/_�\8�:ti�<V!��ʕz�O6/�Vt!Y����D���lEȶ�����t%������$#���v��j�i�����t^T��P1��$y����
�'�G�ڶ��i���R��W"����d�O,fmG��tE�1�eT���X�:K*K�vW��P=!��Yo�K�C�p�̟��q��ЖBJ���F�.,[�o�C���Fqcq|>�y~κ�S������*��!�1r<�r ���� �H'���k1�	Z���������;���\u�A[�LS���mi{<wm?�i'��gJ�[���`��9�փJĴ�nB<ԌW�qh��fԔW��r.�ʊB(�?�#GQr�ش�p��� ��Zx3;zr.c��G�T"�X���g�H�ڝ˟��_5��iL.dR�)JV���A���ؽK��P?ĕ2���h.��~n�p�,
�(�����i�^F<(}��<�"u=kv��,{��Tb7�s�LY�ʝ��5����)rjR��[�Z����[�ͭ�r�'!�KN]��
rj�d�H"�:��X�xy�:�4�7�X;�G2{��ܒL�Di���S'RF�QY3��Y��=&+,l�����T& B�'wK�
�-�Cmɡ롈T��†�)��8���j�v�ߨ��0��s�W���
�8�8׳
��()��\�
�Z�Mr ����i[4�o���|3�t�[M��	*�œe.�%����$�CA���T����$�Q0��p�|;k;�KTYX)�I[d��Ǔ�&(��6�->���bhþ�{'��U���P����N������i��[�tR�})�/��9��'g%b%@7��p�ʄ��Xrq�|L}ʛI�͓�l��s���Z���R�m�N��6w({��9G��I�^_�Bp\�a��Z�|�Բ\�-*�4<����o��s�%:��}Y�����:��ρ|7�sX�Q��������_Q��t���x(��\)U�e���d����~Q��X�ҖN��ˋwʨ��3���;��?������#=����� ���{�؅��������y�q�M�)3S����9�a��7��8���[�t}��|��/Q%2�+e�N���
����C,;�j��Cu~a�D$��C[l�u��>#�l��I���ȣ꿵�����h�&�<�fD���W�+�'����R��yo�%Je�ӄ��(]�.$�9�7^<�Ȥ�J!gU�<)�}��P.�R��u�{k�/� ��{�����:�lm����L��~(n���C����-��
œ��Ig��	L�h�mE�e]󂆩�Ï�\)��H!�u-����g.� �x���D���CZ�\'�//�F$���Y�<i����x�߇�?�p$��O��e"���?s߾!�!���%�"8O�99�Q��=Nq�>C�t>o=>o^9n~^j�_��S�U�%+s�Ę4�<����_�k4�#g��]i���z�^{s]EʣhR��
vNEG�BW��W�u����MX��q�Ƥi�9E��X�B����u�����v%K,P�v㫧H��'����V��<�)r�;E�Q��:�E�>�G�����.y�Vs�=��g��Jd5�yRZ7��t}�(���W��C��+����(��Q��yƵ�=o��E�m�Wy@=Ps���O�yOѤ�"y�6�|��ʖ��]޶�P"��s$f�t�i4%�c�w�^sEm��U:��w�#��h���i��Oz8nǔ�xDذ�X6�-���-"��e%��^�D�����uⷸ��qj�����C���Z8KQ�i"l���J�\)Kh��,�Lr^�3��=geyqPu�!K����e�Ȼ�vpoC'�Z��9b�K"9�_�r�����P��d1r-O�0BD�ܗ���zbD����{�4�}���jᬓ�8��w�����'������I��T� <�%�ti�p��ǥ�Oj_��Z�C3yXʀ��?v��뫃ý�"p*s��Ns\EtD��$�V���Z����#�Q�N���D��E��@l��_@y�W�y��Ar��+��+�{hц�6����<���ݷ�\�,f��q�f�AG:Y׊ޞ,��.ZmVam���+�iX0ǦԵ�V�5��^ĵ3�aڦ'�V�mئ6#�7��j�/�i���Z@H�d��3�T
���,�0"-�k�3�K
�"�Z���."���Vg�F����ڔ#�C[���zU���Ń��$)�㔁VQ�]�(��QG�y��r;�
��i�"�l�s?�8����	�u7�u�^"��2�Bx�A:]E/���vU3�у�gK��H�/��.�f�U�g<T�_o��vL���6�nBJz��6�1�kE|?|�������H,5�J��&���:�3ys��9R{u:>9~V��5s>�TD�����{s?&��c�X�G�u�j���P�W��& Z��S�݅�W_�0�L��8�q�#����<T��K�~DtPed�	��LH�G��N�"�i/H5�R��|�F�̈a�`,{M�goԪ�#bkN=;؎�gV��}(�b������}����R��֯�m��D��'�Ɣj$%H[��B�'D�[OS"�U]@�)5�jR�(}1-L?��@@�xo  �
����7���^pB
0�'D@�@�]�(�= �"R�Ks�'�e�|O?�?[f�[�Z!���C�&�Yg�GR����	�*=�>���3O} ��*��o�P�7�<��b�s� "f_�-�k��g�(�0��X@�Qt׈�T8^<oe-"BM7	4��)��@]��(����5m�Vo�<���Ǵ���IQ�[�Hw��AHL	����]�����w�eIEND�B`�admin/images/icon-wpforms.png000064400000037130151331545640012245 0ustar00�PNG


IHDR�?1sRGB��,	pHYs��=�IDATx��\Y����}���w?�3欣���;�3���aLc1"
�4��  HQ$H���� 9g�(9�?MaQTh��h���|�`���۷��snݪ��$$1���HH�I��@k!��Z$�I��@k!��Z$�I��@k!��Z$�I��@k!��Z$�I��@k!��Z$��kuw�g�{��(XI�rs�"͵S
w-�{b���JQrd__��+8�T]���{�-��4Wg�,S��)�zfQ_Q$�ڍ/!�P_�+�{z[����d���͎�U
߾�p�>���D65tT=�DU��&�*J���^�Ʊ�f{f[mI�0������@{�LN����P&��O!8RSM9DTO�]3�p�$�54=�#�]mB�az��ƚ)�:h�2���I`��+%�^<Z�ƭ�zJ�C?���~�ԗ�3|��鏶O�];��5	��9��'m�y��=��ꁹ�f�e��HD��!F�����`�m
ѱ��-9�r�d���<�t� 影i~�k':�t�읮��0�76�8G�5�B����Ā��o���滎’��B��'y�;k�>�z$���oB�n��a$�޴���i'O��kh�q2q\b��6�RHW��X���Rj%�+�wL%zW�X�Ǐ����s�Ww6���Տ�����q��8�sK}
�m�[��V翦 c8�]3�Sb:^��Zk�)��������at!`�&�-Eɑ�j�q/;$��^�$с��� �տ�����Z=O7!J!�9=ȕf���-���ک�o�-�^d �g���x�}�e޾�p����o�����۫H
�5ǥ��cve8�%��Z��ޏ��o��2��Н�����a*��ݝ�-d�ӗ�9�ĝ�vw��?�����I|>�1۳�O�{�~�ρ7ޥ�Z�N�`b";�?��'��s�����z?�����x�@�9<'#�:���`=oW��u7ͥuq�f-��IM��@��R5��ț��m{�W���]���bw�#��*Hԍ-!��ۃϬ�l�t�L$����R���g����鮝xs�$<��A�~k��3�C�����$v.����P2�{�a�����[4B0�����M�+d�ǿ���w�VZ�ѥ?�d@$�Ρ]_��P�'���.e�E�`?�m������[4B0�,#���[�xJL�c���������՟?��v���S��L{��9�T�/�:Z�p��9�1\?����{g�K��=</��ܤ�G�~���駗��u`���i�A�b�s����Mq��%��&��0Io-�u#�(!\��BЫ��7;�G��I�x������Mw�?'HjЧ�?K=�8Kii��/J.}ɭ��K{�y`0�a��7�0H�Ͷ)0RA2@�H���K���@���(��a�1�7Ou��#�0[i)^�~�x�!���Es�?_����KIִ���)��i��Mgì�'&�b6����V�L.�h��p��g��������Ls�����Ζ	�2@4�}�!���4�)�3;�}en��σ�֛��_Q}�~�̸��]�%�#����Yl��+p��	"%ZR|���lI�!Օl�����_�/�NT\v�3�8��l�E����{��iT$���[r:o`�d���L:��^��DB�����6-���|��_�J~rm�$⵳�?N�:<�=OwM9�����	Q�Օ������v-!S�m Dk�|��`�춦:Q��������y���t���LK'nn�F=P�,n>�ד��ό�~�����u���>3�%�O�,>M��+,����Lޏ��֙lr�)J?�]���g�F��)����,eG��g�Ư����:���c�|j	�`�/���l��W���\���n���O=����~�pc�T�-3lwζ�=��9��Nu;�	W!�@�1�>��H�K}�n��M6M�Y�w��	%�0�`Ix�����'{�f)q7���,	��s�H3<���#�t��w��6�v���ܓ�����:�7�f�t�t4T�I
�q���0v!X${t���m)>�W�g@�ʺ�7��
�[�����,	�����%�e�&�Vw�EFE���nr�,I-��--1�6�v�/W[W���ebz��}ww7�������?"�"K�Bw���JJJ�J�9{��Y�1���C�"�OC�l.���뻦�1{�B|�E����5��KC�E�
�۰Gp��ֶ?�Ɲ7�씔Ծ�&*��aCU5-�V`Z�7��G\���,	��֓��o[�1��]P������EE�L[͚���Z�0�:�g!X(}�p���ظrKKk���$j�>z´������g!X(=����A7�ƕ��KjlHTF�ܼ�f+��N��|�[��`I��g���Sg�1��y�[[�4~!����s6���ÞS��<��@��;��z����������8A�Kj��d�V˾�������)@j�g!X�u�?��*������񂅟�U�m���D��
m����z�E��� ��r͵=
�==�7�n���$����=�B,<�J�)�}��
|�V��
��C���b*!,���5����������򢤴�����J�T�����7Ӯ֦����v		I����-
�����`I`V����Ǭ�Ϣ�މ
ݍ�ehW���6��V�w1J�>�߸ �D�V^�st�����[f诟��z������\�������_�k+����_�wL���#��@޹e��>��}��'1�!�{�_h�w韕~�ߛ��s2�_B���W��?H��(��t�Q��oo���O��7,����_�lt8������R;����k-v������3%��;�L������YR=Kt�"�B��e�k��J1��#/���y����y.����N���ߎ|=�Ĩ'89\��
�Հ�s�,q��&�KU[���WL���g5Wޏ��0���sr�
*��#p!X�
�r�$�zc}�C�V����\nG��?�X�'�h
֡��
��'+.��Cr������3<8�Ӭ�8q��G��oX�s���m9B�-B�
@��p��o��.� ���TW�	�XMsk���c��k�����@�
	�KA��!r?��|�~����+�]+��]����U��W�Y�Yo��J?Ϣ��^�����93��ڛ����D��ƪ��ԟ\�Ȋ���i_�;�P���� �\j��1M��vb�$G%*��
0�_	���$z=��	̒^>��S��hw�yp�h �w�9�Ȇh�����!O�o��p�>jTRίd��]�h������1����&�Ǭ�$o,�o{[c�'�}z���#ѩ#@���	欶c,��qK�1��jt�������S����ͯ�;~$J�2�Ka�kyl���k5���W�v��n�i����&kN�s���zV�1�j)���Q�XEv��}�xjo�����/>��`��&:e[���y`ϲ��v��9lo�+p���-9ڜ�@K�:�($��6<����ko������<l�3��6tJt6̂�Ĺ�����C�m-LG�����8/l�nr�2O/����jq�ա:~��-������+ٌZO���8_a�yᏍ��&hx���Mx��ꑡ�s�4|	
v><%���+bK�����Q���
"��Y���^�N�*�'��d@o�W���yvi�:W���
6�0�8�Ix��S[��&Ht�Ts�D7�y�r�y���7��P>��0�_����\=�n�T�N�m���V�J[�X�����|�]���WU�J2��A�2].Z�,��Gl���#ocɮ����6���?�h6���^�4<��P��"h�{I���#�_@�OtM�}sH#�6%9{�g��!�<w����xb�o������h{�&Wn}��� ӣV'W�]5��_�mOv���϶P]�Jk�����B�AK��~�q%���'�rӂ���Q&��Ӽ6{�罓h+�����\��Zߪ2��L�z ���z��5Ʋ+��?�V2��znp�=
�O��k�c��|+[�s���6�zz�����s��+����+h+@��N�`ʃy�H�k(�����+��e?=a�|M[�X����	�_A"�5����S�Y��,��_��];�Gr�	󐘎}ewn7m�m�Y���X|���O{���6R�w�/|1��g~�X�]�hk���K�?���?���>�9����Yl<�O��H��4m�@��LTn���}�=�hI.�y�끾��#?M�R�M�[��M�z?��*ˈ`6MKT\D�.����3�y�m�b�e����sch+0vXQ��.6�qqY�da�2�m����{����+&B]|�|�:��2I����L��m��}����?2/Tz~���򟥞Z�d�;�>�1�����O��u�����c)/բ-i��J����}R��i���Gv����W�1۱���Jsb}
5w����*/oM��Be$�/�<�����(�?I^���y04Wm�^9���Z�V�I�3�d��ʜ/���j�u��ߵ�Ϧ;V�?ytS��ibe��GiC����i�����l��óus�2ٝ�k�2���`v������Am��/�
޿c�p��*Q�pޢ�@�qSo�p��!px���BD�Z7=;����R�� Og5���!:�t��L/m�_&����/���ّm��8���R���4(X��"��m>ps���v�| Sii���0Ve&���Pa���Ɯ����F����wGܒ���f�C���/x�~�eq�'�5i�af��<���n����h׬{��0�0	zw�͓�m�b�}*���Գe�s|�-9��i�������E�}V���C0�6�ixz��W�#����%@+�p�������]�'tuv\��@}�p��rn'l�w;V�Uc�~�e�s	ޚ��Ѽ��Sac;������S�����$D��R�}\1@L�ܓs_�l��o�4<��=�z�ҡEr�v}#��T�9,�w:��O��M�E�*��F�c}�.���^?<�O�'�]�8�f��'��w��F��,�Ă0��n-��V���+�Y�Z�pjk�{�^\��[����#����t�D�3Y0�z�DD�Oދ}���Nj2X�X�����kӯ�ūly|�;�S+�\ߌ�+;����K�	�O�A��?��#�/��؄@�6�g��v�n%��>��7��� (��E��AG?�S�&h0���mzq�-T�-�Fk��6��X�pv�#`@$��C������2c���/�,���/<��̄���(��cEZ��d�����mxkf�%ߊn�e:�ܣ�w6O1�8���)�)�ܘ�uA,Wy� 3`(ȼ�^��_�+�|�g�{"�-/�xk��-$��s���@����|%X}��� Wb��
l�X�L���<խBp�$�xX��-w�����QFY��}Fp�/lq�s�;��@q�8�~�_&�y'����Z �Y1���rU'�=tR�Q�R��@�;�2�@�����%�WH���+��rn�����N��ZUV��:�h����*=�����_���_��ƪ�Au�L*���9���?�&U5����v
jleE�=�}/��T	'35G_�6�ͯF�Ȼ��_��v�#��,�ˀP��'���J@N�z�׎��iػS��h�/#�J��kD����:�Mä�ˁ2�.�]K�dHf�+�F0_�e��_}�U/�<=�M�lxk��t���G�n���ɹ���1HU�,`�d<�*�'�L9�2��&ΧMKt�e^���O��3]�W�^�21���č�Va��1�u���sE@��pn�~2��$I�K��02`�~�;e�����SUi���IR'�͹�|��d��D�-<3C\��B,9�5Ș�dE��<V񛄳?$��	�D�q�����2Tz!����Lg����.��<�x��a�h�Ef�
zE��=>�X���X$�G#�o[�;��9T��R��a�l��.���3���oIZlPF!�Y|��ꎾ7?��ҋԑ��S��e>	8���rh>g9�Yw������8��a�ߺn���{�����%�4�kn�G�&��`F��D�Ϙ�OH�cO.r�;�%%��vۈ�F2��=�j#;����u-�~���'v�o3
8��L��O���]�@}��?�善\��
�d�	�C�.l75��y�L�я�h��$*�?�(��.8��
���ް�B-�@ⶐ�ȧx�(�k �-�LH``36��q�4��1���v�����-�>$�?|�LgOoY}sdn��x��V6V^���^Y�C����l��g��,�0��Xgu|ϵS�467�z�Y
gH���D�G���'�ץW7��L
��-��T^Os#��(�ko?b��	+s��]��S��&hػ����5�'�l�L�l����
��
n��g^f�\M�x}}
o���G5�Cs�JY�q�ł�;ĤdCOOtz���Z5�X�}��D	��W���ANd�Ԝ奜�b���#/�B�`�e�ں�pZ;Yosh��ϊC��c�9���������$��0
Go�GvN��S�6
��m���X�:_I5m��j&�g@�%�iT
��/�� !N/��ll�*&�d-�� '%C���yC#��	�j~H_�^\|��5Gv��&yJL��}���o�۷��=���P�j���[0���04�[?�M���ݓ��O(���آ�'oޱ�p��2��x?	&�q
vy�^��Ꙙ��u�'����=��4�Į{GLnB�!=/Fv~��4��~ֳ��me=���q-7MVո�m��Fy�@z�!ءy����҉��Ɩ/B8�?5G_��O�X��j���w5
��58��T���띜}�2k�2-�C����w
V�A��G�Ȝ����Qm�P$=�O��Y�^Z.��Q*��
��\�_y`�5��yk$����[ځ�7�3���
�
���GV���*���w���߽��ԋ��
M~��_]����"v�CsJ��O@�90$�0��2��::���k���3>�M�g��D���N� �psͣ�97ֲ��C��X8D]['�?=�С����>�-�S�q����&b��N����,�c�8Ρ՜��8�߾���%�NG��<*����-qqNo_|N*잜˕���cQ���hs��AŸmaaJd���4���N����2�����ZnUs;v�4��04�{�5��G��PS��3���)��ݓ[U��g�'$c4H1]�^'�C�M{ж�n�@�G���a*��YoQ"��<4�p$�$��3k#��T5�ჀO��o��m+l�	�C�1EU���� ��-|8vG0��I';,���V�}�%���EL�%� �]V�Mp�c�����(�ɳ@N>���=]�L��!�'%�Ts��<��p$J�E�ڮ�j
�1F�ёjޒ3nh�`�2���O�Wj>~��Qi؇|���0�</9���5M-��3�4�F�%�^F�U^Ut�ĭ�\�Bs�x�~r��v�l��ظ���ހ���
��F�ҾB�(��.���*pp�⪲�/�%=���N�~Cue|W��ɳ�B�Y�_0��Ϡ�'���������%4�ޑ�36U���lÒ\���YӔOc_�v�cZ~��2�aQ��<{?�9k�ҾD>�u������(��o�������,�6
-k�n�H�)9��k�~�$�g.��ڻ�!M�����2R��p����T���A�5��;�B������&f�|�96��r'JAu�M�0RI�W��c�Q���*������YcogAH�o��C���2�}O�?����\͚�fX�rp�������W��^F/�?�Jſ��@�9_U6��S� /�����ԓ�`���m�vE�3%��g��dH'��@�E*��jό1�>M���}h���4�m�O����Ս��gJ��捘b�L�|��T54T;}PC����`=����v�ޕ_�kaA:�^���-���CG�_��I�T~00�P�U��Ѭ�7�#bz��x�1@�˴|���}�QSJq%���G�X�~6h?u�.Vd+-}!I�{R~�
��ɿ�݊�q%���gH��LJ��� rbwC�c}Zu�����e�+��Ԫ�;Aq�
��ԒJR����!���ÓzreZ��2�Hi��;��g�𤱇=�P2t��һ[G܆�Pi��Ξ^�Ύѩ�mj�H����+���1.#���:��ɚ.�)���G��=1���*�r��#��R�~�{W`,0��v�3�`<��rn�}��xݺH�9��fE�ň�J�d;�]ܒr��Cr�_�\F���-1ha�v�IOL�o���"0��/�r	���²ݐ
`0Bj��0#�)�f��n��NeS�ж�Aj�h\���m�1"챏�����u����aI����b �����SOUBY�U���7ž��b��JpP��J}2�=`��Z��$�_��9�9a�8�3�s Y�7��5.��5�\��'��	l�!��y�|	��29RU��)��
� ���a�Q���q���.2%��^aPx�}��2B��_����T�
��y�xTXSO��g��{ç�YP隘m@��#��=��W8tBcY
ʛ�{{�+�pX��Y�<��S[",Fn�A6��W|�6��[ �Gs�L�G�JjoR���&�'�e����N/x��^��2�9Ťa����+q�Ќs�/}i�a�\'�4����Cs�pe�``p6�-�|��f�YL�3  ���������a{���Fp�������<��d����J��� �����bj'�=�W_��+U56�0��Ve5]=4�Y8�QN�Z�f���g����Vn��ٮ�i�
EbcL�ݳ̌����_�����mnͭ���-�I�y���b����_�Mp܃����I��ٯ�K�9�	�4�b]ϕ�t�`�S�{�����(<��V5��ۛ��ʣ�s)lQP�o��������+���;�y��O~�6�J'�f5��mj�
���JK������u�q��9�PN.
_�@��,�0x�u���}qHn�-'ѩ�@I0I���{��g�'?���H�◒�/��-�(���q(��bT���	oԳ�v�0����"�O�l~Z������8Q7*���-9��BU{�q;����6�הHo�6I+�u���<$��׭z���/(us�"=E�}��\Y����jz��fNi����"��`���c��p�W�g!�u.�0p{�M%k�i�9�V��{_h�@�	��#��c�w���C(g�B x�i�4����*G�q
�'���f���&s�s��r�)�ԟ��'����;B9{|M�r1
J�p\�C��D�l<
���o��lD�`c�5���j��
uS�A��Kܸ�p��M��U^��[��G�ӆ��uu�o�H~��["�k�#�Y��c���8{^߸ ������HQ7�%��V���/kh�hl�W\a�x0��<���������a��8�q�t�1JL�*��3�w����P�U�F5��D�'��__`ᕔE��d�=�����]b
I��@k!��Z$�I��@k!��Z$�I��@k!��Z$�I��@k!��Z>�������K�N�:uBNN����22G��?�_����,�j"�0V�z�
�^��q�����Ӯ����,Y�1��������fii)�"���]�ff�ǎq�`�����2Y���.#-͹�C���-�Z#���E���
��L��0�{�̙��ΝRT�8���u��h��Emmi]�016�������JVUV�NO������m��h��Z������q�;VV��wBp�Ԕ9YY��MԵC�N���m�cdh(�!q-���ѡz��cAAA���Bp�˗/S8y�Dbb����ĵ\똔�4~~����ĵܩ����
��ɓ�%%���Bp���Y�)��gΔ����vH\K���)��p�s6+xa�Q_��w6֔�>(s�όn�M�l|3z�jˊ}m
��/�=0#D� ���W�Y�-z��P�f���jڋ���䴶�����?r��KKK�����C�����t������ϝ�!��r������2�
;�km
i��k׌o�rrt�
�ߤ��'99��^UU������TIYY���s��nRUU���s�@YI鸌l���p8���9\����������҂�A��޼���Ð���J>�	�@����S��|~�Y��W}�]L��4dǂ7���.��P>�\�����|M�Oą_��(��+��������}[��~�|���B�����ISA
���<����U"Z��Oᫌ*=�ͤc���\VQ_�����zhL8{VNN�(�����K�.A6��`?�c8::vww�i۴����@�/0�
/�H��7ؕ�c��dfjjmm��-�5Qww�[�Ak�c���[(����hij�&L?x�PW���e�yWW�=T��r9YYh��.	���}-��Z@���_T�?g�$��pb��a��^Xh�T>��� �dt���wn� ���X�~���=�`L~����_�x��uoD316�����uuu�dF58��YuXX���
t��_8���6��<,4R��Ѕ����|B���t)::zz0N�u�^��V���*�"B�xf��<n$H��V��	���m�)�H-��#�!��Sˇ(|���C�.���o�X}ggg'��o���ã��:3ڹ#6&u�(`a�>��%�,�n�P�6�iČCT��'���6D5�644��H/��c�/���Q�7�%�XF-v����HBy��4�\����Um�.����������<G���"�'�x��N ���~�x�!���a'�@�0
�ěG��������3�Ӆ(A�Kj���bܱ,�dY��'ܐ�G�E^Z�*6�á�d��YYY����w�聯-�؄:L��
�{|f�ŋl�Z�`@#}�ZM�_�'@�㼉�<�����Ʋ�^�|��b�<g#zZ|=-G	o���c�~�fӂ�׶&�Famm��Ϝ>M;�ÇX� ��}��a||<Ӡ���>����鮮����)�����ry.�1�RSR�`ppA�9�FpDNhta+#CC���0���	�9S�
0��?��e��T��0�i�AH�t���?B�t&I�K��C��䅑�J�ąU���v���HӰ�E5q�{a���yWϺ|#����qZ��~��v��������[������&�h�8���,-O��/�a�A�Aj�|N�w㆛�k@@@���odd���6d�q�� �Q��`5������i�׻��yyyx�q�kic�[__τ74QUU�HG`�C���VW+�w��:@��
Z��~�T��,�M�މ�+�ޮ|��hQ�7�����Ĺ����--񵡭*l"�����,�/_���1M��y3�Djj*mI�k��ܡV<��Ą��wLKKÊ����22�/AP���^���>���v�p�:��:�P�o��Q����Tg�H�@���
��1EP��@Љe�y#��ս���!{��)|[��+Pf-H}���+����Y4G?���@P�!�L=h-C�VRR��UC�������*"��T������ח��C�==my��h�x����\�!��/�T[,uia�=q��E��Ē��lBv����͉��]n��Sv��7jSC�P��:83�F+SUYI��`Z2Q
�c���6��3��哓�h�x�Y@�����v�MT,�0�Yv�ĒL�n��;�响�S�@10ؚ�����t� �*��K�Ȟ@fF-���g�!���!�ill\PXXH�=$�L7�b�fg�x�S�Z���[��?�e:k��.i�恃��^H4<�}���oh� 5+��$���I�����ԋ��a�?�___�4�	���
�>:���E�w����w�F�Q�,	H�4�1��>�C���b=�&m�Q���T�|ky.5c�/s�
�@��6�
�������!!���G{��	�I}Z���2��>���L\����ZҘ��N�-T[������e���86?A@8�%�WBO}ې��I1=��ÛO��M�S��<����w�o�����s�$��#�o.�s�� �?g����j���R����߻{��*@�K��_��_�9�L��s&M�s�(V>���(�u�y ��4-ag�cˤ�A��97	�+�ׯ]c�V�=3]��t�}�>#CC�k����˗�yk�0H�?D�U���۶���_��
:�9͠q�{l�Եn`��W�#�@��Y�@j~�ۺ��b8�zq-M�Q���9���Poo�{��?Nb<(,�'��`�9�խ��ړ�r�d���	��������z�Ɛ�����H6����\,ca1�cJ�n��3|H�JJ��bO�z�����9��*����2|�0�h��]l�Z��՞j�@���V�;R���Y�}��S���s��`0�@��~Z���&X�@��ϴ���'�2mk|��($$d��P=+�?P^H��(~K�*��1'.Je=5�`u�t+�]��^ޡ���Js�p<}e#-�7��5-L!���ڨm��� 2}��00xIQMU�=Pl-��$$2lTh�<gC�z���I��^�&ɷd��4k��.�p<x�f+_…0&N�8QVV��i����¾���ۙ�`GG��~�������LLL�� �`���(!P�L�i�#����MwBRK-tbuN)P泖��b�@oG��!��@`I�RX6o�b�U��g�PL��d��������.�S0�DG_�p��M���QB�������\�5�r���9�y�4@:o4��ޒ�wxv��}�����]i��ӞKp_�wy'''3�)��ʂm?<�����0�CؒRIx��0��#��[t���:�H�0��"�X����&�Z �m��jd&�L�]|�1�TVV&-'),4���9���?Tc?�^v��x��`���p�0�����d�<����	�;�=�!����
^;K�Lp�


�]EFF2E2������:�������ӥ�(0 �v'�JXAHx�U�^�j��=�7a�I�hUWs=�X<�&)�~��Ь�;�x���:N�4�L�o05Qkk+ӅR�u0|�@B��������hD6��y�������.ԫ$?��z n��덾��Y*H�RE��U��3����t?DPL�=���]-�
�
�I�,~�����?�b�	�5<#��gb���2�y�!`���uԣ�;���,N�޸���X�i��驀ϝ�h'����Р�R[[�t���X��B��Ғ__߸W�������:�3��6F	���g��Ts�&��~��g�%�94kh��^���.-�awKc��a��Xy�kyy9��™�	�S<��mj�755�SV�|"+++�3Z��\N;��~�…��O�R�����ϯ��q �l^��Lc��`7�0?�
���z}��A�n�c3쩣�W~������Q�jC�n�f���ݻwv"+C�
]]ooo�;wN)*2��"�ö�6ZHF��l����$'%�
���Л\�xQQA��YP
GG�W�Q�~<:�s"0����T�&އ���)f�ו�������E1����LRa�y{�nΟ���ass3���Dz!I���îBBBh��� ''��Ȉ��~5��6F	�w3�xF�sj����pf�BOڣ����X�clm�����^�>wPR����[�!���*��|+<<�����m��SQ
�L��@�����w�]���M	�d����)���;��s,���s��@��6l�?UL���h���b�}�!����q��~4�3�7Rц�@���\]ik���J[����vh������ӓ�g�B��**�����!&��
j�z�ۖ���������t��ZY��eU����*�-6#5並&&����0\����
|���ƶ����V���c*a7m�=�V���`�a�uvv���	�sB�_�F\\(8��ގ�p埂�B���7�.�M�b=�d�`�C��=83��w��L��?:/D�+�BkH�!�I6>�Z9ʤuWW�������-##�-,�/d���LJKKS�~�蜲2�8
8(x$���Y6�KV`0�y��������������T���vPlۘ�h6�!4:{��2A�?��a��9���+W`���ܿ���R{{;^¹��]�X �6��?44|�w�FTd��$�w�u�44d��gF�u�Up�	�X���jnJ�iP����uY�}����o��Qu�vϻImll,�������ǃ��QBS__�𓃂���_��$���FA��|I{��p!��Z$�I��aP��$��4�>LG�՝$�>P�Q�ĉ>LjSB�O|�@U&o�io<@ ��aP�:[�O�ا���҇	@C����47��R�UC_�0h-�
:����
���'���҇	�@O{sgcM[uQke>����u�
��L(HH�	�$�B ��Hb-�X�$�B ��Hb-�X�$�B ��Hb-�X�$�B ��Hb-�X�$�B ��Hb-�X�$��,&��&-&�IEND�B`�admin/images/icon-duplicator.png000064400000010010151331545640012702 0ustar00�PNG


IHDRk�XTAPLTE*�G�G*�G*******�G*�G�G�G**�G�G*�G�G�G�G�G�G**�G�G�G**�G*�G***�G�G�G*�G�G***�G*�G****�G*�G�G�G�G�G***�G*�G�G�G�G*�G*�G***�G�G�G*�G�G*�G�G�G*�G�G*�G*�G****�G*�G�G*�);itRNSͣ�d��",L��D(��4���d_�"�ՓI���B�x[10�mR
[��~i�ǽ�����NH*��ʞQ;96���²m&���gs>W�r�xW���@��v�{
IDATx���Kk�P��%K�B��*�n��B�R\�22J�̦��_`��C�&��4�^���-�O��ID&��d2�L&��d2�+�tw���d�i�6��]n����"�g������UZ�3@�0�d�4h2�iP#�H�*#
:i��@S��]�1�=R�_` /
'�E����2D_ߊ!������o;�zŭr�1��ƸM�r�d5'�`O�nQ�x��-
�p���
_`�w_쓰Ny.�=R�q!�wo��=O,�z%� e��2�
���ָ�dQ�3$��$�"��\�t)k�Cd���d\�Gn��D��`�hG��E%�B��׃Fs{����G����ܰ���>�)Q�5�<�����hه&������)'�-]��i��!����Mh`{LƝ��
4��	���q}E�����͇��8D��G^��հiCc���U����Ӡ��?�.ۂ	�y�1��0j��B��u��6�V�k�������7�n�Nk?k�Ͷt�/��������}��`�$�;>5K��p{���@�R�L�m<MQ}���ȿ��r�~�N>�o�AR���F��v�׿XF(
X�����luMt��O��l�3����ͽp�PT�QR�Q8���0���L���ߌ�-|��H�v���Y��N�(3�m���/��yHx�|�&���X{Ih�1DG�O����/ٌ����(�s��̯��cJ�{��&$���+*�G����>�hzT{˙"�ϳ~����eRmT|����#6��j=s�2�؄'���7M���>����}��(�S?��z�
���k$b�L�*�N�RI����T���{*zC��Օ��[k���]�`0�п�G5�*//�쑰5j?���W<Q] �r�W5����0��>�/�i��	�!0	�v}��"\E�*����y�xrc|0�`�
������Py��T
p��G�8� UT�g��P`���ǿ�xTWpqY����v�XR�7���@���< OuV_�?�,�ku��DX"^�����d�#^�H����dX!^�x(Yg�	
����("���m��C�b�nj�:�]%GE6N��񝊆HB�{8t���yJɇ��!Ma{��|�	{i[���S�;�󋻳iQ�p!�(I�!�
qA<��Er�:���E�������m:ve� ������J���x=��������bV�z�`z�IB4��Y�Ј��\���l5����꿰�=ȴ��Y����\?���۠��`�?���b!��ʇ�ٝ�?�L�
\��%�$���!Pw�xa�$N�!�8�o� �E�`Jc/>tL.)�"s�T��?ت�������>�������u!�\=ܭL?�j�%��=�.S�8��2F�e]?�g���o-�ԯ�Sɍ�����'���yU�'����LP���觭�)�E%�J?�03�k�%�GȰ��,�"�j�	�wA�X̪�~�fbd��{����5�r|�MnG��'�+�!��v�c�-����?@?�r���G$�Ux�j�MGx*�?B�4����S�L{�/�WO9��I9�Y�� ��z�"%�wa�wb����<���99�>���f�+��� I�0����80=�GH�<섳���
 �z��o��~��S�+�����O��a �a|�[���ѐ�sW�^oϑ\���Y�98�����1�e����74�:�-�vn����H��p�ۼms�C�Y�~%}���C$�H�p�t-�+y�Wmb��)-�6L�ƭ�/����k<�r����q��jH K;��Y��	��>�
�π��U��B���w�:�P��4��
,��	�A�*�y�'`�?n�[����M�cVX.�A�̞�9��ݥ q�ΐ�h�#�0��Fg?1pZ���d\%NO9?X�R���^�Y��f6*�o�/�G�Tv�ߟ�[Н�[p�Q��/8���]Bഴ��b��W��M��@�K�0!o�`I�DD<Ő� �A� ���@���n�cU֬�Fgwa�[f��<�Z]����O�5
z�/bEF;��1��ԛX�n�pqa_��*��V1����L\���\H�$��������=E�s���%���^X9�%(XG�T޼Ҥ�R�А/�|AsZU�0p��8�_�Z����M?�).�
����Gf��WF�/�M�,�jH��<(���`��
pp,��nb�hN���,u�lL��m�x���
�̏����G�/Ab�,N�o�x"r��ŝ�p�VF\�o(I��%@O�mH�7��
�P���+�P���L.���@�G��A��k�W��D8��O@ߦ?�	Q2#
	أ6�oD5�(����A��K��D�ʉ}��9�"YT�t�}
-ЪJehj�Kzd��l���>�1m�K��-a������&"Z�X�{@@+t�O$H�B;X���2
����
����.5�z��t����T)]��oS�!�8�`@�=,�X|"`��
���I�>Jr�h�X&<ݧ�7��c�2���zBO1���0%���t�.�)�k66@�����A�Q��	��'�L�ּ��N����1	�W)q�^�$�bmG&`�@u���&HǍQ���w�(�:4YA�KT�jA�[ȯ�X𜀘��r8�B��Z�h
['Dwd�I�CA���Tm��xD@ۇP�9��"����# �N;��V@�T�Dt�7v$��g#&��Gv��FB�_�L�@VN�:�P�<�`
��B˜�
�Ό�
��H�N�l���
-j<�{

m�t
�U�U�.	xo(@�}�Bb͛��8W9!�۰Һ{�
2�Ch�۞a�z#����c���&��ZP�å��O
 x�m�#Mהe.��ا��Ռ�\{g���;��b�4u{��
�x�Ǫ�M>�Nc�v4��C�z��h�5$$�`gY��y�:��f�w�X�~S�K�#��
���Y�
�䎀���-��e�ui��ݫ!�,Fv9{x�jQް&`J�<�l���O�߾�	9���=���Ϋ��_�
���@1ڊ���(�a�0����"�A�P����,Zjb�c�Q�wRL��I2`�S���@�B�hw��	��M���AI�0�����կ��$_��m ��ŀ1�F���l��1D�Ʌ)���P�̡bA�<QQ�7y@Ze���G�!r�+6Tq�Q>�
�5����@
�z��������yH�U�
����0�J^����L|L�6x�C0���[�+�����t+��cHǹ��^m\U9��-������!�'�z�?T�jkc����@�U짐�qm�v\��~����N:���aFf�/X�μ-h��i��i��\OvCޡN�IEND�B`�admin/images/upgrade-welcome-cloud.jpg000064400000401201151331545640013774 0ustar00���JFIF����C��C��,^��	
���}!1AQa"q2���#B��R��$3br�	
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz������������������������������������������������������������������������	
���w!1AQaq"2�B����	#3R�br�
$4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz�����������������������������������������������������������������������?��(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
�Q�\�]7L��
�+��A����=�m��c��8�L��=(8εk�:v�V����U�����*���!niu{Eiw�]n�6g���&MQ[T�c���*͒O	�XP�3*�1�x��ڋTc��;�e��Z�zk{[bV��k�K����KA��w����v�������"�޿�W��>��xtddZg'�o�]ߖ����������z� ������Oÿ���/�����揯��"�޿�>�C�}����"^�Z�/�O�{�?�1��S�]���?��D�O�Jmx���z��=�hc�"�޿�>�C�}���=�J-9�ǯ��^�hc_��T����ϸ�"��{9�ȴ�a�?��:t�㡣�C��*~����?��@xKÿ���=��^�����W��7��*}���?��@xKù��E�O�����L������z� ������K�ݴ�B9$�s�v��ן�hc�"��W���ϸ�𗇱��{Nx�������Gn���3��*}�����F�	xx�"О����u�[4��1��b'������q�G�%������(��/�o�T����ϸ��"^�E����ϧ�������1��S�V����?����:�k��?穥��o�T����ϸ�����i��<n���^���������q�?�A��W�]�����hc�"�޿�>�C�}������s� �^ݜ���}i�hcm��S�W����?��D>��mz����s֗��7��*}���?������/�,���.:�b��o�T����ϸ�_1��^�%�������ʟ���S�X��}^�����)��i��a�;�?�=��o�T����ϸ�_0��K���ӏg�xz�}��/�o�T����ϸ� |%���"Ӟ��G���ޏ�o�T����ϸ��{h���g<w�1��}(��7��*}���?��@xO��`���+����ҏ���"�޿�>�C�}���D�;�"ӯ�_>����=h����EO��}^�������?��-?��!����5��EO��}^������^�H��m~��>3���җ��7��*}���?��@�G��Ğ��~;��������EO��}^����� 𗇇]"Ӧs�<����������� �������xts��i�L9S�3��/�g�T����ϸ�_0��Kç�(��s��:�|q�t�z�������z� ����O��;�@�O���wǽ���������q�D�:8�Ǵ��7n9�������"�޿�>�C�}��|;��Zp=�{��?�1��S�_�W��>��^��E�?�����<��7��*}���?����K��?����ݺd����)}�A>��A�z��"	xt��ڏ�~����i�hcv��O��}^������w?�����w���J>������z� ����>�y�-Fs�?A߇?��<R����EO��}^�����%���H�?P��W��?�1��S�_�W��>��x{��=�8�k���N��h����EO��}^������{�%���n8��~�������������ϸ����x��=�����c��G���S�_�W��>��xw�������|�L���C�A>��A�z��"�%�ޟ������Î�׊>��_�S�_�W��>�9|+�����$Y��K�T��ҏ������Z��k~a�z=)�>�s_Lկ��K[ۖ���KX��K�Y�#{�ھF�3�nB�q��0�ݡ��ڊ�xG����I�?z�J��kVݗi��J*�T���}��~�����r}"��h��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��p3@];��/׃|���Dg�Dɨy���yI�1���Wl��m���9���K���#�z�Q�o���#Gh�A�x�����%���nz{���{�N���{���v�'���{���
}����1�������/���?*�c �q�<z杺u��`h�Œ�t���G���?���x�� ��@Lt�<�h��=�`z������Q�~��p(���q�@�<c?L��?�>��V��F8�z�#ޏ��h���{S���
�>��!�G�z7�<�u6�A�nGNzg� Q����s��>��z4_���t�;�ӿ��Zv�@@�3�����&����x�G_^��צ;:_w�c<�g<�����=?�6�:s�g���c����@6��Џ���O��^�����?�������lc��1�c��)]�\v�}NO��8��?tg��=����|��1�@=��c���~�Gq�����1��}޿�U������!��d��㞟˽.���8�#��S����	������{t���������h�{ 
�����QGn��\h�A�ÿ����y�G\Aǡ��_��:�z������~��ZZ]���8�z{z������m� 
���ۿ�֣����3����yࣁ���#���{zdf����� =y�o��?�F�4��+�z矯s�}�[�_�=�v�9���k���}2x��<v��Z]z� 4;�������\����Qm-p����?Ϯh��@h���t���������\.��H
���7�G*D�7S�YO�a�;b�pWx����?8���S*�¨������g�Y>�Kv'$�y�>Z����k�_��3E��_�j�a@P@P@P@P@P@P@P@P@P@P@P@P@P@2O��J�T�x�8�^��1����*�����/�c�V�
/��nl�Ӟ���[]���8�88�?S����֗@��q��O��;=�_,23�z��u��6�O?/�q��z��q�g?מ��)u�����q�<v�<�
t$�;g�?�5���/�8<�=�M/��^:9ϮF9��'��i���X+�r_�#�Z݀;c`����K���6ppW���֋=c��NǎqN��m����q��򡭿�pF9��Bs���'�P�99鎀���֞�{À�0:�g��s������~8�?���.���A�I����J��c�O�>��� (88�~���^��^��om
q�1�������C�A�H���~@3�I���G_ `'�r@�����/�|����?�`�0L~_�Qޝ�@G�NǷ>�t�y���>@8������9����8��8ϧ��#���-�<�a�3���G�u<�}8���?�~��`gn=p�~O�I��rq�V��:�V�y~Þ�w>��ҍ/����9#�{d�����D;��#�~��l�w=1ǯ�����t�G~��}��~�)}��v����{��J�3���S���Q����מ���y`��'�Ӝ���龌�\1ӓ�z��i~w�_,��zZ=?����M�Q����~;�_x	��r0NGo��<zӳ��_� `x�0<;��4ۯL����ϿN��
�_�k�ʿ�j��_��Q&�؟��������i�R��٤~�#F�a@P@P@P@P@P@P@P@P@P@P@P@P@P@2O��C@ch3�������꿭v�s��T�~tLa�j����ޞ�����W-��6�x$���Qkl���^hk��i#���E��l��8��t�O��ǿ|�_�������N:�_��E����ө�q�Á�x�!�Iǹ�y�j��_���B��?����oΎ���ؓ��?��QxOON���(����C���ڕ�ha�z��x����Lێ�~Y�CB�לc��=�Y\c��a��.[��c�9�}���B�z��?•���À�zx9?�ޟ��o�F{1�[O'��6���#�9���}��Ө�=�Zm qߑ��q�.�t���H�^���}��	��{�?�>���/�A	���~�����?��C�`�����x���1�{{�(���]����Ͽ҇���l��w�9<���Q`�<�q������0	�<���z���Gg=�O�?}h��|�6��<�����ߘ
W��}�����q�l`q���ɥa�RF=���� 
�����$z�i`
����1��1��h��Հ8��	��q�:��yn�89�o�y�h����h� s��#���4���iS���1�:���8��ӧOnF}��T��@�pF8�����?�Z���NO'ק�R����m�:�}?O�?ʝ����P��o\��2��y7�t�^��C�2�����w�Q͍��q����/�r�����#�E�5#
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��[�Cӯ�@kcϋ|U����.�Ǿ?Z�����Ή��[�4���#?�sۭr�f�������y|�|��S�Ԟ��|.��Io�x�Q��/
x^=B+k�B��<�g��+X%��ydk7���]U\����/�p�׮�[V3X\"�ԫ(���v��S�.��z��_����&U�T�X�Fa��X�2�֍:ժEAs5�ZQ�	U�ܝ'�v�l�w~%�����]Z����+�]��̒Zi�
�&�ᔳ�#d0�u�x��M�E��v�Y�?��_8�3�R�s\f���)`1X�"�6�oB�5&��.U�+�����瘚ա��YU�N����*T��/��EJQ����y�m&�3���L|;�l���g�|emn�Oa��)��FI�kR��I����'Uu��8�,�
�5�c��S��q��/u����6���C�dx�U���9�:oߣ�cq��jE��Z�U)k����ZЧ�W�7�����:O�tkm=<O᷼�k�{��w&��6�2\[Kqk~#h�H�n�X�)��c��=78����+���)E�P�i�J5兒�ﮟ�^������{Z.8l�N��0��8T�	>zw�EΜ�J��i��4�ب#�����C����_Z�e�1�/���.�&�����	�I�Z-�e���F�N�`Tb3��Ur�ͨ����빫�1�|c����	�s���Nzu�q�=�h�y�Lc�\z�����q�>���O����1�x�?��z�{c��zQ{�_����秷�Q���� ��@��`s�sϽ
ݿ�eu��Y��X��6� ���X�y*@�J���ۣ��a�Դ�i7�������� �I"�ʐFTeO~)���O����u9d��H�e$����WL�3��io�>�]� �r;�7���(���{�c�J?�#�#���=���`��׎}���M���������&�o�cj�@$����G_遗a�h���C���^�-�Ss�iw$�T3�o,�f)�(b3�M�Q���f��j���lu9��- \��۷���ѷ��zKM4I<�1B�"� Efad�p��@
��������=}�z��(�?�\t�z��c��G��10�:$��ٰk:\ڏ��⿳����U���9�w£���$��$�٥��
b�cO����2���i�5���
.�p��jWv�V��Y��d�-�Q�.��V8œ8�I����]��O�t'��q�?�t�R�'9��d~�����^�C���������nأ���������_��&����?Q���Ns�?�;`���0(�$��c�Q�G���Q�u���i㓀:��^��i�-@B��s���F�z������o^��&0#ߧPy����s�=�9�u��o�W_0:tϯ�\��?���,zq���@�{ŋ�λ�M.��?�[���+��������g_�5�/�����Qy��jz���r�����#�E�U#
(��
(��
(��
(��
(��
(��
(��<O�n~���e��v�s���Z�&Oi��S�i�%���ГM�b���H'�S���"$�#�(̡O�W��'�7_�p�-�R�9El�9�&�zt1e����(ԍHKi	JP���ܒm�
�d�|\p3��x�W���Qs�iTT�$��MM٭^�K��;�P�;���i�~$Xx�U�ޥ�}3�v�3M�u]Pj���j��[�΅l�k�]�f�*���;��x[�Wx�ĸ��FQ����^+7�<���a~���`��iƦ����:���n�\ck�gxL�v2�Q�xPK
T�=HT��J����NW|׻����?e�����w�?|D�a�x�Mм7⛯���-/Jҵ)5K=G�%���I�u�$�6zݚ��]C)�gC�$�tx��x;���9�8�����Y�y.+��G[��B5jb�}H���P�)�St�����������C
Tkʄ�&�78ӧU��uj�Z���;�Zڿ��ਿ�������
���g�j��xo�+��}{��'[��F��o��:H�6߼6��u_��*����$T�8G����xЎg�<�:�_��o�E�����t�-���q��*<m�O5yB����ż3�C�UWط��~Nmo��˯-�=����~ȾѼW�?L񞥦k���Vq�7J�u[��h�5�Z���Ɛ퉁h��1����S���Úcr��d�lV
�u��b�J2��5NxL�0��y�%+'�l���g�,��:��bg
��qXhS���ު�ZI-:7�t_���+��O�|X���,�6�^�m�O�i�v���#,ض��^���ɿ��lם�'�<C����U|�Ƅ��W���pV�IF��`�u��N_�-��6�s�&s���5�Es.Z�*{��݅J�駾|��
}�<|`��i�/��[_�^���^�ծ����qt^���Z�����if;C�y���-�,����W�s\Ä��ha1��̳:����T�:IP����9)T�:��I]�˯���\�0̣�ѥ��"R�*�hƕ�){���vi;{��=;����~~�Sx>��G��6�:��A�V��j�h��Ev/���K�4,��B��I���
��x�~3�9�	�8
�9�)�y��a�65�E��Y�)���9��7�e+��s�&�y��:�*YSt��N�K{7.oiZ��%k_��~8�?�_��|s�o�躶����vVz�Zh�ڞ�wՕ��c�\iW>JG���D�4e�'��g<ƹ������W���15�����[���hʕz�l=yST�t�ܰ��d��%d���2˨�xxՎ�:�a��j�Ӕ�%(�s�w�+ZmZڮ�'���S�������)�w�|T�K��jw�,���� C��z���u�x�Z�Y��a[&V�����u�sĿ�爾p�#�x��x��_��O(̳<N1������K��i8�����t�9�Rj����)���)c�Zq���F�)����MY^�v�w�۝o�O��#�!x�������GԵ�^�i�x3B�5[D��?�[�5oh2�!�ҷ��pJ��r�wy}���<�1�8W�Xl>Y^�Ds�~a���dzt���sJ?�9��A�����|�2��F�6�2r�J
J��hr_�ԯI��Y>�?y����ς	�?�I�>��mcb�"�jm�2�O��r��?�<����+��gt8�^N�]��lp���yo��bԽ��~��K���r��=X�ie�5Q��gO�����r��[������ku�|��.��C�~�*�<!��F����%���ܞ1�t
.�ṏP��^+�ey��Y ��a�s��_��x?�`��)���'��R�乆a��Җ2u!��p�[�ӳ�I6�7��qnY�ש��S�Bt��'��JjJoGN�Wq��t�d~��R��_����V�4/����]G��9��Eݭ��C����K�0Ewu���vP�ݞ}<B�g���n��/��\7��3����jգ7��6:�+�8�mw�m��u�9VE���2�:uy#;��Q�-$�����+�J���c�/���2����^ ��
ǂ4?Xx���J�����ڍՕ�	ocu�YX=��	�'�"�Qd+3����7�y�<y���.��S�q��#*�[^�<�bpԫ֩*��XZ���q��FQ�JNN)�)���fk��e�3j��,5*0�(ӌ]g	��%N0��ӚV���������X��H���^x#L�]]�k�hzL[j�WV��`�G��@�J��HfY�UFB�!,��>.}��|K���g�縬^�<v?Rpt�V���eyz�+G��U[���b�o��x�.���xx�K
s���t���JQ�'��Y�x��GKj���{��������.�:0��þ����"�[=���2��NŕE��9v0;<т}��.x���㜏0�:9=o���̳,Ά=}Br�nj8|�As8�Nؗ̚��wK�3�\�*�%��ic�^>��F��~�'zX�K���g��h�|�H��ic�k�	�m�]o�i��ߗ�ۋ�p-/�m.�r���P[!K�k���?��#�9%|��o*��*�e��P��aj:U/[��ֳ���Z��k3��V�8�֕��h��i��vu)�m���lυ����
g�v��}6��w��<g�iT�3G�ڦ��
y$�m�yi$���m��x���7�˰\U�ȱ5s:���f.�`�R��yv_(��c5kk���`x��Z�(ba2��ӧݓ�}�Z��V�z-��*��ᯎ��=j�w����b���~�ÃZ��Ƌ��O���.��iFa�-��w_o�}�G�8^#a�Yr:��W3��J��ӂ��$�������f�{��^��V�\��h����}e�c��.���Of�7�T�9��;�^^��ߴ��W��Q�{�|K���x�Q��r�i�^��%�k�ž���v�l-t��y�Yf�,��'�>xM��-�7�8c��_[2�S8�b�Ya�b�)ƝL&RU]\]'ʌ"���J2�����a)�1��N�J����'>iBu�J��\�z�7{iԱ�/~�?�k�W�~Xx�N��K���1�t�/U:����ڭ̑�iZλl�Mm�٬35��ҭµ�*#ɟ��q'��I��n)�e���a��u2\N+�XL^+��T��UuWY�
�����I9J1y&w�����^�^xv��*{HB�FҧR�yyj�Ϛ�����k�G��n�hI�f�����|Z��2������x�K��G�Q:!�ʷgG���O�W�~��$Q��'O0��z�S�XЎg�<�&�J���xg�,7׾���{��%���7�%�<�Q�ic�]����8���s�g��{My��7&���Oy��?k����/|Q�|g�i�!��9c�4�'U�K��;X��{��m{A�;ao��+���%xB�����qW���?'�\NI��e�}\ʼ��^/	FXzX�Q�<&_�NU]L}�*p����ӌc/S<�Х���8U�1Xjt�%)B��j�ZIFԥv�wkM[]�?�_������,|Se�k;�J�[o��v��t�&�X�)i����F��`XI���*2�*�o�>q��[G�3�FU_6�KZr�N'�Q���*JU�,e%W
Q�,;J-9I�����	��e�ac^#)Ū�*^�Q���R6嚷���j�p�Y�9���/|j���}⥷���5?��Y���|?��'TM����W��fk�������F�+�,�.x�����5�8N�H�8\�Q�fY�l��c0�\�a[%������ֹT�S���ƙNa�eХ��#�Η5J4cG�����4q3���|���=H��?n�����dž-�)i>>���d2Ϧ�&���/q�ëx�@11ki6���#$��^3�iW�1�=��Q8S�,���9Jq�%�V,�ժF��z_�=�|��������&�jt�Z�O��V�m�\����O�ǿY���w��[
��ccm�%�4�;��䱵�/lE�Cm �%�'r����8����8濇��l��w��p�<�`�׫�<V*�:��p�1��H���T�Sj����0Y���5���N��ԌcW�ri�3�y���=����w���/�K���ë/�xj��D��Ś~����F}J���Lյ�Q<�au�gp	x���C�l�œ��%|��Q��:�F#��:8�ӝ��&���_�N�Q��͒f�\�L~5�FR�%�*sSsR�aR�m�����>��ל��'�����~k�퉌r����?��v�����|I���w�]\M5��u�_��]�(!��Z��#�ATMs�%���O*1+�Q��3j����7(e���}*jܱ��z��*I.ir��╕��8�j��Y��*T��e�NQ�������Qn1�K�j0SmsI�s7dx�>�U�u�	x�ž�4�Ʊ��%��\!r�cZ�8��%���K�5��ک���_9�p�o�a0X�n�>=_9FJ�����u"����|fo��G��fg�eհ�<�<�J����wN3�R�XEԤ�)�SNM���o~��|�?�ڞ�o�j6�Э�u]KK�簎�{��hp��7S����Kuk��x�%��x�H�|?�r���|]Q�T������­9ST�(�L<gVrr��)N
�SM�E�^K�K�p^c�"V�
�j-e�8T�N�ntU)T����J�&�BTg*��FJ���{��g���{����w&�ww���i��i1���MJ
�[�`��[.�+�	v�I�ᘓ�\��ʸ�-tg5K����oʧUX��)�7(���w�+�<�?��q�I,=Z���l���Ua��C	NUi�8JPU�(��o�I��ֶ��o�#������[��9�?ǎS�G���ƾ:_�M�,b@u	 $f�<����m�
rbf|�ւ��R��|�_�릝ɕ�_.��R>j��|)'��ho�O�o����-r7�I��_�|;�h�h�閞������m<a
շ�n|��̶��>A�*}�u��>l6�#.�Q�*4�)QKwQ��Rp������#V���WnM%/Nko��������/
��a��^��L�A׼e}��H����ݴ�:�N�]OT�4++�}GUmCO�����SEql5�n"�����xl5y�*֭%8ͥI{�T�ݔedҴ�����[۩�QQQ��j��m;m{��|�/��\��!��z������0�?�2x"�Q�3��mgL���I�]
��6-'��rڝ��w\϶2!��b��!F8��֡*�*%�8�'.�ݖ���:�E���2Q��t��z>���~�s�7�O�$���x�I�~x����W�Eo��g�߉�-�ge���m�7��[%��ڛ��Cx�]���Y*�i֔�Z�
᯽RS�,����z]�*�IE+�.M�I7�ٟ5��*��
F����Z���&��ű�oI��m}q7�m���c��N��\�<7m��4��R�O޳Y�g#@��?W�=')a�┱���*-%�^���y(��k+ϷvRq���_&�[M�~��i��~|#�~'h^
�7�k�l4˽�^���׵�5k�(m㴵�P��E��{s��o[Ky��EH��p�=�eJU!I]�Nnя*{�>�ޭ�\����[��>����]�ŝ��'�</�=o�񏍾^�����ռM�hz��͎�>����-mLj0��c7;
�}9�T'FU���l�ԅ:���������ջ�^���IFq�m6�I�t<fo�+�ū��� ���?�?\��o�>&�֑�O^�P��F����ZS�����R�+
�m]5;�$X�,P��򛈶Y-^8i�#�!NTb��U!r�i�%�nk��B}��\���W�s���2�O|'�c�6|�~4�C���|>�q?�v��xT�k:u����>�|���ZJڤ_�oj��ݞ�7s���W%j���J����Wr���JI+ZW��mԩV�F�m_�����xO�3��+~���Ps�K?�Y�{?�����j��WXo|W]N=M������m�Z��0ZMp����ͨS����ӟ3���$�׳�nf�����Mȣ)J�[�YGG�w����&��g�g����G�'��|,��W�GI������ƍ�|�	ax���)��I<��q3���34��ٮ�+�O&�<-
uk{Y�z4�˗�T�����/ө3�uڜ�U��u���g�,��<9�:|i���о3x���I��|3�S^����Mm&��x��:Ρ��H����J�W�$��.`o���*���:9�i����zk�{��c�!���
S�_yʒWN����}O�|�'���x�����8�,�G��W�E�/�l��GN�Ԓ(4O�:N��\j����"i���>�|6v����Te
�
�U�a�5Jm%����改R��GDh�;ǚ6����_Cܾ�ܲ|h�?l=M��?e_�@�jƗ�L|R<
�x�Ek�7(����$M����c<����K�G/�S�7���r�����r�S��i�6�l��$���jz�Ÿ٫X��[m_��3�����>�u��
YA���G���k�jZ�]]7�%��}
� ����qҲh¶)U��C��R1��=:UQvV^���l�ԟouF�v]4mo�Nǭ]��B5߇��#�H���;ſ~!xƺo��7����{e�k����9�<�j��U槥�x���\�qeau
���g=�}��Yd*�)R��!V�Jr�*�GN1��?h�j-FI6�k��������N�]od�6g|$���(O����[�,���8���^�R��t�Rky|=���ծ�%��x�C�{-:�U�;���]��o%ӭ�Q���1
�ô�ť%�G���$�v��}�|ь���4w�<�
q��o��&~������/�#�j<Q��%ť͟�,to\][A�[+k\��&���J���fa7k���4iB�/0�N5V�7�sn�M���ݔ���[7��&�
I�ϻ�׶��<O���w���?���|Z�w�� �[�zd�(�~+�U���x�—W��>&��-�_��F���O
]k�h�k�+���[�+�29�+B�,}
s�8�YQ�F)�&��"����R���Lt\Zt��O^iI���޶�Mη��+���?���~�����=�j�w�5x{V�m�?��s@�4{V�R�n/�/��mum#E��t�D�Orl�WG�C��^��*)�I5�II�$��ی��}�n��q�y�W��//��9]{�
��_٫�?�9���:��_�F�>Z|X�U������),o�^[���a��u�1�z��X3XFe�[TrJ�:2�х(�u��t������x����^�ۮE$��q��u�E�)j���ƿ��U�bk?�>��|0�ɯx����ް�	״M���íy7�����}��bmGH�a�D��'Y`O+�a0��1�W�G5Z�NX�H�X�,ytR����M[R��S�N:I��v����I��S�#ϡ���g��f�WY����wú��}r�!�����iz<+7��t{m�]tMq�KO�g��H�Fd�Y=%(a�Q�Κ�h�rs�+S��%''ˤ^��9(7�~��m����h��C�?�o��/��,��߆v�"�^��[_\6����d�$�ڥ��������e��C�
^v�(c��Ť�F�-mZV��qih��њͷM�n�x������?c�xᮟc�Y|_��i�k+�:���~5��Q�WR�}GA����ĿxjKm[E���-��.\��9Kx����R�S�U�F�V�T�gi*��'x��~�˭�rGٸ���M5���Nf�W[��o����=j��W��
�|n���o��i��O%���Mc]�Υw��jB�>��>���5��L����ak��)<JYm�h�jWXz3�U�R�Q�f�m}����n�tJ�RpQ撊~���#���Q|h���o|T�/�/��
h]�ď�6>7�7��G�-߄~&�,��$𮵤���O��Γܶ��e�j��)M���Ჺ�|r��p���ZU]8T悝(�8N.)�ɤ�j��g*�T�q~�d��F�i�n��O�|]�0��u�D�{�����z������s�Gw�q��Ѽ�:�Ōw����t1i��q�}�	f�+�g���SG��|U|\iS�l���}�d����Z۬���������i?/>)��o�p|A����ğ��-
kZ�/�K��b�-!P�MBT�g����u��yqb�����-drx�EW��:�J��q����N[�OK������IEdz������=���o���g}{������W�-�j���>�t�/��o�C�I-�����rkF&��b!�Y�ʩ<=j�lTk�
�xZܩ'w�}RJ���V|ь����7���\�5��*7��r���?�_�^��ٻᖽ��E�
�P���&�s�h˨_xkEӢ�t-CL��_�w����(�5Ѕ���j9E(ʝ��OZ.P�����'i&�^�w��g��/�6�[[N���_ࠟ����lo������?�_�#񦉠�"�;�h ��5N��H��4��h������Z��y���k�Q�'M�	5�'��B��)+���yR�jRV�)�|��Y���^�iwN�]=O��M�#����H����������-;E��a��5?]�UԴ-7W�Ҽ�i6Z���=��WVq�k^hfF�F}����UF4���⽗�\�X��%&��JN.*�z)n[��%_�}{�����G�c�9�#x�>6�ú��e����<7�{8,u�!��{v�ԭ-�ba�QR�l�,L�Y�/�Z���:|џ+�<q�]���hm̓�W��s��1Ӷ=9�Y[o��(6�?������~��B��9��9��Q���.�s�z�=����O^�����E��h'�N�L矯�?�.����u=~�zѨ�s���5�t:U�x��,:��>��t�����ґ����#�Ҏlm�1�b�0>�Y�R��٤~�#F�a@P@P@P@P@P@P�߈�
�a�Kž;����I��������[{HZy�6���yu"Ƨ���3�TH��T�|?�y��x\� ˱�a��J�
#jV��z�%
4��Z��Uܤ�msb�xl��ՅT�)JR}"��rn�m蒻G����,���;V�O���ڏ�u�[�j��WQ�s���1��|���.����E�c����(��;��^%`��l��†}��ʔ�4�¤}������Ԭ�*���q�91U���ʕ��Z�',4��)4�t|�kk�Z��nj�ǟ�h�v�$�h�#�O��Y#�Km
F��D�i�p�zm�;c�������s��|e�8��Y���eyDU(Ԝ�*��/�I�|ت����]�w�����=��֫��Z���I(�~Ⲵ#�=��,���x�P��7�-
oj��k׾%�MI���c��R��h�����-…�.�;�P�|z�_�8�~�c�apoC,�pʄ0��4���:�2�N��7�,�ߡ���<T�I�S�ʳ��sSsR��t�oc�䳴����	��o��$Ѧ�(�V@�BT7P	��ƵhNU!V�*N�ӄ�	>g���ӳ�M���c�q�I8��ɤ�n�C����C���d�(�B�,V5U,UT#$(��U�VJUjT�$�T�NS�I��rm��mv�Q��*ъ���$��"v����af'��y��/�[y��	�~�~wn�9��q.��+�|����G[[������Zֶ�����{�߽�{��mmt�.m�@rx��A㐲+x�
ΝZ��5*��.��(?�-1��ZI).�'�����yv�Cos��$�$��5Q��zu&�ԩU�U�:��i�S|�`����$��@�n��h�,�`I�� $$H���� �x5���eIb+�x:�]�׺�m�ۋ�	�B7�ʯ�����{Eխ��L��6��ݷ�Vۻj��ў���j�o�ԥ�nog9B������wk�w�n1��/T��I0�ư�pD��(�ƻ��mD
�����bI䚙�u$�Rr�ݯ)��N�%yI��J�D��U�I.�Y}ȯ����%����U��!��) �â+�*py��5��8��p���R׌�Ԕ]�j�vi5��1(B.�S����Kk���g�)���v�����c8�*iׯJ�j����:���{_�������e�F2�t��R!C�� 	�0`�I�NzԺ�s��ss��ܛ���3w���vV���[O��f�mein�`����s���N9=������W-Z��G�J����&����/��_�	�,n_̹���|c|�����"1Ƕh���R\��֧�i՜��2H!-e��?�4�F�'���F�O��(W��1�P�N3U#9���MI���I;��I�4���ioM��쬭K5����8���(Kr�I���UJ��$�֫U't�T��}ғv~�P�~�7���t�	��g���^?{-�2I�O�з��8bq��N�hC_vg뿺���t7w���7��O$M�,1K�<�60+�8*#R�%�	�ߞ2q����O�I�4���k����"����1�!�ǎH�W'���zS�Z�[{Z�*�oi9Nޜ��J1����%������{�ٴ�ĞsZ���
�?�P���0l�w9�Z��cf��;r�*�9mn^U+Z�Zֶ����������4��("���0�h�TP�YA
�@$t&��Z���N��ɫ9Br��m6��Nͤ��!���$���k�-��P�mo
�e���(�B�.V5U,UT#$(�T�R�R�Rud�*�I�m$۲rm��mv���b����I+�����7������|����y����f�f��~�۾l���8�Og���ϗ��Z��������嶜�������rF���U��kܖ{[[�umʩܫ<1̡� 0+@f���S�V�n�Z��Vn��֎�ū��Hn1��/T��,V���PA1�Q$q�@�EU��jS�R���T��Ӕ�-5^�z=w��IvI%�ǧi�K�Ecg�-��m
K����*�<����Z�bq�$�֔-nIU��e�\�MY-6���S��>{;;���������m���)S�Z���j�����8_ו���e�F2�I�c���8����$� �W�Pi�b�S���)�S���&�}�����q���I-���q�:5�6�)�\V�Ee���i+�e��P	�pI�]��N�	:��I��4�)J�Ѳ�nݻ�IV��Ir��+/���6����<sӎ���\77�w�����ҟ�#�6��~j�i���7V�Co�/�>9��
��
wS�)��D�I&H���-���U�x�3���v&�aN}$�8��4kK�����?��LFI�{:��!�cqY���K��VV���N.Q�7W�h~�_�Q/�>O�ߴzE}o����n���{wq}-��oc�ܭ��U��������;;�e�ܼo'�pw�x*9z�x�*���S��=�Iʣ��aBJ�:SP��N^��)�99���xߖa�����cZ�UEU��­I�te(R��TUE�cJ�%�TcJ����F��?�j_ڗƟ�ύY֜i�ӂ[�sÖ��[X�D��J�qt�t�u8c�b2�F�	?�qwc����~�	J���b�qNO��Snm�_jֶ�?��<׏�Yb�MP�P�08'Q�6�$�Q��ԝ�=�mW6?a����į�[ᕶ�d�Pxc�/�u	K��jV���@f]:Sgt��T�m�]\ӊr�Ӄ�p����(GV��i^��*��Y&t�E��3�=�!B��r�~4�-i�/�S�ݶһTeʷ�VI��� �О���r�����c�*8ψv>*�<�k__å��m*��ە/o��`Y�V���xK��>eҔ��A�W�2�]�_�;��s�C�-����mS�l���
�)��~_���,�wc�[�ON]!>!�h~0���Օڿ��4ɥc	�$��$�*,��X�9��N2S�\�O��_�rY�7O��S�^�Q�;�[�������q�8��?i?�_��<w�S]��~�K�-׆���Kƞ�Ѿ%j7~��Qԯ<W�]^ZZEo�N�}s
G}�do*dҞa���S���:�j��R�5$��\���~�렝)�D�� ��M+7n�_g��_�������C�c�ͧ�O|k�=���
�x�H�4�ca��zi����O���x��ip���&������$8�:N�����j��]ʪwNOܚ�*j־�*�&�H�<�OK[�|�U��(~ƿ��%�o�ߴ��dž�|�c�_,�f�w��:�!�|+�x��D�t�xX��mO㫘uH上��`V-6ł���̰���������UW,��M�r�R�_���Wn����)�>uf�ȶ�{==Ꮩ���=�}��wŸ��&?��{�:7�F�~?|A��ڏ���J�{���~Ҽi�wf�~�";b�dC#�oU\Δ�<D3jф�x�ӵXͫ�s��:m'u�v|�w*��P�1m=f��]�}��G�W���3�N��?���V�x`�KL�Ҵ��]L���R�曩x��uX�3�.�}�Ak��q"�/��W�R�{L_���6��$�i�w{�e�#z������mu��������=�_��Ew���o�>.�~0��?�~,��u���������⯉��[Q���LE��Յ�k+�ֲ�ny���F�`�J�jS�cQ9(ތ]�o��^]o|)9FJ�*���W�i���O����?�/�?��7��8�����7����^
}�2ϭK���U�ŭ[��xr����<F�X�[_���Z�x�>��,�*5S�I�9�r��T�IO�q�|�/h�k��F�5 ��>{-5�mu�<{A��l�?���;�/����-����7����k���Zֵi�i7:��<3��Z���M�ٵ
RB..Ikm����(�0��
�X�m���Q�Q�Zj4�$��k��…Jr��y��I]]j��.ߑ���w�Y�/����H|1��a�I�wu���k�ڝ�}?�5mSC��I�O�om�th�Ac�\]H�Wq�C�����C˙�pS�`p�ZΫ�ʪ�x�/XR�d��ir�[UmmtiJ3U*Jq�R嶩�zh�r-{��/Ŀ�*�_����x��{�7�]��G�5
kEkK�v�~��mSH�ד���{a�[����m���,���!���T(�q�ƴ�((��.si�Ǒ�4���V��Õ$�����z8�G�	�FY|���a+�[��,������ϧ�_���5�	jZu���(���o��-�����ǍBDkw��g�u�9����14d�IN*jN<�j0m)���*��jR��wp��;=oߡ�|���aw���
������o�:Ə�|G���#�w^$�R�B�=R�U���O�U�-���4�GZ�o'�����]3^#0��^k6�Z5"�N�*|��Ѫ��)�=yd�W��)��{���Rw�j�z���@�!�s��~3���|?��G���^7����OӼU�]?N�x�]����i��?��Ҥ�풄��'yO����<�,F_���թ��3�S�
��*7?gQ\�4�U7����F�X��M���i~k^�w�ٙZw�GxW����|S���!�����{ϊ����7ⷃ�}s���h�"�W��⧆�%���t����ҝu�H#�����ag�b�����=��S�N�E4c(ԇ��K�E�h�w}�(MR�eMN�rW�>ij��~{�qk����'����-C���<=/��
���_������(�m�^������{���;��hf�=��-q<����W�aib�IN3���,F&�g��R1�#8�{����wZn%FnMY9'��M]6�譺��,~���x��	���u��y=���5�ϊ���Ht�CC��O�v���⤲�K�;T���Q���C$z8�b��99���^��j�]!J�,�����+BW�V�T!�E���wwV��'��}�����/|c��/��s����C�xwK��
7]��H�^�{��$�Y"_�?����U���-�Vo7`~,�B����_�8�������Z?���iZ���8|pwW��O�~&�R?h��=�^��3P���)c�]+R���+P�7Ív��I���5mCA�m��>;�W[��d�K�v�"�rHn-�3uo����aV��7	*4�*�&ӌe'*T׺�6�_]��V�IE�W����]��m�g5c����i�[��>j�ǁ�i��5�.��<����|��� ��~4����_�3��h�r-��r�\Y���sN�0�a)�11�T�sG����:R�k��[J1��3Z�_#�t�'�������ѷ�-I���>|�u���ڗD���<�	��t+[i��^�4[��_K�:�I���x�kbM��h���_R�\<�ᄖa�[�NNK�>f���nښ�|���T�����n�o{��Sص_�߶��S�{~�����>| ��¿�
��?���
�a�[㿆��_X�G�
�Z���J��D����q���hl[��8���b�Ա^ڼ�P�r���+��(�jP��I��j�E��rԝXIÖ*2[���$��{�/�o�	�㏅Z?�>	���_�O��n��<U�����'�.l��{���:�C�S���4�[V��?�]\$���X��hz�ӭ(�Y���䋩��6�*��q�7����)����l�I�8{'w�&՚�u̟��3�־|N�?e������o�CI�e���-mc�g�N��2,ז1�{}�j�h���]��S�|���:�~n5���b9��snwqS�vN�(�Z�-�u�%F�VӲ����������?i��/���K�ޥ�u������f��4�Ws�i�g�MO[if�H�����59O��`	�=�,��g����tқ�J�Ӕ������O�Z-�i��#��Y��^6I;�{ݏ��f�'�?��ۂ��� ��=�K����|Hm[A�x�����[ĥ4���/��l�{������+���"��chW��$�Yc1u�+K܅j��=�r>��N�4�%�����i��k��?9�,��=�l|��<1�|���~$~ٿ�(x*�x���
�xF�)�
�~ �k��mg��5m?O6��z���O
����q�G3�ƾ
r��i`jR��*��%^��l�ۼb��u���2�*������U�֚�g�|1���
��
)��7�o�Q�m�mj��S�e���h��2�q�Eg�X_x��~���o-���k��{+���[�-ٲ�O
W,�㉯�uk��)Gi^-B���v�+�w�'5Z��y�������|���l����F��⦉��O�7�/�t�.��o�I.�5+
��Ưx�J�[�U�leH5o���ׯ��_.��yzp��=lB�FR�&_Z���Nj8yE��b����Z(N0r���V.ݯ+��s�S��a~�����S�T_���ڎ��Mź���!���=OL�O����叇<q�}b�
^�PԵWW�lM�6�
��]��n�ఘ�G�b�*q��H�$�m�Μ"��Z7w����ԩ(sG�0�n��~Vm�x�	�㿁�W�����	���k�Z������
W���x�9}�n#񎂟��id������z��K����OmLҞ!¼sI�av���7*����_W�
o�s8�p�]%6ޒ���y>����C���m�	��O��x�I�+�	������/@�ׁ����w3x}>#x��V��l`�տ��:ƹ��������ʟh��cp�hfTq�BU��)T�)�jUe�{*n*N��c��#WNQ�)F)��IGD�m��]5<?���>6|T���O]�`c�_�~-�Ї�<���Y��1�۴?��#|^ho��+��ң����,d]"YCݭ�W2t`qxz4�Ef<����W�9����Iҡ����M�yuV"p�����iZQit�y~K����(x;��g�~�Ѭ�����^����g$���j���E�OD�s�֖���FD@�����*R���:P�)^W�Yw�k��Θ&�-ZZ��b	8�c�1��85̺� v�z�~@OCӯ�~b�?Ã��A��n����݇'�z�q
A�Ÿ��ۜ�{����G�@����<~#���i_��;�x��E��GM.���g�89�Ղ�{���~k���2�����u�V������Z��W,�)��l�?
�_��R0��
(��
(��
(��
(��
(��
�����3�pѴ�W�_�-t�CO�t�c�Z�e�/���[m26{�-cv�InR��D��.�J�����x�V�2ʸ�`�،N38ʞ
5	W�*⤣B5d�#R��V�����f��'�
��у�8B�4�RnrQMA^N)��QkGٜ���g��v�u���τ�54� �A���ZO�!��yd����5�ʹCJC�M�H�@c�I�|W�_�L&�q�B�]<�E��O��5��\*ӫ'�����*P�R�K�5��Y�ԪbgRXz-�T�+S���x�ť�֍;�=�������ZG�<�����j�zn��Y�X���	wd������\\H���yd��g&�0�s�ӈs<fs��9�e���b�x��k֩+(�:��:��N�\��8�D�g����O��
TiG���)n�J�ݷm[m�Ζ��`��
(��
(��
(��
(��
(��
(��
k���<t�>�|Y���b�Ã9.���ӊ��]�b�:&0�5o���θ��
����מ����Ơ��q���1�~4w�ϒ?k�3����?���i^0�-u)<+�� �[k˘��[��ki����O���o��c2�,���q������a�Q��*r��'w8Iӂk�)+�s�_|8�<@ʽ�n\>g��^Yv5S��N�H��T���Nr�N-*�ҋ��}?������+��V����Lj�Yin�m���㻷زE/��C�ex�w[y�<rtj�jͼ=〉�Jo,��!�j�U�)�ɧj���zǙ����<A����e��*Pmӯ�akc�XYJ2��G�&����+Ż�U�i�~��8,m������񖇩�^+xF�]�ӄ̪r�,��UNj2��Ҭi�*��"߽S���Q]]�Ÿ3�M�g��GǙ�"�d�_	?~�g����#k�[
�-��m�?�/��>���&���|u�Ad�#�4��Ӵ�[�
���xm"���*}�Td�(�)����<#�\q��ֱn�bܣ�)�9F
S������ݿ��
<2�<?�\`���P���Q�&�I:T��8S��U��ҋ����}�� �۱��?O����t��G��os���!�к���Rq�^;Qn�}�t�$�>��_���[�ӧ'�G�6��t�y�8�:Nx�&�j�`sߡ�1���G�� �2G^G��O�C},������_�%�.��G��w��?���
@�?�����G����`�9�q�t�q��<���Jq�_n��„��9c���ӿ������`���\?��]@R�\v�nj����4����������?�i���=H��O����@&�==�C�÷��}o�~�.���?J>_נ
Pz��zz��4�:��U	�<G=��Ө��Vqל�;v�?�j;��u�q��=1��u��@���=G�J>~m��z��;����m�����x�����>�?�O|����oN���^�%���9��į
�GF�m�"�n�i�-6��SצCS�^��Ewy�mj�r�AoSZ�:tg9:t����+�o��ܒ�����=��a�i��/�x��þ"�U�[k:u�����jvz���[����Cuc��pO��MRE":+J�ZN��(8Iŵ��'f�i�*[��O����EmVТ�
�Q�a@H�F��U@PF�d������J%��N;���z�4�v�01����:w�����`�����>�җ��}�.�sǦ9����р�:qϠ�㯯J?�@]��rq����w���6���?����[w��A)y�_lzd�sG^�%��8�'��{�_���^0�O��=i~�p�ٳ�t��$�=�;XG7��
���cI�	0��9���]8%�ׇ�_S�җ�W�
O�K�:}$�[�Xb�~E�Y�R��٬~�#J�a@P@P@P@P@P@p�>%x#�G��������o6�����N��p��$e]�
������p�g�]��ɸw-�湕X:��aiʭWΝ7.X��T�Ӌv�k�ˋ�a�^#Vh���6�n�i]�E�����e���(��NJm��]ׅt�o��ϫk7>��:�Ct�@�SFya�Y�T���d/o�0���.�o��?�^!���2�Y�+�c��	���Q��*t�1�%��'8�G�R~��.o/�e��;�W��*�iEԩ*2_�����T�G��z-tV�� ��khb����!���!�5	P�X�4QUU@U+�*�*U��՜�T�)N�J���9��S��ܥ)6ܥ&�n��RQIE$��IY$�I-]�jP@P@P@P@P@P@P@5��g���?�pZ('Ş.����^�5�u�>��Q�����+�c�V�
/���B���Ϲ����?���l E��Go��~��m��=p��O���-4�ٞ�c�v?O�v�_��������q�z�k���?�?�*o��y2��c�9����M?��	�=p{����Q}@P�8���^��(����3�>���<v�;�0�t�;��{v�֕��ӯ���?L}��p
�=��o�����@�\�?��J������6t8��<��9�����8�矠�~��Z��~@@9�?Q�c߿�O���]��C�3�������:������}�{r03��y��G����;r8�z�g?Z6zt�����\�S��l����z~�qJ���a�:{�����u���ϡ�yc=>}�E�Kl��#>�珥}�P
��z�q��G����=6���ۜp9����ҕ�����L}HϿO��O�����`8�(����M�:c�����{����������ǥ��]���~���j/�v���$d����/�_���;m���Gҋ���g�Q��?\Q迯���n��=a��8��4i�>�����!?��s�QVp�{����ѷ����t�q�n�힔=?���l���u��_��_�>�}Nӏև�0��9?6q׷|��c�������<��4�߀�����Q~��A�zv���Z����dt9#`�R�����8�'ǯ����輸{�rOL���UW���|b��_t��o^���ө���6���ґ������I��m���c��ڹ'�K�O�f��W���*��P@P@P@P@P@!!Af 	$�$�xI=(I�e�z$�l��k������K�����>�`��G��m<Gk���$2.�x�S�;�����T����a���5U�/�`rJ5��9�N�W�է7[-�8��#8�U�ZR��Q�:�J�QrO�3��W��e.��zjբ�ӳ�洹W��k�^��v6�e���e������Gڣ��z�'^�*�\Ey9֭9T�7��'vϥ�T#�Z1I%�u�A@P@P@P@P@P@P@P@�t��C�o����O
����?��ۡ�گ��	�_1���i�C������q����8�s֋����=y�u�1�O=
=?��d�	#�y�=�Q����{c�9��>���{c��E��_�$g����R��#���{��������y��/����A�����=}��� �c'�N}:�ӡ�އ�Nq��?����c��օ���q��I��ӿ����~>�ݨ����O˶��9�����1�9��߯�������	���Ӄ��Z�����1Ӟ�CS��_ =~�s�3��Q�@
�9�y�i�����'�=x��<v�֣��ר��{��?�V�/�p��z�v����@���ӯ�[�ӊ-}~~��Ǯ=?�T�`���GN���4��u�=��h�]u۞��댁��(�o�`�^���V����Ҟ�w��6����?.h_���q����s�t���QdG�G���Q�O�oʖ��~|�:�3ۮ:qN�v6�:���{q�8�(zy����8?�.�?'��G�_L��i�o��?��R�_0i8n8�=2xǾ:��������?O������ӧl�=�����^`q�}y�g��#�`(\��On�z�88�������.���R����נ���^���m����8�}h�����=�]m�3�5?���S|N�sې_^+�������挫���%��Hō� ��,���F���K�O�f��W���*��P@P@P@P@P@x���x�K��Vo�:6��x�����֚T�Ů�oT�I��kh..^��Q6�����Jb�7*��6�dx�;�8q&7�ȩ�M_5���N�X
9�x�5�Z��F�l2�	Σp�9��(�vo<L2�s�ӝ\K��#B0mO�ʌ�9G�J\�|�%fݬ�<����/��~��7�<Y��B�.�E�k��,�u���^,�Ɲ�ڮ�ss=�#H������
�xQ�>=g�)�x���ଳ(�sK-�`*el6�;�em<N&��ҥ
�x�x��ԚN��w�����h,Ƶz����R��Ns�>lEg��6⽛��j}�_��BP@P@P@P@P@P@P@P_;N:��,�];��\
���Io#���i=�6����cM���1�;m�pp��
:�Kwjܮ���wo�����+;����'�8_O�7�����p=����s�ڸ�w7��q��g��~�(��#��z���<�v��w����J>l�r9�#��>�� n9''�y�OLg��.�'����Op�Gt�u�;�;c4�A�ǧ�z�€8�3�g����h@��q�r0Fy��x��1����$�<���t���N��{�קSȣ����H鞔�R=��}={oQ֘	���}��{�<���	���H#���;��J:_x�y?�où�}x���?_��C�n��힇��@7끐y�zu��ҝ�\ל�<��8��7��HFGn��9�T�0�O�8���By�qۏ^���� .���}�w���8��t�s�1�8�y��j�s�����
��@�C�3ר#���#�� �pO=�����MW����>�������G���Jzw
:�9��(����?.8���~)���g�s׏Ǐ˞��\�C�l���H�(���s�'�=?n;P�n�L��9�z�=@P�b=2y����J����2:�ր/\~~#�ݳ�(�ߨ
�#�t��Ҁ:�逤��_׿j�@�>�}�/\������=)m�~x�8�jz�m8 }G<��?S�lz�;�p:����c g����?Ҏ��r3�����<��~_�CƷ�-Κ��¾�k�Ůc�7mm�v�|lB˸�º�JգVZF��[{{�4�������Ƴ�:�뮗��t�b쳅Nr���`�(?�rKYI�o�5Z%��P@P@P@P@P@�_��\/�������?£�ڇ�_?�o�>���/lu���jm{��2x�{��
�vv���x<��K�\Fl�?��0�}����W��6xU)[��K&�J-7w���*>s6��[�et({i�x�FR淰^�
MN�_�
��'�����g8�g�	��zd
�A���t���>�Z(��
(��
(��
(��
(��
(��
(��
(�# ��I�%���,����]$�dette �Q�������q�*ң.h٦�(���^�;��m_u}	�՟MS[���k>-��D!ӵU�mY�&��R2X[k)�ݏ��{�����IV����W�s��h�ZڼtN]����b�	G�<]�4M�W��:�\����_��/_�)�r�������`��ߌ�zu.\����_��/_�)�s�����ěA=�;��@�S���W�	��������?�@�<\r?�41���W�q��������4��x^��R�����$�.���.�{��ҿ'���)r�?��+���z��K���  �O��ؚ�������9p?���i��������	?����.��?�e�S�鏭������4��p^��R����<O������W���h���W�	��˂�����/�@��\	D��o�	_�Ļ����?q_�&��/�Z_���X��g�$������}h���W�	��������?�V�����J���ݨ���W�	��������?�@��Z�
������K�x��ˁ�����K����-/���?�(�p�$�����N���ˁ�����K���%/�����.`O�6�9�����S���W�	��������?�V�.��.����=���y�.\����_��/_�)�s��>(�x�It>:����u��w�[��?q_�&��.�J_�����.��.���:����?:|������4��p^��R�����O��� ]�MN����:R���W�	��������?�V(�?��?�M�N3����Νܜ{�9p���i��#�)�r��(�nO�I�,���ワĻ�0i����+����z��K���+��D��J���wn���p?���i��������%>-�hC�߃���ʎ\����_��/_�i�s��a�	G��bhx?���������/����z��K���+��� ]�]N���u.\����_��/_�i�s��b��M����к��;���.���4r���+����z��K���  �?���.���+��p?���������4��x^��R����|Q�ޟ��8�L����Fy��ˁ�����K����-/���Q��?�t>?�'��%ܓ�֎\����_��/_�i�s��`|O���6��D��?J9p?���i�������<O��?��`�S����~�r���+����z��K��� 7��� ]�05;���߇֎\����_��/_�i�s��b��Q���4>G}J���9p?���i��������G����&����_�������W�	��������?�V'�%>.����W���u������4��x^���������C��N��7Qˁ�����K����-/���Q�?��!��������W�	��˂�����/�@O�J|]�@M���W���K�����W�	��������?�@w�$�/�t]}u;��WR���W�	��˂�����/�@O�I�\��t.y���y큧�>\����_��/_�)�s������`�Oo�+��?���.\����_��/_�)�s��x���`��F�����S���W�	��˂�����?�@O�J|\���qΥ��7w���?q_�&��.�Z_���X��s���zdjW����ˁ�����K����%/�����. ���^��2����O��?q_�&��.�J_�����ZG:>�ۃ������)r�?��+���|G�R����|O���C=�5+�ב����鵁�����K����%/��������h|r?�g~=G��}��ˁ�����K����-/���ľ.ue���#�bj��lA��v�G`�4�Z�LK�t����U�_ �夼����g
H4�:���/�[����vC�_�!E����/���?36f�!8{*P�t���'��N����k_$8�i�N\��]�^IYv��=>؋�zv�~�W)�-P@P@P@P@P@�~)�?�G�|%�iZ��W��׾�MS݄m.�u����\��=��J֛?s�,:}�U�\s�p�q�eؼ��Y�C2�p���$���*O踩N8��noD��W���N?��N���_z����$�9�N�Z|�t��=0��
(��
(��
(��
(��
(��
(��
(��
()!Ix|���OOʀ3�LL�ѷ=���H�9���Ҁ#:dg!���q���4��󀧎���{q@�ˏ��g�秷oҀ�� �1�:�zv�1גq@4��I9�^������
)���۶?�������=�m��?JF�ШO��v��qۥ'�Zc=��H����x��(�bl��@�����m1K�v���A?��@��^�=}��:~^��.�������##��Q��?��������@
��O�v��9?N���Q���i9<.s���z{������=��n���KBz��`z`x�~?ƀ��t�<(ϯ�__lP.���zu�:��^��K���#,;/oç���4�H�8aӌ���@�����?)� c�H��@
:Zd|� �0@��?OǑ@
4��������'�Zs�z���@
t��>R;�'��@4�
��t#�=çZO�F�98^r0(�LA��Fs�1��s�9��4��<`�����Ҁ�i��x�a�t>���΀�.3���P8��3@�\x��O�,��'�Tx?+g<.:�?���'�\�=s�.�zt�:dC�������@��A������?,�?� ����{c��׮x��q��<�={�t�?����C���/�d{��x9������@	����Nzg>��=����A�H���CǷ�9��e�?w#����9�KNF�3�~\�.��z�4�-�;�?�g��?M<iq��w�'=px�g���ZE*�����$��h�P@P@P@P@P@P���-��)�~҃D����A���i?lmyt�h��A�_���g%E���-�m濧�\����'����G�p�P�{��b����O��I�^��_N[�����]?�}���_�wW����//���^[y��5��}�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@�Zk_����_�Ya�³�����g�w��~����/���?�O8�����B�@�������`c}R>��g�}c�Z�淽�n��O��ީ�����W����־��77'7/�䵺_��}�_�NP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P���5�3��$�b��|��3�?�}�T���g��<��y��f�7���m�v�k����A�����O�{e����������~�����<�c�j{~Z_ڞǗ����Z����r��=0��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��?>��k�����m�� ���	��?ۿ��������<�3������5��[#��p��K�+�n���۟X���ֽ�/���������|��&'�n���վ��n]9��9o�^����Z�w>�(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�Ͽ�jO��Ŀᔾ�e�?�*��M�ݛ��ie�����|�3������_��
r?����^޿�����?y�>���a���u�v���S���?�w�,~����i����o������~�W�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@xo�$�?�|�3����#?l�ٵ?��F~Ϳ�O����o�s��v�6���/�?��_a��P?�=����_��j{Kr�/i��k�:�>K���{l��S�sR��<ܼ������[���{ۡ�U�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P���z�7��5�%�_�����?�%����߰���_�K��|�G�fq���_���^�����9��_���G�����װ�_Y��W���y���O�[�'C�?�j��?��>��_U��#�'/?�絯ӓ�}�_�NP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P�4�ş�y�3G��*�S��`�a�n���_��~���7پ��c�ٷ�����i��+_���_�q�]?���>���P��_P��R�z{_c�/�5ύ��������?���X�^ʟ7��|��ח�Z�g��G�]1dP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P���;����֍�����H��>��_�}��h��}�����go_j���+���?���X�'�O�7���}G�G�{?g�=����ӛ��h��r��?��iO�G�og��e�~nn]�ӛ�{m|1�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@��2Y��������1�
�O�D������}�;1�~^3ڿm��������ɕ��O��m_��o�=���c���$�����Õ�������c�
�H� ��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��?6�f|o���¯߮Š��=����6��_�;?�{~������|�k�g�W�O�������s����K�ٟ\��/���v嶧�w3�\������i�?e�/�<��7?I������
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��>y����S�
��?�m�'�	^~�k�a���X���~ן#�Yy[;g�7�C�-��m�O�C�_�#��o��k��}����77��'�[�����1���*�˗����5~rz�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@|�����k�k��W�_�A?����o���O����^_ؾ����ݛ��8�׿�-����C	���������S�~��e��'6����<�*?��֧����}���yyy����{�}g_���P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@�o�����G�_�g��S�o��x����%_�����=����6��^w~��~���J��9�o�"?����]��d�r�v�����O#�y�_�ג�������~��?��>ӛ��~�W��A@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@|��
G�j�e?�E�c�	�!��W�������?����G�_�c�G�<��#���~j�O�!Vy���"��K����������g���}����V������s�w�r����mῷ?���#�_V�Ϸ�~N^n^i�9�[��O�����
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��"�h��f	��1��c�i�9IE+�4��۲vM����au��z�lf:V��9�-�˕
�M�@"V�	-�+$g���5��.YG�Vѵ/��ᒷ�����=��?���|�������O��U����<M�?�!�!�����������?��k��a�q����&~���{�>��a0�*��^������������By��/�4}m�&�O���ؿ��[�_����R����a?�����0�*��^�����>������c�q:�r=F~�}n?�	���s��/�V���"`Գ�#?���B���t���O��������{�?���q�����C?��� =�>_^��.?�	���S���_�������D_�jX��'�� �����>��k��0�.��~��������CG���� Ϸ��c���G��@�?�?����/�V���ȇ�5,����s��0��YQ���@�?�?�Z?b��o�
� l5/�<N:�o�r랾�}m�&���������O�J<O��Ѓ�=>�z�Q���@x?�?�Z������@Xjy��'��}?�˟��G��@�?�?�Z������C��3�	?����an������q��L�
��-���D>�����n����_���:>�������/�V���ȇ�u�<O�?�!����k��0�*��=�����8���
K��<M��&u��/�׵[��`��T��h{�?���q��C��_�I�L}��`��ϗl~={Q����&�O������D>����G���B��ܿC�>��������?��k�����Tx��hA��t}mk�Ƀ��S��/�V���ȉ�
K�������:��r�ף�q��L�
���zؿ��[�_��}�R�?�(�9����T����z{)���{�?��q��@Xj}�Q�ps�A?/��9��/�����ટ��~������C���
&����4}n?�	���S���_�������D>������lv�������~�����`��T��h{�?��k���j_�4x��0~?����G֗�a?�T��h����տ�8��!�
K������B��\Q���@�?�?�Z�����~������A��_�Q���@�?�?�Z�����>������~G� �g�X�G��a?�UO�Z������D�����'�x�O��;�ǝ?���0�.��~������G}�R������!��y~^�—��`��T��h������8��"}�R��(�7�B0}��s�sG��`��T��h{�?��q��C�:�?�g�>}?� �c�?Z>���	�����Cؿ��_��� �R���a3��t}m�&�O������@>é�������T}m�&�O������@>����Q�|z�hA����������Cؿ��[���"!��x��ߎ����ʏ�����.��~������C���
'�1�~������k���*��=���տ�5�ȋ������q���m���*���=���տ�5�ȇ�5.��?c�BO�������@�?�?�Z��������<Q�r�!�%��>��������Cؿ��[���"�S������F�&�Q���@�?�?�Z/b���?��}�R�����1���*>��������G�_��������j\��Q�r}��3�:>��������E�_���������?�Tx���=?�˿8>��}m�&�O���ؿ��[�_��<rx�M>m��w�2���/�U�#Dm�껒� �4*�j�V�:Qn�\Z}�7�mwKV�q�%&�TwO�N[_�;�[�[��vyQ1��Տ���*�RE##l�7YW��KG�	+�ki/���]9�t�v���z����a@P@s�!׿���!�]_޳�gm�.�S��Iʉ��ɗO��rGE
*�4�.ZT��/Tڊ��]�z�fu&�eyKH��+��p����3^k������t���`�*bU�ݵp��[� 
^"��a�N:k]9�髼\-w~��NZά��M��yY�7�:���'�A|��?Z_[_�	���S���_��������jY������&��G��`��T��h����տ�5�ȁ�Կ�h�?Q���A��>_��[_�	���S���_�������D����&��B�e�_��>���	�����Cؿ��[�_��}�R��'�?����ߏ�z>�������/�V���"�S���<���p2�Ώ��������/�V���"`Ա��I�M������/�[��`��T��h����տ�8�� lu�(�9������q�:���@�?�?�Z�����~�����n�����/��G��`��T��h{�?���q��D���������[��`��T��h{�?���q��C����&�A8=��˯_n:���@�?�?�Z?b��o�?��}�R�*��L ��>�}n:��a?�T��h����տ�8��!�
K�����-�g����v�?���0�*��-��������Q�s�=�������	�����U����� ��������}m�&�O���ؿ��[�_��}�R����ݸ�у�_�r��q��L�
��-���D>������l�B����ޏ���������?��k���j_�4x��s��_�j>���	�����{�?��q��C�:���&������sG��a?�T��h{�?���q�������O��8�>����G��`��T��h{�?���q��6������� �?�ˎ�Q���@�O�?�Z������D���?�h�?l���s���������G�_�������D_�j_�4x��?�0�q�>]��Ծ��������E�_��������j\��'�?�!�w�y~�}n?�	���S���?b��o�
�!�G�����Ѓ����T}m�&�O���ؿ��_��� �R���� '�B���q��L�
��-b���?��}�R�?�&�?\�F�B��K��0��*��=�����8���K���<O�?�0����v��q��L�
��-b���?����S����A�c]���<���-���տ�5�ȋ�
O���r?�!���[_����s���_�������D?��,���p{���������?�UO�Z������E����<O�o�>���>>����������Cؿ��[�_���`������B8�?�~�����@�?�?�Z������C��3�	?���c�����k��0�*��^������9�G���a�_���k��0�*��~������@Xj\��&�P����Q���@�?�?�Z�����>���x���� ����ӷ4}m�&�O���������R�����0��>]����k��0~����^�����>���G����c�]�3G��@�?�?�Z������x����oO��[_�	���S��/�V���ȇ�5/�<M��:�N^��l���@�O�?�Z/b���?��
K���<�h�����q��L�
��-b���?��
O9(�6=�>���G����T��h����տ�5�Ȁ�Ի������������q��L�
��-�������U>&����}�������G�_�������D
���T�'�A?�=}��sG��`��\��h������8��l5?��N=��`���/^��(X���&�O������DrYꑝ��o��E��"n�2T$}t�C�E��T��Ni���� �/�j��k�I_�������
/]XJ����Y�ܪ�N�$��p���J�9 R6��J�9T�̥jRz�����^�kmZ�We8IF��zFj���W��#�k���|sp��E#$}�P��$ ����B�	U��^9Ys�)*x5ׂI���ҭ5�
R��wJϣ�ʳ�=g���3"�!�8�Uc�5@UB��<���r���rm���4J�.ěW���[����t�qО=��pz�y��g�p1�L��S�p�~���q��=�_�P�vr99��Qn�8�<c�OJ,��]�6��۩�s��Э�&��q��<�P֟��m_N���>�k�\(�;{��O�J����$g�3�
]_��8�N���>�?���9��y�ք��@h�A�A?���u��*=0G�O^�ԭ�\j�q�s����[P
������5�������R���и��#�����Uk�����)=���>�;+w1�=���_��ڎ�W߃�s�~�}��Z����u��y����s���n��]@]����������K��	�?��P����h_��s۟�ѿ�]@M�9��?#�ע���S��?�|�� �=���΋_o�m�w랝����|�@
��t��n�[��G����)k��q��y�8�OO�	��lc��s��~�M.��@6gv��BH
:��y����ӥ������?N��s�Q������8<{�rq��F�]~�
���9�������*���x�瑟�{��n�7`�N>��k�P��:�G�{~�6�I���9�=�۶��(A����{qE��J����܏��/˷�M	���� �K�K���������a�r@�vK��O^LB�|�*s�W��0Zb_j�3�RK�=.��€
(��p3@_y'�<]�	F��,�ϳ��f�n��c���e���y�Ww��/sB��֥nkid��߽��k�w��:֩�[��濧t��c����o��[�	�}����<w5���v���W�
@玽3��C����6����>��zv����=���?JV���3Ђx�zs�i�?���cr^��[��&��#'��~ϧ�[V����g������1�?ƕ��� ���~q֞���?`>��x�N���R�X��ןL�O�����p{��|��[������ r�򥷣�
8��pq׌����S������o���z�?��F�_����y�?���� 
��>�^1E����s�G���Q��\�9�t[p=Q���}}?J^O���0r9�=?�֟�����\LѮ��lR8^�I�:u�>�+�0z>��0x���Q�~�.�y�~�_Z_�6�\������G��;�_�����ϧ=�G����1�=z���?��<�ny�����ץ+Y�_��x�N��9���ݿ��	��Ga��v�~@.�죓��ߧ������g>�=�ȧe�B����^G��>�[U���Tc��??�}(���:d���y�KZ�Ga�\���s��ދ}���`����֎�^���]�����py�ӽ��B�c��?�R�_�@
��v�z�=)�` P;�9�s���[��p�{g��ǿ֋.�q��H�#=�A��2i�Ǡ�O^���[��Ĉ��_]*�6�'��c�9���7S�������=X&��J:�Ւ�%��RI߿���M��r^�hz���m���%���Ԡ<�y�k�_��3U��G���1��Ƅ�5k2rC��V�����1Pʿ����/�9@�3��g��5��t6~1���ǯ�_�~�_��:c��G_��=��<����㨧��v��L���׊Z�^@'��ӎ��|g�zu�6���3׌g#��	�I����p:�}7~>�0��d�����Q��y}�?^����Xg��9<��>�������J�ר�������S��u���?^�מ���4���&�01ӏ�����������'����֍�.�!On��c�n�+��|�s�8��>��ov���<�~<���h���|��~^�Q��X8��?��T��~ &̎��׷��ֶ������{��l��<�g q�9?��>�E;�LgA����}?QK]�6N=y����^)�]_,1���>���p��x�<�����&��w�zy}~^^�#��F���q��z�?҇}�S{��%���#��?�?�ҋ�����$�?^��z��B��O���>��^����03�������g�����P��\�=���:[[��q�NF?�?:<��0/��׮1�>���)�+�c����)t�@O+��0x����N��|�zg>�N�����{�`���}_Ɛ���L��=:`u��G����'��N����ӽ=>�/�����`�zu����<��8�;���x����{sǠ���F�y}�{��c�x�����zv������:��]_�/��37����B��/�KG�)�zW��P@��V��
�-�?C���{g�
vU�r����_�D�ǭ�_�y�S�3Ӟ���7�̓��oN����5���:����;d����Ͽ�8�9����W��d��^��q����֟���p`<�{����-��l�B�8/����S;g����˨	�����c�ҕ�|�@=����F�\��8u�y�׷�(���@<�׃��?�k��Pu#�}8���`_lq�@=�J�@<�Ps�N�������`��y���_K]P̕������.�<:��ǯ�S׿���:������6�g�y���x���������_�F��8�z����t;��/�q�c��K���}�ӹ��r==1E��_�1�y�����ztc���N?��Qw��6q���L�S��Jv�����'�#�Ζ�~�0N=�~}��h��9�^��q�ѯݠ���_N�����F��C;g��9�s���{��?S�3O���O��zt�q���sK���9�L�����v���厣��|~'��ҫ�[�������>�N��N�}�o�q��������OT�gӟӎ���ҍl���``g�ߏ^O�����������?O��i�`<�1׏_˭��^@8�ۡ?�l����N}GoӁ�Ɵ�O��1�}���w<��~gס��5�?�
#<��9�A�'4���_Q���y��oΎ��P��׎�����;z������o�� ۳��7�5Ղ�{���'��#����	~G�iG66ܓ�b#����sO����c�E����ʃ�kC���Y���Z�_��������R�ӑ-`��rs��^���o��]�����^�zQ`;�N?*V���0
�go��8�1ۧl���`a���m3Þ ԭ���V����δ���� p$E�؊�r�5<^k�aj_����+�iҝ�z����&rc�K��ׅ���15a}��ќ�}WT��S��;|u���C|C�>$|F�fյ�f�i�p���Y��l��I'�-��y�k��W̭���?�;�x_.�^����Q�7%ok��
p��הcN�8S�8R��q��qvuƹ�/<��R��Ue4��(�R��*I�rT�)��Js~��u�G˅PQ��������x?X�е�&a=��dʷ8��.��2����'�#=�r�%��Y6y�����n�#	�Mҩ�2�OGf���W�c�lu�,���c0��^�Jp}l�{��3��c�^"��,�	����"�Ğ<�w���Y�%�"{��Y�h�ineU$�V�z��8K,�O|D���UÜQ��x��8l<�i�8B��wq��������(�x�1q�;7�0��S����Z-ͥ)�I_��ϥ�3���q������Ϻ
�9��9��zu��G���Q���c�Q�gӟ��z�m�0�1�O��(��_ 
���ӎ?����D)���z�^z�Qʆ&y����n�oa���?\Ӳ�����G����(��	���OC�~X��}���uB�pqԞ���=hknݺ�� �S���
v��p8��\���X��ʏQ��JZ.��ӡ�Ǩ���ߨ	�v~=G�N��Z,��s�;q����jv�����=��O_�=3ڋ_�#�?�^آ��@���n	g�?�@t�>߇���Qd��x�9�\�j�y��Nz~Ǔ�<�_>� }NA����{�N9�<��L�ǿ֍����=���c��6�0N�:��'�Lgڝ��H�����u6@�:z<�����`�3���׷��F���J�`�\��?�(���	��돥�~�l�{��=���/�����y�?Lc���ڝ��p9�Ө�<}������#����Ǹ$궾�������"���2?�ff?��������
�6�
(�����T����[�|v��<����c�k������b�:&0�=o���΃i<������rm�l=������=3J������=��G��n��J����}:u�=���
���C���j{\A�����B8���Ì]�#��q������=�������������_��?Z>�D7��0?��֎T0�u!x��1�{u`n�Ӟߑ�\Ӳ����x<_�?^h��
�A�Nz��G�.�O�B��y����˷`��z�v�0}���߷L{zg�r��1�:J����OC����ދ^�'����z��������@���:S��}G��Ga�z���ׯp��9�����ދ���mony�n�z~��sދ/��������E�	�z��������������>����Ij��Ф}	瑃��7�y�m'$���c��y�[�ˎ��9�������ic�1����3O����?�+�<}:����E��v�����ۧ������#w��{����������S���E����t��랝3�q�E���������<Qdm'��9#���sG�� i�;��}�ϧҝ�y�i���=p������4yj�����Gb>�����\;��۷O�s�ץm��
x㑓�t�>����C��*q�w�?�)�i�=�����1J�_տ����ӷ'���i�@&aܞ���_��w��.�O��3��=��F�����H?�k��vz��_���u?J�����>�*����	~L��}���ɋ?���+���6i�z/��wΗo�kZ�x��Ř��קՁ�4���'�LT2��/��K�ND��?}����n�͹��{�9�lc���0�06�s�=���h��w���E����©�W�;�/���A7c�'5���?��/�1�O?6��^g�b�g���?�n��X�€?�o�#?�9���~'~�ߴo����������q�h�ֈt�g���]���v7V���f��%�fH���J^H���s} 8� ���%Ͳ|�2��s�p�e��c��V8�R��O+�Q�J�\/	���Q�%:��Q�E���e��Nϸۍ�la�����k��b�������m*�cR���#x�N>�7(��}g��oi�4������
C��]ۧ���x�X�ke*�j�(��N�iq:���%�ų�wv����+Ǽ1�br�9�,7c2�5^K���o�ԓ�_��1�_�J��؈�T�U��F�T��;&�x[:�(�E�1���\>.�eC*�18$R�%K�����9�5�9*��ҩ����Ϗ
�B�&�`��K���ׅ9����_J��?�_��w���]�?�v'�C�g��?�˿�~D��l?ୟ�����ߡx���'��!ԼW�k6i}w�/�>}gLѮ'�f]��_Z�y�9$��	��6�b��l�'��t1N����(�(Jj�+k�[򧭴���o��k�N�59��WsQt������{���1��_�߇^����Y��/�Α��=��7��m��R]A���#Zݛ�Iv�)4F��"2��Mҩ:oG	J:�;'��]U��:UZp���T��֫]|�������ǟ�Wo�e�J�K�(�^$�?�tv�}.]b-GI�7�<K�x����/��5��qt���mY%�]J��N��YW�i�ɾ�����Ԕ]�iT�e[��)�[���>V�T��}RJT���[�5Nr������ck���c�E��>9�߳?�������[N�
�|E�旧���b�ε�/k�#�tD���Y�k�*;(B�^J^a��]6 ����+C��jԩ���c9�2��d�[�K����j�����R�MۚP����j�?C�'���Q��?mo�_�W�/����
|B��MKBғ@�k��{}�E����PM:ͪ����#ki[�s������Br�h~�J\�못�yy���ɳlV:�.�xF�g��ʬ��5��۷�w�o�.��/���F߳w�
3�m���6���:�����~���X��.|/���<������diQrF}��A�Q��WI�gS�)?%9-��<9�}�r��%UGuO
긯>T����~������O�<m���<G��+�:�Q$������Wz5�$����!�}���Mu�
Z���M��o��i�\\ٝJ�J��8�syn.�٫JRi�)r�\��;7~�N���R1�IBo�R�����y��g�iwZ���&�3�����
��|+�-?�^3�׭�˭WOM+OK{��+U����h�cm'Y��Ү��1��K�[ί|M|=\=y��	:��+�N����My3�(b)W�D%e8�)6���N[i$��Gᖷ�X���m� �����l�]�—�iZ��O�Z����k��?�ZM��6�%·x��)&��Ci�A2���0X*q��b\*�]a)��T[���������w��,���*yNN��.��t�qKٸ�E��Q�KE�={��>h���"|.��JxCAk:�Ï��a�M�i�&�w��M���Bյ��������B�u������.��R�W���խy�Rz)K�T������J�a��R��ҧJШ�j<�����Z?-l~��?n��߷������/|�/
j�^����X�k��ϋ�/�KE�5�q��Z�S��i���
G�4�e}Gm$;�|��/���T�%8M)ѫhՃI�F�Jɻ;JJ�{�z�~>�aEԄ\'�V���Ni��+��R��c�۩�aQ�랟_�u9�?���`ϰ����PFF�����`s5�n<?��k�a
��{W�Yck�3J���H����აH ��<ӌ^ҔW��dԗ,'%�a)/T�?6��?���/�s�^�G��i���]3���_��I�Xç����ϣ&���i5ڥ��{��󐥀�+��pTp�P��$��j>gw�>no�i��2|e\vU�r�EZk�Yr��_����K�U��{��íy/�Ǭ&�GOq�����sG������?\{�ߵG���?j`G�#�q�r)z�I��c�}=�Q��R=O����~�t���a�����}\g����uێ�>޿��_�~���۠��6�c��s��_�o�<w���篩�p
���1������b�9�G���?��Q��רT�}(l1�����(����}Nx#8�{�=�
4]�.�'8�;���� ������g۶9��`s�
�9� |1q�3�[~_\��Z������fe�1����-���W��P@�R=��l���]�r>��g�MW��ڟ�XO������1�5o���Ό�=����t�U��3ap=�F�|�#�~2|e�'���5��maci�eh�6����Q��ӭ�e��������&6ފ�>w���?����kB�8F\���V�_(6��ۊ|�M9GF�O�8���~ʫf��*�
4�7J����ԊV�B���RNR�_$f��u���9���l����������4��㱓Yx|O<��.;�#�E���#�ig��H�o�s_��ժ,�	���Rj�����(��t(8�[����~[�\�EϾ��I���\?����*��b�3	�\���,.�����%�9�nf|7����Y�uK/�Y~�_�n)y��4�Uѕg�á�,�K��1�ٽw���Ϝѫ�\Gj��Q����.\=w����ֺC��\6"���[����j��g�i4Ҝyp���]�"�5�u{���~8�?����/xW���X-[UҒ��}OC���&6z��R�gW2†�f�Ky��Z)|�8�.�,
<v_^�ӌZ<�\<�.J���N��g{�����	q~M�yU,�'�ҫB��a�js�a*N
^�N/��O�	ԅ7)BiE8����끓��ӥ{~���� c���[����m�0L��O�qG��v�x�3��?�1֎���0��nzc=���|�G��ѓ��c�����}X	�`w����^�����4h��:�x��1��M?h�l��ώz�G���~����@����{}(��0|����&�g�>��?��8.�7�c�~�O˃C���+Ӏ2A�_~��9��>���� `t�ϯ���G�{��z{�^G|ҐW#�����
G�O�G�Jo��m����o\z�{Q�_�?�������L��C�p3���1�ϟc��m�}I��ǽ.ހ/��^����m���}������^��?���R���A��@�U�HA�g�N���w6��a�#8�_�pU?�}��~߅�P=秨��OCקz>0��@�Ϧ{q���`~�x�����c���u�G=�s��=�yM����<~_��֍6��c��H�?���4���|:~c��
���_�g��(�<���ҁ�;:��<w���o�#�?_�x�i���`�������ɿ_z�����?�c_�5?�/��4�����Ɉ��Ƽ�$�)��l�?
�_��x���aԝkA�?�qg��j�_����*W��|���"k��=�9�O�^���~�q��>�ϸ�=E/E`
���C����w���z���<zc����r�x+��?���4���F=��N:z�=�#쓺�2�M�y�����/��?���b��Z�.t~���o���.5��zg��x$gX�Ե{�ll�v�9dU{��V)��Q�����>i��S�<�'�b�,mH��C��<EyEJP�q�NM)N*�Y%�ۖ��0��8���U2m)W�ԍ*Qn*M'9�ڋ}�?��(����;�	���w�s��Ϗ!�|�%���E���Yԥ��.?����&���g�\%�I�؟��ї$�}">�\O�oJ�;õ1Yݱ���<��+��8Xa���1�rK�����9J��/�sƌ��'�/���†[|;��>��b�������)��\�\�Q���k���}��&oط�ޏ���~"�Z���'Ӵ��Ѩ�
����'��ߝ��G���յ�u$�gQ�G���5�&w�����1�>��i���b����,ƶ.9�WOA�������ԫ��G���+�r�/�>�1�n^q~��3�Uo�c%G�lN���5*5R��ia�B��])J��j.�
�����u=[���a
��__j�λ�[���7�	��&�eQ�Et�F�K�<%��d���!�`�k�C�Ĝ&�_q���[���r�}Z8:T3�Qr�(?�N��:.H�,#:���ו����?V��1�J1��ʸ�V/
���r�T�%��Q}Y�bo���N�yiGX��5��ȇ��5��+�Q<��?���8�<�z��?�f�H�m���N�h|��A���w���ȟ�9�l?�a���e
ω�x�[�$�r�����	uOOE��"�dEG � 	?��'���Eߓz�;C�K�}�a��V���N�t�W������W~߶���"�|m�f�o��ُþ1ӼS}�X�����T��{g6�%����
�®�c�Ym�sg���1R����qR��6Naˑ�y���Ƣ���q]�Z�?�߇�����?�n�F�A�!�P'��D�Dծ<G�]��?֝��,6?b��<Yef�56Wk�f��
���*R�:��W�Z��IT������}�S�Z�(����g}o�Ө�Z�3K{����ԇY��M���Զ���/���ƶ���^�K�zߊ4��e�%Zě[y��gU��"$���.q�RI��S{�ju#�&�zk��l����?�u�����{��K�+�f�g�"�
�V~4���/���7
g&��>)��o��`�y~���;x�����ͱ_Y�Wp�8BV�u���?��NU���IէR���V|��#�������_�x���o��|=�5ִ]%t��O<"�XC�[ϒ�Iݏ�q�{�Y�����ҕNY>nT��]���"�	b}�H�抷7]b}A�-��߱��O���>��¿�/���g}���-�5>�
�����ۧ�`XE�v���7�$�|�~\f㗅�����ӝ*<��KOi&�f��|�{�nm.uq>;[
N�)­n~d㫄W-���^O��dj�~+~�?�k�9/�=��E����	�mCI�<[�S���ޟ:]^�'�^�n"��cuS�.-�D�tq|W]�J�J��E���ދv����dʥ\'PWq�Yէ~�3�������)����a/ٷ�������׃t}7L��LJ�R���C>��3���/��A�����;w��w����6$F��L~*�/Z�Fۜ�O�ǢIh��v}V
&�$�c�_j]�z�d��c�։Y��k]���VVʲ�pT��d��/N��9�yv��o��,<g��o�_��f�o�z]�i�������_S[u+$���6�c��`Y����j���Q�r�7��n�����Q�
r�cMI�M�d���2�ি�����N_ٿ����1��r/����cë��V}��{e�Y�#I��d֢�R�O,vw-pӤ��E$�����,�Qb''G.X��m�t��|��G4��'�᩼<$���y��m%U[U���Z��?��S�2�3����}��+������
;�O�<s6���Ƿ���
K�2�c�6ږ�}u�ŧ�i�j�j�[&e��(T����u�S��N��OK�8�%&�R��SL>mZ�`�
�Z�T�Sw�Q�k��Wm��S�]�?�?�So~��ÿ��m⟎_���;�,�|(𭶓)�|���V��������M�{�	?�a1g���\�ʭZ�c���W�ZNZy$�$ޏ{m�Ә�:tiҕ|Mg��Q��m�E�\V��+�O���
�w���]�c�>��_5�V��/�:Ω�]{����m懢�x��ƺ��4�[[�z�J���5NHᾍ�iI�z����H������2�+F0�E)IE�S��y��VڴpU�34�<f_��8�2�')���.Jn	'&��{�&���Y�W��%g�/�~(��^���L|C�5R'�xo�^��;���kx$�m6�g�I�m�y6��„�P�\ڍ$�T��i���9E-�J�[+�L8~�)e5��ڜ1��݊����������P�m��>"���'���xMgX��O�?�:޿�j��=Z�@�.m�-���u�K�i��p������#�r���S,�p<�����R��Ɠ��Z�t��Z�=_�!�f���aiG
��*W�����[J1������}]���M�k��w��c�ڻ�|
��|�������^������u��R�Q��3��W�{{�
�V�i�4�p�q�U:!��V��o���HK]%�m�٩�w��f�+מG�b๬��8��o�������8=���?J�?/���=�6A�{��4���c��tϾiy�����\�F~��=h���R�`�\~���(V���q��<}z��&�u��6��q���zg�׵�y���1ۿ�ծ� ��������]<�����א;zs�׌�F��	���׎:�OO��~�*0F��>��)[�ט�#�b���Lٓ�s�{q��9��`@�2{�'�?�
�V�\`g�^`!_���V1�uΟP9���Ԑ3���q�?ڶ�<s�Һ�����.?�ff?���������W��P@�8V>ƀ<�N�Vx���y�w�����J��S��1������:b���}?Z��y���8�S��zc�sMkf�)�٬|G���x:;ˈ�3���P��Z��ٵ�
J��V�q^f�m6̨���&"a��;�,��i�X�
���'W7J>ޝYS�Q��\�ʛ\���݌n�}x�Ř����y\jԎ#�l0�JF���k5��GB�\���r����鶚m�����z�Wi����k7����O���>`@�+�z�+R�*�)���*2{TP�,�}%����l&'KZ�ӥ��燜��V4��7
uQ���mO�~~�~%���ş<g�;?���t�|36�Ӄ�M�Jn.�z]�C�O���+Y�K���Im��A���<�f�.3<�ba��)R���z򋇽;R��F\҄%9���q�}��9��g2��K%��P�L�U���R��/iS�V1�O�t��u"��o��<�3k
ho�mui��5[�u��qg���ɥ�Wq5�E5�[�j�L^���|�n6G�
s�?᰾ݼcZ��(�ʝJ�$���.t��rn.I��VIO�\U��7�`&R˳�M�B���V�V���:�uTg®&S���i�x�ъ���.??���_����e�Ś߀~��ƞ�[[�<3�GU�t�
��{h�!ʡKd/u(l�-��|��F�jt�c9�'�簤ڋkV�����^<��?k��~���.��^�����_�2>��x�� ��������rY�4��u��O(��$�O_K������\�N��~��j��]{H�ۨ����t��R�y�UϿ',m�۟�?�n
~��Oᯏ'�|O���>����w��E�u���>kmsW���V��KA�&�qk��o$s�vq�cE���]<\�O(CNVUk�F)=c������}�U�����=�����_�]��Aƫk�M�h�#�|+���?���!�o��,"ԭ��E��ӭ-e���+&��jw�1�]�#E�ɱq��v�s�'Z2R�-H'f�ۺ{�-��������z-����W�������_�^�/⛍fOx��&�V�t�M6}/I�{�wX�ۋ�^����=:��x���Qf�,�E�-�K^�����JP��m9JmF1���wkv�)Ԍd��wztK]O��o�+/쳬��O���xW�{xF���h���~��Tԥ�Z��U��׈]����X��xN,��ʋ'S�q����JQ��tT��c�����v���%W�v�+ۙ�f���X~�_~-�W�6�����w�G�CS���񅇆�)⇽���t��<c�i��MȚ==.�f̭Dž�F�I<Fb!f�����]kzs��5)%�.W��i�����B�;~���}����пfO��x�#�E�6'񦗢x���g���<s�h�i�Dd���x��</����7�3
��Վ]l]h���۔V�k;7�{u9�YNi����l��?ב�o�ۏ�g�ௌ~0�����
B��!�?6���+ឆ<!�]gZ���c�j�?���������>�
=���b㭗��ԡN�
Te<+��jU�<#Z�u+O�M(��n�E{Uc')�%>]TU��k]i��a�|��.u�xV��:/�t].=_E�5��P^�����I�:Z���;��n�Ư&��4�H��En�9<�h�:2��ԥN�ݟ�/M5���z�;W�����KMW����=O���e���W��[}[�^���A�h�3��,<W���A��5���sJ����i�Hu��K���$0�9ƮU�������UsS��$��NQ���o��j�\�Ҏ����}��_�R�����=+�~���F�}��ZC����o���O2ZG��_þ2�L�6�hi�����j6���c�NS��R�g*Uai�R��7���=��p�hI����m��s��,��+�J��~�u�3����*��-7@�m�|7�>��x�W������m;hv���[�/ق%�$����	��!b�RsM�p咝4��(��5f���g������ܒz'��t�Q|g��4m�	�7�qਦ�O�#��x�x,^�|E�t��]䵖��N�[
k_Ӯ�罷u�k�x�`���_)fKS_gR^Ѧ��NZ�%x���ӥʯꕽ[��ϐ�a��(���_؇O��g��X�o��/��Ὕ����i�"��7Ś֍��sJҴ�|�Mq�0�Iq-���еĬ�K*��9\g�{#
J�:��sq�\"�ܛ�+4��]�VԔ�=\��&�oEk+�b|0���~οt��7��w�?k�|><W���G𽇍!��^�6	�Y�i2�t�l���.���:ͤ�^�1�����1TeE^��^\��NSp洟+r�^З�kCEZ�t��Z�O?4yv�������c�ƛ_�4����Z6�����cL���
���˫��ڿ�s�#Ea��V��n�I)�ydX�ƫ�˕$��>iAo(ޚMh��_��%b)����}-~�W=W����|��}G�槣�I���}A��,��a�xWWOxv��N�W�x�ƞ�����I��k8���gvY�b\0�N+V.�(�Nu���4��Js�Mk{n��Xŵ�i]��}��<����̟�����u�wV�'�
Zm�Zv�c���Z�-��
�֟����i?i��º�s/���8yک�8����U��c�RRmAF�w����<~�Pu������k���>���~�n|S��7_�'����=v�jZ�����G<�o�Mm�5{C��6:�ͥ���L��-a��[Y'�-��b����N��J+�U-S��"��"�d��v�Kkʯ	{��>V�e��7���p�?��|����h�H���*��3|@��?���	|<�5�R_��-CL�4�k�^����E�E��/d��Ké�dc��4���1�K�J�/a�HFud����i�-�����k+'�F�c�M�sY��n6�^���>�����_�w�#��HѼ9s�k_
���]��I�t&����>�o�	�xsľ*�M&I<A���ki��v�۩g	ˉʱXEJSP��>XJ��N^����{ݖ���z�ГkT�ԭ����
�����w~�<W&��kM��:����W�<?��|sw�kF��kA�w��ŵ��
A�D�-:�[t���Y�^C��P�.Y9EJ�t�T����V�-�/6�^�안�k��ik��ݴ�7���5σ��O�O�#�}��ζ�
u?�.{�=6�}�X�V��h �,/�J�t)������R�2E%��nLR��0������ҏ�P��k�F�������I�?4���q����s�#��~!|6�O��?~����r�j�8�M�x����5�W�V��xk��=WK��t=.飷ӊ�k�j2�E%רּ�ͥV���J/��hԫ*��Vn2�r���KW�����ڴ��m��d��To���|T����_�o��#ƿ�}��(�M�MR�	�/��xK·��+�Xj~��a�mE��ST��aҬ��d��ٰ����}�*p�Zq��ү<�is4�g��yz�l�)��Gv�b��+-m��~Ο�T���.��-�hύz?��#w����m-����x�K���E�:�z��z��ŕ���#��J�Bk��c���S�<-	BjNN.�!	+ʯ��M��m.��ԡ�+�Z�m����n��_��_�>�^&�Ņ������^oj^����{G֦�p������ϊ|_o&�.<I��e����v�k���6�lNW��F3~ά'>E:2���i{��|ք��kB�V2mj�W��i���_y����~�?|I�-"�I���xwǺ��wĿh^��}�Z<�	i��:o��]rG�F�����]][��\l�G�L�J��N�y�R����7��t�z]��!*�m-R���Y�7�� A�zs��{{s^F�;ە���?���Kϧ��	����ǧ�x<�8������y�y�Gu�
	؁��{���4}��.ь7� q��?�~)m��000z��������<��{_ǚ/�@.�׿�s�4o�t
==���KU����篡�?�������n��4�~���$��;g��_����=��dž5� ������ێ+��/���?�*����	~Gg�c�V�t�b��Z�>���,�)��l�?
�_��x�Ķ��oB�9��ş��9���^1?�b�����_�r&�ޜq��c�s]Lt�~�ϓLB�<c��W�����8�{~���Z=�r���q����C� �"��ׯ�~5�����O���C��Ϳ�U��ؿ�������?�s���y�5O��~"jv���:G��٭�H�am���xJ�sq�%�Ě�'Kh�R�`]ڶ��_O�)�'�X��V�l��rH�ꪲ��J�:�,�5Jt�jҎc��r�7�Ʋ����S���"Pα�gp�ճ'V���(b#�ˡ.x����<a+G��ݛ���~�|q���
h������:^��]���b���J�C�K7�H2Oi�k:��� ��d;vH��'_����8��*�3�5���u*�9ѧ��br�,)��i��`p��Z�*Ϛ����w�7NJ�H��Z���9B�_��Jc������){WyN�|MzW�)�ѵ�����3�Ϳ�j/���g�A��5]N�/��(֖�~���׷�����uec
Y�����܋�� [K(nn��_��R�	8C4�/�h�0xL4��J�\Nc��(P���a�ԫ�'*���iN�i{*��W�J�*T��\��A��A�ȸ	R�"�h�Z�Ӆ�U���V�JT��ҥR�`��VPT�Fu%K�����+|4��?���_� �|I��⿂���
G�\����]
ea���g��{��M6�U��M*�]J�H.��S�s����!��	p��l����-�1�8�6��g�0����Ⳝm�ت�8V�e9���ƥ/���r?��g��\�;�8c��0؇�V�[*XI'�\58P˰�*ѧF�S���U��*/�*�U��y�5�e�YV$�X�Gf�K�Q�N�=k��N�899�Bs{��)9;$�&��Z���XNJS��QR�����m���-���C/�&�?����F|'�?�n3ӷ�ڿ�W�W�)�'��Y�ʑ?�?��xy�d�]��3�?j߂���O���!f���Ǿ�e��!��_�5M
	���5�RD��K�h��)@E~���lV����N���MK��:�b�g���?hԧ�㋏]:�?�R������>�ӿ��՝���W�\�WzF��H�Gq%����ȕ^6�c~���X�.>�tR���7o6�G�kS
��`V��g���彻lW?�h?�n����Үa���������m=�����G�]�SH^%���1�1f�s\\���hfj\H�6���O_�R�(%�q&�|���W�yxqS�Y��:��?���>��?࿊�+�����	���d����Ǟ�9"��O�<s���.�w$���c�[-��(�n�L{����k�(�-���b��S�o��N5�%���}ϙ�Y�3��RM�U!GN��J�6�����h<�#�����V��_
�O
[�db �,t�*�����!� W�&猍G�=YI�ͷ���V��P�
Q���RKoC���?�I߅�S�W�����A�L4��9���oN{ǻ��au�> �g����z�D	jAE�7!�G�3z�R��S�Q�nꢛ����g�[?;�2�9���ԩO٤׳qW�[�B}����}��]�`߃�6Ѽw��q��y�OOԬ�)�|;��=��^%�ǫ�g�=Y�9Z��Zk�Lai�]��LO��ʜa����s�*{Eum�(����8~���5':��Zj�>Ggy*1��$z�q�\���	kq��;@�t?�?�'�E��h�-Þ�}�����*��Z7���V8<یL
�Q\�|3YG5NrnU��jR�JO��lӉ(se\���F�'e�cu`�K�#�w�c���O�?>�T�N�m��k�>�T�/-L���6<W	�
��n"�UVV)���Jxz�iTMJ��$������aj½
U`��������9���X3s�O�
��[��&��xF��U�~x�\+�'�L'O�E�ʳ(� �L�&���$zy<S��*i�,D-}/�O��3y5�c�mP��Z~d�GMA���}��gNo���	��Yd�g���)T�w��>U\�z3�)f��=����c�dьr�"����r>����i���^$����LJ?k߆�!be����_��LLZH
��ˉ��|�p��7�
0���UO�J�{u��*6�J��e/g�����Ӫ<�������o���6��F�Ÿ��u_����Y��w�{�j��@i/b�..PI�F�X䍤*ˮ!�p�OE<t�+u��-$�+%�za�?�u5p��q�I8ak�������_
>&��E��x�)4np������'���|���V������u���_���K?���_xs�
�����(W����K�,"��ֽ�{-M";�cʫ##E�$PT��E��^mo��+��坯��G�Sn<5�PZ}r����J~�~�������CJ�S�~�:�ûO�^Oj����b�T��4��u=AO�c�2jz��Gy���f��_�p��X2�X��U�X��?���׳���wI�Q�'���m^竅��G
AQ�a]5J�#s��y��k^�Z�uk}�|/����?੟���X|�W�[�|��j��I�}A|C����c��.�k��f�׉��F�yg�(->�g�(�$��YV)��px��刜&�H�r�:.N�(�ƛZ�q��昌���ХBzs��r��N�VU���w�C�Mԯ��>�S�.�N������-�`{��j�1�lB�,q�	8���\����R�n��l�V�{$�
�S�g�E���4�]��x7Jֵ�+�v>+�<G{���MR�ҮL��4�m�c��Ov��Zi���3��w�\6W�t��*�i���N�aK�1���6Җ��[|�>qu��K�F�e(�N2n|��{TIj��[���?���*���m�����A��H5;%�[�Yl�ѼAs���#
��y~qITH
'6��b�ҧVu(B��:��n�n�M=k���T�V�*r�#�J2��-^�2�]^�w�|U������ױy���Kmk������f7m��䴱�]xp�w��N�t��I˴~�״nΊ�*r��)�w}͟!^|A�����M3�4���_��X��y|A����2i7��6����Ub�ܝ�*U���X|�X��)b�Nd��S�~�>[r}_����uKG߉�ƪ~ݪ<����)srZ��[7k}����T���?�6�I�N���i�?���op���=�a�-���ܦ���a�V��,�&^zt]\}*Қ���yU��RK��5:Y��tk<L�0�U�8���Q���kx����v�+���
���W���Im��O�u
^���ա�AЧԬ��h�ⴊ7��-������%bh_�Q�Ӟ_��JR��'F0I�F�TQ�2q�v}$���u�M)G��f�����[[z���x=���ڋƞ,���t����Gýdh������k:�&�#j?�h�D76��f�(`V�Y�(j�xL��/֧����u!*|��ox�	ɥͲ��9��*��{E�r�Q��4���#{i}���V����;��Y�6�廱�t��N���]Mo-��2E*�E�m�2���[f;
�u�I˚6R���2I�߭���c�[��S���Q��O��67��¹
�������������{g���y��G��|�
�t��9��ǯ�0i���ן��LR��=��#��/���׎;~~��~��@��}3קL���Ƙ����<h�*�A��sM�׎�	&��^�n���\����zf���\�f�a�u�J�s�]��F���p7f~g�/d�0��!͞/C3�����RxN�M,.+��9+ͥKF\�-ɤ��/����e��U�V�ԕ�IV���N ��(IZ�u;�|��߁�7�P�׃�?O��R����K&�q�\i�uqyi��io��.du�-+A(F6L���g�s�q�|B����Y�??��U��Z8�eq�����F�:5�u�k
�R�p�6u�J������0�e<����K
��Y�pp�r�8Þ�ꩨ���C�?ٛ�	���T��i�s�狾/�>$��u�
+/��tF����$�����sF���RX��2C(������Ů���G��n,���c�_$��69V��U(�5q�C�a�)95Q<+�V�����dX���¥hөIGW
:\�RmR�Q�մ���3����_l�xG���M�;B��f�{�ip�Y�i=����&��?�/�Kr����ŬB/��w�����ƾ
��W��_c��:�?> �fت��a�<<#��]��P�'y*����U8�t�ϸO.�*�z����R�S�(,-J������\5v����G���ρ~�k�/H��t-G�w~�|�x�Sծ��O&��[��Oqq{g�XiO��w���E��]c/g �����q�{����h�x���U�����q�a�P�N�:���Z�9a�	c�U�.Z�m8��L���)�4�ZXzxi�c:�����J-�F�a�i;5MGou�$����L�_���+O��<]�Y�%���hQYx�_�^��5��p]�%���ߛ��56ČI�F���?�>-p�n�<��pYelv:�&_��ʶr�F1�����Iɪ��\��,�<�����~�T�u)(�j�K��JM�XJ2������v���������/�����'hW��ot-.�>��'�����_����inV`7����E�.�=x�}"x�\�8�[+�l~;�P���,�Z�l=��p�˳�����%R�Y9j��9�	��E[[[JXjr���Bq��ۚ���۾�qV�>��}�/�_
>i?�������/����z�ޙ?���5+{�i�./l�
)���c��[+�e�W���8�~=�x���e�s�vw�Ϫ�ptqT��0�(U�N�
��F-a���S����ӕ�E����2�>+��ҝia�ᧅ��J��5(��q��i�5MGou���W�o�G��|%�{���Y�ݍ�����ﴍC[7zԚ��Q�s�h~�6�J-�tԕ�$Ғ��S�/=�c>��G��pY�|4p����a�*�4�JQ����X�RJMԓĸ�nXAhr�y>#�S��^��5T�2�:��9ܓ�*Tcʭ��vϪ�� �=���1���_��~'�&Ӟ���۞�1ȷ��MS��?�羊Xd׼y�_�v%���MV��T���Uʫ(8��x�W���:qx����{;��b�T�%n�m}{�旋9u|��N&uc(�fq��(�4����؊���~�KD���S��u���gO�k�^���9�k�	�-�[E���!�5=3DiP]Z��UF���P�[�%�[�˹'�����)c����n⬣��E<5FON`���V�эH7퓚�Jj�5?i9�J�Q���~9�~>��G�T08lg
ѧ^��1��0�E,<*SrX��*Ui*�UUZ�YNti*Q�c��j����G��|#���e7�\�S[K,��n��ZH8Ņ����s����q�U�:�P�Z�M��T�Ԍ��-��TS{]�%��t��/�W�q�윪�n�8ƍ(¬'��%){Z��
n
)Q�+�OU��~���<g�I�����.I�<Op-�jc��濦�R�҂��w�HȤG��
�T�qFIN�e'G1���m!��R�&凜`�[���>C���k�|1J�'7��r��j�i`q�15%.m9T)�$�����'��09��9�?�j�����_�MG��/��Q�x;F�����"��H���#��� ��G��L@e���_[.����*�U��r[��h��l�v�Vh�o�@�����S�B������S��|���++|`�A>�}w�{�
���'A>8���CV_i��Z�"�_�������ke�j��i��-$���*s{>���N^����|�5,�h�������B��~�?�o���c��~|?��|�_>�{R�ĭO�b��B���^�Ѧ��C�j�Jo<
d���y]R0
CR�V�*�1^#J�*t�;O�iNt$�%�?���W4�$f���GY7��������f-��(��}~�����0���k~�g�x�a�6�ῄ���q�G���
�M�#��6����ǨA,��qp��2ʱtW��(�n�ǚU��ni�/y=e��;
s�T��z9o���k�e/��l�~��>%x'������N?ٻ����ώ4�
|G��T�ǮK$���Q��Hӭu�,����E�������P�R)K���-˖��'��j�l��)ɦ��"���;�7x;��g����wď�J|_�>��x3�?�O��/���s�j:eƣ�M�h�<i�9�|<�,�-O�-
Q͞���X`��>��gOSJ�U
N<�5Rud��iS��Uy���k�df�pP����	������ou?�X.��NX�`KL�Hn淞������kUKi�c��[dX$�3īP>*m�I�ۓz]-]�~��Al���&���K�~�?�S=GX�i���'���Rү�,��)<I�ȗz]����[:H���4N���3�擄�YRR��p�RI��c�J�w�c
)�J�Z���}��?'�-�3��y�+���O���k��)��5�{8�/�K=愞(��]b��L�i(��n��J֊�v��<E����F�H+e�|�&�z�-���0qn2���]<��_���r�
����
�F��8����&���CǍ�;�J8����"�h��4ga޹���+(�G�7x���&թ�wkN�
������Ӯ�������[�)-ǃ�+�x_J��|?�WF��E��
�g��~'ֵ�_���3Q�t�G���ê�ĵH4�JIc������YZ���9R��4T�C�1���R���m/��e(I��O���ݥ{���T�#Ꮕ_�h�2�M�����⟄Z��|cy�CQ��~� �3�xR��J�a�����P�~��-폀�G�jWz~�4Z~�..l�D�a�����xxW�H~�T�V��f����UP�OGR	'%ud��i�Փ�O�i(���
��z���
a�M{���a��Z�,��h8e�.4�6��
7O��w�7��&���;+6�M��H|ۈc'|���eS�(��c'�i)4��j�6��v]�k+ʖ��u���>���v/ڭ�cMs�c�Z���O��x���ϛQ���4?�^�U���ȝ�?�0��F��o�[6��������H�*��?SX��_[�ҥ����S���Z��j�N/��T̔%�=�^�\����{�k��rĿ�/���ZD��|}�j��
y�_�'�|1�]|G�7��~:k6"�ma��Wַε��qk��p�v��ʼn���4Q��ĵ9S�Ue�eF��eRk�7x�Ԕc�HZ���K�N�n�6��{;��¾7�O�	�U��J�?iO�~�o�q{o��?�G�ľ)����n����t����5[;=#Y�͞�=����]i���t��k	Fp�.zXy{�N�}]��N�nQ��ݝ��R����i��R���+uѣ��?<R��Fo����~�$�'����s��0h:���ſſ�jR_i)h�֏mim$�~|�A$�lH�a�F�?�q�u"�������ӣV֕��Y��h�Xzj���-�'�_�0�|R�����/��i_�V�_<������Q��w^�-d��/��b�9)�if�5[�O�
Q�����^��PThաO	��Z��O5��M>jpUhNV��R����nM�'8��������ӱ���@�)�s����M�x���.|F����A��-W�_�-�F4
���_yz��R�G�Y��K�,��/Uz���$*S��Ф�Q?��0çk�������{��)�4��j2k���w��>����n�������|'����>��
|V�t!�i:���x��O�R[[�;�Yi� �����5="���,&�TrR��\��Τ%%�Qo�JQ��a4�qv��I�)sV�M~�Z[voc��_���I��
߁|Z��o����Bf�ֵ�z9|Y�(�gu���_쨧]>�[yo���evі[i�kZ�>\��!��è��&55}�����QO���J]xZ�wS�j��1�B�o?
�SE�,?�a��?u?	xk�7���xj]v_~�W	c��O�h+w�i:�y2�(�Y]��˷�	��C,˧9'�(�pN�����������Wr�*�R�J���~]ϖ�<~�Z_��^���~x�Þ+�>��cF�Ρ��oO�ǃ���6�?��n4���C��E�]�:,i�o�/�fi��tyc����ڦ-ׄ�QW�;N.s��ZqO�6^��m��N��٦�S�Ei'�϶��!���A��3�o|;�{g�?_�xB���$c^Э~�Ϯi���ր^������_y�5�D�����B�L�p�Uь���̽��߻-�o��v�&�3�Zw�^��N����O
7�u�,�R�g�mj)�������W�-t{�4�v�U�_�w�?
Zx2�GmM�U4�Gq+Oa<7r�kz�Ib�ӗױ�j�\�!S�7XR���no������>I���%Q������o���>�V�?ko�)����f�V�/쯣XXj�K���5�b�Ǟ&�'��5;º}���ȷ��B0�ϝj+��8��&�t��pI�-R�5J^Ҷ�n�ɻ��x��_�A�_�wI���;�؇����|>��>!�v�����k-�x|Y�K�?�
��_��=_h�7��R]1�J�"����;T���1�r�5�S��~y�R��^XU�q�Om�NTݹ��ٵ���OI/g%�eg�Wj�V�ޗOCꏃ>
�[�����w�uO�(/�W{��ڽ��$�����𵵭��|{��h^4�����Ƥ#��v�<�g��^�����z���gJk-�����p�Rm�M*���5�ZY���и��i��v��[�,��|���~&�Y�~ο�co~Ӻ�>3���?����]�k�֑,&-r�h?
���m7A�]ON���:�Sj�m��,�i�u���U�S�G�o���:������V�����N>�oMȍ�$i��u�֑]uQ��͟���G>���ů��q�1ǷOONz�Bm9�����>�Ҙ�=��g���=;����}:q�>�)L9��Biǯ��?_�_��Fx<zt�lq��U8�����y���ƏQ�ےp��9�4�O@;t��
6Lu��^���P2y�#ק׎A�㿥��s~/B</���]�~�&�t�"��_�x����
_�K�:�'�<m���bǧ�:ϽrO����c�E���O�K�O:�<k]}}}���i�>'�LT2��/��K�ND��A�۞{t�m��c~c�~^��m@]�y�c��֖���8Ͼ1���N���r��ExǨ?�x��	#�&��9�_�����-��h��m�"����F��Eֱ�����Ɵ�c�%����<�i�����:��[����
�+��������욐�Q���"K�'��y��?�/��Cƞ:�-xOú�;���.c�`����¶
�f����f��թЎ�K*��4cM�<G-�诂��xc�.{Ŵ�|��w1�f�I�0��V�04s
�FS�Ӫ�W�EC�U%;�ҽ�(�,����O��W����j�3�O-���2N���D��G�cDE
��y6Y��r��)�R�G
�`��:T�S�*j4)F�j��\�9[yJRm��=�ml����':����؊��9NW�9J�Rը����I$���#�
Y�6~�?�o�t��_~Ԛ��vt�K�2�8��;�7��}�Χ�1��˛];F�]sW��3��i�I�㺴}b[��ϟ�_�[�?|e�V?���<&��a~�VS����fx�E,&D�:���^_����t*ӄ�VT�G
3����.�üֆ"ux��"����)�8�s���Ju�5��8P�TX�L03Ua))AT��2���������M|G־'|X�6��{V�������;D���|z^�iwq<Zf�k
��id���okmp�pƉ��᷆|!�G�8O�r�.Y�`�Q�R�6�'Z�9e��֣J��X��u+T�^U*ʭj���)�R�l�3��;�g�C�����jԜ!R�Z�p��+���Rs�
4�N�(AB�"��b��Wߟ*���M�?d��τ�?���}y�W��}*��#�d���9�ӱ?�?��xy�d�]��3�"������_��_���\��oo�!���[�
Ů�|4�e��~�?�A�?��<)���	Y���:ޯkk��
�'��桦����\#�����j9DUZ�X�1�}��R���ʟ�e��z��q�&�m'J�xjҌ��$$T��\��&����>$�9�<o��?ƕ�&��x������t��m*��ԥ��m#�sEu	TAѤ�RDWJ��էW��Bp���|�O}�Z>�3�jӌ�T�ei�Q����KM�z�ǿ������j����K�����֓����M+�n����O�g��z?��@�Ԭ㲺�χÚ.�ޗ6��.�g4W�y�M?�gY��R�B�u���T���ǞI�^yE�k����%��̪կM�Te5JR����rJ-�;r��7k�v?���~�k�Ǟ�!��X�4)l�襓ɊK��	��_b퍲v�F+�0�+S��*R���M���N�HE^R������_�'�;�*�~�z����
���<5���o
x����ޞ�Ԧ�4�O�\���$S����f&����P��C-��U�8�.-a��*��9:r��:�哳�{&�S�c��<K�Q�.f�x�.Mr;�h�dzZ]5�g������z�������>��
���犾�K�,|O�i��x�B�mm/,�$�V�[{�.���O�`�qӜ֔jԡRiI¤�%t�ת���eV�+ӝ*�R��,���_;����w�W�
�����~~�~����d�/5�	x][\��?
-ޝi��;�Ko��i�t��h�^�oke�YY���\Gg���K�+�9�U1U>���Q��S���4�����[roH�d��T�f�;t���?��^Q��X�Wj+�J�)]�D{6������~���u�S�	Y�O��ƚ�����C�'��e/��+w��-"����߳o���@i2��)������h%�#�e�>�Z��<L"��B�<�uj��Tk�i�͞e�������NJ�ֵI�A�/�a��m�%�>��?�4�q�5�a�a�]|h�W��O�b�X��'�n�mC�0��u�xO�:o�<Y�[K-�F�N�0��gcy5�����A71�\M
�*0�CeEG�I�Ϟn0�ܜ���j��~�_:xjԱ����)�V�m�7�䂔�Tl�i;^��߀�2�����!t���}�c߉_���]
���/�o����J�?��F3�{�
�3��-E��k��cĶ�Z�z��@qs��!�g-b��K/�5jԫ{6�%���V��k쿆�<�3<�/�*��<[tjR�N1e�4�Z�7ne�^�����?����_�ߵ���s�?��?e�Yx��_<U}�x��6���'��� �‰᳴�<�dHo<)�V���"6��'���8<F^8�N..�Z��!Nҍ��:�mT�Ӎ�.41ٶ/��Ж
���N�ܧ*�振%(RvN����
1�~�^�����F�a�6?|Y�G���'��Vv�]��/�~�K;}sJ��,����Qx}�����\�A�������5L-\��(ԓ�J�wTj{�vW~�R����tf8<M<M<���B>έu�i�.׍ޞ�+��W���������~�~�|��\�^���s������Q�?��}�Ѝv��=w�y�^���ֈ��ʞ&ь7W�̳H֞E���	R8�٭M:o�Q�|�k�W�&n6����[k�s�NT(eU��*.WZ��(A?��l<���-_]��_��u���`�k�����x����0:�Gi�g�^��u��&�z5I�����r��osz�(���n���ήk��T�AB��'̡~U��wᲾ�c��B�V����N\���������jK��M�{�~x�����?�L�A�/������\jz_�?��<c�(��止[k0�>.2��I�mtȬ��<��.��TCd+>�"�Q�Tx�x�x
�,�ҫ[�%8�V��Mߓ޽�ߛ���e�XZ�
��t�T�Ҝ���qR�[d�7�ky/�_�����������_~��Jh���W�|e�'X��qm�
O�
�o$r][��—�|z[Z|�~f��q�r�=OZx�W6���RQ�Juc-��֮�5�usLEwSF8\//�F^�YK�N4�V��ҷ]?X|A�.��k�J`Ə�i&m�a�j6S�vo�8��/�zn�7�r<�rt�S���8��_�I�v=i.h�;sE����??>�I����W�W���U���O_xo\�w�|U���#��5�OV�k�|=yka$P^ZC.˽@��]ʍC��5¬1T��XFt�F�:թBt�)��U��miΣVxh:3�ZMJn2�9J2�kU����������_��I7¿���Ŗ����_[�0�l젒��6h,t@�$^Eđ6�@&�Km���
��V��t�7E�5�у�Qo�%���ĺ�0🱗2�n�T�$�]"���N�ƾ'�i_�|
��2���}b
6�S�&��|K�
SP��mB����[Ҵ������'��\BLL]�Jn+^X�=x9J3Xz���1�Qm�NM+I�{^�]�U&�T�ST�ӕ�iNPM�t��J�߉�:�Ư�����K��:�O$�
�h�W6�J����ħ¿am6I���AE������'DpXx�~�,~����_���Zr�~���sY���lf��t=��V�����>M���-o��]�������C��u?��0���փ�����֚���,��N����n���o�,����Ŗ1��Xl]��{�Hю2��
��b�*RNRn)&�[V�^�գ8P����П3�Sm����M�����ޫ��?���߈�o���C�?<=�k]GQ���
5��4=GM��M�Z�l��첬r��LQnc�#�/�HS�希4�zձ)�ƅZuTcN�ey8JV���[=�e*��uU:��8�7R�ܢ֜�.���|@�+㿏��3�Nj��S�O��
�d��X�Z�-� ��ާaLuuy��X�xJ��V��a�0/��ZJ�.J��jJ�n�ݺ���[���J�*b��M�w��9�J-u�>���>����謼[
Z��^յ/j�t+�4�n�$K{PN���� !ݔ���\M<V+���*p�8I�̢��m��mά)R�i�rnR]��[��������_�y�{�]N�6�.?:w�}����_�P��[C�ߩ�>ߕ��c����=�z;�����_�o��I�:��c8�q��?��`9)A:��O�.y����zq���zWSw�K����fc�1����-�:
�6
(��
F���Nh�t�O�<Xq��Ç��+��WuO�<'�|�~tLc�j��������+�OǾ�Â���np=��U'�`?8o_ؚ��Г�~[M?�o�t�$���x��#���I������<e���̏Q�.�+[�+�Y�2��#�u��(R�p��rڔ\��J2��J\��T��U_,V�_�x��E>8���+�T3�
ܶ���1��	��T�ӝ���<ʿ,���	�O�����O��
5;�+�>�g�nl�t����:e���7�o=���Ol���LrD�"����0�6k�U��/�agM��|5zQvW挪S��Zi�-i��-���}��*�|�1�T�'<VB��I��u�SS�(�(�{��RN����'�}B�M�7�|S⛛�`�^�hb�ޒ�]:��`�1�I+�QybN)��:����b�r���>�h�9:p��V�')���<�
NS����S�`�8�Ǽ�*�(E-\��j�������y�[�:�/>&�Vʰ$Q�kIm.����K��^{��	-oZ84��qy�6V8���;�%�T�c�r�5�S��ȗ� �.zq��۔���F�I�������	W��s��U�񔩥d��u)R��F%9��~�T�ƃ���<^���ќg���|��z�K�����`T���9�����^@V6V��^���݄��ߑ�0G�.6��0H+�n	�N�/mv����$����b�_*T�#"#�s(!e�p;$@��k(c�4z6��C$����:�� g�s�OΏ��rs�_��$qkm狑o�v�Ǖ����1.� C�2��;W#�k��ݿ�wgo��R9�;��<~��[�_���?�G���#�O~��Po~�ۏ�ۿ��Q��z����Q�Ӱ=0rq��OO��[��xmm�-�J���"�?2G,����vfffl�bI9&����"�^2?.���m�0�<����==<��Hc�9"�4��H�E�9�XtpH*����g�K�EP.�U*�����1҇�tv���?�֋�z_�F^H�h�3D��LѫIK�ȩ!�I6!p�ڻ��0|ݯ���w���_�fѿihZ]ώ�y��\����<���n�OO��е]�����n�KC�C� ��Ю:���ag)*t�Fq�*�3�WR�J2I�-m�8)�]��M;?�g�?~�>�5�/W���x��ƍKJ��v>#j����w�V�ڏ���=k��-.��}�麭�W6����l�i��f�F8hR��ç���Q�����,`����i2aME�6�-��.���y��׎�޼�����jax��zw�|?�xkWٺūZ^K����]�Ȋt��_�r@ϭT$�5%k�uuu����Տ���%G���@�iO��?����O��߄�/���oF��E���t;j�Y񾭦kZ~���f�mkw�w��41ArV�?]�2����p���.�)S����'qqr�qmKg��1�D�)E}����^�{��:}��cg��[Cgc�������EZ�ZB�[����QC1�QE,q�*��Mɶ����v��_������nd�K[x�%A�B��T��K"@#1F�aW
�k�tK��8���Ӹ�ۀ1�}�~9����!���VKkxm�3;�1�gf,�ArĒ�nbI<�F�]���@���+ܤ%ĪI�(�iX��Jv@Đ�H�I&�����6;~G��?:^��0�i'}� g�O�sF��ێ�����\�p�p}=?��F���Q��q߿o�ڕ�6��$��1�ލ���^zsӯ��<����x=���}��΍z4��鎇��>�����z���zt���~�P��1����O���6�㧨�֣O�s�/�m|��ɽ�?����]8+�o
�_��$c_�5?�/���	�1E���}+���6k�z/��<s��.��'�A�O�͖pp@��
�_����*W��|���"uEz�=?>ߎ
r�Zڛ\:����=��.�P��_j<�o��1�?/��=�;����k�V��C�PB���Z�1/v�m2�8׌}�`~}+�ȪB�w�T�Q�O5��M��1t�&��W8s8�yna��x\b��T*$�m��7�
����Z=����˧�vr}�k�D��I� j����5��yn7�kG��(C�������G���',�bp�n�+	VTk�{¤>(�B�Hu���/��c�I�
�N��(Jw/�w��O3.����n~c���˾�����������h}s�Os�>��r���y��DO�1W��ֱ?U�����~m}�c��z��W�ȮӘ(��K$q ���Vv
��$R��#)��1���ev��8�)(�\�Iy�e�����K[�G�Y�4�G�v��]��隭�-�{�xK����_|W���$s���<x�[:��*�~g�Y�/]%��5j'	��%ٳ���w/�e^p6[���x.���S�J��R��==���>�������~�.�~�03����k��s�3�?�/�k����/���Lǧ��}�y��w�=��R?+��~n=OГ���Q�/�)@{u�I��q���E���f�q�x�����W�u��˓֎�����q��C�^Z�	��q�׿�_�_�אN��߯Ӯ;S��`c��Z/�@.��z������u�@n0q����I�?�*3�#�qE�3ϧ��:7vw�nzr��
��b��̙̊�YT�=~RA#�۸����R�r=�}��Z/����16��F? O���N��PD�����7��݌��R�յv�=��>��_��
 *������Fzt��)��_��0p9#�?�)?��&�A�?�4'���@a�8���?Z/�!C�A>����/����?�����V����^��?�+���hGRs��j�-�S$w����}�N�����'����?��E��^;�{�����G�����ՠ���Rz�k��8�:��<W[���2?�bF?����������\F��@P[#��h�O�<\1ȴ��?]��v�v�a?��+�c��
/�����O��ll&�Ƿ��~�.;��ӹ?��-4Ӯ�����/��d�5�k.Wi}SGӵ*P����H
����+��	�m��a�=�Z�:��ی���qň˲�[���0x��o��Y�ֳu!'�K�X�K�4&2h���9}/EӴ�����im`�8���x<;�	���F�:O��-˰n�L��}�Z�J�Y�l��8�����]	߱�&���_���˧��1��n}sE��_����㏯��?֍�_A�q�}s���	���SӐI���/�R����$�q��z�T_���ٴg���Z��+�=��5���6�������@f���G��F����׌�����`c����Ƌ��m�}/���vݠv��?��_�(8��>߁��.����6�n~��(����@.���\��j��A�1����M��������
;�=�'��<~T�]���@�����Ҿ�6���'�=}�������������ߨ\ty�?�J���G\w��(O��]��㿷$g�~(������08��3ӯ~�_��x�?Î{�i���r?��?ҕ�~pzu�Z[lq鎽��t��W����_�x�����o�� ~�����s�^�ظ�s����j/������1�ӎ3���E���C׎��N���������ӌ��^��F:q���>��h���pn}O\3���F�o�Aԏ~���w�ێq��?�>��`���n�s�֢�w@�G�J?���5�%¾ 8�^���_���]X/��6��w1����#��y���������g�K�O�f��W���c��>ϡ^�2;�Y~��WV���|O���e_�_����N:�x�<s���ۗO�6o�o�u��G_D��8���֣N�Z�;䏦F?�>�}(oѯ0`�������G������O�q�0�`��*���[��3��ڶ�my-ө�YJ�*�%#͚W�3�Fǥ~���8���l2~���#�i����Fb�a�:3��N�h�᳿
8�1��3��3<l����ө*�sJZ�Ԋ��'��y����?�~�u�5~|~<Wӿ������/�2�x��<)��#��U��p��	��
������a���R_J?��n)��0���<)��$��U��p��	��
��4�6��A��!���J�4H/�:�S�����P��'�O��'�
��ˀ��8?a��ɴ|5��
C�?��=:����A���7X��(��l��V���O��O�C��,|S�߀~�t�2i���g|�V��U�&���X�ʞ	㡯+;�B��ęn#'�|G�<�,��C����ʍd����p�m]'�[nwe�xq�c)c���0x���"�:��7k^-�j�ml}e�8�z�\��������o ���}�����
�b3�rN�zg�=h�Of��9��9��z�=�|����ьB�=�Ì�;?K���L�ן���=h�U�P1������?������Oe�^G��u��z݇O�ÏO����c<���Zk������������4��`��9���ׯ�6�}r{�ߏ_�4o���Xǧ���=�%�`0������;��`(_\t�9�����9�G�����.>�s������_���n��zg�ӿ�������t���������Q��~�_�n�Ӡ��oLs�����M���?�3۷�Ҹ�����~�Ԛ;��w1�x�@�=����2G<s��_�������^޼�y8���y�>����>������랽>����^}P1��S���^�{q֍ݿ�c�`Rz��s��V�@�w���zQ���c�?Nq�L�}�y�L1�㞧�?N4i�~_�Po�	��<���c�z}�����v��t���z��l�?�϶s���~ߥ���~_�`d�-q�������]_���.?�ff?������ގ�1\f��@P_[=1@�3���O
���u�}?������h��տ�K�o;0�u���l��x�V���]�L{���>���/�~�9�8�=�N94y]��8ǹ��A�ێ;�t=zz[m���q�y�y��֏N�!�;�<w��K��.܍����v=?^�y��(�9=��=}y��z�`z���'����n�(�?��������
���}O<����O��Pp�@���>i?�P���G�zk��6����=_~�h��/�on?�}zu��(�ll�8�9�����\Q���u�>��R����}����ۯӊw_�`)�8��z��F�����ێq�?�B{�}����@?��^GJ6���oj]uw����3��_�W6��ϯ^9�I�ڝ�������R��1�>���q�:����&9<G�~�?é������OZ-�m�^q�O���4�?�7o�ϾOL��{א��������}�ǡ=󞟇�����Ϲ�����sE�^_ր.޼�N�{��N:��\�è�?^�ǭ/?����s��w��F�����<���㎴�|�/��6��c�G_���B׫���<��u�E�O�޿�v����?�}?�-@Cӧp@�~�Gz{o��޽3Ӝ�w���F�����=������龿�۞�=x�z�LR�����x�g=��c۷S��/��t�N��?�{��z�6��F	�C���ߞ(��À�gӧ�>�i/�g=~����z��_M�ό��	�E�F?�s����WN�����������#{I��~��b�=>A\����'��H�+�~G5�e?ٱI��}SI�����jv���,q�c�wt��J��ʕhG�S�8�|�V�2��;�'�&�u���s70���sF��JʂDua�A1�?
�q����i��ӳ^F���[4���HFI�oO�W����&1��=i��w��,��'9������R�������E�n�}A�Q�:`c[w}q���}}�7�/���������09�l���J:v�@P���\���M�����=������@�<��P�>�h��=q��{~}3ҋ�
�p;���{���7=O�8^���Cҏ/��8��?O^�ƍ���y�=G�>�j���ׅ9�@�������{�����z;m�����d��k�ny��뎇����_ �������<������8`���ҿp
����=���
g?Q�O�oOz?�����'���y��?�?/��FG����)v��9'ӱ��~�|��W����b������~4_������n����Pzg��y��u���5����8�_zn���g������#�O^:�~B�Wp;G�>�������}z���=�:����`�s���t��Ƿ����~# }y��v�k�*y#�O�zb���m'=@>��{�����.�I���_��m9�<��ۯ�OP�ĎG_a�1@��O����5�~@;0q�g��<q������1Ϸ�����p�0��dEYlt7����^ZݬnÈ��`��W��\��b���U"���a86�Ṷu����k]���>W��g���;��}q�@P@
o���ր8=)���j�zQ��B�?�V��!3��}��A�Ywu�/{A�cR�?��t�/����b��ی9|�9���#���L�l��=O|�\~[Q�}3�W��ދ����{����|�_��������4?O��B�\��<c�?I�/`d�>���_Ϛh=�w�8���Q���>����J4]@0 ��?��F���=��y�����y���8��x�3���h��R�� �Ͼ(����z��}}��~���ǷA��^��4k�ޠ'��s�����>��O�h����g��c�A�l�<ѷ������ӹ�ۜ�?Z:/̀m=O�@��8�>�c'�8���֏���tv�3�=�?� \���_��;�W����x��r}�]���{u��#��f�Tp	�~}��>�n`�$��?��ڏ���q�l����֍@B:q�g=��Z��O�=��O|�Q���s�x����������h��$���8;v�h�v��d}�o^�?�I8��0pq� h�� ��}{b�� Nzg�?�����������������$����f8�a�ހ��}���_��h8�z���Q��t�����>��?���p}G^��������ӯ'=�=y�R{��dg#����uQ�߸
��ӿQ��J?���3��PI϶8�Q�_�o^G�������㞙	?�s�1��?���<h���ـ�Q����I���4D���G���zWV
�Y�?�JJ��(����IuoDe[�S]d�W�Zz�#{K]�p��Dq�!`�U�-e'��-�����ͪ��K�4o+	8�A�=rp{u�J2qjI٦��;�I���Y��N�_
����MOKG�� }��,"��$J�g��
�.	�l�O�)*5l����n�mI�Q��]�祢\���|K]�F�o�����fFO��PG��Z�?���~?T_�������A�����G����ˁ���{c:m��q>���/	��g�ʃ�?��_���&/�'�c?�O����]k��F��/�������|��#�ɉ�σ���z��6����}Q�^�������L_�O�1χ�Pq�:��>�}Q�^�������L�����)�g�Aֽ?������6��=���5����a��?�/���q��k��B?�4}Q�^�O������L_�O����@��O�X�������
��*l����?�����c9�z�ĺ׫du����Q�E�Ax?�?�T�Ϛ���1�.�#�(8:u�N�B<v�����6��=���5����b�����=?�k��
>���/��g�ʃ�?��_���&?��>��x��?�֟�������6��=���5����cG�Lg���y?ٶ��O���E�Ax?�?�T�Ϛ���1?�?�����Z�t��T_�������A�����G��x�˓���}s��k�'?���*>���/��g�ʃ�?��_���&��O�#�)�s��k��
>���/��g�ʃ�?��_���&(��fzx�?�.���T_�������a�����G�������<�0�^���!�G����l��P{g�>k�����?��LJ�S�8�ʹw���~}Q�^��������L?�?�?�/x����Z���/�������|��#�ɞ{�
/�/�*/�;��Y�?۟�v_�c�^w����7���癟��t���P���X�]�j���]�������g�_o���y��[|Z��?�gs��{?k�_w�{;_������砏�v��{��^�������澪��/��'�ʎ�l����?���d���)����aG����l��P{g�>k�����>?���{�<�O�Kmz���G����l��P{g�>k����x�Ϩ�9��u�l���ޏ�/�������|��#�Ɉ> Y�����mG��?:>���/��g����?��_���&/�'�g�e���k�4}Q�^�������LO�Xd������^=�#��T_�������A�����G���˯�#�(��m��?�!ҏ�/�������|��#�ɋ������׿��(������
��+l����?����l���?����/�������|��#�Ɂ�9>�OL�:��G���G����l��X{g�>k�����
��_�O�͵�q�}Q�^�������L?�`Y�"��rF?�k��B��/�������|��#�Ɏ���Ѓ���}��]i�?�#�����6��=���5����bZs�����K�8�n5֏�/�������|��#�ɉ�	����)��:׏O���E�Ax?�?�T�Ϛ���1G�2�S�(#�������h������
��*l����?���x��)�O�Z���/�������|��#�ɉ��d��?�x?�.��q
>���/��g�ʃ�?��_���&�ٜ��(������4}Q�^�������L?�`Y�"��pzĺ�q�ơ��}Q�^��������L���#��)�����I���o��T_�������A�����G��|@�=<?�Z���/�������|��#�ɉ���/��?�k��B��/�������|��#�ɕ.�i{v�V��_Z�_?W�-��X�����!�T�M5B�?z�zu�F�����+�n7����=�I�
r��QZ�j�׷b�4��,�f��s-��i_�U�@P#�QР���½_k%e��B+d������ir'������bXP@P�G�y��4�{{�ID7�S�Q�����H6��r�q�7$�(8Vz��4ezu��JKmc���k�ng8sY�iE�/�~N��`�Ŭb=SC��֓J�;��ʲ��Z�P��F�dʨe�W��Sާ����irIyZ*}v�U��v#�N:J��5t��q��&>>���)��S��=�Q�E�Ax?�?�T�Ϛ���1�1�#�)����!֏�/�������|��#�ɇ�,��GL�:ק�9�����6��=���5����b��g���=�u��u��1>���/��g�ʃ�?��_���& ��g�<?⎹?�-����?�T_�������A�����G����!����S��:�c�*>�٣����2��=���5����b��v�zg�Aֽ=��a�
>���/��g�ʃ�?��_���&����G�S���}?�!�G����l��P{g�>k����|@�=<=⌁�@�^�_�
>���/��g�ʃ�?��_���&/�,>G�#�)���u����ҏ�/�������|��#�ɇ�'���<?⎝?�m;d���?Z>���/��g����?��_���&�,����<���Zu���T_�������A�����G������{�8� �S��B��/�������|��#�ɀ�o���ӭ{��G��G����d��P{g�>k��1���>?��>�Nx��u��1>���/��g�ʃ�?��_���&;��_�G�Q���m9�=x�����6��=���5����`<}g��x����:��!�֏�/�������|��#�ɉ��q���s��ڎ���=�����
��*l����?����ٷ�x���:��F��/�������|��#�Ɉ~ Y����k�<���������
��*l����?��������6��*�}Q�^�������L_�Xx���?�k����T_�������a�����G���
�s���s�`�_�XQ�E�Ax?�?�T�Ϛ���0>?�Ꮗ�Q��6׾?�#�J>���/��g�ʃ�?��_���&�,��)�0�S����9������
��*l����?���\�?���u�~?�!G����l��P{g�>k������}i������:�a>���/��g����?��_���&'�'֣�e��`��6��c���(������
��*l����?�����]��S�O���}�1>���/��g�ʃ�?��_���&(��hs����ʹ��9�����6��=���5����`> Y�x���ֿ����Q�E�Ax?�?�T�Ϛ���1� r|?���u���}Q�^�������L?�?�9LJ�S����?�#�G����l��P{g�>k������0?�_�N;ĺ����ҏ�/�������|��#�ɀ������aֽ�c�1l��E����6��=���5����b��6g���S���_�XQ�E�Ax?�?�T�Ϛ���1� ?�_�H�Aֽ�aG����l��P{g�>k������!������͵���G����l��P{g�>k����@����?����!�_qG����d��P{g�>k�����_��x��־�������6��=���5����b���G���m�aG���?�l��P{g�>k����@����)�8��u��܇�[��T_�������A�����G����>?��OO�Z�����}Q�^�������LO�Xx��(��m�:��C�T_�������a�����G����B?�_�I�#�%փ�1>���/��g�ʃ�?��_���&�}�=�y��u�=8���?*>���/��g�ʃ�?��_���&�-1���לg?������6��=���5����b�Q�^� s��{d�qoe�wU=ʣt�U����Z[�ԓv�N�M��������f<o�k����[�۰���"]U��I�g�'�(L�<�PpIեJ��B�r�ud�mkx��K�]նZn��%9�[h�}�4���=B�vĿ��6%u��?N}�t�q���`:��=z���=OPq��8�O|t�qր���x�H���A3��o�H9�����ր�)���rs��s@�B�P?��x����i@6�w���/���Ԏ�	��3�v��x�@:?�1��<PN���`�s��q��'�ߍ/�B��a�8������P�d/#b�O8Ͽ��@	�����#9�`���P���?(>�:q�=DZ��@'9�c�9�ϧ_s@�8+����N�n� c��u�q�㎝�0t��Ps��0p��HR~��ѓ鞼���h��9^����\�=9�i ��?uy�:g��Q���O�7�����������_�����c����cg�n<�e��>gS_y�������}{3��{���Ϩ�^��_����X���{]y=�-���}O+��ﳣ���}��痶���9�ymג�g�
!@$pN0zc��Oa�|����s���z���d}G\v�קw4#8�o_�ߧL�}@� zd��}���;���'h�\z��#�����8"�� w�8�ӟ�;:?���>�>ܜ���3�u����:��r�@�
Lgw|d��
�`�>�g�޼u���N�1��c�ǿ�ʀ� q򌎼uc��Q���=�uǧO�O�O
N@�A�'�1��i�Q��p������������v�<0;u�?�Ҁ��6}:��@{��?���N0�~q�=8�:@#�w�3���H�۞x?��u�G�O��� |���ӏ~��H��I�g���Ҁ�B��r=q���(ru�@$gw?�v�,P@P@T��I�t�#�O�P<�?9�y�Ϸ���PGI���z��O?��(�Ԍ��q����9�(�$m^p:~=�H����'�:�������@�ۧL�~�}��
$d�s�??�\�@
t���=ϯO���H\p�玾�t�z��H�?v0q�:s�c��t��{���8�i ���8�?�nzP�$r6���A�'��^={��觩�L�灑ׯj��x��\��@
���p.@�(�A�u�=~����?�08
zt�?Aϸ�@��1�q�����/�@�8��^��<�o�H�*2}9�>��1���`���3������_L�4u���;{��}�8��/@�u=2:t�?��ڀt�r0���y�s�8�����@��P1�v���L��4i*2=o@H��ր4��\��2����d����^������NB��x��z��@����pA�8���p����8���?��=�`��4��n*�O�8?���h�����x�צy��}�:@�<�2?�G�@��EGA۩��q@�O#�����{�������=	��㷿�4�@率*q���r?�y��''%AǶ2O��Ǒ�H�Gs���<�y�jp�W������x�E4�C=8������@�6�s��r1��h��@xPy�F=Oǧ�@
4��;Fr1�y��׏|�t��dA�ӑ��s���p�3��� ��hZ�	G<l����@�08�
1�����`zʀ���~T`zJ0=�@@	��`zʀҀt�A�P��=hh��LA@���.�������=�
M��W?��
�ڭ���~��j�W���vc��濣��)��KO�B�b�O���n�ʯվ���m�_e�>ϵ��>G���n{�S��վ%��99~���c�C�+����=@��~T`zʀ����~T��`zt�@�`zP`z�P��?*\N�=�0@(p=(0=�@@�N�����P��?*0=�@@P@P@�ZLA�P�zP`�P��?*\J1۵�ҀJLA�
\J0=(��8����������������?^���ր�9���JLA�
0=�@LP��4��������t��~T������~T�����������~T��������`zʀ�J(��
(��
(��
(��
(��
(��
������<?�C�:���U_�in���?�m���ϗ?nۏ�eڿ���d��._�>�_�s�l���,���o�{~oo��˯���ϔ������\����~�ϧ??'5����5��}XP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@/���W�w�w������s��|�C�o�ϳ���l��7�Ǚ���o�q�����Lo������͇�������y���}�^^K���se��\�����oo{�w�-o��h��=��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��>
��S�7�<��z��U���?�$�g��>����i���_�^1ǝ�U��k+��y��A��[�W�j����>��^��{���r�����t>_�
������~��_c��srr�s���ܟ3�Z�>�(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(���io�����f/��¯��C�	���v����쟶y��_����<�|��/#y[x��o��</��K�֯���?Y�/�}s��}[�?S��ӟ��߾��l��/�^x�K�?����Ϛ����~���?G������
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��<7�G��_��#�����$_�b��o��k��h�_��O�#�W��k��/��导�Rx�@�^�1����o���r���i�_g�~����oi��������ڞg��Y�������=���uy�����}����ϴ��=ʾ�€
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
��������~�
��W��?���;�?ڟ�n�{s�߱�`�>�U���F*_����=�����_�q�v���>����k��m��n�ˡ���Y���._��W��������[ϗ�����q�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@~m���4�������O�I����a��E����;�o�o��9�?ڼ��َ+�k�F������^�?�Ϭ�z�7�o�=�'�}�����˛�5ώ����?��w�����=�m�y/in���[�%��S�B�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
�����h��g�9?�n�)�	W���w�a}��[��|�c������?��w�C�����_����O��ǻ��k�n}��߳��O���_�&����ۓ�]r�|v����u���P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@�O�2���
�
o�	�� ��=�ؾ������fߟo�~��o�o� ��}����{�G��k���ۖ�_��aR�X?������~��~͹yy��ڿ =��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��?5�-��9��Cw���B�œ�~߱O��$����g��ϴ��=������/����L������_�����/�/��=�ڵ�|o���O����/�;��~��{;�v�5�_s�ϲ
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�O�iχ���_���z��,o�C?�4��=��O�O����o��|�<�/w��~�������V���Z�������Ϯ{oc�=���ϟ^oi�n�<_�'��'%O�}[�<���~ϗ���潼��}7_��P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@3�,x����� ����g�!a�u��#��_c�������^W>o�o������E~!��W���e�����?�~��/�=���\�r}^��]O������W�V��'2�>ϗ��������o#�����
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
�������o��L��[?���
���l[_;�Ӭ���?���1v��y���課�k��_:��R˿֕��b|ί'���:OE��\V�>/��볯ˌ��Yr�75_�{wN�F���_wnk����}�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@%�Y���1����5ۍW���^���4��[k���_N�2j��_����~F�d7��!�i��|y�̰��X�n_7���Jo
��yࣆ�NL���^�^mx8���3��ʔj����)�\��>z��ԯz�h����~B{�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@|��w�M�[��	~*�Ck�]o�N�y��Ũ��n�m�ϨxcXk�a��n�gu�.[f���۠�&BdG���#��K#���F���4r��<6'����4�*X%B�>IV����UN�uQ�)Er�?'0�0�N��\�����B3r�Qʧ<eu��M8�sk���eygk
݅ݽ���L7v�][��6h煞)0���X�Ք�����՝E�z�~���J���R�5F�i��Z{4z��e(�J/iE�'�F�z�-VEP@P@P@P@P@P@P@PV��Y趿i�f���!�]�c���"�|�ʥ��B�\�kZ4eZ\��I^Rz(�n�vZ+�_[hD栮�[��k���ŷ��Y���BNR+�g���HV-�@��APB��
t5���e�5���SW�8J��馆iז����rv�R^�����?�#�t�w��B�|��|��u?�V;b?���/�L��s�1-��)���<Q͗�ϜW���ʂ؏��K��j�89�����Bn��a�������P[���	�b�j��>�]��ÿ�Z�|��|��u?�T�=/�_���ھ8�h���*��*c��G6_�>q_�:��*b?���/�L?�|q�A�Ī�a���w��/��8��O����K���&/���?�#��������������V�=/�_���U��}G@�
���!ڎl��|��u?�T;b?���/�L_�O�G@�0����ڎ|��|��u?�T�=/�_���V��?�1�0;�e]����4se��������#������[���R?�w��^���������-��z_���1F����=��n��(����+�S��AlG���%�ɉ���g�G�	��U�,;�͗�ϜW�����؏��K���W�����]����}(����+�S��alG���%�Ɉ5_q��e]�����ϗ�ϜW���ʂ؏��K���_�G�3� ��\�C�j9�������X[���	�b�S��b:?�
���se��������#������W��Դx��M�_����������-��z_���0:��;j:��M���Qϗ�ϜW���ʂ؏��K������G@�]�?��ꦥ��������[���	�a�����ʻ��.|��|��u?�T;b?���/�LC������w���������X���z_���1�|o���p3� ����0��/��8��O��؏��K���x��G@>��7����/��8��O����K���&'���9Ρ���]w��C�>l��q_�:��*��K���&/���8�������?�K�/��8��O��؏��K���[�����J���O��q�|������X[���	�`5_?�t{�Ī����.l�O�����X���z_���0����?�1����]��O��;Q̀��8��O����K���&/���9������
��凧?�Z9�������P[���	�`5_�G@ǯ�U��У�/��8��O����K���&'���1���p�Uw���(�ϜW�����؏��K���W����������(����+�S��C�#���������2�9��M�C�?����se��������#������W�8����ߏ쫾��(�ϜW�����؏��K���x���|?��������G6�|��u?�T+b?���/�L_�_t���}?������o�se������������	�a����	h�)���\���/��8��O����K���&ھ8��tz�e]��Ž|��|��u?�T�=/�_��j��8���1�w��
9������X[���	�a���g�G@�<d��������������-��z_���1?�|o�R�=��Sv?�!�ߥ������P���z_���1F���3� ���B��9������P�z_���0�����Lt���7���ۊ|���~����؏��K���Og�B:=����aK�/��8��O����K���&'���?�#�v��U���v�͗�ϜW�����؏��K���_c'Q��*�������se��������#������[�
�it{���0[YMk+��e��DRÀ�HS֋�eeצޜө��h�M۪��~��9y(��.L�4/Z�K$a��(���>dD�ʾ�I����]@+�&�Pt�$������y��/]���mt�)�4�%�_�#��s@��
(��
(��
(��
(��
(��<���Û���$�?ӵ+�W�?��Q�蚥��ͤ�ޡ��6Uߛk=��-�a��eM�1��e�Q�4�"��h�pyVw�c1�J�U����6#G��:��B���y�y��X����N�|5zt�(�T�)��ZzJI�����{�~|��>5�ky�?����Q�P�P��4��x�P��������ݒD�Ku��M��aE}���qW�9��<*��sL>W[����K'�p��xxѩ:r��(ה�R����vy�5��pYU&d�*�gZ1����NX�Ӄ��M>IE$ܴ�c�
�l���
(��
(��
(��
(��
(��
(��
(�����ZO�/���Z���FxA6��1v^C�5�e���J��ZXH8�Ԍ�^Z<�'�5U����U�����Z�����NŽ�rG��:�����5�l<u�=0z��=s���<�?1�gן�]���H��nj�#�n�ݝ:z�~��?�;�c���_�А����ߥ-??P
�={��������`�3���?�o��E��_-}y��q�nG�G�0A��ߖN���7��<�������x��C��,~_��q��Q``��Pq�ȧo�`{�����I��'�;y'��?O�Q����?�{v�랜Q��(�qן�=��p��������M
v<���G�#��:qI-�<������m{�h�2}�^�08?��V��|����1��y<g��(��厤��8��?����=�<��r8�����J:io���@���G~�.�X��};��z�k��_,c��8�:����SO����n���8�ދ/�	��L����}���y=���q�Ƿ>@9'�o����E��Pq����ӷ��=pp1�s�3�?��l�>�?��E��
�|�?�g�;�����V��9���?��^�_`,z��?��߽��B���
ij�_|��8�)~�]M����3�8��OZv]��@X�=�>�x�.��^�<w���Z}`/�=O9��Ӱ��o 
�H �����Ӷi[��{������k��:���x>���;]�� b��=�z�px�<sK��z�w�����c��7�K5�R��{�B
&�'�&����bmM��T2�9�ÿiGE�R�x�^YC�k�kg�{�\��5����R������ ���6�
(��
(��
(��
(��
(��
(�����q���ďhZv������,m�W�n-e������c�M9��q<��V��pm�#yY�<��|I���c�9���xf�I�,��h�ь�T�9֖%U���s�U�ʟ��NJ	��湦N���-(U�Ƽ#��\՜\jI���ymZ�d���g�>׬|Q�i~ �Y��U�K�r뱶1*C)$������_��y}|��˱)*�JңQE�+�5g�4��SF�kR�X|3����u�hP@P@P@P@P@P@P@��ӎ���#���ᅦ�?��S�5�W���_1_���i���N<��.+�_��…=�q��A�:V��l�Py����Ou��oC�={�����8��:t����j9����>���E���@)�؏N=:�>�
-�`x�zs�Q��N�!���	��i���)��A��#����_�tB3�a�~��}���B���z�\�#��Q�� 
���y��w����ǧ�}�F�t6zd�q�y��>wv6A�o���#'��ӥ_w��
�y�O�ӯ����[�'��3�_o�WnO����l=@�Ӟ=q�
��8	��y�9��ӑOm���@_~q������F����h�z	�,����p����=�R�.�}8�9��S��z�zq��A��G��LٌpF�?��Q��]M���z���t��4��
9��G��#��7��M�<�����u��)��i��9��R����s�緿Zo��~�oϩ�?�����=��c�?���O���یg��o����
)Ǿy'=3�Ӟ(�����z<�z�F������M��}}��t�)Y�{��_���G�J5O�����������;�}�?�^�k������3�t^����}�n�����О�������s��y��QK��/d�����4�����8�{��=?��k��;�G����4�Rz����~X��@�s��~���z�QT����t�í���m(��3�'�w���'�����Ʒ�����OV������}O�q���
(��
(��
(��
(��
(��
�����71$�7Tq�<��֔�ԣ%:S�&��]��	�IZJ��G�9�hꟳ'ſ���W�}NO�^-�5����v�o�ꗯ�Y�i��L���V���7I5����
�!*�����(��YWaa�9D�<���T��hGZ�)�1S�B�
��Fc%,=��_�g\E<�0�ѯ���~!%S�8ө'V1�$��4iݸ�i�ϻ�J�Y�l5}:S5��go}g3E,--��K4.�Α�h�I�TGRv�����xZ�,N#���#Z���5���8�Ӕ�4���)E�G�Bq�ԃ�g(�5x�];;5�٫�뜠��
(��
(��
(��
(��
(��
(��
(�������-F|Y���y�n��A�k������b�:&1�5o��܆��C����c�rۿ�l}��}���?N
+�ym<� ��	�������_�.	0rOb��N��[��n�G�~����Z~_��A��?����)[O����}��\�?�~@4��o��(�K���u�O��_�^��H�9�z�������\w��zu힟�qK]����oLq�=��<���������}�H���O���<���w�O�������^���?נ�o�����r����֚V^`��}x����}o�}���\�����	��瞹�y9���ߵ�^}P	=�3����ӭ����{g���h��/�pF{�c�:����ޅp���?�>�k���
��$|��o�������?���3F�����y�a�w���?^�[M>������߷%�y�gۏ�?�+��x�ϡ���M/��z�϶=;�_Oj�}�)�<��q��[`���s���4�����Cǿ?��5��@8[ӧ�߷^�;�B��^ON�t�O��0ѱ�ǿ����aq��H=���w�o��&��{�>��{��<�?�`��ל�@�Pzl
~�A����'�?_~�:q�hۿq��1�y�緧����w�=��8�]�K��~@(�FN��뎿���
�O\�{�=}hw����c�	�ǯ��u@;��ӓ��Ҷ�0����?�N}i�K|���`�<~t5��=�`����Jv��x�N��ͥg=	?h���ua���ַ��c[�]��~��E��z~#�q�\FĔP@P@P@P@P@P@r�1�/�� �CC�4i+smx�����]Z\Esos���Q��F�* pTa�z�6}�p�/��i��qn�J2�e��F��V�:U)�xj��(J$�%'}Q�#
���X�4�Ӽe�V�*EJ-I4���M-l|��b���e�+��+�7��ψ������%գ�_C�m-/a��Ú�Q�mk6�0����d���xa�c�~�S�e����#�J��q�J�sLuE�u�T�|�9T�VJ|���W��oݟ��9�7$����˥���RX�g�F��j2Jj+$�����������O�O����i�Α�x���C�k�2i����4�Ӥ��|�	���
.��HĻ��3�l_q.m�8�V�ʱ
��9}x�0�c:p�NQ��:�U����S�ܜ9����a���c)¥8W�2�X�N6n.�z�鸿�J�=.�`�
(��
(��
(��
(��
(��
(��
(���n�J�+<��|Q������uQӊ�����Ή��[�4����:m�zv�9�\v�Z�W�=I���¨G=��xs���j���[Iu}�jw��V��Q��Z{�a�<�
ĭ"�r���c0�~�/^�F�J�g
p��[�4�c}�j�C�2̰9F
�a�b���xhJ�Z��B�8����u%)4��rWz����_�7�_i��^x�����MF�_��1�-��i�rۼ��$��öa��+����|�Z�<�-��Ɯ�Z����mh�8���d���%����&2L&��$��S�7^�7�4�8�JT�0���i�MI���[�
�ட<C�ZX�C�{�k[�).�����k!
�>�����Q$�d�-��FW�FY��N�e����&ԪR�}n0vvo��K��eы!�L��E*9�G[(�Q�*�1�_�7g��υ�%ۚNJ��[k���xg���<W�
^�]е{Xn����k�'�;�G��i�Y�9�2D$b���A?�`q�\�K��O���)�3��$���of�Wv�?�����`p��Y�����i¥*�*B��#4���q�Q�y���Λh��p{�;�W__���d��?�$�X�FO�}��{w��m ���9��{~<�\h���l���?��6�g�q�����E�lc�����~=�G�B��ן����zqG�`
�Fpps����L���9㯧�zz�:�
�8?������Ȧ!6��߷~G������p��y�?�9�{���~���@M��9�1� �(�����'#��:��o��{����zq߭
�x��`��?��On��8�������?Ɨ��b��G�y�O~ߨ�]nνG<G�{�m�NGN����i[��oL~=ӌ�/�� j��>���=(��vc��}{����`�>�=�?�'����~�^h׽�R���=F?�����м�ӧӞ��z���2x8������]6�8#9��s����)��y�����.Ӂ�>���Ey�?�_��gҀ
��	z=���(������>���O����@��ׯN�W�q����~�?P�_���>���g�q�{��>�����7s���[�����`������y0��#=2zp\�ӷ<z��m��|J�����J9:\c>��vav��e�����_����p�#\z~�p��@P@P@P@P@P@P{�;K�y-/�m�mfR�[]�ż�F
���H*�A�(֭���*ԡV�F��ԃ[8�2�]�LR�d�e(�Ԓi���<��o������>�9�
��5�oH��t�f� ����Ȋ�i��@�#G&�l]�g�9!�ǁ��+�8�(�%˪������T�:��	ŵ)<NSn
Q���>m_U��XJج|&�p�jS�)�I(�饢��W��m���|#�\x?�g���dž~ Yi��|%�-�绀���gX|-�hԶ��䅥�8 �Vy�q�{,�4��"�v�*<��[��*������\ѩ4��Ѩ�˪��O��0�����qTqp���$���yZ�
��W��k�R��>��y�?k���������
jM#Go��Z��v�Kk�כPkw�Evy4ؘA,N�d_w�d�ˀ(����\9��jdS��`c��,҆�_ʬjQyzê���Tc��焓���-N2�(��j��ºĬ*���T�WE8�k���~M�Ӣ���ƿ��|'g㟊�1�|�K�J�G��uX�d��T�,�uK ���	��ӯgR��۸.���'��W�Y�l���\Ny�a𵱵pXIP�Hap��a�WoV�>HV�Ѓ���R-Fɵ��,[��+����q�5&��N1�#'wI�m~|t�K��ú��~��J�ׇ4�^mR�t��㷴�-�lu9�d[�K9����V7$�MK�ˇUӌx��?̰�?�X��2�`�ap��a�R��"���ÒX�5zI9�sSm�'�_�`3Z3���a��N��9�M(�Q��_<b�8��g��[~�����Y>�|d�̿��,��‚
lj�h�/�4��-��R�D-��#��JS篦���xn<aW��8�Բ��Q͝Lü�xo�G��n��xo�[�s���͡Ƹ�#�1�cE�g�t9j�e?f����ߟ��~�=��ǯ���s���i:�ر��բ�%��죸�?��1H���W�g$�|���������c0�]z�0��Bt�����FהV��v���3\�*���*Zs�,e56�-]�$d�>���o�?�/�M�u����w��&�p�[�c�[`��^�v]��\f4�C�\�+���3�877Y��7j�XL�:���i�j5j����M���0Y��`��P��RQ�]�Q����~�����u�O|c�ֻ㻋��X|7k���\X#�y�Ε��#�G�઒��}fu��=�O�3���:tj�3�S*���cFmR�ԫj��b�w{���?䘬R�a�
5qM�*�UU&�����o�:ό_�����M/���_I�8�%�W�T��F==�KƄ�}ꏳ�ոq!C����<��Ǐ|D�:\�X� �[*0�<��
����Y�P�"�QǗ�{��:3�,�}���2�ک:~�M���Jܐ��W�;�|J�7�_���;/xX���4�إв����.�on"I��m�ō�N�n�o�£|��s�ϸo>�p�y���s�"��ו'^�#N�Z�*u'F�)ף8�Qǖ��Z۫
���0���F��%8V�7,�(ɤҖ�2N�OC�>~��Ɵ�x�o�
x��w�]�[h�d�wSAck5�܈��]����i�Cl���p�q_��)�>SW=���\��J4��503�
��…�a�u�^�Z���-y+��;�Y.e]a�9�Ey)IS�j�5�I��ⴌ[ߡ��{�����j�n��Ↄ�]SX�{�2�V�V�K�-~��"k
:�<E��m��[�ɀy��K�/�8\V7�xW��pU)��V�T��4jU���2X�M	^~ƭ��ǩ�a��9T�O0���΢r�jF�rQ�\��Ӛ=z���O�����e�X���'D�kb�fŮB��j`#�v��j|+�4����Dx�WXW��T�!b%]R�˙�jĵ����X�+�yV����e�����}��ͦǛ|#��?go�����⧇�s�i�Es}a�C�E5�-��#�hi�hU��䍎�� es�a������q�	�Rt�b1u0s�J�t�⾯��$ӭI{�/}[�����(�*J�_������Q4�5����-��*���W���!�[�߇<�O�Ew���A�Is�i�xe͎�w׊x�7vd�7�/�N㼳�g��?2�2�k:?\��B���9Ӝ-��Q��:s��mx�I��M�V��?K
[�K��5�i4��Ij���_|Q���_|U�7��4��n�o��x��.����w,��H�[�w��-����&�T��r��눨p�W����+SC*�*?X�����F2�H��)T�n����㾶;��KZ�i�!MU�y)r�ri)4����_
���~�?�h�oL�7�3C��--/��m"V7ӭ/����yΡ��!Y�X�F�ٍ��s_Cƞx���+�x_��3:ը`*c*a&�5��JЂ�bk�:p�	I�EZJͳ�.���Ua�ci�F1�UN5$fڋ|�զ����@���f/��6������Ǎ����5��O�%W��Ziw6��*�ɉ�n�^�x)�dq�^���4ȧ�301�/�6��V�ҫ�����Z\��Y&�x�J�)F���u�9G���>�����w�����W��c�k����k1�BkW)kmqs��!�y��_#�!ļU�����gr�Zk.�ʊ��F|�c�V�:^����f�݋���8g��ׅ2Qn���m%x��j�����c�垥�|��=qm�\i1j1%��bq��6l[l��0��9�xs��V��χ��|m?k����r�N�4~�^�J�zze��]��s��T�Q��74�����=��j��칣|B
5?������>��[k��_
63|zS�y�_���O�� O���/�>*�xq�v��:�9�y��cS��/�C�3�r���4?xײ綊.Z�8�$����LŒqn���j�{W.E�n7r�����_�Ÿ����ŏ�~	�Υ�A�X�w�[��W6Wz���6�s�$�����P,,�*��%��[�y�|��r<Vy�a��1��xIP�JXjU���V��V�O�5�i���y�&�k��`r��c�0�Q��8Ԛ�Nr����c'w��Г�'Ư���3s�/�^2�<q�=f��:ƕ�V�k6V��V���sa���&fX�{nP+���Á���3JY/丬�5�����b凝Y���P��OZ�9'[��NjW�&Ⓥf_�`sJ�e��bhF��ʤ�U#JP��u��oyjyl_���?ħ�=�_��.?��"-���%�:��Ԛs�?�&��X]}����+���s�?�z|13�f��y��8����$��N9�*ź���?�l�{NM9�Ӊq&G,k��cE�V!���?�U_b�_���{_s��S�>/�|�?�H��;�|	�jڌZF�}�G�I֥5���V��>��A#���詶����
�A�br��1y�3	��3C	<4'K
N�
�'��B<�������V:Z�u��_�S�\�ON��8JjmJn2��䌝�a'����?�?�|[�t�>x�M�_��庂m{O��-#����P�B���������	%]��@��^�Ρ��K��r��)T�_��	V�+֩��$�իNӭF�5�ߚ�Vn�y��x�"���:�RQN1S���i'�S�!�f~�>>��+�a�ֻ����+��H5���б��ݮ��._2��9�F�u��_U��)�p���s<�=Z��T��W�Q�����s��R����m�zX~#�1X��a�
5q\򇱌j�s�\���MF�Znui�_e�a���#D���o.���Z���8�Dv��>�������}��pg��}�q���g�J1�K<,	IE�O�8�mN/���f�W�:k1�Sº�t�����{ے��c⇀<m�/��5�����]����v�iPKsu|{x���`�Iq&�;P��f�+�9T�\�+���X�X
�]YQu㌯R4�Pr�Rty�Rq�j�-ڼ��ꡎ�bp�B�ja%NUUh�r�qM�ViJ�&�����~,�9��	'�~x�O��}+M�[��;I/��G{n���}����B�F�y�K��C�x��x�)�d��8T���FUcC�J�KЫZ�-D���}5H���<�U�`k�A�AU����9����/��=��O^����>��ֽ�H6zt�'?��^��]�s?�����߉�|�5;�_x4\��V��G_�e��yP<�og6���"VʲF����Ox���e�a��,�k�(�i���5y8�TW*N)�5(��k��x��?��)�Z�1t҄}�5U�u�9+�”��sE59sE���YB��� ������z�r�n��y���5k�����ϧ>
~�?�8�O�~4�~�c��Ki���V�{a��l,幰�<�k��P�^�x�j�-�B�*N�����s� ��1�T�9N��k((JT�r�w�aQM�r��;I�����7e��k�Q�[Ns�LL�O���Jtp���^�iՍW�=����QV��4�h��9��m�^���!�{�4ij��+iZ���OK�ѭ���ξcD�/-��<,�l^Y�C%�Uo��i*s���"<�^ҥH�J�J*����	�싉��8��yfmRuJ�����:��F��*�kB\�)B<�{�Ie>���<f���x�?i�>x��&�mswc�-�W���c��(*Ei$��w�$jۦ�*KV�i��aI4�䢛��}	��M�G�炿l�(�ŏ�6��?�o��u?�wm��|6�X�B�[�<b�Y0Y�3�iu۝�5��_Ai����p!�j`2�5��lB�/vUyc����*��Cmw��U*�*j0���_�c�W�
s�/�'�W�>!hZG��5���X�f�⏵��<'���û�,���j���ľ*�$q����<�yc�{L-j��*�a��F�d�����${n�um8��p�~OO�>�a�C����mS��~"h~0�q-����n������x�;K�uY��@C4��ʏ>�Bj�jR�9Y�.�k�����J2WN�1������0���?
~-xs�^1�k��B��W��
k��ym���pN#��Y�4�Uʖ���B֭B����ֶ_e�n��	;)&�z����n����Oſ
^���]�3�j�t�a�cI&���\���ld�n3)7t!��X��Օ	�j*|�|2�2{�㪷@��n������+�d��6��</����b��ռ9Z�7F�+qu$K=ޙ����~�������1p��ʄ�K�ۍ�~R��
��2�c����jO�d�_��k���>����
xoD86�z��5�7�ZT��u
4ǧ[j:����t'��'kx��V&�.��{����9uQ�\ݴz�V�K��
����w�K����?���C���|��'�����w����[ķ�5�{e⨭o�/u�_A�%��ӥ�[߲j��K�J�&@]���**��V�OAM�n���pѨ���Wk]GN�ju�+�b�+|7��ܿ���ڟ��û�n��?|9�
�zN�e���5Ώ���Z����Yi�J��a�Y܇���(���|�`1�T]:��n.<��M����5g����[�~'�� �f�k��o�I�o�^*���d�NJa��~�9��� �+��Tk1�RR�믤[/,�1t��4\qq�J��������=�Ni�Ow��=�)|2����;md���u>!��d�	���!���]1t��xSQ3C�Hl�C���i��\�o�J�sk}euo+m0����1��a��gn\<�4Tֱ�-&��-�cu �y-���ǣ�����#��|?��#hD^=��Mzc�A������& ӯ�o�v}�E|0
q�Q��){=*Z���[�4��S�U�Ҿ�	?i/����O�_���?�04�ԭ��+�dMN�IJ�-q�9Vï��a�}�)��S��sa�_Nۜş�2�Ko��<3?Ĕ�#�«����Y/�,��tѦ�Z���ݻ�%���o��/n�MRq��m�k����]����/2��o>��֟�Rπw?�ί�(>�-����hk?��j�B��Y�"��������X��2��؈,.?Ӽ�st���K�4\�\��}�}�n[��J��	����Uխ=���W���tO�q�(�>0xj���Pد�ZfK�yq<��۽�:\�rI-�/�ރ�.ps,2T���/d����}���n�����ї�����]j����m���w�����[�pOZFe
�.Fk�&ڊW�i%ն�2���~�߳W����ſx�ŚdS�{�XG��<Q����_鶖��s\���ľ@*�W��B
�J��N�]��m�ԕ8I�I6ex�����5ݿ�>4�[I���W���x��$����ך\�m�LD���6N��ߨY�+�8e�٤ᇛN
kX�
�K��g��@�Ao%���)<c��o|{�=B�Z�n<%u�mP��6����>��\
ꒈ�!h$�����~G��ӋSP�}=�K�MJ��ֺ]�_�L�)��h���ß�^�<o���z��՞�ڃůx�������l][��f�۬qn��\�ׯ�eq�CV��:u�g+{�'5kh�?�0�Y�rM$�v�T����s�৺dž�?�c/xgB�<
��z��W����_h^���;�;I��[Ko��
\9����.�ߖ*�9B�U[RrU#(�P��e	J�S��wr�֏�	V�h�IY�w��}�D�>9|$�|%��8�o�#���|y�ķ���G�K�?�>��'o�Tҵ��<3��>i�Ȗ�gJ��%R�#�/?inKkoz�׶��sF��E{����>'���{��?�>�8��u��_~x��F��
����j�����(��HZ�I}z���m7�-�`����O-s��kMT�"�zt�/vϞ��k�[Y�f��q�����G��)���7�'Ɵ|�G�|�χ�#�Ѵ�~'��v�J��^x$�Uz���\�ٷ��SHӄqIxu�?Z}���kS(�����^3�J����ܭS�\��E'ӕ�e8IŤӲ��]/�ϫt/���τ~�>����������{�{�9u��u(�OXk���4E:-���z�{�GLI�m/��$kiɷ^)`��[�Щȫԧ�n�f�/y��D�ھ͢��R\�W�M������'���_����i���]���Y�V���f�O���x�
��YH��!%2Ko�˧SK	���Mޜ�5Z�ԙ�J��m+m��G���7��᷀|i����y?��Rk8�T�K��4Ѵv�i�W���|Ѫ��K���u��Z�Zxzr��ݝ���ն�2��ri\���A�W�/Xx���l<Q�N4��VӚ_�\$�E2����)c}�Č���9�ҩBn�HJ��}5��U�RjJ���߳�����߶G��5�C����{qho{ ��Y�j����ϟ�G�M�y���<�ƢJ��Yt!���[ݨ���m�ͽݭ��1�wQI%�-�y'�w�5�~:~�_~9�J��/��F���xN�kX\ZŤ�F}�aq{-��������<k�0nVg�����a�MΞ"�4�t�>e��m��Ӯ�Nsi'k/Eo�G�����(e���k�#���w�z?��m:�����]#\�4VŒ4����|�Q�0�y#rl���S��O�u�(ԯ�$�ʟ4e(�n��v��=ƪ䌦�y�zO�(~ۿ�+|���_�E>!�>8�?᰾�'�#��@��<y���6�KZܥ����4�E@�\oM�y~_��M|=u:n��f�N\�4��jm���*T�e;�-{4�T}I���ĺ��~�M�<O�=�;�o��I��yb�2��B���1(b����
�㭄�P��V��	�;5{�6���\g	;)&�ڏ�0i?O�
C���~#������Ŭ}�u��A�4�]-��<��rZ��bE%�'�T��R���.^e4չR�v����	ۙ_�����#�g��6o�_>]|(�i�
x�Þ
��&������u�o>�e�w��d��5��Os'خt�8ZJna����0�ʝUZ�I�u%ʨ��N)��s�l�+�j�����rJ|�r��J��/+w�z���u|���g�/���Q�cÖ����?]�K}C���_�f,5Xl�S�I�K�2�?�/5(�F�������bp���q�~��V��ݻ5�[=�*c8s�˯����	?j�-�[������·:��˩Z�v�i��G�X�I�0K#:�U�c+�k`�Xf�j2�7����o���Q�e��;n`�g����e�o����[���f���>�kx,.-R{�2
>Y��o!����V���’�*�&���mU��W�]�`��o�I^����A�=9����k�7�a���_c�B{~�^�r�'P�����Y���q�߯z����J�i�_�u�_�������~�p��@P@P@P@P@P@P@���׈.�/u��R�Ү�단D���Y�ͭ�H),����^5=���_KC��a��U���J|��F�9ҫN��P�Ns���2k��L=���R��	)A�]�Qi��4�k���߄�
>3�z	�U�V���
���ݾ��;���W������#��u��{r���e��.�'�Ʀo�y�a��\%\
LnY^X|D�u�Q�W
)�WJ�\=
���T��cp,ƒ���R�Q�EUS�x������Ҍ��&W�a�k�g�m��?
<	�����.����K�Vk;M>[��BU�d����y:�6С�i�<kŜo���[��\A�a0��a���!�+��B�lD0��$�iF�"�U���'�`r�S�����ҩ7Rt�ǒ2��`������8d�٢��o�:���������]��m�)/����M�m���3��k�'���2��8�gñ���'�:o����pJ���u��ʆ�����YL�_]Ynb�_o��f���r�u9���޿}N���o�4�=ⷀ|7��.��^YX��O�P���
TO
9$
̻���;��8[����1U��%������|FY���ZM���Q�7Iۺ]��n]��ax�-T!.hƴ�e�_��
��+���ïh~�y��Z%��i��Y�ۂ˙U�����\�CŜIř��x�:��9�P���:؛Si�^Ѥ�Ɠ�g�XLG�L=,=
uJ<��}<�yDž�d�ٯ�^1����x�6����i�4vڴs��$7r�ʶ���,�!�������|^�7<�gù��c�ԧJ��V6Upr�BQ�:RV�9B.+��C��C�a�C-��ħ&�B�U�jN��m3����?����C�\�g�/�-�-�h��m2=A�Կh�mK�c[���i ����|����c�Foë0te�Y^*Xu��TT]U�:j�E�M�c���2�_�P�.eO�AO���\�����a�x/�>Ӿ�3�ZO�<��]�i��-�
"�������\���R�*�<�`�l�s�!�q<C��x��<�V�_�b�������Q�V�]�:T)B2�*qꎌ>
���	��N��eQ��8�nR�T{7)6���_�d�ٷ�/�m�c���ǀ��8n���4
;Bom����&F'd��A"�AI{��q��&q~YW%�~6��̪��T���q�����U�jS�$��N�8N/���&E��+,F.���4�Ҧ�4�+��-��k�P��~|j�4�W��Ÿx�Q�a��M��&��Ŝ7?g�DPH�I~�m�y�OJ��_8���'�nw��l\�����1��ӭ:^��ʤct�mV���i����P�?��N�j�MI�J�I���|m�s��x�
�m������Y=�^5��X��M�4�	ǘwW�S�3���Z��2Y�,C͝W��]RTU_j���$��t:V
��ST)�//'���/77//nmm��>~��~j�z�¯����}
[�jң����5�#�gF;���(#�4��ƾ��|P����p<[��a0�J8|�,E:S���(FK�rt�����r�\�.�*�RJҝj
�{'m�'���ď�c�v�����S�?��q�"+_����_}���(|�`BG1F��շ���G��\-�y�C��I��]������9ϒ+��97�L�fG�f}�7/�b��G�V��+$�W}I|�I�ß����
�I�mY������R��eѮt�Ya���[L�kx����<�4I�_1�q&}�g�x�,�q�,������P�፥��	¥xV�T�*T���R}���<-|4�u�S���9P�oNP�MEDziYy_¿���o���^�����>���l����Q��jV�R�5�N��#�Y�5<��{|Y�Gq��8�9�*}Z��T�L\�0�U�B�JJIrʤ!�QH��fY*��`p�IUQ�GF
q�n*V�&�^���d�ٻ�?����x�^2��f_k:4Wz��g���nY��*(���]���&p�O�8�?�rX{nL���$~�ܫڒV��mϽ̱9O��<V+.���>[֩MJo����;��_��#�Q�
��)�{GoxwW�[�,�h�+d6ą�`$c�W���9�
f�>�s�vU��T�̰u�,Z�isU���w��4�W�ى�a1�>���ӯ�i/cR<дt�����]�3��KK����/�MVaq��kN�O��`��Y�	�b�r{"�
��<�.8�����G��
l$=��g��"Tay>Zn_
����O��,����8%,f�5F

OM]��e��4�8�������1x�x��E�Mhk�]��-P]�����V\dK�k���L����8�����S�N8��G�����eG�Nri��<�&������,�J����M:��K�O��������_�|b�,�+�G���χ4��uK-�6+}am�Akse
�P1
��iwun��E<�э|�q�pfa[6�\�1�s,FxZ�ܺ������V�yќ�mӕj4�5�t�X̿�R�n�*�d�u��5$���Iy6I���'�O���
��x�w:�ηq��r�,,&�����u	!BC]Ok��A$�壵�z ��/�~6�i�Y�fA���R����u��CF�j԰ќ�T���W��Vo��X]I��ahʣ��я$]IF1��_i�M��<�/��g����R/�~��,�+��/��"�x�]`��x��n�uG։Ԛ����q��I���|�z<'>8�p�r��1�^:o�h`�����6��c��eT��>�Ʋ�b�9e�U�u�%�=���Xu=�����߿�jw_~
|'�צX�<��Ze�z����t��-�5m�-"��7 $�m�^®9�ʿ�^
��p>*�;�x�3��^+,.#�b%��[
:�kJ��ޜ���MǬ�A�:��n2�i��qP����SQ�R��O�S��4<	����K��
м#�)幚o�ki�I-�7N��J������C��(Q{W6żK�9�3�"α��qN4��]��FjԯJ*����U�R+��'Ԭ.����L=,>��*q�r�������G�x_�O��|�?�X~�1�=�m�Կ�'�tX����\�����A�y��~�G�ZO���5�s���$�W3~6����R�eb������
^•/dչ)��WH�rPȲ|6#�t2�-,O4���M*�җ4����W�t�gςd�%�����_$ё���ĺdz�X��#:ۗ#���N;�zכž"q�G�߇c���.9^*Xu��TT]NT��Q�^���幓���b�=!��{���vu��s�_�&/�>𾏡��K��a�j�h�iWp�os`�����,�Ip��;׏�q&}�gs�L�5�c�ꘪx�渊�x�b��5)bW��	�2��M&oG����
t����ښ��R�/��k��?�~|$��/���CE�G����/�м=j�:tw��U{ˤ�3�6�^F�H�G�8���¾:����#W<~cY��ʍJ4i:�_��mEtL���`=������'�G���r��W�@<�Ӝ��=z�_-��z�G�NG9���(v�����5
����uX����w�u�H�\	t��j�Z`�E$@�<���7�V�g��7Ϛ�kAIoJx�����֋�?̟p��!�g�"ߵ��J2ZKW0�N���Qۺ?R~�.���m�~ҡ���u���A�	=��u��Z�Z!���'��R�f���ծ��U�[Q$V�OR	�ֲL����#��(�,��Q���ѝ:9�j�έӯ7
�Q���c6���/p��~)�O��a��y!��K:8z��:��9T�a�N�MGO9S�9�������l��x|~�_������:Ƴ��wm���K�lt�+qh],d����23\����q����Վ䡖P�iׯENѩ���=)ǒ�o�qo�'��R�OG��}�$���X�:�OڵRUeF��`��Q�~Τ[sJI�?��zN��~��`�|�:��o��9��i	��|S����
F#�4Rc�Nq_��
���"�+��_ZVW~Ζ.��m��N��C��p��\s��sS��D�So���0�j��.H���՟��^zw<n�G>���U�����	�|Q�4�|;񎳬hW&�,t�5]
�.n5=9�ɾ��๒l�I#4Ko3:+/�sZы�X%.I9.Y7d�Mn���Dݓ?�/���>x������kO�?�&�mO�O����4�-��:֟������]oΣ0�h��%��4�}m9cg^\�GJ��<��#|����/oy�o���j���9�KV����O��7_���ߴ߂t�c��_���|Y�h�֙:C��a��:~��Oe�Owu�֗y$�4�,���*"W��$��~`��q������.�(���j˦�%�R����o_'��9_�7���h�*��~�x��V<��������w�"��Kv�lQ��[����L�e�0
]5<V)s��QԨ�����q
+���&�'_K�-�V��s�����u��q�^��0�Y�"i�i:���-��	�ڕ�-_D����{��Ζ��e�g�{a$osm�j6��1�x|�.8��˚X��q��������Q���rN��FE��6p���zm�wi�����c�m����L�'��5_���;����^"���Qk}g���zt:�+�����
��-��mk�^K�R�IG�p���9]*7r��W&ʌ}��/{�v}w��zy�gξ�q�x�e��c����<%��!�д���?u��'F�5����_�����um-տ���ԛ���	�L����uN�����aq�=ƥ*���J1���8�ϖ��7tO-��Mk�rO�/3�:��uς�����_�W�z���j���O�����:�΋ޯ�Z��,4��WH4K�����Xʶak��a�V_��a^X��%Hү�|ҌT��q��~$���kc��/%����m������3�<�/�|	��������Ro��z��ƺ<Y�I�u���N�߅�+/�m4鍎�=��uk<	��f�<>�
x��C4�ѣ�N���c�.x�)�|��W�kN����t���\��D����K�ů��
A�O���<Q���i�i�g�Zyo���'[p��X/n'��Vl�8z��b*��p�RP��Gg%��^�4�B��Vm]����s�g��L>�;4�,�Y�?���I�G�,4�>��l�` (K{Q#�Q����+�_3}e�Roev�*����_�E�֗���/S�?b����7��_�v������_i7Wm{�/�>+��i�W�L��M<F��+Y5�[x��Ys	���8e_T���9%i:t\\��'{;++�]7O���4��ym�[�'Zi�%����x�S�F����D�ү��?K�?���G����ڣEu
�		Ȅ@�9�r���,;�����_���_޺_[��3��K��rvZ�yt���|i�|I�~�����'|`�����8ӮWÒj����xv�[أ��P��U��Ŝv�w����A��%�*���f.\���t�U�k{\?3��Q�ﶗ�M5��U쭥9^��V_�򇁼#�d?xO��/���Z���ht����_�i��XK��.漵�<s}����čy%ֹm�(l%��㺍�9��Nړ��T�0�ʱt߽��<0��ed�����kG�7����+�I�_䓨���~��
�|;���Ο!Ѵ�+X���[ok�֕s�/�|^��b}GN����u��.�[��0�����T2�*�.r�W%��5㌓�b��i�m�k��8�������ɻ料�Ǻ���>xG�
�ß|	��>	�|�5o�'��������m|W�إ������~����/�ɨ�|0�,�{-Y#�-m8���V�5u�j�U�L+��Gv�	����Ϊz��U|ݢ��g}S�SOM��ޑ�����~-��\����:�������z��� ���+���������'�[>x�˻U��X�b�6b&W���f��Y��mY�UR��wZ�̝߮��wB�_e]u嶧�g�A7�ѯ��ӿb��ߴ�� �P��]>y<E��^/���|Z<L�[C&�d<_x���Q�M�k٬�TI�<ޞ�q���s��ʜ����K����gȴ�z#)�Z��nk��]��o��/�/�?�*׌<g�Ox�Ěo��6Y��Ʃa��ZW��u;첰�mk}q5�<���>9�1��ԞOT�b��ۊvR�I'~�+y�E8�߹$���~��O��77�M[X��f��ϱ���Y��y��O�a���N��c�p�W����U�ݺRv��M��P��V��C�7�v�y�%|�
��,5
GJ��Ɵ�_�4�:LSy׿	�O���g��-f�KX��Ie��>�c�H�-�;�G��F�h=�DV6�#-�IΆA���>������7���~�1���(�<�m��GA��^(�gğ���>��/��Ϗ_�~ڤ��:�z�5����H@Y���J�xb�k��{�����D��K1�M���i���庋�qT���ﵢJ�n�(�JR��ܛ������/��b��*��/��<;�WXԿm]+I�E�����u�~1��V��;\�^]�I�E���%�{ˈ �9+P�W�b)Ú�X�'X�{$��i^�w��j4�Ž_���1e�&�W����uk(�����W�t�7)�)������r�z�T0G�ib��8i٬f�����>*��y7��[���2���6��{L����K�f��U��α�5�'6w"+�샩&���#0��w课9�_�K6�&ܥAᤔ�xs����-��\��U����;^�lu����
���_�F���xH��}��m�vٮ|7�k�|�s��j�,�~ʂ��%��y��l�����u�K�%�s�rUe��Q�����RQ�]��V���P�U~X�����*���;h�i�-�^�#���n��
���~�O�t50Z�������G:5�W�.0�~�3����J��9�);�T��k)k����V�Ƚ�+5�������N�Nj�sY^x��?�����f�
��"��~x��^����Ÿ�
��:�]���Ki>�ܚ��������O[��Z�:��B�&�x�{Xa*ӅE%
rR�Q�7�j�Gvݖ�WQ]�{���6�yl�I?�c�C�	1��O�F��Ej~��࿉��gŽgV6_
�x��ÿ��]_[��
������z�e{�(�}CC�5�=��[9SU���	����u%���ԥ8PJ�kS�VQJ*>��K�z7%%vՓLނ�=�����ZI�t�{������S}?�?
l��_�Q]�����!��9��.�4��^�%���"�m4]Kn]��WD
��e>ζ���k�f�orR�9o��[W���_ŏ/�X��~
׿g�w����
�	��?
>i0����|i��V�,�;�[}��I$�_�w��
k9O9�XƹmH��ZIOZ������
��WO5{
�p������~�+��%���|E�
y�[�?<��}���x����m��xS�߅�<m��i���ό|c��zK�q�Vw:��potxa���h�Tj¾[Ρ��9bjά0�aN���9'%8Tn7�J����A�ƭ���"��mY_Ef�o�>`����O����Y�S�>2�;�����R[O��	�$�=�4���f���;Ʊ���O��g��;��\�[���g�'��Vu3%��P�rڱ��jUg%�0ܮ�����R�J/_-"VT��2uV�i-'���g�?���1����� ��!�%���7�'���F�A��
O��a�"�."�Xm/��-ϓaqv�3Msg65�+?��X�x<{ǹ{9rr*�^�OmF�W�m�]ޚi>G:~�+���e�/�.�������x���G�U��5�_�{�o�G����Mǎm4�_x��W����w$0Xj�o������?��ꏴ�:1�N�¨ƭ9�xGf�3p��MkgU>],�N��k��y���ﵛ[w�=�P�4��߶�1��t���|�4�	^Z������O�Yl�ϳ���\7����;�P��%G<[���-S��b"�-���W�+_R��WO�w��}=5�>^�v�������H�4������5Ƈ}�M+E�S�),_�f��_Y_Mh���4��G,�u�Lk��o�:�wt���J��S�Ri�����h�Q�I�==~%�|ϱ<+���~%��_�#��?g}Z{/�����Y��/�/�l��_�y����8�U�;���z%�ε��-�ն����=���]���os�:����	���T'	�14.�F�'eJR啢�+8���J�E�w8;BI�B[8���M�-���'�xO���E���/���_t��8�k���|�j~#����tMı�v7Zm��j�w
t�Qp�rh�����&X�K�8*�V~���XJ�P��e���ڷ��J�TRp�yմjk�6����Nu�MӧH����e���!$�����0�X��Ҿ1��zٽ{뾽�����z����K���v��N<;�s�$~b��Nk����%o��Ʒ�����OC��R����p��@P@P@P@P@P@P@P@P@P@P@P@P@P@5�V�w�<Ҁ���ŝ�i�rn���һ���?��+�c�V�
/���Œ��G�:�k��lO��������R�ثX�������M+K�_�6V��w�XYywV�v0Z��-�
���;mw�Z,�ç�~(p5|���Nx�4���zp��Z�;N�]�������U��㷅8�����W���Y��9ʦ&�+T�V�)�9U�x�T�;͸sKf��5�x"�Q�J�G�-M�J�c�u
KB��ݤ�����k5��KF{K���Cx�F��x�_��V4kb�u\eF��V���iʕNIBN-�9BZ^*����qY�SZ�0��v[�q����9EԡYS�9�9B.t�x�F-��l+kk����ma����Q0B�4��!�R4@�$�O��<c:�P�e9��1�r���$��g:u+T�:p�Z�%�A9Nr}Wrm����&��Q�x��_4��u{�(��>�t��������7��_�d��t��{�7h.-$��7����qmK�V�5�,-jRU)ƥ9�T����&�M��|������^xS��*Ë���bgJ+-��0�Z0�Jnu�Ʒ#�ګI�M�t��;�i�}�����x�ܵ����TG41��OM�����C,r)Y#�6ܮ��Qє�)*��4�F���h����I?c��B/�&���I∮R�u��G���NnSQ�Y��Ў�%o|ϴ-�,�`
]?^�({5�Ĩ5n_oRֵ�nkZ�[�G������W���~i�2>�kx�EҟB�|V|1�i:$�c$�6��/�K
*I4�5�O���͟O�f���<}�^IC��$�3�4����oiK�z�}^��e{�_k�[v�(\|&�[{���]��i��s�v)�x�Y��w�e�|W���m��54��,�};Oh�I��F��+6�l~ڲ�b��Q�������^�z�cm�v.Xݻ+�ݖ���ÿ�����?�������7B}T:ލ.��Z|�V��f���$��"��P
ih���r�f��ߟ��2�5z�8�]�f�z=5}ĩ�m+m�?�5�^Mj/����ڕ��4�׆�]	5�cR����5]mt�+Q��W��ח����������y^k�]�J�9y�N|�F<�c��n�I$��I"�J�I_Wek���tO�_�h���~�-�x�<���������n$S�P�:�Wr�Z���fxd�'b���<f.T�9bq����T�}9\�o+nJ���S��d�4
��]��MJ���@�ڎ���z��m"���N��{K�IY"�#u$2�kJP��d�$�_,��h���Sļ�'~̟
|G�	�g�^�:��k��e�W���[��z����^ڲΑʆ�d���w #�x�]X�U�W�
�'V���j��z}�A;�E>�#�t����5���!���0�f�v���kEӵo̖v�	/��+;(o5�����_S������
�(�:�%�U&�OHFS���"ݣ�oD�}J��vW{�j�NB�~�am��X��Geg�z��>���o��k]��`��#ѭ�ђ/^�M+KK�^� �']6�Ir������q-ɺ���T$�Y�PW�$���gd�}�<��ݎ���Z>�M��_���7��[��׿�+��㴟�0x��o���_<)�O��x�Ş(�J���H� ��g�Ųi���&������kUXuBu��ƅ:2�u�w
p�mG�}������(�<��K�M��;]����xs�ŏٛ�S�k�~��5Y����*���݃�0ӎ��.�t�
lj��t���[v&-җ�<.c:1t�<�ba��\ڜ_4�f�m��.iA�%����}c�����M��_�|8mfV�T>��<'��c�W?�N�f�Tʤ2�C�~v�\N"�^ڽj��{J��oNi;>�4Q�~�_�K�F
��5�x�E���^�ǿo�W>1��_�{o��qv��kkqhI������Ө�Ѽ7l�&o9���)�t�'*vKٺ�9ymkr�[��Zֶ��ߖ7�e��_�?�_<a�=#�.�S���^/�M�>#�7����T�k���u���y�+�F٥P1#faZ�8��V��B5'�QM'�T��w���l�/�K�e�|f��_���㕿:�x���_�.�C6���Ƴ>�&�>����{%�]%¤� �����?d�8�O�܊�NKmn^d��k[ArA����U���y�i��l�=��e{�]Z5�Ηwgos��XK�K+��{im佴�4-1�;k&��mI;�6�}�Z�n�c�|�2~��
|Iw���>���"ͮ�Cᯃ<7����Ӣ���-��-�’�ؚPd�.I��b�U��WZ��3�Rq]������"���_��i~�v���	���{�[����5;qi�\x�+->���-Qm���V�K�uXgi#j%V��\�Փ����9>D�J
�v�蕭�,�얻��^�ǀ|
���3�~�O�s��wG�|>~ػ/3�i6v�w�Z|�?�߿_�]”�T�.z�'9���R����m�j4�VI%�->�������χ�/�3�R���P��'���o�u+۽KQ�����.g��u��٧�y.�on�i'��G��W����V���U=���I$�;�+$��D��!r���V�eo�ccQ�m�X�<5�j��f��x5�_����m�S���]X�?���d�О����崹�Z{K۫ywCq2<��b��I��/i�IN�5̓���j�٤���E��-=;�~��w��S�x�_��c\�v�
�׉u�����b-O�:�z��{�O�
CΛ�wq(�3K���c��F�q8��-r�5�(�ū8�J��,��O$��[}yU��f��s���WF�W��I�<�^��Դ��b�šF���lj:_��-4Ȯ4-6�WT���䵶�ԇۧ�K���:�䤥Z��F�8ʤڜ��R�o�j:&�ih��|�V�R��-=;7���w{�=F��G���C�[��������0���i��d�}n+[�b���S��`��;��̊�+��W�5���-՟"�n���]l��ݎ���_]�5���� ��!�ٮi��[�"��Om�[R��}�m"�@����t��e�����I���kkf�
��eR8?aR5����
��NiK�ݯz����v�z�쓟3�\���+Z���4����.��k߆:O�O��u'yuO�:�|
Ԥ�I�y5ã��}#IupŮldm�����7��:��U�:����s[-&�̖�g�|�J�1�k+}��?go��,,t߈�>���K���J��_|#������L��x,-�Y�=������B�,N"���^�&��%Y�j�,��]^�^@��b�Rgq���3�ށg�OxK�^	�Μ��^𞅥xsE�8�g��{[;�0�Lp)1����T�V\�':�w��)JO��M���I+$��K�(���Ï�^��>x#Ş"�u�ۼ#�x�š��xb�x�xoT�,.��K���d�����8V��0�R��8�r�f�ME�%�$��;]'m�����"�i���΅�/x�>(��$i|3�x�º��xzW����еMJ��H���`g��݌7�Q���%�V�#8¥HFzN1����ފiKe�{.�qNͤ���]z��ρ?>3�aů��~%&�+I���'�>,}=�xqb����5�ܛ[at��1:�
˼D�],F#cZ�+�}�I������wk�w݃�e�E?T��8�	�&|)�x�|-xoU�]�������j��o�ii'I�uxSԄZ���7��h��}��{��#�U=�ok(��~�|��)_��ʴm�� 卒�VZ�ed�62��8~��
���|;���$�I"��<���դ�T��F�4]�줱�$S1���N�+Z*q�Gu�jM&�j2�@������d�~����%�����_/�r��֏�.����O���_.�.�.�����w�_E�=�^Gy���	�zq���O�,V%S�/"�QC����R�-�嵭��.H^�����W��z-���%ּeg��־0�&�i�x�Ŗ��$��K;/Z�b��T�4�+;O�������������XQ3uj�F�G��i7ɶیoh���I;�}�ʮݕ����՜ޗ�=|�t
{º��:/��Orמ&�����n���[Dk�sH�ѡ�k�[7���E��-���x�D�ʽyN+ܛ�Q�+]#'+�w�v�H��,l�VVd?go���G��?~����'���K�2jp2I�/�����	5�-��I,�Y\W��om^�^_�T�Rv�\�v�(F?R��I�g�3�1�ZG��WM�]�h��|-�-��QY���1khQ�1jt�t��r�r>���b��ʚ��5�;[ٺ�-k[��ֶ���l.H^���~U�ǽ�P�08tՇ�P࣌q�������׵.���H_q�3N��S��������W�����̫˯����a�_�J�6%��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
k��c@��%�-������:�����Ή�?�[�4���*x �=}8���O��FO8������
x�Edp��
�2�VFY��#pA��ѫ�{�g�v�I��M5f��i��Ot�����>|U�����]f��K<7�ފ�b4�/���ij[dj��[.[�fc�p�o7S0ʨW���(ν��V��Z�_�>/;�낸���gVjӜj��IEG_��0�%�Z�ov�����t�Yv���]�h�K�K5����m�]W�P:���j2�
ᜦ^�/�hњ�S�����+UW��_
���*�Oap�Ҕ�c1v��X�N!'�k���iƋj�����UU(�{W�(���Il��ݒ]C�QIE$��IY$�I-�g�_��^���s��v>�������z}(}���:q�
K���c��g���n�?
��s��m��P��y� ���(��l`��8��@B����#ן��4���?<dg'��㨡h���I�$�{�������<}?^��h��P
��=�����o�_pރ���_�iu����Ld����8�}���!S���?��j_������9����m�`
�cߓ�}�����+ӑ�{g�z��-W��|���^�Q��׮=�Om�`&>����� 
�to���k���	���?�P�� ӎ�����$�`[��8����4iӧ�# ��:zu�)��@���F�*O^޿�����P�~�{�=:Q}�`!\�80:?z4������{��K�1q���g���S���GQ�=8��4y�݄q��������x��>��)�����lu��q���^��݃��9���_��m=2}�c���Q��x�g�=���Z��@B��=y���i��R���V^~���H=�.���ҟ��8=x �z�'�
+������{����H��?�u�m��`��	�o�u�_�����ǧ8�W�-P@P@P@P@P@P@P@P@P@P@P@P@P@P_�9$c^(���U�.���c���v�r���_�D�ǭ�_�y�Ǯ{�>����\iu�����?�<��i��[��^�����מ�Y/��H'pϧ�A�����f��tm9#�߯9��y�]�؜����?C��{�h����~9�y>�/��9yQ��-��
�01�=?���Q~�N��s�����ڍ�^�]��������'�Ұ	����q��?R�(_s��#���w���B��Q��z�~]趀 ��r�Q�i���H�>��F�~@8�s�t#=~��x�~i~���c'=q��A�}zQ�_� w���G}�~t[�f�2=����O������۷��hk]R*���O\{u�(K}=1ϡ9����N�k��s���Ϸ�j:Àc�Â:���'����~�q��W�\��1K����3�zg�g��?��.�����������ߦim�lv�����^�c����o�*1�G=�9<w��R��6�,}��s�G�8ь`����x���s���#���^���h<�s�Q�y�ޟ�
W���#���R�?08��s����ߌ��N����m�{�B?���⏻��0:�H��ҳ� ������߯�
��+��?�{u�����}}�3��4��	��w㯯�u柭�/q�N߉�߯N:�ӧpq�99�O�=�(�ޚ`�g��t��~��m�@.:OLv�9�?J
'�}28�=��<r)���#��8�9ǩ�3H�A���y��F��x�q����S���{\��3]�M�^XJ�/�Ʒ�����N��K���z�5�lK@P@P@P@P@P@P@P@P@P@P@P@P@P@�$#��p� ����;Mͦ�`�@2�U�g���&���FF{*;��ז�'�˙��k���1ҵ_8ҷ���oK�������u�8�OZ侺\�R���?��*G���~�_�����;��w�c�<�ӵՀ6���3�~�����'������B��>��L~"�\����z�����<��}���^
=z��O�����G�_����8���a�S�=
�2O�|`^��Q_�(\u�r1�קo�(�}}3����p
�:r2?.��_Jw��\�:��������s�O��?���A�z��:?���i�a�1���^�{�y�c�y��^�;�#�€0�`p3�'�נ�h���&?~���ҍ�@.;~|cߎ���C��M���u�s�?��F���m���q���F\d�И
@��$����c��Q��Z���/L�:Ѩb8�r��G����L�ӷ�;���z��L��1�?O^=�w�P�{c�<~���_���29�_���Q�w�P�q���i���}�}�9�ߕ/�
�1��<z�ש�(���#=1�A�Gc������_��}3�H�{���s��~�W����<`����>��k��z�{��q���5@&0p0y�c���~}2(��H�n3ׯ\z��u��z~���N����OC�g<}:{����d���zs�4om��w�O��z.v�<g�\��ދ����G~y�c4V`9��?�q�<~�����,��+̃Ěd�F3�E�7�E��&�0�b���c7�e�3��_�宧g���_�W�5P@P@P@P@P@P@P@P@P@P@P@P@P@P[���P��^Zjv�Ɲ�]Y4��m�v�b3��k�����g
U�;e�;���X(΍k�:��I7	�nYn�����g��H;Ƥ~(�Mu���]l�Ӯ�уǾ1����M�I򢺾H�pC�· ��-���Q�'z1���*w�|�����^ޚ��#����&><�i���î~������~7���}���?��@���Ǒ�
?>�/O�:?���S�_�X��?"Ǟ
�0����n��1��
S�_�X��?"(����z_�7K�?�@�>�a����"�{��l8 �d�l���3���u��>�G�~D_�O��C���'�������z�r�0����?�=�g��Կ�n��1��S�_�X��?#����A����t��˥�o������(�ȋ�	��`�?�);��:P��=O��}b�����{����x���!����=O��}b�����}��⡰�z���_�G�~3���}���?��D������Ca�'擟_�g�h����=O��}b�����Ǟ'?�i�]�p=1��i�C�@�?��Q������Ca��Y;��:>����z�r�0�����=�h���������K����/��P��������Aa�R?/�Z>����z�r�0�����=�o���'~��Ώ�o������(�ȇ�'�
���������o��?�>�C�~D?�=�o���'�y�����z�r�0����=�w��A������/��P���x����O�O�'O��G�~7���}���?��D�������w��s�#��o������(��"��{�ӌ��O8�jN�P��������(�ȋ�	�{��O?�)?�������z�r�0�����|��Aa��4���y�o������(�ȇ�'�
����!���?�c��ܿ�>�C�~D�|F?� �������_P��=O��}b�����y��������ӣ����/��P��������f�_�Y�o������(�ȇ�'�
��,�
O�7G�~7���}���?��F��y�ޣ�6�y?��9��o��?�>�C�~D?�<�vy���� �s���U�����z�����(�ȋ�	�{k�^r���}}=(��7���}���?��C���#�q�������o������(�ȋ�	�s��H4�F:���ҏ�o������(�ȍ�����A����r?��Z��o������(�Ȏ������0X�R�?���S�_�X��?"'�'�
�?�Xs�ԟ�����?�@�>�a����!�	��`�������N9�O����/��P�������,:�|�u�?��(��3���y��>�C�~D�<��,=����>?��/�o������(�ȋ�	x��s��Hs��������/��P����������I�#���?�@�>�a����!�	�?⠰��'������/��P�������a�}I��_�G�~7���}���?��D=�h�<Ca�}I�9��?���
S�_�X��?"/�'�?�Xg��?��P��=O��}b�����?���m�G"��k0$��eE�„�e�~x�����t��U.��Z��}b�I�>����^ߙ�g-�5��K�ͽ�)�N�ly���yg@
y�bG]��3�uU�:T��)s9;֚ٸ�(��y}�Qn��"�9{I�$���v�����6��o�����}P@P@P@P@P@P@P@P@P@P@P@P@P@P@��kp��;���q���F��A�<���u��ךx�N�=29����F9�pq����$rzq��t�I�s�$8�c��ӧP�Go���$v<u���#��9i�~G9�=?@]���;�O$u�h�r�d�g8��r{w�t�	�z�x�1@t�W��	;����q��=�h9'w�s��������.z����=
7� �:t9��N���@
4|pT����#�s���C���}1@]$�6ל����l�ƀ��8�CϪ����*O�s�#8�|}���?�'�A�nx�����������p��g�P�H'���dpß�>�r��c�<0rWp��{P��A�d���x��c�!��I���%�>���{�(?����;������@4�.r:�'�q���uQ�pF۟�~\�PƒF��X�3��I�~����0���{�l�^�
 �$烿��=1��Ƞ���	���s�89��4d|�`�^������� 6t��Fpg=9'����1�;q�G_ös�����0{3�'�a��`�Zp�G���g�y�z�(����1�p=;�.
3� �*q���O�t����I\����Lq�>���1x�=y�_ϟOj_�`~ꑐx�'�w�Q۩��d���)���N}@��?!���9��>�1@
:@8;	�m� ��;��ϭ'�>1��!�n���#'�E�;yϨ�~���U���w=}p1���3@�ԃ� �NI>�w�G&�4v�0���p8ǩ<��ni�zۍ̤��'�3�ϯ���5���
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�*����h�#�=��:��׿Z6�ڀ
��?*M��h���>��ڹ�џ�.�:�z
�ڀ���(ھ��h���h�s@UN	����W����s��@���t��~T�W�P�O��ʀ
�:(�.�^ݿ.�mp3�:M��u�N�ր
��h?Q�]��t���zP�zu���h��ߗJ6�A@��?!@�����~�m_A�P�u�&������8���h�q@��p3@	�}?���=�}=?
6�������hp�@	�}(�=3����}�@��G�����}�@��?�Z6����h���admin/images/sr-screenshot-thumb.jpg000064400000032661151331545640013536 0ustar00���JFIFHH��C





#%$""!&+7/&)4)!"0A149;>>>%.DIC<H7=>;��C

;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;��<b"����H!1QAR�"a����2q#U�3B���$EST��45��6bst������,	!1R"AQ�34aq����?�D@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD^iwۋ��TGK#!�9�7@'�'+���6����G��w������y?���m�����ͷ�0��o����O�8�z�.cb����OP��$�{F5���u�q�9px������9�<�DE������������������������������������������������������������������������<F��U����U�;�����Yc魭�U���Rp
C��mM��h����e ��Lq�vH���/z�N/<90�ɻ�������^#����nwcm��y�%�l�c��%u
E���Q��a���{�[�O�'�+q��]2��Hӏ�%f_"�Gcp�B�j���99�����Z��������_���c;��v3�Z����?�U�.�g����Wx���7��#��
9:��&�SIh��]E�'�Z���nl�=�����[Z\X��s:��xlw�mu}n�ݭ�4�S�I��Cd��ǧe���U]f��:�[���e!
$��<�I\:��v���H���k�Zv��=��t��qs+�UPײA�N�q�5��u}��CO~�M{�s|�8�#��{#��r��]E��A.�_�V���������-t�� ���m��鶲l�D���j�k�l���	.=O�S�ۯ�{��ݒK�
��{�ף:�\�l�kc]�dey��Y[c�K�=�J�8��R;S�����=n�(v^�w��UU��S����'�ע�+ ��H�,���=��W+E��UTR:KUe=t�*j�1���23��-��^ �l�]¦-�#f�ߜ�@q%y�%^��[*v�x�S�����K)��Y>���3p�닔�ۗGx���X.�pl��h dd-��\��7Gq����P���2q�݂��:����L�{l5�H�J$�Anq����-��j-��gS�h'�~���n�#>��㯮�b/�]C]v��9�dp�;O���dQڮV��]m��v��H�.J��9�=I�R���z���>�~��#��x�s������v~�i��i�UԺzӻ��g4K����Z������d�/���~m<��p3���1�m�(��h������Է���ѵ���xdĎ���_��Sݮ5[m�>��(��<�2{l��u|~��s=}#���g�6��k`��B��RCr1�ȅ�[�k�v'݅��Sv�Β+�U-k�y����{:������%g
�n������ʲ�Y-��K�4V[�o/ώ}=��6?d�6��p������VD#�����3����U�Z�u�����UM#�K;語��75Ǿ2y��e��]|��8���CL3Ȇ~s�y�R�]����p�m%��D��2��;
9>#Ǒ?%��T�z�UM���<�J?�d,=Z� ����k7M��k�Z}3�;��%ˋ�X�۫�Ҳ����6�2���?0��Yc�m.��C�A�G�c��l�H�9��Çi�'�����h�O�V�m⦝�ҵ�K�.��cĝ+G��ʹ[G��ڈ_��E!�<x8���>q��s�?i�jJj�(斜��g7�
ɫ���s����ߪ.T����d���v]M¢�}�i��5����cY4@o$s�ZƟ���J·��Cn�\�w�����12s���'��%�c{i��h�$ I>�<�s4i?"��,\�e�)#�Y/u��4�i������=���]hmT̚�W+]�2?��=VT�Gn�W��`˜�rW-O5����-�����ҵ�!�������,�7�۵����VCUN�ݜDz�Q�VZJ���I@81>f��-
݌����,ls��T	�����Iǿ�U͋��*�2�Z�H*d���S$��:W8��'�쮧�k�q|�ʪ���*ڌ�+�5������-��Ri�.t��x$�wu�11�콮�����-�Fd~�Jֹ�Z�ؐ?\.��o���N��AC--C$eC*A,h>�7����%v���d""" """ """ """ """ """ """ """ "".�Ef˅e�v�SL�2�N���ez�����8c��nKG��v
�%΢ZC��!{K��2s���p/���/��|.%��g/i�+\l{c4Š���@.��:�
:@Dz|0:`+�U��{1,���D&_z��_�(O��8?�t�)��e7&�مǍq��m�f��?�w���ݝ��S�:����G�Ð�3��]*���q1�|���������Ò�:���WTT�oWKj�_4T�{q�q�VT[e�f�c1=�=��H����u�"��m�sv͋���
ueҾ�%3Ki�T�lY8��u����	���;��+|��ɿ��~<�"n��
&�RR\-u���϶R�h�q����ך_6J��_
�*��}��4����Ǹ[�M�Q˝���
M��T�U���*���dx9�'���~��s��F~Rʘ�c�sz��D�5�;m-��5l{�&n�78��z�[�<�Xc�������M��#�ǂ�%��k�V������z�����X��A�m���.�+�R�./k�k���䶈�]9�6&����W�]�i	�3|A�?�eb�a)�j饪��+�9����1�|9����u5{n�ښ���UKQp�I5k�SӼ����b3��;j;�'�L���_#lj'��^jj9������Or���P��U4�[8���˒��Z#��lot�S���1��|O8vNJ�M�Q�ڶ:
�nu�
˥\l,�J�5n���Xn���K
5��Ko��䠆lDs�w��t�[�����*hLcG�.A��Z8i憖�s�mK�jR�%��c�]�$�q�WlmƷf�Z����-��b ���=9��
�l��l��R[���2�����r���]ђ6��x�^\;���-�ԛ)C5%$��M1����@�v�mZ[>��Yo+�1y����tg2H�9T��jZ�����4������~Wu����EwSB�޶r���i�)󹫧~�#�^~#�V�W3����5���uҙ�<4����t���λl�W
�kij��W@�*)��+�y8{��"����ճ�����W[=ƽ����ig]-h�V'Β+]��C#��Ik���:�Krryw]"&馢]��Kb�͸,���DX�ǃ�a�ud��z�E�up�E%n��kc��̉�k#����+|��hDEDDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDU�����g}g�W������<]���TE^.�Ϫp�vw�}PQxx�;�>�����Y�ADU�����g}g�W������<]���TE^.�Ϫp�vw�}PQxx�;�>�����Y�ADU�����g}g�W������<]���TE^.�Ϫp�vw�}PQxx�;�>�����Y�ADU�����g}g�W������<]���TE^.�Ϫp�vw�}PQxx�;�>�����Y�ADU�����g}g�W������<]���TE^.�Ϫp�vw�}PQxx�;�>�����Y�ADU�����g}g�W������<]���TE^.�Ϫp�vw�}PQxx�;�>�����Y�ADU�����g}g�W������<]���TE^.�Ϫp�vw�}PQxx�;�>�����Y�ADU�����g}g�W������<]���TE^.�Ϫp�vw�}PQxx�;�>�����Y�ADU�����g}g�W������<]���TE^.�Ϫp�vw�}PQxx�;�>�����Y�ADU�����g}g�W������<]���TE^.�Ϫ ������������������������������������������������������������������������������������jjʪx-�բ��$�ع{��[�{�%MU̝�����{ΞG�\%ަ�Ex�T�]�,W���#5�R@�� ��E�v��\�]���v�.D��̵�`��#(=4�bޙ#�u�|�ED!(�3�C�Ⱥ*M����s[I5{�3�2h�˛��<���l��p.Z�3��KC��pzᪧln��cN�8�`ĭ}����F'm}S)Ú�u{޹[���g�Y᪦�X������4����+���Uo�Al��[��5�e$5��v�?�A�M�.�FH�-p<֪ﴔ����p�5S�];�G���>KS��pZ��CE��s�����-6��mL���2��2��*K�\��̎X�A��V�q������fFu���
j[�e-�����MsZr���a��k�-[g,�r�601��H�9g�9ZzȯN�m���X �(�s������A��^(nV��0N�N�t�sЬ��:��4<��0O�yeLp~����1l��C���ڃ�xG�Ej�E��
�⨟x����=�K��s>�x��
˔4�ڪ����4n{�Ǐ�g�F��e���)e;jbl��x呜g�y�-��vv�0�x��*�7���?�B�zW�Xi�ii�c*+D�a���w�ӟ4Qǽ|�k<�p�h�[�#xνC5�6���6�:�h癲�-v��W��Y��Q?f�l1���jL�q���@9ќe�E4S�\22F���B��v�v�KI[O53��Q�B�B�Č�9��	�'�á��_nutL���VC�ϳ��ܲ���B��-���g�;�L�/�<��x��)n湴3SS8��=�k]=��<x�'<�J��hp�\]�������GtV�����Im��\����<Y�^:<r������3i��ayc��;{��M���c���p����
+�5$Z+��icZun�3�r�D-�ۍ���L�,�����츘1��x�0S/`pisAwA����X��@�DMTr4�y���?p�nIn�FVL�AJ)���ϴ~H:�D@DDIv��9�c5�6���m-Օ������:�L�̣-s�3�\l���[�t5�.�D#�x�rV��[K$����/�k��y���G���2�I{@w���b�.Q�['�`��5ß>닚(c��6�W�RqRY��r��G_��(�4�Z�� %��Pv��D�x���z���:�q��uI#X��8��K��,�{hY�J����3�Q�t��%�.���_����ё��x^�κ���Uc�#C��枅�!p�&@mtF��Gln/5-qg���[}���uk���X�Z!�͍��N��8/T���Ml���%�ip�ӟ�*2�K%�ֆ	�f�;H��s��칺�t�ˍ�>��2�:�2�(i�Yu�����SN}�q�>;V��cl�s�ա���.�H��3ԝ2����'�긻,-5��Lղ_m��M�����
�`��]͵lw�K�Hv�j�cA�S��=f�ӆ�al�]�$�Ꮏ�ɢ���~:�p8\��nu�8�f6�5^#����6���4��S�8R��3�\y���DDDA���H ����E/���3�l�����:����#C��=U�ܧ���W�Mp��փ���d���b�%]T����a�S����bs�0H����Io�9j$�excKy��G�h�p��ҍ����WQGvf)��QU���'422}�3�J�VEk�i�(�$�a��t���::J�&��d�6f@�c���,�K���k��KNp�Y�l���ߝ/��������/V��z���~>��=��ɳ��&c�p0�r�&��c0�un����)��_,��K,?�K��n]��>��V�j[�;c׹�~W�Q'��������+���7���	
��9[�F5��ᐦ� b����K<�r�&�,�f_d)��6H�21�i�p�T�dž�
�NZ1�MD5���8�8�U$�)H2F�㦦��4A�池��hqph�N:�"f�f&��0���J[�4�L_)jP��npA��lQL
���@�bv��ã�壗覈 a�ǻ1���wH��TF������#��7Llk٣MZр�`QC1��i�ˢ���48� sRD����Ѩ�8���ft1��\eMY�
�3�d��P�|\��xVm��{U/O�����y˜�Ԓ�CZ3�������-�cih�#�� ë�AYSI<��u#ˣ
�#�,���
>rSD1��ƒ:dtT1F�h,ih�#�� �cKt����kX�-hhaIGCN}��u��WKr��0Qlk��z�9�1FIqcI=IT�t79�2F:x*68ۍ,h�L4@DDDA��|lq	h8Us��{C�b2��#��t�{c�0�@�1�IGv�#z秊�E4u0��F�.iñ����SG���qT�����"�$��.Aml����sRDD@DDD@DDD@DDD@DDD@Ek�o��$����^m%�m+�n!�����Q�m���Z�U����4�/�zZ/4�m���Z�T�m���Z�T�c����KE柂m����]Ꟃm����]�}�Ծ��h���M��cU�k�S�M��cU�k�S���:�ֽ-�~	���j��w�~	���j��w�t1��R�ץ��O�6��W���O�6��W���N�>��_Z�^i�&�1���ީ�&�1���ީ���K�^���?�o�5_ֻ�?�o�5_ֻ�:�é}k��q�+C�49%��O4ֵәv������o��%�<f7R���.���7��q
��d����+�I�7����q
��C|�� ����+�I�7����q
��C|�� ����+�I�7����q
��C|�� ����+�I�7����q
��C|�� ����+�I�7����q
��C|�� ����+�I�7����q
��C|�� ����+�I�7����q
��C|�� ����+�I�7����q
��C|�� ����+�I�7����q
��C|�� ����+�I�7����q
��C|�� ����+�I�7����q
��C|�� ����+�I�7����q
��C|�� ����+�I�7����q
��C|�� ����+�I�7����q
��-�"�""" """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ ""^�T�7Y�����E8qI����[M��
-���-�C^c�9[�����I����K���i8��m��C�,g�=�U��me|�plT�۫�p�O��C�N{�1���f��Ηc�
khv�᫶y�4�Y�6���OGh��H첰Ms�a8��ӫ���v��]�M���l��O�mL��W�@a���v埒g.h��<y�C#���I�ʢ��I�֊Zڪ��=�9gHZd=pq��]���_���h��Ph�P�%0��
G���>9���v�h��~�����M�]�%�>��k���p8낼�i�
��o����[xll�������j�[�����>��n�qIYB�����ϟ�/�A�_/t�?k}·Y��461�=��;�K��ޫj(]GWCYN��T��i=�<�-G�����l�1�WIq�;Ka�A՞��\ݶ�q�͢���Q�5�p���{$�<�f1�a�]n1Z-u7��M��`��\�?i���U��5,�i���n���;���m��W�����|�c,�J�z:;]�G+K��h �G��(=��D�+di���<�=��$�yUږ��m?�>��Gm���R2�S���o	$d��,K�/�큫���H
���UK%{s�4��� ��@p$uZ{в�Sr�����L�gY>����[���Z�5RO]RȪ$�C\F\\���M[KCl��T�����Td	I$��� �6��Η��*��
.Ǡ�5��&�����im�V�T�&�	���4��:N@�EglT{M�U[Au���<^��`c �0����e�
�U#!y]��׭���&�R��1�*�Lى2�}|
�g�*J�;�o���+$�d΍�9i-'�\uA�""" """ """ """ """ """ """ """ """ """ """ """ """ """ ""j�VK��K���j��}4ś�c�ʥ�%�[+(è�%�5�%�w����:-� �m;d��G[*&�D.���D/dtX�����Ĭ���:�B��{�w]b ���ݺ��Mr��
�jQK/�9w��[��Yo�º�9��ӡ�)a{{�D#��^����
�DA�9�<I�Y��覿Cz{_����;��s��[A����h����bv����a����X��5�Ե�s*d�q��t�����-u���k}Q{�=��p�?^��emU�;�x��8Z���n��=��s�-���
3�
��!*"��B��H�O�Mf�6ѳ�:�jY+ä����<�p�9�n��-�(�0��f��M�R���AW�ػ,ԗ
Y`���f���:���D��X��
k�M�}M1%�K9y9�π
�O��g*�e�|�L��2w67�9�j�Q���{ԐK<RC5;4G-<�75�\��e��~���K�k{���=��+b�������������������������������������������������������������sE+���k�n���=�E4S�ΊF�5Ť��u.""(c�[r����T�x�`d�Tr���B����GO�ᑰe�>�V��#����I��-%���j�" "��YT�g?������u����atӿDm�pO�+����%�.��ny������/{cc������Ef�����.��	in~j�" """ """�OS
S�_��ya8#r#���Hh$��IX�
:�9�����iA�����S1���C�	�yQ�j��e|�D#��s-��Q�9�á
�����������5O��;V���F:�E�2&����q�R@Eh��ڦҗ��/kpy����D@DDD@DDDA��+��ϴ*�G��ak��c�ou	q���F�׽�9�J�U�h+f�M��a�c�����Ij���:WS�G,
%���#�
�:�K
5<�RI%I�����:2y�[;+���V�Dl-1���'�u��Ei8q�s��仾��>���t�s)�Ө�ĸ�����Pj�"�r~�S�Z�%܎C�~��a۸�:<�͞F��4i ��[�-�V
�G�`��A�dv �-ԢxD^�3����GO�5�z�V�ڗ>4��"Ղ���Ǫ�m${�$��٧�8�1ȫ��n5\I���dj:K���3�YU�U@�&n���d���jLU79(|��M\H�!q<��1��MU[r��c��	���dv��[��U��}LE�h�s^Zq� �J�(i�|.d!��ǧ�h=y|i*8����O�h14�C3ϗ<�dR����B�+%�����k��r1Ӫٚg
�c�T17�}�X�r��e�]߷N���O�3��57H�>�PDʇ��r�cQ��{�u<SP�,�9�����N�$j�O,�eok-tu�c�a���s�ܨ�UhM��s-$䞹�\��h�^-��Բqtfw��##�=[�U_Ur"�JQF����=��w|��vj�䁰e��^\�;2I�U٨+��TA��`��7P�����k��ds%�SDiǃN�c�
ʹ�����)"��D��K�������Ji��W��1�20��t��F�߮C��;�
mU9v�ҿ+��ik�r-����ZE뎐�e���эZt㿽o�(i���i��$��� �:�r�,��W�
q�կ�:���3�Akh'�����X�c��横�ֺ!U%[_J�tɂZ��/��eu�7F�p%c�ЀrB�%����u<8t�.qq�nd�{�i���w�U>9�w�gǠ�d�r[
EF����W�#䦑�r@�-�5��I>�}/ӗ���8}�T�4B?�r���G�=|Pj�䩤���x��g88ky��a�a�U�
��V��m{���/cZO镺��Q��'�"/�Z��߈9U��I dp���ڣ�Gg�Ȟ�5rCU-ʦ���゙���d��9�X-Ur��1�:ec�
��F������'�$�{�y���o�lt��RCQ�yc�>]�b^gsOsN�%s����\�~��ʦ���QI;j�:��7�1ȑȐ�+-��`�����k�KBT�(��#tt���j y�DI�+i��WQQ�#�=/�7 ��A��ǒ��S-UE;j�C1dmk�"��z�:�ouQ�4���Yݤ��nq��Oe��Ԛ�i�HH.���:e����4�z��ig�&��"0����;?�d�%Ue��8���]�g�9�rY�6Ku\Ϛz}N�a�{�w��>��<��K���NI�[�}��*����GD�dɉ�݁�h�\�8[SOl����Vj�[Ƃ5�x�oe�����y�_�:uwӜg�~I��M���.{ud��y��ڮ:kD����f��:�c>V��J�U�(+��@�)�Fcϵ�Q���S��%�����,���q�Ε���c���
_�*�y��Q5���k�Z˃-��[+"�x]��I�K��{�����5�3[X��9���[)+�Qs��\ז���!�9�U3[�jj�L� �An_���?�FY�1MI4ΜSW��H�x[�T�TS
�Mnh�' ��Y1ڨ��m3 6�H���s�s��Ph�,�j�i��ds�j��a���?������/�O����ZS��+:K�Y�+����[���8���T٭�u��Þq� ;2����VU\jnU0Ӻ�ͧ��
3�\[�GQ�9���ݕU1���Ca��.ܫWh���I<pn���n[�����m��
cF@��@�*�l�7	*
d�d��Hp�Z<0�����Qt�NS$<6>Zp�$x��n鬶�J��4�^3�.$7=p	��,jM����uLM�f���'.$dt$:�����U_Z)�Sxp�asZt��j9=~K.#[[w�9jd����Y"��o$�nK>��A[>�x5?$=��;?���H"����d1��-#8��U�T��P�W,2�o؜�q�޿r�%,7��e�ݧ.� �[vح��z)���n�]���|�-TR�4��۝�%��������57�Tl�̥�=;����Xԕu�Y���`l��t��
e�ӟvz��]����t��NZ�4�������*fÖ5�G�a��<b�e�JIY<�WC;������:���ʋ�#$�g��F���翽t0S�L!f�����9q�V3�*��S�&�G�:K���� ��k*j.�m|ж�4���wa��r�D�l�sd,�jpC�,8���]��;�u_�G�叇.�m�AN"��3K'�|]��)�'U%+�`���~-qW��#l�5���5�1��u4��xcak�6�I>���Hd�@�}�g��J��o��>�����!��N����g!�~��C�̍�1�Y6��T\k'��S.����H�ߪ��
��:WS{N~�o��� g�fCOCt�^^�d��?`�]\��oP�2�Jx�W��c>孧�Hh�����I^��@��l�<���m����Ũ��k�H��
�l��MÊ`����]�r>9���*l7�%�p�Q�������u�V��[P�H*+etQj{!-�G9�%�e��4�ͧ��diq:�~g�%,��DA��n���GcϘ�TJy'��ڞ���$���`9�p�;g
�P�'�}d�:��o���(ӫNz;���V��
7(Z[�Z	�#��F�o4m�����8�w՜�ߕF����U�B�����+ټ�@%��e$�TCo������3[��;����%m�d�6�H0�!p��:�9���i���Zatsi����'*+C��[,U-�S�Új^�<;<�)�+5� :fn���9öI�dq�(����D�7L�)�g��PM7L��n��E
�<�r��y~��Ct�/ܦ�_�A4P�3�)�g��PM7L��n��E
�<�r��y~��Ct�/ܦ�_�A4P�3�)�g��PM7L��n��E
�<�r��y~��Ct�/ܦ�_�A4P�3�)�g��PM7L��n��E
�<�r��y~��Ct�/ܦ�_�A4P�3�)�g��PM7L��n��E
�<�r��y~��Ct�/ܦ�_�A4P�3�)�g��PM7L��n��E
�<�r��y~��Ct�/ܦ�_�A4P�3�)�g��PM7L��n��E
�<�r��y~��Ct�/ܦ�_�A4P�3�)�g��PM7L��n��E
�<�r��y~��Ct�/ܦ�_�A4P�3�)�g��PM7L��n��E
�<�r��y~��Ct�/ܦ�_�A4P�3�)�g��PM7L�� ��admin/images/spinner.svg000064400000000674151331545640011316 0ustar00<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80">
    <path d="M40 0C17.9 0 0 17.9 0 40s17.9 40 40 40 40-17.9 40-40S62.1 0 40 0zm0 72C22.3 72 8 57.7 8 40S22.3 8 40 8s32 14.3 32 32-14.3 32-32 32z"
          opacity=".15"/>
    <path fill="#3568B7"
          d="M75.8 47.4h-.4c-2.2-.2-3.8-2.2-3.6-4.4.1-1 .1-2 .1-3C72 22.4 57.6 8 40 8c-2.2 0-4-1.8-4-4s1.8-4 4-4c22.1 0 40 17.9 40 40 0 1.3-.1 2.5-.2 3.8-.2 2.1-1.9 3.6-4 3.6z"/>
</svg>
admin/images/duplicator.jpg000064400000243050151331545640011764 0ustar00���JFIF``��LEAD Technologies Inc. V1.01���			


































































































���	
	
}!1AQa"q2���#B��R��$3br�	
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz����������������������������������������������������������������������w!1AQaq"2�B����	#3R�br�
$4�%�&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz������������������������������������������������������������������������ ��?�ր
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��3�mV�C������h�k6�Hڊ�y p�Թ(�]��[���)'-D��&����?�=��-�����H怹���;����j���W�[-[��J�I��NIo�������ޠ���1�rڋ�et��,x�(m���1³�BW����x�0���#5��WW���^l�)��	8>�V��_/Cf�
(��
(��+���a�7#�i$c�* ,�q���	�4�_��V�%�*1rj1ݻ"���Zk����H&���ː	S�VR ��0Ek(�;IY�?�I��4g)k���v�U�љ�x��Y���e
�3�
�8y_>[���	�p29�e%
/��+u��N^Z�M}li�TT��$�KNR����mk_����ŭYA�@b��&@�
�
X��Fz[���뱔d�����6��h�e�P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@{�T��ځ��K��c��P�)KeZ�~��[6�����O�7#�����{c�����On��\E��Tw��(�J���B]�m��j�:�Z�;o��⺹J�Km�j��hΖ�'u��d�[(;J�Iu5�[��cv�r+
�U�V��\1+��F�U��Q��I�7�5�5�m�-�Z��VMi��5e�Vն�n�{����~��m<}us�]R8�R��YB�:B�&g�{�X��e�6dF��N�==�c7}y#��=��iY��\��UYOUI������
����w:�#H�m'�������ZA`�ǖ��
zoy7�����VoMѧu��Z��[��j�'gt��Kf���Gg~�zk���O^��LMA*u)no^Y���l�*�F�'����9�\���C�_��#}�m�7o��F�ծڼ�Z|����S���}_���=�W��6��&���+%��C%��v�cm��r�&��B*�M
�7m���~m���M�m�B�q���k���Y]��D��s��K[�����TY��@m^xd���*�22UTq���ɪ��YF��>[��qQ}Z�sW],(�>ovQS��g%=���I��{�{���|T�ck�
L��p�x��ȍL{�~y&s*���f1���:��hԋ|�
JR��'yAmh�b�~t��r�tZ�(8�XɮU��~�;���ܼ�7�ZY�s�{�=Hy.-��#�5��Ă�g���,8X��u8=b�wF/�)JM��VI+�)JI-씝����i.kO�-�s�W�ьb۶�y�]�ok�[iO�Z���0W���5��'�V�b��,�è��+��<�rǝK]W2��.�\�I�])'.){�3MY�FQ�Nd�e���w��︚f������(�H�ˋ;�bo١w0�,��O��t�	!)��A���B����8�9=�4�I[yu�*�*�ԧJ>�ZB[�^)�����µIk+���H����t�R�Z��5թR\�Ŗ@k�l�<�"�%���(�&�T�N�?����=>*o������4l�M>X��O������њ�Ӽ]�ۏYc}�wv���2��ף+r���9*��_��Z4�Mh֫B"ԕ�4֍5ѧ�[��8�o��ñ�X�	.2��\�:nUX���R���v�u��{�*q����zuW&�NR����Ck�R�RI��O��������w!v������G@#��:	87*V�7��Jo����X�D��D��O��H%	��yG�V].�tl��!�-���-o�	�������O�����c�����o�y[�襯K�Y���������u��tP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@w��oA���O6�x�cMʛ����ʣ�O,(ZN��F�)?(�q���&�}
 �o~����K�mz(����	�1Ot��.���|=�%��W��]5�w�qb0ꪱ�FA��
� �\2�|��S�J�����n��)K��f�f�d�K��SI��{T���.�rEF�z(��uv�ݛ���|���YK��V��^�!V�ʷȂO)���!I)�q��h���Ԧ��N0��.��5�I�%�KT�d����{U�jIuN��z�z;=m�q�j�������|*�+]�6�B���-/��m,x�����U���J���v�+���J��Z+Y����Gk+����S�l#Դ�[mr�k�cgO.��K�e�1O�4NN���ntۥ
)+�F�*��������Z;�
&�J�[v�YJ��vѭ�%mc�O�Vw��m�C����O�^���h���k!��]$g08a�>�7�|�q�7VU>F���T��-��si̹��n�m�(9�;��ȹ���Gf���d۵
3�z��u���[G��mM���`�6Q�r��@����(6�Q�ا荒�vv���
�k|M+����7�)ͯuSqqꓓ�[�$ܮ���ʛ�[������זp�m�$�MH���㈃2���e����g���
�$�y�����w�"�I�u7�T��VkJt��޴���I]r�__un����)�0[�n�R�}i3�iv�ȶ�,s�-�Ia,U�;.֍�J���1���b';]ZT�O^V�o�e+�-z>z^�N����W��k���2{w]�@K��D�5��jO�e��b�#�ʫ�w;ȭ�'$�V�|�,���u�D�}���'{}��Z�:��m�I'��3�/V�X6m��kq�����
���t�g��q�9uE-%N�|�2��Z����I���e�왤��-����ev��>�iپ[�-�=}F���ޛ!+$��K~�gu�9�k—W$D�$Xk{ Akk`d")d�%����0�l�RRJ*T��tu-~X]kq�®���̭�~e�*�5��v�[Jo��IE[�IK���}*�;;D��D^��$���%�$�I5r���{���D�Z$��-�hB\���][oV���վ������n���6�e��Q[�!��Ù'��dIr�*�+��A(�SĔ��pV���I�J��m.ʛm��#���o_�{��cٶھ�[��v����|-h"��.�5����e))���wDvȪ'�
�q���9�Q��=%	w��R���܉�87���3����
�\ѓ�z+6��w���QXE�ޟ�+hbn7e1'����8湪E�	*�ܱ
/*�*�]:��
G
��P���J���褞��K�o�B�}/E���_.{{Xc�2���0ܥ��eI�5�ZJu%(������'�ɵ�3��s`��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
�xV�6�A��J0��F�ڦQRN/f�v�G��TT[�R[����sk0�^�w�`��K���B��Y�@q��W@���)5f��z�om"ޝS"�ME��uh��z4��[M=F�TU��aI��ޭ�%��-�:�€
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
"�Y8*7~���	>�/���'���������>�/���'���������>�/���'���������>�/���'���������>�/���'���������>�/���'����X��W����@HNU�.�ϧ���l���ր$�+�Y?(���eo��'����=d����t}��笟��n����������V���~Q���w#�d�V������{ր�dY����023�T�ր%�+�Y?(���eo��'����=d����td呎J63�9Unq�~lq�@�@P@P@P@P@P@P@P@P@P@P@P@P@P@P*$��!UB�;Cg�\}�w��3}?����<�������L��O���r�&o��o�9@�7������ɛ��~��P����m��(�f��߶��y3}?����<�������L��O���r�*�
4����l# �����	���
�i��?�ʀ9�3�q�R����K�"��(��3G��_&y��frE��7Cߊ����UE��.K=/�y���md���9S�۞<�Z��Y��y��T�����|Co��)
Ȧ�ݮSpP+�d6���21��<z.KeR�V���P|ݝ�~��,���c�z2�%�nK����AF>��[�^w�ï٥h�x�"`��89G�v-c�i+���$�f�(�/�[��ݓ�U�n/�I�pwKX��I�]��aOp�#Le�N2B�'�@�w��.�Q�����K�p�7�*R~J)�O�c�Fgd(ʫ�Jm|���1q��oU䍻�Hk��޺'MZ�x�-�����;�ݫw��oKY�6(�K�~:�|%$p���R���@�4Q:�eI��K��:	&[�S4y�${�*�pˑ�`N*�0<�Q����\�~�0�[W�[N�B��&��L��<!q��N����`l&���Okl��)��K�3jm���_=���q^�0��e˿2���;	f�:H�փ>T�121SJS�Y2�.�
��޵��e��]�_{$�J�$۵�K����q���2�}]��-|Eay*���#:)1J���X<bVA�v11�߅-��y^;8�.��I�_u���wN�4���>��4ڳ�v��������O�"��3ܲ�$Q�\*G�U3��D��X��8�)ޜjw�6�ҧ	����m{�i�g���F>j5%���smk�d�:`�t`� �����ڳi�ЄԒ�٫��M�׷�s��B���l��G�\�A���\�l�~͢�k$q���gXi�
E��`��ԁR��7�e���R4i(ŭۗ�������cV���vƍ#~��~TR�����O��	9EKg(�m��Z}�i95�ݗ��%9�����1|�R��I��_�����D�P@P@P@P@P@P@P@P@P@P@B}V���SON:�ʊ�<�����izb��;�~�����U1j��e �2�z{�Om���0��
(��
(��
(-~�������m�B�7�$�Ws���=��=���\ڄr{$��Ƕ�J0Nsj1[��K���v�v(i#��K���CR���>;H�Q7����J3���I7m%�gf�L)קYڛw�����u̕ך�7+��
�k��2���)f
1¨�f<9'�M&ݒ���vZ��n&�U۲]^���Ƴ����ݕ��i6�[��+^�֭M���ku,�e*W�U�A �2'z���|��+��=;�]�+��.l<���z�>�4��n]���R���ռ�fP��eʞ�����'Nj�[��t]:��V��e�vk�i?��Y��V��Q'�s��P@z�J�?�yW�켙l���\�$���Ix-�C���iD;E�7_1�Y�O��;/�S����P��u���ONeL*|s����(�6u'�;{��n�����w������
or�i��ܻ�*D��s�
��T���$EӐ��T�9s�uV�T$�z>g<;qk{�W���\�mM]d���=5�%�ڕ֖��[���fW�N���b��*�r��"f�G8#��v�ѫD7���G���x4կ�F�ew�rk�A+ꮥogP��߳�^�ԯeiV�ե�eR)�9��ͦ��Iէ�=1�����En�'#)X��"�Ȑ� `�v�QR.o�7���)];'���|��:�ҲZ�U6���t�y�廊�ak6�����w���G�k�8$�o�X��Mok,+���I1{��W����E9�1U$�*��9�h��W2j2�.���(��*KM5t҄�Jn�Q���(�W);�\���z՜�VQ��t�"�+m2E�X�i�N$�H�Y�y��`�g�bi�n`��3���([٪�ed�h*��з4W��SV\���3��,�+�WF�n��p�}���QE�_u���.l]��X�ʖN�^!H^ܽ�o!��e��X�׀*��b*����^ެ��+���I�~h��7k��%gf�g�����_ê�Y�&�i87���i"��\s�v�E�ֺ|��V���t�w�i"�d�X�O2Qo�3ye�kxs��oFQW�,T������v�q��JWt�i�+K��Rv�3tڦ��I>mRw�y�����
�����ma,62�y�i���;6�/��![��䉾l
E�ĝ��.T�4T](Y8�����k(��K3F����	)4�-$�+�������ml��xUZti�t�Ui�Mn�|��"ۿ�n%?��<{��$f�N�n���rR嶉s-�5m�Qvi�(�7m���ot��^�����2�H�����_�~ܻ��p�	������?��O�x�zT�Q�]���O�31��E����rP�q֓��ߠz�4~��8�[���>����c�*��;o$hL��+��6����+��FԾ7e�ܛ���sJ��%�s���[�m�ӽ�J0��ի�{:�U��<�l�S���s�ن����l��E̾h!	_(����4���4�^h�:�ks_�^�/�T����T��N�;��]-�[滵�x~�����8�m ��`��fr��e �i�X
�Z�$L4�)KxѧʖϚ���kFOE{���^/7���v�Y�9k�i������ͮg	��Og�	#iºݢ���|��t��7	eۜ
K��t�:JM��1�����JS�vr��VM=��u*��}֔�����Q�����50(�����q��RP��#��i����u�&�{���X$I�HXK/��P��Yݣ.3�\��V�G��?�����^���oH���ɔ|������o	ꬒG��y�IL��lmo�h��ۻvT݌���V��8�褟uۮ���Ԓ�+N�^�����އ�(�����ʔ{$��������Q-P@P@P@P@P@P@P@P@P@P@|��n+;oɾ7g�(dv�v�%vp�& @O$�8�i|S��N��Q�z-�'��kSH���켥%o]<�?��N��Gۥ �� Q�O�in�<)\�r�\�QwJ�}���=��ד>�ӡ���S�QAc�T@c��98�UiZS��ɷ�vٝ%xAEn����O�u���y�:N�{=�p3���o B��շ�s��Ң��S�NU�����Z1]T���u���
#Fq���\����z���)��A����_�q?����$n��G����L��	�h$q�?�J�f-�U���Nj����Ϝ��^�mo&��jWZ�\�k'y��0�o���Lm�X���v�7+��:I+���e]�io��d՝T���׋M�>]��:��d읒�L��S�a�u�^Z"��L��[I0�sh�̪z��H��
s���(l�캫��6�Z���'zpsf*R饓|���۽�{ji���]Bk
O�Q[T��M+��ጬ���F	T��I��r���N�v��{�תO��Y��r�W��'.��\6��e�汭�7w�W��[�+liX�7�_j��i�g"h�҅(����%y?/�/d�Um��'h�4��n*�K����O��?�)�-0�{8]8�B5e�np���P� 6�ߌ�G �\�kʥdһi���=7ٽ��\��>�7g�M_Ng�����B��V�E�����v�$H<�X�R�#�ʌ��qWf�R�g%����Z9;;�F�l�)�HMh�|1=ީj���*�X��4_���yn䴆��D���ED�F�!����'�+Y��s��I6������stZk:��*rQ��&Ҳ�g}]�<�W�]2K�lM�7)j�%�Oy2���1yEU�xc57�'/�r���m}�SOf��d%��zrEM���N�n�N�ۻ�5[�f�n�`KFv;Q."�FA�:��A9�sW(�ۻWj�[W��՝�ȋ��'e����[�>��n�%�ޗ���q^-�+MOK�����`���h���'�P��+��w�j�!�GN<�ݥ+�Q�k��]O3�}��5oR�&��)>�1�woD�~sx�Y��w���+�E�h&�3�m�s�#<���oJ3��u_2�M=��z���t乕�\�UhJ�V�}��b����t�f�Ev%ye��[v�dT���І��P�HDžےzJ3ug$���y#)Y9I6��y�U���W�����N!߶o�NU%U4�%{>ww�F7piZ�����
:�f�{���ݭ��~�4���^��rђA(�c����Z3�����IJ|�I6�nhS���پU�>ũN�7N��=^Jj�S��,��I&��%�g�j�+4�j�dm{q+-���ȷ.�B^3��?1��|��P�9WtR�X8E'S
)4��=��r9[ފv{;�|۞
�v�^���I�2�ԧ�;9]�f�iI�:���֥.�opc����f�d�i7��p�,3��V[{�X1rG5I�&��RJIR��R��y\����5�泲q��uW?k,�)+֕9J\�:��'T�^���J�zE��:lf�����̒#�ݶr�p�V���<W���Of�c�Z2ѭ6{������4������Q���n��E�#xsF��a�][y7�;N]a�wB|�q�l��b�}V��W�'�N�����i���?�^…lv��d��U%j��׽6�PB����F�b&�k&~�^l�T��qJ઒�Z�ߜ���k�������,�T줝���S�%w{omn��9�
��(��M�ӻ��b�����'+Y4�O^]GP��Vz��p.!F���˙������v����-!�1��$�',+��h�ӝ8J��S������F\ֻZvH�N�N�y�gN���7$�ԋ�<�c�*S�b��Yh�%Σ��}
�y^��w;�����Β�'vL_i���~]��1ZN4ږ"�R���%eg?i���.{�ws8J��B��yR�:�6����8�n��]�-��U��Q'�s�׌{�P@=��G�n(�O�ho�E����4}�/V������z����Ml�տ��h�d^��|?�@�"�o����>�������Ƚ[���&��E����4}�/V������z����MCqr�*��R���B�=�*��� u�V^�@	��?���^��1�<���?��i���?��נ�L�)����c�yO�|���������@2ݥ*�U�	�bN;}���o��JJ�U�8�9/����S���z?��������?���^�ݙ���S{d�Uy��X��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�	����S�^���)-�/&8�+ȭ�-�'�c�²�\\�RMzrF?�Y����]��'�3�u�-������[���7Ѧf}+��r�Zl�t2��I��Ѕ�\��$�@;�	�`�U�.�NW~j���g�p������m�Gk&���󻏃Z3X-���{�X��3+��T��q߃�m��*�jJt��J�o������mm��S޺k��Z���]o��s���Q�[�d�m"�b ������wo+�fWnq��'9$�:q�J�j.�Q��/�����T[��ޮ�)�?��mo�����e��i��ϳA��ݱnۓ��8�q�'�]g����v����/gn�m������ӓM�~ѱ�3g���[w�1�gw=x�n�1�Uo][�B�����m���	q�B��-�݋����Hrİ�P�,���U^N�8")~���-[��i��Y;�I-�����{��4�ٻj����U�i�{�M�{�}B{�#P�O�����(vx��A��NYA`I �

��^�RrQ�wv��謺$����/v|���蕣��]?�ѿ�f��^]�����WV�$X{Y#�C�08l��@8$
�'IEA�Q�Rw�����oϪ�iԭ7'%����8+)'��n�j
O�ڔ�r��c�ю1p��#�X�@evs"DJ��Q׮�(�\�H��vnJM7��U�GGfӺM���%F��We�[���޳�-�.�ml<%{i?���m�v۳Gi狸��v�;�)IA���x$�O��gߴ|Ҧ��mYZ]4V��Z�pP�:i��rQ��u|�[�}�={+AᯇO��1��wB�[�s4I1U�"�xedU���'�Tܣȩ%e(S�I8�&�n�&��-�k�%K��z�NjI�i>Ue+��w��t���]Zi�a�SM(ifM*�RH��B��l�ؖ�ӊ�{�1��=S�zK_����{j8��˫I&�k��o}���V?ٵ�Jgiei�r��`ğ,h�($y��+�0[AY]��oV��;m�JҔ��쬴�_�M�:�������A���	��;�1J�$l0�2��A�#؊6�n�^A�gE���<Z[G��#X#T|r7�P����+gV����&�nM���}>F�J	��T�M(��{���>��[�����ɺ�9����#���;qY�N�-�.���SG�>�I8�g�V�m�W}�H����3����O<�ڧ������R��R�ۚ�޷�ʟ'��&��*��ov�Ӧ��J�h�&)�����d�q�u۵��e���S�$����}�n���p���K�VV��{ˮ�-z$�C.4]>�)��H@X�ፖ00@�B.�T�[�e%'�M��]�d�T�NP��v��iz+Y|������t�8�d������l��(�m�����X�,m��ko���D{Nr�۴��c&��R|�m��ݶ����YX��4����^�$���-5���S���[����d-�6�R��*��Խ�������ܟgOc�g�������ͥټh�BmЂ��Ƥ���h �E�j^Ӛ\��w}���i���˖<��ʹw��kn����8ct#�NS�2�_0�9�_�睹�y�jy��%�-�k�{Z����B�#̪r�uU+.eߖ���[m}w��7��MIbP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@DЫ�0'��e��i>��_Y?��UB��$����O��'�@�����?��<�����I��P�/����O�*�!}d����Ty�'�������_Y?��UB��$����O��'�@	�u�K��]�?PX��"�'��
,v���{OR=h�T��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�UT��?���TyRt�k��P�I����@�'�O�U3�H#v��=��@-���	�k@4PSΖ�d�����,r�(($�8�?�X?�����Ӱ�ũA+�j\3�tR�$�e��׵^�0��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��2�Z�Q���m-���	�k@4P~����X?�|t�_�=!��`	��1���S�Ha@P����i�!>�p�I�P�8������U�;�V ���&E
r�rm-Rr{ۚ��J�Yr�[�(��c!�)7�n�^ײ��]"�{'�J+DܔO���
jh�Ie�kky��b�"��=̂B�G�B���%V�ъw�v�mڲ[-Z���N�OWuek��y(���Wt��V���[:ڗq#�\�'��$R�cC3\C+�����`Qm��s-՟-��^ӵ��[��fM�JOD�{4ҕ�䷍�$��Ed.M�i�~��	!�t�S�4�&8���_��7���������I��J�+�5v�U{z4��i-t�M���m&��3t����hH���k���|�uwP��aY'fT,Vr�:���P}g��V���c��2K�;���ܒ�m謦�z&�^��5����[�.C���ʉ�9d8�~�Mp3ġ�3ěil�{�egu˧�u�Wi]�]�}
���vw�ݫ�ggv�2V�����<9��n��ݢ��$(8n$�	I�Qn�6p��SV��B2}��n���niF;._'wN�k�R�V�j�z�oT�P@P@�g�KvM�{'�!���5k�Z3z��,;}��'�-%&)�3��"D� l�˝��ʹ�+�f���wy%��%+�8�ډk���n./�j�&���ѫ���mY��Ŷ6�@�
;��8Yf����}�<:C*FdfcyK��V�����I+II�ֶͭ��.�y/wG���R�K�r�]'�~]Z�z����61�}���]�2|�LBF�Mp�YX�&�Hw.���o���/�~n[�\�|ܷ�,�nWk�Q�M�\�����unk^�ۣj�€
(��
(�_��&�p�����pap�<�rJ�A�sH���~t�f�{J1�Jr_�^Ӛ�x)=9d��m�.�ΥHA������J�o�{/�����0�yul�o�;.%�1+4��#��Wh98Q��d���
O���Z��R��e(��ɿ���7y;%���d�x�L�"���."i�C<��#"��7q���ANK�[]i�Tf����V��5�v���xN��W(�f�4l�ơ�mͣ��v��Ě~�0����vC".E�TR��YS,���}���<UY���-�}N�vz�i/��z�]h��٭��������zh�Xx��R���H�K)h�D�T����褀�ȣp�I]s/'m��ϕ�g��ϣԧ�Wݯ+��u�2��oug���T�(��
(��
(��
(��
(��
(��
(��
(��
(��
(�֯o����O{xM����$�Dx
��[`�0�61�jS��z*nt�_�����7��>�q���RW�_�-��;O�Gh��11i��g���$&v�8�a�Cty�T)��)j�ɸ�;�4�{:�8ǛD�ݖ�[�^�iǙ=y\��w~T��U��{Mk�$�wk���~��e����Nء�m��<�n�#B����S��3�[�ݗ3��w�6�ݽ�Zj��K�����˪KV�ұGI�
]�+��;�^�"��v�����*���~c.�M9c/�w���������r\�q�x%ݹS�߭���Ek�v�<Iaxe	#Fm��:)��u��T�bH�S��G��JOD��J�M���u{;]+٥{2V�T֭���;4���ٵ{7k�<U��K�$���}�C<���y��`ŗ\H��`�����oEs_Gnks-�|�Ѥ����י��ک;_�kIi�]j����u�MY�-��F��b��� �8̑�,�����,ֽ�k�oe(����^��2n�]uMlҵ�^ҵ��ݮ��5�P@P@e�����A�([o����ր4h�
Z�o$8�K�x�h Tc����S>�/���}A�Ǩ�n&��2F��33���8I�,;Q���P@`j�u��C���?�ۤ��,�����+�L4e�G&0�c;��n-�U$�[k�d����5m��٤�ҒI���k��ҍ����{��Uӭ5������ko�^y�RI*���< ,�Eܼ���5��G�q�eͯ�(�mdպ�4�w�8Z�䶷�jBm���d�׭��g���$��h���]u-BnW�أi6�r�h�
��J�h�����˛OI]�r���F�Vvn������J1k��B4ޫWx��o�{Xt^������G[K������"���QfcKX?65ʙ�Y��IW�o�>o���}o.jm��T��&�Q�J�\r�J+g(���J��-�Rm�5v�wP��;�m"������<>]�շ��vD�[�Km"������Ȑ���#{Ɣh�v��II>��I��Y_Gt��������e~iJ��Z�F��$۳i+�V�|=y���1B'E�I��uo�<,d[ɠ�r�`O������1�>[�|
El����+�����7+�۳�����IK�vԽ�;�ҌyZO�)+{ͭ�i�U��tѼ�\�NL{��{�&PA
��@f��,"��#���ж�)Ok��v�8F�v��K�l�e�R@P@㎴��/����#�/��V��;KY#�X��K$�r��U�}�;#��x��r��q�*F::��9~ʓi���I'�_�rסI�P}!5+����R�ɶ���7��P��5�&��Eeso�����.1�3ڹH>d*Fn\��%:�*��)>W����E�-���Ҕ���
P������R_
���|Z���ׄX�$w��'�-d�7a���Dcs ���{I|�F�%�ܛ��eM�4��*i?���]ä�d�w�J���mɹ/����d�KU����K~[�\�Z�
(��
(�f_��o��G�}�l�H�6�0��x�I�(n�BN1������-ywFG�֜�x��;�������9-U�=W%��8�J�{��L����kc�K�}��k���{1(�g�f�'�6M�hTb�L�(-���:ES�i7���wZ�t�4Rn7�ݚVZ��=y��ݮ�
j����)59E=SI$�w������񸶶����1-qu�A�`vw/��|��Z�p�*Xhl��u!-�7%�e��Z#%�ڦ"{��V��uz�����f�%�75�Zl22ae%��r�)�<���lr�O �9¬�YՖѝ9�]�4�ו��뽺m��isEm�uR}�[O[ԍ�o�ץ�
M�K�@��/.���	�|�	��6���r#�@�u>\cW>g)�iIY��FԚ�~�����]��?"�,V�����֒��c&��jڌtK�+#@��
(��
(��
(��
(��
(��
(��
(��
(��
(�kY���嬷�Asml��tY�AQї+��Ig���b�f���I����j��ٱ�b���2}�T*F�~�����<U�CXYm-5����}���A.�F��d\��S�*F�q���[�K~x�=�N-���{�>}_�������m"��h����OE����_�7��Ŧ�:mܒًya�0��t�F�q�,c�22"�4_q��uv���)����o������\�E_�c[�4�N�=�))_}��Z��Zo���y�.m%�=��m.���&�[i!%	�����uup�l��������%k�ūo�-�i��jUV���ke((B2_ݕ��k�VR�E�4�N�E��Q�;q.�5��5��ҫ�I<��8�!I�(�5��0SNeMJP���
�Od�Τ�e6��nPI���OYs�9�1���NN:JJ���)r�^춾������g���?6Ѣ�̼�y�&k���d��|����"v0.Z5\���RZ3�n��	G��^���ɦ��|��\��IY�)r�A�iI˖׷'%�ב�oq{׳w�u�7�K���q�G�$��W�ې����YU��!�\�%�h�ә�Փ�y�}��4�%�v2Q����M'�ߖ��_�_Wk$v5��P@P@�/����Ph�	m���O�ZѠ�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(._������@_��[�"�9��0��,��G$|�����`�B�G��E����]�xy�z�j1�B\�u[�z8���Mn��h�V6����KN�s�F���2I8�WX�T�c�R�^���O'R�*�w���M�v�zi�cG���}��X�!�V��������}��@�=[���*�,z�����UX�o����<�����Tycտ���ǫ�o��P�V��������}��@�=[���*�,z�����UX�o����<�����Tycտ���ǫ�o��P�V��������}��@�=[���*�,z�����UX�o����<�����Tycտ���ǫ�o��P�V��������}��@�=[���*�,z�����UX�o����<�����Tycտ���ǫ�o��P�V��������}��@�=[���*�,z�����UX�o����<�����Tycտ���ǫ�o��P�V��������}��@�=[���*�,z�����UX�o����<�����Tycտ���ǫ�o��P�V��������}��@�=[���*�,z�����UX�o����<�����Tycտ���ǫ�o��P�V��������}��@�=[���*�,z�����UX�o����<�����Tycտ���ǫ�o��P�V��������}��@�=[���*�,z�����U#*�,��w�A��
�i<����x���
<��s����y��<����Ǩ��y���P�7��/���o��7��_�=@����o����z�1������c�9�����zH��t(2���'<1��'��y��b;�~�P0(��y���P�7��/���o��7��_�=@����o����z�1������c�9�����<��s����y��<����Ǩ� ,��[��<����q@�� ����󌳯8��|��s����y��<����Ǩ��y���P�p���3�GL��ø�9�P��9�:�OA����@u�'�<"�����rױ�_��TO�ο��_c��L�?� �O����E-y���S�r�ҙ��?��ת�B6+��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��+^�������hjǟ^����J�B/.�q�vʍ�bʥ|���t�>��W~I�KO5��R�ٻ/7�O��ٚ�*DU]�L�j@,�KmPz��́��'�4y/_��}���~�ߛKՒPrJ�c{*�`��X�Q����G�W{|�o�I���k��K�m/V�%gZj��̩�g���@�2�2��`���|��nXK�Q9A��[������f�M��}.h�����o�\�֠
�/�C�&D���m�y��
�eU��@P�Q�J/��t�'�匾�Mj��!�k.�<ފ�Z���M�k��Ő$���L3���7�V@U��*q��Z����攗4o�%�{;5~h�)�������5�=z��5上&H��RDj�9�
	���8���䷵��M�&ҿv��e~�K�^��5V��+V�%m�;�q���;�q��1���|�{7�[�a�o���mE~-"F�#*�|��bN��qб�I�^W�R��Zn�ݬ�F�}���7�[�yh�
�}����rPߗ���S�5�M��_���R�]�c��r}��.J-'��zٿ�1�����6�?������ߋ��5T#��5Kx�-[̆e܍�\���
��tzh�ɤ���MKUݯ�m?����\�Т�(k}����P@y�ğ���E�^�]�Y���Q>k:�w��}���3����-?������-O��Jg���w��^���خs��{#Co,�p��=pB�<u����g��0��Aq��d�݇��+yH�0zЊԤ0��
(57m@�4E�iVB�wtC�\�N�0nPGU'����S����w뤕���+��e-���;t�;]4��S{���Y"0�a��a&�*�s |�3��P��6ϙŮ�B����;it�ڳ�.O�_��8��W��T�f�k�T}�(�nwy�Q@�ib���f:�e�2�.�m�Ӳ��-7)+��o�?�z�`�M-�i%����d��d�DR97X�	ec��
	�R�9�/�6����o�G���I��i$�vj-�:s�N)}�������\�E�]�i~��t��'�������5S��q{Ŵ��hg)�Ml�kѫ�P��ywr\��}��J�Wv�r��~@��hv]�ǃQ�T��8%��2���v֮�w�����zr��_�9���PoMZ�}:&�ڴM7�1Um��\���$H�(�de��h���>��k�n��Eխ��I�i]/���T�ߛ	A䴩#8���&6�m�K�ŷps�Z���yt���-w���}/���8����^��׷/������Ot�3W\�����`��-��ia��-!w!����d+���m�p
+;�8�i�����������gx���7��%���Z�}m~V>I��k8f��Y̻\<�X��d<jҢ�Q�݄`����zs9F=u��l�^qq��۵�N��Y���9t�\T����Z+;&��
�޵�g�pw\�r|�U�mDlL[�P�*��J�,G�\�,���;8�t�4_2����6�r�Z^v�Eu{��qi�Z+5%��h��
�{%�H
�I4��l���Y�G+v�H�X-zm�m���V���oN�#�rY�x �o<Or��.�;Y���9��Nߘ�7ʔ��\a(��|�5U}uI$�۲��w���_m�}>wK�g�i-���L���x1s?��e�%7�`�b76��A˩�i*����[蹤�5�$��w��I�Oܕ[h�)%�є��+^1rw�R{�go_�F�M�s$�7}�%ܬ۞_.]�
@�I��۴�m[��֋�Ͷ�K�&h�����OE�Q��.k��
�Q�Kd��y�F�L]Q��92�^F��OW��+�_�*�O{k��{ig��};�(.{%k�e���6��M�����Ǹ"F�����yI^�Ͷ-�|�[�rJ��f¡'IE��
�Q������ܛ�ͮ��r�b�-8B��2M�jܖK][��]-/{]�_�V2ȿf�ⶊ	'"ᄙ��vC���ABt�$5*�u�Q}n�6�W�~�^��&��M�m�*~Ѯ�\�I��}�z�]"��
(9Y��w���
�'���O�'~��{��ɾɽ����$[����U���8�2G!�sC�h�*w����\8ߜS�.M[�����'}tPwz_F�v��_�������+iiJV�u�o}%i�֧�n<�p.���%
�E�et��eO?�X����`�-Ty��Y�<�u�Ӌ�_̯��r�cy*}Z�V�'+4Ԯ�E�wW�����Z�ND1�yʢ��`��2NQ��"����ن.�]�J����[Wz_V�K[�Vm-�6�W���j٫�쵵��E�}�V�o5yl�ٌ!�̐�X/��C˂r�������o��+6��Nv���,��rV���v�:��vzZS����uk�Ӷ��s����~Q�p\	K��m&�?w��6��\�֋��JT��_�ӭ��J͹>^W�J>����z{�[���s�v�*Cp�2,��,��fH��TFTb���A*T����(��vN1�ݭ+�tq����^���>��7��w���M���.��w�,�4ј�2���%Tb7̋��T?6$;yi]K�yom��kY�ý��k�a��[g̓����]��j��E4���0�I+�#���b<�a�ܣ�����˗��h9[m�ݽ�y$�ĥu�v�my(�䲕�ݨ��-f�3,<Ukyiot�4ov����G.�!�bR�<��&�!�El�ir/��K����f�odE�蜗��e���Q���Ԟo���)���S��o��H)m�g�<Vi�]u���Y8�Eo&�wI7ozܶe�m����I���-5�;F�W�iL5�3n.դh˘¬��b�r38e�K)�N4ޖ���Z�-��I=�z=t��}��k{n�jۦ�Ѝ�I`�XWyh���(g��<�vأv7
�
�H���T�����RQvi륷Wk����_Oz-)'{Y�%{�zFVf��;}j(�C�$��,rG*|��U���dNW �����KO�z�9�u�W٫KiF�k���qo�m+�U����E|]k<�E�#��[�p�
���<�c�H<�Fw#buqr^�Vi��mt��y[��K�vZ�Zӌ,�r�ZZkf����d�m"�'ӭd0M6׌���T�4gEt&�~b��ø��b�pEW[$��Kv�ox���w�Z�5�;k+�ۊ�_f7OW��_�x�;���V�e�Hq����L]�)T�`�� �I������׾�ۖ\�ʓn�1�[r���ޖwI=�vWz��a�"[��I�#+)�+#�te#����N��gu�kM�Mn�}�m��u�4�t�Z2�!�P@P@P@Pk��7��MM@?�
�\���rC%�-�Ȕ�Ek'8>�IU~i�TW$�z�^��+C�1�y�'�v�GQ�	�m�����ݏ;󵺞����p�n��˝�sɫ�����r�ҩ��Nk��r)c����ڦY.��R���Ī"���v���)X�"F`k�
+�hO��z�U�J�4���J�m���EEix�J���{���Y(�:�=�ݜ/4��Z��%��Q��݃��pe]���!`v*��m��)J+�ީ����Vo�NMAI�'���y��R�v���V)�+H�)J+D�g�.:�U�5�����<#]�ʹC.3c��L�9�,���ȩ���S�M���IY�+��v�쓶�Sk���k~ui�N[M�="�M����m�|�ӛg*����!$ �n`DnF2��p��]��K[.W
��k�V��W�uk��7ߟ˥��xr�u|ֲ�Rݴ��D��iom�e�f�uʿ��r��l!2J�J�����N�ʯ��T&�n��i�+�u��+g{)�[H��V���9Y�km��wi�|Q�Qc\��(��̀1�1,�՘�'�I���$��_!�m��e;��o�\�֤3B�<����\Z��*<�5�#$q��Fm�!T@QYAb2�@� �.W���%~�T)=;��d��Dik�J���Z+䜮�Y;��5ᳵ[��x�Mt&����b��'j�c�‚[9��}�I�OHӚ��j�J�]�����7�s���U��L�nk�۹��������X��"Ό�\���:��}��E9Z�2P^�Z.m���9�;%�3欭�Ɯ���\ߺ_��V�+J�{/rК�i�.ɴ��[�/o줙��8&����)��%HY��#��H]��E%'�/�%%�,9h98�R����F\ҊK�]F\�KϞ��'���Q�����V�t���X��r�|�G2J��d�ܡ�٠f}#1��X��^����k?(h�{�-wz�W��o�;�[�_CWZ/},��BH�w�4ո�'��B���d�#FL���D_�wb���X�)$չ��V�V槉� ���V���+�N����U�+vXiNJ�������+W��o�쥾B�������"q��<�I0��2����ya��n3ZB�����jj�i��'V�I?yr&��$�xo:qi�_�NIIٻI*IT���O�}/�d�Ki���)�L7oz6�Q�dDwa&���V��*ފ7��[Z��m����wd�ݶ����&��w�mY4�A7ߋ���%AAߗ���q���ۡ*�" ����#��#�Ʊ���_�7��i�$����>P}fSn�)�fV%���%��)B���=�l�[K-|�s��/#�	�5�<�i'�&%$�rNI�y��iRih��^Il���?9�L�?�����EX�o��Q���(�:������k�˿�/�?�*'�g_������&w^��e��z�������ũ�9�L�p�����?�!�v�/��I��hF�}��2������9)��Ha@PKX�Ԗ�+孳Ì�ۚDpq�mœ��8�ӟ����絽��b��m.����_i�������ȴ��	$q��7d"ȮJ�*���[#9�Ir�>�%?+8R���
��z���-dz��I_��y���41Ei�Aj�`����kE|�j�
����Tڞgʬ̅э[���VI�w��5��]ݫ�5h�ˤ�N뵝��J��kT�I�
���q��Cȷ�_)�����DHO#�V� 9�1G�6�I$���|�K��{�Gx�]�M�5w._�ȾT����*�-�f���\�V����n�h�V���k�cC0E]�|�o��1�b�rnS��m�[K��׾�~˱�b��u�o�ɭ;n��^{��#v@/��H�b�U��!���=A8�[�Oh�;MM+�ݝ�t��i��:N�����z)�y��wK����k۱RΑG�@��0�.��Y��#�X
����j��*�''�x�6�nޗ����z�m�Ǖ[����/�lܝ�5���s�-�W�[g�;�4���ۅ99�q�z����go�s���1[綗���_i�������W6�w4f#ws#�e˘�U۫�
U�
8f}��$ZF1�n^|ӻ��r�7�*�KB�s�w�R��%v��79/�|�l�-㼖�awܻ�q2�h��X�le��XeR��ylTE(�%)G͹ʤoۖr����VWmK�����.��T����D�i{�k�g�\[K8�m-nf��E-繗�>[&���1
(�̊�yi��!��xC٤�k�E7�E���ZwV��2_nJM���Siw�Y7nX>[=�ƀ
(�]nۈ�;��^i-�G��T�8�d%��fତ�&ګ���N�K][X�ں�I;ǚ-이zY�]m��O��Vi2�����Ak$p["M�(dg�Cި��w2�
"�.7��f�����m~̜f�G��Oٔv���ms�Q�]�t����b]T�5����2F�1nb��/m,���!_��6�ir�o��No��(�?“pN��n�JW��j��T���ZײwJN6|�[T�i��V�{���<�&h���<pȢS6ㄈFc�MSעW�W��ݵ���Ѧ�~�խ�މj�v���KK4��Z�:&�m6�%�͸3I</4��%�ʨ�-��o�Am6�
�l�UB1o�U��uW�.�Mw�������M�.��I���vNr��JQvnt�����;k���!h٤�N�F�H��y��0��w��6Ệ�ɷ}���-��7M]���[�Q�%�N{o�ye�I;��M�T�(j���n^���f��1;I!��E�w=�ۛ@�D��J���Dm�[_��R_�-5���b]\m-SWMuR�R�Rq
ԧ+��I_K�o�;�@�}}�z��	J�&��Z��H���*��o ��.67�d�@�;K`1ۜg
~����]ז���5{^�M^�V)Y=v���K��˦�{%�F�[�2K�H.e�3M�~���P�Bn]���j�gE[��G��BZ�&�ԛ��o[�k�}��.��JP��r�+����V�֕��rR�[�-n/6F��ƫ�������Zr����R7�*P�\��Tz^�F1][wz^�X>Z��֑�V]�)J�5nO�Y]�Q�Ź�S۬\YZ�VY]�
�Ź�E�F4C��0%N+z��VQ�jou�JRq�f�����W���8�ӧ	|T�km~^Yzl����j���
H�m,���I���T��{Q���I���NӃW�����t�}�rN_7�SM�k����}�z$�_-�h�ؽ�ݭ�	j�NHx�1���rG2x�$��Ӕ>nt��Z�m7����]&��P���_+��--u4�y�!��sH�7ڥ/$���@�����v��TP��l��ֽS��W��'�Ke��7'*v��j�k-���5w�W�uZ-8_ia�u8!,�<��幺��8UKu�VX�bU���1.殢�U��շ�M[[_[Yi���+6�]ݒZ�G�J׼�m�{'��V�D����'���ϙ س�`��גF*o��T�MwNS�+۵���d��_�Kx�3�H��%�m�_ h:�X�Z��͜~J]%��Ѫ�Uqہ0}�䶕�D��w�nnj���{9%�~��m�j�);8�6�j��NRq����%v�WM%vӲ�m
s���ԣ�������Á�z|öq�}��=���'�巧�����^mO�Ε����k�9Z��^����|߳����x��[��DQ��H���� Ì ���^�TN��δ�FI+sZqqm+���M�Y�n��hҌ]��yEII&�oy�}A�K�7���v��v%��.r�H�f,[�~�ѧ֝�e�(T��VV��-���lM�Mt�yo}*���ZQ|��m�[���t��%�H�[�nY���iJ�B�\o��d�1��RII���(U]���f�\�4�|�]M�y�-�GR���ʹ��e9)$߸�����v���D�����w3)��Y�xU��F�`�V@�+��r����U/��I��F�ݻY-GN��mN��5��k;+;ߠK��K�
n.��^[����|�1�`+��8����9�I^�=u��֑Q��/�z�5�מ�w�R��o<�˹�"��D�A�%��2<�,D��4{��r�,���T{�R����՚괺i�����ѻ�mxF;'�jJ�ݝҽ�N丹����g[�)�;�I ]e�|뀲�@\�@�����-4J�nOm��7w���Vm�mun�J+�D���F�IA@P@P@P@Z�D����@+�Ҁ#0!�L@�Y��b����R�m{u��W�����WݓP@P@gNA�F;@���Q@Ճ�A�@W:%�̭;y�#��ssm���XԐ8��x�彺��[%�)|��y+|�ݾ��ͅ��mk*ΞsȀ�2���p�ڳJ�	d��T����|�������~����_�m|�zC
(��
�1H�}�����BG�(�{yi������1��>7G"��`�2�8 ��J��4��O�;���h�����X?��b7!�-�b�V8�UUP0T`�:Sm�w�V�hG������x�F��o��Q���(�:������k�˿�/�?�*'�g_������&w~�2Ϗ�u��E%y���S�r�ҙ��?��ת�B66�J�;I�7WH�d�8秥V��A�o��?�� �Ϗ �5���4�0ʐA�9Ƞ�O�!���@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@Sp���g��y����Pc[�?�y���?����<��U������*��ko���?�@�5���ǟ�����y����P��m�<�����ƶ�����Tj8�Ԥi�n����rh����<��U'�5���ǟ�����y����P��m�<�����ƶ�����Tc[�?�y���?����<��U������*��ko���?�@A�ClۢM��,�8�}:��"d���"�!�ƶ�����Tc[�?�y���?����<��UY����>Rm�^���@7�Q���(�:������k�˿�/�?�*'�g_������&z��g�^�褯>��j�_�S=�'����O�HF�s��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@PWy1<���͏�&�)m����Ǐ�(O�M%���~Q�6K�=�����tl��{I�E����/�������_��'���d���O�/�7@�紟�_�n�
���i?(���p𬡎�*1 $NC�v�:�PZ6��W�c��'�&�
���i?(���%���~Q�6K�=�����tl��{I�E����/�������_��'���d���O�/�7@�紟�_�n�H�Eg.��0PA
͑�W�� ��I#���c!~P��UX��[���JM���i?(���%���~Q�6K�=�����t�$t�D�\2�B�
��B�ޙ�"��k�G��(�P�|I������\��e�ŗ���泯�x����=ÿ����X?�RW�_��?�/�)���ޏ�z���#b����B��I'�$��w4K�R�{����a]F��U�&f $BI<<��Qa�)P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@V��=��o���my����ѵ��l�2y$yw���#'��ylpI�Oߔ��Q�[�O��֗n���s\��]n�{(���[ů�}����Kh��\�,�n�C,۰FO���N�n�x���q���o��!/��t����+��R��.�t�c���h�Hȋ>f�]6h�K�b�,�&�y��ʧ��i5$��{�6������|�y�-��wM��m'�\��R���c�U��D�u��ݩ.���1�hĜ�'kb���
����ܱ��Oguf��M��b�2����t|�Q��՝�w�o���j.E�f1*��Q0]�b�� ,c\N�
[ۥ�����ѵt��>WWW�[�Z���tbi�${��w�E���nP�gx��?.���TBW�3��xyi�U�6�Z��R�Z�m[Cj��_ψ�ʔ���M���W4ω,/9��D�׆t��q�_%����0�m$�W��vҶ��.MYl�Svvv������M�Vr�N�N^m.������TW\��0���XS���j�ݻ4���$�/̭7K����Z�˴��oy$��
����‘�-��ȊIo6	���w�<.W9
[�����JZ|�-u�,Sѥ���7�U|���5a�j7��_���o5���%����wƉ�$;\ѷ�yw���������X�J�h�W�o�i��˕y^.I��E����il�Z���P[.���*�#��`�͙���nb~\z\�_�R�W�S����{�U/v<�{u8����~M���kV��5��Ɓ�$+f$�|�Ԅl3�����@*�җH���4���i&��[|2����Wk.���E�T���u|�����w�-ȆC$�Z	�S
�#H]�UCȯ���K[4֓���qQvq�h��W��
�M{�
;�[Jq���z7���;��?-.m��;0hf�1�(ۅx�22�� 
	�-ի8�-U���smd��֖n�	!$ދ~u[[��J6�ݥ̞�+$ܢ�����|��e8�+����w4��Ƌ�v����;��Vw���]_��J�Z�&�-R�٩4�V�M��RO[o��lo��c2ےB�V�����#`��PpA�A�kY�{u��۳M>�4��]�[�uܝ���]�����?��]����9�k:�-����BS&p�Y�I"2��c��Yɸ��g+?K=�i|�i�]uI����g�7�mu",,v���!a����O�s��6���N�~�7�=���jZu����6x�F����T1,R�w�'Ir����˛񽼌�ܕ�ym�I��o�j��|/�s��B��4#��k�G��(�P�|I������\��e�ŗ���泯�x����=ÿ����X?�RW�_��?�/�)���ޏ�z���#b��Ž��s��?���XXS�Ґ�Z�j��΃�GGLF�!�P@��k~Y�W�K9$�پE"h�mE
�~b��#ڢ}&�_{���1VV��n��̴�;iuV맻�m������B==淿����B8���rY�Ĭ`��B�UqNv�Z�t��Ue6�*V��R��I�ʒ�o�������+.�{$�����&�$w���yhŊ��sys�;@k9�w�<�-W/0URUI?����O7wM5w��Kwb��M]��V��/y�M7�5{ok�=�c�R�Y�q�����!��������v*K��N�N7V�J-���%�e��*��ÄS�O��JJ���q�j�޺��n/Yk&��u�n�qr�,��/�r<��D�цd�f�v���{�ޤTgR�FRQ�u{+o��[g�~zrn�r�n�Y�w}��[���=�Ι�RIn$�x#��+2�m�FT��F�hU�9�5�𦖜�y/}m*���پ[���t:���*.��^.�Z+;Z);;����LJ�����$��1�Z�{�t�z�+̨c;�p�$h�@+�F/��h��m��/F�)+I[��ӫ��=~Һ~���V�Z�o�Y��ݚNH��(�+�-����H�%UB�@'A���#DU�V/���g�}b�kmV��Sw��$�*muUt��]uݽo�4��3�4�����'&�#
-����=ӪəY��"S�ْA��qQ~�II%�ٌ�9'���[Y�{�e4��}=�Y�2�c���Ou*myֻ�c��^t�5��0G��/|�m
�-��c�wC"�M��E(;{6���(���jRMt�$b�uk����D��R.קO�r��*1����O��N[Y)^E��k� �K�9��Zi��\6�"�	eX<�W9d�,�T	I,�>��������ܩ�����e��I���$�ִջ>f�x��y%.ƀ
(��e`h?�d�(� �X�s�X�VbI ���1�A��v�I;]��l�n��W����Z'�Vվ���vJڶ�h��e���d�I"���]=��q���P���H�Q!�&In�ar��m��
|��9�II�+]��|���vj(ZEiu�9(�[Akg}U�z�%ˮ�Z����G�k�^���P�n�<�'�,�L����o0����Kߔu���׹x�)U[k$��/��|��������n/�{��Sv��i;�J�vJ\�n�[�E����i�{i�t�����w�^5��)t����G�Vʔ�2mIE��((����^�R��Q~��}�gӲMFw�r�㵽���v�w+<�u5�$�IK[Aw<�oϙ
�l�e�J�,���J��$�i7)�eQ��*RRR��e�%&�MIY^�����_qn�j����)CV�&�����5	�uQ42��H�a�Q�Id�Q�����"C�,���W4یj��5d�8�9ӊk��r��a��ݗI�KokN�~ҝI��EBK����%oM2��^B�K&۹��ϐye�����T?(Z&0(yy��U�VQ��ڊ�Ԯ���-%+8�Ne���)ͻ�6��I��Q���)��:;kk/E�
€
()�4n�`��*0r���GPO�K�^�Z�m��륗v�v٭�W�����{���	󭢓�ܭ��pB��,��2]��$��$r+*DK02��3h��)�4ܪ;m%�s�ek4��+���ͧ�so�Jp�ъ���Ed��#%-=�Yidܯ����c�v�^72�ʡ�����)��w�8
���RO��{8:�V��S��ݭ�\�uk�.k���A/kt�i��Ԝ]�Ѩ+��m[Kg�s{{�eyL�_h���KR�5�\5�K$�)c��C����uW�$��KD��)M+%k��d�P�m�sR��������M�s6���Ijڹstg�����k�X�FBIP�%rL��
��2�,C�;ԃZ�q���\�V�_.ɿu�^W�moR�[J�]��U��J�[|Imt���i�>dZ��Ye	+L��G��vUq�˖�n�s0����ԥ��JV�d��M��9�֟�K�:u��4���N׻p-�Q^�[�
�����do.���YU�7�P2"9�"�#������n|��7wd�ӷ��R�Z�K��I�E�Q���{�'�j�~]$�L���\Kf"e��IVK����(E	<��ʨF�~�>W�������+×����u�D�%mӗ5�KkF�];���X��u��"��DBI���%��be��� ��BW#9�d�S���9]h�E5~�J�RQ�����_�H��5�V��q_'%�;W�mt�:[�c�=�<׏o4ʙX�$�n#0gg���!��D�vI%U�mRIi�ܚj/U��������5JMn�?�u&���J��卓���s뺘�C��R�lUY%�|ŏl�ě~G�0��Qđ�k�7��z9�[w�J��}�ƓV�m'~k>T��y�����-/�Υ���Ӓ�S�v�-�d�{b���e�b�����S31V]�搘v,�K�FQ�Jn���%M�h��4��ٷq��ˊOH�(F�Z��)5e��oEt���5]���e��F������~l��-�!�Xx?���Fi]7��T������:��k�ӊM.T�۝h���)�7��NJOG{];����wccg>�,sC<33J���O5�P��',�.J�s��EY6��9����o��.xZ۸ԓ�%|��I���ms�O��RJ)t�ouyR}CT���h"Ң�6���]�����B���M�l���FV���]+'�+���֛�o��m�T=��p�c'&�IG�<�kNt��d��N�W�u�F��[_��Oin#e�;��;nC��F���ۄ#{U��M�:�!}��{I�6��ݾ��X��J֢����Ϛ+��u�g�kg�x��%��F�Q�%��
�đ�����,O,�U7)D��`�!%c�Q����^܍�-o��Z��v�+%-,��ީF3J�����۾�I����M��h:�ڍ���9GL�3[��l��J�����a��M5�^�N����q�wIIh�RW3OY.��;5{�/�f�[ٸ��mT�P@P@P@P@o���_���	���xf�R�mg0F<�M��yk��	M&7����\E�:QrNKE�.��^|�S�u'�?z��^�W����ʟt��o_�=�ֲ!P-�2�s���x��'t�y��	�p����ۋ��X���=�	�_�3h�m a�h�3��H�(>[*����%h����F�]J���o��ӱ�N��iTMn���{�K��שZ=�;u�+Cs�۵��ĉ�ы����YW�e�m����)6�e6�[N��ۯ3NN\ҳ��[�2m���MB�mxTS��QMEF�Ene�CΉ.���7-*��O�F9Qc�V�=�<���l�8�wW���[�^�_��˕�O^g-SKD�4��.KO��I��m.]�j�%p������ZA�Ź7
r�!�Y��A����\R]c*ݫ�
JZ�RnK�ٵ�ZY�~�}�7�;*�6���I�=/ev�՛oJ�$dXf[�%��۫���=�++#a��Kf����*�j�yѕ;߫�7�����ں���4��ѫ�[��־�[nvԊ)M���֠��,���^Y�p�h��@��rC�h�x-n�l�*�cbv��0�)�q�)��ti�?4���W�뮗I߽(���j9/+������K����]��ۣ��=��X��i��|��A-��gRs��\&���U�$���c�'BV��:���ݥ���%�'Ԥ��[�m��5H�(����@���>[�R�i��Yk��3��𩦹�vQ�;������{��^�//��^��uv�%��*7�ZK��suػx�K�X!f�,D�E��ʙBϕ� ���=-[��=��X��6��O}qVk��{5M��~�[�vmM5���$��e�_=��Ko����8dM �1�b�)	�A��
����5n�ܶ�K���hVє;�Y���2zkm#����Q��R���f!5Ԍ�9+<h�cn3�;����**ܲ��Ճ����U��M?�mu�;ߙh��9�%
���;�/=��[�d�I y��I,�� AK�cfP��JK#2�
�m�I�4�9��9�ӓV�r���mY�6^�V�iF	%��O�EY餟.�>E8�]t�t�|b)f}�b���q
��r�&v��ݠ3Tފ+e~�Y�w���5��ս��5oE���a����EIR0O���A����[�z]γ�\�Y'�<�=��W;e����T|�O$zu����I&�,�i��Y���K�g��ᗊJͫl!~�m�P<��Z�l}M��Il4�KY�d�[C�A���� �2	����Jr�vm�g��Ŷj��|/�s��B��4#��k�G��(�P�|I������\��e�ŗ���泯�x����=ÿ����X?�RW�_��?�/�)���ޏ�z���#b��ž���fU���I%Ԟš��Df���tXEk���TH�R�t'�fPʌI,�$�ؤ0��
(����.���c1�����;ye8��3B��\���y�~�yz�]������[������M�GiSIp��f�y��8���y�-*ۙ���b����wn�[����94��I��Щ���ڛ$��������`n�Z	c,��qޕ��W��;�����i?�M|ȥ�m'H�ϒ8A��9"ei�����LU^���m�.�-����s^ͻ�ɵ�/Mz�뺾��k�-��He�ڰ�4a�����Oݬ\�H�E\(��$�m9z&���n�Ot�i�V*�4����v��N��z	��v�Xan2Y�I�l(i&w��*�Œ�&��[���]��޶I^�d�]���evݖ�m�d��#8����'�3+����<c8�%��o�n�r���+7����[������M�iv���3
ɔʻ���2|۷
ێ6��`.�d��.���s�m��۽�RmK�o���Q_�*K�@�����AVǙ ��F�?�� ,��E
�0�1K�m��~�J�k�y�i��w��,���$��wI�Iꓽ�����--g7H�e��&�E����G������N)/uYv����������i��z���쯮�Z_W�����Z(��3�&�T.<�ܾ�h��V*�Hx$��V`F�O�g~�k~���ޓ���]?�o̭'���!9�%��\��w�h�8(d(@���}��Mݩ-��m%}�d%�����iY5��ͫ�n�������(�*���fh��#a���6�l�U�z�����$��Z�ZX��RZ�+�~kk{������c�2�rC���Ldd�˼�2�#�2�7���{Y8颴��Օ��������?�=uwI�f�VM���e�}&�أ(���4if�f�+#H��wfcLn'hW�G�qv�I5e�W���'�}Ai��e/F�I��7��[�%��giP��;dx�U,���:����A�4���ͭ���.��$u�M�cO�U��ο��ko�~Zm��+C��~�I`��&�O-L��9H��#3�'��j�Sh;W ��&�}ۻ}^�����m��VKD�]M�M/m��٩((��+^ZE��E2u�J������A�+m��V��4�ӳI�;m�c6?Y���>X�2�uu>6��O:ilx�� r�O4�Ml�Z���U٫t�Vi��֚����ݮ�me[ħd����I�
���3H���HP �S�$�5e���{[v�ov�{�>��[�;���]�7��Q@�ʶ�,F9e��B��%��M�@����T�<�嬝���ݦ�i�����И�H�GH�[��ɧ�i6���޺��i��(����[�m.UP�A�H�Hph�rS������Y5�}5H,�����Ji�{�$�~��%��)�w\�nX�rF��Q��$|���Ѷ�qq�75��/����z�>��z�(�m}�<9gk!�#p���O�]��HY��&s��0	��˗��/-���mw��D�[�q�^n���Mo~���hմ"���zZcL�XdT	�'�������S�]��{eM�޷�{����w�꺉%�_gml���;5n�O��%�^��fhZ��P:`Q�'�H$d�<.FiYk��./��q����i��k욒�{ߴ���]-_��%-���E�,_i��ʶ2���H�0�8h�r��I��O����gt��y&�'yh��Y��v۶���kY>���]��:E�?'ޝnO��n�ݶ/�>N9^M%�-��?/�??7�����Z���U�ܷ��99}-�������~�����V�tr������Dp���0F�4��k}�$�ZS��Mlӟ�gu{vV}��o�1PMvj*�Vv�wy��M=�����Fb\3#.dۂ�}�Nq���֛v�~T�P_%'�����s:�Jo�⟗K~GH�`E[/<\K�Y]ԣ��U�Fp$DD,��J��eҒ�:���1��r]4�3vP�Z�Z���/��ͧ'n�Z�k7�v�z�z-��,�ť���Ē x�vQ�U���3ɹ�2�i%k�پ�M4���Z�6��kB�iŭ�ۏ�v���hk�h�l$SI��?�$_��{��L|����]��U'%�)^��w�݉Z.U�'���=�?�ik��脟D�����D��^Do24TGGVV��Q@h�3Ԓf�$��m[K9_�]�M��i�����TuI�&䕶�M��N�l�v��,��d*���Y&~Ny�Wy�s
��
oțX�Ha@P@P@P@�fXdE��}H PH�a��|��y��/�����z>���������<.?��^�����q�~���}�������נ��x\߿��o?�������y�����@�d�I�cG�F#P�i$�;r�����#�h~���������<.?��^�����q�~���}�������נ��x\߿��o?�������y�����@�����z|2��Ɉ��c%�u��^Z�	�{Y��R:�
.��U ��+@�y�����@�����z>�������������5De���K<@�,��_�?�@
��<��O�xE�_���c.�,����5�����H��zLivc����J������3�����T��ly���v��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@���@G�k�4h��=#���h�у�zG�}�������_��F������@����?��ƀ�?�����0�H��?�`�����k�42\,�r��G�@�B8.����h�у�zG�}�������_��F������@����?��ƀ�?�����0�H��?�`�����k�4h��=#���hH��[+c���K��쩞���@�h��=#���h�у�zG�}�������_�	c�IFc*�u��TJC����PP@u�'�<"�����rױ�_��TO�ο��_c��L�?� �O����E-y���S�r�ҙ��?��ת�B6+��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��+^ ��G��MH�`pA@�8���
(��
ϟ���x���?^�@�B�(.�^Ӵ�7WV�H��K0�*��$֩t�;'o��������M��mI<�9c����uu:�*Hddu�UY�>�o?O�7[.��)(��
(��D{�#������D?y)���C�̓���q׊n���:� �.�|�����[���"�
(ξ$�DŽ_��.Z�2����J��Y�����ׇ��i�^�襯>��j�_�S=�'����O�HF�s��3}�'���f�q���g�gph��������b�70m2Ċ��	�#{�%���Ҥ0��
(�z���-e���(��r�ٸ\��� ��B�6�VO�̗����g��z5��Kӕ�M%�馴MN�I"�q#A�~�ݻlmnU��N ��B�s��k��/��Qi��M\6|�R�]��8�5�kP�ԡ�T4�a�H(e���vB�8Q݊�#"�����In��-wv*�W���]ߡN��V��.Rd�U�I%.?z�$..Fd�j�����j׾�^�]�gk�l�{	j��쭫kt��6����Iٴmd��=�I�������ֺ����$2�%�ď�E�L� )]���I\�?us���o�hU�7'��OV��tշMY�X�0�*^&�8̐�9��cM�GGM�}i٭^�OF��n�iu�ɺ�}�U�f�'ۺ����
f�xл*�8
@<��p,�L�.
OG%�m{y�%e��Z_X���٨����n[߶����4�*�x��qk�IYY�f���B��i��x,��Հ�T��n����}��}�����zٿ�K�Y�r,�Ȕ���cWq�G�!�$pADwWl��;�R��^~W���v�m�v�wٍ����&�S}�z&��t:Ŭ�&�Y��vE*+� ?�#��.�F�-�o|P�W]�;=/g�.����Uq��O��Wj���M�}�3R�
(�
w��i�$�~	�q�+�A8X�G���)��M//��}�ڽ.��;~"��in�[�G1�a#�I�r�
#LYv��	�6��6�7�K�����溺��{�j��	kw�����imm��M�z�(�T�ˈ&�dV�����\+��VP��Fx���>��[�쒵���Z�{�o=��v�k%�oKk�D���"�!}�M�Е��`0�̸�r�W��o5D�w�ï{n�����[���^�T�l]��YAk�!�o���3�
˞Uʶr�� ;j��EK˕��٧{�^�]�Nm�7/kK]�;ŭz�H�6�mop�r8�ʩ�'ˌ��H	d���̗3�H�K�7����*��_�.X��׷��+i��v�4��	��-��'�3"r2ɹFFH�Ύ-^�8�5�7{]n�gk�l�!5��j��kM��u�u�ة((��#�U�I�@Y��$��v����շ�-ƕݑ��e,RM��[|y�,SC"���4��<G�>c|���M��t��i��kͪ�׳N�bZ�^˛���޻����V}�G��<
u��6(��H�W���� ��Ss
�%I��'�M��_�o��7k;��i]�ռ�����I=�vZ�M�Z��3�
b	�I&��6E4�v��%T�qRNt����n��;+�v��DũEN?I������K�Z��\�\��#�%��
���!I�T+��������Z)K}����^Wk���z+��j;o�����ђ>�m�Y3�>L�@	<)��BeT��������tW'�k�7[�d�`��_K�/�O�m��h��1�V��}�YĹ`7E*#�}��VA��;�7fl���[9tK�]=�5��:�yi��T7��>�|ںWZ&�n�]YkV��������,[�8��J� o��r9��]����[5{���gk�{>���^��ik���u}t�4$��TmfRN�p�r�`�6���H��ڍ��$�-���;�O[�3�ot������{2��;�R��Ȯ��2�S���iŸ�ѵ�N��,T�PF�W����%���� ʶ���b���i5�$���A�k�n/�-��M4Fױ�$�3$�Ʋ�k�r�0X�e�n\FX� ������v��1�T�����i7�ޗ]=.[S�	dt8�8$q�H��zi�+U}��}�Ha@P@P@P@P@�?�I�\�A45x��#��Oo�[[G$`Ggh�0)�Ȭ�'��%!��N��<���s��S������J�w�շ��Z�{�myɸ�:����~��-RY"��U��*�IP��M�3��U`FT��ۙ��_�-�z�����C�NA;v�mz;vZ�"[�H�H��z$Q�GF��d��2��DU��_-����n�^N�j�h��;��n�Ӻ��Z�JM^�UeM��*�����I�ow->�Ƨ��Cnb��)��r���&�r���aԖ�I��L(�id�S��ukK�ҩ-��]��e�d�'�,��vwV��n��sU�]���n��F�㻼udצ�S��Z9`�S	T���l"w%��m��B�
���%H*��Ri�׶��ݫZZY���U��K���ʯ����W��mS�9};Q:Lkt��`B�r�|ȼ"����B+1*��X�v�K�,vn�Ш�e���m/k]^���<t�K�%k��k���x�Pd�)��`�f����6Y���3���E2q!WFP��m���H��Х*�I+Z�r�,��57��m6�`մ�UU7��N�u^뵟uuE��UJ�lrB�b����8�z�v��.���+���2������kR�@w�
N
"-J���h��zF�c���K/!�A��
E�ݯ��2�?]�i�]t���T����I�n�-<麌A0x/~�J�
Y\���`ؓc;yd�eV Ω8�Te�i�Μ�SN�ei5�Y]>X��ڒ�H����T�I�K�4�t�ޟ�<G
���;��Y i�
ǜ�t�X4�(:(2I`10i��eNݹ��&�(�T�6��X�w�I�����+�b��ߵH�t|��zך�ͼ�n�I����lmc$�D���$cr)�Q�RFތOT׽�}�V��Tl徉�i�j�r��x�Y���Tov�/eո�MU��s{�5eԕ�D�l�5���G"�f��pu2�K��*�y�����~J��KZ6|���\��;��OܛkKS���a��f�וu�S�����c�{�{���m�̆0cdB��"�c�T>9����S�I5}_��N���������ߗR�>Y=Zq��S�:������ۛG\����ql���j�|�da=�A� dqL�Ѣ�r�C'$hեʞ�n1i7uJ���񒲋M$Թ���t����o8�+75N1Od��Էv��M�=�Q�P�Cr����y�D��X:�q���B0,�� �Jɭ��ӵ�];�=����ٳk�;٭離�M,���-i��_���*F����q��=�=r��%�'�E�iS�G��3���8�~Lښ�4z8�%\��*<�kn�*Fg,CE�py�	>ц'��h�z�[=-n�>�~�+����G���b�,Dcj�X[$���N2�$㹭�+NQ�_uzEr��S���~2l�?�����EX�o��Q���(�:������k�˿�/�?�*'�g_������&w^��e��z�������ũ�9�L�p�����?�!�v�/��I��hF�tJC(j���A������P@`�/���mo,YȻ�v�3DB�鸀H�=�����������k��oO�U������;w��Gmm)�/��e��RP��Y�(]Y��pU�8ܤ�Kg�d���+�Ѵ��T=�'k�g��U+6��F����tA��ϤE������믲��F����o;�ź5A�w/�c�i{��r��{�vOT��ע[]ܤ�S������=l��t�'{�j�ؗv��(Βn�h-DOcq!t�����%��t����6�2N.|���h���V���F�QJRJ)E);J�.^Z����+�V�(��gw(�-r����?L��B�VXa�#�LȁK���䑻�v3�V��5��ڿٻ����}ߕ��B8�'n�V��-��;}���G�$K"�����dD���#/�1m��W~U��H�n��nf��ʪ�M�k�����[�WemhJ
�sK�$�o�_�w4�<K9��_b"/(^y�o���E���x�	���֛G[_�ۿ%�k������wӔϪ����^���{|\���my�m�l��[�r.������n s�Oj���<������oK����-�*�򿱷�gn�}�M�MB�e���XUXH��)��U�M!���]�b�`)����SR~V�-;�v)*�{9�MZ5W�I4�RI����=����s�/����[��g�O)�^Px�L�����w��YXq��i�i�r��Ok:�/�S��4����I�"�Ҳ�5���1�iv�i��N]���^��ՒH��"FeY���
���ky|���~��f*ь�!�O���Ws�䶚Y6�.�����]����H�s_��+���:ñ��
([Ԥ�bCH�+�ސMp"Y��
�0�v�0���2D��vVm�tV�h�3���+�����7��e{o߭��v�E����Sk:�@�$wH�(��3�,r��$Q�r�#,��"Ǹ�oݑU�k_�
�OE��;�]�s����Z�1n��nS���ѯ(�+��J\�E"����i�[\%ϟ�'��F�A>]����{�X�m�|�Y���BR�.�役�EŸ��'���T���I(u��HƤ\T��ԩ蔮�0��7l/��[�q�����Xc��=�vP�bY���䈶��H�G�;��ȜyU�q���f�PI�Jqp��nQ�Z*��s�k�l�To˼�VRsQK�ϲ��̢k��Y��&"��TiVH�e2Ȯ�6(��Fʭ`�����rE=�8�]�׃�mݥ+�u)Y��O�y;j��Q����IJ6�IEt%������S��H����1�I�0��D�d?<�~G8�*Fќc��Uw��s��n�P�����Z���+.Z�ע�+s�4�'iix:i�C�8�Y`$��#�J�v���a�m��m�X��vLO�i�7l�r�$�$ԾԬ�kǢJM�1��Z����4եn_�⹵����KK�5o�+`��
�}rl�����G�w TK�N{T�e�t��Wk�&�W�i;+�2����^��W��p���*\Kt�ZK2���ɷ�x��2��w–�G$���5�Z-_�JnO�u)J�7*��O��_�-�'yf�4��q\��%�n<�+�'ݔ���S�Ţ=п�H�H�T,K$o�����Ȼ��PȬB�I��Ԋ�R��Ik�� ��[���I+��Kh5�a.�P�oEuRr{�Ji_�v��Şţ�N��o��2-������w�l\*��ն�C|����5w�ƶ�S��j����fު'5$�Qە.d��,���wO���ӘӖ�4�p��	sh��Y-&̮Uq�0�wd�T�ݴS�k��xz�V�7h��ԧ�M+ۚ<��ʫ����
����jjP���:+�I˰���#�� �$�sS''��I|�Z޶M۲o������_���W�Kծ�\Z�j��1�Fmd�[�;���x��9��;�p�,��X����]��kw�֎��Iٹ�U?r)�)ܖ������v�E7�)��Q~�z��л�.c��#�KK�Rٕ�L�‘��U7��~@��;�\���o�����E;;.g����5h�[�Kd��^�j]�Ӥn�v�ݝr��Vh����H
nM�o"�&A]�H_��N+��o��4���h8���muѾ�^ܞUb�}�d�Z��j�S��N��M�����kY˧���8���"�1u�w���,:�������.�zŻr5yJP��h��-$���?5.�I|q��QkH�8��"ye�{v36��>��fXRPs�w]�@?t���+$��^�����D�������)�v�^��M���ym�J
n-}��Ӓ�$���3ko%��Z}�_)^�[�"��VR-a�IH��Eč�)+�SR��j�wU����[�g���;I�mx+-4t��-�դ����{Hv����Kq�����l�qp�Wd�E#�Y�P��Kߞ_i��j�n^ί����d�-R��wT�J�!謒���;.����&��[+o�-:����ȹ��i,~KC�K���ʨ�}�mϜ��Ǽ�B�� �^Ҕ!�c��%��k�sr�ܷʝI5�*�v[�R\�z/z�Z����^xv5���ؼ��(fH���\��ʨq,�Ð�_�.�uiF�{H��T�N�]���*�|M[R��:3��|�r���M�*i��D�⭰���n�3���ʐ+�^]�s��a�Jy�3!��s��չ���Z�ݜ_6�������+�I����R.��n�R�k��[�*{h�m��Y%�Na�4-nm#�6[D�4����8��ʾ.���'QY��p��[ME��%(��\ܻʜ���U���4������^�����n���;"�il�5'�Z[��$h���0~P��)��շv�&�QI�U�V�Od��+%��;w�NM�.��TP@P@P@P@�?�I�\�A45P��'����M��b��R����څ���+�I|�a����zs)|�i�O�gОkX�7�e�s$g$mr�x �G9��i���ɴ��tk���MI~)2���p�Kr�=� (]]�%dpr��p@!%eʴJ
��
岾�b:��������nM�m�vۥ�W��v��6�d`βi�i��60�iL�0��`d	�i�9[j�j�+o�����^�!w�I;�|�+�i{�ִ�Z�94(�R�y�C0l�F��s3�m�P,Kd�I{�.�K�;�.�]��i������//+}��J�[+^͊�
�!�D
�K31r�,����;R�J�Ejij�J�j������k}[�Lwכ��us�٩4����+6�C��@��dʳ/�qq1WQ�!���	�3����uO�og�(��_vMk{^�]I��tv����IzZI=7����3��p�Z�4(��<;5���sD��ѹW�r��%�������%N*mt�NN_�!��i��յ�=
�U�����4��r�E�="�`i偢�VX����)�Y�f�Uz����{�U�qq���	7����2��1Z(�K�����cb+`^.�L��ـRN�x��>P���N>�6�������&�}�h��δzk����_����ij�q��D���g
jQ��dby`~bj��]K^i9?95߭����W�ԣ�I%m,���Kd���k�d���A��ٱdo&A,~d��Q�<ci�G!B;����HPph�Z��^��׻ݷe���}Z'ee��Z��Z+4���at�d�\*bEy6��P�q�|�@�01�5)r��J?)�T���_��i�=w��=�(;v�ԄhvK�� !�F��3�3ޭ�r0`
e1�]�v�YF+E�m�*Wz5�W�v�{9K��/;�;��K^�W��n��,c�22��,�7?���>=�ª�yy[�Փk|����|�~/���\������q�~����)t�t�}��eC���0YXuQ���?Z�+y;�_yq�����ޚ���_��{� ��z�UӬSL����;x�%,Ab��Ab�s�zW)9������&+�Yy�.�z�9?�(�
�}���AP@u�'�<"�����rױ�_��TO�ο��_c��L�?� �O����E-y���S�r�ҙ��?��ת�B6+�� ���<9��#.q�ngg�@�y��L_�����Nd�=���,L	���	���\t4l�C
(��
(��
(��
(��
(��
(��
(��
(��
(��
�ui
�M�i4O��Ȫ�� ���28 V]F�[i�G���閚Z�젆��e�4��d�
	�<�:��2&��_���/RP@S���c�PY�$�����0�6p>벖L��d�^��[�ޛ�ٴ�mY���Z�Y�{�M_�M&��M]k�r�
(��
(��
(��
(��
(�H�U(z0 ��g;��\p:f5?�4�d��������@�.���!'���K�����I�4}��~?��d��������@�.���!'���K�����I�4}��~?��K�Uq+�Q����MB,�W�q��������~?��d��������@�.���!'���K�����I�4}��~?��d��������@�.���!'���K�����I�4�m$WM)�fv��@$c'�	�[I��S�dm222x�
g�.���!'���K�����I�4}��~?��Moj�9�Y����
$��p9���}G��(��<��O�xE�_���c.�,����5�����H��^�.Ϗ�u��E%y���S�r�ҙ��?��ת�B66�J�;h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�h�H��n�;�@���"$Y?�##�4y��8����<�����t���?���j�:o����o�5@�7��7��Λ�y���P�M�<����ƨ��q����T�s"�1.��y��0:P<��"$Y?�##�4y��8����<�����t���?���j�:o����o�5@�7��7��Λ�y���P�M�<����ƨ��q����T��xIW~B�m� ��\p	�Ҁ	.9H�[fm�$��l�A=:�|�����t���?���j�:o����o�5@C9w��@���p %T�2;w�@��V���Ph�:������k�˿�/�?�*'�g_������&z��g�^�褯>��j�_�S=�'����O�HF�s��@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P[�������h��\x���V�C�+���r��A��	p�;V�=h����I��m����B^�i��]:�o���nk���4��i���;�#Ɏ�G98c9 k����4���to���m%���^��+]�km�]cN	˶p8���z�:��w��.O�%�.�o���rQ_|��̱@�~���J�^#0�
�C�۔�t�|�J/�]-)���R��(�o;Y�~��H��J1�ɹ+y^�6i�P)�\�׸���v�9]G[����[[�,v�7.6fu��J�|�ngr[j�jb�����ז�������Vis��sN6���~��#�����m��(EI<�q��F���%(��Xo	i&�[��MvRI���R�X�F���/�v{^���v�[���F��ƣoi46�8InK,K��]��v B���)j�V�o�^�ݥ&��&��s=�����^�
7w��<1�bn��Sh
��&[$av��#'$q��-_*���k�c���[�&���d�E�r���6r�n �X7'��X��ɣ���V�վ�O[�5��=}4�{���ԴP/�����T�'�ٿ��Q�^�����F��9fDe]��g;����Թr�����F���޶)+�W�R��8/�[v?��߈���Q'��Z�j֑^ƏΡ�H��ـ$���.Wo$��I����̯��k��m��q?��뜟�U%�����A�(ξ$�DŽ_��.Z�2����J��Y����􉞇���׬�)+ϯ�Z����g	��G��S���\�aOQb��2���HA���GcM]t� 2o��7��D6e	"I6|�F��CJ�A� �APt�P@a����>�"�!kw�
�/��4��ڣ;����9�#������i�_�Ji�mkdڗ���S��}��6����#��f�M�7�L1Z$RV8Tq)c$��`N��@�Rk��Z57�HR��:�_�I�7a���{�2]��R;y�'ml�Wd��{l.���?%w����	�*h��w1����l��3�l�k�V}�z�a��|�Wt��.��-7���7�o�#F�m�],R�U�C�<�!�1���y\>���"I���|�kݧk�N}S�M�VqZ59)$ҍۊ��j�⤵��┒ݩs)/yZ=]���+�I4B�x�e�2'���8>^w�i�;q�zU�.2�#���v��K]�{�����2�&��I���_N��۳�dMg
����	cf
L��"�H�y.�m�`�Vf-|R�"�K��'ewmn�wd��i[�7S��Կev�t��ݜ��{@Ԥ�O:X�6E���h���r�#��d�#G�^.�I��_m����-^�6ݚ�y_[m�v�v�ԴRZY4���'�����q���2��+$h�@;�P)��p!k�y-�������nֶRm�YA}�)ߣ�=����]��TgE�jv�R���y
���U���9�����5�����p�~��)Y���'��g+�F2��M7��Vw�SJ�n�#�N�/+���e��n5��y.b����;i���y�^E�H<��3��޻�m��=')A[�S�8߿5H�KYI;��KzK�4�7~���]�՛����/y�m�����	"��J�h�,)ȑݥe�X�F�QmwP�o��5���F*6�t��/w~RZY���m��r�k4���̽�ۛ��a@J�]�f�D���F�UpI;H���@-���=5m$��ջ�]�mn��[������\�f�dw7"f� ��C���>t�6��i(��hBrOW5u�I'̜ݬ�N7���;��F�^׻I��8����q\���j_�s(�cu���2��Pep����&Ѵn|d��%�m���Qr
��,[�V�vI��vr{-��^T��y�&�\�I�+��Bњ���̒�䳹�D�Cm{Yn`�!�<���)�KD����n�f�O���]���]�����Ud���_ed��t��)�C`�G��fk��T�"�/���y�C�16w
��J�M^4��H�(KE�{=�sq�j�􄦵������Z�9�wI�{�i��&��U	�+�ۼ�T�c\0��i2	>dx#��.Xԗ�Ӝ����_�x��ڌ�k�]9u��T��%S��mӕ�+i�"���E6��5�ڵ�L�h���G�%��s�X�e|��>e5�(������T�N�׷�ybޮ��kk�6�ڳ�[q�r���l���[vՑ�P@G.��m�0v��]��v9�z�t�������W��q�_]�@�wֆ{i~�<��mRƏ^e���$m4���W.]@Nj�����s�n�V�?i)%�E(�捹��)���l��e�NR�[�{�q���m���֣ԯ�+�d=ՑxY#��x��qi\0�����s�.�.S�-9U��9ԓ�X�M[m$�
��y|\����SiA��Jr�O}S��kuY]�N���Eof�w7��r|��B*�e��۟:O�UoP���P��D�RtӴ`��Wә��e�]��M%k�[o��*=敒v�Ǚ����V���6^���!��x	Ṗ�7���U-{��A,K!^�rԭ����=���iT�����v^�~���%�qN�^�!kou���ݥn���P����L�O�d�D�d}�@
��-7~�9����J�S�}}���d��ҩ{�-u���¤����m[D�{}m�Eo)�Hn�P�Ǝ�đ�a+�ҲȤ�F���?�ך?iC��$���^��;;��[�ߕ�D���Q���6��k���{&�W��~ln���͘���V9�'�����?��R�}��Rm[[8�礕�1-����m�����Z�}yl꺏�^Q+�'�R8�X����2���*U��3ݜ�.U+or��$�N7�[�u���h��;|)�y����r�k>W�~]R�fF��.�l�KY���"o*3n>@#�(2\��"�R�}��q�(�nhۙ��v���o�RK��'�n�jQ��.^��ih��Si��Ry�W�^E�,we2*FP�UY#�|�ʪ�<�c�5�}�_?*ۙ�SRK����y5U��J��{�����ME�wsK�'+��4ݸ��>��
�̒��ۨ�J��,����e�I`)�Z����n/{;�'$۳i5�-䞎6���Z��2O�of�W_�3G���ēA�E�J�s3M����w�Wp���U�W��H�Pk��Y5u{{�6��nS���NQ��k蜷WN�ڸ�G����8-�����)$R�_�DE7m),�d>T>�r@e�F<ͭ)£�i/y�$�}Ҝ���5�I?�J��t�d�ڌ�������y�������p-������3r�����P�f���)�[K��=׺�NWf�7-����������i$�i���_4ZV�/���-�hn�-���R2��m@�;2�~�6���
�Xծ��b��7�Uޛi)5�N��i���u䜝���nJ7v�&Y_DbvhgI�[�����VA*�핡!�a&�8"�b�[����smӕ�k��Zގ�F�QN���I'~�O�-Z�Y{�];��6jiڂj1^&Fh�9���ᕶ��=*̬*�i�M;�{=z7���M=7B��;5dתR[i�Z=uнHa@P@P@P@V��=��o���my?����[�&in�yɹDKin���
�ƿ3���¤�&��^���K�4���۸�V{��r���Jq���r��~�*Iy�w����yjJ�tKm�_�]('*�e\��H�����/���v�h�(�в���W�G!c��X,�K�nc��4<D�\0B�¸�¤��F2@8�Z���O
��4V�f���.h�tUۛ���D�o�+�S��$�}���������?6�9 �������I4eB�#Z<m9`v���B�
av�t�e�QY?u'N|�[�գ'7k3?�8E��7w�7��6���5'̾%7�t�e�Z��-�����G�	&UGk��&��@��6)����zj�MN�mnڽ�'�Ԗ�e+YI��itT�_���ʴ�r�[���umQM:�Z��9c��9G�?��.�gj	#c��\��Z)=�0*I��g����V�|��I�ݿ�f���({7w���2zi}��mΉT=�����O���0��c�gw%dD�1c
�͝��4�JU]ۺIМTm�cͲz9M�����M�G�Ih�mW�r�Yr��j�S����I,q(D@U@
�`��n�V�����DV���{���He��o=�G�
4;Oh	$�F�Ĥ)$�n��p���-�T�j�mw�
V^WvWm.�i}��R�ի�I�i��=��%
�х ��eip�3A�V`2H<�ȭ�Vp��U:���Z�����t�|\�
�}�2�k=SR������#���H]^�#Am tyv.L�b�B��8��-�?5���hr4쓒ul�ƪ��R|�9\n֊U|��~[SkOvp{��,e�d�����K8>�dR����6pr���
� U����^�޶�T�hs[T�$�k5y.�V��JQ��T���U�[���_+��㤵k�7��;+9!�^+\#�KlZ܂҇E�YRI䔰B�S_��yjYl��v����M-UҺ�-#=��N��X��|M+��zkq#�L�>K���P�(B"�$�^6�g��zb�JRJ�{�R������"�z��=�W�╕jR��k��Rӳ�j]9�OVW���ol���fCol��<���q
�O*L��Dpf�.�[FԜjY%RNr���\��!$��ܯk%+�ҳIrޜ[��\`�w�r���(�t��I��˥��-��.IK$kg5�D6����vgU,�aK;moh��O[��ɴ�k^�=ym�ĭ�Zl��Z����I�M5��tO�����T������p���[��E���j}��/ɛ���'��H��ۭ�ȀF-�F�S���}��Ҷz�V�������}����ם���J�Y���fT����o'�|/�s��B���H�Z�Q���m�_��/��_�-{w�e���D����?��?�D�C���������-O��Jg���w��^���خs���ǜ���O���!�u/�i�]�����Ha@Pq��~����
�zD}۳�f1��s����{?�'������o�j�/�y�|����ߥ�-���Oy�?iXWf1��3�';��c�x��s��N��w�����׽��zJr��Okyy�OY�.u���Kh灧�F�|�*��1�YC]�>�Ȍ��7�������_t��V��=��4��T���r���ϫ�)t��ц�'طH�j�\H-�70���5�^�j�o��2ז]�M+�W�������}���Z��M��]>�R�(�ԍB����*�ܛ��m��ȌTR��$���Û��8�W��$r����Ќ�CB$P9�A&6�R��OϝM]i�՞��F�Z{7M�麗ץ��]�"ƛ��k,�wr��3,q��#b8��UC$���;3I
��*�''��c�d�V�w���(�K���������ed���s�?7����l��Gݻ=�c{�<`���{��=���>V�}�������.O��[X"�$���C.ˋ�$�M��(H��b�E�pH�8]��1��ߝ��%�~g�Jڶ�әͫ�uZ�(�+'�6��d���	|=$����Y�4w��e̱��/���������dUl>�A�P]����~Y��6�i�ݴ��[=u�Tf��r�;/����V�%/x~��_��<�\[K��'�$�;),cC7��q!Ty;B��Ũ���t�򲼝﫶��h�$�rZk���o�U��_{��y97�P@����q$V��W�"�M����@J�*�o�
��H����^��Z[�mt�ڒ���G��˪�蟕�Ѳ��M�+�q^²Fd��Rb�I�.Ы��r�[m=�fҒJ[]���Ӷ�)Ij��3m=9WK;h����O�{�r�#����8�l��p�8V�thJ\C#Jgb6��P�
�X!R�ܮ\�PݥO�r=n��%�u-o{���_i���^R����ܳWKT�R�Vu�����X��f�a-Ǚj�o(H�q��-�0D¾i78�ep�^�\�')k��|����q�yb��4�[߲��{�ɸ�߽)7&���~��E����	#���ͼ�M:�4'!Zi�6�[O�ۋnq�=��Ӓ���f���w��T��T[�KM&����2�+]oͯ���Ce�ϲ$ �����H�7�%�]�6@
26�����=ҴS�:vKD�(NR�����W&寧>�V�R3�{B�bߔ%ͻ�Wm��h72C%���m-ʹ>U���>^L����~�q�ƣ�%I#n�4�6�黾۷��{��V��q�$cM|0���w���I+�>�=fXP@U��[�y!��ȕѕ%ۿ�b�r�i��}EKWV]���j��馯u�)>W{����[u���n����ku�r@��E���@�	.��C8�Q�/��ۅ����Q~�ꋌ��ʭ���U��[t�%d�Z�3wMK���R�;����д�(�
ī-���?-#��e�!UFp�9,X��3�T�ʔt���ޒQo��F)+i{��qn3U���%���n��)6��VI[B��k9�+�(>��I	�$��a��K�:�/�rpMm99�sZ*��]tmŧ�<�Z����oke�Bޮ	Y�y]�ih�M;��Z����imf�-&�]̠�1>��B�$�0��q�J��%e�}��E_}��[y�6�'��ߟ��W�f�K]/��޻��sms�o�Fی��#h񜍸ݞ�8�i/u�w���:s��S���},�WIv���	��=��n�e�i:��ē�igfbm$�%�q��l)� B���'hgf�WP佝���ڷ;N����R��TR�nnn�Z>�V�Vֺ���ܚm�çX�:L�<W��-���%A�����[�`�h
�B�U���h�I=#��w�w���NO���umot�v�}tvJ�tQ��i��ZX$���hf�6�'����D��4*��?1�#@��>k����۪�9sv�K���W_ʖ������5#n�n��kwl���X[�<;U��V��P���8����c���ә��������w������������M������V��v��m��]]�gw�~��^�Λ<���_�ퟸq�G���?k��_m�~^��n���{/���_7��7[kN���r	c+%�ܴs�f��Ʊ�!4{�mތ[hc�`RJܩꢪ/���̯t��&Դr�]/������4�;;onf��Q�Mnh�;�� u��ۅ�34��S�@ݷhP8��A�=o
0�
3����{�[w{�m���ZV[~�Q����[yߥ�K�X�-�w���ʖ8+Rs	e��	$E;�2;#$CcE+ӌ�P��K�ӄce=ԥ
|�NM|N�ж�y�%)�C�����.^iY����z�j>kǹ1J��{e�7Cb�D�7F |�܅[x
'$�_2����̹ow�5��=nօA�n���zw���M5��in�I��p�n>�qi>v}߲�a����{���6ߚ���/���_O�����i_�r�}�~��O������(�/=�h��s�,�,�+Gn��d��	��1�)`T�@�4����7���^Mh�Ot���w�T�#
��7Q=���V�_T��֏���n-�-�9,��m'��<�8]��x�-��kd������]�o3$�}�w�[�Z�zo�ˡ�RPP@P@P@P@V������	�
B�3� ϫ"h>�m�v����\����ǰ�o���z��;��H��>���_���H��>���_���H��>���_���H���ȳ-Ɍ�H\�Fq)�#�QҀ&��1}X�@�vE���QY�&�"B��n`Na�VJ�뿟O�Xw���H�6�+H$��HQ�z����3Uv�]I�ᱧ��?����!�� �����k�4}�������@� �����k�4}�������@� �����k�4�q�D����� �yn9�NH��Gҫ��ܤn d�q�ph�l��zG�}�����?����l��zG�}����5���6��$����;Yֿ��"�@y�ğ���E�^�]�Y���Q>k:�w��}���3�|:�iv����J������3�����T��lo�v
b�
�XA ���
��_����M;�Ö��e�%e �#PA�^�h��Ha�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�PSily1�|/�P�K_�����@�-����d���Q���}��yG�|/�P�K_�����@�-����d���Q���}��yG�|/�PѬp�����F�Bm-�&8��
>�k�<����(�%���_�얿��?��€�Z��(��
>�k�<����(�%���_�얿��?��€�Z��(��
�8���5T'���P$P�s"��ݔ�(?�Z��(��
>�k�<����(�%���_�	b�(8�U3�j���
�!̍�Q���m�_��/��_�-{w�e���D����?��?�D�������X?�Rן_��?�/�)���ޏ�z���#b����
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�1D�U���"�{������0�}�=d����t}�=d����t}�=d����t}�=d����t}�=d����t}�=d����t}�=d����t}�=d����t;[�B�Dq�]ı��'$��u>�(�^�!>�d���eOY?��]eOY?��]eOY?��]eOY?��]eOY?��]eOY?��]eOY?��]eOY?��]7g�鰶���������g�︰�@Ve�l��d���ʞ���?��>ʞ���?��>ʞ���?��#T�b��p�[Jy�r3������?�@�_��/��_�-{w�e���D����?��?�D�������X?�Rן_��?�/�)���ޏ�z���#b���H��H�
��=p�<s�Ҁ)�iC�/�����Ӱ�jP��n!Fb�FX�J2H�,�C
(��
(��
(��
(��
(��
(��
(��
(��
(��
('�8�Q�U�$"�bbX����y.�]+�]�~�w
���]=ts%��
(�I"¦ID@Y��@$��rI�
M���
&ݖ���`�2�Ar=�SV��Ji����0��
(��
(��
(��
(�
ן�$��o�����<�^;�G�,v%�6p¢H!�7y��>Ze�+�!�X��w�Gߔ�W�Bev�6���t���S܄�9�u6�mz��ׯm-�h.g1>�yx��mѨ$�'��J�q�=;�E}��|.[5˧������f]���
��0Ȳ�M"&�0�i����1�uS���Ys.Oh�^�U�^F�連s�4�z�^:���r-_;���I�[��5��;KB��C
��YNE��ֹh�wL]�����;�F��f�r��j_�q��m/��ݮ�T�|�)�ӄ�����Jq����O�Q���Z靖���H'E��������!�`ĆQ�a�! �rp
Z鳳i>�;;~vvmj�Cz+�V��y�k�դ�n�vv��ޗ�F�od-�iX\��ih�hE�
��8$�2sY��)�[��iw�hO�������|��-%e�S�_�4�y��r�}n�k?���{os�lQ}�����bl�����w��w���Ӳ��r��%:�;�|);��V��m{蒌��O�5m~+�nm4N�N]�Le�%n�$r�k2�t;Y�=	�j�������З��S�������jC4(��RW��i���kx�+uq
'��8X�D�Y�fV��$03OWn��~J�)Y}�zow�R��tT��|����+䉴a}��-��l��
pQ��Vg��gv�)��t~(d ��qw\�F��y�.�ۧ)�E�V�T⡜�������g	Iz5�Ӷ���k���rX]Ej�
lk�9�L�L%p@�s9`@�7�$����WQO��Rq_|TZ�i���Խ��o���!nv�җ4{��od�\k��\Kn�.�X�Y�<�ѕ�K�b|�6Ǝ�#���I�7����W+A��+��:��i���v�G�I�G)E�މ.V���U{J�w���f����-Ќ��	y���u	�G	�D'�h�1�͉�T��g���n��TZw�-�vjM=V��Vq���A�koz�b�oG��;x��.˔e�N�p���l����7th�Rms��S�s(�w�S��J5!	7�5�&�V��ݛQM�
�<a�yS�⺮W���*�s�5�k|�O��"�`�w)
.X|�08�TvU歧�gu.[i��r�Z�܊��j���������/u+���+F��I4��ޝ�����xd���"�f��j���!�:�(�0�9��kg��ֶ٧����l�պ���^[�T��2��~/���\������q�-��B�IѦ����I	��TI�"�$�Nww�Nk)�=9���,�[?��#�uו��oy�	�Vx���ۭٿ�B�QO٬I�3��}�py*�"�zY>���c5���G��C�7]�v�2y��r3�T-�CU~U8 8�kR<�pZZ���7vgڻ�/���|����^���O�
*��k}����P@y�ğ���E�^�]�Y���Q>k:�w��}���3����-?������-O��Jg���w��^���خs���Ǥ��O��B4�F�!�50K��-����LE�C
(��9e�Hu���,�f%����
��Q�W
2H��*�mz/��y$��$�_7�W�כ�z�G���MGP[e�]���g+9��"G�
�\��@Dn���U�^����ۻn�{E}/N
�έm���h�+"]E���- ��r�U�>,���(���b�y��uW���>.W�ӗT�u����]���e�k�i�����m���v�NsU���
�_�0�جK!�5�4鸼����x1��/2�<�%�*7�]Mےi��J�^iJҴSS��]�b8%/4ܡ�yd����ƜT�yZ�wKWn�N�P+�G�`��!���n��y>F�o�ϟ��{V�稖��'/U����}�}9�ߒ�{�k�ӷ���ﶼ�Ŵ�5��e
O��UkkQ$�),ળ;HIa�ܑX�
q�J�+�eV1kKn��i�{�/Is-�%������z�ekl�m
�B�|�x��bL���U�� U2J�U�i	uul.y��ۖr��WQ������I�[Yk��;4���{�ɴ�޲O^Yu|�iv�mZ�@9��R��l�����(aFN'1�Vo���Y���עKd�r�T�v��{[�˭��2�G�����;m0Z��\G(ʇ�vUe��@���8�G����x�|�y9�M=�T�ԫ.x���k�4���i���OX�R���_0S�C�[��K[��c�7ftS�����B�ٸ�9Nj^qU*FJ]�h�d�ܱ�Wԇ�����4�W�Q�e��v�u�?�ݥ�mZ����"��%�"i��
{�9C?zH�|�y�V,��=���.�{�Q��oD�[���)i�ܵi}�+��є\�k�/v<�?ju
(�mi-%�b��]�p#�*��ɵ�]�B63'ȁw�6���J�[_d���ו/��^X�RQ�Nɻ�u���wm�۫�Sk��ҮT��c��b����Ych�o��X#��0쪪�_,�P����O�ӧ����3����1��3�?+��a��U��KH�ʬ�c�ͫqVM�騮Wr�S�F��6�)�G�jE�,[�¬�8VX��܇
�FC�����Եi�N�a5���ʜ�ߺ�+܌���+i~Z��w�J-ϛ���O�ڐ�ĺv�`�[�-�6q�xdcn�e�Wl0��@�V=B�=wz���D���S�;+^O��R2��Lڒ�i�:r}�����ݽ�$�Vn�5�ߦ\�	���i�G��;�!is�ʞ��Q�U�Q�$��	J�3��-�D���.�5(�a��t�z{ʜ�u�\����jڔz�m��Ệ��cEC$��Ir��H���\U�j�h�B�~Q��(.ڧ*��]TI�(�-I�kh֧��J�W/�уOX�3]H�j,&�Sf�OVU�`�6�$��ʀ�~u	��
҃)%Ew�Iֆ֒|��N��_�v~�n�^ϗ�)�)9F2W^J{�Yt�ߥ�9�P@V�hR	
�F�	$�;�F�<��Nj]����Z��Emow�-�6�w�Q��.�?���>��PI$Qˋ(ͺy�e�DA�3pG"�|�_0�,��ZK;�n׺_�|��y�^㔹W5ۖm�*��A+�N~���Zr�������%vtMJ�	g	R�FJF�p�"��3��<,�99�߰���uT�U��5D��+������h�h�i�[������~���,��v�C�X]F���F��CB$�JU]�+>��M�Qq�[��۷��W��5&��ւs���巿s���i%{�6��t����˥�o},��b���o5����Q#'�E�T~�i�m�7�@EB�,%�����+�˕�i�Kk������'=��i�mb)���������V޶�n��XL��:�Y�[�©%W=N�7�D4���JM��\:��E�m�۽Oh>�"��w�=�[$C�oq���i
��}��ኲw}�#���g;Q�D�6�F-� ��[_X�h�Q|�~��ӝKV���Z�*Q~��wW[%�����t����D�֍	L�
n��X\8�P�G$��'��p�Y�^)��~[F��5��E˙^)&�R����Kޒ}S��ݻh�T�z������<�=��24+rn��m�ԯ��V����G��UEFr���W��)'���j��k�H�:u_���f��4�o4�O��q�4�I.%�mL����d�k[����+\�ӹ�c]��3�ۙ(������f��%����mO���~�&���m�^����=����,wEjIf��P�J�
�)�Ȍ��;�q�A\�W�i��mw�{9Wk���IE�5g{s&��;��V��EE;��㕕�{�ֲSi܈^ͧ�{��%��~�2G��2��Wܢ��P�~e-�I4�kB�����F�;�KKE4R�\��8F7��:q�e�oZ�Ykw�ZU����Fn^�Z���(�˴�v�6]'�eFX&�-����;��t$����
����Z�r����i5~^Uo�y];�jS�����f�kM]��q���͡�w3�$�����VM�dALq��b�0s3ʠ�v��b�3�O٫��占��Q��h�N�rn��M�d�T�n�P�\��K��Y{�vQK��~�6�w-Ԇ�&J����?(�wm�E,���b$.�UkHFJ.��(��թ{�Y'%ukY-��*�N�2���q윣�_wd�ލ�����]�Z�k��(��VP$F(�
ܥ���*$8i��k�a��
���F=%R�="�f�����]�o%��*��N�i�IA'k5�k���{���^[��+e�V�g�l�	<�_3q1!p�w/�#�^��m/����.կ�j�VO݌�J�����+��W���Of֚�K��v�m-z�
KǷ?�	$r,��e�<Ǐ�� �w�9��@$nڹ���z^��^��4���i6�z��K[]Z��\���K�-���sf����
(��
(��
(��
�y��O���	�	�Rҿ�.�]��-���(���C��ʔGݓ�h8��ms?�b���u�KX�w�[�n��+���.�X��[ywm�,�\c;��m�F�����q�r�[�q��]��_�w�\{���[�s2
�൅%��GVh��s D���\�7�]��Ҕik����ky�=��}5:ɽ�GSO9�V���kۥ�У����S}�;����[#����,<�X�Vu,� ��oh9={J���)6⵴�z�d���J+M5��Ԟ�m����Ih��_
����$�;G;L�m��0�"�M���)w��R4ڪo?5�>�.�澲��ֻYi��{�O���pp�WE.W}���5����x
���Sl`�V1�<ήU���l��"�Q�Ih�:WZ^���]T��WM-�����ګ����ڻ�i>�)Y;j��g-����@�����rm,Ų��0
��I��>��'z׬�뛵��ʞ���v����s;i%�A^ڮZ�����k�]���F}�����kP�yω�K�S�6�g�hnd�@�a1�.0�$F������!I,7)�G{�j��~N�!u��5-�^O�����N0~MU���Zkf�Lٳ��Y��K{���<���.LB0q
ĭ��'�s�t��RutW����R��l�_n�:�,!M}�E��4�G�������J��e��w{����q�H�qL�ɴn$���͐��yb�+�so���'�q��W~Dަ��։$����6�������X�<^;��2��x`��v6bGS �8˗�);�����~����eڝ����杺]����٪m>��F�����]Z�R
&�v��.#��g/��0��i>c��._���涶���%n��}��2�F����Ԯ�N���+o�:=˺[�&v�<�vu��nw��6q����l�z�J�����[���n��=[{{�Iҷ��鶻����ld�wYwʒ!�%tU�h�'��Y#D@�	R�v�W���um�����R���pi^�M'�w�O���ӕss�>ʣrI�Y����t�� 0�Z�Y�7�-��d�L~d�69�b���O?˷��	Y���m;>�߶�uw���C���(!���A����x�I�ӭ�Y�26ȎrUX��
y�ֳ�\�m�W���BJ
���_|Z_��𤵯��e�'��z��;B�}3O�������b�*YT�$�G��I)�S[6��D*���t��O��'��dX�����
�?���|/����������Ң|�u�����"gu��Z׬�)kϯ�Z����g	��G��S���\�aV�6��X�e�7P:d� x��L-��y�����P"����*ưȘ�&%�XdV'問@zF�hRP@���m_0)P���	]�v�#8��^�m;^��k��;y^�W���e~�]�a��UP�f`���;rq��8�F�-��I_��+�ItA���]�z]���r���e�m��\�y��D�m�3�z�3��c8�J��;��ӷ��;#&��V-m��s�b�s���|������<����7ڲW�d���%�]���/K�n�z�n���SR��E�J\�Pe9��9�/��v����t���^���]����w�>�g�͵���["���ӣ�m"��<��$X�'�ڀ��5W�v�Ȟ�ܛɏ�󶯘�|
�I��I��dږ׷[_�׵�.���o+����l��˰�i��i�I�zm]��_r�
��_ �$���;.ַ��V�g��w[�뢲�^��GN�i����Eڳ��U��|n��sB��i}��{�&�%�l�/N�X|?�[O��m-�����D�nl�;†�d��''=h^�tV���v�������^�����P@R��m54���)ܫ4i"�����	��~��w���;��W��Ӽ�g�[�+oX|���ܝ�=�Cd�@�&�g�;yzv�	it�����e�b��@��Gy�#|��э�F��nl)ʍ��&���ٻ�7������[n����{X~�Q��c�gp�\��s��%�+KUkY�mzy�]㣽��^���oeE5(�(�ʩ�ʧb�Fڹ
m�v����{VJ+D�]����mz1�i
*�*������05-'���n�{��-6�vE]���ok�z��Wݕ�4�+w�m�ߍ�LI�tݱW8��zU]��;e�SF�€
()��6�eY#pU��2��e �����z?�گ��;�m?����d��֖Ь˶A�u��p�/'����z�W��t�m<�g̴kg�_}K��V���kx���*���.NF9��V��ֳ�Nޞ@��c����^��we��Kmq2�6F�"�]����8�M�޲�����/ur��e��kv�,<�]�eA
�ʕpT�r;R�~���T��i�M�����4Ӧ�5�4���b�1�+��h�(�T���'��$c ��Fڮ�6��.��t�D?���_�ͯF�����2)�Ԗv�9b�h�!&����v[''999�I$�*ZZ��f�ջ[Kmm��������
xn��3i��h��t�FA ��
���0@!�ѵ��Wg�{?�i�I��F�W^z��օ�=8���M%�ŒI��<y]�!�@g'�$gSۦ�i��6���❻�{�Y[�ѥ�5uu�fצۻ�����-�3�|��Gb�>_���Y�	 r)/vܺYY[K-t]��M�}������W���얾H��89��|�%?"� �$<}���K[����~kv���;��{߭��kZ���v��Ȇ�J��R���_�*�#&1��A|7}�q��kN[�]�����m��}��W�d�עK�<V�@CE!�UR��A|��lt�'�m�+��W�Sj+�nۇ��NO��i7ݥs*�B�R��"��L.&�!��Y]�`��PϘ��!F��#�MA-[RO䔛�\���w�=S]e�>�h��w�[I'��>�kr�d��#�h�<j��� ��>���
^�m;;��=Wg�����{]vv��q��!��<;#�ؿ3&݌�rɱ6��\�a߯f��ow���E����}�M^�j��-���$r���U�XH@
��
���(����'t�������֫{[实��<�q���X� �� �s�#UD98U�I���Sm�M����C
(��
(��
(��
(���������(���p`�Ċ?J>�u�>��?€�]Ͽ�EO��_���S�(�E����T�
>�u�>��?€�]Ͽ�EO��_���S�(�E����T�
T�i�S*�̉�W9��$qը�c�H�$Q�P������ȩ�}��}��*�h�������@�.���"��P������ȩ�}��}��*�h�������@�.���"��P��D�!�1�K}�Ē�F1���I��$sbUr� �
s��{P~�u�>��?€�]Ͽ�EO��_���S�(Kq4�����*�pbK$�q����}���AP@u�'�<"�����rױ�_��TO�ο��_c��L�F�g�^�褯>��j�_�S=�'����O�HFǖ+��,P�<�@�(��X��yb�,P�<�@�(��X��yb�,P�<�@�(��X��yb�,P�<�@�(��X��yb�,P�<�@�(��X��yb�,P�<�@�(��X��yb�,P�<�@�(��X��yb�,P�<�@�(��X��yb�,P�<�@�(
�8�*}��ϸ�B?��P��O��/�@ڡ�����_�"��C�M?�Կ�Ej���ߩ��>��4��R��}��i�~���(�T?���K��P��������	�x��8^�H����P?j����#������(�T?���K��P���������P��O��/�@ڡ�����_�"��C�M?�Կ�Ej���ߩ��>��4��R��}��i�~���(H��S�K����nQ�€	&����
���S�ƀ#�T?���K��P���������P��O��/�@�$s���������
�
�0�����<��O�xE�_���c.�,����5�����H��~��]��z�������ũ�9�L�p�����?�!�vP@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@o���_���	�t�
r�6�N��M\J	�&u8�T's �҅�in��컃�]�d����U���P@���r)�]�+��۸`���W=21օ���_�I��I$�_T��m<�ť%��k�j�(������Z�.t�;�Y��$r��Hc����7<Q:��n�i'{��\�������(��ֲ.����,�ͮ��֎X��]]'R	^REGr��۴��*�U���=��Z4�4�i��������CR�€"�h�*�ʆFځ����z��f��'�4y-��-�y�_����K��d���ZL�R@,@�
:�I�p9<Q�_�t��v�����������ɿD��@����?�*J�f�|��+��}:#=ܱ���uE�Y�'��4�������lv�����D���������os�k=���8ʺ0ea�	}
6���U��&������\/�s��B����Z�Q���m�_��/��_�-{w�e���D����?��?�D�C���������-O��Jg���w��^���خs��y1��I����g�UI�8�EU����?��"9e����в�#Bl���#vzפ0��
(2=Z9/N�U�ci72mB�HRHf�q�(yÒ�{�M}�����v��-��i��V��I���%�����f�Z�w��l�*5���D�I�iPN�|���s�\���y���6Ꚍ'�m'7N��7iru�~Vr�t��F��w$��{%8&�f'��ԓ4���~�88��w�ͷ�ߋ�I��)/����̙<Sn#Im��^r�J.b���$x�IW8��J>#8�v�wiEZ�6��wZ���6��Zr��ě�K�nQQ�����KV�ޗ��r�ȲFC#��GB�#�9�$�ږ�]5�	�%(��k��d[��ĄI
Y$2�C�I0!9~Q��eW����U�T������l�{��I-ޛ�Z�����גn�d�%w����.X^Ix������y9py�R�T{I��u�e��{|����ޗ��ۣ�'f�io�h�գ����%Y6�s&�!YT�$�l0R��9 �K�Rk�߿�擷�9om,��L�j=Ԛ���__�~;_�vj�[
t^���Mmj��.gke����e�ȫ�X4���2H�z1���
'�SI�k��K��%}mV���R�]�Ÿ��N��kV�|�ֲni/\�a aKs��8ۑ�Y��CZ���~Jɻ?6�.Uז]�/H�N��V���n�����]ui6Y�
{p��m8�7�3pM��Z2C��
�䁞��ysm�����t���j��u�r�_.�^�9���{tii}_�kf�
(�
w�mgx���#���М�,�F��gQ�� ��~Z}����k&ӷ��`�2A�E4��dU�@�m�1I�o�"O)�Wf�&�Y��g�GT�u��M=m�׻�o�������i�6��_t�Okk{Xў�-m��p���2H���H]������G4=���V��{Yum�%w+$���mߢZ���tZ����G��yqmq���DE$�*���e�T�yy|�r33��w�M�t�m�e���]����r|��K��%e�ﶚ��l�_�C5�$RVh�j�TlHw|�������ۑ��\Z��u��\�K�є�����ԓ��m��:|���i}Z�v���-�WN!�f��ʁ�Q0đ��`�cFqrQS�HE���iwk�-�,��Q�����^N��Z?W{l����P�=�K��M�2"TS���r��)�8��E���f�����-��]��RME�����+~kI-��ɛ��Pr��>��Te�p�u'��'��z��/V�[�a�wm��$H������&���)�*Yco5�E��!�߰sO�qչ8�o̒�Z�YE�9_�+�����\���W��[�Z���Y{��ů��K3�q�ͲX
+J��:��y"����_,�u!��IB<��޽�r���f����<���&�ɳ�Z�RvMZ�W�}U��I��[�`�hb�w�A$PF#�J�W$�"@��s<����b̠�(�NT�qn��Y�v���pjpU�v���6���ɾ�=G]k)e�	��Z��M�T��F
��b�c�#yVP�7RJ�i���'h�z^�ᄺi�5��7�v��n��0[l�5��MͫG�V,��pWو�Ti.�d�S���6܊Q��K����'�|�G]�I�46�m~�%�����}��L�kJ�Ki,�%gHfq�+����YU�Q�L�"�RT���T��G��ySJ�_[�{��k����j�6�M�����^�e�-���d�{Y
4���c͍YU�|�$+��e%�7��Z7�6�깹���ٻ[]��;��]n��W���W���^g�(���,�2����X@����6�v�E�7���f�k�3�m�];l�Wn�i7�{E�vRwV3�<Q�]�C~.a��2K��b?9j�����RPZ���^mmx�W�N��ZO�[M�V�&�W��L��̈́R���C�0� ��m�b����98�՛����n�.d��ܫt�ݗ�I���;vi��mf�;az�0-�p'2�"'$q&퇐G�"��l���}/�O��^��u����ͅ���so��R�F���e,�88#�ڇ���u[�V�F_��kgS��uKO���d�TC��:�I5��'���B�)�*�`�e��s��vvN��2��N�wRO�ђ��t��g(��6���O�O�Px�N��k8'����LCM�AH.��S��h��ة^�\�f�e����wW�[�I����Ҍ�d��OUm=��ݞ�4N�e��K�t����ݝ��
Hc�`�t�6"��^�+���^����]HW�o��mS��Y�{���tz����. ke��T1�`����z�~휴Ok�{���մ�kt�Y]�寡j��+��kwIbq�t`���YI{�M���$�ؚ�€
(��
(��
(��
(���{�\�A4������S����R�ߏ2X�cI<�3�_3�X�@�<}��2zN�S�"��95i�J������4I��M�-�]��$z>�1q�s�����0?*��R��r�ҩ�����r?a}��v��Lצ�/)�bVT��pcA.A�,�vVJ�+(�8+k'��Dޞ�T�i��j�[Y���I�Hƴ���9ǯ�VVzh����\��o�Wp���l��D%v��6���'s|�J7�����(k*��{�$ԭ��ZO�ݴ�+�JQ�u	�Z���-�h���nd߽�^
��jZ��N58V&��[��`�l�ᣊBʇ"�ʲG�67
(k��3�o��Gtӕ�o�z�ܗ*}���o�W�Թ�%��i�L�-/�� 0
�&�v��
׬���E��w:.��a�;��*��<t��(TN������{/���x�k{^3��v�ͭm����7��h�Hn-ķV��b��?��m��|�T����n��ܪ&����9Ż�����KE]jӋ�JI](ӵ�R�h������n�v�%�]�HcEFb�@�hf r�*��;UW=Sz��o%���-4����s�^�kRv�<��:��jj,Op�5�$Q�gs�6m�rr���s�Z�Qw{{y6�%B�m�i�MM-yi҂��U��r�^��k-��-$��v.+0*e�A��s�k3z�[���T�٤��J1��T����뫿;�<a5��G�&�Q������vV����ni�n��E�[�J�+���O�ٶ�7���k85�%���m�;5RW٥)^�χ]�d�J�ݧ++_�����[;�*�wf�n�{����	�[��E<QB�"��H��?��x��ISVq�Rv~��]�j7��_��OWk^��\eIIǕ6�(Բ���U�c��EGg�-����mp�>�󼗪�B�f0֗Y1�F���L~j˃�+T��˪�j�������[�Eh�Z1�zs��꛲��
V��~r{o�%�ζp|�2�1�-�c�Zur�"�c���c��R�W�U%˭���!My�(��s;l���ʪӋ��:�%�IZ����ės�5ݨ`���TE�.&e3�fd�|j�	$�IN�&�%�*M�5k�8Ӕԕ��^㺺�Uݜ��ZV�Ͻ����](Y���Q�m�{˥�$�h�[�
I���y��9�Z�B9uv�B�����d�J�ݞ��k��e�6o{Y=m��Zn�M6����{�����T�#�[7�t�*:�'a|;t�RS�eܡ�>tc;Xx'�5�����I/�ښ�i��/�.K�I�)>���"s��&+o+o8ڢ�d�#���m������W[��<�g�P�-��6��e�Vl�2I8J޲�IEl����/�FT����o��|/�s��B��5#��k�G��(�P�|I������\��e�ŗ���泯�x����=ÿ����X?�RW�_��?�/�)���ޏ�z���#b��Ž��s��?���\O�>��QԿէ�w��GGLF�!�P@�i)Ւ�/�V�H�d}��6���T��c9���_�{+۾ۛ�班���e��_eU��������tG�!���P�
�V謮U�Ք>�F!]�
�NP�d$��E���]�t��;�8I[�]��jKeN+��T�&���Q�g{w)�P���Eia��\��p�\*�B	/�Q���7��F�BfWA�ϖK�Q�ev����׿W���E/u9E��[��Yݤ��M[i�|�CL�H�Ϸ�����U%�H�%$G�2L�Ws2��yB��i��
�4��^��i���������Ⓥ��Tegx�M+�ڵv�m{�)��Ij�{���h���Zb�B����"! &�I�n gw����Z�\Ӝ�ۓm=mv���n����G���	%m/emm��oӲ��qw�]�k�!���P[!-g��$���F3�х�*�J�����-.ҽ�cv�읯EӿiKګ�˞-���;�5�����m�� ������&+�Jd��f�p	�i�yoy��ظ�(�j��{�v�˪v����gv�]��v��f��ZJue�����"�}����;�U'8��qP��S��\�|������pk쪷��V��e�k�9�}1�Ynm�ĴCm2MlZ�V�g(������"�Ӫ�%�M��8���7����n�<��(��m~�����I�S[��[��ݤ�n[i~iX��5F���)��M�r�kw�)����]9R$-$�\}�H���6�:����	GmwMB=#��~�4?z
Er�ZiGt�:rv�����V�"j���Ϫ%�"��$�qr�H�諈]��s����CL.I4C�O�q�/�ܣ+�{�Z^���5�g+9�������]U����1�g@P.�5�1"��,��l��8��,��H�,X*��۸��ۃ=Rw�n�mkF�M'v�Z�4�\���M�_K_�~v['զ�O���V���l��s��S=��2<n��뇂RZ6,Zf�.$�"���{т��T��2Kou8���RQJҕ�۪��'��uy?7�g�+'�>�����i�i�E�}�Z��;G)i-��[�UVIYK�@sC��9{ܮ��{���ʥ���NN
�k7f	i(���rk��J�gN:m���nev�kOҥ��8�������B141�$�#vA�ŷ3��h�Q�4���;y)/vv���蹹W��)����b�/��&ܬ���=ڊo{��f�����6�_*LW��9%^pW+���3�RW�Z��w(������|�4���d�sK��)O��io��	Y�z��U��=&�����]L�-p��e�8bRH,��G˱���%w��Ukk��'JV~�.
[r�)��b���Z{m�U������g�u�D��M*��HY���X�3���.�/�����Ɏ$Ĥ�hS�\DH�uɧ*�_��S�����]����V�˞1q�"�(�6���m%��QzEi>�w���P@U��h-��?:uF1Ǹ.��]�UFNI�T���t������Z����V��Zl�}�m78�gus�[��I����}�Ȑ7��s2ƪ��j�3fgi$7�8�+H�Z}��)ʜ�މ�&��S��Tc�v�N2Ѹ�m�	����|�I���m�ݓմ���on���%ⅎh˪�[�h����X�dpn[9�����YO�Zh��#m�	�����$ްiU�ފ*��g9����_K�c]h,c����Am�ʹ���8vX�lΐ�F����nb+��R�VQWSw�����}�2�����kZ�v’q�NG���)5�٥dڋ�w�W�:M��6�ɭ��y>|�H��;�.#_�n|g8���!&�ʤ�+[�N�Hs[��iۧ6�&�׹8�Z�{G��j=��+v�ˡ��ZK=���c�y�� m��H',@�A�S��Lt���Ҕ~n�%�BO��ڻ��)t���:���(����v�^M}�^Y\�7�`2���'̢@Ϝ�L�nf��1�����6�䗾���ծ��J�jK��X���/���o����g+.��'+��{%�5��o-��x{��l��,1f;�`���J�o`h��SI�k���W���k˖7�^�RnR�95e{sY/��}]�W3�Q�Y�huۛK�6Xn��y���Ȩ^��A�ǒXp2@9#�n-��R�8'әΌ��E���_�KxԌ���V7��_��ؑi��������E����8{CF�4Ś�V�\S�*�xF;[�˚�:�3�sO���K�x�'�y+���iZI�i�ŭ��SW���MK_u��Iۗ@�O0�*K���rc�$�''�VOώ��P�}�NG�o������S�m/nWh�ک�^�/5aν=ښ=����&�ԭ<߳D�%��]��̱�*H��y+�M�M�ɴ�T%����z%��yJ*Z?q����E��%�ӷ�UFV�{�qIs4����4K�	���0�&�q1�����G)��TT�\m
h���,4~t�QMnߺ�۾�6K��T�K_��M.Җ�j��c9�o4�:�$f�i�74l$[����a�����M�6�^��R�tޜ�)�T �).�QT�˺��V�j�/����UՊ�Iʤ�b��%U���K[w���[8Y�Ғ�
$+r��վq2m`��
���nMϚ���U<���ivq�o[+ZͽM�J�m�Fԛ�Ws��i�ו�k[������x�v����\���bBrz'�0��'����4����O�J�~�[m{��h(���v���Z_|���閭����%���D��"�m��-#��b�<�Q�	�A1�2��2�������k�;٫��vi�rz�vZ���[ZpZ��Ѫ�gmoȒN�_�=�K��&��!��i^W?f�C9��-�F�&ybX�&��(�Z�Ok����95��Y-����[ۤckt�V���ܩ((��
(��
(��
(��*�Ǽ����@�
�i���^%tO@$(X�� ��慥��'{/&��~X��tN�;4��6�oș�I
�����B@%[i]�O�;Y�#kК6�����_pyt���'�@l-��Q��v�ػWpel.07+2�!�	�en^��N]=�M�h�!���{��׽�n۾�w+��`���m��َ��19&=�	�$g �W�/����w�������׹"�Vi1�X!Y؂e ��
�_n�@$O���^�M[�M]�]�X~�/�i��M.�v$Kx�(�l1�"���Jp>�$��	$�&���l�d���ME[�Si-�m-�{;�M���&���i6���!��,l�˶��$Q���Ux�z}��o+���]6�t�؛o�k���_��=MR���{���@(��|5��3�"���yv���±[�i��2rjTR����%�]uZE~=����ꔥ+?����)�h��{� 0�$[eEܻIxO���N�w�rݴ�w{��2{���[E��M%��e�JOc^8#�0�U�f�����rǹ<��6ӗ��tն��m�ݶ���t��$��^I.�pY�j1q�6�|���!�>U�)�n�Ww��I���J��]g~��m�m�V����+0����hĉ�6���>�Ww��H�	�id��iy'�]���wo���gu~�z�=K"�q ���j�� �9`cԀ�B�n�|����r���-^��i���O�G�O��a�a���*?*R��b�r�,��$�$Ēs�VM(��ˢ������w��[�뵿$���Y����6�Go$�5��v�'��5Wz_��D�-��J��a�|��)�f�|������k6�ez�l�zne��>d*���GOJ����;�R�q�vk�՟��;�g����&.���Q'qii�1�ۮȡE�$�ETe�'�I=�T��ܥ�Չ%�}IS�>����ER29ֿ��"�@y�ğ���E�^�]�Y���Q>k:�w��}���3�;� �?����E%y���S�r�ҙ��?��ת�B6+��"�q��"��u�3�y�@����q7��b��|ɥuVW�D �glJq�3�(B�€
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��IR��F� ʒR����6�=(Z]�.���wI�I�n�}ד�����@P@P@P@P@�A"�nC�<��Q��u�`��@�H��������$�k��������?�����h������4d���q�?�?�G���������#�{\��ƀ�=�?��c@����Y2��p��I#���_�	gP:&�|�d���q�?�?�G���������#�{\��ƀ�=�?��c@�H��������$�k��������?�����h������45����$/$���݌�q����3��gcm�8��!������4d���q�?�?�G��������Y��KV.݈�]�:�p8�A/����Ph����a�a��w��q�}�/�/��?€����G�P�x�����
>�����@����#�(�<_�_���g����|����q�}�/�/��?€����G�P�x�����
>�����@����#�(�<_�_���g����|����q�}�/�/��?€����G�P�x�����
>�����@����#�(�<_�_���g����|����q�}�/�/��?€����G�P�x�����
>�����@����#�(�<_�_���g����|����q�}�/�/��?€����G�P�x�����
>�����@����#�(�<_�_���g����|����q�}�/�/��?€����G�P�x�����
>�����@����#�(�<_�_���g����|����q�}�/�/��?€����G�P�x�����
>�����@����#�(�<_�_���g����|����q�}�/�/��?€����G�P�x�����
>�����@����#�(�<_�_���g����|����q�}�/�/��?€����G�P�x�����
>�����@����#�(�<_�_���g����|����q�}�/�/��?€����G�P�x�����
>�����@����#�(�<_�_���g����|����q�}�/�/��?€����G�P�x�����
>�����@����#�(�<_�_���g����|����q�}�/�/��?€����G�P�x�����
>�����@����#�(�<_�_���g����|��
�$`��p>���%��[�?�hF�
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(�
Z��iv�^����I� �ƥ�(%Ab�X�#��Wm���i-�e�.rPZ6��mJz^�5'xd�k9�Tv�$��&���Y�*�7I�!�q���OK���i&֩t�wWZ�t��;�٤����[y���f����{5%�/�P��`�Ic��ex��H�d%y�\�=�_�F2^�������Z�����(�
:���taʼ��8��#�HDȹ�f,쨪��ʠ���+�{l�m�d��z���&�vѷ�V�׫Ih�z����ޗdSjb�����EJ�7�ҨPX���x�`�ڪ���w�b����V�l޺w��zZ���/��u�ٕ��h�v����q�f��6�ƪ3���d�=�� q���%�����Ғ�W}[Z�˫@�Pu��r{ߕE�O�۾��6W]D%�-\�1Lb.�$r`�h���7g 6��O�v���/K}���>���n0�� �_j��@���r29������v����E��]]Ǭl��⤾��?��Ctl��b�&�ݬ�g9ݕ<c�=�'w$�ƒ��=����Uk�f��_�s����b��m/J�X�U�[��3�nu�y���Ǜ��Ww��n|�е\޶�+I�۶�ۛ��]]4����K�w�*J���ok�k;j�#J��0��,��gL��k2�*����f׭����gm�zR7V�#ѭ��e��0�DH\�T�'��O�쫜.w2�-e-��We�%w�֊�ײvaѾ������E}GYd�$�w���A�##���
*�r�d���W&���z]���r{Ey��M��i^�<�['&���]�l��ݓoGe��k ^�`�&��"�fd]̩�V�HP�<أ����Ѥ�g�*����V���j^�v�ğ-�6�u�3���;�2�&���k��Ȱ��`�ɑ�?���²H�Qy�|�]�F
�9Ê�|�=m��7k^֊�Օݓ$�W6�^�/.T���k��vZ�s�[Z�g0v�[Ktv�Uc��H,H���
�:X�˺�aR�٧no����](ݫ�sG���n[�J+��}���}\eo�ګ���=#�w,8E
e�;|������B7�[h�[J.T���&�����ʣ�.���Ռ�h�7ߺ�޲zF�j۠��,v�ek{��L
�
!0��
�%pf���@軁f
���mmi8+��a��~�V���Z�W�5��4�PnJ�ےM�we��R(˗�k�G��(�P����'��h�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@��;Io��[q�i�g�5�w��FX�bX�;�([�[Zpw[���z��W�3jRP�	Ke$ߢ~G)�xbF�X�e՚��[�&�O�u�%��"�x���KI�ܨw ��ڎѼ���T|�R�|�G�4��Q�u���x�k�Ir�E䢕��������^���sn,�,�� ��%�d6��#����d��,�_+��ԥ�Gm�]���j|�r��?7�'��V�*�T�+�S�މ(4����佢��(����Y-�4	u$����a��)%Ď`1��ap�%��b��f��]��h)��q��g}9��g��z�~-j|�v����)ٸ͵���c+{�K�O�\�v>����5����;�t�%�&L6�p�b-�O��:^�<�|��OW���(��Uh�H�*�沋W�����������J>��{җ���I�r,����"���g�H���Ҳ3���L?���`#�Ibt�8ٹ\�]b�wthr�i����ҢrR�N:�[�]F�&��II����[krP�\��
�k�\hR%쎖Ozբ�{��"�_,Cmr��������,�Y������]�Rm�v��--7��m)���W�J)Ar�
]�ʹ�R�I��kO�{ڸs)F�kV�ω4��mX���%�$���Q����t�M�Em���99�)�Ts~�jQ��9JS��Ǜ�k���ڊ��i_�iÙknY?)4�/vL�=��w�n��|� �e�po&7i^(2	ɉ�/��0����Ύ�jxt޺�2������z��ݤ�EF��ySSj=���E��.Ux��m$΃�6��i���YatE�b0X�>��S*S��5�I�F5a)?�M�j�je$�)�o*U"�eNQK��]������ww;}���P���}�E y�,��^\[G �~�§���I��RM�Mu�t���&�9�Z�򵮹T{M��]��Λ���܅��|4��`�cx�o#�Y#�Of��V�,#2�r��\�M�;��H�	%�N��A��M��	u�U9*m�ιTTy5
c*�o��G�}=�q�^���SJ���);�&ׅ4{�0�.ԁ��h���S�k����-6" P������M��8B��նݥ5v���fiYEtS�>�ѝJn��Ex��Y��,�[��<�[imT���؍��~["������D�P�M"V�{����V��f�zE6ە�N�ZKYn��{���Ek��߻u%f�f�tsv��M�� �-����{2α�%�{���HX�M�w >Zo�N�*Λ�rrQv�w�����j�JI(��~d������V�ok)F+�ܩ�nڶҺ��(�?
�X��]�wqpȫ1w�b��:6�D����23x7*�$�-	���.zN��&�hK���E*�W�m��{қ��[[�e(�m��RMF�݃�;E3�<Ak-�um�,�J��,�@b�=I��ZJ��NO�3�o��֗�k�M�"�������H�<Wt[H�:�7�83۔�F�� �$/��!���JQ����
,�(��z���4�����I[KM�E�Ux'�ڼ�\˕�&��Ԛ������K$���L�����wiO#�m���I1|����piG�9�E�{[B�J�ֻ�p�N/y�=^��%gw(��d�u�|��q�^�76�K�'��!���q�����y߼�)�8�[BrU�x�+�J5$��\��?yr�'�[���v��<}�f�*iIZM'd׻;����Q�I��W�F^��O
�6��<��]F��WKW�F�sm�=�q*������W�FLd�B�%�t�c��/�6��^Sm���ycQ�R��e�+5v�5k�+E;h���w|���xb�K)�����(��?n�խ�]B��6��L���ۚ�r^�Ϥj��buUIK��}����r�C���cͦ���]i$�uf�-˳�}y�gSѮ��xm���+�r�i���{cr<�Q��%`H�$dL���Oo�9;�zn�(�G~YIFq���W�.�m>X����KKTR��媼b�	Z�Z;E����˗�k�G��(�P����'��h�@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@GP��h�7�Cu`�'�%P� 0WV��g�Jڧ�l�����\�5�Dq���U8
��w{����VK��u!�G,I:4R��n
���r#���k>�5�Ӻk�=W�P@P@P@P@e�����A�(�s�J�c��@�}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@��������}��4|�����7���?�@�������;�Osɠ��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(��
(���admin/images/default-user-icon.png000064400000005574151331545640013157 0ustar00�PNG


IHDR;0���iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.5.0">
 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <rdf:Description rdf:about=""
    xmlns:exif="http://ns.adobe.com/exif/1.0/"
    xmlns:tiff="http://ns.adobe.com/tiff/1.0/"
    xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"
    xmlns:xmp="http://ns.adobe.com/xap/1.0/"
    xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
    xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
   exif:PixelXDimension="30"
   exif:PixelYDimension="30"
   exif:ColorSpace="1"
   tiff:ImageWidth="30"
   tiff:ImageLength="30"
   tiff:ResolutionUnit="2"
   tiff:XResolution="96/1"
   tiff:YResolution="96/1"
   photoshop:ColorMode="3"
   photoshop:ICCProfile="sRGB IEC61966-2.1"
   xmp:ModifyDate="2025-01-08T14:31:46-05:00"
   xmp:MetadataDate="2025-01-08T14:31:46-05:00">
   <xmpMM:History>
    <rdf:Seq>
     <rdf:li
      stEvt:action="produced"
      stEvt:softwareAgent="Affinity Designer 1.10.8"
      stEvt:when="2025-01-08T14:31:46-05:00"/>
    </rdf:Seq>
   </xmpMM:History>
  </rdf:Description>
 </rdf:RDF>
</x:xmpmeta>
<?xpacket end="r"?>��G�iCCPsRGB IEC61966-2.1(�u��KBA���H�0�E��J�Dm��� "� ��^_���^%�m�V(���Z�_P۠uE�k[Ԧ�v�
F���7�9�0s,��������`��Z/��_i�FN�#��N���P�>�%Z��c֪�����
6�qE�r�S�3�9��a���Ąτݚ\P��ԣ~19Y�o��P��vaW�G���2��rz2�R���{<�0/k��.t���b�I��0���<�/;��{���I�"^���*IR�p����qY��e�)����W=14X�n�Aӳa��B�6����ud�c�>�e���v��kZ�86��Ew�b:Ո)KV��D�N�-7в\�Y���m�W]��>�I�c�Z'g�{�	pHYs���+�IDATH�����W��ܹ3�z0-`�XiDM�(�%��"AJ����)$����@�"O@AR!���j�b%0Ȍ=s�Mṗ���|ɲg����?�V����$QJ��J�wE�s�j�4��Zk���"�����{�����Xk-MӠ�^��o�s��Z��sn$"h�QJ�G)�R
��Z���J���ַE�r�k�o�sc�5"�s��i��#"�H�VJ�$	"���s�S.�ܻ��-�Xk�ޓ�)�^�$Ipα��A�e��`�����z'Y��a���T��Bk�1����@y7��6p����$���1�,���c���b�|>�iBx��$I>�n����n��$a>�c�akk��xL�e�V���d��UU�_��_;�&�r�7`|�t]�E�x<�ܹs��I�P�5�&�	����f3��h����Oׁ�����9{�,����
#(��ӧ)�2�q��X&�>[
P�^/R-$Q�N�$!�sN�:�Ⱥ��s@�.0:��p8�1����4e8�}��xG�kǁ�y��
uAi�,�:@��;I%�5��t"c�={U��'���-�@�>|+����|]Fw���x�b��l�b�ϟ??	4�(�锪����v
�R����/_WNQ���+�ʬ�,vwwy��5@l�]#�����ӧ�f3�R��C:F�K�$�u]�CkG��`�!MS&�	O�<a:��x���ZK���f3?~̳g����ëW������ȣ�� X�4
�<��zq4�t���<���R���$ι{��RqU	��ZK�ߧ,K�\��`0�Aah��^��,)˒<�i�&>�����k�4M�s��Y��b4q��e��
Hh��᯵Fk����=Ȳ,n,-�s��9�s7q����ﳽ�A�!��k�9��!�.]�(��`���'�JK�/J��@w���…lnn�x���"����&eYFZ�=���z�{_i�o�9{�����"@?
�.��Z�7�~��
�T%"�s�4M��zG)�C�e\�xqŻ�����Fҕ�,�Q���P
�h��`p7I�4��c(�⮈|oS�f�Z�F��u������5����{u���(�m�c�;���V�͢(��8�H�����{�7��<�f���8�Ȳl%�R�6deH"km��
��x��r��(
�t��<���c���_�=�;u'4hIEND�B`�admin/images/icon-uncanny-automator.png000064400000060200151331545640014226 0ustar00�PNG


IHDR\r�fsRGB��,	pHYs��`%IDATx��}xY�5�fz޸��y�����n��ƽq�и���'H HB�xB�8!Ĉww�`�g��^�֭����R���M�U�s֪#��ӡ���}M:}E��Е��X'4#�F�{��W�	z��(���#�(��_�	Z��wa��g�%aW��G�	@�a����A��M�	*@D�=a��/�C�ߊ}�$H`�s$a�*���9
�žS`M�X2����p���W�	DH& AB+N�6�v�eoX4d�W�u���[=���3Ÿ�}�$�{!v!��{��S^��ܟ��Z�b�ľw	�=��:�zw��L#�˸=a9��Y�	���%Hh� ��%�AW�%�_���e��<\���R�r� �݁����*�G�ď\h$tRp��e!AB�����*~:!6W���L�� �]��.�K�+��b�j�j9���	b��	�Dp=�Ĺ;e�^`��P^gݟ�7s��D��v"��|�ԇ�w$�^��p$]e`��L�2� �݀ΖO��.�19�v��q�4�a0������.	���B�Ĺ�{�N��6N���Tǡ��g����.	����y'�����z�4�?��U�%b��	�}�3���yOؕ�R����z��~��k"l�Z���F��E��v��}1��&а^>���X�}��
?ſ>b��k�.	��ؒ4�۽�6�9��h79�v��E#�#^��g���asد��\$Hh b��T��⏏F���B�����].$���C��.}
;�VP�l?�����.	���f��9��[���'c���y�X��D��v"���b��㉬Wb�߾�M��d�~X�2� �]��Ά)‰6���ט8Y�5v���?�\)m�(ABK��n [�83?���ſ6l�\�+�v	��]$�K�m��+#�����y���ůu?Fn�Y,?N4�����b��	�D|�٢�}\�GᎶꣵ�q�sk1~�h�ފqvP��e AB��M�x�� ��[�?���!H��3���9_1T8}
�N�{�_����>�$Hh� b�%a$[�#o���w纏��>��;˻���_�b

f�c(��^,��&ن�Gz�]$�kQ��0�m��c��D�}�tg � p/�
��;�
��e�R�I� &�0�C��յaы�����Ű�{���'�ŏ�!���e AB�F�	x�����4��t�����7	��!G�O&ǞXb�!~��}�$H�@�`^ߦt���B�'"�_���K��[�	�n$��A�v�]��I��IE/��X�*A�O#|@X&@�O���뻈�KX�c[��$H����?$A��p�ZB#¾B���$�H�%Hx�A����a�`��O�	z8��}m$H00��wK�$�S��T1����'A�C�j�@��M�	�'�H��H����#��+	����p�fv%���D�y�X�$A�>���$a$!h��B�ot���:L�o�6w�oU�	2�����W�?�{o���۬`�b߲	dX�А��a�ks�c5!	$�0VywW'��=���	���
���
~�2��Ä��X$HhX�}�-Ŀ|	=���`�2q��?^Ns}�lj�{X��73��cq�!�_k��b�g A�a���	����X��הC��u�dn'��}(A�m��{>[p(�Vf2�4��I�b� �*o��~�-H��Gv����y�j™b�	Z���%���{�Q��W7o�٧7.$�����]��	9]�*�_���B��
��	��0��	%�.���X���Q�Y��*6����i��>�΄��	�u��?6:���^�NE5־^����a�2�$��\B;ѯ4�݆0���WN;p�N�Ì��0�;�0�10�:�ۗim?]�kH��HhGh�f�h~��.���0�3̸�fX&�t�"��m[kH��8T�v!�=F�~a��l�4��&�a�`�q;��ˆ���FQK�T�ۈ���q�",]`m���^��;oA����N��=r���D�{�pg�yL���
8m��ݞ��_��F��$�H͂��|�,*���J((W���r�NۀH��<샢��|ףQp�;.8��~s;Xu����1���a�l��?�{�����HxO@gW�m�bcS���.����
��EPRU�߼}��e��Fy��^5�_+��#�QI����	�/�u�x��Þ�6��8�1y�	��y:n�^睊���Hx@�lM������$d�Cu]��E�
��r@�����{�Y�i%��wd<X����6-n
Cv]��[���68��V{�2#�ێ�6���m�+Θ�à�������]n�A��i����[��o���
�����D�
�`ɩ�7��\�nۭ���x0
@:z\��0j�m��\� ���`�W=��p�32J�E����zH�-��h0qt�y�.�p��ۘ\�(��?�nG� ���r�T5��6�PTQ%��T�'&En��/1�>�[��J�?.�x��~{C�Dr���O�n[�HCqQ�Տ']�֌ܲJ�y2�.wh��߼���Z�򁽅��]a���6�B'��(M4�����$�2�F1���v�U̪�&�q}&7����yRf�����o �_��$�%gXx⊾
���V�C�'��4�Ʋ�Ԋ4��bkB0ܣ�-�q��d�*���tXQe5'����,?s���M���n�D��^\
c��KPZU#v��y�a�ų0x��A���޾m6`Д�W�51ק�� �2��ʶ�j�}�n�Z��
AA����ZT&�e�u�2=�zŠ�z�!�附���J0H�~�U�3	+I�j�xJ����&P��J�Kk�!��|���]��Γ�����P�i����i;�R����"v;��D��<�p�ћ�r䖷�%LC�#.;�����9�9��8aG�ۮA*�gFMKDJ��[ v��	O"8{H�H/.����
�;�-���H�m�s����H�,A4��*w�u��1��g��qg�z!7��4��̇���6�T�pU��C��)O0�Gw�sX��B��%�&M�14�*U�oT��mT/��.P0�F�+C��f�4>�r����m�{E���)��?�!p�ddZ6����A�QS��O�n�Ԁo����6�~�w�t��4�Q�K��"�f��C���PR]+���I%`�p��A�ﭪk���TmÕ�Za��K����\�g����Ͳe�@�����F�4vy
����ad����0!"3�J*���DCr!6����A;O�~	OO���-,��j��M#isR�����pUXJ^a4G�]|��D8���N�>���_&������L��8���^����d(���X��i���Jφ����@�	�_�n�:P��UQs�~���2��Y�J#h���u2L��`2���@2�WAu}�5@��5�z�8�O���HNi9����l�&q�`���݃T�5�
��B-�
W"���3��(&S�`��	���J���a�\R
K���Zez2CW5��������=�
@���yp��+2Vh_𒰛�:h�0j:%G�b
�a�ha�nE����@��tȀ+w�)�p��oB�S��+��J�ȸ3
b���*��8���b�	����
Dg��a+'M���Zhw �>��26^��{�h�1o�[d"\vlBM�����Y�t�.)�Ҋ��<�(�D]iM�+kh�4�i��DgR��}�9G�'C

C���/tx�B�Kl]�4/�(U�GX��F[v�1��5,.<~��!Ȇ8w��s2�������=:�� �!Qؿ��D�BQF��	�[�=H!������޳5��ا���_|�Fie
�^�^ĈE�=�'�w�=��"p�I3�p�#.<�3dL�K��\�c20)S�r* C��nBL��y����r�J����
�����	N/b�2�.���ƥ�],t�#����XLL�'���^¨)LS�LT�23��ނKh,�
�y0v-��#��i]q�up��C�	D���zy�`���M֟��(�x�O���ܱ��k7,��58}�N4�|n�߅{�N��;x��AHhddf�I�(�"�+�ӱ����ǃ]�Kj7H�_q�ߏs8,c�Q�7��KN�����ؚyo@
�3WAo�h.��l�\�K�A�O���O���?���yO��^�a���Q�>��/������>�s��}����0�h,[�v�?�/���}jQ/c!/�mogn�,F-U�@2�o���{R�۹
��?TPe��D�u4|��4��S�)�U�I�U�	��w�c��б�h���oG�g��Ϻ�O�՟	5�O�+\�7�
�a��¼Ek =#�MZ���^�GwU&`%�v��l�z�Ϸ=��E�ї}*~}����g]��'��^�a
ܜ%h"2{��f���6
�Fq,��+a/��(*�E��)��^��։���p�1�T�Yl�Y���U�W��U�����bZS~�c�d���u��=>0[Gm��.rjT����l{7��]t1kC4����i�&,AWd���c��w�Ml-�I��K�2!�}U��(<�?����bֆt�~��)�u�9(�� m%��\����������U�3\t1ke��@�n��U	�����3/����@
͈�\�U��'X�	��Y[��c(WI{�����R
r&H����#�P¹�;	/5�jij�'��DPE1�͏�e���[�q�����7�Nl͉r�'Gx��a�Q�1��⪕��߅$��/(|/�2��s($3>	�7T�ߩbk��a�ŧ-�X:�W7���S�>�@TV���n�@V7�~���ZgΛҽ�����6�0g��b�EAn��>ŏ|$l����I��}��B��ȵ7���zЩ�@&������N�?����4a�<8f|�N�VUU�}�Z3!-46�j�;��d����"]��ؘ{�uV��n�I���^SE���8��;���r�:|�������W�G�E�0f:�;hLwnֶ��q�v幛\�غl5��O�7�߷��u���	�q��E������zx��-��S�ܼ��U@�����������E�.�'�G{Rh�K�+7�O}A=�nc�ӯӝ��!Ü��v�ֻ̬��o�pْ���[�-r�#�7?��yl��s�Q������"$B���׃D�Nм
�����S��Z��Dj}ٗ�EӶ�c��¥됓�'�m)����6�`'���"0j��W��s��`z~g���sA��jv[�>�v��"օ�C��54�f�m����\н<���F�'���ƒ!��5���X�yÆ�
?[��ɏ��XT����r�����"��}~ɊM
�]h�E�+�>�B�mS�2H4&Α�.O4L�2q�|�ea
���%�rw�R���h@r�g�7���Z�4{��i�5�"�?\!����1㐕�<Mf��
1i�MfL�3�,'*P3h�7�1{)MS^^�b�����<��Ol}�JX���lͺe;��U*�%'�
�lAa��ӟoƹ�3��?����?ux��
�9}���[�̰�i硴�>���-^�Ώ��ְ!՘)�w��`�5jP�ƾi<�S�#�ޒ���8���]gA���cM]�� voO[�P�)k[!�8o1`�4���xs18L���`:g�ɗ�`����?� �[��q�2��5jP�2�����4*<�	@�@A�����#D�>��`�k�b[Y�lU���-W/��ߩ��b`d%�Z��{�80�r��8D�mۇ�p��X�5jPq��k��z�i��i�>�t��b ��t�ShK��<w�6�����!�����8D���`�Fx���=�+<=��5j0��Ⱦ�EƦ���n�8
��L�C�8V1�44}��_�C~~^��!�4� �G�q�ˍ��.CU�^��ͽ�/�􅵛���� ��{�O�[��������mg�w�u!���R?��ݰ�E�L��B��־=885v��L��b��P�^A�a䚛��0��)�	����\[�������+���Nx�0a��l�b)賸�Lqp����OЁ��)����Kç[pC^_O�#k˙�dˉ���W�ˀ{�� Hl�FM�=�7������Cxv1�	�_��o�|���{$��x���)�{�1�1[���)'�C�͆ޓf��4���Gj�U��a���KʄsV4#����k�mL���bA��˴;�#���U���#���m{z���� 8�����J���4��V��:ܢ'�8b�X�p�Z����/��gi��R1�?��5��H.(���Z��_����bz-c�/l�0������M	Y-����*Dz>[��G��g!�Nzu�穹�Q^
�ڤOx�D�djx��-�����e�Z�9�b)t:C�����?b*<��WiLFd�C^y]�n	�p�����:�(��u%=���M��ƫ-�rR�/��j��֪A@n�.�fs詯28h�	>�Y�\RI��\����iy����3�EW�z��X�2n
\M���NP�ڰ�42f� 2+ҋˠ��0BO��z
Lɦ�5g�V� �x�Af���T=�~��0[��o�o���m��#�&����c�!���_+7�S�p@C���Ć���2��󜫋���[BVC7
{8&�����G�B�)�^B|^���(CLhQU��8�x>nS�'߅��}у.��-^])ۉ)��cދ�j`ɩk\m���Z�;�M}@��y���(�[d���"�hO��M���MB�Į��>}��?�$����K�/����P\�>q6�f���3	�dc�EZ�U�߿|�A�l�m
��&#6��U0�#��>���w����}��.[B
�䞠�L�9���e
�R�����y�B�%p'!;	��0r�\���?s=t��|������1eF�]����f���4�&`
�/��{����{Am1����'K�Zl��F�0

<�t��롱y��'7���b�b��q�%�'�
�}�дS�p��2�r�y:_�Y��3/ڰG3X�~7�5[��"��dm�W�Q��bR~1���W�è�@�=|Dž��ф�e�p�1�W
���bҸS���!��7n٫�؀��{S������"�]�o�dk�o���0u��g�AŏsM���_F|���Ԙ���Ũ�\>.�^��%�sN
 ��[ �!/��F�j� �&�R��.c�Y�Z4��Ӱs�*~�&�
r��ۘe�y)볯���Q�a�ҍ���8���_�$|�S0u��"���C֦�-Z#�����z�;�M]`��uwN�� 4�S���q"����Og��*ld8٤j�a��5��>���?�S�/l�ƌ;#1,�s09LJ_|/7�O��[�0x����f��+w�m�/����(v�1�ś�����`���o�䦬K���&�{������0em
{�B��g�[�z�������4���ɏp�I�������C�B;����\�d�u����J�0~�|Q9�%v��0�=�'`6%%�	V|2"߇|��ؔ���M�%B`�<��-c���pPrS��7k�i��U�J�m�f�ifnϕ��>��VTFן�e�
�7����z?��sDo��������꣧\m�@l�����7��$��b���
Wz}�.@YoB�3&��^*�!V1�Gj�?@��/dm
��	��;N\m��LFn��f]���Q 7+���c�Ρ��g��m���}ؔcb=Fk����я0����b5�l*��ka��JX|o�_$�9b�5�M%&��?F�n�l�Ֆ�	-�^�rSn��OS8n������B2�&M�B�:uE����w'��;K
bb���k�LX�D��I�z��ޓu�R�)�A@Ⱥ:�y�L�0`d1���͸�o48%K�|���`��7�s؂W���G8
�]D�~z�|������EdK���aw�Z��i_�:�in�^+.i��ѷ=���6l��VKw�Vl��rV�K�V2�,�8�'(��ƽl��-A�!�|@S�u��ytlj�p�q��r�E�R��w:��KyM3n�%S$�) kC�'�(����Չ��R�=m���_f��ˌ\%�ː�sD��k���sЖ�w��+U@�Z�w:ŧ�=Ct�g^�_`k�=�Rf�[�'��
���٦��%�*��%���z�䢏�o(.;b
�D�ۀe�����-�@΂��jB`��yj
@F�Tm֮��� ��}m��3�ړ���~�P��";+����11���5��oS�HL���*�?�I��×)
�]yȹn
G��mf�;|�`x�]�/t�&�G���a}��(�0[���Q��6��_3��ܳqdw��#Z����(�� 	G��mA :�}��Q4 �<b�i{7΂��1�o��jJ��B��ڨ�-�2�MY'�0[�cw��k�-w4��	;@Xx� 8�q"к��g���i[�W.[�jA.�{���8��|B{�{��.��N�)#Ʊkk��� &�i�����+DfKq��~�P7v�狘�Cȁ��ӂ+�u�f�}�B�	�[�*A.�/J�gbAo7��D���;�s�:��+�������ٓ��t�>Rl�!��m?�[����vD�1�2W����U]͆�n�7��~S��3�n�ʹ[�jA.��}�
��Pb:	�n����Xx�5�@�OP��'��fܱ�o�x���l	~7�H�e�ˉ��f�&��s�2�\�L@��"}�0����b�[-�E�/<"-G~s�\24=OnN�ˀ<)��γ�p�'�`���
�ڀ1��K�颋�%8r���O6��2�5�A�9pB�D��p���tA��K�G��5���/zř�UZ)O��UR�.�e<)��& B��a��7���s�`�6��N�'h���s(r����^�.��/�8�qq��3���m_��q� �g�p��k� 2#2��m��I�Ã��Z�-,��'�c�_D�5<{�%�?�w����O�-�U�����ٔ���������Ԇ��"�2,?cƥ��bk\-p�B�l���h�c�����zKO]�������%9z�8�5��F�����B���u��En��u�	���Jmx�Ma��_�<Rl��r�֪L��8�'{#!����=��p�S�r���ˁ��.]�-���De�Q�a�#Y}5U�p+yV���&8l�98[lm��EFM��T��c�Ș�%T7���g�s��I�p�0$?�,u�>���`m��&�r�:��`&ٴu� ��r�a�aD2��N�7Ol]kr�����T�r֡��e���T��4�q���:iJ��׃i��>v)�fb�CC@������M��lny_�p�ǥp�ᄬ\����[Ӛc[���=��Vk��O�k$��U�d.� ;~�=L>1vƨO:�x
|�ew��(DL^��O�!`�s}��z�����<)�0P���Bεd����3Ė����a�7 ����r&���E	0�[������;����3`��\�u�Fm=&
��M���̼�������V��(!�y�4�2�������L�Ӏ�71�H��C�sSĖ����#3J���-60a�J�
�l�=��"�'c�ħS[˽���m�
��g��]h���z�sD��v������}.-�[ΚcCp%�d���^��f[�W��Wt䊅�mqC��;
Uż��Ͽ��������i�� ���Yλ�$ڤ�"�9,��>O:P^�i�U��{_�@��9�6���?Y�o���s��{�:%85�ۢ�5�
Տ�aA��Sh
ư/M��("{�5�*
nc�郇����~_�f���ͩ���s���N@�;�9!���r�k��Qg2���;��W�^��W-E_k&5�/�5���ä�����]��#�7|1�e����[�Р��Wo�@au$W�rq��%� y�,Oo���
3��I�5��ď��;��i��e@\�Ťb�����_��ҥH�"��<�@�0���<���A�'���ׯ!���8��3pӥ�
��1�$9!Y�p/8�9�ȅ��Ŗ��8V�?Bŏ���&�Or��5�D��D͈��`�;
�怫8�𕖽������R�Ǩ�q��ؾ�\�x2uqU-=���%on/�9��e'7����E,�qW=��� 4�Ҳ��+Il9k�}Yib=wXpbdjDg�4�3��h��*���]��
��^��1x�(���\��؅=���j]��g���8W�L��乛���O�U�F}ʝ��3��V�mH���o��@TF4�i:�2(��Xq'��9�k��ao�`�v��B�O��W����[��1��:v+�\|j��S���%� d=���7�y�η�_&�eZ�D���&w��
3֟�x¯��'��cζ�UX,�A����S*��|��Z9Ř�O�w[Κø�CB�p�:lVk��U��3��WT���}���dV���qO7���e~ر�ƁEb����s�t吥��ǒ��<�M�ÿ1���ǀ1�ď�xE9��0Q\Si��8/b�vxZ�9ԾzMWvݰ��4��9�k?� �L�Ο���ޕ�[:��ev�ʊX�e?<s����a�[ˆ��yp_ҭ^?^�ߎ�/��ḽt�����[�z��.H��1)0��~���J�b`,�<�NU:8ɵ�����r�Ƶ�*�D
t؝�<S2�3���u
���&��I�����Ag��B��섞8F����AĐc�0�?[�L�OZ��M��<%_��Z	_��b׊;L����j�מ�)�����^����E&r}W��R�Ƶ�T2�WA���a�S��ga���{U�
*��K6��\!���k�ÂN���
eK�r�vv�2��Y���:6h�7`����Y��-z��������G)����vM����p�'bKY;���d<V�E�
��x{�5ur(��Q[1[������\C8�F�w["����5��~.�?0��>:���}��߼��v.�p];F�r[H����7r�|��
�-��*�	@�+��)�[�Gq�6�{\m��R�Ƶ�Vk2�D��pj�r�8`a�0�"�.�<�/��3�|�o���A1b�BSn
�.�
n��"Xt�6�	SOO�	�&)p��ItG#�l4�}��ntH�=��O��><���-:��P�[�+�ۊ�^�3>C��b��_/���=�����_x{n!���u�4^���W7����2�T�Z[2��`���U�D�O1�Y�������P�	���v�J����]Մ?[��ø�Ac ��a���"�|���?l})�z>�ˮ�p�?\�X��=��g]��5cb84�l=b7Bu�n� ��_�:��۶9D҅�{�?ʝ�|XOxߤl����P��>��}�%��k�56�5��u�x
@g1�k����[��8|�e��#�m|�}\�_5�1����d��'��&���U��^z�LIܖ��?n�a��UęK�p���
Ƶ9�����V��4!��`��ђ
46�@U�
\>��
*i
��o~�o��IZ����8�K(���6��~�ћ���D�*/�9F��*�Ė�n0�
�����a��_�+ {�͏��;{���i�c�>�U����7ɴ���1������o��������������g�}��O3���ΥD3��;�k�55�O�s�+��O��&�ZF�����:"\[�s��#�$.��K��M�~�"�	5��W��#�²��}�y���tl���S�`�E΍p�Ė��0�����{"�W�O��9'�I���*�������7��|H��qp����#�2r��/�X��t���1�W��W��3�hw�Y9���k+|���{+���?��ȱ���잒�q�/����'Dr�'�r������n���U*��g��s�K*v�4�
x�jE�+p�Nᜠ9h�(���?
�E��睛��n���l9{��aw�oC#ޛ���q2��>�E��Ԥ�o���憇���=�2�O�[�•ğZT���\ߵ\l��Ƶ?
�_�+��~���*�TR���rJσ,Xll
%յ��'��1�Ј�si#���p��㐟S�S������I�&�r�tBOi�/m
ǝg1z��blZ3��*�Ml��=G�<9[A��}B��s���* ��f*O%�Ė�~`\;P��>��0�Tؑ�lē���(���﩮o���"�S��@F�`X��|���Ճ4��=�Ҁ[Vq�jK7�O����u��
�/z��}����?f����Ვ��^v��G�p�Ux-����Trg�=%�l��ڏ����O(��v��V�G`�E,�gIYJߛ�[��^��RX
�35�qhb�������Ǖjs��N"⼁C�����@Z�B��̍���NJ"�+�c ���W��W�=u�[���q�	���X�RaD��hmIŕ���Sr��7)'��3x�Kae5�g`&�&7aҜ�i������ �&./b��"�,F-�e[��<���B(�k�sPE5�pܹ)�'��CC^�yKs�#�ל��=�Ŗ��a\��zQ^�n����)�*l�b	I���V��1YrA	�����9+X�~7|��p�"�O�/��8g�������^�!C{#����'/�8vl3�Rh?A���mO~��
�8rf�� ���r�?�ko�3�)��v���gN�-	�0���l��y�U���� �Qm<t�
�L��eEm�����$����H�E��)�������g���"=��d8�(<��k�K����+MJ��Ml�Ƶk�����[�11�.Hl6��
\nA	�P��H�ښSV��AF+w?X��t�۔�����6�6�*����w���bQ��k�	���ٔ;q�[�����G����w���rȡ�g�v�IM
R$4��drN�p;L]����h����K+h�hM���Co�p�$c$)������Y���Yo��+��'ֱ�Z�~���P�<�)$F��b�'bkUo 73�0L�By�E%Z�_G��Lm~�ɫ���Uj��f3�$��K�2:E�CM��}�Ob<�z�'d��b�t�����7�iL�)���.s�������q�����?��Y����*}��#ሥ=a��|�
���X�5&�]�ޑq�9��H��H�+V�����b�D��]Gᇉs����M�~��ً�D$
5L��OC\��U4�R���5mx҄��i:q�ɲӣ.�u\7�sg�Ғ~��֫^Anh�R�[�X�d �u�*�([s�2㻜������}�I��Zտ/e��CXF�ƽ�;�Þ3Wih2��Y�^y��i}�75t�z
|C
�{��i�&Ԕo���ٓ��#_�,X�=U�o������Zf��ն��M`�S��:��a]�݅�6�?7:Ÿ7<n$�Q����rc�g��Y8��߃�d��O�⩈�S�Eb:���dxH�b��`���s�37���00��	g�5y
��e+�YOJ�рV����
ښ�+'z(r�(����"bLZ��������|39M.��?��./;5�!�t��D�J���(D�m<�
���k�;�C��]�lB�ښ~�T8�XS�ǂ�:(5���~h|N���O৫�T|�!�
��HaR�:_�qYyt�L���r
�% ֛p�x��(Q�Fe $!E��Z���#`�E�]5!^����\,�h��ZM&��8"L�9ú�'h�Lm%{bb��>�2�v�UeBz_���O{Y`U����g�QD��2��߂�*�:����c�:l
�)�F
R y��Yt”N���d\���n��C���u�DpdZe���`�}ƛ&�u�>�D�CIU���c8d��P���C`�AH\�q�]�.Âu�`��7yW���O8§m�9L0�p����Ơ+�櫮�G�(�K��hZvIM�жϸ��j�=��!���5Ha�`>
�
<;
E���.�V����,�zNe�B<6���Yb������Lt� 7^�
�aѐYT
����+�pR�*`�����Bi�B{��_���ǀÈQ�@�A���NM��]��L���p<
������t�5f��MC���h�5u���Ϣ���\��*,c��@�V����/׸	�Z�WbkԠ ���]85:����ͻ�}Hf�b�R��șj	��0�����|a�9�\���bNX��gxd�ieS�3�"��ZmP;����+���#��+�r�a�('!e�Ll�qb�?���ƁÎ�:����:�=�F�cq.��ͫ�	Ǟ�˖��N�i�Y��73'7��O�J+*��+a��{κ��&�`�5jP���,��-�j�B���wg�-:y�S���%J���]�QBV.�8\�[ė�ix�N���Ɗ��%�[/�r��[ࣃ]�8s���ކ�gL���׀IWq�E�g�$��s(�q|�u��C�GL�S止�y�tp�^ƍOé[��⑏��ˌ9W�!���y��687�-�+�֨AA
�%�p�<��n�� ��Cb�)���M=>$���?����'����J��j�
B�1�WArA)=]985۠��V�=���r*v&��q���4z���yK��s�5jP��/6Y�ˇ�J��=V*[�\s����W�^��^s\<g���b -�X�%Gu�#C	�bHsR~	De5������2q����u��A\�.�8O���O����O���_؅���BzY����|w��m@��p-����%]�'�4ϛ.1���8c�E@$�)WVs�C���Hp�!�<%1���S��hjiⵢ��\	��{�GBN�&���?�b#\���G�֨AA
�sv!����5
g�ff'd�7�4�]��x��v��R�{n���%Cj~���em����I�j�!F1
fd��S��a��R�I˥�4��Y4�>�&�;qu���jN@�i�d��a+GA��s��f�_�{��~H��dTG�J_�e-��쿼���������z�v��=�&�cpC�q��;p��������!B*CM'��Z�͠���#p��+ 8��n�&p����ށ��X��T��H�M���b��� �������<�)���2���dx�Zk1���RXc���t�s�١0��LlL;t��LA�cw����9]����l2��R�Ϣ-�F��!�K`8�i�Uu�f����[_�[�����*�Z���Z��2�c�f�p�OJ7�q!*%�6w3�[�`l�����cN,�)-�K��f2&>���B�^�D2N.(�$O�:�$}��S��^΅��=#bᲳ,;m����7�k'�5�^���)���3$
Y`��|vvZf��@Ɇ7_>%
q����Vi\�0��8w|1���7\�M�/��?�[O|�a���h
���d���E��94�45�2�J!����*��p1��R���E'�kp$Xy�Sc�{˖c�{��
~��C;�7u����f���v��PT]� �{��忻��MAp�#�p\RY��r?}f<��(BWzf$�6��ne��>'�~�V`��b�/N�A�-�a{�kb߈��)��B4$��G�~�+08=���1��|��<�D���w9�\诓	����70�� ���Db�a±�0�����V�]���-ᷚ��3�/����Bl]�H�e���V]�����wޱ�J���I����^�\�cd�t��F��[�j�8�\?:�0�x�?���+�8xZtщM}���o����=����[�-R��م�j������S2%��Ӳ 06	�¢��;{�`�7�72����g�@fA1WT�.{��bkOi����#&n��N�Y�E��0���ph�<3�j��@���?��	�L��J�c�)C��u$�vs=�sr���>7�t(�+8�0��6�z���4����o��T��֢���=�l񇉭�)ܥ�����
"t�l�\~gm�%Lv��K��=8i�,}^�����<t^�Rs��納���:L:z���e9������5=OO�q����;�g���I+`s�"X>V��+�`��4X�t2=�d"�:�w�U�ύ���L�%Ϧ�r��*�GX:6D·-��`[�f���{�%�w�X	�n�9Ƨ�G������/�������Z��e8띥?���D
�&���)�y�JX~��(��T6��ga��𷥧�B��q��>��k�A�i�a��J�s�ʉw��ܻS���/D�h�[��f�`�u?���'��,K�K_����d�t�5�Ž���8\b�4�Z�)��	�0"��n�>�5&?m�)���^��37�2����.`��\� 8.���P�'2��~����`o[�/��c��T��&�����ޠ�=����{.p�ɍv�0d��Co0���8���
-h�kk\g�^����)/��}-id�>0q�f*|'�8��;~���e�/���/��E�O|U����?�|8�>�Q��'��`y��NY�)|���.?��֕��6�s�N��34):\1�	u��xM
Cs�e0f�Z>��X}f.�~��Ày�`����%ALz'IaZ���jhPs`�P>�?�o
��O[�-R��ĸ��m*f׀0���[Qy%<��.^45;M���sx^;��d��8Y����a#=;\�|a�K��%
—���.��JVy
d���
`��1*�+y�¿�q���L�L�cIa��.J��=i����el�}���6Z�c׸��|3q�a��B�\��<ЩM����ď1�G���O��7�J��n���[ggnF�����ܣ����$3N�'��|m�������w�
G����x���tc��s;^�`83b�i�'�uj��8/0¢���gZ�����S�j/%�#��̄�� ��c��70�k"�!����y��?z�i�U���>:k��j�oݑ�PVQi���(�l��o~�'�@���\O��bkQ�J����J�
V��

Ιq\n�P2��,����P�>l�F��V]`�5k^��&�s��\\���8���܍�q�Y_p�����aWo޾���H�����T~�y�9��y��w���
��nOX&�;�tk���T�p�Ch���K�AT���H"~������l.�~�@*�Jcl
N���w�_u$��L��;̘�O�u����6ZD�am�3���A��_����w`�B>�d�W�߭k��B�=����m���]&B	x�3�~z*�3Y�w�j�2�>tŁm����ci)����r�{c��o:�Y������w(�/�I=��`�k����r��+�E��_�����J��՛7J
��`�����aP���8YՇ��Q���]Y���۴_�x��T���Ȉ]h�_ޕ�l��0*<��ñ<�;��a>���l|����aȕn
�?¼,�A�ք̖�}��h�b
�
�]Fc7��4���67��t�|햽���xS���GJ���!�E��"f�{F��٨!Ojv�c��u�V��{L��|>�&7e�r���Nܦ��F|"�y�뾄��U�L�=<��<���g����V<���^d*��n7����=E�3y�1�o���:�[|A
�f����ߙNT�5�Gb�Ot�JeV��w���eu
J����AC�na�sDu?{l�����O2�{B�
9��X\��۹�J�x.u��N��5ց�����7�A��E���B�^q~����{qE��A�l>LI��N(�#5�����߸�Ur����$�u1_�ptժ���6�G�u���p��O�2�[{����n|_��Sv0����5�!W'|j�j;�b�u��J��	H.����l�Td�]�����͡��T�=�=k`�%~v��w�����_���|'�y��t���N:�/3^+�dd�e�{I����_M��
y�ᜊ���Vx
�Q������}*Lˮ~t؝�W�>���bk�U�T�f��Z�!��J��
6�߽��l�|�I6U�솽4���i�O:��ݣ�9��chm0ǥ�?%v�^ŵ�IA�2x
`���ɨC]�k^��@v`ψ=?"#N�N"C����ߙ1XfO�7�e�G	��ї�4�z�S�	=���]��ǖ���~_4G��-���dn�Qe�<���6c���ǥ*��~X�U�N!1�b������a�&du�mGa$�ia�`�����}�#F7c>��C��Y��_���e�[s�
�†�+�T�iQ��k��|�q�J���3��ōC�T�m�X���ue�7a|<�X�I�����?�����؃��q/D��o����$pܠ�]yLα�sđn}*|��1�V��ؚkU ��wv�%��l����Yv�IQ�M��pn�^3�}8^4x�Z�߹�ďW,��Z���*O�"�6\�`�Fg�<�u7?x��N����x�����\
&^��o�.0��i���z}s��zk� �Sì(7Rɺ�>�M�����W������4�Fĵ��a�pӊP��*�w��ˈK���5;!��çJ��	9qH ;�
{p|����c�CN�ݞ�Z�&��6�	Έ��ZJ�HG�u�jA*�)���9�iܸp�	�0)%���2b�bn<�ZD�F*5 L2�ߗ	
��˳�/J��;,�O,Ʈ��h
��:�ጃ��}crV���|�*�dR^1X?
��^ؿ��-���oI��Ql��Z�J9ɬ ������
��C��
&lb�o��?��E4�{M�*5��}�w�sh�����(#޳�h
�\XN�0�'�����=a��~55&�_�wD�:��n���^���[c�F���*6�z<o�<���Kz�b��B�8{��`0��I*���f֢);���";'����
A�@l��寲k~�+��b2'�+�ްCw�&�?^���o����^�?M�����W�����
�ߚ
\��wܸ���.>���³ߏ	G��K0�7�'�U�o>��{x׵1��X��v��T.{&�C|Qo]���0�eg�
��D�N��H���h�Ÿ���6R!���9i�X'�c�_|�/8���\s��Cby?�骘12b�&߼��qk2�7x�:�
`�Z�`��go�<�'�\�� &_��7�t&P��h���뾖�z��
��6	�b�yEp�y��s��C����'J5������o�q��[���R/���H��Qh�g�k$x�ރ}�8�k|���]8���;ޗSS-�<�k|�
�i����M,쉦ެjB8|��OI&g�� 8%�
J�1�5
�*�Mf��r��7�!"�{U�:�N+�8�jRN��)�f6��w]�+6M�
/[U�hc��p��s�s�
�ٸ��_8<�S֚x���q��|���I=Lz�X��ɿ{����*����T���)A��
""��
�IT=���t��f�h2
$�����&b�¹�����棩0�;f��ŏ\��`@b���QGo��~	��ɖ=����k����bS�k�m#�2����ˮe�MŮ~�hK��ۺ��0�m7}B�S����Ӂd8�W�B&�|����]��wYi�/M�i
�y���K���.b�_4�Ɓ�	���g���+MqW�;�PRQ)H�2n�z�k22�X����i�ʍ��V5�Q��ѭ�W���5��ƞ��o���g�7�1�o2�[���6k�H0��7,�0Wf8�8�+��^��),�cy���������6R�|
~�
��ǔ�=�5�{
|�9��%p�+���a7a�A��?b�&�y��`�g���U�V�[-�k|C��sr���;�?&�*���Ӊ���2�u�'�E&��n��׎�!�+��5װ8�#ac�i�A�F��ߘ~���x����v���*��c���j� a���c}��\y��_��;���#:nz����7�����~\�����f���-0����L" ��)2�oŒ�k��Sk���
��,�[^@~v�\���V�^�s��ZS�r��I������N�>R�MX[�N��.�J���󐱰���b�}���ݖ�G��J��)~���ހT�9M��H�5~��F.#64v�iu�q}x6O�y��?3T`2Џ��V<R�e��ZXm��<_�����qg����Ԑq,�	�3��wK���8�x���טZ������� HL鐽�����=V����"���˻����3*�\k�,�]U�/���{R�G��0OS3Ж��8s�
dDZ84`~�/w��i���}�?�n��tW��􏛼a�
w��Q_es�)3��HV̱��-l����w�42��.}PU
��⟘������ Jz?x
l\y�pM����ظi�wꁋ���*����=�'���zy�A*e4�
�2}�~�E8��A���B�>V
f�n��8k'�s���K"z�	&��}�P
��=��W�ĥ@!���2K��%��#�J��rt�Y
C�5p��xg����
����6{�\���c���J�$+��n@[�@�*�އ����<z
8��ĵ��C7�殀�w;Dg�*��/)��!�b�]�TN7��v���
��N�?ۀH��4w�
q�
��|����BS"����N��c���ؤ��|�{/��2dv)�S{A9�y���<��P��~�=	�AL�2�r�ѝT���e��w\`ݥۜ�w�Q�&��|z
����W]�y
�Ks�6/[�ŏ����$��O��C�����#�������#_�����i`��u>X���]1��T�I�����5l1wl��L�̚"2#O�ﱗ�tee��y"v��;�'?-�<|����jY�L]vQ�ga�x�`�2ݡ�;�����:�"���m_FM�DU|
���s�Ō@\��A1�v�-�F��;�}	�'MPڧ��a����������_L�v�%��'�������r����[v����#��nw
���~�jpsLs�mg�
���%�|N�ڸ[��˳u�zH������M�%䉂+8�]NLB!��p��+�:v�?�C��2+�x�#�cR �������"����i�[,���,3��|
Of�� ��)�[��$�l������+;�CYM��������b�q	`Ԕk�_��>N�w	>�lG��^�>�/K+�3��SE���c�|�v�{��!�;�\���D}��C�7���́=��YX���qL�j�쵞�3�ڋ�7b�k	��̵~-�#�ܟ�M�Cg�%��/���֙�>Y��S3�y������,ӽ�rQ��F��q�^U&'m��)��d�3{X�q
�׾?�*+[sŸ�ݖ%�R��w5-)��4���%���>| o�����(=�w�`�HD�
;-]`��l'O��V2`&�\u��\Ԙ�T.�W���6�b8�9�8i�ˍL��#C>6�2�w����Jh�8Rگ��:�E��Y��W������J&l���]�`��l3w�m�]4ZR�q��Gd��D{�"��~�n8�D���D��bz�]0�AHfS�?�,�;&��e������%�^�r�������=�<dyO�&'�����/v&���@�=�-�vZ'~p�
>����R`��(�|#�]�ifA�b$��x��<�	�9Q�P�/��#��?�`�����3���2(��׫�n@_�݀i�%
�r⮓���)].vs��Z�7ݚ>ٙ�_�:l���2[�Ӿ5�B�|�RQ�h���0f~*k>h�?6Y�wo�5m„$��q��Va�����LBkƁ�v�4t8�/�P�v�A����^��*�
���+k��EM
���A/��3��u
�CYv'$c�X���KB[F��yo�@h��_��I�������w}�Uu
�$2���|��9)6U�wX�`��
`\��CS.8��֚��c���;�q'�T�|��f�}��2�V$0�#{�#1���MJB[���>[dm�����` �ȷ���pO�,w~�d>�Z9)�&�a��/vS�Ж��@�s5�_���>֯a�����5�|s�V�9���QŃBJk�8��1�9�����Dq��T�AvE
�� �����-�Y���g�!�71�&~m~�����MHB[�g\{����N����RM�)|l�
~vJQ�$�|\��Մ�B:���tצ*b�"5�X�0�,�d`Z,S4)�G�a\���,Ҹ�-[��f٨�s������&��I+��8��J���U��؅ϩ��]�':��h/{�u
���H�+"���`fnMG���L��'�1_�-��I>��N�����'�t&=��Nʹ��9����?(�Io��zDqo���i"�z�>LG�!��
��x>d	��p����Ԃ�������$���VJ+.[BHV!\w�N:�@�;�����ƵC:�X6ĴS=�VP3 �ݪ��I�>~~�&��$R쒟up��N���LxI�!����*���F�b�4�T���f�J�'#�!�|��>��#���������M>q���}��8ɗ�_�Si�h�vz�"�̶ۓ���ؗ���m�т�p�ɫ�(�|�	.vs��^a\�'���|���:���+�����1_��w_×�^�쵿>'������y#�g��}ƭ0:vàF�b8���_��w0�������ߝ������٩6���7��on7���_�aƯ�S]	�OO5M`���M�y�+�'/��k�:CO�3Co��0�0搅�$��[�'�]�$�ø�߄���=a?%�V5LP�I.oa�c�b����$�(��t��}*�>8�|7G�m����w'r馢�O,��h���C6ӈ�v'��oO\�3j��p�yF߉�:�Q©���j%H�Ƶ�	/�{*����#*��~���X�H��
W5p~C`/���*�0��B�qa\ۻCSpQ���:
϶���+��Ec�ym��p��[��5|K~���fC�\�k�C�.r	Z'�k�A���N��C*4�@z8���;.+��N����p�C�Q�8���&��%ʮ�u�[��I��ǀ%��y-�*	�	W~!v�J�ж`\��΄:4mF��v����0�Ќp1a��%Hx�`\ۗp��'�"	>�Жp��_�]4$�_�~�lӛ{'�	���r
aa"aH��<�N�����n%�աi��s�_�}��>����m�IEND�B`�admin/images/icon-search-replace-wpcode.png000064400000004003151331545640014676 0ustar00�PNG


IHDR����sRGB��,	pHYs,K,K�=��vPLTE������B��u�h�e�i�w�G�����������t��
m�o���������)~�8����&|�<�����l�q������c��u�'}�i�m�T��g��<��f�e���7�����=��W�����������n���0���g�A��}����������s��1��2���������3��s������������	j��M������(}�e���9��;���W��*�%{��������S�������������$z���u��n�������6��#{�������g���j�C��z��]����;��F�������j������q�������!y�����:����V����[����${�����|�����*~�^��M����D����#z�����f���?�������������.��b������R��+�f��L�����J��J���R����?��U��n��H����E��`��N��m�l�\�����>��m����>����4���������,��p��"z������6��p��������o�	k�w�-��q�7��Q������j��6&IDATx��{PTU��OF��	��8
N�:��\�����$����j��1cL�>F"b�@G�itH3i��i�ę]���kz��JeB=��v���{�a�{辰�����������0�@�Xe���b�2�\�(�"@�n��?b�" �I&�s��Q���4���) �m���>���\���/��.b���&\N	0�<��11�W	0�̣��%��9�2`�0�����g}���p��o�=�L��o��|8517-
]�~%*����$U�
0�Y�%�`���:]�g����Z����a$�?��%+x���N�
�>8-�����f�d�#�f@'�:h��B{P�.^��IC� �sHQ˄üȀ�	�<�R���Xq��@@�P����OM�	 �����;{�7*	��xS��>΀vi���uӨJ-O�’	o���ԝbӳ�E5��^����x�y�P��W�*���5�[�Jp���mĚ&���A��R��ȫ�N� .�y�ǂ��W�M�@P҆��k(|���^A�/��粭H1��ܡ@I5��F���*>/������Z�J�������hײn�v�	P����Hq�&>[�I��UV��i��+�b�%>����_�2e`K)��6J�����[�����4�	�Y'^\��f��^�C�/�8��	j�O������{���Ѵ�4�Ux�5%ү��k�;�8Bh�>E�.��-�'�`��Ch�8�}�G��2Jjj��[�s�����R�����U�G��IM�t�����Kh�vN�?%�������9���6����L���uG\����J/������d�
�jGOG,�V��&��bd���g������l�S1n���M�O^jC�(Sv�ށ~E�3�B�S|0��m��.˗��x�YG�8�낾+*�)��I�\���9kZ�:
��ղ�n|q��qG:�S�p�Ryq�	��R��֟f7tý���"�攸5y,G�����:ۣO�.%L�c���>tR�%o��==/��.Z1�`�\��5 �b%��$N,RD�\T�1�H�1d��.�od�h�]��_Y*�h ��O��4�֫ ��%&�w77��x4�?����j����n4��};z�	|���?�36�&75���uD���Z��3&��������c���������i�IEND�B`�admin/images/sr-screenshot.jpg000064400000233724151331545640012424 0ustar00���JFIF��Compressed by jpeg-recompress���


$$ && 9-''-9B747BOGGOd_d���


$$ && 9-''-9B747BOGGOd_d������8"�����$TF�pS��7�l�������h^��\oG߼�Nߵ�zN�
�\��K�n���o�V,l��s�!ߟ?L�}'�ؤ�7�F�gL2�DfNj�_A��\��R|��޽���W�Z����
�_V��x��yl�uy���q��i�M�֭w�D����w/�w�[[l��$�>y��_�~���(������?K���︽��`�����=��u�?�{o�Y{��v��n�)�o}/S�tZ�}#Ţ^{_�׏��=#��+#�[�w�V�ӵ���~�����|k��~�y�o�h���]�/��zEܰ_�G�]ΓS�}�W���<�`�����}��b�N��֟�iX���{�h�;ǟn�(}>�G������:�ߠo�oҨuOK�i�/G��������[a�)-�#��Po{�p,��ې`���CP�<��v>z޶�Μg�zb�h�5}i�`��נo���n�w�󍎣`��ڨv�b�-����f���C��͊tM����}b'>�v
���G����əqlt�YـǖQW���۟�m��]��4�x7?>�4i>��ޥb��M�[2�V��`��@b�+�M�I2��
�Χ�o�T[C��LWzg��Ɓ
����]U͟�ǘ�L���`�-��$�
�}�cM�hmvޚ��n�W���oj}���f���ֶ�>�i
�)ж�x�#™G}�.�5�|Rlj�ͅ�$��a���:w����`�f�����0�{i���f����{�������n��,�4�h�'�~^�r_�2�(��,��=
�I��K���4��:�r����8�u��
��8�V�a�mK�������=?�7]W�������;�μ�l��]���Q�rj[4�=7Բ�W؀*���B�r)��\S�+-��
gf)�TYn��G��xMs����l�i}���t�9��U�^yiL�nnl���*��'6�?����p�*�����B���SG�i�3�f����^m�s;t�{@��6z�83�w�Rx����Ts%L]��zL]�Z�2+�sk<w�ە>�-m�>�8����G�h��Ra�C��J����)vZ{�u�OG�Z�O�_�鐻�q>�Q�sL�O��v����^q���;S�yOҪ��/�i�b��ү�RlZ��N�o5��i{�I[Ʒ�]��\�/�-�)8v˼�!�#\r�s۴Y�2“��VHS"���>i�մ�s���v�����?=\��g랺��wH�"K�;
[�q3�2>xs;t�_3�\�YP��@�V,y�̋",�����0f
;>@q[v|���8�Î�n�mI��|]��.�����_��NU�}�CYe�����Uc�)'�"�
�æ��#�Wi7�=T@���E�u�M%ƭ{��� $��?�o��*�ւʻ����cW�8��I<��P��y�kWa��@Ic(S\�5������CdϿ�VDܨ/�ݎ��t�sj|����2�����$�|�k���Ӡ��N��+�7=;�m�@@��$�Z���cбg߲)'�YÖ�K�o�Q�ŭ�
�0dXX��_�=�Iܪ�O�='�o��J�g݀��m:��a�]�Fݴ���p�RO ]�)'�����:����U�`'��8�bɏ6���ɏ&>�r��ɾ��<�
+�z���_枏�yF�U�Z�?��C���`����C}MM�(6�S�s����'뾍�[F/[�o|�be�s�;OF��<[���Ɨ�ʹm�T#���1�	�Zm�;q������Zv���ν��߫\�Z�ˡ뾥'D�4=�.<�:�=����qd���&���˥n}]�-��F�2����~��Ij^�����Mƛìz&�<�N����N��a�/P�G�SȠ�#j;����>��]�i�v�U�	u_�QQ/�����2꾅�@`�
[�����V��LO<�{Jío:���2��Kc�vp-$��Zk�GJݷM�K�w}ξ�D�K�O0�Q��y�[w�Һ�ﲀ���~q�ś�H�3a���3�2�;���n��!r&�1`ϔ�q4�(�	�0	�0`���q��L@��!�L*��稫��j�]5��2�l���־���!���j.(g�
fl'�d��M��o0	�W�{uUT�Y�&���I1{�+R��o�Ƶ���J�^q'���.l�j^�C�p9p���v���^�t��Lp�Wص�{_����n\c�׎�0	�0``&�3�A����L!��C�C0�0�`a�-5�`㓎DY<�`&����0���z*��֮^���s�+���`0����Oߞg7&WZ�]�g�0àz)
5�v6�'6)�;L�~C1EU�^�ޞge�5�7{:��ã�0f�M�C0*�����0	�0``&�3�A����L!��C�C0�0�`aӶ��^yT[�׻�q�e��G.����œ׳�C1��ߖ��s�ߦg^���aY�g~��F��j�yv`
_^���)nk�l-k	�z���S�Y��Oi6���$K;a��<������f���m����j�4{�z����j�
meü~��o����!�K:��V^3�d�.�΂ҷ��i�1'L�]�ڶ���!U�@&*�Z���X�Įd��k�l�U�K��6�b��ڦ�F�G�`C�|��9�8�c��P�`C�Z�9��B�0	�0���y�L!�L!�@	�0�@;���,`&�&�L!�L89`&�&��[��3Kj�;`Z+�Ƴ��|����u��(�b	tSno�C�̨ٚv�jn)�zާ����V��I�U4w8r]���ϗ?9d��Y�]��������s�v�!���uM�]ɧ�ȕ�O|����U�ݣN��I�u�0�Wi�ӯ婗,[{�:��f^+�sb����=m��l=4]���$�]s�����Y:J��dJ����0	��:��L��9�0�``�|�=��p	�0``&�&;���;�T|9k��5�7��>�O�y�C1U�E,݅��.��v����]n*�܀`
o���SKkӽږY=��l\�8�&ـ`&5Mb��}ѧVH��g}+r�m86-v�gC�t�;�~9�Z�����f�����Lq�&�����E]�\�*,�E����```&�&�L!�J���8�ŀ>P.@��X�`&�&�L!�LY9� 0:��0���^������t�npu�/��ƻQqC?py~��H��b�!�L+<��3*��Bϱ5�m;LUT�0ֻgY+}h�z�s7%��@�&9�
�Jţ� ��c�:�Ůs��f�`�`��	�0�@{��,�B�M!�t���;�:w��׵T�:���]܀(`ƙ�;c�� ��f�����j��L�m(��2��wڶ�
g��Ѡ��O�@5_':�v�5n45�\`�m����,sӀZ}"�� ���f�D����k�t+|f����w�ОQ�{�m&��a��i�nz�Ѣ�ŧ� ��{��iר��ۅơ�Thz��_]k9���dz�����_{�K;
�+��N��ŧ� ���[Z���E]�������(fb��^�C�-v�\����Z�kMy���R��
W��� π��@:�� j�@�������pPデp�8�Î�	@8q�qÎ8&�8��8�uq��Yq��u�x��q���8�:���N:��8p����
�>x�R>�@�Y����NG����[5&�M1���8mu��<�����:Yqe�.��m��cEg �O��x�}�H<��(,�� �@� �% 


A@	DR(
 ���J P�@(P �K׈���(P �@(P �Mw���@����@�
P�@�
P	����7�(@ �(@ �k��@��@�
P�@�
P	����(@ �(@ �k��@�
P�@�P��r�=�K
���S7;�Ս����/;�����&���^�?ɀ{ޖP��xԲr����`����������~Y����Z������j�ʗ6�E͹��}s�^��4�;�YU.�Z���>_�>�`�@��Y@ 	e�%%�-(�X*P@XQ`�(�X

��@�P� @(Y��� �^�@(P� @(P� �>�@(V6� @(P� @(\���X�
��@
��s��� J� @(P� @(\��R��@
��@
�<�@@(P� @(P@ ��H�ri��oY�5����:�I�7JFo�g�p����ܕJΉe��:c_h��H?��74` 056Pp7@!�#1$�"3������c��Vd�N>jǗ�X�_5c��y|Տ&Λ<�z}�YB�8
�]}պ����g��i���~ޓ������d�Cc�R-:q�>�D�9� a�W�9�������[!#wM�)���A���vYYǬcK�.���y�~��(5c�Iɱ�bg���EI~2g�W����r�9Kb\?�[��]=���z��{*��'�n��07mӉ2�o����&�
@n��)ōj���?�Q��8�k{��3�v��s�eY^K�Iu��mn����Q6N$c�]K�}�����mSh@�`跅��x�p9
	����R�V2��|2���w4��#����$['_�G's��	����=8�]�t�Mæ���g��[ڙ�v�N����l���m�cZ�gp� �eo#y�wV֩ĤcBPnl��Ym��n:��_�{Jբ�5kL.g���|%�\7v�����m��l����8�n�b�d噺r�9���T3�`/M�FQ�X$��
t�.�qj:��(گ��[u������s���V7�Q�`3n��hH��Ne�9�5[D��x.�_3z�A���ȳ�5=k��bN�gwF�l=S�C��{��7��._
����U�zO��v��d/���&v��ř<I��妅�scl{ e�������/���#��/y�Ƶ,|S�<tba=��X�Rz��̇,(,��"�J������},��Ÿ+�\9w�4�b�S��0���T��<7��.gg��ʁ|&v'��KPG�)���y ӥ��e�a����cɖ5{��+��!��3&�$��,�E�OU�~��V�P7���)�yc����Xl�4������	H�\k�Ά�x(��[?	Y�ܖ+�v���e�d�S2���P8�&�P3���};����s)�qJL�p^)>�>��`�29N=�U��1)I�X�%�o�s+�I�Fn���}�왋�Ym)�u.|]P��n&�vt���V}�-o���m����2�dϫQ�����g�I���@i�1���J�1}d9 ���ڶ>Ӓ�9����(.�C���s�&G�H:j��r�uӣ�G/���Q���K'�AGOĸj���o���B�};�� �u#��<�>��07Œ�!���o*��'�齮�b���`y WQ�la�Ž�� �.�hh�R8�.O=Y�
�`�G��ss�aD�fa�em�����2���I��dpΙF0�������$_��L��/1��2ޥ�lKo�]�,
#�ˀ'��$"H�1vdm����]�Zytk���5WT���>�9�$Fl��0����F��wU<ջޮ�����Ѿ�Y|v�V&f$�aq��2�,�=��~�
�V@�x�vؾW
�d�VeX��&?�
`����o?�0�v<��ؙ�J��"�r8�b:�Dg�ә	ac��Hr�\�s�|�{�p�����o�s+��m!K�2�r9�����Ay��
2ɓ={��+m��m���8�9�g'oJ#j�+�����soL�}S,i}��(���s�O�G@d�Y#!�`��f@�ìs2m�II6c��C��\�|��vM���N|��Y=I��ɼ�8�~E�L3��pX'鼋U�!��q5��w���������o*��&�,~����6L�mk�20��)9�9{���"r!��=�2��X���xh��W��/F!n%j,k�ūqYd8�>N�I7��4#R�V2��I���cȡTv;d�+0����襺Q�ɹ�ȱ�%�f��{����"�Rl�>3���X��7��ra��'���i�pxޟCC�V^5
�s�%��m�۬���1�"��Ⱥw�dnj�Н.ơ�
�z�� Ӯ��s7{Ls�Łx���Ň'�&�$��L��r.�b�`V���cj;�2sԡ�qHl\7�7%�`r��w��%�8��)JR���m;�1�Q��=�5�t���Q�r̮	���]��k��|%#Z�G��y��q���Q�ƀ|��b�\V%�Ւ���dvR\�촖�e�],��8��At�&�Y|�|k��3a���-l+�t���l�`��c@�e�`���x��0�3e���l���S�j���[R����@��U�zM4|�*V�!K�_À~���P�S��,��m��͑��܍ԈB&�!��v�OZ���t�`G��~@�W�
�!_ d+��|���K��<y�U�(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(�򀼠/(��HҜ ����m�����#�C=a�Q|*QP�~�'r���|��R�R�7�|�gޮ]��8�0�柊�؉ō����Ú~O���ںy%h��P�����i�?�[e�_|t�	 �V_Ц�ᄷً�4�d߸�`q�K$�Q��cb�A��]Յr<�#qc2�]A��y�ԗ�D��]C��RqR�W!{�����?ã3e�(x���4��g/��nz8i+�
�8\Uԛ�X��Ƣ�"�qvyVW>�ܻ'�5���7&���`
�p�K��~&g�x�fQ�k�uv
�t�`%��� ��X�f���z�W���m�� ˫0n\�n�r(�v:��0�C�A�V��+Oǀ��4��ۥW�<6�+f�a�.���\Q��9Ȏ"	�,{#�yL[��"]@��`� �mk�x�AK�+kY�Es"i�x�=����Z�)���+����+���}��t�a�¶(���#g1L��jx\�2Q݌�9��%Me1Ѕ��̣e]�γy4tGa��h�WV3�{)����X\�>]ׇz�\��^��|������ϲ�o
=���b,.e.�þs'����l�&e�0i@eF�Z���1��C�籯�����ً���g��ۉX)�z\��_-��=V+��-[X�-?�@r�+����&7��J(̝�/�BI�����t�����	��P����
/0�����i,�>5���G�Զ��M�S��>�U���Vb���u^���b�"�����L��q���t˶m�u��8�}�1v�&��0���砅m�G

��t�M:Uuk������zW�{�I�G�e
q	��Vt�Lj6rK+�.8Ʋy�Y�Yu$MԠ��'dz�ڴ$�P�
�~7d�T����Sq��0��3�a�	�s��ŏ��!��B��=�X��c�d�Qme1v�2HL�m��J@
�H(��?>,�RLE���𑗽�W�y���)e�e2�6E����02k��mG���q`Qbu�ev�-����s���<d�r̟5gQ�9���<�"<3�Q]=n�ӧoύz��%�c
;nP	7�CjL�K����"om9��%KL_\�����[���3�E�#�;�i��E������˺���ɟI2x�^�r9��2zۚcuǗ�dfc��>�~r�$��g�L�>������R�֕�%:��1��ˈ��5�o��㯗�n�)�LC���a��J���9���T��Cd�Ƚ��)��s�ۇP��
��?f�k�m��*�m�u�ߧeF��\�d�n2e�/4'r�Z=���m%�Y{��9h�q������Y����1���()i���!3|�S>�Z�f>^��3eU��a?Vm�K��FD��Y��`Y�~5�+��b&��� #��������c�ӫ�%��c�_�M��,��ra��<�
i�ZT61�7q?�6`{��M^���G�V�>=�2��HՍ��KH7��3�[	��Q�A��'����&!�F��l�{�u�������T�x�ڜ���ۘ����5���E��vQƦ����8�b01�'�ls�����H�i�t;��cp_/�#E��E7�s�qW�by�7�(񓦫��u�Ѧ#�O_,�W�d.�������l���'[V+����/�<�k5Y�7ϒ�F��I3�� �2�Ǡ������$�L��#�~'�ɶ7��N&�q�Ƚm:������q0K���®����dX�y���KӺ�.>A���x�ې��|g����C8�"�v��";���k�A�$XEbV�I'� )�x+�(���aq76<
c1J��IE������69XW�.�����ܑ�&);���U��3��L`0�
�Ҏ�F�r'G�i�lk��gT�)JR��cFA9�W0�//�� a�`���{JS��{���q��>8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W��x�^8W����S�S��Čī��XӰ[�0|�I�g�#?�'"���,~2��K)�9���<�]��q��=5�ٹ=��F��*ZF�����v�@����|i#1�w��W�BYu��1�)�TuN���=�e7�M5�1KK
�d9\}&���(����bfO�r��5C��-c^�H>e5Fи�Od�l�y�2~�ͻ��Gf��a���H�0�Ȱ̽�q�G]5�w?�P�T��1�?��!
����3�26{	O����DA�b�}P� ��0c5=%�`p�k���]�t�.};���#~]>��Ll���
��W��q��r*�c�IӜ���ʼ��b�����m�I=1bf�NL+;��rAbp���E���~)9�:�a�)��Q�r����S��|T�7�:Orb�f=�0���CR@��Pe�W!����ʘ������Q��#����,b$%c�e��	&�u?��"�?iή���"��:%4F�,e����܂�1��1�9l&�tU���1��~5��Z��������YAs��2`���{!:�,0ด>;ҹ��Y�C���E �>1�vԬ�\=����8|}�~)Ls�$�pЯ�3����kd�;�4(g[´�#���C5)���!���`�!�c����;��vi�Y�u��3�4jV�3#��cF=Hw��x�e:Q��<#�.�V/����`�9K��)��c���{~=Ӝwuk�O`�9�Ygrqᖏw|g����찖\2Ht�v{��?�x� E�0�X���6�A~/��bW;��O�Ee�l7���Y��w��./�+8ޚc�y'�����N3��w�vX�~����k�I1vg���a�x�^x�/�村�1�Ə�6��8l�6E�G�Ҝ`��ۭ)ZV�e[�a�F��f�
�r�ZU�;Z9qJ�k ҏh²�`�5�ᙘ8Jǹr鵥u����ٹt�z��>$�X�CI���'2
��5�JYB0e��l�$^I6���7�8��4�Wu��R�N(�~{��t���˂<��s��
��\��8YjL71�a�	V����ܷN��p�D�z�x���e���b��G�ŻP�&d�k)%$�V�� {1(Ք�3Iz�V��=]��9�@�$
�~�rY�H�>5˙�z�:|������$�d�Z4eGu�!G柛vqN�)֍�:L�b:�B�y��-��x�N��k�y%��P*�
e��mM��ЏZC�:|�A��	��w<�!��4������k �$�rك+�&�f:��P�K;K������%$�ðf�:�U<��
�@:Q(�2�ʳyn[޲7�Ȭo	��-�kYNN�Dk�
du���k)t��G{���'Mb���[-W��(�SOf"I;� (�dI�ŵ���[Nً�����NA���ꓒ�q7l;8�gۼ#yMO�u鐒O��Qw�*|�G��j��D�]������4lLyrrV����X�S���(�`�jzH0�߂$�mcܚDd����d�RLč�\I�0x�WV_V~��'��:.x֏�Y_X�9��$E�1�k�xf��4�ᛶcc.���*j]خd�9˙�z�:|�e$.�<Q�Nc�nY�Yf�LZ0zl��|�nd᱓h�G�q�/dR�M^�
4�3xB�Xŕ�%��K���&�+�x�qpI���
�����<�[i����F��c蓲ԇ��ʽ�`�}W��>1t�;镚?�텐�R1���gR��Խ�^���IV��#D���z�NQ��`-k��u{����2B��%��7]%1#lTq�T��ml���jA�(/o�ѩ^�˷�8�^�#ۜ�o��������{]�!{Y��\�|�寯)���rX��e~M(Ʋ-�̹�����.f���_Y$Ż�>��d[���L�I$�oĉ��]D����o�H��q�vL���m�[&�T��G�-��z�	3����"���h�%��
��i�[K,��d��ck(�>��S�k���e*،��
�'�k��b�o���Բ55�<��r��l�$�6B�Ȇxދ�/d=E$X�l� ��*��,$.;WP�U>1RJ>m�4E,�[�X[[H��K���z4�i��,�GHF�cɱs2��5��4IbZ�V!ȱH�kxp{Zy4�cu�~��(�����e#W#����<�d��c�8�%�˿o>Q���Y9�Yh�n�QvD����j�V�o=s���F�^1���8�L}b$lr� �t�х~�jf�P�߷ț����,k�|���_�:�2���n�a���'�8���1��^���;1
\ɶU8�h��&S?r�+@�7�@µa+B47-G�lXe�r��z�d��
��i�[K,��H���@�\�-���*6}ձ�,K��I��j��Ecj�ۖ�PlE/e���nV��Hb������.(Ie���$<�L ������.��<�c#3���e�+U���5��;��He���y�##2��i�-V�T��5;bF��N"��?[��b�I��1���{	��.����M�;��f���b���^B�Ѓ,���
t!ݶĥ��N5tU�ۯ��[n1$�ml�>�/Z^�o��\����k6���W�s�M�������3	�|ɓ���hI"���ٸ5C��~Jj�:.Swt8��ؾ�(�s<��N:���4��6;f�f,���'
;�����[��`��3�!u�Ǵ�ctV��p�5�ZKke�lM�+v筕5��}�YxB�@f�l���ٸ.%��	e�!"�h� �0�h��6=�X!t�6�b�Z����8�[6oq.��X{�Z�9Fq�n�TcrP�S��޽�+{b�m?�miJӊ�2���w4��Bl��d��)GMڶif��7n"�+f�w�훺��80B�w��m��e�6wf�6F�Ye�Z��h��Z�V�,����d󶮀�
�A����6�`�[��mf��5ye,rݣV����l�7���v�=U:�`����G�o�66nk�B����]���:����J�G��!��;�O��Y;;5^�����f�ᕼl{K�7F\�;h�,�[�<�tl�5��l]��vˬ ##��cr7nR���o���8��w�D!�C{д� ��"��F\��,��зa�`T�����`��#�Y٭n:��
�#<~)�b��� �k.[��4�cr�G�5�Qv�ZF��p�'�ȸћ}�lݵ�X��� �61d�`�q���h�v��/��(�;�!v�WFF�"�7n
�P�&.�T�T�����`�����-��?�!��ԥ{{λλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλλ���Q�^L��#���q��<�QǗ�8�G_(���y|��/�q��<�QǗ�8�G_(���y|��/�q��<�QǗ�8�G_(���y|��/�q��<�QǗ�8�G_(���y|��/�q��<�QǗ�8�G_(���y|��*�8�F��u~���Ymn��,� v�X�?�ɖf�S� �eo ����1[[�#�R�m~�3�ڭt���6���0����E����et�jB�<}L%�M-[d�L�z�CҴ���<�v�z��	m/���?�����n��촖^;�
�aN������|�U��Xv�1�q�YC+��ń1�i�'Q�!�OG[��`,���6?Vqt�����M�	WX;z�t�.�ﱖ����B�D��k(|d�P�\LYsg����Y�6l3�%4��F�[�A�\�s���M9DZ��c�^�1���9����Eq��V4���b�k);�eMf�M�J��1'�E�Ȧ���31�q9��R�����&H�����k�c�'�-���|����.|�|kw.����[zz��,vл�۝�3$��QM�
-�3ܣ	��a0h)jI��e�e ��7��?��H��<v�8��L?;Fp9VD�G
�}724�sn* ����"a�dRG�$�;.��0��7�D�FN�� �c��I�u��Y�/1�cN��"w
���I��U��a�B=���9�����s�	�#��}N���ZD�$1�w�`O�<u�c/�Y�<�6�kˡ�@��?S���Y⹈��d�ٕ�>T�9do�Y:Ƥ񌙮o�0ȱ�L�r�7/1�Bd&��㠈P��@0j���?[�����n���fpy�e��kEm���j��,�[m�S�U,��ִ�rs����{�<�`W�3}	�C�����yQ��AO�i�V��i�V��i�V��i�V��i�V��i�V��i�V��i�V��i�V��i�V��i�V��i�V��i�V��i�V��i�V��i�V��i�V��i�V��i�V��i�V��T��8l�BW��ϤFʣ(|���ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
ݐ��
��
팈�T����2cɫ�ol��?��L1[��1ɢ�e�ķR3�1N��{�L=�&A0[������!�g��=�bg�)�'f,W<�k��vüc|�攲&rw<�)��J>�=j�"��U��#��nQ���f�k���fS�V\��B�:����(�[c�V�Ϟ�|�
i��[�y�s�)�z
y�9SL}�D�cd�f�&f����>u[%���O�yg	��p_���?��sJ�h�����S_Q��5z���#_�'?[���	���)%ـ6h�'v�Q�ר�D	\}��>v�z���:���lncaF&�e�,�i�0Q9�&[9��Mx�u-��Sgckf����>�dx����vTL���i	�@Ϊ�q\v�bï�w0���#�C�X.������#�l��4�q��c������n���;wu��%-��')�2�aYx���Լ�I@b�NQ�VQ�qzw��R#,3�/�G��3�!1�	�1���W����2�e������	}����z����ֱR����߰�js�����V?�)>2BdS5�18��]��8gv<��&�=J7Lzm�厫9��ϝ���8�NIp���=Q
�=��d@�O��q�n���cr&ց�wM����VA�����ϗ#��V?�����(�Z>2e��'0XI�zw�|d�b�i�y+Y<d�l�f/��[��<lm433�J"&Rqb��4��+fK1�ɞy��ڸ�f6�m��Z�cz�)i�K;�N�K�����&9�e �5r8�J��M#)��kf)}��n]V��Ϣƣ���	X����js����?��-0��3'�-��&�$q�F1Tc&�ƽK!}E���r���d�F�����Ӧ�kX��š�X
�2��ߋ��b��]gO&c�v�8�:���&��N~��y���s���^^SC�F���J/����v<�nǗ���_7c���y|ݏ/����v<�nǗ���_7c���y|ݏ/����v<�nǗ���_7c���y|ݏ/����v<�nǗ���_7c���y|ݏ/����v<�nǗ���_7c���y|ݏ*eX���B�ɊB��%��l��\i:�Z�t��k�v��k�t�'^iC[u��K�����e�%o��Ûd0o��)��.���N[��P5�)J֢p���l��\
�R���de�Т�:_�X���뭶���)[�u��mn�.╸(�},����
�֖ҵ���C*�"&Kfs9��gc�)��a�`���ՠ��}�[[���V��g�?�~{�]V��,����	�@�m�����(*�PK���(�Nќ���4dІ�5��Z�b�v,�]b�K;�3��F����ϥ��!+���`d��DJC%�'�"d��#�A�Q,&J�_SouG�69���2��;�J�';�������sb��X6[��s�'��wZ�Б���V.q���,�b�1�if{��`�4����nd��d��[5���Նũ"|~ ̟��Q���u(Y��d�o�[o���۩ZP]m��u���E�K9+'�����v��`dh��<�ɹ�/k�����0,L�k��Kcr�F�-28�%�I�M�JqJQO�H?�v'q�u)��z� �Ѽ,��L��,qb�d�,K�Aɱ�A�F�S$�z�L%㟓��o����EіN�&aF��{�)�gXܒ:@����S������ȱ8�R��bc�62�v:�L��+�3��%�с��v]�72{K���K-��}��˯��js���Jk,��xҎ-�q���~a'jv�����e��Klfҍ��~����/��/��c8�����G��rF���8|������e��?�����)Ix�V�u �]��)Wޛ���'��FQ�V7��}�J�� �Q�]=.�"~ᓾ�{�U��o� �oq)ZV��"/��4�4�6�~����k5�{	s�Qo|��Ӹ�e�B��8Gf�$��,Ss�c	"a��¼������n���r'��\�[u�R�[�d2S�&���u��-��5�3}kKn���\�0r�%�d\1��QR��t��h��H�5㼪E�L��1��% �=si�u��ˆ��Eʛ%y���&�R&P����;��Ve�p�A���R����0��Fp�v>��n�6��n綤/��d3��]��iB[*At��+��=m/~?9d�	�jS!�??=��
�&�X�Ȧ�2��Q����@�"o"ȧ�6�x�'9��F�Y[9�3#4+y&���T[��r�&�(:�9�u��d���s�`�ey��0����.��=z�g�Ű�9��W+�;<v�H�x�^:k'�޼�qb�np�?�uBWņ}�2������Ce09���1��#)t��t��-���k�{�`��JҲA�AO}��:i��00�Ň*c�8�鑮s��:���֭�ߎG�h��yt�[�;��J?F~���Vq�zj�w9H�睆y9\�5\߀��6=)cי+.��d�8X�Z^�f�Ȧv�3���������P�;�ܾr��W��V	�l�2�s#�Y�9.�+��h�喱`q�=���!݆xq䣏�c?��Y}iH9�Of
|t� C�F���,�������C�)�V=eS�����7Z0�Fj�Y�u��^��7{f-��#�$Ԇb0>Zw1�`%���M�G�?�/��j{[�����c�\��ZQ��vĸ��ltvf�0`Ɯb� ��)������r`��8ŜC�?*u���>�Q��@/��@H6I��1�e���~7eֳ�,s��Ȇ4��gRx��l�`�|dY�I`��r�i�a-���^֐M1��z�*���K*��/�&�쎺`�DԒ?����s@��ɰ�ǐ�,�u+/��5�	�JF]"�d�n;=&�3�����d%�<zb1�H7����p�w����A'��Ѱ1^Ǩ����A�l�Y��.��8�j�z����@���W]{sYoO�$���I�&_�K�_�c�3n�1�L��2ñ�v�O�1jA�2@J�1�qJ8���e��3�H?i�JG�*C��
�q?��b��@���
V�yՐ���nj�<$5@˨�0�D5���$%�\�aL"\X~���Q�M3�,�e��2l���M�Y�5�a2lrfVؙ�N����0�[m�[m��
V�6��4�L�fT�`�	�S��ɱ���?�1ʯ�u)?�c�Q�dVIB�g��]F0�qY&-r&r�Q�A�m<K+��4��\F�L"�������=����c�q�#���O2��\lu.�k®�2��\lu.�]�f�Z�2�����tͣ��v٫fa�
o����29�o�!A„�8��l�[�٫fb�-[G0gyH��4L��#��[3��$3��t����[��C�ә�Nf�9���kә�Nf�9���kә�Nf�9���kә�Nf�9���kә�Nf�9���kә�Nf�9���kә�Nf�9���kә�Nf�9���kә�Nf�9���kә�Nf�9���kә�Nf�9���kә�Nf�9���kә�Nf�9���kә�Nf�9���kә�Nf�9���kә�Nf�9���kә�Nf�mDR����R�A��3^��zs5��ק3^��zs5��ק3^��zs5��ק3^��zs5��ק3^��zs5��ק3^��zs5��ק3^��zs5��ק3^��zs5��ק3^��zs5��ק3^��zs5��ק3^��zs5��ק3^��zs5��ק3^��zs5��ק3^��zs5��ק3^��zs5��ק3^��zs5��ק3^��;h6é����b�v
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l%Թ��í-xڷl�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�4���J}�ʂ�Z��5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�4JR׎io��\�.�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�i��k2֟h�1}�oz����[}�!�����f��<>���r̿iG�1|h�I`w�D|`�݀.�ZO���pV�~<n#���Û޹�����4�b�ۆB�%�`��v%�2Cٗ�(�f/���S�3����#m}X���%i"�?ً����ͳ
]J�o40��㛧2�L;�~ųgrQ�Ad��Gr�%1hRq�-ڿv��
����N%�p?|��%i٭�@)��Y+�o�I���3+��疳���OY���oH���u'���6}IƶQ�&F͸[�׶+��M�\�x}�o���#��ՑȞ�ʀ�o��*��h�Jn^)��Y��s
H�rH���3�3L���e�$f��;*͜ļ�����61�e-�霄[˲Yq
^Fv̜QQn_��b���2\zR2�	yIGƒ���~U�Ii�r�6GYl��0c�5`��K�����H{2������V�n���'di��o�M[G�1|2Tm�ci{�Yu�o��$a 3R��8��h��?��|��q���"}��;��
YI��교�����FM��e�H�����z!d�إ,հ�*i
��a6�0�ME�,ۚ��i((p��
oz����[|s��d{I!:�LRnN�0�����4D�8��~��m���1�m�M����8�;;��3��Ͳ)h���b�%k3���r[���H4��f��&��~6�os�����s3kL*�&M�eD�)�z�.�����I�c-����=�~ҏ�b����� �<^;�֕@�Z?��XKka-첃�A-�8���Z��f&�5��<�Q�K�9iOQ�#��lڕ�
����fԮ��nzR�khLթ�K�P����pE}��%��!D#[�P�jۚ��	��5��T4ֱch�)�)����m�(�q�# ��j٠����(��+�)�\
3�3�lnq�NXCə�lŋ]FnZ4v=N��am�#�_[K]6fѝ�������5l�}V���a��j��GS�l�Ȫ'-�Xs�8h��9��
��;���t��f_������7�s���Ð�e�J?ً�3{�?�z��9f_����4�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܯ��Ӌ�>˻7�n[��n[��n[��n[��n[��n[��n[��n[��n[��n[��n[��n[��n[��n[��n[��n[��n[��%��F?ً�3{�?�z��9f_������7�s���Ð�e�J?ً�3{�?�z��9f_�����5�C�vT.�Nk%4�����6��4T�.�4�Ҵ��ҵ�)�iZ]NiZҔ洭+Nh�Hf~�kZR���{�?�z��sO�V�m��߇4V�m���֔�5��o�6ִ���iZV��O��fB-V�[J��V��4�BCٗ�(�f/��ˈ+8l�=cl]�g�Cٽ~F?ً�#�Ğ�v��֯C���jn������
]�|��DR���ڔ��32�kL}�33��l�풋bƥ=��14����T>��)՘Lb��,���޶���Ӳ�9L�?���Ŵ��Y��!��2��*b9$e�~���W:�����Q;�^P�9��å�\�d�mL�6Nc�Q���D����#��r�܃a�ӗ��H{2����� B�!0��Z���m��[l��y����aI��c�r+:v�ö����Y&�o�
æ��G��fA�nx�R���{<��׽v����H��j�
j�.iӔ���n���
|���{�?�z����5ni��9�ؾ��Ȱ}#�d.���G&�b��<����]�����%�o'���gu�9\��a#}��bcdwK�%�P9\��''/��u�05�	����/�Q��_5lK��똲���j�-���э�~��ʱk�h�?��#����T�L���޶�Q�􋐖yk���s7'��}S��Z^��R>VRB��H{2��������m���/�Q��_a�޹����a�{2��Ć���oy�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�y�պ�N+w�[[�t޶��w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�w�>!�jZ]����f��<>���r̿iG�1}�oz����[}�!�����f��<>���r̿iG�1|u�wnm�Y��))�Ld�Ln�����;t��Khn����1��ksw-��Z��	���[�CVl#wm�F��j;��{*�z��nЮ|�D�O�L����mo5Ae��;���G{�؆�}�[+#ls[�
F0�m���JGT��R�6V�� �˭��i�(/��&�&
V�!��%.�ʊ��8n;�^��'���
��n�WG���<>��Ǝ��>*�ƃp6�^�
�qa��^�E���\���-kY�,o3�̓��#�{����-�8�bh��U����4W��47���MY��t⺫;/ȵ���~�8��9�X8r9�b��E7l$yJ*H���5����E4���\m�p��\_7"Z"�JS�6��1�d�]3��FLĜ�0gZ�G]�=bTi1��C�l�U+��Q���r̿iG�1|rW�l��s��*�����{��𖧋1�?!o�q)m8}��Z1b��ԥ�]5L�iZ|������(�g&3{�s队d��6����6��C�A�ʰ7�w\H�u�e��Z���<y���~'.�o7���tkv0]�$5�.����8���4l|��2�������
����?�.�CcǸ����(D��BJXPRz)�H���/�.���-,{����m�e2���>�'O�V��޹���f���m��i�d���9�8� 6�gVV�1�2����[�D!�
!���$]��rp2z��1Iƽ���m)��Y���݀i��qL1�%�"�P���o69}먟�X���v��9`=>���H��FБ���md���CL''�3g繃6xk��~��8���lU�+���.qLV��{aIJt�`kaq
����mlr�kL�����dŸ���t�p�s���B��f�Z+*l���LI��w,?ې�e�J?ً������bC/G����b�M�+��-"KHC5>=��Gm�#l��طj���(�7������i{�YH�}GA�b;���2sL��}�������C:�pչ��TiCٳ�R�SVz�~��Ä����E��w�<����͏�h�S �g{Z�5��,cV�4K�N+{�35��omV�:�(���o�5&l%	`���6�hw��*HKA8��cJ���mrCu\�^�LK�At�s0�d_�6x�c{�?�G#����@ʝ��o���[|r���Ô-���ۊ��u�þ�l��L=hY&B�%�9�9��Nz�����a�_77+l�Y�2�x�u�����Mfq���,l�$�r��V��s\Z�)f�p�Jz�Ɂ�=[C�j'M��l�1����I	&92�2Np�Q�ne3X����8��@���}v4g؋H�$>vvU��C;|J��<sz5Z��映����,�cH�R�o(lR��crpn����qLcL�I�7�5�,�(3f�SC��l�����2R��{2�����}ku��[m�Ӌv@dwg�ZK.���JҴ�nc���
��bfM���Ϥ��7�s�HA�w�R��w��ha�a?}�o���s��(�a%�GTı�V���	&KN��m3����-a��"��1l�?ސ�e�J?ً�3{�?�f8�-5�2���d�AG3�����m���/�Q��_a�޹�T�%��޶�Cٗ�&#5�E[{�������������������������������������������������������������������ֺqK�:�]s��˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰˰���kB��c����7�s���Ð�e�J?ً�3{�?�z��9f_�����5(��m���[u�S��7�s���Ð�e�J?ً�1��y��6���M��Jd��_
�
�G�t�pH���-ݶiR�,�W�l�GŹ�>�-&Z��k�f��ƫ����]:!���]�2���M�3��l0�(�C!{VwP�tp��KL����e���t�A0��U�vvv�J����x��"ei,���f��,����D��%cq���d�}9�I�^�f�>xl)��4�l���޶��2�ɑC^i�-&[D��fRlcn6e����Be��/gj��Q,=2Wg�R}�`��NW �o���b���M[C�P��qV�\�;�/�np����2.�����Xk����\�CIv枍od�\dZĆM�\�8�2�K���3��T,��fux�wCne��Z�#΢�r!��.����J2��ba�+a��+�)_�$=�~ҏ�b��ѯ���\�rl�\j�VT�����s ��{�H�X�dg������]1K-�����ݧ�w�%(��I��jG����~�j��q�QY��m�
x�iZ���wi���3wSi����Ė��ѭ�cm|����M��,��ۼ8݆�m��O�#�z���+�\Џ�R�@P�]��]�lv[ki$��w�9Y��{�?�z��[�?�����&�QFss�+q���$����,�1����&��%vuo�)�ɸ`wz�^�ַ��^t;[���bq�F��ْL]6g�4p匆J����0����ę�&W��p0_������,�9��2�_�ﰡ:��m~<����\@��C��,���+1C�m�k��ʁ�ǒ����̿iG�1|jK���n�:"���k����u�Gm��}�����cʰ�DU�@ ��>��r���MY�O�hf����iD��^Q�Y(�P%�0F!�y
F�+Y+�h�H��ٕ��>c��y��v����N4t��P�s�ql����!J°��2�<=1\�
����6Õ�i"��hF��81RStz���b�wkN�X�SkF��1�Z�$gkWx�O����{�?�z��19x��#2��=q�~�y��F1�O�\z�ø����59�[+�:J��Ƈ-Fǰ8��;n�f�:|�|�ȡ=~>�jb+�b�Gұ�𕊥%a�ğ����r���)���'q�l�$*2��,��p9�c�(�d1���6h����%f%�l~x�[9�1�aIm��Sh�݇�sp,����'H�G���})h�T�<r|h�h!���#��4�����/�Q��_�h�;����ٱ�w��{�?�z��XٰHR��L=���R��)O�$=�~ҏ�b����޶�Cٗ�(�f/���\�x}�o��=�~�b����V��iZV��iZV��iZV��iZV��iZV��iZV��iZV��iZV��iZV��iZV��iZV��iZV��iZV��iZV��iZV��iZV�u���[��[�齫JҴ�+JҴ�+JҴ�+JҴ�+JҴ�+JҴ�+JҴ�+JҴ�+JҴ�+JҴ�+JҴ�+JҴ�+JҴ�+JҴ�+JҴ�+JҴ�+Jҟ�4%�iG�1}�oz����[}�!�����f��<>���r̿iG�1|or�WV�E��j��%����
�\�x}�o��=�~ҏ�b�����!L 
���,�hM����T�c{���T�,�[�4b:ϖ�.Y�>b�uVO>{#I�����t�֓E���~�n�O���̻iGN.�8-���8�vUНˍ�`_���M}ӎGe]
�F����ԟx,9��K�)�-�G������<��p/�
�\�x}�o��5m�6�#̠L������&��F\�{���9AH�.MU6���\�ճY"�V�c������e���e�M!I��^5�n��2��w�m%�
:
��r�/�7dq�HZ;�6$�{X[%��P���鯁���Ҏ��F��X��H�FҬ���{2�����ȡ+6'��IQ�	`a��R?ً��M��@\휔��$��÷�T����[t�=�|׌��*��5�i@�b��6�JW+��,�2ՐYm��iK�O�kjy�Q��,��W4�ԧ˵�=���"�C��3;�g��qmt��.�m�n�dſJ��<>���1_
/a��%;��͓Y$�Ÿ�An[�����(�B�>-����ݝ[kiHyb���YJ]�;�^�~�b��Jb��iJa����,�t�,���Z)[I\#���27ƫ�f�i�T�%l^(�,�,}Y3�����&Cٗ�(�f/�.����e\U�7�Mm�-���^6#s��𬎍o����d&�V����gC��EI�J�H´zj9��SW�f6��乐,W�I������6#rհ�:�D�jX�0��a<lF�a�uf�Š�Q�i���im�j܍j��p��	��lE^*͠c�������޶��G��bvNZC3g�C��g؍Y0�g17���i�
?��&���ҳ�t��^�1,�Bt��d�n�Hf����%��2�7R��䣌��F�����3XV���G���3���QBǂ"؋�D�����F2stu���|[W��,Hn�/��mΌ�!�����f��<>���r̿iG�1}�oz����[}�!����b�v
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l%Թ��í-xڷl�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�5�k`���[�
l�4���J}�ʂ�Z��5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�4JR׎io��\�.�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�kXֱ�cZƵ�k�5�i��k2֟h�1}�oz����[}�!�����f��<>���r̿iG�1|nrm��r���[v���i?&�M���L���޶��ȱ���[�ć�/�Q��_�0�rgog�c�-X���%i"�?ً����ͳ
]J�o40��㛧2�L;�~ųgrQ�Ad���u�rd�>��"�Q̬K��>z�S�jŔ�$�"iu�<͵$n%��eY+�Pm��2Z'!�,���޶��~�?+�mY��L�
F�˲�要����☱����m0��0��.|�ɹiK�Z@D��9"�R��9r{�b�\O@c��|���V͑ɳF_=d�P�(�T3ocw�i���$=�~ҏ�b��ŷ��E��b����f,��M[�1|2Tm�ci{�Yu�o��$a 3R��8��h��*�2c��`
�27n;k��oo��Y�e�"�گ�ڠ9j�g彶9��qen�����\�x}�o�p�i$ �_)�M�݆������g����׭���?k�=;앓2p=���k�m�Y�B*�'�,��1y
��Ȫh�=�Y)K!b��hU%D:���f_�����766�^3�yZ @��,%����vYA� ��	�}�u-Wv�p��~J��%朝�go �[5�M��F�m܊���c-���ǯZ�Eh�[c-��/���\�x}�o�D#��a�@��V���\)G'�_!H�5j�Q���+cs��r�9��[Gfl�����eZ՟�ڎ*�9j�е90�W�j��l6�5���jMͿ���e�J?ً�3{�?�z��9f_������7�s���Ð�e�I��cAڷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-�rܷ-���8��컱�{��n[��n[��n[��n[��n[��n[��n[��n[��n[��n[��n[��n[��n[��n[��n[��n[��??{R[O�c����'x��W�����!>ҷh�Z�sչ��nz�=[���V�sչ��nz�=[���V�sչ��nz�=[���V�sչ��nz�=[���V�sչ��nz�=[���V�sչ��nz�=[���V�sչ��nz�=[���V�sչ��nz�=[���V�s�R���V�)e+���K�E���nz�=[���V�sչ��nz�=[���V�sչ��nz�=[���V�sչ��nz�=[���V�sչ��nz�=[���V�sչ��nz�=[���V�sչ��nz�=[���V�sչ��nz�=[���V�sչ��]���M���de� ���xh�E�
[W,ߴe׶�������NE���H;�B�I���Z���[h�l�U#u�}c�R����+kҒ�QW�e�k'�;��ݵ��w|��	�YLZ�w�;2K싵�#��D�〞��G�
΄!��e)K-�U߄��F�U]���MWߠD�m;uGUx�#nr7O޻�;�<j��H���7�H��f@�0<�B��5�e�ƫ��#�‘����R�>=�|���
����a��4�Ȭ0��	u��m�\����{���Z������k�Z������k�Z������k�Z������k�Z������k�Z������k�Z������k�Z������k�Z������k�Z������k�Z������k�Z������k�Z�����������ė�����1�^)ػ����l�+��W��k�fC���3���C#��\�-��)��c�g}<$x�p�P�O�+��f�Z4��`�0���({\7;C����
�޶��q,�<���4��r��3q�0��Yf��d?3���א������$a�yi�����X֎�7�-��2o~E;�FE�:H�0�
�J�#�!���\�n��Ƹ�'տ��bL"�F=I��a1Ֆg���f��~e��@0aFع� ���R�,9@h<�~U�h"�b0qQ��r,J6�6�@�b����E���	됑�\�}��݌��K�i��{��ۋC�5;HBb��#�%���c�V�,Ocg�{�o�FK+�Ӓ��*��|	������=��V()��k�<o�����&��vR��2ׄ�$d`3�u̙G1lԀ��/ud]�8��d��q�4��L�Fg8�9���`F?���׶Yg�����,�̇��d=/��O���3��i��1�m��ɲ'r
D��rדu�kc��cq6y#��inla5����&tjFy�ɯ@��T3��2����)b�d�#�"r�ԅ��ZM����#�:Ԙo|����j�2Q���o
�0�aq�N��o��㿭i�+N�9�_6��8�%y�/t>hFD��#Z���#O��M�y3L����4V&���'�I�d�eX��i�b�lt�+�H��:0����,��Y��Y����NP l�S9|�-ݎ������!m�H���-1#��k�W��f�I�6��;���q_�Y���<�`Q���E��CTՏ9���9c��Z�s2S���2)�`��9;�$tYI�i�El��!�ok`�K�˖ҿe��dz�Z��J��Վv���t敭��h�<ɚ��Rs2s���Y<�0��%�ie��e��ձ��,����%�H��s55���Qp�4�bJ9�Q��I�RjNf�] �l0~{��!��-��y�kR�3��Q"�e�wz}�2b��HN3��Ȫ+�s ʼn%*��g<���3��di'c��gO�"R��1�:]#/#,��O���
GO]�s{�!�r`�����\\�������,�̇���Yf#��܍�)������g����}�[s�29�#O���h��/���h��/���h��/���h��/���h��/���h��/���h��/���h��/���h��/���h��/���h��/���h��/���h�1FW\k������r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+����~�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r��{���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+����W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+��9\�W+���r�\�W+�ܻ�+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���s�?+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+���r�\�W+��Z		1��!�"AQRb��02`aq��� #PST��@Bcdp���$3r��4Us�C����%�D�������	?��� I�X$}`Vӂ���୧m8+i�S�4g�#��ĉio1=��K�Oi$�[�̰�d�j^��A���I�:!$�E��C�##�P�\�hehƝh�ͼYU'�:Ts4!�Ģh�cNS��5�������+����k?"��,wCK�΃VZv�vl����&���9q���+x�Y� I��V`�\\��F%�_��i
��'�r����
X���<9�`\�?�����d�WpB�g@�D�~�,����
ز~�δ�H|V����I�^^3�܌��8�(�Y�H�<����ص#L�t$�u:>5ʭD$��_�M'�����,x	$T'����S�jx����5y�U�ʃ.�"�/�^AxodT��T�,g�#�y���O�n���|7��Lk�	Vc�ޒH��&Ա�*4�X��p�$xv��m�ƻ�HԘ����Z1��N��$Z�Z�}�w�S�
zR0A���3���54q��[�:��'y"�~��F� ����:��,�U��G"���п�$���4���C)�"�H�qg`����'��E|~�q���2F�i��G˫��OJ79��#(�(�)���I'S$��T�x�&��b��)��P}1����srd?�B)Lkr'й@ў�h����"��)};�E��w�t����A�d6��YD�����"	N���d��MF������<q�yr�f�r5��p�L�\�h�ka�kXN�2�B��x%I�SR�%ΝF[�>�H�͔΅P]FG�KW�g'�Q��yy���P�O��V7{2IN�W	����.B���F��#FK.��{
@��0�l���{[�?��s������Zr���g���I�P�vn�G���3Hb>�%��`�")� zU��YFPL�t�r��=m�W��{����h�
S�6�Z�D��
`$8�km�y+���}d�2M_�+gHe����S�'��u��Q��j�y��t�tkwN_\��R����#�$�[뽍1Aq�H�}0H�J��u(��)=�����K�h��ot�p��R�����ۉ
�>ַ8��MHZ/� v5m%���E1Y��>�c�i,b�A��1X h� n��\J���{TF$��	���+[XZZA�oUN��]m�:;�U۳���(k�O�U���Ի7�q,����B2��*c$;��C�֮�mB�)�z�p��!����ϧuV�sw�
џ�tъ���;�E�u�^]o�Wz�&��$Ҽ�	��Z`7�3��ڋg��K��p�"@n�m[w\�0FM�<��8�(Ss;(��_���E����u���0���;v�WO-���E8x޻-o&s�-6$�u�O���.&��ԟ�=>͹�Ly$C�޴��h�a����H[���<���ڿ�п�]%#��"\gH�h�/�й�ΗΦ�i����=�
z��{��C
v�sŋzU���$�W ��'��թs�D2~ED��*�ta��ԥ�l'ib�RA��Mx���cJP��l�I�8��SD	-绕3�$Em�j]�#�̌\.{ VЊk���k�p�Q�$Q��D��XǞ��s���*���n
W"L��%���rq�jn<�zM���y4��琩8]W
�� �h�Oy�~�O�L!�&�F
�yi=��Hv^�������[���6��B��t��pDʔ��_�@+�0�5ڦ�\��Y�UmW��˙�� ��dة�I%DF�9?�ZR��P�N��ͬ�t9R9ՑPIy4�"4��(���=����k�3��$��'�snq�y�馅6���_�>d����f��m�A<[G�jp�2�F��P�2��
K�tq�#sV��dL�,(\^_ݧ�����=����t5!!ҥ��;�f20Ҥt�$d�_�ED������d�P��0s���s&���v�)�z�oi��H�MA�/S;�&�mdF�jRE�+��#�Z��%��H'G`�LCNj�iDaɺn����i#����Z���"��2*E9��$�fa�:�?�3��\�-\�
�;�rZ=H�R@Y5FC)�r@E˳4J>�C�r �%���q(�px�g>��Ӛ�����9�ݭ|�����d
�}i؝G������c�&��	�V����ݒFG§����@I�I~	i���Ji�S=θ�5��)T�1)gv8
^�4Q}D��_�^�H�S��+R*$p>	�Q��@��H]<_�A�
l͞�N�Y,��ft'V|a���"S��o
��+u�W�4;�inр?���|[ۅi@8g���"4¾sWJ���t��J�����\3����ŒVc���n?H�M�D�q4,s�*}%#���x�萍Q��.�Zy��ǘcT�d�*2&}WW�'�ˠ�V���w�Nj��/�_�ִg�TR�e܀Sw�榺�a$�Ի��^�|{6s�H�Ɂ����o�!�2�*k�w�(�����
��+�^(@`�4�f��H��L�Kj /�B�>=��\BF�|�M�x$�n�t
���rĘ�rT�L'O�{�x�@˺�G��P��h ���2�#B�-$�ѥ���\�5����M���.��]=5Ť�č ��H��mrcy4�T�S]�$�,�����愰]c
,���켬��]��^�Jg�������
���m�H�GX5'˚C�G���o�!\��di�o
��a��P��$7h�0Cvd7J�j�pw�1����C:$���>�T�����څ$ʯ���@��'��
���2������T��-�]rI�NH�h�_:����W�+����W��ต�idH�I/�
�VFA�i�v|�G����Ѽ
s��V�pD��i�񻺀�b��Ի�"&|
�a������2�_.�m����*�Gj,D��yN�P���y���ɸ�m%���m��w|#�\%F��*"(�UQ��9��WB�%��vws�f9$�)'�Q'��(nDd���$�T���:��+H3��Tkh�QU�v`��B����O���b�[MG�J����*8?�TpԨ��N�r�QBv�/�է�4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i��?q��4�Ɵ��~�O�i�����R5�� �������"����i��u��!����Ⱥ��\����W�[+�)��G�DFA�&X�
G�M8x�C+�$~U�I;�DE�vϘ|u�P�8S#��]G
�q��r"��UPI'��dV*�|���ML�HQ� p��(�wq+������j�ϱ%���n��KI%�܃"��Ҩe���+���s\ݐs� �D�Z]�t��!������ʸ �=���-��+%�20l�lo<CR�a��&W�RU���H"�T��1��&�&]Jx� � �&�me0㎰���7�{�>,e���;�V��4^��}���h�)g����Vіkiƣ�@ 2���,���5�[Oe,�����*	��4�̸Ҋ�S&���dS�G��H�AJg�ċh2�6�������+�I��	�q��|�*����f8u.U�H�ZB}���I�g ���c�u���	&�+����x��%�<g���m��J����Fcr�՗�V�HE�I��^
���eq,`��شK�n�'R�QSV��,F�`
��9%Q���*%y�iT�@ZI��~_�3����u��1���{f%z5�*.g)c��A�;LOď8�'lΙ:�N���W�^c^h=�If`G��&���s؊� �
4�2"Ld;TR�N�I�sA��DQ� y�E%���VN
�\�������}�̘�@����
�wG���5���Y85#�3����ԒE,S񿘎"��1��鴑����?Ȏ1�@�y�B�O�.��	�Ur+i��xC��v��ݕ <X2�=G%����Nj�H�o‚wrc�84ב��T=��5�>�%մ�h%I�P+�A"���������D������8�fyU�3>��Z\4�������ԍHߊռӢS8�j)NP���5m5��}�#�GJ���E �ǜp
�8���̪2Mm��1 �sr=�myip�&���f8���k�s��{��M�
�2�F�P��>k`Xϴ���t��ZKh�L�k�4�K$YF�FA)k�P�F���vP�l�g1-�q�u8Ԋ�#j
\�3�L�4
����USGE��۠���I*�Θ���D�W��zB��VQ�a.J#�	��B�e�vw�{®��و�;d<���ϡK΢����D��:���C�G"�"4�tm-E��i36�H�H��Z�-|���!kc[m+��C��`�u���7�r���q��1���.I�k��v�"�>��)R(�"�!jdb�_����C��Èʟ0&�h�cFdmJt���xwL�
�s���e!�t��U駽��(f�d�+�`�ȵ��gU<���"���y��p0�j#�8����_�g�uuQ;����lTcznLe��B��<2c�֕��������?���kh�b�W�
HgePN*W��3�/E��%�]��L�F[�l���dH��S&���\��za�(�8-�)4^h=�=��A8�J�9�9,	re�쇆�~Z�#��y�<Zx��t�I���f��Y�'�8T�E4L�J��-�	m�_��\V�_���q���x�>v�iak���b��N��SDˤ��	�٥u��dD4R��:����?�+d��m�̠��:@�������G��$R�H�U�D��!F�
�N��s�d�]@��I^,����
x8���*���K(8'S����[�W�3��4���`��,��Q�]�Z�}Z��
�x���1Zw�ѧ�
��q3�h�)a��*CVɂ�h�}rƁKzA��� ��
m�x�����5&оR;�7�rIcW����q�u�8 �[^m�u	-y•�IbI��6κ��M ��J�*Em���Y%�ũ�p}-u�����w?/Uc|22��q�����;����s�8m'��ޓ��ξ�\��m7�=ѫNj��8�����򾌚�qȟ)v���?܄|i�t뭷,(,���K�C'�ho���[�5��:�m#as\��y��9V�9����(��Vޟi�"�ȗcY���/�E�`k�A<�P�&S�/�	b]lψ[��@�v�Vh9��}"���3ܩ�T2O@�+$�q*Cr�20��1���ݬh�
�c����-�A���5�՜'+�[��!��0�^o�����۟9��:�[^�X��dU��M��p}��$��,s��ֶ�6��x=ډ�1�`ӹeӤi����"��z=��ܱZ�� �i v
s��0�%�NqW;�s�uh���d����&�<Q�rH=��L5�}��ѿ�H�c:u�\�w��2�ѣc>j��F�ŭ�Y_���W�c;���pI�AU䗗�H��r0Oi$���t{�c�8��@��x�u(e���X�j�G��~kw��>�khIgp��@<@�A[ZY��D�S"j2:6x�����P3 
�����G����GI$��kK���TgV9v��r�Kg^,O��V�H���2㚟�^�q��^8��]��(��s��f�Z��1��Վ]������A@��W�KS�k���VْK����\i�@-W���������Wmmu8I��`��sKp	�$�d������)VS���Em�m�s�<`yH�\����$a���<NM^=��l���A��/���3���I5v���]Au�#�����Cj��گ4��,eT/�,j5{��Xa���ѩt�ɫ��2���h��2j����G�����{ݚCa+���qP�XC'����Ֆ��$����E]=�܀�+vq��lm�����%gM'#K������UҦD
�C�maI�ιUv�����-�M�Rj$�E
9���x�_��y��o�;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N�I�i;�'y��4�擼�w�N���*�7� ^/�T��	<���t��
�K"�����
��@^5�	iYO�X��l]^Yx��7i-Y$�V��΋���cTp���ʌ�̵�1cX�:z�a�q���&=%�Hjp���yՆG��=��;�������I�fd��/�>���u1�A*��Y�K�0	�0�ZTq(b�م�@d�j��#�,Śvg'�h��y`�n�v��8t�W�glܾ�$��O �5����}�dbt4R>��I�®��|$#�뭮Bnf��6��:kh=��#V�N���(�����ٲi2T)�0�5hqC2%���D�[u廌of�����ѩ�Ә�	�]Cw����3)�ǚ�G�J���y�+y��4�]'+_�K�&�R�L���t�~,S�P�c@�Һ�<a^-�a�
�Q0�žHL�[�˫�Je���ZL~S�}*ړF'�<�tF��^xfbC�b�G�
%��@�kJ��,-Ye]�n�Xk���O&仿!�UJ�
��z{]�!��V�{[Hx�I�=\B�i쩙�$RKG8����W&�jD���kw�[�Q_�'�D�&�Ư8%��P�H�J��t:O����6e� d/�լ6^�\�%��X��L3�w~R괬~
r\��tC[b��\ſ�4�:p���o/mb��0&P4Ђ��@��†ϒ0݀-^Iur@%��_�@(��G��˞�X��u"�Ki.DZ�@�	 �&�K��*?�YC��J���w�إ����-%�ex�$餷��i9R\k�1���\l��R�X>ry�T�.�y]��v'Oֵ�4��j�~ HL~;�5����"Q,Z���I��G]����`��n�Ci�O
���)W�-���@��_F�H#��B��
pM]Es"Lf��`�;4��@�F�x�R��wc�2v�
����i�{m�#�;e#"01&�e��%A�m2��pK,�,FB?���[�x��[�hù�%���u��LE�`H<
m��F��H�J��k)$��{��=�>E��L�s�u>�|�M\\�9��5mn���EF�Ɯy���R��?xT$4��M!�#��i�L��ご'P4n�6�0#uąX��Ԥ�S��$	�D,����S�Z�9̏9�A����>C�Ch>u
��'�DDX��M3�W14nP��7� ԳȒͽ&b��viJe# �����1ɉdꨦ�y�)���S>��5}}$3q�wF@ސң�"28�*{�
�@��VƏ6�Z3!��I!!_
�r��{yd�P��9*���o�=�j�E�f$坱ʼn�� �GS�F��SMsvcl�NT�H-�k�S*�H�n���mmq���E�.���T�w>�L맥EMu'·z�쭍�q�*��o�&���p@G>|04��s�,Ӑ�3�k�;��:dJ���A���UO�j5�(�""�Q����5��mK��
FX>�?�5���!�����I��NO�G�K��SXL���
�_��V�h�9�Zi%}ƽ��ZY	?�-����^�'�Nq�#8��{�'Fs�xFt�<�֦eӫWʗD�V!�u�}���iu�	��
�G�Vu䑞�\�Ⱥ�(W'��4'E(��i�s}9�qI�z���8�`�"Ll��y)q��ƫ�\c �����9���4�u���ƭY����6��B�|�FI���`�����][��M9�t����ux�Ս,W����V�iOq�H���F�O��﫤��6%�R2�������`�Wu���*�
�ɷ,�n��=4D�J�#��M_�u	�,���>j�o.�U�OJ����$� R��G��h��E���l���S��u!H���5_�y��@^��8� \ȧA�gI��쑢#p3[B8t�	�\�A�{;���H|F`���Q��c��~�/𚽎��0V!�Q���M�6�\pe���Y[k"(�<���<��pl��K�F��l[F8��\v�4��)�7Ӫ\.�9\�j@wj��|\�n���k}nn v����a��9_ީ�ѹsri
	'�?�
���#��}��`�!��b0�cW�K��4���Irć�>����5�o�`-1C<���bA���������"rA��m�������ݫ����:$��b�R,�d���WIq8:�ݯ�vv�W�䔤�HS��W�]E#�x���_��2�m�cJ�<+���>��E�ߝ���1�W�ymu(���
໎�������Pi���Fc�T��t��p>�9P�FU�`]�ʠ�WI��W�I�d,<�5͔�E
�մ�ʙ`���m��9�|¿���RR��6*d�5�ife�@�
L����@
H�:O!�w<�_7mH�.��x�S!@8���u>�L5O#�Br���[�!q���0�7��@ƞ8���Ϊ݁�A��W��̚�8q�8�]2]$����($���"��W
���L`��&���ns�A�i�WI~5
��o��I��
����A�ż�w	(�>Q�*�.�&`E������9
��ea<'�l@$�z����0�q�����c��5x����́�Ϛ���18�K��������kiD^5����Q�S��hU��H:���&���6p{t���y]��G��8Vя{�_��t���!EnKk�Gr$Hju8�G�C�p8eN)u9`���\�Ќȫ���/:i�3eT�m-�;khG!ޭ���$q4�]���I�4�]���i�Ң��'Lj]�/#U�^��d����lAx�:���I��H�6�'��KB���_-�p�UT(Lq��P��f8{;.�Z�+�ME���R2G�2�&��QH���a���ju�;���Pp���<3W��Z'�����U^G`����'23A~m�HW�a8��v���T:u4�QbM��C��:����C�!VNdf�5͉�_O�3[VgQ[e�p0~I&��]�t+�?Q=������w�[h
;H��%\��Ga:�p�9tv�,�#��FT�g�	�@;�) �+h�)�`�>��i\Y�Fr@��渜�4NJ����'�����N��q��3#�	Z�lu���a���A讀�IX*��j�
�
���eᶓc�	��� F����k��qa�5�4��k���k�Z������I���	 ���JN�E#$W���ٜ�3Z����d�ռ�Jd'K�ѥ- ��(�t�NX��Ǎ�F0)4���0�jC�f٘p}7%��1���ϝF
x2"�ዷ�e
~~��rd)������\��#PI�(bD��b{H�.c�.�T��N$���#��;j&-j�ɓ��O,��Č�>lT2C��9>X
�����nD�oa��2�k/od��(5�G_�/�-~؟��W��_�E�"�d���FZFC��oa�2r��5^�^)V0R�A�05}%���}GPC���˘ܱUd�'g�2Ŏ���3W�)el��T(`)!�nո���_�z;��\K���'U�4�pp�_���z����R+�&mm7C�d��I�$�$�H,"9�`��W�M�JR�,�G��@�\Z�^�0��$�겜�i�Sh�8¼:����*n���HT�rI�N!jg��m$>��F{KTeᶊ16<��O�`(�	�B���"�!���],�RJ�V8\�V@UP"��
ѓ
���igJ�P)d��'O�	�E�N����@�o%����8�(Mr�0.��
�P	�b������SW2]�<~&]�j�@(d�O'ɩCI�)"yT�ȥ,й���@f�������ҕi�IB�D�_�'�W�d��m�YXD
N�3�q��#��*�J�i<@.1_��W�'����R�l��y��F{?�HM�!�Bt�#=U(����UPg`Փ�X�`3���gy��Ъ+��s���6Y�$/�o�`:�"�'[���d&M]�u|�|��[zGP$�.��Ek�!��^\�$VЖK�L^6r1�
!EĸS�
�<E��Y�Ȩ�CE��#�G᭡,�Z��l�c�
�v�%'r[H0j�K���j�m^m4��E&��#�꧓:s����8�f���o�'�h�9P:���鶊\p.��V�DO�5H������&<Y)�c�=Pþ���<t \�-�D
�uo0��%�/��IP��u9�Z20Q�*G�gO�"|�#Fڐ��*|��2��dVPF���rmI�Ci>q��2� �25G�DP�3��AHNJ����T1��6�*�>v�J�� ��"�m�c@c\(�
EDQ��0��8%I�Q����T)���G!V�!9,cRI�AfC�(�K9��13�4�@r<�"IP�WPÑ�Q"�ڨ�Dz�m�pe�A����yN@ҹSVV�\�X�s�?���d!�k�j�
ڔ:���!�6��HUB�>v�V�L
jVj�L�J(Q�PƒI��To��5r4m�(%O�s��1ʀ�
���Hۊ:�S���iB��PG*g:]C���
��@�{�O��)��Cc��AJ{HE
;����.����$�QB�B��ys�m�PF�)̅T��c�CI��E
9
�9�v����S�"��*�4yNdeP�;ơ��H�H��>Xe `@H�HV'�hio�yj$�E
9
�7x�cfPJ:��ald�u�9���dB!{�VP<�FY�Rr"�0�Vy��c��N�Hя6*��$�ֻ��`�f�]ޝ:04�͊��7�5R+�a�~�j���D�"I�W�#V��O���5�P:H���erzI�]`��*���H�5o$}�정ϢO
��{A�m�X*؍FA�*4H��E(l
�������G�D@���myέ��5IqG�㷴@
!@�͊�"@s�(�<�L�P�s��%��WP���4�F4��f<ب�(�E
~�V��cLz��'�h(��|�S���WF*� �`՜?����Dn*�0?X5al�,���Ǟ���#��(%?��xl��\�X�AϞ��%f,B(PI�U��9j�=�Eਡ@��*��a�t@�A�VV�\�Y�ug�V�*�I�>x��Ս�H�wk����F��0@}@U���9�c]Y��1�]�>����8���.Nu�9�X[	3�B5�j$�6���*�0��u�|�P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
��TB��P�:�A�*�Pu
����xmm�^r��*ȟ��'����d��c��}�Y>�X���z�~�O�V?k'ޫ���U������d��c��}�Y>�X���z�~�O�V?k'ޫ���U������d��c��}�Y>�X���z�~�O�V?k'ޫ���U������d��c��}�Y>�X���z�~�O�V?k'ޫ���U������d��c��}�Y>�X���z�~�O�V?k'ޫ���U�����O�%���3�kr��9t)�s�p�5��6��Lj� Ւ[ݜ�d����N���1�"H��ú�QG��I�R�]~�FjT}'
����8��2(�S�e{Č��l�F��qk�D)vd�<�G�ռ�Nm8d��$	nC�g
*x�-�[�: ���ɥ>Q�0>�`�FA �����_���?�U�R<��"��C����!�����C:M?��p�+W���,��U�IN�d����ܴqΒ�I�E(�6��З�q5y4�7���+�@���T�8Eg��k�*�}[B|I$�
��Hw*�6�$�D��f�I���Ey�>	$
��{�e��h����'x�$)� ��?5��;�Ps[�x,�|RF��r�����$��r%� ��X"������0aWR�i��" s�-3�p E.Ab�~����#��G�d�� N�AC�m���P�Ͽ����+F�*ȼT�����.6�z�e�'�V�kkV��pT�Ԡdճ��6�Z���,T�x�`��gX!S+�X����kY�����kaKgx�D���@��࿯ݶ�
��P��M�k�`�l��DX���/ft��,��@^+ͺMde_���B&�)׬F�U��I��P�r5�+�iHԳ8�E$,71��t�탃[
kȚR�a��#����5ΰ�0�fC���%Y�o���{&�k�F�d�๚����nW\d�*�U���y���r���-|V�d��mOmx��/��[Jh{3Yا�L��R(���	P]�t�Es���;mSs�#���u�o�o%�ܢ�k)���ΧNJ?D[v��9�.�nܰp�tmd��{�Ht�����(��:��
�T����Kh".t�=.��W0:�%�YD��(cC	qr��P��?����?��p���!����[56djiO����^��+
l�RAh�a��
z�j��d�H]4�1�[��$+�I�t�����hN��2��v�������>?UA<��J�<��$C�-V�so���A>P�sV�3'��wM	
��ታ ��-�Y*_�%��3�q��U�[���3����������?���&XE������	p�i��P	�@��P2rq�P3�y��@'�������M �.��,塎yz!�H��$xg��9�8e����3[{�c�����X�o{,u���:���m�e�����[{�c�����X�o{,u���:���m�e�����[{�c�����X�o{,u���:���m�e�����[{�c�����X�o{,u���:���m�e�����[{�c�����X�o{,u���:���m�e�����[{��b�y���I�9f�����<���7��lw1��>�lj���G[ڣ���Q����`�Tu�}�:�>�lj���G[ڣ���Q����`�Tu�}�:�>�lj���G[ڣ���Q����`�Tu�}�:�>�lj���G[ڣ���Q����`�Tu�}�:�>�lj���G[ڣ���Q����`�Tu�}�:�<�c5�<GC �/��a�]*��qh�8����"��=~.G76ڵ�p�A��O��w5�%�ͫ'T�C-pF����豆�9�s�]C�]��F��z5;��x������5ho���bR|L��	$��m�s.D�O�V;Ȗ0�ռrYr�岂c��2�K� �\��d�W�����
�VŒ�N�$�����E�ݱ�;=#[[�=��C��Bno'��8��l����1���x-=�r��|㦭�s������ҫE�x�d��
d=5�`K�x�̇ǜ��q�j��=��g۩r�Tf""IeN%0ሯ���YL|GrU�C M�9]�0�?�?���<3��8��$~M�3��F18pqNp��k��h�h`����\j���L뭠�72HwS8��'`��U�]#��0�+����,[�:{	�c{�r$P$G��k�"� �h�3N3�8	�׊�|;D��0h�o�3p;��	C�bG�}� `�ȳ��x�W��F�bG��)��������dO����7KR�������g���H4E�zR��_�0]Z�g�b2�T�A^K������?���f�t��8n�O�&٩��](��Ɔ�Az��N��aِ-�_C�>���m2#�1�ޯngm;��Ki3���+��v��P�&�h��#:i�m6�+�	����/�.m��"G*D��Ml���A��WQ�#��N �MXm$�2h7��L4��=	[?h^��Ku@�S	-�S�ϔ�#����?��h׾e8ќcH�Ms�eae���4&�af����NAȣ5��r�bC�Q�h����Os8��,R����K:5�%E@9 ����4k�e���}�jk��ę��ϥ��mQ��*:f�{���VR4r���1ȇ�Q���(r�)9�iQc�x���1�
o>	�ќ�|uj��Wɼf���1��*Y�b@���(��v��ׁ����� ��D�K('���&HĢL�@l�G�,c��"B�HA�g�?���<O�8q�M����\���g��a-n�洟�3��w�N�[�=5waM��
ӓN�)��
䶝��@17��kHB�w���
0H�K3��$������+ �5Mdl�t�4�h�Z�������5Mbl�t�4��?���p�5a�Z�����W��B�D�{���*j#������O�>�����wך��3G2ʒ��`�Aȯ�v�$J}-5y�;Z�O�w�u������M%��ͽ�_)+�c4�\8��ξbj�M��w�'��Y���l�ٸ1e�z�[`b(�x����f���m��P�I��ך�o`���F
���&�	l����g��Ǽ1��Ni�G�̓M!��������O�?������!ymnRp�.�86*���wRگ��O�W�e'ݫﲓ���I�j���}�R}ھ�)>�_}��v���O�W�e'ݫﲓ���I�j���}�R}ھ�)>�_}��v���O�W�e'ݫﲓ���I�j���}�R}ھ�)>�_}��v���O�W�e'ݫﲓ���I�j���}�R}ھ�)>�_}��v���O�W�e'ݫﲓ���I�j���}�R}ھ�)>�_}��v�K I�j�ᵶFH�;����L@��󚓸T�¥�/p�;�(ǜQ���I��3�O;@V!����h��CS�d0=�-M�x�`��GT�Ɏ:69S�d��M�q(�����s��Iq��8 Ӯ�G#54l��X>�D8�S$�q(���T�N���%0�Pǂ綦��_���#�@�54rpt0lr��[=o�/�ݧW����V�atc
6�N�[��W��˿�^�I�
W�����$14�G��
`W՞ʞ94������S�҇����ZQ�5(I����q��s�-fdǤ�X���(l��>�����H���2��Ť��(G�5���xؗ.ǘ�UhJ,%�\n�#�Vߛg]���	.}�E]=�̓CNPd��Vj���r&I��G!���0��f�3S�&d���!�ƫ��vc�H1�����pe�y_W��m<+o�g2���d$��L��v��2ԡ���Id�M_\H�"x�dz9 d5Nд�B��⡳�*�}E۶B	��@��ٌs6���,�5�尹B3�I��9%xסm��Q�w���I�FA�bM1G��O��k�[X ��z,���C/��M�w'�5\,!�r�2X���VҺ71>eS�<��E	�\y��o�^�c����1�Y�3�A�BV|�Ք��:D
�����X˳l�mL�PYb��������rwg>0��䤶6б"��bG�(!EY��%[�e޿����$M)R�zTvU��JY�Ӭ��Nq�W�f+��f��R�eO��۠�\�\9��g9�
38��c�D|����A�^�6}9��Մw�=����ϸ��M�ǎ6iJ�NÝ\dU��G`�
:�b��E&���g��\C�s`�g;["E�a�3�{��K�C|dF�c��(�
޷���쀤�*Q>�
2�g<�񭾹�6(����U�܋`�XԹ
��=�W&�/l��*��Ry6|q��
Hc#�5es
�ͅ�Fh�!�(�I�P�mt	 Ӭ�
�yk�(�o���E��ʠQ�HF@�'�!�#�r�2��Td���G���_�c�M*7
�]^}T�Q�G`��$��s��7�Qw����]��5y���
�k��,h�h�
��J,��s��a���'����h���"�C�Z�@����K�
��� �0���h�H�eXd{σ��hΝZFq���~u�F�'��Yn>q�y�_ia��AH~�#8�xaa���9��٦>sN�<�p(���R���w��(>����t񂋤i
��]~�FyQQ0�,5����G��'���H�,53QY�b��052�jTf^ H�l���)I��4�k`E:#ib����r2W��h�2*H�� A��E�ȱi]=��J�[�f������/�#$�_�ء�P]lMl����=��n��C���*&�Ǥ���-H�k�U�����(�����D����08�R�q�C���8:H8�@��M[�CH�K��sR#㎒��3��2���/L28�ӫ�:�Ӫ/��A�E:��=+����)��u�{B継vsh�J��J�O���b���a�dq��&�07����5+Ǵ�k1�'�I
\%��"y܁�*�/����R	R�H5��sW	j!Ȟw d��K�{�9T�T��
8�E8�c�j?PZ״�g 4�F\F�%����y�
���b#ꫥ���ʼ'#�*���MǗ}�:��/Q�!{e•�2�m8��Z�m��gH"��� �'`1�h�j����	���pd����-wl�����p����v5��ٶp�#F`(�/-u�2��t�q[n
�# �npg�ոYca��2�>p���a�%�qU�s�X�ߢ����k�G3]�kƷ�щetVܞ�%�(q�r3SJ�L�	x�>+���b
Ԡ��J�7�;M0�ADs�����i#lj�J��ߛ�2H݄T�GR%��H�$)T�6���]�������	���N���a���Fb˓_�u~��+n�^JIU�� �.FEM,�Q��	8�����m!�i�&20�F�imU���� �5�����o
\��4�
�PT�Isi�~^R�X�m�/r�X�F��C?�C����*�������懏[V�ixγ�*��Hj��(dB�rHI�{po�0v��j�!qR{Y#��Њ��-��u�!<bqWAv�F7Ҭ�ZYY%���c�z9��u��цc��D��%�,�dq���Fz��0��T��Z��}�t��
ٚ"�X�~����<�@Q�a�t<J�Cis��/�EO/����$:{5|$�R���]_ү7�i+��?�+�L�Cy���s��7F�S�6�-�\��.M\_Iy4�&�r��+����w�?�Zaո�`5i����д��:�j�h�c�R�a~[EH���㼱ʙ��n{=����Ȍ%WeD �$>z?���R���X�L�O�=��Y^�HdF���s���]j"A��;H��Z�Ԙ�$�Ta<�p��1,NH��R�T��$�V�W���jRDw��}T���II04��'�|n��8�FO�y�ZX�!`��Y-��I>����Gx�/�,)'���N���	�ٷ���8��'���J��c�%�	���,�X�PB�y̿�l���	u"M#��5�`��p�BH�m�i[��)u9hN�zKQ���eA�W:q�Vζ���Fe�W��[��\\�ߞGR���Z���;��_c�&��r��R�'��ʵ��8—���x5Zf�9x���ǎqV�Kn���H�ö2KR�ƕ%��	�j"�cz#��H�;k&	/2��-R�dTUi����42���V���Z�j�G�Ml�[خ���+�Td�H����ԉ�IU�e`�WF�Ɨ�-��("A$⭷Pߐ��FԇX?$�J� ��2�V`0O��mEJa�HD+�.
l[;�`�f�=!�R	 ��p��X���;ٌ�J���b(�n~G'�I���v�B"����A��0�Z�?ߌ�kO��U���Z�a��2X
{��Y]AjԾ('�b�a�2A�{	Z����J��{�Mm%{��`\sZ��5!l�::��$� ���)��.
�%{4-�kFHr4�>�Dլ60>�ݐKu5*��VٱH�2�OԔ�ն�9�u�]jrK!�j�61�U�ֿ�e��]�zKK�0X�>QW �+$�1��	m������VԾ?�O�Vv��4���FWɬ
U	D�U�\:1q���}*���դ&;��g�@j�5v,���FX�MYC�,���N���*�e�V!EP!_6T��;:�i=6�k�괆�[��g|U�3�9*��j�}_(�R~�*�����y�+�Z�:���p�f�����q�'�"���<�L�wՔ��	�0��dU�3ǜ��F���8H�"���H��0U�Acon_�Q�jǟMl�D��.��=�am�yD���H�[.�¬YSr�A<H�#�%�U�*�_��ƨ[�#�l�i��5f�#�!�#P�?�V͵�_M�Vc���"�~J"�Q����5'H�`��Qu���]F��5Q���E�j.�Qu���]F��5Q���E�j.�Qu���]F��5Q���E�j.�Qu���]F��5Q���E�j.�Qu���]F��5Q���E�j.�Qu���]F��5Q���E�j.�Qu���]F��5Q���E�j.�Qu���]F��5Q���E�j.�Qu���΂0O���8NO�j.�Qu���]F��5Q���E�j.�Qu���]F��5Q���E�j.�Qu���]F��5Q���E�j.�Qu���]F��5Q���E�j.�Qu���]F��5Q���E�j.�Qu���]F��5Q���E�j.�Qu���]F��5Q���E�j.�Qu���]F��5Q���E�j.�Qut�����)=��M:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^tA'h��<�<~�S�:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N���~��I�ՒG�i�"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�;������yR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*�A�q���|������_�����^����=��a����K��
������AVʥΕ̪2|†3���2�����IJ�����{�?�0�70dM$i�#�6���Li�uc��o��4�oy�5��2dz�0hYs���`�����H�:r8(��^���$�v�B4�>X�"�8���!X�3$�sS�D�����H���Q<s�Ð|3Un�`0�*Q<WLrcq�s,�8T��	Ε�5p��&L�$��ԋ,M���� �4T�C���:\5�'a�'<j�\Cq&�⁃L]:�DT�q�iW�W`3�0�����QYf'L�@_����$�T3��|�����y(Bd��"�)!��`c\���S�B�]`��5v������E$`yɫ����"	���ܢ"?d���Q}����[^��R�X)���8�����m�)G�جb�:�\��.jd��h[sxW����w1*����������j
�����W�z�A#�P�N	��������h��:�>��ӰB����^��%)G����
����W'�i���&�m
zZMm(�mg�E*
T�7�W�>iz����DeXqV�a���l�_)_&M.���oy���u|��畧_�3C��D?��iI% ?'�d�ٷ��|'LR6�x���"@��p"��nS)'���G&�p�h�T��>�Woqg�%��4�1"�$�<
~�^�~�)_ೠÏ#,���Q���b0Z�;)�/"yi�G��Iy�Cz��������)4�wr�q���ipα@��Q��w�	q��H��+�ʣ��>��A��W�3D̖�o��85��o�9���6�C8�iW�n�L��G�R�[F[͘!,�ΥCR���p�`��z��z��$���Bʤ�������  �!*��4J@���_<;&�,�N�LfS,�˨_G͓�/���^���ntk�F�xU�ي��Պl�=�����iPiF����Sʭ�0 ���N�
0��ԇ�����������'#F�05
G�:@H�f�)<t�3P�&8jPqQ$k�PA����EF��1�V<٨к|� >�Q��9]@8�����"��<�*��|�f1�
�"�!	�V
#��|���Ə2��� 0@
����tơ|�i�]ί}.�8�!��т2�^0��p
m�o�)�+o[�W�U�okv˺ץ���X�
�B��׊�9���P�s�X`���a��
��5o)����Y�3�tG:�=�]"]#^<ڸ⠍��;(,��I�PG)��!u
���x�9P�E�0�8!��5s&s�E;���xDP�[:�w�^�ґ�v�/���^����=��a����K���~���w�?W�>iG!�{@��QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��)��x��N5�<*)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr��;H���K���~���w�?W�>iz����|�����/[�~a�����0�_x���{φ�B&�
!��W�f+ifYX�$g�h�r��#�#�A��@:�q�Ѿ���w�`G�xM0a�p)�psD(�*��u�^h�Iz���K��
��/�'�+ƻ�"?�3�jr�9&-\�����ز��9�G:��-!��5#�bΪq��❾v�緇�FX�H�W�T�-�_v�Ni�ZڮJ�ƣN�	�D���o~#4���]��U�>ZF�BA�ДY��9�j�yn���|��=Ow���b\�k'�g���
�.������b�ֻ���i�;��Ƈ��tR��=�����@l��D�Y5̈q���
J��]��9��TΖ�5��\Z]˹�9.��֌�/�'����R[>$jՒA�-ULCY�8ق�}ѫ$ⶾ��E�㡽"I�#���/[�|(QJ�(+SF�
��u��0�[�|ZXdY(�$Td\\��0ug"�t�B���*٧�LVU_�2N�f����]`��ng@ؑ�`�"�^kVיk�i�q"/�g���md�0I���2�h]L>��kKp�ha�Q?EY�43��U��l�x�4�G�Vmio�*��~��=��1��[̓DjbT����-�#�y���e��wH�*�m1/�{��I��LJ��	,�l�ނ��f�Q#�$�z[�-l�l�,z���j��-n�L��2�kg�e��z�`CHղ~����ku>]U��ٶk	MۍF#ѭ�qukx��Rq¶Göc��a�[��fI�l�%'K��/�W�>iz���$�rj.�QuQ�3k�K�Ɯi�<��t��8���~�{�Sj7x�q���_�WχHN�h�'�Nx�wr�Ѷ`��~��e\�i��h�ӓ��>��|������_�����^����=��a����JC�W�P�
��T=B��P�z�C�*�P�
��T=B��P�z�C�*�P�
��T=B��P�z�C�*�P�
��T=B��P�z�C�*�P�
��T=B��P�z�C�*�P�
��T=B��P�z�C�*�P�
��T=B��P�z�C�*�P�
��T=B��P�z�C�*�P�
��R�>'g�|z�>>�T=B��P�z�C�*�P�
��T=B��P�z�C�*�P�
��T=B��P�z�C�*�P�
��T=B��P�z�C�*�P�
��T=B��P�z�C�*�P�
��T=B��P�z�C�*�P�
��T=B��P�z�C�*�P�
��T=B��P�z�C�*�P�
��T=B���ٓ�>_�^����=��a����K���~���w�?W�>iz����|�����/[�|3ʁ4`#c����ߩn�'wUu��TbI�i��.�ё�UJ�FT$j#�"+?b) ���!� >Xx��
L�c����e�+.x�gfs��Q=&8:I�!H&��YWQ� y��=֭:�3��\ż�4�Ϛ��W�K|2,k�e�N�(�P�����,)�@쬧�� Ԍ���r{�&��2�5�h�ݚ�����M�2:��2E\����j�Y�5�uDY�]B��.(�U�-'�ꕑd�H2����g�CMm�/��7�2+�դ�z����VԊ��b��Lq
�����|�����N�֡�O�q��)`��
�4�c�јo�U���,���xWQL��
���uf,�q����VqSG^����b�,�"���5�3�B��_A�׻ޗ5y�W��������h[$�F�<3�yƩ(ϛ&��y�Ĭq��-��.Z������!!�3�!�F�N$<I��j���U�>aO�LqJ~_����P�1�V�X�~a�rs��iC���Pɭ�jd�1�jd�1����3��6��S"�|�F1��ѵyI�A"�~�WF�^�UF*jNƭ�l�p$�[c�����9��f��IBk(��<��U�Ht#�jh�v
9���}?(#�G���W�>iz���Dm-��Uq�
��y&C��>�A�Թ(��Z�oy�vc���c���/�5�������5G��'��O��s�����t܈G`8Z�Y-�@wQ�V7P28�VZ�B����Q>��5E��<�I�sm�2��-�]�r$x?^��Q��G	���%���.�&����D�Qq��x0t������P��U��
3��'4��Xb����K \���+�:ՓQ�%���8�b̒�y<Hb�o��2KV3��8$`qeV�V��̸@0s�Ԅ������t��"9"tï�\ZT<��;���N)� �_-[=Ū.^5�2Z�(#u�������`�� �~W���+����
���̾��FC��γ�� �T�Ƞ�$DOc;1�]�w�a�%�<@��Bm��2�Ti	P\�ai
���\�b3�+d�9#�	��J<g�&�hV�dt��H��b+�*j.`��'[��j�Mc�9�s!M���_�b����Ơ���;v�b8���B��r�,�-@��mU�3}��:����a&�����t��[�H�
]�2<�٨��R����e����jҕ.wt�
���@�$U���#�����.�\$Z��l�pl̦s�{�:�Z�PJ��D������w(ta�<���*fe�c�=�1A���	��L�Hc���11�΃D�Z�Z@5��j!kqo:�` Մ��>8�Kq�r@����`�o���v�瞯�|����Ȩ�@c��͸}knq�~��?xW��>̪��(by������f�������"HRb�jO��o�,������U��b�ըu�0��ₛ�]2Dx0���9|Ū?�4���Q�q*�2`�I�G�r�I�߁n��|�qSEʤ�i�5}o�Ui��Ubװ`�ɑJ��T���|�O4n\�҄����$v��̏����t�D0�c�(�D��IH5j�D0��G4cP������,8y�oeԬ{@��O_�|F>�8��]+�`�r3��VG�5LX1�����x�t���T��,���j<�vC/hq� L�P�3�j�m�у9qZd@1$5j��v嘏����5���o1��|�c������FƁ�A>Q�^��º�D��<e4�]�	d�dαʒE&���Gk:#\s4W%e��5���|�vpX�h��?x���?�Ҷ��c�zU�wI4"7B�H�G�J�x���#�l�X�2�U�O���t6{�&����P�e�u��DT{���\����j<ܝ��ё�zq�����Hشr̀๭�c�]*Ho%K���R�����4l�� 0�el���Fmĺ���Mys�8�HTԤ�Gyo+K�,0|f����ղ��MY��ON�@�B�%�#���EX,R�f �!��|R�7P.��+�}ٱdݵޱ���K��Z9���Ƕ������Z1�Ӌ[��w�pAc�O�+c�Yuܙ��*�M&�-�*o���
v���[ɝ�*����T:�,FF��i�]Ef$@�ʟ�U�X�� yJ�b�QI�E�-�i]_H&�"��̆�p�HGh�瞯�|����� T)���O�a�,��3�F�ΆU�y��4�j�9���]���Y�3Q�cV<��bϼX���νOw�TQ�O)qZy�s�|8k���a�^���B��@�|\�
�Q��U���6�� ���-gT��¶d\ڭ�����?����Ō������K���~���d*�u�>cR�����[?H��U&��lc9$�_�����/[�~a����P�|�/����0�_x��6�ہ�>Z��T�"��7H��EM�*n�St���T�"��7H��EM�*n�St���T�"��7H��EM�*n�St���T�"��7H��EM�*n�St���T�"��7H��EM�*n�St���T�"��7H��EM�*n�St���T�"��7H��EM�*n�St���T�"��7H��EM�*n�St���T�"�Q�2xy>=����*n�St���T�"��7H��EM�*n�St���T�"��7H��EM�*n�St���T�"��7H��EM�*n�St���T�"��7H��EM�*n�St���T�"��7H��EM�*n�St���T�"��7H��EM�*n�St���T�"��7H��EM�*n�St���T�"��7H��EM�*n�St��P����������_�����^����=��a����K����*d��S'�
 �8�;�{�?�|�}�旭�>Vw�@%ES�U����VL�(�Z����t֤�Iy �g�4��6H���R�"}��*9"�v�q�q���bA��=��kQ2|��x�j) ����cU$��s� �j�dS.�IUE8���6��3����-6Q�*|������MG2�P�y$���A�{�#S�H��H�E��;Gךl�T'�J�+�� k9�
�hC������A<���#~2�| ���*�W�Wa��b%m �`TSG��]p���B[]>)�Ϧ���I�v�UW�?�=Ow���R	d�z�٠�K&�u0J����y��WN0�yZ��{�y�B4PL���*3��`�<6�I퍸f�C��3Z�I���]��{K��E�t먦2�AƐm\}5eu�:@|�9�{�lϠ\�٫[�����A���M8x�P��p|	r�N�$�v���L8f��F��3$�,�����g�3��#*9�-�5n�ԣ��$p�[��L�?]$�G !`7�O5kuh&8�I��}���&�/!�S��H�CRa8.;K�QV�V�)�K*���y4La~�����N#�T҆��������
$������I#��#T��M28���|����+��c}
p$p�u���{O SAMԝ���Q^���?�shs�gT7i�>�}��"��\P�s��-�C�L?��ه�i"y���QZ!�@��H=��	[p�>|W���i@X�aG�(�5��U����R�D�]C�F�ag��ݝ�S�Ev����0*Gm�.[u��^�0��-�*T���ζE�4�Ɏu�D'<	8�Ɛ
�y��N���@vL��iF#��a��Z��� Wl0B'��@?�=Ow���`��E)��^�iE�>�'MPZZGG�f�3,���.uP����z����%Eo$��)�O��I�6lmk0txكq�҆1�\�
~����$!��QH4��5c����z
�G���b�<1��˦�4��F̴�ub�&@�x�!�Cq*�}����*�Hm��i<��۴�x�(��2x��
[Ɖ\(:)FQ�+�`Wld����@x�����PծXԃ�^�J2�Q㑤#�͇Z��l�m��*��kil��}o��~��}�旭�>%u}*���\�
�[I�|��*��)H#=���>���c8 �R�:�c��-K�g}E�髇�x�|�[ ���Kd��%Z�~��Z�q�����*vf�h�bƙ�v���n�Q1�Sq�F�O~j]�$
�N�&�x�`�R�>�^=]9�$��V��`叜խ����SƸ��o*�tЩ�i��6���	j����i7~B0@��F
Ɍ�^�M�X��8\5m��tc��Mص�8]9Ղ8�p�4k��c8��
c�%P� ���/4(Aьf�-��.r����i�¤Ѭ��xT�@�u�/�q�(�����|���ɻ2i!�IS�}�R#ɧ��n*}��.��4y02j�KK�{��*v���U�B�Y���B��A<kgm/�+��gm,����մ�����]@�W/o}n������6�4q�Ҁ���`��tw��\�1*ɯF��8��[๓N�i`�2*n�g�m�=M�Q]�2BXICI��ճ��������T
rݠ�	��/ui,[�����Mm��g~�.�W��ki�3JY���`P5Sha�le��W5v^��~j�SK�>���R�A!�F�<�58�X�%�V�t��Snw�<}:���pȧ!��E�u*Tc8��-լL�j�L [)�@�5������U�����ȩ�[�Q�N�i �ȫ�1�=ǘˡ4�"��.�i��Ӈ�W�>iz���q�����_�RM<5(8�{�{�?�~T���ʠ>v#��h�ђ��
���C~��}�旭�?0�Ow���~��|������_�����RH8��ƥ��K':�Nu,��Y9Բs�d�R�Υ��K':�Nu,��Y9Բs�d�R�Υ��K':�Nu,��Y9Բs�d�R�Υ��K':�Nu,��Y9Բs�d�R�Υ��K':�Nu,��Y9Բs�d�R�Υ��K':�Nu,��Y9Բs�d�R�Υ��K':�Nu,��Y9Բs�d�R�Υ��K':�Nu,��Y9Բs�d�R�Υ��K':$�Gi���،��xT�s�d�R�Υ��K':�Nu,��Y9Բs�d�R�Υ��K':�Nu,��Y9Բs�d�R�Υ��K':�Nu,��Y9Բs�d�R�Υ��K':�Nu,��Y9Բs�d�R�Υ��K':�Nu,��Y9Բs�d�R�Υ��K':�Nu,��Y9Բs�d�R�Υ��K':�Nu,��Y9Բs�d�R�Υ��K':�Nu,��Y9Բs�d�RHq��{8�������_�����^����=��a����K����R���?�}Ow���~��|����"�f!��h�8D@Y��H�Y��Lv���|��oy�D�u�>l�b�_H-��TZ�`Y�8Ң���G&�
x�Ě�6ӑ���o�&s|gnj-ԣńhm�N��r	�U����Ok�-�n�y�[5ś	I� �8���h�Rq����	J���[5ś	I� �8���h�Rq���ݲ����ke�Z�>{px�y��f
ؾ0 b��1�r�֠q���n���`�+:\p<A�}Ow���L�#�W�g#�P%
]X*�b���]!vb�ݠ�V�{��f1Ĉ���7g`b�7es-����v֡Z�z��xڪٮ/��l���5�Z�I�!rڕϣ[9�t� ����Lb�^�cr"�<�d�Ùvk�p[A�ح�,�5Od��KHT䝐fр���s.�vna�<��f�읛Ia��b t��LO��`�����y ��Z\G��|�bmm�m"))p��	����K$��0J�L��7 �+���^���d�4E?D�p5#����Ñ�2�C�H��W��>0N��<e�W����WȎD��Q�Ο�7m�Y2��r<'���W�ݻÇ����$
(�j�z����C������o�v�� �(v���_$J��kk��vO��
50�(\:�#yCV�h�s�*�bx�����ֿ�_S���?�wj�G����	-�Wg��lP�E?[�� L򶏤:���M�O>���{3b1�*�-&��w�0@
_�;\�8hCD���F1C��E~�����Qk�&�W�ǽ�X��������v�x�IlW������P� U�\�d��}I��XB@�
�����Bĭ���~�'�W�>iz���֯��aq�[.!12�]|���0�y�3��=�5��S�$7.C6�\�{�������rZ���g���߿�kbM����H��8�"@p¤��T�;Ð�Ͼ1�ӑ�̪0рr>�h�G�J�ß-3h���Ӎ4��m@�5yx�}4X#�%{aϖ��nwY��ƚS$AH����DDe�)�]#�T�K�G=���M;ǜ��
4�˨����X��{�?�xu�%H0r�k}��u������g����@(��v��.���=��ʙXbt��_�;�������#��������B�I�����q ��.��4�&8`S˿hwZr4c�i�D	3�}`�:�.�J�!���>���Ց�N��[��/�2���8ǖ��9t�P��)
���?�>��zt��A��WX���^^� �@d*-�a4/fኚy��+G3�����ۃ�[��Fi�xȪ���+���^����=��a����K���~���w�?W�>iH������iם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:��;G������yӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u�N��ם:�^t�Νyӯ:u,t��H����>�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H�����>�����T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyR/*E�H���"�^T�ʑyTj����#旭�?0�Ow���~��|������_�����^���m���N�8�՟�
�U,�WT�2O�P�s�2ft]E0{�OS�����q�='�N;s�yL����K��cY� ,{;qS���A{K��
��@�$`�9{ɯ[�|�\!H,S�l�r�jz��k�P9��"H|v�U$`}u(�9���>�. ��h���0���S�
�\[�5c
J4`�@a|���\�p5�p#�
\��A0i�U&��4ѽX���I�y1�
{r{��;��j�i��?�=Ow�����7�2� vH*R,"�n5�	�51H-5�9cWiqNq+�;�RF���[�/2 �o�z�����K�x�i�n�0�\0E�ž��q�����ԍ`i��^����݀f>C����:R����Њ�[�T���;N*5ܕ��U�'���Q\�$")�o�>��|�����ʰ⭎�*9E�9;��SŔ�ɥ�cW��>u�N��<��Fhv�H���m)$���4L��6��p���F�~��jV�$�|�
Yg��`F���j�z��z��+�.��ul�B�Vp:�_H&f�I9���2>��~���w�~r��9�M)��ܽ�~p��\3�P/�Tj���=�\eC+����C4�����ASY����i�۸�D�N�ǒ����WD2��bk�
��?q�$E���L?ѫ7���R8P���Mmi���P-���T�8�!���/[�|75�#@<*�LU�يl�=�����iPiF����Sʭ�0 ���N�
0��ԇ����������rc���z,2*я���y�k�Տ6j4�s�0w�+��2)F�:qَ�F�<c@O*���BFz������a�V���Q"D(@�`T™Θ� ϟ�#{k�����X�6�:0FTk�����m�E>�m�b�J�ʴ�m?'x��Ρ�H�P��՜�"&��~WN�H׏6�8�"�3�2(q�>
D�F�Q�2�v��Q&�F�ޑ�N1�j�5�n���<F+g�E'��%>��>��|������_�����^����=��a����J93�g�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��HΎ�LJǂq��q�QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��E'*�NU��)9TRr���QIʢ��G ��F�^M^��ξ���0�\s��)@x�*�U�@���W=�z\�
��s�*�U�@���W=�z\�
��s�*�U�@���W=�z\�
��s�*�U�@���W=�z\�
��s�*�U�@���W=�z\�
��s�*�U�@���W=�z\�
��s�*�U�@���W=�z\�
��s�*�U�@���W=�z\�
��s�*�U�@��{I?pGh"�z\�
��s�*�U�@���W=�z\�
��s�*�U�@���W=�z\�
��s�*�U�@���W=�z\�
��s�*�U�@���W=�z\�
��s�*�U�@���W=�z\�
��s�*�U�@���W=�z\�
��s�*�U�@���W=�z\�
��s�*�U�@���W=�z\�
���`���6�B��_������C���>�ڔ!n�ʥ��}`���ô�ԧ
�$��pP�A�ي��3��Υw�(�AJ�Z����>o�����8� �[S�c,Y9������X�0��jr.m�}��f�P�����$���+ WRӁYԲ�GUl�f�@r�"�����b<�n�`����6�G@�N{(�G
�J�݂�]Ƭ�7�N3�����_�e5�迄�{[U��a��nU�k5��ڋ�uU<�i���0�"r}5��r�C�@�_	ԥʘ�`�V�x`rN�˶���\���\�|�|�+oI�_Cr�Ǜ5vQ�F䂿�[P�A�X���[CLQɭ�t�]]t?��i~j�r��Ͼ��7��r�V�E6�q�8#<���UQ�O`U��"�o��
l�h��=��V���[#�?l�h��=��V���[#�?l�h��=��V���[#�?l�h��=��V���[#�?l�h��=��V���[#�?l�h��=��V���[#�?l�h��=��V���[#�?l�h��=��V���[#�?l�h��=��V���[#�?l�h��=��V���[#�?l�h��=��V���[#�?l�h��=��V���[#�?l�h��=��V���J�\�Ӝ�y�vG�/�3�?�N	����I�쿪�UJ�������W�l��I�-�ppx���"A�ee|~�?�@�@�8>sW�>�P#N�
�]��J�D�5lг��G�I8��_8��F��)�J�c��WuV5G,g�0A�X�U��A�~�[=�H	fVW��)?��M���ҥ�H��k&S8�}�l�?�/��_�}G��"F�3۠d*��;�i��!���tfں��=y!��	�W%���_�DGR��"yc�ݨ�� ލ+�f֭��(9��㌝}�����,�bQ$���Tj��i���G��2웩�G:�P?��Pq
��a�Da����H5ͻpIl��S?i,H*�ƭ"!7�I�WX��%!X��&�CC:e�-�̃�*b��@����v�����]	'���x5����#���	�&�s�9 �8��h"��$�Yu�Ū�!g���`�1��j�A|�ڸ~�i��ڳ$��*���S:�
<���K���u�ֱO�zA[$V�{{�/<-�q�ߞh�c�i�x�S�x�
[kmSv��]�r�Ǡ�n�u�ܫ�qo�R��.�Rr����H���(���j��|rB�0W��I�&�<L}�;j�-��5J��5x��8�\;��*mK8�0�X�rOՊ����gl�
�y�LN�T'kj��\���1g���
��m8-����7�~������W�a�Rw�NčV)l�1�/�#�S��!,Oi$����k�.Ml��(���)�aim�%
���u)����'|����b�R�*���ƈ��w'�Z�ɴ��*j���)$�*���OcQX�>w(cqΤA���k �h�6�����cW1 HWV���5w-��� 0��I��/0t�$��Akg����g�#���ign�:�iHp��\Vŏj\H��8����{*�-d0�Ą�n��qִ�^hT��)7pKq$�犅rZ����fK��$W�~���AI�x�~�[>Y�d�Q4&UW��V�#�@[G��^�+kp��#�!jo�ޔh�vt�v�5��Et]��B��'-�W}
~��,K.��M�@V�Ũ�7;�CKk��($,�F��V�I��k �
�MC�`��F1�`QI��`�H��&H.`>F��0s[En�%��G��`Ey�tO���U��L��)�'�����c�����U���Y�e1hNr{q����[:s�M�I��1�c�{*�0�¤�M\��v_�
�0��B6O����4���NI���"�3�(zL*0�"��W-3(��/������hC�Oira�i��gO�
Hd�V��@4H �W�P
d@H����ŒQ�����~��e﫶��P�ԵzD*0�ʯ���*���\�VD$�����lª��'9��H�ʇ*�pA����5r�r��ru����vy�G�4��%\o�@�:p��T��r���\�{��[E�dbXH�' k��w�0��-	�#����ƕl�`j�Ӓ]�՞9P1W�b��Ư!��!��@���ҭ���K�:U��4�W-𼓽`冞
Wln�$�РV�#A�d��2̈_H�>H�#
��*w�v9.Om_j�0��§y�n,�����l�?�/��_ҿ���c��!Q��\1�*2E�M�
ڏ�d���=��W�n�s�)����������[_�mg�u�������[_�mg�u�������[_�mg�u�������[_�mg�u�������[_�mg�u�������[_�mg�u�������[_�mg�u�������[_�mg�u�������[_�mg�u�������[_�mg�u�������[_�mg�u�������[_�mg�u�������[_�3OpF7�1��Q�ʗ��?	S�!Q1A`" 3@Tqr��#0as���25B4PRp���?�݌�R��ls�@%d��W����=_�VN��AD� �x|�kr��<@6��(�����i?W
%��4�]�i �����H0V�"0{ȃ�/�K_���]_v��K>����ʍ{�ҥua]��(8��av_h�uCaxn��|��q�jdb����1O2�D�+�̉���Lh0dB-dTĔ��9�~g�FKN!yO5�@$��8�
9�A�%�9��I��'6 �M�2c���>c����T��oP���AN�i�uOl��$H.����&I�P!C�
-�8�0S��b=��~❯g]V�a����չ�[�m(��w�T�n�2��へ��@8D��+�j�y��%�/�?�|��q�ji�,l�%�2!�<�2��'��iKJh&: F=e4� �^�8d��
'�X��|ǒ/���|%����=0�A�̈�X��A�(9��$�AJin'��͡����&�.9����Gbt��N*Ԡ[�G"�4��fV0fyI�c�>���:4+й{[����C�;4� �����K�{;�t�R�˪7w�}b`hl����G�q��e�Y��.��Gu�Gu�Gu�Gu�Gu�Gu�Gu�Gu�Gu�Gu�Gu�Gu�Gu�GuQ���bq?��?�$�T{|�����Q��t(�������������B�У�;�G�G|(����ʕ*T��*~�*T��|�J�?��IL�\�=�[���%�`�Z��C��?9�i{�[�P���}ih��'ޕ+T��0 ~s������&9��z5�O�Q�#���Ƈ84���Qm��Þy5��ޅ��$���5��>iԙl�\C������CfC�p�·a���ˠ��{JU����Y]=��Z��VB�Or��{����ܬ����d-t�+!k��Y]=��Z��VB�Or��{����ܬ����d-t�+!k��Y]=��Z��VB�Or��{����ܬ����d-t�+!k��Y]=ʭao�ycKH�k���ߏ��LK�:�ʌ�%���{���c	�>`|�ע�amF����5�.q�<�k���$'էN1�6z� Vb�,<VL�O�N�Q1�j��	��e��wh���)����>�jL���� ֕Y���Y�y����P�^�)V{�Ŧ�k��8��<=ШU�����H �l���$��K����G���?I'�*�m'�N�.�\�Nz�^��k��5 ��Dt����k�Q�j�">�_�qXUt��z"cP�S-<�cR�[f��ԥ0|��%��c	3�IV5x�`kN���8*���#�
�Z�W�T#�o����}Z��WrȦ>f+8�eW�\�T�+5��M':	��U�`�ے��d�|եZƵ9�!��.���?�mv_�;�9�|bh0dJsZ�Z��S��x
{Ѕ¦Y���zG%�d���.^I�i5��M��apiC�
�����9&�bm6�����
����Qŋ�ٙ�B�
%
Z���:`��	h���'ѥR��GP�N�'g�.,%���Q�E�M�<�,�3Y��ȏ(\*s81��(��i��&Ѥ�Ki��&Q��\�m���W�O��.�Pk�S��g�u6+?k��Y�]M����lV~�Sb�������ج����g�u6+?k��Y�]M����lV~�Sb�������ج����g�u6+?k��Y�]M����lV~�Sb�������ج����g�u6*���	�.$�C���8!R1AQ"2`cq 3S�#4r����@BPp���?�v9�h�]K�7�]u/���uԾcT"G�=�OX���s�ĝ�=G�y.��� .� A��zA�>���g�T�l�趵y7�Oe-��]I�
�vv��L�w�s��t�a����p7+�P�Lq�q��GfOܘ�����8Ze^w�J�$��7�9+����Mt�(�#���Sڄ��܊&Iw$��O$�D�Nh��L@T�D�q�ɢa�L�?oc����媣�Ztٳ՗��
uZ[K�����kj�Z�4DSo�s��3"���`�L��A����D8���7��k��N��t�FP=Va��/YE�<��#�-$bSDg"t�8��`�S��obhLL�$)w%��
	"DB����	����5��>�&d��A�I��|�,.��O�@5�	$��C�p7FK�,��~b����,��~b����,��~b����,��-h��g?�D������?�g�1�zHI��Tַ7� �t[JH���N�k��S�Nd�4e6S�DO�{�	<]{�iz��ƍcY6����֒�U՜$4w��p���HS^���֍�4���]i�zm�����9��ϴ�}2Չ��bkjX�ږ&�����bkjX�ږ&�����bkjX�ږ&�����bkjX�ږ&�����bkjX�ږ&�����bkjX�ږ&�����S�j^2	�����CZ�h%���GHk�K��{������qo(�	5�wt��ԉ��M����c�gy���[_��/y��d��=����L��)��X��:ns�� �Xz��Q���{�FHҦd;y�T�^DOͨ{M1�;���
-��fauM���ݔE;�2���m�el>Um{*�@-v���d��;��k��s(E���y�2��%�t�R�Ɔ2)�K�E��1�.�'�aZl�'0Zi@�Y�t69@�gy���[_�����H2���t�q�j�g��z/y\a^��G-�s�j<�.$+��au����.q�I��0K�J�Asޚ����s�IW�A��B��Ê�cZ2�*�s;���q(��ȸ�^�.$t3��Q᭦���5m+
[J�VҰմ�5m+
[J�VҰմ�5m+
[J�VҰմ�5m+
[J�VҰմ�5m+
[J�VҰմ�5m+
[J�VҰմ�5m*��R�H����admin/images/icon-wp-mail-smtp.png000064400000020307151331545640013075 0ustar00�PNG


IHDRk�XT�PLTE9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`9S`��Ȁ����������os������<6P^�����ʅ��r����˼�DŽ��4N\<Vc5O]~�������p���o�����u��t��w��1KYz����3MZ��Ê�����~�������ƈ�����-HW����������Ͳ��}��{�����@Zf�����˺�Ųž���m���~99Sa��͡��x��Icn�����ϼ���r��m���UmvJetF`l���^v|B\j���>Xd���������������{��E^i�aނ@���������RjsNgq�����졶�������������x��c|�Ojy(DR�O�|8������ʿ�û������s��m��j��Wr���j��������ѥ��������������s��Zrz��f�U�{4������}�����i��f��]y���j�D�����ҕ�����f~�����������������п�����������Ǹ���a}�赉�J�������å�����ȳ�{��p�������°������⺕v��̫�Sn}��t��dԕc�Z���������څF�ì��θ��׿�ǹ�Ϣz֎UىN��DZ���Ǥќo�˭�������������и�ʳܢs�R1tRNS���3��Y��b�M8�k�-'ѱ��ڌ �sT�EĽ��y�?7?vHIDATx��{H[wǯ�����]���u}�ѭ�ߏ��%�˽I$����$��P1�u��ڢ�"�Pu ��?�����c�J��
ڲn��co�����w�n��7��l���|=��9��P�l��&�l��&�l��&�lۓ�%''|��k[b���c�"��K[�犤]o_R_��#v�e8�8����J�v+���P���7�����Fc�1K
iT�_f�v��ε��H�줢������g��B���$@Np"��@�> ��exF���m^v����=����<�`�u\�j�$8DE31'���;��X�yP��=JE3�/��<�	@�;���hn�b��-�Z}�
��%��@E/.��}�a�=z�Αb .���T�%��b�K
MӒ�Q,��}��/@Li+�H�t�%P���)�����ى"qG��d����Ay
hҋ��u��DE#	ǥ�r��q����y[���B��^ ���.
�D��-LB�xd���,z���ȉ�‚E�0�8@����5�!�U*�8
��t�`M�6?p����1v���lAUPme�`���r�C�a�ҫ�Z�%��2P:XH`Lf1�;��+�R��!)mG�;@������4<�`��}%�lpxOt���A���������5O\ >uWT5��� �*����W,_Z|��ݮ��{^���ē$�B�y�����|uCY��k�����D�|d�V �9*:�2���NS��c>��X�֪����������n` �Sg�!�ᥲ�|�^�Ѵ�V��kz*����q�Qwd3$�YȜ�t7�9v�Y�(����?��Q��)���?M<�ZX��Pm�6-����0�x�6k��"����q �x����o�,w�����Wb���WG���E��{�H<�5�g���
&�%H����7|��tL���`G&j	vG�i��	���y8��_1ң�2�#K��8@Pg���V��G;Z�����دV����wu�z� ���^��o,��`���F��R$��ܚ�f�¤�2J��9��e�o�w��)5u��#m`�&������/�I�	gGR����04Xf��@��[�]d��>����>�Ғ�@���{��U�R�Sp[���.��������
��&EG�m��~�(�C��x��
�����2'
,\/�_M�!�A�+�*]�~�B
Q@�Ӂ��~��
�#��I(�)�~������%qR�.���`����;�]�2w�c�Lw���
�W��Wj�h�����Y�"V�x( �τC&��+��x-O0���+p2��O��3,L�$
���
��[ cd`X��I)�m(�`x����R��w�@C��,�Sx	{�RIo��e��C^%�'(e�# w����a��jPa�!\jG��/���b�s�I�*�#4�M��Ė8��"�iw��y>d�y륆�<�3K10fD[���HxE���B��k�X̴��v�!�;�dɯk��ӱ�\��m��XT��A��΢�p"z���	�~���/>J��y5w�@������ ������|��%4���5�Q���2�#x��b�@b�\��),�q4��d��q�<�k2�=F|O������
0�s�4G�P|4�h4����F�ء���]�k�����\A�{h����U+jo��~�1��M�54��;"�ĝ�>T��<SI�3�~�	kh���*��f���l
��u�=���|�Ɩ_��ٜA�c0��C�E.6� lylp��!�-��T"7[���L�^�>�X�
�T^f�zZ����.3���@%�4sj�(������k�T��f�M�0��(47������)�@��� ]vN����.	�/� (mC�}Y���g��ᳪ�_��3*�fT��I'I����2�G|�C=��J�N���6�t��y��3��q_�6����/-��'O�N�0��v�h�@����œ���6[M	@<���I�yP��p8�!�ڀN² `M��:X�k--=͵���6� J�ˀ$@
ԙ�'*ĭPp�Y8�m��g����tҶSIL2�V
��n��2ͫ �aY��,#�,@N�G�O{Q�vll"<��-�i`��5�s/+�_pcaf~jjj~f��0�h�	u��g�����Ϊ$.��4�T�o~��"�OE�/���@�,ƴ 0ol܌,&�B�ŵ(v�N�e�)�����p�2��8r�$�ux���O$��
��QA��ˡ �M�g�D����`�-��S������_�q�@l\I�N�\��ZK��+���u5����؞�~�Jf9���;O�_NѴSX&�%|���R�g'Xm��j�Ѝ���(�%� R)����Z���MRXc�y?8['@pN#p�H3�W	v���`+n����uX����z�����"�/�
@�6����I���P��,��u�y9��f�ӌ5�bQ�n�ԓ^,Z��g_���䔕3_O>>�9�S�bBF�^�X�!�M^�z&�=�v03@5ޣ0�x��78V�^6�T3��l��, ��A�
3�p<t"�k5t06�=wu�#Co�$&<zi(� f|m]1��M��HK�u
�@{�<x!.��߮wx�"�����j�n؃+�)����?�re\Dl니�$@�M���R!~AI�n�6`W�;�)����\����h*��e��D��M�O���o������SWp{8>,���̜T`M���,�Y�&`����"Mz������{��#A��I�Sax������(�������w�sya��[#^���L�}��@f�V��qƆ��r����]����ە-�&#mv�~�	0�(@�����?��g�+�g������R�|eV��=e��d�KOUy�ś�*��
��S ꖜ&1��N��Z���2*��~�
�O$����{E�����nF
T��2w��MQ{o����>�D��!��
C���B��@D$����)e%����GR�"J�
����]��GĹ��m�s��'DՓz���|��ݻ�[���Gq@<)�L��b�E�b�ABvF�X������pŋ�\����?�x�'@�x||�Q�3LkuT\z����.�K���B����0��\��~�v_(AE��*����5(�>5}6��iP��q(�/$`C�1�!�����_��
����ˬ�||�H��Ƌ
@�¼�S��7���� V�h��`������Iv�>�l�O��?I��B�X�>�*���H��h0��g5�V�/�L^$�tN`\�ƅ|X����=��m�i�`�h�D>�X��H�x��eI&���AY��d��n�`�1� x�G�'���K��U��q(E�Ok�hE�Y`�-�vD�E�������� ��g1��4�7�Vޚ��)2�o��m)%@j�)s߯�g��y��s-W#ɋ0�����R�W�}�B�LG�߁��(2�Ik&L��i�[�&^�$��
�aֈ0GZ͞O J�+�z���6̚�N\3-{����Rdt{FO@�����<'s��8N<nh�W�t��|p���~fǧ����q���/5��>W�gt��JO�I	p/m�1��`|:���gZ���k��K��́27�_k�e4O�c�}Q��>a��"�\�)���%��/Ɣ�Th4~W���m!��G ���2����!�™���U�F���$Э;Ef�)��G�o@�� #�i��G�ÃZ������k�"�a��p��L/�+�u����3O��k��
'A�Fh0~7�>��q %���LЋ4M�Q�l�I@�c��+� ����BlEn�e^�v���ٿ9R�\�b�2���h9LF�]�����yUC]�$��"ΐ�?�k�X�ˌ\�*}Ÿp�1�4Ͱ@��iP��L�Ro�^'�\0_��h�	s� )��9�M�H�j=B�֠�7�9��q�d�uUT�>Rg»�!�X>!r&n�s�*�O�x�� �}���7�QZ6��+H��zdz(z@R��`�.p@fR^���h2e.g �~~�J�P@��z�t��0"�M��WuiL�I��ߕ:)�h�XmJ�Qoa�D+
�����m��w������+�0���6��=F�|�r�˥9ӧ1�{�H2�Tu˒�6;�j�i���8�;n2��]����L�U�@G)'0�?�C��_D������?!��U>*<�w�L\7L�`���N�����䵍s&z�x�JŔ1)/8f�h��ܓ���BE_�H��	n@��4���� ax��H�3�R��,N�Rco���8�B�(��.��7�W�� Q���Lo%h,�J�0��0��7~��Y1H�5ƪK	p�
��Se(`6s΀��ϭ8�A�$����
=8�Q�7���� �[ey1�!���~���[�� �>�Z�
y�AOY�楫(�V,����询cN49?C�a�a�\���{$�@#�w,��_l�����zH�'!@u5�"��hi9-���g�0���8�db%44�c�ی���~w�l�i��\&�ZB��5�@7��d ��g�h@&փ�~��z�}�
d��̀@6����VO�1�'%��GM���0��(�"��d'������<h+�a�vg�'@=���2@>�O���"��l��A�K��&p�
�| ��]TT�b@;���PoC��Dp�	��՗/��.�,��J�&�v$zA
�2)-������f�0�R嚐�J�0@6v;�C���I�Jݓx,�v���a�B�T4A�����d�>�e/I�Ί��jG�jX�C�Z�
Ћ���4�4Āec5�쁵x��$�E�ǻ6#����9��3��c`�X�{�%�9��A�K~P�HU�i-X"��y������@`�N�dفV��+�b�',�,h�|p�*�$�)�zW��?�GYl,�	�
��֩1<o���X#O����1��t��~���W��',����GR�+@�@���' ����#М��N�1d]�MɊ%��2���M9R��+�qf�:�0G��A���A�iO��j߉�ه��P�{kA�V�r��Ś���u�?(^O�ioB���;-�ٖ�C��3�H��0�Y���-`��1�W�k�)�p�,ks�q]\7�|��	��cG#N���E1�w_�!����f�ȑǴ��)�#���F���ɞ?�;�ަ� �/�@y���Qʣ��a���<��Z����!��dU2'+E)_!H9�SS�X%9��S���O��R�7�B줿[ǒ�{=3���f:'’F�JB�Ć����AX�ۋ1	ӛ
P�	���N��si�s"���
e�0V�a<����C$�\ܵQ��:qJژ
^�1�)�K�j���c�8�_�6D����G�G.,Mb8�I�	��D �M�-��q@5ѫ�?�ۡ��ܜ�8�~�
��%tc{�$�&
[o+�o)R�>G	p�A�.�z[�
8P|�2�]�ڼ�E}fqQP2�$d%��e��o;�[�8P`����s��#(	Nu`��[S���#5W677�k�݉����n֪�f��>��X�wX1����1���K��'9�2�gb�S0=�0]7m�!��MH�ӊ�7��jjd;��z&�݀�8lOo>�c�o��Cc�r�$�}�vn���2Ftn�3�y�%�Nn.�$��[V���>T�$�"��$#��e��a���]�-���U�06�D2�‡�0l���h=��%�O ��K��z�x4�?q���}�ۓ`vn1��%!��_��l��@��FTCjb�r]CIqQ�$V�0O$cj8#P@�̽x����>�au��`u76s�����r�f8*�mЈ�*�j���[(1�=	P�,Ce]�
��Q
3�6~�������U�֪��b`]s��\�m����S!.�&̃C'Pr��CL�=���5{h�e4W�M��m�ۤ-+��J�M�c4D�l,���f�΢�S���6c̶�Vv���Nm�F�F�w���;�X��$X�9���CA��B��}M�
��㽮�wcU�$>x&n
ʀ2�U'Q����Q0�d�'&7ʸKl#�?��V��.)�烙S(a&cC@��q��z�M�}��D�q�����t%�x,���d�Rb�^;��^`�t�m�
����J����\�8���4M�E;�-�X��2��47�o(4�wh���=`磅��s�wpe�W��T8~���.���@�pd:*}�Z��s�����6���7������8��}P��RD�G�Qj�M��i㻊�Ю)�]Q.xi+W��A)�6'�����n�t�`r���Gis=�?��U�(}�I�i��4Ǯ�=�',>�I�Q_8>�+`�P�O
�p���y~�[]&�+V��9ah���ñ?�'��[�|�O�msz�[P���a���f��+ K%�����;�Fo��r�h�]����r�HxH��Pq8�
���?��W>po�]^�8�ΡA�S�Gi0=u�U�$�����sSR��
г���~�{7Рp��#�%M��'����#s�N�g$�WR���j%y^�>��'W�SJ��%�o9nEy#�C��Ĕ���K��u���%E�
voP��~&�Iq�7Ji˳�a@�"�|�L����΅a#���[����2��-��AOA��+�FB�K����8�b��e�,��D��ȅ��y^�X(mQ��3��c����_ȵ��� sd�|�6�P��A�Bh�Y�Q*|T:�3T��Y4�ܙ�H�Q���4jS�cj�F%�QQ���dN�;�wƞ���R��%�䓲"��ѡ��
~<'N�d��2<t�P���LI=dt�֡r?����L���[w�!d�ֽ��3se�P�rdbzJ�?NN�G������
�0�>�I!�I_�Vm
����ϵt+*qe��lgf�����W��$���x�x�J,9�F!F�l����lrw�67�=?a��:K��<1����~�7\���6g�Z}o

a�T�s��?_�j�e�Y����7�c"�nIEND�B`�admin/images/icon-edd.png000064400000017766151331545640011321 0ustar00�PNG


IHDR\r�fbKGD��������IDATx��]w׺�佛�@��:��ޫ��Ӎ�`��� �z��0%�PM�C�p���8W:if�i���keI������_��aA�'��_\� A �@	� A$� HA�� A �@	� A$� HA�� A �@	� A$� HA�� A �@	� A$� HA�� A �@	� H\� A ��e+}-��n'&ҦN3��u6�����ψ3gω7o*�}�Ⱥ}G���7n��gΊS��Ş���w�7��3���SE�ACE�m��+�����Z��X�O�J�k��������{�*��۷�j{��B�w�Sg��.={�򕫉��(/a>)PDy�㉾w����a7���?Į����i�A��?��oG �E�*���Iʦz��p�={�\�?xH$O�(�W��ߔ@h��qbz�lq��7ޫW������5kŬy�E�T�߾KwѴU[q����q��m��߱[�0$Qy�ϙ�P�^�N:rT����s�p��"5m���oM ���eʋIS��+W��P،g9/֮[/Ʀ���mڋ_����S˾�9�[w����ť�W���;{�1z�xQ��/x��l�v��)������S%؇�h�歔��]�'o��D�����3�C�����u{+7oQ<+�� �f��ɇ��^�.|����S��E�������<�A�Õ��^!����yZO�n=��2���+ר���zM�=~,Ҧ�?+�{��l-UF)�ъ���@	���\�kR�V\�g�D��ǟ�G�)3�E���y/�����>W\w�‚ٻw�]�+1��ч�
��~	���B��f+q;�<H�*��=`�x��Q�"����xX�Pi�{��+u�l�&�ڈ/�ti�͜%��,�',JtQ��-��:|��nL�3O	�-[��p��ox�I):��W�
�ED+Y�\廽|�2�:�|�Y�!�9�=�3*6\�`q�\Vm|d�7i�lp|��?����4�ܹ{W>zL,^�Ly�i�X|\���=��X�`D��Ƶ�-T�� 	 v�޻oPw����W���R9;/Y�\�r���"3
.;��DS�ّ{mش%(�fe�-�u�H�.p�oݾ3��@1L��uL�+�����n�p�g�B*��N��T�xf��r<�*��ֈ<���$Xt�! ,Pչ{���Zk��/Z�i�<R���G�����z(��P���b{���)�ȆԨ�"��A����k�E�z�x��,*���@1��8�L�i����(B3�Y�s4��HM�_��y��x�>:9�c�h���G���Q��`zAO�|��[�D�f-#�|t��~m�yD�'{�߫v�F���G�~'R~Uk׍h�е,��c��ɘ@��9�����l5�d�]Z�pf���.y���"1�J�3�w���J�Ѓ�d��$���o��pG�:
�p�ȱ�%�2:_�N=���v+�df��M�z9Z��Aζ���^&���V;�_��װnг�H�Ն[���Fɮ����M«&�9R�8���M5��5	@G�\͠�NM:*򂹪V��I��D廃t��7	'=��A�ϝ�p1ˈI���6�g����N_<�f���j��^��j��R'�!�b2�5jb�b�	@�d���Z�:��>�8.�¬�����P�l����
<1�I�'���E��FͻQ/%�fV�y�r��3f�1�
@���_|ڰ�<D��ɯ�B�і]T��$S6���o���|b�]�q�S��j%�F$��5������ 76�rf#�D�VR�m�.���K`�����K��9hBA��N�f�5Tq㑺�{�j`���o�ظ��Jg?������bq��a7���Ao��k��<x�0�s�5 xh��
��?�(X��D����T7�W�6m�1�
Մ$#�Ԣ�Fy1�7�l	 ��uTYir���4 k@p1 ,!�T2�G>x؈���&3�l��J���%����_}]��֖^���S���?C6c��'h����{M�
�K<�J�
@	Md9v��Ϙ8y�p�y�r{	0bL�u�]�(�3���Qo��E�i����~��1��I�e�%���P+�2�� 8$��/�+i�.8��ǁ���躶�J�#V��Aw���y_�JB�F�T�{��ܰ�1z\�A�X��(̪�$�(�p�A�G�
�5ԓ`C�P�D��Q�ߒ����	?��5ku�5j�"$gZ��;JHO���={�	��'8���
�һq�2FK�7u�rt�{�?.ҦN�&��p�JC���h�}��FPu��N�QY	�a.�N�N�����G��'�~�ihH�b[*��G���Zcց�؏lpBpԤ�0�Ro�O,݄�y�-�<j��h�*��w��(�x*_׌#غ�'g�rۨ��S�U=���x�l�w�{�-n���?�l�����]���5���@�]��S����M�*��|�z*N���7�|�3O����p�H$�(������t�w��ն�XCEح����&O�����9���uSm�{@.�řM�\��-�خ�'5m��@��>�EB9���..v༆���-�X�+m�$^3mlJ�k6���sm��g9��(�� _{��oJ��`,Y�ܿ�+���N{*�(hWu�oo��1W=�ar�„�)$;�d�
��3�5�����3�/��;������У+�j�w=%.�
p>���ײ������0�	��6#J7vA߄��O�["^�\ŀ
F��b����n��L�|�ߜd�Rw|v,гOGuQ�b���ljL>�[�+�LL�A��	��ރb�h��FJR�)��pm
����oҡkwS��ȣ6��lۻ��.Yq����b0�����>�6�QY���ji�>�洶�Y���f�Pc�C��n�f�Y�jkԼ��5b���a\	 �6pV����>Z��G-���ڔ���G�Nक़e�C�׷�jO3"�(K˦�ь`20����Z���'*O~���	<z��V��Uk��͛��N4<��:6���~�A	 ���!�����>��Vo~�H��$#��i�j�w���"4*�G�$� �G{ee���S+��淊�YJ��*f��bf_�R���������q$q�(@��Jp>�5h����̯�cN
��h�ȋ���̯G�̪��@9%���'H���2ck=!ge���'�՞d�?��"%K��>���-OĢ%��m�>$��yf޴i3l���"�7�Ѡ�35��V����$MOGO_=n<	�j��ؾ)g��3]�p�h>">�o]�z��ŕ�X���<@4�h3���L���V��a��q�ֶz�[�	���
�Q�NCY�.O�hxZ�V�㨞�"@�?i�a�]�b�m7�U$����M�W�®��*�d��G*W�:�4�YpLz�l�%@iV��,�?�1e��>��Eɵ<,#R)[u��y�h0�����5~��!	���Z�߯Ӡq�4i���O��Ϳz�:K�Y�9#Q�E��M[,�n�Zu���	��R=���R�^q�Ļs�}��5�Z-g���sm�⌰�+V���9��"���S�V�/�&��ږ�;4�i��7�޳���eּJ�}h�Ģ|-i�X��P_9v\��c����Ĕ�f$G={ނ�~�9��6&�c�V}��ib�	�D �%��k��8��O~9E5$idL����	h�1u������LD�z
��WZRLrt�˛ߗjh��[H �QӰI�g�>��eC�9	�$$I�/�=qR�=W�]��W1�@A�~�
����IS��>�
��I�IX���oq�._���?�AݶU�N�|���	��2&P/��<N�ª�{~�{�C��A���[\m�Ҧ�˓u����pS�L�lO�zZc�f̚�u6��F1���l"�|�k�����$OR�>�G�~~�G�6	��
@ٴ���~����%fH�;?�g�>򵿞=#�%8�kp݌�6��w���8E�P��b���:�ըk�2an~���$p��%��}e�V������v>2p�"%�<�j�:s���{�ҭ$��5o�ߢjM���<�3&`VL@K�:��U�N�Ln�5�៭;tⓟ��%�@��u
��hU�t����I��O����io�@��8	@P�5r�����O���%�?ټu	 R`�5k�.��gΞ�3�|<�E�к����B�z��v��a@��y�ߢ��3t�>��	X�	�LL�Zy���ٟ�޻編h
��v7?I��2#�P͊��$
`��i�����'	XAZ�j���.�"Ev���y�a
VM�ᙟ1�{K�@
MJ@�	�O~���	��G�~Xy΁V��
�`�  Aإq�A��	"V`��@+�(
A���˛��%ƤL�W7m�J�����x���o:LK�����s�"Z@��M��N�� A�
XKA�1b���*-I0��N�9�w�v�EI������j4L��\�!��:�f� ��'BcP���YL
�ڄ�����& �� 	 �*�8�{;c4���5� D
f!>�Z��j0��`,�p��*	�c�ǃ'�O%�����7Y�8ɛ.`�E�n=Į���w�ĥ�Wı�?)R��O��h�C��YY����)H&��i�A���tQ �n��������j���"��*�f��)O0��ɯ�f�:
���f��S���<yb�����3��:���[#hX8�;���9���ao>u|Y������1����cT�7n&Xe� F�|��T���w��%�Ղ��df��:%�C0m;u�[d�]������/��.P�j�Ar����>�߼�[�ju�L/�,��x����B�5l›�o 8�g�>]��͛�f��J���9
@�VmD|�e�l�K��-��������s@-�����aV"�'�u�iiԼ�2��t�u�U|�q�������|�T�iބc߁�!7?jӵ�ۇ�[�^��Z�{�@�U�Z+.�x�d�
L��I_�z��N�8Ԯ�(�~D�	�B�ͺ}�i�+��T����?f�qӚ�����S�N�g��o����S�����2NY�0B�	 �e�<�Q�!Z�4j,7����_{���S��M��7�Ҕi��?����"��Jp��+W��/��x�$�i3g�->\1�G���ײ��.+�n�Ȑ�`Q%��kC�F���/�WR\._�dV/ߔ���{�Zh�q3�tW�ݩ��'�2�}�.Ϸ�>|�HwY/���_�rUnj�@����^�Ω��\�K0����7f��<#=���}�E�U2.�X�\@����x�2�ߠ�	�r]Yh�5l֒�A�m�.7ͩp.�R'�o/��q�6�#`خs7nz�$���J�EhŔ�����P
h&Djh�B� �40��>�K�9���K�~���l滥z��폈І=&e��˭�~��)�N�.���fz�ln~	��5R���3;l"��W��~��$ ������|���2�����b�U����I���.�6wZ0�fF�0�~�\Z�^�|�l/�jL|��o���������ܚ�����F�)��/Aw!�C�^�Ȥ�6*9�-��@F�W�];np�������@O�,����H6Z^e�е;7�`c�;^�Pk�6rt�uw���M��.�4�/�����d	v5<l��[��	�T��:�E@�6�n�%˖sc� �ʒ'Lt��ص; �T�f���
�B�9�J7 ��h(������`�s��Z�If=|�Ѿy�
7���_U�<8d��a)Y: �{ǥAOw���l��~�
��s���&��ܽgo��$Ƣ��v/�p���q�bJ�K��*�ρ�ҋ/B��#G]����{,~�n@90���Ȯ�Cr�'�dć%�ԯR�L	fj
����ߕ�r���+���INF���"��/\tݙ���+��e��_��5���BZ��i㩇�7$��؁��]'��ѭ���H�����	@�L�n�F�\<�h���v���7��of��&�����|��D�+U��{-βm޶�+�h� ���<�����{9�ڎ;n��?}�+�&�e���ի^J{����=�hlq�ܼEK�	h�6��>:Y��X�,��?y�T��R�K)_o�\�=~�wtC�4T����aS�ٻO��w ���=(�ukq	@�ԙ�7>�n	p!�U�v]��ř�׮�w��UԓeC��u��ʀ7���燜�l�#Fy��˛���u�n��¤�A��UG�����V�Z<x�0��g͛�ժOo�VM-A��ˑ\�� p����H�G�+e��@�mW��@N��a��ޞ*�m��}W����Ƽ���F�Rq0��ϧ��Eȍ��8�p�@�5�QS�CѦc���Q0�\^�O�P�D�H��HCD%�'Ҥ.�$�@\��=y|�k�]�����
�pmP�`QP9s���Iz�j)B؆M[D��E�N6��5�3����$�ui�f�
c"MX�j
��
Q ݥV�yo�	�0�$R�@�m���F6!k�+��!�@ ׉6p>F]��mڲU� p�b�(Q:G��G�����M�b�J|��1�
��)9vԌ�ĥf(�4	����"# b�ݢ7`=0�g������xD̃`Z�ZMyn��[U�c
D�1�,;;[u��E�׊`9 "��`��������%���e߮�Ĵb��еW��)2��C�W�V\V�Ux(S��ؼu[Ѝ��fAr�H1��Xt�&҈�w7Nұ
n�0cI�� W�)��H�A��Ĺ��THP!�H"(2aO��$Gs:7y�"�6P�{���ǂ\����Q���X��\��֖~��]=��SkE�M��@t��Z�M��+l��?�R����R')��Ep\��P�D8e�m��A���k�q[�,Wf4�2��&M�Ƃ��s��y�7=���Kb�䩎�)�s�kʼn��(s
�L JM�ʢ*����5��z��.��7o*�n�p���v0���	�z��hꡫOp= Z�.5L�
��{��6eL<�[��m�Ok�@�EP��wjjK�oܤ�R0�G�lm��I���K�
O�qA2l@�Ѭ�`%��;t�S�
�\���P�y��1&Y���=@ ���Sf�+�*��^�P����y,�]z�V*��7h��90�0�l�Qy͐���9�s���j2�pF7����7eb��Ƌ�ˊb�i���J�Y��z/L["����h�<��qoЎ�X$��@;.�0�q�0	��M�!t	�z������Fg@1C�="�[��P��"���x$"֢%9O]�Y0`�P%P�`q�"�
��S����3g�
���;w�x��I���޳W9�#��o�`�%��{��&A �@	� A$� HA�� A �@	� A$� HA�� A �@	� A$� HA�� A �@	� A$� A �@	� A$� HA�� A ¡�Ry��6��IEND�B`�admin/images/icon-all-in-one-seo-pack.png000064400000015114151331545640014201 0ustar00�PNG


IHDR�����sRGB��,	pHYs���PLTEZ�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�M�
N�tRNS$@Ui}������������ô��xdP9>g�����£�\3Gp��᷎e<,k��ZS��Պ?)t���`w��ar��[J��0��ͱ�8q�R	nMЭ"�
=��-�l1ݼ��6�h�
�#b��AX��L�5Y+��ۧC!�H7�;f �̜z��T�2�F�ި^K�N�y�&�*���u�/��%O�E_��'�(��m�c�.�|4]vW��I��{~V���:ԁD���B�ŶsQj}��IDATx�͝{`MG��x��V�Q����&�ƣ�HK��#��R�TI6�i��J�i(�F=+^�UlE⑒>�P�eiYV=K�.����:��3g�7�9�Ѻ��̙�͹���
Ql���x���w���x޼TmW�����&���Z�c��.v[�%/���C�j���G��&k�q|���&Z9��"�7�X(@G׿��P����22�*�C��!��
�&�=�Л�b�vuh��V- ��˥�[U�A��m�`!�%7���x�?�T\�/�
�Hܑ؜D�����ܣ�D�i�I �Yɏ��b���BNK�H%�2���<�̐ю�N�H A�Q���T0�^�N��f(��l+@��u�p���7�N����y�$���'#��]PS]�/�� ��&ˇ}|$�zN�&��SAz�1��-XST����kZC�,6(`<�.V�:^!�"ՄH��R��K.?��D�@p�^�h�/���(��=�x�uh�ݪoױ�Z]������ְ���ca�$��`?�΀އ02������^��A<^��4F�x��0D�f?�4�Z�x�*wY�SņZ� ���E�h�o����f�8K�
�^Wt�R��� ������J_s��`&�o��a,א�O�����wI���x�d_�CZ�mv!rs�}	�d����Y�a��*�`⵿J��)��^�ne�%��;��d�42DY8�-�E~s��L(k��<�R`^�%@ᅷp=���� ׿���vz�`�^��:�?g�e��S�1��W�tͫh�!�Sϥ����dfT3W�!@ժ�kW�>@�y9�2����_A�a��"sP�GS�o�s<g�?2��0�~D<ar�T�G���8*��opp�P��<8�~�L��o�_uR��я�0+֎3zn���B(�M���U�׼�����1\�k��@��(K{RO������IcI�(���B�=nyw��Kwb���=x�ѴފLZ�̧I���z�|B�mN��^4��ԫ��Ĕ����1�	��r�*��D��w���y�j������PG4f�G]N��+��3���>�K=�!ա���(L�\u9�W�%���('�+�VZLy�rS���0E�ڿ"/W��\���
��<g�\�c�2�G`,@��Z��ݲ�m�ѭ�%�gȯ�2�y�㑃���.�۞mp�P�������O�����.�<�ࠡ;��/��Ź0���]‰Q��(۝����h|�&Ihd��2#pC7��$4���T?p�@���I�e2Z�"gi6:)�=(@�Y9^ �$�7_�V6�	��N)�R��ӎ�4��������R.���ӎ�]]��*@�D�ÒRy]��̖�����F��t�N�򐬘̎k�����I҅��|6pN�~VVKW�+]~,��sIש����\�ϕ�B�7+��a�P)�%����ҽ�����.�K<Qһ�K^veI-��/,�b�S��t�f�ZKkv�	���kl\)%�YO竒<�t�A�rf��$�ٚ ������=#e�dgޒь�_IiF;)�
0g��@��ԖZ����V��j��̞n����6�hބ�?��rP!�Z}/�͔H#v-D���1���D��[kxKB4`|M�zRV�7����_>�+��}�!��}|����<(�@��f�fD��=[a�%J�@�~�~��2r5����=�>^����ҹ�������0�B�J�c=ց��k�_t�W4��
p�-��d�&L��¢�o}☱�&� �6cI�ԝ�9:/�����l�
x�XBZ��?���eH��ET���W����߄�_�^j��=3"�?��F�e���"-]/,��w@���5�>�o�u�<FAoK�4[A�E�nG>�	���|�o�`O�ūKy��W��00��%o��>]���N=v���'�3J��;s�5��[~��)�����vz�$F�Nr&'J�zD�瞘
��H��Ac��r���&�1��]b��c�|�q��X����4��??���q�w���9ޒ��كK�%���@��VUZ.v	&�!�\�m�����A;Ɠ}��5J	o��׏	_�w6w�!��<`6�K��glj��&�qg�PGêNr?ٯ"L��/q��UG���p7������[2�n��^�[�Iy�e�f!U@l@T�xW[�H��ӉE`0ug`�p�q@a�S�)@�Q��v�xѬ�6���J;��bqp�I�q��wЧ�����$t�<����;`��ПgD�*�3lއ"�<X,@�q��*Wn��Ǭ�XH�T��#�
�a�B���1R3b�3�#�z��F�Q�)��i�ְN��?��E���$d�V��V޲�@� �ٳCg~jX�T�*�Lu%w�T�W���h)m�O }�xt΢���3�1�Ew&�#����CA���Z�k&�Op�Ҿ��*��r�v�y�GU4�᱾�8��u�u�+��|<?���e��OP��b~����p�i��@	�1=�Q�M9���~D�c��-�=MF.e`�
>JA�R�+&8��l�"���6�8�5�A���d'���F.�HmF���1)�``�A�e�,�I`&Q��b�A�Ӭ��	b��l�Eÿ3
<��x�nz/2?�y�U�y0��m��1?o�*�����!�o�t�O#�Y� �D֫A�kp�8F�<��� f ��A�3��	���0��HcP��6<������&oXV�
w���]?��0&uf+��
w�!�D0&1�HІ; �x۪Ic���0���$�R������J�p(ժ�����FV�t�U�Fc+k�O&�f��Z:9
�9�&�Jݎ��>�B����"�;,<Ղ]��e��u�(l>"��ȵ8*��T�ku|>���C��c��v-����C�/�f�"!b}.��S��m�$�C��[и�����'��	��E�$U�����ۣCQr^�.ʑ�_��I���G�����$`��/�;f��zU�Q�Rw`��h�`��'���@�v�K�U��V�N��B��
��H����h��,�.��C�$·7Ν����Y�@pk�:�$���&��(�ѨL�����eo�D˶�#��*���$��08G��_r��N����J=p�̤��c_�`m�i3�ts>�����ɧ]�OS�7�.V��5��_�9f{�P6��9�G�&t`	�"S�ᕜ�M����ޢ��i�I �cs/��ZF��y����
�q#�C�
�d(]�3�j(@,���(�
n�ZG�۔p���"4t�Z�)��wr�C�N��	�.a&�H�	�%�O�q��%۠�
��'�̟\�Fdj*��,��.H�@&)�DJ�H<�2@���>�B��Gم�d����$SS^��.c@���^�=f1� �{i��?�'�P:���j(�o^��EY\�'3�r�r�M<�<�؛`¬���v6Y�Q�HDo�{O���
�z��<&�/�=i6aF��1�W�cl-X4�7ᙒXgQ�)�?�?	���έ,�RS)�u�W���Jg��#,�9�z���/i���){�R�&XN�j�Ro��
�F2sՕ�C��y�n��`�Z�9ԭ=�l��v�nJ�匏I���؝4��z�Y���[�d�_
�U�߯ht-�H�@[.%V��ˠ���	ӭ��o8�+�Ú�5�}
��Q�^
:�G��*護��^C���0N�.i���]|�8����|��F_6��q���`�#�DE@�ԇ�&2#/�X�ņ�|�6�r\��c�v�Ѻ]Y�Ɋ�ܥ/�X��K`c����Y��f'G8��Uj3G�PbZ#;tзّ�ђr��5�
�� �﯄iB��
�0�t�L�`�P\|�m�%j�6��F<	^!��n��'@��u�^k�;�D�~�ʺ
Y�"�p1�/�.*	��W�c<�aw�%`�"*�-7�m�:��Ԃ	�	l��.���|#i����0d�9��ߥ8БUʆS�~�06��G%e����'/&W�nFT;L	^�N�0�	K���(�ƈlA^����rc	�\`y�G�R^�qFL�.a�afv������Ň����a���Л�&�A�ӽi�nc^f:OA�cH���:IgEr�= �)�$<
-���'Ve#/us�y����1�9���s�h݊Ђ��2���J��3�
觠~�m2 ��e������yVRt�XPc
�Bi®��fw�.9�h^9!&�G�Rc�������;��]}�)1=͂�uM �/jRd�{�����7L�"�DMvB��~�`�%]�Ck��֧L*u,79�"���]&a���j�v�q�I�l�˘ޜ�Fț�u~�q��g���P�8�eM)��d�ho&@�P�}�q��ӷA�2�Z��
Dr1s����Q�id�#a_ .;�с���0Ҁ��}�m}0��M|*�C���w'�NJ|�I��?��_<w����f+��nȦ5F�`�f;��\�?[���6$�3ԉy�C��l�},��h����v�F^t����<�
�'�[�Ӭ�Y��ЊRe��)��Z�=�|j�AS!�T���D��$B��P��mĘf��;B�92H�����@�x�����E�/���&l&�������D�qH����/�n^$:��|q&�Yƾ��:X��.x��`����x�+@z"���w)���'�<O��������[����JE�J�r{|B2}��xG�3A`Tg��cP��gD7��������z{7ExWx�Zg4��`���HDn{�_�z
�����X+l����m�Hfn5���`�!��q�	�{֐���ωH��¦"	Lm`�~xz]����Wn`,"�'��~����$�Zy�B�E���|M:x\��5��XK��A<��N��%0��wD�߄��Z�I��x�h]T���1�eq��b��ȼ�/��՗@3�r��&�θ������p�t�o�S���N��t^^��;��ER��e^�(�F�	n����Gk�^�:��(��vK ��K�!)��p�Z�&�c�t�)_�,,��
9�8�(�����ʣ��L�qZ��2諨Ւ��Q�|Xz�p��3.�JoU�!Kd�)_훟��,b@\��,�L,�Ax�"�tit(�T&��`��[t�O�kF�+g���a�b"��#�&'�Y�@Ca�N�4n((B��c��vn ��d�_:/�	�T�^����qs�@�!$��i��lm�2i˝8f&Y�(���:�>2wp��)�H�${IEND�B`�uninstall.php000064400000011612151331545640007276 0ustar00<?php
/**
 * Uninstall WPCode.
 *
 * Remove:
 * - custom capabilities.
 *
 * @package WPCode
 */

// Exit if accessed directly.
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
	exit;
}

// If the function already exists we shouldn't run the uninstall as another version of the plugin is active.
if ( function_exists( 'WPCode' ) ) {
	return;
}

require_once 'ihaf.php';

if ( class_exists( 'WPCode_Capabilities' ) ) {
	// Remove custom capabilities on uninstall.
	WPCode_Capabilities::uninstall();
}

if ( class_exists( 'WPCode_Notifications' ) ) {
	WPCode_Notifications::delete_notifications_data();
}

if ( function_exists( 'wp_unschedule_hook' ) ) {
	wp_unschedule_hook( 'wpcode_usage_tracking_cron' );
}

delete_option( 'wpcode_send_usage_last_run' );
delete_option( 'wpcode_usage_tracking_config' );

// Let's see if the uninstall_data option is set.
$settings = get_option( 'wpcode_settings', array() );

if ( ! empty( $settings['uninstall_data'] ) ) {
	// Delete the revisions table.
	global $wpdb;
	$wpdb->query( "DROP TABLE IF EXISTS {$wpdb->prefix}wpcode_revisions" );  // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange

	// Delete settings.
	$wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'wpcode\_%'" );  // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
	// Delete ihaf data.
	$wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE 'ihaf\_%'" );  // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
	// Delete plugin user meta.
	$wpdb->query( "DELETE FROM $wpdb->usermeta WHERE meta_key LIKE 'wpcode\_%'" );  // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
	// Delete post meta.
	$wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_key LIKE 'wpcode\_%'" );  // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
	$wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_key LIKE '_wpcode\_%'" );  // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.DirectDatabaseQuery.NoCaching

	// Remove any transients we've left behind.
	$wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '\_transient\_wpcode\_%'" );  // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
	$wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '\_site\_transient\_wpcode\_%'" );  // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
	$wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '\_transient\_timeout\_wpcode\_%'" );  // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
	$wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '\_site\_transient\_timeout\_wpcode\_%'" );  // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
	$wpdb->query( "DELETE FROM $wpdb->options WHERE option_name LIKE '\_wpcode\_transient\_%'" );  // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.DirectDatabaseQuery.NoCaching

	// Delete wpcode post types.
	$wpcode_posts = get_posts(
		array(
			'post_type'   => array( 'wpcode', 'wpcode-blocks' ),
			'post_status' => array( 'publish', 'draft', 'trash' ),
			'numberposts' => - 1,
			'fields'      => 'ids',
		)
	);

	if ( $wpcode_posts ) {
		foreach ( $wpcode_posts as $wpcode_post ) {
			wp_delete_post( $wpcode_post, true );
		}
	}

	if ( function_exists( 'wpcode_register_taxonomies' ) ) {
		wpcode_register_taxonomies();
	}

	// Delete all taxonomy terms.
	$wpcode_taxonomies = array(
		'wpcode_type',
		'wpcode_location',
		'wpcode_tags',
	);
	foreach ( $wpcode_taxonomies as $wpcode_taxonomy ) {
		$terms = get_terms(
			array(
				'taxonomy'   => $wpcode_taxonomy,
				'hide_empty' => false,
				'fields'     => 'ids',
			)
		);
		if ( $terms ) {
			foreach ( $terms as $wpcode_term ) {
				wp_delete_term( $wpcode_term, $wpcode_taxonomy );
			}
		}
	}


	global $wp_filesystem;
	// Remove uploaded files.
	$uploads_directory = wp_upload_dir();

	if ( empty( $uploads_directory['error'] ) ) {
		$wp_filesystem->rmdir( $uploads_directory['basedir'] . '/wpcode/', true );
		$wp_filesystem->rmdir( $uploads_directory['basedir'] . '/wpcode-logs/', true );
	}

	// Remove translation files.
	$languages_directory = defined( 'WP_LANG_DIR' ) ? trailingslashit( WP_LANG_DIR ) : trailingslashit( WP_CONTENT_DIR ) . 'languages/';
	$translations        = glob( wp_normalize_path( $languages_directory . 'plugins/wpcode-*' ) );

	if ( ! empty( $translations ) ) {
		foreach ( $translations as $file ) {
			$wp_filesystem->delete( $file );
		}
	}

	$translations = glob( wp_normalize_path( $languages_directory . 'plugins/insert-headers-and-footers-*' ) );

	if ( ! empty( $translations ) ) {
		foreach ( $translations as $file ) {
			$wp_filesystem->delete( $file );
		}
	}
}
ihaf.php000064400000031606151331545640006201 0ustar00<?php
/**
 * Plugin Name: WPCode Lite
 * Plugin URI: https://www.wpcode.com/
 * Version: 2.2.6
 * Requires at least: 4.6
 * Requires PHP: 5.5
 * Tested up to: 6.7
 * Author: WPCode
 * Author URI: https://www.wpcode.com/
 * Description: Easily add code snippets in WordPress. Insert scripts to the header and footer, add PHP code snippets with conditional logic, insert ads pixel, custom content, and more.
 * License: GPLv2 or later
 *
 * Text Domain:         insert-headers-and-footers
 * Domain Path:         /languages
 *
 * @package WPCode
 */

/*
	Copyright 2019 WPBeginner

	This program is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License, version 2, as
	published by the Free Software Foundation.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program; if not, write to the Free Software
	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

// Don't allow multiple versions to be active.
if ( function_exists( 'WPCode' ) ) {

	if ( ! function_exists( 'wpcode_pro_just_activated' ) ) {
		/**
		 * When we activate a Pro version, we need to do additional operations:
		 * 1) deactivate a Lite version;
		 * 2) register option which help to run all activation process for Pro version (custom tables creation, etc.).
		 */
		function wpcode_pro_just_activated() {
			wpcode_deactivate();
			add_option( 'wpcode_install', 1 );
		}
	}
	add_action( 'activate_wpcode-premium/wpcode.php', 'wpcode_pro_just_activated' );

	if ( ! function_exists( 'wpcode_lite_just_activated' ) ) {
		/**
		 * Store temporarily that the Lite version of the plugin was activated.
		 * This is needed because WP does a redirect after activation and
		 * we need to preserve this state to know whether user activated Lite or not.
		 */
		function wpcode_lite_just_activated() {

			set_transient( 'wpcode_lite_just_activated', true );
		}
	}
	add_action( 'activate_insert-headers-and-footers/ihaf.php', 'wpcode_lite_just_activated' );

	if ( ! function_exists( 'wpcode_lite_just_deactivated' ) ) {
		/**
		 * Store temporarily that Lite plugin was deactivated.
		 * Convert temporary "activated" value to a global variable,
		 * so it is available through the request. Remove from the storage.
		 */
		function wpcode_lite_just_deactivated() {

			global $wpcode_lite_just_activated, $wpcode_lite_just_deactivated;

			$wpcode_lite_just_activated   = (bool) get_transient( 'wpcode_lite_just_activated' );
			$wpcode_lite_just_deactivated = true;

			delete_transient( 'wpcode_lite_just_activated' );
		}
	}
	add_action( 'deactivate_insert-headers-and-footers/ihaf.php', 'wpcode_lite_just_deactivated' );

	if ( ! function_exists( 'wpcode_deactivate' ) ) {
		/**
		 * Deactivate Lite if WPCode already activated.
		 */
		function wpcode_deactivate() {

			$plugin = 'insert-headers-and-footers/ihaf.php';

			deactivate_plugins( $plugin );

			do_action( 'wpcode_plugin_deactivated', $plugin );
		}
	}
	add_action( 'admin_init', 'wpcode_deactivate' );

	if ( ! function_exists( 'wpcode_lite_notice' ) ) {
		/**
		 * Display the notice after deactivation when Pro is still active
		 * and user wanted to activate the Lite version of the plugin.
		 */
		function wpcode_lite_notice() {

			global $wpcode_lite_just_activated, $wpcode_lite_just_deactivated;

			if (
				empty( $wpcode_lite_just_activated ) ||
				empty( $wpcode_lite_just_deactivated )
			) {
				return;
			}

			// Currently tried to activate Lite with Pro still active, so display the message.
			printf(
				'<div class="notice notice-warning">
					<p>%1$s</p>
					<p>%2$s</p>
				</div>',
				esc_html__( 'Heads up!', 'insert-headers-and-footers' ),
				esc_html__( 'Your site already has WPCode Pro activated. If you want to switch to WPCode Lite, please first go to Plugins → Installed Plugins and deactivate WPCode. Then, you can activate WPCode Lite.', 'insert-headers-and-footers' )
			);

			if ( isset( $_GET['activate'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				unset( $_GET['activate'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			}

			unset( $wpcode_lite_just_activated, $wpcode_lite_just_deactivated );
		}
	}
	add_action( 'admin_notices', 'wpcode_lite_notice' );

	// Do not process the plugin code further.
	return;
}

/**
 * Main WPCode Class
 */
class WPCode {

	/**
	 * Holds the instance of the plugin.
	 *
	 * @since 2.0.0
	 *
	 * @var WPCode The one true WPCode
	 */
	private static $instance;

	/**
	 * Plugin version.
	 *
	 * @since 2.0.0
	 *
	 * @var string
	 */
	public $version = '';

	/**
	 * The auto-insert instance.
	 *
	 * @var WPCode_Auto_Insert
	 */
	public $auto_insert;

	/**
	 * The snippet execution instance.
	 *
	 * @var WPCode_Snippet_Execute
	 */
	public $execute;

	/**
	 * The error handling instance.
	 *
	 * @var WPCode_Error
	 */
	public $error;

	/**
	 * The conditional logic instance.
	 *
	 * @var WPCode_Conditional_Logic
	 */
	public $conditional_logic;

	/**
	 * The conditional logic instance.
	 *
	 * @var WPCode_Snippet_Cache
	 */
	public $cache;

	/**
	 * The snippet library.
	 *
	 * @var WPCode_Library
	 */
	public $library;

	/**
	 * The Snippet Generator.
	 *
	 * @var WPCode_Generator
	 */
	public $generator;

	/**
	 * The plugin settings.
	 *
	 * @var WPCode_Settings
	 */
	public $settings;

	/**
	 * The plugin importers.
	 *
	 * @var WPCode_Importers
	 */
	public $importers;
	/**
	 * The file cache class.
	 *
	 * @var WPCode_File_Cache
	 */
	public $file_cache;

	/**
	 * The notifications instance (admin-only).
	 *
	 * @var WPCode_Notifications
	 */
	public $notifications;

	/**
	 * The admin page loader.
	 *
	 * @var WPCode_Admin_Page_Loader
	 */
	public $admin_page_loader;

	/**
	 * The library auth instance.
	 *
	 * @var WPCode_Library_Auth
	 */
	public $library_auth;

	/**
	 * The admin notices instance.
	 *
	 * @var WPCode_Notice
	 */
	public $notice;

	/**
	 * Instance for logging errors.
	 *
	 * @var WPCode_File_Logger
	 */
	public $logger;

	/**
	 * Load the smart tags.
	 *
	 * @var WPCode_Smart_Tags
	 */
	public $smart_tags;

	/**
	 * Main instance of WPCode.
	 *
	 * @return WPCode
	 * @since 2.0.0
	 */
	public static function instance() {
		if ( ! isset( self::$instance ) && ! ( self::$instance instanceof WPCode ) ) {
			self::$instance = new WPCode();
		}

		return self::$instance;
	}

	/**
	 * Constructor.
	 */
	private function __construct() {
		$this->setup_constants();
		$this->includes();
		add_action( 'plugins_loaded', array( $this, 'load_components' ), - 1 );
	}

	/**
	 * Set up global constants.
	 *
	 * @return void
	 */
	private function setup_constants() {

		define( 'WPCODE_FILE', __FILE__ );

		$plugin_headers = get_file_data( WPCODE_FILE, array( 'version' => 'Version' ) );

		define( 'WPCODE_VERSION', $plugin_headers['version'] );
		define( 'WPCODE_PLUGIN_BASENAME', plugin_basename( WPCODE_FILE ) );
		define( 'WPCODE_PLUGIN_URL', plugin_dir_url( WPCODE_FILE ) );
		define( 'WPCODE_PLUGIN_PATH', plugin_dir_path( WPCODE_FILE ) );

		$this->version = WPCODE_VERSION;
	}

	/**
	 * Require the files needed for the plugin.
	 *
	 * @return void
	 */
	private function includes() {
		// Load the safe mode logic first.
		require_once WPCODE_PLUGIN_PATH . 'includes/safe-mode.php';
		// Plugin helper functions.
		require_once WPCODE_PLUGIN_PATH . 'includes/helpers.php';
		// Functions for global headers & footers output.
		require_once WPCODE_PLUGIN_PATH . 'includes/global-output.php';
		// Use the old class name for backwards compatibility.
		require_once WPCODE_PLUGIN_PATH . 'includes/legacy.php';
		// Add backwards compatibility for older versions of PHP or WP.
		require_once WPCODE_PLUGIN_PATH . 'includes/compat.php';
		// Register code snippets post type.
		require_once WPCODE_PLUGIN_PATH . 'includes/post-type.php';
		// The snippet class.
		require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-snippet.php';
		// Auto-insert options.
		require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-auto-insert.php';
		// Execute snippets.
		require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-snippet-execute.php';
		// Handle PHP errors.
		require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-error.php';
		// [wpcode] shortcode.
		require_once WPCODE_PLUGIN_PATH . 'includes/shortcode.php';
		// Conditional logic.
		require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-conditional-logic.php';
		// Snippet Cache.
		require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-snippet-cache.php';
		// Settings class.
		require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-settings.php';
		// Custom capabilities.
		require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-capabilities.php';
		// Map capabilities for backwards compatibility.
		require_once WPCODE_PLUGIN_PATH . 'includes/capabilities.php';
		// Install routines.
		require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-install.php';
		// Logging class.
		require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-file-logger.php';
		// Smart tags class.
		require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-smart-tags.php';
		// Admin bar info class.
		require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-admin-bar-info.php';

		if ( is_admin() || ( defined( 'DOING_CRON' ) && DOING_CRON ) ) {
			require_once WPCODE_PLUGIN_PATH . 'includes/icons.php'; // This is not needed in the frontend atm.
			// Code Editor class.
			require_once WPCODE_PLUGIN_PATH . 'includes/admin/class-wpcode-code-editor.php';
			require_once WPCODE_PLUGIN_PATH . 'includes/admin/class-wpcode-admin-page-loader.php';
			require_once WPCODE_PLUGIN_PATH . 'includes/admin/admin-scripts.php';
			require_once WPCODE_PLUGIN_PATH . 'includes/admin/admin-ajax-handlers.php';
			// Always used just in the backend.
			require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-generator.php';
			// Snippet Library.
			require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-library.php';
			// Authentication for the library site.
			require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-library-auth.php';
			// Importers.
			require_once WPCODE_PLUGIN_PATH . 'includes/admin/class-wpcode-importers.php';
			// File cache.
			require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-file-cache.php';
			// The docs.
			require_once WPCODE_PLUGIN_PATH . 'includes/admin/class-wpcode-docs.php';
			// Notifications class.
			require_once WPCODE_PLUGIN_PATH . 'includes/admin/class-wpcode-notifications.php';
			// Upgrade page.
			require_once WPCODE_PLUGIN_PATH . 'includes/admin/class-wpcode-upgrade-welcome.php';
			// Metabox class.
			require_once WPCODE_PLUGIN_PATH . 'includes/admin/class-wpcode-metabox-snippets.php';
			// Metabox class.
			require_once WPCODE_PLUGIN_PATH . 'includes/admin/class-wpcode-admin-notice.php';
			// Ask for some love.
			require_once WPCODE_PLUGIN_PATH . 'includes/admin/class-wpcode-review.php';
			// Suggest free plugins.
			require_once WPCODE_PLUGIN_PATH . 'includes/admin/class-wpcode-suggested-plugins.php';
		}

		// Load lite-specific files.
		require_once WPCODE_PLUGIN_PATH . 'includes/lite/loader.php';
	}

	/**
	 * Load the Generator on demand.
	 *
	 * @return WPCode_Generator
	 */
	public function generator() {
		if ( ! isset( $this->generator ) ) {
			$this->generator = new WPCode_Generator();
		}
		return $this->generator;
	}

	/**
	 * Load components in the main plugin instance.
	 *
	 * @return void
	 */
	public function load_components() {
		$this->auto_insert       = new WPCode_Auto_Insert();
		$this->execute           = new WPCode_Snippet_Execute();
		$this->error             = new WPCode_Error();
		$this->conditional_logic = new WPCode_Conditional_Logic();
		$this->cache             = new WPCode_Snippet_Cache();
		$this->settings          = new WPCode_Settings();
		$this->logger            = new WPCode_File_Logger();

		if ( is_admin() || ( defined( 'DOING_CRON' ) && DOING_CRON ) ) {
			$this->file_cache        = new WPCode_File_Cache();
			$this->library           = new WPCode_Library();
			$this->library_auth      = new WPCode_Library_Auth();
			$this->importers         = new WPCode_Importers();
			$this->notifications     = new WPCode_Notifications();
			$this->admin_page_loader = new WPCode_Admin_Page_Loader_Lite();
			$this->notice            = new WPCode_Notice();
			$this->smart_tags        = new WPCode_Smart_Tags_Lite();

			// Metabox class.
			new WPCode_Metabox_Snippets_Lite();
			// Usage tracking class.
			new WPCode_Usage_Tracking_Lite();
			// Suggested plugins.
			new WPCode_Suggested_Plugins();
		}

		new WPCode_Admin_Bar_Info_Lite();

		do_action( 'wpcode_loaded' );

		// Load the pluggable functions late to allow plugins to hook in.
		require_once WPCODE_PLUGIN_PATH . 'includes/pluggable.php';
	}
}

require_once dirname( __FILE__ ) . '/includes/ihaf.php';

WPCode();
includes/shortcode.php000064400000004604151331545640011070 0ustar00<?php
/**
 * Handle the generic WPCode shortcode.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

add_shortcode( 'wpcode', 'wpcode_shortcode_handler' );
add_action( 'wpcode_shortcode_before_output', 'wpcode_pass_shortcode_attributes_to_snippet', 10, 4 );

add_filter( 'wpcode_shortcode_attribute_value', 'wp_kses_post' );

/**
 * Generic handler for the shortcode.
 *
 * @param array  $args The shortcode attributes.
 * @param string $content The shortcode content.
 * @param string $tag The shortcode tag.
 *
 * @return string
 */
function wpcode_shortcode_handler( $args, $content, $tag ) {
	$atts = wp_parse_args(
		$args,
		array(
			'id'            => 0,
			'wpcode_source' => 'shortcode',
		)
	);

	if ( 0 === $atts['id'] ) {
		return '';
	}

	$snippet = new WPCode_Snippet( absint( $atts['id'] ) );

	if ( ! $snippet->is_active() ) {
		return '';
	}

	// Let's check that conditional logic rules are met.
	if ( $snippet->conditional_rules_enabled() && ! wpcode()->conditional_logic->are_snippet_rules_met( $snippet ) && apply_filters( 'wpcode_shortcode_use_conditional_logic', true ) ) {
		return '';
	}

	$shortcode_location = apply_filters( 'wpcode_get_snippets_for_location', array( $snippet ), 'shortcode' );

	if ( empty( $shortcode_location ) ) {
		return '';
	}

	$snippet->location = $atts['wpcode_source'];

	do_action( 'wpcode_shortcode_before_output', $snippet, $atts, $content, $tag );

	return wpcode()->execute->get_snippet_output( $snippet );
}

/**
 * Before the shortcode output, let's check if we have to load any shortcode attributes to the class instance.
 *
 * @param WPCode_Snippet $snippet The snippet instance.
 * @param array          $atts The shortcode attributes.
 * @param string|null    $content Shortcode content, if any.
 * @param string         $tag The shortcode tag.
 *
 * @return void
 */
function wpcode_pass_shortcode_attributes_to_snippet( $snippet, $atts, $content, $tag ) {
	// Let's see if we have to load any shortcode attributes.
	$shortcode_attributes = $snippet->get_shortcode_attributes();
	if ( ! empty( $shortcode_attributes ) ) {
		foreach ( $shortcode_attributes as $attribute ) {
			$value = isset( $atts[ $attribute ] ) ? $atts[ $attribute ] : '';
			$snippet->set_attribute( $attribute, apply_filters( 'wpcode_shortcode_attribute_value', $value, $attribute ) );
		}
	}
	if ( ! empty( $content ) ) {
		$snippet->set_attribute( 'content', $content );
	}
}
includes/class-wpcode-install.php000064400000020242151331545640013122 0ustar00<?php
/**
 * Logic to run on plugin install.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class WPCode_Install.
 */
class WPCode_Install {

	/**
	 * WPCode_Install constructor.
	 */
	public function __construct() {
		register_activation_hook( WPCODE_FILE, array( $this, 'activate' ) );
		add_action( 'admin_init', array( $this, 'maybe_run_install' ) );
	}

	/**
	 * Activation hook.
	 *
	 * @return void
	 */
	public function activate() {
		// Add capabilities on activation as deleting the plugin removes them
		// but the option used in the `maybe_run_install` method below is not
		// removed so the capabilities are not added back.
		WPCode_Capabilities::add_capabilities();

		// Use an action to have a single activation hook plugin-wide.
		do_action( 'wpcode_plugin_activation' );

		set_transient( 'wpcode_just_activated', class_exists( 'WPCode_License' ) ? 'pro' : 'lite', 60 );
	}

	/**
	 * Install routine to run on plugin activation.
	 * Runs on admin_init so that we also handle updates.
	 * The ihaf_activated option was used by IHAF 1.6 and the key "lite" is for the activation date
	 * of that version of the plugin. In the WPCode plugin we use the "wpcode" key, so we have the update date
	 * and install the demo data.
	 *
	 * @return void
	 */
	public function maybe_run_install() {
		if ( ! is_admin() ) {
			return;
		}

		$activated = get_option( 'ihaf_activated', array() );

		if ( ! is_array( $activated ) ) {
			$activated = array();
		}

		if ( empty( $activated['wpcode'] ) ) {
			$activated['wpcode'] = time();

			update_option( 'ihaf_activated', $activated );

			// Add custom capabilities.
			WPCode_Capabilities::add_capabilities();

			// The option was empty so let's add the demo data.
			$this->add_demo_data();

			if ( ! empty( $activated['lite'] ) ) {
				// If IHAF 1.6 has been running on the site, redirect to upgrade screen.
				set_transient( 'wpcode_upgrade_redirect', true, 30 );
			}

			do_action( 'wpcode_install' );
		}

		// Maybe run manually just one time.
		$install = get_option( 'wpcode_install', false );

		if ( ! empty( $install ) ) {
			$this->activate();
			delete_option( 'wpcode_install' );
		}

		// Let's run an upgrade routine.
		if ( empty( $activated['version'] ) ) {
			$this->update_2_1_0();
		}

		if ( isset( $activated['version'] ) && version_compare( $activated['version'], WPCODE_VERSION, '=' ) ) {
			// If the version is identical just skip.
			return;
		}

		if ( isset( $activated['version'] ) && version_compare( $activated['version'], '2.1.4', '<' ) ) {
			$this->update_2_1_4();
		}

		if ( isset( $activated['version'] ) && version_compare( $activated['version'], '2.1.5', '<' ) ) {
			$this->update_2_1_5();
		}

		// Give other plugins a chance to run an upgrade routine.
		do_action( 'wpcode_before_version_update', $activated );

		$activated['version'] = WPCODE_VERSION;
		update_option( 'ihaf_activated', $activated );
	}

	/**
	 * Upgrade routine for 2.1.0.
	 * Empty the library cache to get the new snippets.
	 *
	 * @return void
	 */
	public function update_2_1_0() {
		if ( isset( wpcode()->library ) ) {
			wpcode()->library->delete_cache();
		}
	}

	/**
	 * Upgrade routine for 2.1.4.
	 * Convert recently deactivated to the new error system.
	 *
	 * @return void
	 */
	public function update_2_1_4() {
		// Let's find all the snippets with the _wpcode_recently_deactivated meta key set.
		$snippets = get_posts(
			array(
				'post_type'      => 'wpcode',
				'posts_per_page' => - 1,
				'post_status'    => 'any',
				'meta_query'     => array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
					array(
						'key'     => '_wpcode_recently_deactivated',
						'compare' => 'EXISTS',
					),
				),
			)
		);
		// Let's loop through the snippets and convert them to the new error system.
		foreach ( $snippets as $snippet ) {
			$snippet    = new WPCode_Snippet( $snippet->ID );
			$error      = array(
				'message'  => esc_html__( 'Snippet was deactivated due to an error.', 'insert-headers-and-footers' ),
				'time'     => get_post_meta( $snippet->get_id(), '_wpcode_recently_deactivated', true ),
				'wpc_type' => 'deactivated',
			);
			$error_line = get_post_meta( $snippet->get_id(), '_wpcode_recently_deactivated_error_line', true );
			if ( ! empty( $error_line ) ) {
				$error['error_line'] = $error_line;
			}
			$snippet->set_last_error( $error );

			// Remove the old meta keys.
			delete_post_meta( $snippet->get_id(), '_wpcode_recently_deactivated' );
			delete_post_meta( $snippet->get_id(), '_wpcode_recently_deactivated_error_line' );

			wpcode()->error->clear_snippets_errors();
		}

		$this->add_columns_to_hidden( array( 'id', 'code_type', 'shortcode' ) );
	}

	/**
	 * Upgrade routine for 2.1.5.
	 * Add the priority column to the hidden columns.
	 *
	 * @return void
	 */
	public function update_2_1_5() {
		$this->add_columns_to_hidden( array( 'priority' ) );
	}

	/**
	 * Add columns to the hidden columns for users that set their screen settings.
	 *
	 * @param array $new_columns The columns to add.
	 *
	 * @return void
	 */
	public function add_columns_to_hidden( $new_columns ) {
		// Let's add the new columns to the hidden array for users that set their screen settings.
		$meta_key = 'managetoplevel_page_wpcodecolumnshidden';

		$users = get_users(
			array(
				'meta_key'     => $meta_key, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
				'meta_compare' => 'EXISTS',
				'fields'       => 'ID',
			)
		);

		foreach ( $users as $user_id ) {
			$columns = get_user_meta( $user_id, $meta_key, true );
			if ( ! is_array( $columns ) ) {
				$columns = array();
			}
			$columns = array_merge( $columns, $new_columns );
			update_user_meta( $user_id, $meta_key, $columns );
		}
	}

	/**
	 * Add some example snippets in a new installation.
	 *
	 * @return void
	 */
	public function add_demo_data() {
		$snippets = array(
			array(
				'title'         => __( 'Display a message after the 1st paragraph of posts', 'insert-headers-and-footers' ),
				'code'          => 'Thank you for reading this post, don\'t forget to subscribe!',
				'code_type'     => 'text',
				'auto_insert'   => 1,
				'location'      => 'after_paragraph',
				'insert_number' => 1,
				'tags'          => array(
					'sample',
					'message',
				),
			),
			array(
				'title'       => __( 'Completely Disable Comments', 'insert-headers-and-footers' ),
				'code'        => "add_action('admin_init', function () {\r\n    \/\/ Redirect any user trying to access comments page\r\n    global \$pagenow;\r\n    \r\n    if (\$pagenow === 'edit-comments.php') {\r\n        wp_safe_redirect(admin_url());\r\n        exit;\r\n    }\r\n\r\n    \/\/ Remove comments metabox from dashboard\r\n    remove_meta_box('dashboard_recent_comments', 'dashboard', 'normal');\r\n\r\n    \/\/ Disable support for comments and trackbacks in post types\r\n    foreach (get_post_types() as \$post_type) {\r\n        if (post_type_supports(\$post_type, 'comments')) {\r\n            remove_post_type_support(\$post_type, 'comments');\r\n            remove_post_type_support(\$post_type, 'trackbacks');\r\n        }\r\n    }\r\n});\r\n\r\n\/\/ Close comments on the front-end\r\nadd_filter('comments_open', '__return_false', 20, 2);\r\nadd_filter('pings_open', '__return_false', 20, 2);\r\n\r\n\/\/ Hide existing comments\r\nadd_filter('comments_array', '__return_empty_array', 10, 2);\r\n\r\n\/\/ Remove comments page in menu\r\nadd_action('admin_menu', function () {\r\n    remove_menu_page('edit-comments.php');\r\n});\r\n\r\n\/\/ Remove comments links from admin bar\r\nadd_action('init', function () {\r\n    if (is_admin_bar_showing()) {\r\n        remove_action('admin_bar_menu', 'wp_admin_bar_comments_menu', 60);\r\n    }\r\n});",
				'code_type'   => 'php',
				'auto_insert' => 1,
				'location'    => 'everywhere',
				'tags'        => array(
					'sample',
					'disable',
					'comments',
				),
				'library_id'  => 12,
			),
		);

		// The activation hook runs after `init` so our plugin's custom
		// post type and custom taxonomies didn't have a chance to be registered.
		wpcode_register_post_type();
		wpcode_register_taxonomies();

		foreach ( $snippets as $snippet ) {
			$new_snippet = new WPCode_Snippet( $snippet );
			$new_snippet->save();
		}
	}
}

new WPCode_Install();
includes/class-wpcode-settings.php000064400000006447151331545640013327 0ustar00<?php
/**
 * Handles all the WPCode settings.
 *
 * @package WPCode
 */

/**
 * Class WPCode_Settings.
 */
class WPCode_Settings {

	/**
	 * The key used for storing settings in the db.
	 *
	 * @var string
	 */
	protected $settings_key = 'wpcode_settings';

	/**
	 * Options as they are loaded from the db.
	 *
	 * @var array
	 * @see WPCode_Settings::get_options
	 */
	protected $options;

	/**
	 * Get an option by name with an optional default value.
	 *
	 * @param string $option_name The option name.
	 * @param mixed  $default The default value (optional).
	 *
	 * @return mixed
	 * @see get_option
	 */
	public function get_option( $option_name, $default = false ) {
		$options = $this->get_options();
		$value   = $default;
		if ( isset( $options[ $option_name ] ) ) {
			$value = $options[ $option_name ];
		}

		$value = apply_filters( 'wpcode_get_option', $value, $option_name );

		return apply_filters( "wpcode_get_option_{$option_name}", $value, $option_name );
	}

	/**
	 * Get all the options as they are stored in the db.
	 *
	 * @return array
	 */
	public function get_options() {
		if ( ! isset( $this->options ) ) {
			$this->options = $this->load_options();
		}

		return $this->options;
	}

	/**
	 * Load the options from the db.
	 *
	 * @return array
	 */
	protected function load_options() {
		return get_option(
			$this->settings_key,
			array(
				'facebook_pixel_events'  => array(
					'page_view'      => 1,
					'add_to_cart'    => 1,
					'view_content'   => 1,
					'begin_checkout' => 1,
					'purchase'       => 1,
				),
				'google_pixel_events'    => array(
					'page_view'      => 1,
					'add_to_cart'    => 1,
					'view_item'      => 1,
					'begin_checkout' => 1,
					'purchase'       => 1,
					'conversion'     => 1,
				),
				'pinterest_pixel_events' => array(
					'pagevisit_product' => 1,
					'begin_checkout'    => 1,
					'add_to_cart'       => 1,
					'purchase'          => 1,
				),
				'tiktok_pixel_events'    => array(
					'view_content'   => 1,
					'add_to_cart'    => 1,
					'begin_checkout' => 1,
					'purchase'       => 1,
				),
			)
		);
	}

	/**
	 * Update an option in the settings object.
	 *
	 * @param string $option The option name.
	 * @param mixed  $value The new value.
	 *
	 * @return void
	 */
	public function update_option( $option, $value ) {
		if ( empty( $value ) ) {
			$this->delete_option( $option );

			return;
		}
		if ( isset( $this->options[ $option ] ) && $this->options[ $option ] === $value ) {
			return;
		}
		$this->options[ $option ] = $value;

		$this->save_options();
	}

	/**
	 * Delete an option by its name.
	 *
	 * @param string $option The option name.
	 *
	 * @return void
	 */
	public function delete_option( $option ) {
		// If there's nothing to delete, do nothing.
		if ( isset( $this->options[ $option ] ) ) {
			unset( $this->options[ $option ] );
			$this->save_options();
		}
	}

	/**
	 * Save the current options object to the db.
	 *
	 * @return void
	 */
	protected function save_options() {
		update_option( $this->settings_key, (array) $this->options );
	}

	/**
	 * Use an array to update multiple settings at once.
	 *
	 * @param array $options The new options array.
	 *
	 * @return void
	 */
	public function bulk_update_options( $options ) {
		$this->options = array_merge( $this->get_options(), $options );

		$this->save_options();
	}
}
includes/post-type.php000064400000006436151331545640011047 0ustar00<?php
/**
 * Register custom post type and taxonomies.
 *
 * @package wpcode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

add_action( 'init', 'wpcode_register_post_type', - 5 );
add_action( 'init', 'wpcode_register_taxonomies', - 5 );
add_filter( 'update_post_term_count_statuses', 'wpcode_taxonomies_count_drafts', 10, 2 );
add_action( 'wpcode_before_snippet_save', 'wpcode_maybe_remove_core_content_filters' );
add_action( 'wpcode_snippet_after_update', 'wpcode_restore_core_content_filters' );
add_filter( 'wp_import_post_data_raw', 'wpcode_prevent_wp_importer_import' );

/**
 * Register the post type for snippets.
 *
 * @return void
 */
function wpcode_register_post_type() {
	register_post_type(
		'wpcode',
		array(
			'public'     => false,
			'show_ui'    => false,
			'can_export' => false,
		)
	);
}

/**
 * Register the custom taxonomies used for snippets.
 *
 * @return void
 */
function wpcode_register_taxonomies() {
	register_taxonomy(
		'wpcode_type',
		'wpcode',
		array(
			'public' => false,
		)
	);
	register_taxonomy(
		'wpcode_location',
		'wpcode',
		array(
			'public' => false,
		)
	);
	register_taxonomy(
		'wpcode_tags',
		'wpcode',
		array(
			'public' => false,
		)
	);
}

/**
 * Count draft (inactive) snippets as part of our custom taxonomies count.
 *
 * @param array       $statuses The statuses to include in the count.
 * @param WP_Taxonomy $taxonomy The taxonomy object.
 *
 * @return array
 */
function wpcode_taxonomies_count_drafts( $statuses, $taxonomy ) {
	$taxonomies = array(
		'wpcode_type',
		'wpcode_location',
		'wpcode_tags',
	);
	if ( in_array( $taxonomy->name, $taxonomies, true ) ) {
		$statuses[] = 'draft';
	}

	return $statuses;
}

/**
 * Remove core filters that may interfere with snippet saving.
 *
 * @param WPCode_Snippet $snippet The snippet being saved.
 *
 * @return void
 */
function wpcode_maybe_remove_core_content_filters( $snippet ) {
	// Prevent content_save_pre from modifying the snippet content.
	remove_all_filters( 'content_save_pre' );

	if ( ! function_exists( 'wp_remove_targeted_link_rel_filters' ) || version_compare( get_bloginfo( 'version' ), '6.7', '>=' ) ) {
		// This function is only available in WP 5.1+.
		return;
	}
	/**
	 * Filters the code types that should keep the core filters.
	 *
	 * @param array $code_types_to_keep_filters The code types that should keep the core filters.
	 */
	$code_types_to_keep_filters = apply_filters(
		'wpcode_code_types_to_keep_core_content_filters',
		array(
			'text',
			'html',
		)
	);
	if ( ! in_array( $snippet->get_code_type(), $code_types_to_keep_filters, true ) ) {
		wp_remove_targeted_link_rel_filters();
	}
}

/**
 * Add back the core filters that were removed when saving a snippet.
 *
 * @return void
 */
function wpcode_restore_core_content_filters() {
	if ( ! function_exists( 'wp_init_targeted_link_rel_filters' ) || version_compare( get_bloginfo( 'version' ), '6.7', '>=' ) ) {
		// This function is only available in WP 5.1+.
		return;
	}
	wp_init_targeted_link_rel_filters();
}

/**
 * Prevent the WP Importer plugin from importing snippets.
 *
 * @param array $post_data The post data.
 *
 * @return array
 */
function wpcode_prevent_wp_importer_import( $post_data ) {
	if ( 'wpcode' === $post_data['post_type'] ) {
		$post_data['post_type']    = '';
		$post_data['post_content'] = '';
	}

	return $post_data;
}
includes/class-wpcode-error.php000064400000017062151331545640012613 0ustar00<?php
/**
 * This class handles PHP errors, keeping tabs of errors thrown
 * and the messages displayed back to the user.
 *
 * @package wpcode
 */

/**
 * WPCode_Error class.
 */
class WPCode_Error {

	/**
	 * An array of errors already caught.
	 *
	 * @var array
	 */
	private $errors = array();

	/**
	 * The error count.
	 *
	 * @var int
	 */
	private $error_count;

	/**
	 * The snippets that have errors.
	 *
	 * @var int[]
	 */
	private $snippets_with_errors;

	/**
	 * The previous exception handler.
	 *
	 * @var callable
	 */
	private $previous_exception_handler;

	/**
	 * WPCode_Error constructor.
	 */
	public function __construct() {
		// When the admin is loaded let's check if there were any errors recorded.
		add_action( 'admin_init', array( $this, 'gather_errors' ) );

		$this->previous_exception_handler = set_exception_handler( array( $this, 'track_errors' ) );
	}

	/**
	 * The error object caught when running the code.
	 *
	 * @param ParseError|Exception|Error|array $error The caught error.
	 *
	 * @return void
	 */
	public function add_error( $error ) {
		$this->errors[] = $error;
		$this->write_error_to_log( $error );
	}

	/**
	 * Check if an error has been recorded.
	 *
	 * @return bool
	 */
	public function has_error() {
		return ! empty( $this->errors );
	}

	/**
	 * Empty the errors record, useful if you want to
	 * make sure the last error was thrown by your code.
	 *
	 * @return void
	 */
	public function clear_errors() {
		$this->errors = array();
	}

	/**
	 * Store the error in the logs.
	 *
	 * @param array|Exception $error The error object.
	 *
	 * @return void
	 */
	private function write_error_to_log( $error ) {
		$handle = 'error';
		if ( is_array( $error ) && isset( $error['snippet'] ) ) {
			$this->track_snippet_error( $error );
		}

		wpcode()->logger->handle( time(), $this->get_error_message( $error ), $handle );
	}

	/**
	 * Log the error in the snippet specific log and mark the snippet as having an error.
	 *
	 * @param array $error The error object.
	 *
	 * @return void
	 */
	private function track_snippet_error( $error ) {
		if ( ! isset( $error['snippet'] ) ) {
			return;
		}
		if ( is_int( $error['snippet'] ) ) {
			$snippet = new WPCode_Snippet( absint( $error['snippet'] ) );
		} else {
			$snippet = $error['snippet'];
		}
		// Let's see if the snippet is currently marked as having an error.
		if ( ! isset( $snippet->id ) ) {
			return;
		}
		if ( empty( $error['wpc_type'] ) ) {
			$error['wpc_type'] = 'error';
		}
		$last_error = $snippet->get_last_error();
		// If we already have an error and the type of the current error is not deactivated let's not log it.
		if ( ! empty( $last_error ) && 'deactivated' === $last_error['wpc_type'] || ! empty( $last_error ) && $last_error['wpc_type'] === $error['wpc_type'] ) {
			return;
		}

		if ( ! isset( $error['time'] ) ) {
			$error['time'] = time();
		}

		$handle = 'snippet-' . $snippet->get_id();

		// Log to snippet specific log.
		wpcode()->logger->handle( time(), $this->get_error_message( $error ), $handle );
		// Store the error details in the snippet meta.
		$snippet->set_last_error( $error );

		do_action( 'wpcode_snippet_error_tracked', $error, $snippet );

		// Reset the error count.
		$this->clear_snippets_errors();
	}

	/**
	 * Get the last error message.
	 *
	 * @return string
	 */
	public function get_last_error_message() {
		if ( empty( $this->errors ) ) {
			return '';
		}
		$last_error = end( $this->errors );

		return $this->get_error_message( $last_error );
	}

	/**
	 * Get the error message from the error object, either an array or an Exception object.
	 *
	 * @param array|Exception $error The error object.
	 *
	 * @return string
	 */
	public function get_error_message( $error ) {
		if ( is_array( $error ) && isset( $error['message'] ) ) {
			return $error['message'];
		}

		if ( ! is_array( $error ) && method_exists( $error, 'getMessage' ) ) {
			return $error->getMessage();
		}

		return '';
	}

	/**
	 * Get the short version of the error message without the file and line number.
	 *
	 * @param string $message The error message.
	 *
	 * @return string
	 */
	public function get_error_message_short( $message ) {
		$pattern = '/^([^:]+: .+?) in/';

		if ( preg_match( $pattern, $message, $matches ) ) {
			$message = $matches[1];
		}

		return $message;
	}

	/**
	 * Set the error count.
	 *
	 * @param int $count The error count.
	 *
	 * @return void
	 */
	private function set_error_count( $count ) {
		$this->error_count = $count;
	}

	/**
	 * Set the snippets that have errors.
	 *
	 * @param int[] $snippets Ids of the snippets with errors.
	 *
	 * @return void
	 */
	private function set_snippets_with_errors( $snippets ) {
		update_option( 'wpcode_snippets_errors', $snippets );
	}

	/**
	 * Clear the persistent error count.
	 *
	 * @return void
	 */
	public function clear_snippets_errors() {
		unset( $this->error_count );
		delete_option( 'wpcode_snippets_errors' );
		$this->snippets_with_errors = false;
		$this->gather_errors();
	}

	/**
	 * Get the error count.
	 *
	 * @return int
	 */
	public function get_error_count() {
		if ( ! isset( $this->error_count ) ) {
			$snippets_with_errors = $this->get_snippets_with_errors();
			$this->error_count    = is_array( $snippets_with_errors ) ? count( $snippets_with_errors ) : 0;
		}

		return $this->error_count;
	}

	/**
	 * Get the snippets that have errors.
	 *
	 * @return int[]
	 */
	public function get_snippets_with_errors() {
		if ( ! isset( $this->snippets_with_errors ) ) {
			$this->snippets_with_errors = get_option( 'wpcode_snippets_errors' );
		}

		return $this->snippets_with_errors;
	}

	/**
	 * Let's query all the snippets that have an error set to them.
	 *
	 * @return void
	 */
	public function gather_errors() {

		// If we already have an error count, no need to query the db.
		if ( false !== $this->get_snippets_with_errors() ) {
			return;
		}

		$snippets = get_posts(
			array(
				'post_type'      => 'wpcode',
				'posts_per_page' => - 1,
				'post_status'    => 'any',
				'meta_query'     => array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
					'relation' => 'OR',
					array(
						'key'     => '_wpcode_last_error',
						'compare' => 'EXISTS',
					),
				),
				'fields'         => 'ids',
			)
		);

		$this->set_snippets_with_errors( $snippets );
		$this->set_error_count( count( $snippets ) );
	}

	/**
	 * Track errors thrown by PHP.
	 *
	 * @param Throwable $e The error or exception object.
	 *
	 * @return void
	 */
	public function track_errors( $e ) {
		$error = array(
			'line'    => $e->getLine(),
			'file'    => $e->getFile(),
			'message' => $e->getMessage(),
			'type'    => 'error',
		);

		if ( wpcode()->execute->is_error_from_wpcode( $error ) && ! empty( $error['line'] ) ) {
			$snippet = wpcode()->execute->snippet_executed;
			if ( ! empty( $snippet ) && ! wpcode()->execute->snippet_location_disable( $snippet ) ) {
				$error['snippet']    = $snippet;
				$error['error_line'] = $error['line'];
				// Let's try to determine on which page we are and potentially save that URL in the error details.
				global $wp;
				if ( isset( $wp->request ) ) {
					$error['url'] = home_url( $wp->request );
				}

				wpcode()->error->add_error( $error );
			}
		}

		$this->call_previous_exception_handler( $e );
	}

	/**
	 * Call the previous exception handler.
	 *
	 * @param Throwable $e The error or exception object.
	 *
	 * @return void
	 * @throws Throwable The error or exception object.
	 */
	private function call_previous_exception_handler( $e ) {
		if ( isset( $this->previous_exception_handler ) ) {
			call_user_func( $this->previous_exception_handler, $e );
		} else {
			throw $e;
		}

		exit();
	}
}
includes/generator/class-wpcode-generator-query.php000064400000062625151331545640016606 0ustar00<?php
/**
 * Generate a snippet using WP_Query
 *
 * @package WPCode
 */

/**
 * WPCode_Generator_Query class.
 */
class WPCode_Generator_Query extends WPCode_Generator_Type {

	/**
	 * The generator slug.
	 *
	 * @var string
	 */
	public $name = 'query';

	/**
	 * The categories for this generator.
	 *
	 * @var string[]
	 */
	public $categories = array(
		'query',
	);

	/**
	 * This snippet should not be auto-inserted by default.
	 *
	 * @var bool
	 */
	public $auto_insert = false;

	/**
	 * Set the translatable strings.
	 *
	 * @return void
	 */
	protected function set_strings() {
		$this->title       = __( 'WP_Query', 'insert-headers-and-footers' );
		$this->description = __( 'Generate a snippet using WP_Query to load posts from your website.', 'insert-headers-and-footers' );
	}

	/**
	 * Get a list of available post types for autocomplete.
	 *
	 * @return array
	 */
	public function get_autocomplete_post_types() {
		return array_keys( get_post_types() );
	}

	/**
	 * Get a list of available post statuses for autocomplete.
	 *
	 * @return array
	 */
	public function get_autocomplete_post_statuses() {
		return array_keys( get_post_statuses() );
	}

	/**
	 * Load the generator tabs.
	 *
	 * @return void
	 */
	protected function load_tabs() {
		$this->tabs = array(
			'info'       => array(
				'label'   => __( 'Info', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						// Column 1 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Overview', 'insert-headers-and-footers' ),
							'content' => sprintf(
							// Translators: Placeholders add links to the wordpress.org references.
								__( 'This generator makes it easy for you to create custom queries using %1$sWP_Query%2$s which you can then extend to display posts or similar.', 'insert-headers-and-footers' ),
								'<a href="https://developer.wordpress.org/reference/classes/wp_query/" target="_blank">',
								'</a>'
							),
						),
					),
					// Column 2.
					array(
						// Column 2 fields.
						array(
							'type'    => 'list',
							'label'   => __( 'Usage', 'insert-headers-and-footers' ),
							'content' => array(
								__( 'Fill in the forms using the menu on the left.', 'insert-headers-and-footers' ),
								__( 'Click the "Update Code" button.', 'insert-headers-and-footers' ),
								__( 'Click on "Use Snippet" to create a new snippet with the generated code.', 'insert-headers-and-footers' ),
								__( 'Activate and save the snippet and you\'re ready to go', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						// Column 3 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Examples', 'insert-headers-and-footers' ),
							'content' => __( 'You can use this generator to get quickly started with a query for all the posts of an author and display them using the shortcode functionality of WPCode or automatically displaying the posts using the auto-insert option.', 'insert-headers-and-footers' ),
						),
					),
				),
			),
			'general'    => array(
				'label'   => __( 'General', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Query variable name', 'insert-headers-and-footers' ),
							'description' => __( 'If you want to use something more specific. The leading $ will be automatically added.', 'insert-headers-and-footers' ),
							'id'          => 'var_name',
							'placeholder' => '$query',
							'default'     => 'query',
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Include loop', 'insert-headers-and-footers' ),
							'description' => __( 'Select yes if you want to include an empty loop of the results that you can fill in for output.', 'insert-headers-and-footers' ),
							'id'          => 'loop',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
					),
				),
			),
			'post'       => array(
				'label'   => __( 'IDs & Parents', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'            => 'text',
							'label'           => __( 'Post ID(s)', 'insert-headers-and-footers' ),
							'description'     => __( 'Query a specific post ID or comma-separated list of ids. Cannot be combined with "Post ID not in" below.', 'insert-headers-and-footers' ),
							'id'              => 'post__in',
							'default'         => '',
							'comma-separated' => true,
						),
						array(
							'type'            => 'text',
							'label'           => __( 'Post ID not in', 'insert-headers-and-footers' ),
							'description'     => __( 'Post ids to exclude from this query. Cannot be combined with "Post ID(s)" above.', 'insert-headers-and-footers' ),
							'id'              => 'post__not_in',
							'default'         => '',
							'comma-separated' => true,
						),
					),
					// Column 2.
					array(
						array(
							'type'            => 'text',
							'label'           => __( 'Post parent ID(s)', 'insert-headers-and-footers' ),
							'description'     => __( 'Comma-separated list of post parent ids if the post type is hierarchical (like pages).', 'insert-headers-and-footers' ),
							'id'              => 'post_parent__in',
							'default'         => '',
							'comma-separated' => true,
						),
						array(
							'type'            => 'text',
							'label'           => __( 'Post parent not in', 'insert-headers-and-footers' ),
							'description'     => __( 'Comma-separated list of post parent ids to exclude.', 'insert-headers-and-footers' ),
							'id'              => 'post_parent__not_in',
							'default'         => '',
							'comma-separated' => true,
						),
					),
					// Column 3.
					array(
						array(
							'type'            => 'text',
							'label'           => __( 'Post slugs', 'insert-headers-and-footers' ),
							'description'     => __( 'Comma-separated list of post slugs to query by.', 'insert-headers-and-footers' ),
							'id'              => 'post_name__in',
							'default'         => '',
							'comma-separated' => true,
						),
					),
				),
			),
			'status'     => array(
				'label'   => __( 'Type & Status', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'         => 'text',
							'label'        => __( 'Post type', 'insert-headers-and-footers' ),
							'description'  => __( 'Post type to query by, start typing to get suggestions.', 'insert-headers-and-footers' ),
							'id'           => 'post_type',
							'default'      => 'post',
							'autocomplete' => $this->get_autocomplete_post_types(),
						),
					),
					// Column 2.
					array(
						array(
							'type'         => 'text',
							'label'        => __( 'Post status', 'insert-headers-and-footers' ),
							'description'  => __( 'Post status to query by.', 'insert-headers-and-footers' ),
							'id'           => 'post_status',
							'default'      => 'publish',
							'autocomplete' => $this->get_autocomplete_post_statuses(),
						),
					),
				),
			),
			'author'     => array(
				'label'   => __( 'Author', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Author ID(s)', 'insert-headers-and-footers' ),
							'description' => __( 'Author ID or comma-separated list of ids.', 'insert-headers-and-footers' ),
							'id'          => 'author',
							'default'     => '',
						),
						array(
							'type'            => 'text',
							'label'           => __( 'Author not in', 'insert-headers-and-footers' ),
							'description'     => __( 'Comma-separated list of author ids to exclude from the query.', 'insert-headers-and-footers' ),
							'id'              => 'author__not_in',
							'default'         => '',
							'comma-separated' => true,
						),
					),
					// Column 2.
					array(

						array(
							'type'        => 'text',
							'label'       => __( 'Author name', 'insert-headers-and-footers' ),
							'description' => __( 'Use the "user_nicename" parameter to query by author.', 'insert-headers-and-footers' ),
							'id'          => 'author_name',
							'default'     => '',
						),
					),
				),
			),
			'search'     => array(
				'label'   => __( 'Search', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Search term', 'insert-headers-and-footers' ),
							'description' => __( 'Search for posts by this search term.', 'insert-headers-and-footers' ),
							'id'          => 's',
							'default'     => '',
						),
					),
				),
			),
			'order'      => array(
				'label'   => __( 'Order', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'    => 'select',
							'label'   => __( 'Results Order', 'insert-headers-and-footers' ),
							'id'      => 'order',
							'default' => 'DESC',
							'options' => array(
								'DESC' => __( 'Descending order (3, 2, 1; c, b, a)', 'insert-headers-and-footers' ),
								'ASC'  => __( 'Ascending order (1, 2, 3; a, b, c)', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 2.
					array(
						array(
							'type'    => 'select',
							'label'   => __( 'Order by', 'insert-headers-and-footers' ),
							'id'      => 'orderby',
							'default' => 'date',
							'options' => array(
								'none'            => __( 'No order (none)', 'insert-headers-and-footers' ),
								'ID'              => __( 'ID', 'insert-headers-and-footers' ),
								'author'          => __( 'Author', 'insert-headers-and-footers' ),
								'title'           => __( 'Title', 'insert-headers-and-footers' ),
								'name'            => __( 'Slug (name)', 'insert-headers-and-footers' ),
								'type'            => __( 'Post type (type)', 'insert-headers-and-footers' ),
								'date'            => __( 'Date (default)', 'insert-headers-and-footers' ),
								'modified'        => __( 'Modified date', 'insert-headers-and-footers' ),
								'parent'          => __( 'Parent id', 'insert-headers-and-footers' ),
								'rand'            => __( 'Random', 'insert-headers-and-footers' ),
								'comment_count'   => __( 'Comment count', 'insert-headers-and-footers' ),
								'relevance'       => __( 'Relevance (for search)', 'insert-headers-and-footers' ),
								'menu_order'      => __( 'Page Order (menu_order)', 'insert-headers-and-footers' ),
								//phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value
								'meta_value'      => __( 'Meta value', 'insert-headers-and-footers' ),
								'meta_value_num'  => __( 'Numerical meta value (meta_value_num)', 'insert-headers-and-footers' ),
								'post__in'        => __( 'Order of ids in post__in', 'insert-headers-and-footers' ),
								'post_name__in'   => __( 'Order of names in post_name__in', 'insert-headers-and-footers' ),
								'post_parent__in' => __( 'Order of ids in post_parent__in', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Meta Key', 'insert-headers-and-footers' ),
							'description' => __( 'Meta key to use if you choose to order by meta value.', 'insert-headers-and-footers' ),
							'id'          => 'meta_key',
							'default'     => '',
						),
					),
					// Column 3.
					array(),
				),
			),
			'pagination' => array(
				'label'   => __( 'Pagination', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Use Pagination', 'insert-headers-and-footers' ),
							'id'          => 'nopaging',
							'default'     => 'false',
							'description' => __( 'Choose no to display all posts (not recommended).', 'insert-headers-and-footers' ),
							'options'     => array(
								'true'  => __( 'No', 'insert-headers-and-footers' ),
								'false' => __( 'Yes (default)', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Page number', 'insert-headers-and-footers' ),
							'description' => __( 'Which page to show.', 'insert-headers-and-footers' ),
							'id'          => 'paged',
							'default'     => '',
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Posts per page', 'insert-headers-and-footers' ),
							'description' => __( 'How many posts should be displayed per page.', 'insert-headers-and-footers' ),
							'id'          => 'posts_per_page',
							'default'     => '',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Offset', 'insert-headers-and-footers' ),
							'description' => __( 'Number of posts to skip.', 'insert-headers-and-footers' ),
							'id'          => 'offset',
							'default'     => '',
						),
					),
					// Column 3.
					array(
						array(
							'type'    => 'select',
							'label'   => __( 'Ignore sticky posts', 'insert-headers-and-footers' ),
							'id'      => 'ignore_sticky_posts',
							'default' => 'false',
							'options' => array(
								'true'  => __( 'Yes', 'insert-headers-and-footers' ),
								'false' => __( 'No (default)', 'insert-headers-and-footers' ),
							),
						),
					),
				),
			),
			'taxonomy'   => array(
				'label'   => __( 'Taxonomy', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Taxonomy', 'insert-headers-and-footers' ),
							'description' => __( 'Taxonomy slug that you want to query by.', 'insert-headers-and-footers' ),
							'id'          => 'taxonomy',
							'name'        => 'taxonomy[]',
							'default'     => '',
							'repeater'    => 'tax_query',
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Field', 'insert-headers-and-footers' ),
							'description' => __( 'Select taxonomy term by.', 'insert-headers-and-footers' ),
							'id'          => 'field',
							'name'        => 'field[]',
							'repeater'    => 'tax_query',
							'default'     => 'term_id',
							'options'     => array(
								'term_id'          => __( 'Term ID (default)', 'insert-headers-and-footers' ),
								'name'             => __( 'Term Name', 'insert-headers-and-footers' ),
								'slug'             => __( 'Term Slug', 'insert-headers-and-footers' ),
								'term_taxonomy_id' => __( 'Term Taxonomy ID', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'            => 'text',
							'label'           => __( 'Terms', 'insert-headers-and-footers' ),
							'description'     => __( 'Comma-separated list of terms to query by.', 'insert-headers-and-footers' ),
							'id'              => 'terms',
							'name'            => 'terms[]',
							'default'         => '',
							'repeater'        => 'tax_query',
							'comma-separated' => true,
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Include Children', 'insert-headers-and-footers' ),
							'id'          => 'include_children',
							'name'        => 'include_children[]',
							'default'     => 'true',
							'description' => __( 'Whether or not to include children for hierarchical taxonomies.', 'insert-headers-and-footers' ),
							'options'     => array(
								'true'  => __( 'Yes', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
							'repeater'    => 'tax_query',
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Operator', 'insert-headers-and-footers' ),
							'id'          => 'operator',
							'name'        => 'operator[]',
							'default'     => 'IN',
							'description' => __( 'Operator to test relation by.', 'insert-headers-and-footers' ),
							'options'     => array(
								'IN'         => 'IN',
								'NOT IN'     => 'NOT IN',
								'AND'        => 'AND',
								'EXISTS'     => 'EXISTS',
								'NOT EXISTS' => 'NOT EXISTS',
							),
							'repeater'    => 'tax_query',
						),
						array(
							'type' => 'spacer',
						),
					),
					// Column 3.
					array(
						array(
							'type'    => 'description',
							'label'   => __( 'Add another taxonomy', 'insert-headers-and-footers' ),
							'content' => __( 'Use the "Add Taxonomy" button below to query multiple taxonomies.', 'insert-headers-and-footers' ),
						),
						array(
							'type'        => 'repeater_button',
							'button_text' => __( 'Add Taxonomy', 'insert-headers-and-footers' ),
							'id'          => 'tax_query', // Repeater to repeat when clicked.
						),
						array(
							'type'    => 'select',
							'label'   => __( 'Tax Relation', 'insert-headers-and-footers' ),
							'id'      => 'relation',
							'default' => 'AND',
							'options' => array(
								'AND' => __( 'AND (default)', 'insert-headers-and-footers' ),
								'OR'  => __( 'OR', 'insert-headers-and-footers' ),
							),
						),
					),
				),
			),
			'meta'       => array(
				'label'   => __( 'Custom Fields', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Meta Key', 'insert-headers-and-footers' ),
							'description' => __( 'The key of the custom field.', 'insert-headers-and-footers' ),
							'id'          => 'key',
							'name'        => 'key[]',
							'default'     => '',
							'repeater'    => 'meta_query',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Meta Value', 'insert-headers-and-footers' ),
							'description' => __( 'Value to query the meta by.', 'insert-headers-and-footers' ),
							'id'          => 'value',
							'name'        => 'value[]',
							'default'     => '',
							'repeater'    => 'meta_query',
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Compare', 'insert-headers-and-footers' ),
							'description' => __( 'How to compare the value for querying by meta.', 'insert-headers-and-footers' ),
							'id'          => 'compare',
							'name'        => 'compare[]',
							'repeater'    => 'meta_query',
							'default'     => '=',
							'options'     => array(
								'='           => '=',
								'!='          => '!=',
								'>'           => '>',
								'>='          => '>=',
								'<'           => '<',
								'<='          => '<=',
								'LIKE'        => 'LIKE',
								'NOT LIKE'    => 'NOT LIKE',
								'IN'          => 'IN',
								'NOT IN'      => 'NOT IN',
								'BETWEEN'     => 'BETWEEN',
								'NOT BETWEEN' => 'NOT BETWEEN',
								'EXISTS'      => 'EXISTS',
								'NOT EXISTS'  => 'NOT EXISTS',
								'REGEXP'      => 'REGEXP',
								'NOT REGEXP'  => 'NOT REGEXP',
								'RLIKE'       => 'RLIKE',
							),
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Type', 'insert-headers-and-footers' ),
							'description' => __( 'Type of custom field.', 'insert-headers-and-footers' ),
							'id'          => 'meta_type',
							'name'        => 'meta_type[]',
							'repeater'    => 'meta_query',
							'default'     => 'CHAR',
							'options'     => array(
								'NUMERIC'  => 'NUMERIC',
								'BINARY'   => 'BINARY',
								'CHAR'     => 'CHAR',
								'DATE'     => 'DATE',
								'DATETIME' => 'DATETIME',
								'DECIMAL'  => 'DECIMAL',
								'SIGNED'   => 'SIGNED',
								'TIME'     => 'TIME',
								'UNSIGNED' => 'UNSIGNED',
							),
						),
					),
					// Column 3.
					array(
						array(
							'type'    => 'description',
							'label'   => __( 'Add another meta query', 'insert-headers-and-footers' ),
							'content' => __( 'Use the "Add Meta" button below to use multiple meta queries.', 'insert-headers-and-footers' ),
						),
						array(
							'type'        => 'repeater_button',
							'button_text' => __( 'Add Meta', 'insert-headers-and-footers' ),
							'id'          => 'meta_query', // Repeater to repeat when clicked.
						),
						array(
							'type'    => 'select',
							'label'   => __( 'Relation', 'insert-headers-and-footers' ),
							'id'      => 'meta_relation',
							'default' => 'AND',
							'options' => array(
								'AND' => __( 'AND (default)', 'insert-headers-and-footers' ),
								'OR'  => __( 'OR', 'insert-headers-and-footers' ),
							),
						),
					),
				),
			),
		);
	}

	/**
	 * Get the snippet code with dynamic values applied.
	 *
	 * @return string
	 */
	public function get_snippet_code() {

		$query_variable = '$' . str_replace( '$', '', $this->get_value( 'var_name' ) );
		$loop_code      = '';
		if ( 'true' === $this->get_value( 'loop' ) ) {
			$loop_code = "
if ( {$query_variable}->have_posts() ) {
	while ( {$query_variable}->have_posts() ) {
		{$query_variable}->the_post();
		// Add you post code here.
	}
} else {
	// Display a no posts found message here.
}

// Reset post data.
wp_reset_postdata();
			";
		}

		$optional_values = array(
			'post__in'            => false,
			'post__not_in'        => false,  // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.PostNotIn_post__not_in
			'post_parent__in'     => false,
			'post_parent__not_in' => false,
			'post_name__in'       => true,
			'post_type'           => true,
			'post_status'         => true,
			'author'              => true,
			'author__not_in'      => false,
			'author_name'         => true,
			's'                   => true,
			'order'               => true,
			'orderby'             => true,
			//phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
			'meta_key'            => true,
			'nopaging'            => false,
			'paged'               => false,
			'posts_per_page'      => false,
			'offset'              => false,
			'ignore_sticky_posts' => false,
		);

		$args = '';
		foreach ( $optional_values as $optional_value => $quotes ) {
			$args .= $this->get_optional_value( $optional_value, $quotes );
		}

		$tax_query        = '';
		$taxonomies       = $this->get_value( 'taxonomy' );
		$fields           = $this->get_value( 'field' );
		$terms            = $this->get_value( 'terms' );
		$include_children = $this->get_value( 'include_children' );
		$operator         = $this->get_value( 'operator' );

		if ( ! empty( $taxonomies ) ) {
			$tax_query_arrays = array();
			foreach ( $taxonomies as $key => $taxonomy ) {
				if ( empty( $taxonomy ) ) {
					continue;
				}
				$params = array(
					$this->get_optional_value_code( $fields[ $key ], $this->get_default_value( 'field' ), 'field', true ),
					$this->get_optional_value_code( $terms[ $key ], $this->get_default_value( 'terms' ), 'terms', true, true ),
					$this->get_optional_value_code( $include_children[ $key ], $this->get_default_value( 'include_children' ), 'include_children' ),
					$this->get_optional_value_code( $operator[ $key ], $this->get_default_value( 'operator' ), 'operator', true ),
				);
				$params = array_filter( $params );
				$params = str_replace( "\n", '', $params );
				$params = implode( "\n\t\t", $params );
				if ( ! empty( $params ) ) {
					$params = "\n\t\t" . $params;
				}
				$tax_query_arrays[] = "\n\t\t\tarray(
				'taxonomy'              => '$taxonomy',$params
			),";
			}
			if ( ! empty( $tax_query_arrays ) ) {
				$tax_query = "\t\t'tax_query' => array(";
				if ( count( $tax_query_arrays ) > 1 ) {
					$optional_relation = $this->get_optional_value( 'relation', true );
					if ( ! empty( $optional_relation ) ) {
						$tax_query .= "\n\t" . str_replace( "\n", '', $optional_relation );
					}
				}

				$tax_query .= implode( '', $tax_query_arrays );
				$tax_query .= '
		),';
			}
		}

		$meta_query    = '';
		$meta_keys     = $this->get_value( 'key' );
		$meta_values   = $this->get_value( 'value' );
		$meta_compares = $this->get_value( 'compare' );
		$meta_types    = $this->get_value( 'meta_type' );

		if ( ! empty( $meta_keys ) ) {
			$meta_query_arrays = array();
			foreach ( $meta_keys as $key => $meta_key ) {
				if ( empty( $meta_key ) ) {
					continue;
				}
				$params = array(
					$this->get_optional_value_code( $meta_values[ $key ], $this->get_default_value( 'value' ), 'value', true ),
					$this->get_optional_value_code( $meta_compares[ $key ], $this->get_default_value( 'compare' ), 'compare', true ),
					$this->get_optional_value_code( $meta_types[ $key ], $this->get_default_value( 'meta_type' ), 'type', true ),
				);
				$params = array_filter( $params );
				$params = str_replace( "\n", '', $params );
				$params = implode( "\n\t\t", $params );
				if ( ! empty( $params ) ) {
					$params = "\n\t\t" . $params;
				}
				$meta_query_arrays[] = "\n\t\t\tarray(
				'key'                   => '$meta_key',$params
			),";
			}

			if ( ! empty( $meta_query_arrays ) ) {
				$meta_query = "\n\t\t'meta_query' => array(";
				if ( count( $meta_query_arrays ) > 1 ) {
					$optional_relation = $this->get_optional_value( 'meta_relation', true, 'relation' );
					if ( ! empty( $optional_relation ) ) {
						$meta_query .= "\n\t" . str_replace( "\n", '', $optional_relation );
					}
				}

				$meta_query .= implode( '', $meta_query_arrays );
				$meta_query .= '
		),';
			}
		}

		$args = "\n" . $args;

		return '// Query Posts.

// Query arguments.
$query_args = array(' . $args . $tax_query . $meta_query . '
);

// Run the query.
' . $query_variable . ' = new WP_Query( $query_args );
' . $loop_code . '
';
	}

}
includes/generator/class-wpcode-generator-type.php000064400000051251151331545640016413 0ustar00<?php
/**
 * Base for different types of snippet generators.
 *
 * @package WPCode
 */

abstract class WPCode_Generator_Type {
	/**
	 * The name (slug) for this generator.
	 *
	 * @var string
	 */
	public $name;
	/**
	 * The title of the generator (translatable field).
	 *
	 * @var string
	 */
	public $title;
	/**
	 * The description of the generator.
	 * This will be displayed in the list of available generators.
	 *
	 * @var string
	 */
	public $description;
	/**
	 * Array of categories for this generator.
	 *
	 * @var array
	 */
	public $categories;
	/**
	 * Array of tabs for the generator fields.
	 *
	 * @var array;
	 */
	public $tabs;
	/**
	 * Store the form data object in an array so we pick values from it.
	 *
	 * @var array
	 */
	public $form_data;
	/**
	 * Catch here all the fields not using the default value.
	 *
	 * @var array
	 */
	public $fields_from_form = array();
	/**
	 * Location where the snippet will run after being saved.
	 *
	 * @var string
	 */
	public $location = 'everywhere';
	/**
	 * Array of tags to add to the saved snippet.
	 *
	 * @var string[]
	 */
	public $tags = array(
		'generated',
	);
	/**
	 * Snippet code type for when it will be saved.
	 *
	 * @var string
	 */
	public $code_type = 'php';
	/**
	 * Should the generated snippet be auto-inserted?
	 *
	 * @var bool
	 */
	public $auto_insert = true;

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->set_strings();
		$this->load_tabs();
	}

	/**
	 * Replace this in the type to add translatable fields on init.
	 *
	 * @return void
	 */
	abstract protected function set_strings();

	/**
	 * Load the data for the generator tabs.
	 *
	 * @return void
	 */
	protected function load_tabs() {
		$this->tabs = array();
	}

	/**
	 * Let's use a method.
	 *
	 * @return string
	 */
	public function get_title() {
		return $this->title;
	}

	/**
	 * Let's use a method.
	 *
	 * @return string
	 */
	public function get_description() {
		return $this->description;
	}

	/**
	 * Let's use a method.
	 *
	 * @return string
	 */
	public function get_location() {
		return $this->location;
	}

	/**
	 * Let's use a method.
	 *
	 * @return array
	 */
	public function get_tags() {
		return $this->tags;
	}

	/**
	 * Let's use a method.
	 *
	 * @return string
	 */
	public function get_code_type() {
		return $this->code_type;
	}

	/**
	 * Get the name.
	 *
	 * @return string
	 */
	public function get_name() {
		return $this->name;
	}

	/**
	 * Get the categories of this generator.
	 *
	 * @return array
	 */
	public function get_categories() {
		return $this->categories;
	}

	/**
	 * Takes a tab id and renders the form items.
	 *
	 * @param string $tab_id The tab id.
	 * @param array  $snippet_data Data to prefill the form with from a generated snippet.
	 *
	 * @return void
	 */
	public function render_tab( $tab_id, $snippet_data ) {
		$tab_info = $this->tabs[ $tab_id ];

		foreach ( $tab_info['columns'] as $column_fields ) {
			$repeater_groups_fields = array();
			$repeater_groups_values = array();
			?>
			<div class="wpcode-generator-column">
				<?php
				foreach ( $column_fields as $field ) {
					if ( isset( $field['id'] ) && isset( $snippet_data[ $field['id'] ] ) ) {
						if ( isset( $field['repeater'] ) ) {
							$repeater_groups_fields[ $field['repeater'] ][ $field['id'] ] = $field;
							$repeater_groups_values[ $field['repeater'] ][ $field['id'] ] = $snippet_data[ $field['id'] ];
							$field['value']                                               = $snippet_data[ $field['id'] ][0];
						} else {
							$field['value'] = $snippet_data[ $field['id'] ];
						}
					}
					$this->render_field( $field );
				}
				// Render repeater fields values.
				if ( ! empty( $repeater_groups_values ) ) {
					$i = 0;
					foreach ( $repeater_groups_values as $repeater_id => $repeater_values ) {
						foreach ( $repeater_values as $field_id => $field_values ) {
							foreach ( $field_values as $key => $field_value ) {
								if ( 0 === $key ) {
									// This one was already rendered.
									continue;
								}
								?>
								<div class="wpcode-repeater-group" data-id="<?php echo absint( $i ); ?>">
									<?php foreach ( $repeater_groups_fields[ $repeater_id ] as $repeater_field_id => $repeater_groups_field ) {
										$repeater_groups_field['value'] = $repeater_values[ $repeater_field_id ][ $key ];
										$this->render_field( $repeater_groups_field );
									}
									?>
									<button type="button" class="wpcode-button wpcode-button-secondary wpcode-remove-row" data-target="<?php echo absint( $i ); ?>"><?php esc_html_e( 'Remove Row', 'insert-headers-and-footers' ); ?></button>
								</div>
								<?php
								$i ++;
							}
							continue 2;
						}
					}
				}
				?>
			</div>
			<?php
		}
	}

	/**
	 * Takes a field config from the tabs object and renders it's input.
	 *
	 * @param array $field The field config.
	 *
	 * @return void
	 */
	public function render_field( $field ) {
		// Check if the field type is set.
		if ( ! isset( $field['type'] ) ) {
			return;
		}
		$type = $field['type'];
		// Check if we have a method of rendering the field.
		if ( ! method_exists( $this, 'render_field_' . $type ) ) {
			return;
		}

		$this->add_field_wrap( $field );
		call_user_func_array( array( $this, 'render_field_' . $type ), array( $field ) );
		$this->add_field_wrap( $field, true );
	}

	/**
	 * Add field wrap.
	 *
	 * @param array $field The field config.
	 * @param bool  $end Whether to output the closing tag.
	 *
	 * @return void
	 */
	public function add_field_wrap( $field, $end = false ) {
		if ( $end ) {
			echo '</div>';

			return;
		}
		$type     = $field['type'];
		$repeater = empty( $field['repeater'] ) ? '' : 'data-repeater="' . esc_attr( $field['repeater'] ) . '"';
		$classes  = array(
			'wpcode-generator-field',
			'wpcode-generator-field-' . $type,
		);
		if ( ! empty( $field['autocomplete'] ) ) {
			$classes[] = 'wpcode-generator-field-autocomplete';
		}

		echo '<div class="' . esc_attr( implode( ' ', $classes ) ) . '" ' . $repeater . '>';// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
	}

	/**
	 * Render the description field.
	 *
	 * @param array $field The field array as defined in the tabs array.
	 *
	 * @return void
	 */
	public function render_field_description( $field ) {
		$field = wp_parse_args(
			$field,
			array(
				'label'   => '',
				'content' => '',
			)
		);

		$this->text_field_label( $field['label'] );
		if ( ! empty( $field['content'] ) ) {
			?>
			<p><?php echo wp_kses_post( $field['content'] ); ?></p>
			<?php
		}
	}

	/**
	 * Render a label for text-type fields (description, list, etc).
	 *
	 * @param string $label The label to render.
	 *
	 * @return void
	 */
	public function text_field_label( $label ) {
		if ( empty( $label ) ) {
			return;
		}
		?>
		<label><?php echo wp_kses_post( $label ); ?></label>
		<?php
	}

	/**
	 * Render a list from an array.
	 *
	 * @param array $field The field array.
	 *
	 * @return void
	 */
	public function render_field_list( $field ) {
		$field = wp_parse_args(
			$field,
			array(
				'label'   => '',
				'content' => array(),
			)
		);

		$this->text_field_label( $field['label'] );
		if ( ! empty( $field['content'] ) && is_array( $field['content'] ) ) {
			?>
			<ul>
				<?php foreach ( $field['content'] as $li ) { ?>
					<li><?php echo wp_kses_post( $li ); ?></li>
				<?php } ?>
			</ul>
			<?php
		}
	}

	/**
	 * Render a text input field.
	 *
	 * @param array $field The field array.
	 *
	 * @return void
	 */
	public function render_field_text( $field ) {
		if ( empty( $field['id'] ) ) {
			return;
		}
		if ( ! empty( $field['label'] ) ) {
			$this->input_field_label( $field['label'], $field['id'] );
		}
		$id          = $field['id'];
		$placeholder = ! empty( $field['placeholder'] ) ? $field['placeholder'] : '';
		$name        = empty( $field['name'] ) ? $id : $field['name'];
		$value       = isset( $field['value'] ) ? $field['value'] : $this->get_default_value( $field['id'] );
		?>
		<input type="text" id="<?php echo esc_attr( $id ); ?>" name="<?php echo esc_attr( $name ); ?>" placeholder="<?php echo esc_attr( $placeholder ); ?>" value="<?php echo esc_attr( $value ); ?>" class="wpcode-input-text"/>
		<?php
		if ( ! empty( $field['description'] ) ) {
			$this->input_field_description( $field['description'] );
		}
		if ( ! empty( $field['autocomplete'] ) ) {
			?>
			<script type="application/json" class="wpcode-field-autocomplete"><?php echo wp_json_encode( $field['autocomplete'] ); ?></script>
			<?php
		}
	}

	/**
	 * HTML field just extends the text one for now.
	 *
	 * @param array $field The field array.
	 *
	 * @return void
	 */
	public function render_field_html( $field ) {
		$this->render_field_text( $field );
	}

	/**
	 * Render a label for an input.
	 *
	 * @param string $label The label text.
	 * @param string $id The id to use for the "for" attribute of the label.
	 *
	 * @return void
	 */
	public function input_field_label( $label, $id ) {
		if ( empty( $label ) ) {
			return;
		}
		?>
		<label for="<?php echo esc_attr( $id ); ?>">
			<?php echo wp_kses_post( $label ); ?>
		</label>
		<?php
	}

	/**
	 * Render a field's description.
	 *
	 * @param string $description The field description.
	 *
	 * @return void
	 */
	public function input_field_description( $description ) {
		?>
		<p class="wpcode-field-description"><?php echo wp_kses_post( $description ); ?></p>
		<?php
	}

	/**
	 * Render a select dropdown.
	 *
	 * @param array $field The field options.
	 *
	 * @return void
	 */
	public function render_field_select( $field ) {
		if ( empty( $field['id'] ) ) {
			return;
		}
		if ( ! empty( $field['label'] ) ) {
			$this->input_field_label( $field['label'], $field['id'] );
		}
		$id   = $field['id'];
		$name = empty( $field['name'] ) ? $id : $field['name'];
		if ( ! empty( $field['options'] ) && is_array( $field['options'] ) ) {
			reset( $field['options'] );
			if ( isset( $field['value'] ) ) {
				$selected = $field['value'];
			} else {
				$selected = isset( $field['default'] ) ? $field['default'] : key( $field['options'] );
			}
			?>
			<select name="<?php echo esc_attr( $name ); ?>" id="<?php echo esc_attr( $id ); ?>">
				<?php
				foreach ( $field['options'] as $value => $label ) {
					?>
					<option value="<?php echo esc_attr( $value ); ?>" <?php selected( $selected, $value ); ?>><?php echo esc_html( $label ); ?></option>
				<?php } ?>
			</select>
			<?php
		}
		if ( ! empty( $field['description'] ) ) {
			$this->input_field_description( $field['description'] );
		}
	}

	/**
	 * Render a list of checkboxes from a field list of options.
	 *
	 * @param array $field The field settings array.
	 *
	 * @return void
	 */
	public function render_field_checkbox_list( $field ) {
		if ( empty( $field['options'] ) ) {
			return;
		}
		$checked = empty( $field['default'] ) ? array() : $field['default'];
		if ( isset( $field['value'] ) ) {
			$checked = $field['value'];
		}

		foreach ( $field['options'] as $value => $label ) {
			?>
			<div class="wpcode-checkbox-line">
				<label class="wpcode-checkbox-toggle">
					<input type="checkbox" name="<?php echo esc_attr( $field['id'] ); ?>[]" value="<?php echo esc_attr( $value ); ?>" id="<?php echo esc_attr( $field['id'] . '_' . $value ); ?>" <?php checked( in_array( $value, $checked, true ) ); ?>/>
					<span class="wpcode-checkbox-toggle-slider"></span>
				</label>
				<label for="<?php echo esc_attr( $field['id'] . '_' . $value ); ?>"><?php echo esc_html( $label ); ?></label>
			</div>
			<?php
		}
	}

	/**
	 * The repeater button used to add new repeater rows.
	 *
	 * @param array $field The field array.
	 *
	 * @return void
	 */
	public function render_field_repeater_button( $field ) {
		if ( empty( $field['id'] ) ) {
			return;
		}

		?>
		<button type="button" class="wpcode-button wpcode-button-secondary wpcode-repeater-button" data-target="<?php echo esc_attr( $field['id'] ); ?>"><?php echo esc_html( $field['button_text'] ); ?></button>
		<?php

	}

	/**
	 * Set the form data object from an array - usually the $_POST object.
	 *
	 * @param array $form_data The form data object.
	 *
	 * @return string
	 */
	public function process_form_data( $form_data ) {
		$this->form_data = $form_data;

		return $this->get_snippet_code();
	}

	/**
	 * Get the snippet code with the values added to it.
	 *
	 * @return string
	 */
	abstract public function get_snippet_code();

	/**
	 * Get a value for output in the snippet code, if the form data is set
	 * we sanitise that and return it otherwise return the default value.
	 *
	 * @param string $field_id The field id.
	 *
	 * @return string
	 */
	public function get_value( $field_id ) {
		return ! empty( $this->form_data[ $field_id ] ) ? $this->sanitize_form_data( $field_id ) : $this->get_default_value( $field_id );
	}

	/**
	 * Sanitize form value based on the field type.
	 *
	 * @param string $field_id The id of the field.
	 *
	 * @return string
	 */
	protected function sanitize_form_data( $field_id ) {
		$field_type = $this->find_field_prop( $field_id, 'type' );
		$value      = $this->form_data[ $field_id ];
		if ( 'text' === $field_type && is_array( $value ) ) {
			$field_type = 'text_array';
		}
		if ( 'textarea' === $field_type && is_array( $value ) ) {
			$field_type = 'textarea_array';
		}
		if ( 'select' === $field_type && is_array( $value ) ) {
			$field_type = 'text_array';
		}
		if ( 'html' === $field_type && is_array( $value ) ) {
			$field_type = 'html_array';
		}

		switch ( $field_type ) {
			case 'text_array':
			case 'checkbox_list':
				$sanitized = array_map( 'sanitize_text_field', wp_unslash( $value ) );
				foreach ( $sanitized as $item => $value ) {
					$sanitized[ $item ] = '' === $value ? $this->get_default_value( $field_id ) : $value;
				}
				break;
			case 'textarea_array':
				$sanitized = array_map( 'sanitize_textarea_field', wp_unslash( $value ) );
				foreach ( $sanitized as $item => $value ) {
					$sanitized[ $item ] = '' === $value ? $this->get_default_value( $field_id ) : $value;
				}
				break;
			case 'html_array':
				$sanitized = array_map( 'wp_kses_post', wp_unslash( $value ) );
				foreach ( $sanitized as $item => $value ) {
					$sanitized[ $item ] = '' === $value ? $this->get_default_value( $field_id ) : $value;
				}
				break;
			case 'textarea':
				$sanitized = sanitize_textarea_field( wp_unslash( $value ) );
				break;
			case 'html':
				$sanitized = wp_kses_post( wp_unslash( $value ) );
				break;
			case 'text':
			default:
				$sanitized = sanitize_text_field( wp_unslash( $value ) );
		}

		if ( ! isset( $this->fields_from_form[ $field_id ] ) ) {
			$this->fields_from_form[ $field_id ] = $sanitized;
		}

		return $sanitized;
	}

	/**
	 * Go through the tabs config and find a field value by its id.
	 *
	 * @param string $field_id The id of the field.
	 * @param string $field_value The key of the value (e.g. 'content').
	 *
	 * @return string
	 */
	public function find_field_prop( $field_id, $field_value ) {
		$tabs = $this->get_tabs();
		foreach ( $tabs as $tab ) {
			foreach ( $tab['columns'] as $column_fields ) {
				foreach ( $column_fields as $field ) {
					if ( ! empty( $field['id'] ) && $field_id === $field['id'] ) {
						return ! isset( $field[ $field_value ] ) ? '' : $field[ $field_value ];
					}
				}
			}
		}

		return '';
	}

	/**
	 * Get the tabs for rendering.
	 *
	 * @return array
	 */
	public function get_tabs() {
		return $this->tabs;
	}

	/**
	 * Go through the tabs config and find the default value for a field.
	 *
	 * @param string $field_id The id of the field for which we want the default value.
	 *
	 * @return string
	 */
	public function get_default_value( $field_id ) {
		return $this->find_field_prop( $field_id, 'default' );
	}

	/**
	 * Get a string with values comma-separated and convert it to PHP array.
	 *
	 * @param string $field_id The id of the field to grab the data for.
	 *
	 * @return string
	 */
	public function get_value_comma_separated( $field_id ) {
		return $this->get_value_comma_separated_code( $this->get_value( $field_id ) );
	}

	/**
	 * Get a comma separated string and return an array.
	 *
	 * @param string $value The value to explode.
	 * @param bool   $quotes Whether to add quotes to the values or not.
	 *
	 * @return string
	 */
	public function get_value_comma_separated_code( $value, $quotes = true ) {
		$items = explode( ',', $value );

		return $this->array_to_code_string( $items, $quotes );
	}

	/**
	 * Takes an array of strings and returns php code for an array of strings.
	 *
	 * @param string[] $items The array to convert.
	 * @param bool     $quotes Whether to add quotes to the values or not.
	 *
	 * @return string
	 */
	public function array_to_code_string( $items, $quotes = true ) {
		if ( empty( $items ) || empty( $items[0] ) ) {
			return 'array()';
		}
		$items = array_map( 'trim', $items );
		if ( $quotes ) {
			$items = array_map( array( $this, 'add_quotes' ), $items );
		}

		return 'array( ' . implode( ', ', $items ) . ' )';
	}

	/**
	 * Callback to add quotes because we can't use closures in PHP 5.2.
	 *
	 * @param string $item String to add quotes to.
	 *
	 * @return string
	 */
	private function add_quotes( $item ) {
		return "'$item'";
	}

	/**
	 * Get value of array fields like checkboxes or select multiple.
	 *
	 * @param string $field_id The field id.
	 *
	 * @return string
	 */
	public function get_array_value( $field_id ) {
		$value = $this->get_value( $field_id );

		return $this->array_to_code_string( $value );
	}

	/**
	 * Get the fields that were updated using the form (not using the default value).
	 *
	 * @return array
	 */
	public function get_generator_data() {
		return $this->fields_from_form;
	}

	/**
	 * If the generated snippet should be auto-inserted or not (used as a shortcode).
	 *
	 * @return bool
	 */
	public function get_auto_insert() {
		return $this->auto_insert;
	}

	/**
	 * Get PHP array code for an optional parameter by field ID.
	 *
	 * @param string $field_id The field id to grab the value for.
	 * @param bool   $quotes Wrap the output value in quotes?.
	 * @param string $array_key The array key if different from the field id, otherwise the field id is used.
	 *
	 * @return string
	 * @see get_optional_value_code
	 */
	public function get_optional_value( $field_id, $quotes = false, $array_key = '' ) {
		if ( empty( $array_key ) ) {
			$array_key = $field_id;
		}
		$value           = $this->get_value( $field_id );
		$default         = $this->get_default_value( $field_id );
		$comma_separated = $this->find_field_prop( $field_id, 'comma-separated' );

		return $this->get_optional_value_code( $value, $default, $array_key, $quotes, $comma_separated );
	}

	/**
	 * Get PHP array code for an optional parameter.
	 * If the default value is used nothing will be output.
	 * It will also attempt to align all the values properly.
	 *
	 * @param string $value The current value to compare to the default.
	 * @param string $default The default value.
	 * @param string $array_key The array key to use if the value will be output.
	 * @param bool   $quotes Whether to use quotes for the value output.
	 * @param bool   $comma_separated If the value is actually a comma-separated list.
	 *
	 * @return string
	 */
	public function get_optional_value_code( $value, $default, $array_key, $quotes = false, $comma_separated = false ) {
		if ( $value === $default ) {
			return '';
		}
		if ( $comma_separated ) {
			$value = $this->get_value_comma_separated_code( $value, $quotes );
		} elseif ( $quotes ) {
			$value = "'$value'";
		}
		$indent = 22 - strlen( $array_key );
		$indent = str_repeat( ' ', $indent );

		return "\t\t'$array_key'$indent=> $value,\n";
	}

	/**
	 * Output a simple spacer used to align repeater rows.
	 *
	 * @return void
	 */
	public function render_field_spacer() {
		?>
		<div class="wpcode-column-spacer"></div>
		<?php
	}

	/**
	 * Render a textarea field, optionally a code editor.
	 *
	 * @param array $field The field settings.
	 *
	 * @return void
	 */
	public function render_field_textarea( $field ) {
		if ( empty( $field['id'] ) ) {
			return;
		}
		if ( ! empty( $field['label'] ) ) {
			$this->input_field_label( $field['label'], $field['id'] );
		}
		$id      = $field['id'];
		$name    = empty( $field['name'] ) ? $id : $field['name'];
		$classes = array(
			'wpcode-input-textarea',
		);
		if ( ! empty( $field['code'] ) ) {
			$classes[] = 'wpcode-generator-code';
		}
		$value = isset( $field['value'] ) ? $field['value'] : '';
		?>
		<textarea name="<?php echo esc_attr( $name ); ?>" id="<?php echo esc_attr( $id ); ?>" class="<?php echo esc_attr( implode( ' ', $classes ) ); ?>"><?php echo esc_html( $value ); ?></textarea>
		<?php
		if ( ! empty( $field['description'] ) ) {
			$this->input_field_description( $field['description'] );
		}
	}

	/**
	 * Sanitize a value to be used as a PHP function name.
	 *
	 * @param string $value The name you want sanitized.
	 *
	 * @return string
	 */
	public function sanitize_function_name( $value ) {
		return str_replace( '-', '_', sanitize_title_with_dashes( $value ) );
	}
}
includes/generator/class-wpcode-generator-post-type.php000064400000114020151331545640017370 0ustar00<?php
/**
 * Generate a snippet to register a new post type.
 *
 * @package WPCode
 */

/**
 * The Post Type generator.
 */
class WPCode_Generator_Post_Type extends WPCode_Generator_Type {

	/**
	 * The generator slug.
	 *
	 * @var string
	 */
	public $name = 'post-type';

	/**
	 * The categories for this generator.
	 *
	 * @var string[]
	 */
	public $categories = array(
		'content',
	);

	/**
	 * Set the translatable strings.
	 *
	 * @return void
	 */
	protected function set_strings() {
		$this->title       = __( 'Post Type', 'insert-headers-and-footers' );
		$this->description = __( 'Use this tool to generate a custom post type for your website.', 'insert-headers-and-footers' );
	}

	/**
	 * Load the generator tabs.
	 *
	 * @return void
	 */
	protected function load_tabs() {
		$this->tabs = array(
			'info'         => array(
				'label'   => __( 'Info', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						// Column 1 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Overview', 'insert-headers-and-footers' ),
							'content' => __( 'Generate custom post types for your website using a snippet.', 'insert-headers-and-footers' ),
						),
					),
					// Column 2.
					array(
						// Column 2 fields.
						array(
							'type'    => 'list',
							'label'   => __( 'Usage', 'insert-headers-and-footers' ),
							'content' => array(
								__( 'Fill in the forms using the menu on the left.', 'insert-headers-and-footers' ),
								__( 'Click the "Update Code" button.', 'insert-headers-and-footers' ),
								__( 'Click on "Use Snippet" to create a new snippet with the generated code.', 'insert-headers-and-footers' ),
								__( 'Activate and save the snippet and you\'re ready to go', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						// Column 3 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Examples', 'insert-headers-and-footers' ),
							'content' => __( 'You can add custom post types for specific items that are not blog posts, for example, if your site is about music you can have post types for artists, albums or songs.', 'insert-headers-and-footers' ),
						),
					),
				),
			),
			'general'      => array(
				'label'   => __( 'General', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Function name', 'insert-headers-and-footers' ),
							'description' => __( 'Make this unique to avoid conflicts with other snippets', 'insert-headers-and-footers' ),
							'id'          => 'function_name',
							'placeholder' => 'custom_post_type',
							'default'     => 'custom_post_type' . time(),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Text Domain', 'insert-headers-and-footers' ),
							'description' => __( 'Optional text domain for translations.', 'insert-headers-and-footers' ),
							'id'          => 'text_domain',
							'placeholder' => 'text_domain',
							'default'     => 'text_domain',
						),
					),
				),
			),
			'post_type'    => array(
				'label'   => __( 'Post Type', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Post Type Key', 'insert-headers-and-footers' ),
							'description' => __( 'Name of post type used in the code, lowercase maximum 20 characters.', 'insert-headers-and-footers' ),
							'id'          => 'post_type',
							'placeholder' => 'post_type',
							'default'     => 'post_type',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Description', 'insert-headers-and-footers' ),
							'description' => __( 'A short description of the post type.', 'insert-headers-and-footers' ),
							'id'          => 'description',
							'placeholder' => 'Post type description',
							'default'     => 'Post type description',
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Name', 'insert-headers-and-footers' ),
							'description' => __( 'The singular post type name (e.g. Artist, Album, Song).', 'insert-headers-and-footers' ),
							'id'          => 'label',
							'placeholder' => 'Post Type',
							'default'     => 'Post Type',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Name (Plural)', 'insert-headers-and-footers' ),
							'description' => __( 'The post type plural name (e.g. Artists, Albums, Songs).', 'insert-headers-and-footers' ),
							'id'          => 'label_count',
							'placeholder' => 'Post Types',
							'default'     => 'Post Types',
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Link To Taxonomies', 'insert-headers-and-footers' ),
							'description' => __( 'Comma-separated list of Taxonomies (e.g. post_tag, category)', 'insert-headers-and-footers' ),
							'id'          => 'taxonomies',
							'placeholder' => 'category,post_tag',
							'default'     => '',
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Hierarchical', 'insert-headers-and-footers' ),
							'description' => __( 'Hierarchical post types can have parents/children.', 'insert-headers-and-footers' ),
							'id'          => 'hierarchical',
							'default'     => 'false',
							'options'     => array(
								'true'  => __( 'Yes, like pages', 'insert-headers-and-footers' ),
								'false' => __( 'No, like posts', 'insert-headers-and-footers' ),
							),
						),
					),
				),
			),
			'labels'       => array(
				'label'   => __( 'Labels', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Menu Name', 'insert-headers-and-footers' ),
							'id'          => 'label_menu_name',
							'placeholder' => 'Post Types',
							'default'     => 'Post Types',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Admin Bar Name', 'insert-headers-and-footers' ),
							'id'          => 'label_admin_bar_name',
							'placeholder' => 'Post Type',
							'default'     => 'Post Type',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Archives', 'insert-headers-and-footers' ),
							'id'          => 'label_archives',
							'placeholder' => 'Item Archives',
							'default'     => 'Item Archives',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Attributes', 'insert-headers-and-footers' ),
							'id'          => 'label_attributes',
							'placeholder' => 'Item Attributes',
							'default'     => 'Item Attributes',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Parent Item', 'insert-headers-and-footers' ),
							'id'          => 'label_parent_item',
							'placeholder' => 'Parent Item:',
							'default'     => 'Parent Item:',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'All Items', 'insert-headers-and-footers' ),
							'id'          => 'label_all_items',
							'placeholder' => 'All Items',
							'default'     => 'All Items',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Add New Item', 'insert-headers-and-footers' ),
							'id'          => 'label_add_new_item',
							'placeholder' => 'Add New Item',
							'default'     => 'Add New Item',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Add New', 'insert-headers-and-footers' ),
							'id'          => 'label_add_new',
							'placeholder' => 'Add New',
							'default'     => 'Add New',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'New Item', 'insert-headers-and-footers' ),
							'id'          => 'label_new_item',
							'placeholder' => 'New Item',
							'default'     => 'New Item',
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Edit Item', 'insert-headers-and-footers' ),
							'id'          => 'label_edit_item',
							'placeholder' => 'Edit Item',
							'default'     => 'Edit Item',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Update Item', 'insert-headers-and-footers' ),
							'id'          => 'label_update_item',
							'placeholder' => 'Update Item',
							'default'     => 'Update Item',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'View Item', 'insert-headers-and-footers' ),
							'id'          => 'label_view_item',
							'placeholder' => 'View Item',
							'default'     => 'View Item',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'View Items', 'insert-headers-and-footers' ),
							'id'          => 'label_view_items',
							'placeholder' => 'View Items',
							'default'     => 'View Items',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Search Item', 'insert-headers-and-footers' ),
							'id'          => 'label_search_item',
							'placeholder' => 'Search Item',
							'default'     => 'Search Item',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Not Found', 'insert-headers-and-footers' ),
							'id'          => 'label_not_found',
							'placeholder' => 'Not Found',
							'default'     => 'Not Found',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Not Found in Trash', 'insert-headers-and-footers' ),
							'id'          => 'label_not_found_in_trash',
							'placeholder' => 'Not Found in Trash',
							'default'     => 'Not Found in Trash',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Featured Image', 'insert-headers-and-footers' ),
							'id'          => 'label_featured_image',
							'placeholder' => 'Featured Image',
							'default'     => 'Featured Image',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Set featured image', 'insert-headers-and-footers' ),
							'id'          => 'label_set_featured_image',
							'placeholder' => 'Set featured image',
							'default'     => 'Set featured image',
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Remove featured image', 'insert-headers-and-footers' ),
							'id'          => 'label_remove_featured_image',
							'placeholder' => 'Remove featured image',
							'default'     => 'Remove featured image',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Use as featured image', 'insert-headers-and-footers' ),
							'id'          => 'label_use_as_featured_image',
							'placeholder' => 'Use as featured image',
							'default'     => 'Use as featured image',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Insert into item', 'insert-headers-and-footers' ),
							'id'          => 'label_label_insert_into_item',
							'placeholder' => 'Insert into item',
							'default'     => 'Insert into item',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Uploaded to this item', 'insert-headers-and-footers' ),
							'id'          => 'label_uploaded_to_this_item',
							'placeholder' => 'Uploaded to this item',
							'default'     => 'Uploaded to this item',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Items list', 'insert-headers-and-footers' ),
							'id'          => 'label_items_list',
							'placeholder' => 'Items list',
							'default'     => 'Items list',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Items list navigation', 'insert-headers-and-footers' ),
							'id'          => 'label_items_list_navigation',
							'placeholder' => 'Items list navigation',
							'default'     => 'Items list navigation',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Filter items list', 'insert-headers-and-footers' ),
							'id'          => 'label_filter_items_list',
							'placeholder' => 'Filter items list',
							'default'     => 'Filter items list',
						),
					),
				),
			),
			'options'      => array(
				'label'   => __( 'Options', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'checkbox_list',
							'label'       => __( 'Supports', 'insert-headers-and-footers' ),
							'description' => __( 'Select which features this post type should support', 'insert-headers-and-footers' ),
							'id'          => 'supports',
							'default'     => array( 'title', 'editor' ),
							'options'     => array(
								'title'           => __( 'Title', 'insert-headers-and-footers' ),
								'editor'          => __( 'Content Editor', 'insert-headers-and-footers' ),
								'author'          => __( 'Author', 'insert-headers-and-footers' ),
								'thumbnail'       => __( 'Featured image', 'insert-headers-and-footers' ),
								'excerpt'         => __( 'Excerpt', 'insert-headers-and-footers' ),
								'trackbacks'      => __( 'Trackbacks', 'insert-headers-and-footers' ),
								'custom-fields'   => __( 'Custom Fields', 'insert-headers-and-footers' ),
								'comments'        => __( 'Comments', 'insert-headers-and-footers' ),
								'revisions'       => __( 'Revisions', 'insert-headers-and-footers' ),
								'page-attributes' => __( 'Page Attributes', 'insert-headers-and-footers' ),
								'post-formats'    => __( 'Post Formats', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Exclude From Search', 'insert-headers-and-footers' ),
							'description' => __( 'Exclude the posts of this post type from search results?', 'insert-headers-and-footers' ),
							'id'          => 'exclude_from_search',
							'default'     => 'false',
							'options'     => array(
								'true'  => __( 'Yes', 'insert-headers-and-footers' ),
								'false' => __( 'No - default', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Enable Export', 'insert-headers-and-footers' ),
							'description' => __( 'Allow exporting posts of this post type in Tools > Export.', 'insert-headers-and-footers' ),
							'id'          => 'can_export',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes - default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Enable Archives', 'insert-headers-and-footers' ),
							'description' => __( 'Enables archives for this post type, the post type key is used as default.', 'insert-headers-and-footers' ),
							'id'          => 'has_archive',
							'default'     => 'true',
							'options'     => array(
								'true'   => __( 'Yes - default', 'insert-headers-and-footers' ),
								'custom' => __( 'Yes - using custom slug', 'insert-headers-and-footers' ),
								'false'  => __( 'No', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Custom Archive Slug', 'insert-headers-and-footers' ),
							'description' => __( 'Custom archive slug (if selected above).', 'insert-headers-and-footers' ),
							'id'          => 'custom_archive_slug',
							'placeholder' => '',
							'default'     => '',
						),
					),
				),
			),
			'visibility'   => array(
				'label'   => __( 'Visibility', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Public', 'insert-headers-and-footers' ),
							// Translators: Placeholders add a link to the wp.org documentation page.
							'description' => sprintf( __( 'Should this post type be %1$svisible to authors%2$s?', 'insert-headers-and-footers' ), '<a href="https://developer.wordpress.org/reference/functions/register_post_type/#public" target="_blank">', '</a>' ),
							'id'          => 'public',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes - default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Show UI', 'insert-headers-and-footers' ),
							'description' => __( 'Should this post type be visible in the Admin?', 'insert-headers-and-footers' ),
							'id'          => 'show_ui',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes - default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Show in Menu?', 'insert-headers-and-footers' ),
							'description' => __( 'Should this post type be visible in the admin menu?', 'insert-headers-and-footers' ),
							'id'          => 'show_in_menu',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes - default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Menu position', 'insert-headers-and-footers' ),
							'description' => __( 'Choose the admin menu position.', 'insert-headers-and-footers' ),
							'id'          => 'menu_position',
							'default'     => '5',
							'options'     => array(
								'5'   => __( 'Below Posts (5)', 'insert-headers-and-footers' ),
								'10'  => __( 'Below Media (10)', 'insert-headers-and-footers' ),
								'20'  => __( 'Below Pages (20)', 'insert-headers-and-footers' ),
								'30'  => __( 'Below Comments (30)', 'insert-headers-and-footers' ),
								'60'  => __( 'Below First Separator (60)', 'insert-headers-and-footers' ),
								'65'  => __( 'Below Plugins (65)', 'insert-headers-and-footers' ),
								'70'  => __( 'Below Users (70)', 'insert-headers-and-footers' ),
								'75'  => __( 'Below Tools (75)', 'insert-headers-and-footers' ),
								'80'  => __( 'Below Settings (80)', 'insert-headers-and-footers' ),
								'100' => __( 'Below Second Separator (100)', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Menu Icon', 'insert-headers-and-footers' ),
							// Translators: Placeholder adds a link to the dashicons page.
							'description' => sprintf( __( 'Icon used next to the post type label in the admin menu. Use either a %1$sdashicon%2$s name or a full URL to an image file.', 'insert-headers-and-footers' ), '<a href="https://developer.wordpress.org/resource/dashicons/" target="_blank">', '</a>' ),
							'id'          => 'menu_icon',
							'placeholder' => '',
							'default'     => '',
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Show in Admin Bar?', 'insert-headers-and-footers' ),
							'description' => __( 'Should this post type be visible in the admin bar?', 'insert-headers-and-footers' ),
							'id'          => 'show_in_admin_bar',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes - default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Show in Navigation Menus?', 'insert-headers-and-footers' ),
							'description' => __( 'Should this post type be available for use in menus (Appearance > Menus)?', 'insert-headers-and-footers' ),
							'id'          => 'show_in_nav_menus',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes - default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
					),
				),
			),
			'query'        => array(
				'label'   => __( 'Query', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Publicly Queryable', 'insert-headers-and-footers' ),
							// Translators: Placeholders add link to wp.org docs.
							'description' => sprintf( __( 'Enable frontend requests using the query variable. %1$sSee Documentation.%2$s', 'insert-headers-and-footers' ), '<a href="https://developer.wordpress.org/reference/functions/register_post_type/#publicly_queryable" target="_blank">', '</a>' ),
							'id'          => 'publicly_queryable',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Query variable', 'insert-headers-and-footers' ),
							// Translators: Placeholders add link to wp.org docs.
							'description' => sprintf( __( 'Key used for querying posts in the frontend. %1$sSee Documentation.%2$s', 'insert-headers-and-footers' ), '<a href="https://developer.wordpress.org/reference/functions/register_post_type/#query_var" target="_blank">', '</a>' ),
							'id'          => 'query_var',
							'default'     => 'true',
							'options'     => array(
								'true'   => __( 'Default (post type key)', 'insert-headers-and-footers' ),
								'custom' => __( 'Custom variable', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Custom Query Variable', 'insert-headers-and-footers' ),
							// Translators: Placeholder adds a link to the dashicons page.
							'description' => sprintf( __( 'The custom query variable to use for this post type. %1$sSee documentation%2$s.', 'insert-headers-and-footers' ), '<a href="https://developer.wordpress.org/reference/functions/register_post_type/#query_var" target="_blank">', '</a>' ),
							'id'          => 'query_var',
							'placeholder' => '',
							'default'     => '',
						),
					),
				),
			),
			'permalinks'   => array(
				'label'   => __( 'Permalinks', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Rewrite Permalinks', 'insert-headers-and-footers' ),
							// Translators: Placeholders add link to wp.org docs.
							'description' => sprintf( __( 'Use the default permalink structure, disable permalinks for this post type or use custom options. %1$sSee Documentation.%2$s', 'insert-headers-and-footers' ), '<a href="https://developer.wordpress.org/reference/functions/register_post_type/#rewrite" target="_blank">', '</a>' ),
							'id'          => 'rewrite',
							'default'     => 'true',
							'options'     => array(
								'true'   => __( 'Default (post type key)', 'insert-headers-and-footers' ),
								'false'  => __( 'Disable permalink rewrites', 'insert-headers-and-footers' ),
								'custom' => __( 'Custom permalink structure', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'URL Slug', 'insert-headers-and-footers' ),
							'description' => __( 'The slug used for this post types base. (for example: artist in www.example.com/artist/ )', 'insert-headers-and-footers' ),
							'id'          => 'rewrite_slug',
							'placeholder' => '',
							'default'     => '',
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Use URL Slug?', 'insert-headers-and-footers' ),
							'description' => __( 'Use the post type name as URL slug base?', 'insert-headers-and-footers' ),
							'id'          => 'with_front',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes - default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Use pagination?', 'insert-headers-and-footers' ),
							'description' => __( 'Allow the post type to have pagination?', 'insert-headers-and-footers' ),
							'id'          => 'pages',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes - default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Use feeds?', 'insert-headers-and-footers' ),
							'description' => __( 'Allow the post type to have feeds?', 'insert-headers-and-footers' ),
							'id'          => 'feeds',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes - default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
					),
				),
			),
			'capabilities' => array(
				'label'   => __( 'Capabilities', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Capabilities', 'insert-headers-and-footers' ),
							// Translators: Placeholders add link to wp.org docs.
							'description' => sprintf( __( 'User capabilities in relation to this post type. %1$sSee Documentation.%2$s', 'insert-headers-and-footers' ), '<a href="https://developer.wordpress.org/reference/functions/register_post_type/#capability_type" target="_blank">', '</a>' ),
							'id'          => 'capabilities',
							'default'     => 'true',
							'options'     => array(
								'true'   => __( 'Base capabilities - default', 'insert-headers-and-footers' ),
								'custom' => __( 'Custom Capabilities', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Base Capablities Type', 'insert-headers-and-footers' ),
							'description' => __( 'Use base capabilities from a core post type.', 'insert-headers-and-footers' ),
							'id'          => 'capability_type',
							'default'     => 'post',
							'options'     => array(
								'post' => __( 'Posts', 'insert-headers-and-footers' ),
								'page' => __( 'Pages', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 2.
					array(
						array(
							'type'    => 'description',
							'label'   => __( 'Custom Capabilities', 'insert-headers-and-footers' ),
							'content' => __( 'Use the fields below to use custom capabilities for this post type.', 'insert-headers-and-footers' ),
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Read Post', 'insert-headers-and-footers' ),
							'id'          => 'read_post',
							'default'     => 'read_post',
							'placeholder' => 'read_post',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Read Private Posts', 'insert-headers-and-footers' ),
							'id'          => 'read_private_posts',
							'default'     => 'read_private_posts',
							'placeholder' => 'read_private_posts',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Publish Posts', 'insert-headers-and-footers' ),
							'id'          => 'publish_posts',
							'default'     => 'publish_posts',
							'placeholder' => 'publish_posts',
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Delete Posts', 'insert-headers-and-footers' ),
							'id'          => 'delete_post',
							'default'     => 'delete_post',
							'placeholder' => 'delete_post',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Edit Post', 'insert-headers-and-footers' ),
							'id'          => 'edit_post',
							'default'     => 'edit_post',
							'placeholder' => 'edit_post',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Edit Posts', 'insert-headers-and-footers' ),
							'id'          => 'edit_posts',
							'default'     => 'edit_posts',
							'placeholder' => 'edit_posts',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Edit Others Posts', 'insert-headers-and-footers' ),
							'id'          => 'edit_others_posts',
							'default'     => 'edit_others_posts',
							'placeholder' => 'edit_others_posts',
						),
					),
				),
			),
			'rest_api'     => array(
				'label'   => __( 'Rest API', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Show in Rest API?', 'insert-headers-and-footers' ),
							// Translators: Placeholders add link to wp.org docs.
							'description' => sprintf( __( 'Add the post type to the WordPress wp-json API. %1$sSee Documentation.%2$s', 'insert-headers-and-footers' ), '<a href="https://developer.wordpress.org/reference/functions/register_post_type/#show_in_rest" target="_blank">', '</a>' ),
							'id'          => 'show_in_rest',
							'default'     => 'false',
							'options'     => array(
								'true'  => __( 'Yes', 'insert-headers-and-footers' ),
								'false' => __( 'No - default', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Rest Base', 'insert-headers-and-footers' ),
							// Translators: Placeholders add link to wp.org docs.
							'description' => sprintf( __( 'The base slug that this post type will use in the REST API. %1$sSee Documentation.%2$s', 'insert-headers-and-footers' ), '<a href="https://developer.wordpress.org/reference/functions/register_post_type/#rest_base" target="_blank">', '</a>' ),
							'id'          => 'rest_base',
							'default'     => '',
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Rest Controller Class', 'insert-headers-and-footers' ),
							// Translators: Placeholders add link to wp.org docs.
							'description' => sprintf( __( 'The name of a custom Rest Controller class instead of WP_REST_Posts_Controller. %1$sSee Documentation.%2$s', 'insert-headers-and-footers' ), '<a href="https://developer.wordpress.org/reference/functions/register_post_type/#rest_controller_class" target="_blank">', '</a>' ),
							'id'          => 'rest_controller_class',
							'default'     => '',
						),
					),
				),
			),
		);
	}

	/**
	 * Get the snippet code with dynamic values applied.
	 *
	 * @return string
	 */
	public function get_snippet_code() {
		$has_archive = $this->get_value( 'has_archive' );
		if ( 'custom' === $has_archive ) {
			$has_archive = "'{$this->get_value( 'custom_archive_slug' )}'";
		}

		$rewrite         = $this->get_value( 'rewrite' );
		$rewrite_options = '';
		if ( 'true' === $rewrite ) {
			$rewrite = '';
		} elseif ( 'custom' === $rewrite ) {
			$rewrite         = "\t\t'rewrite'               => \$rewrite_options,\n";
			$rewrite_options = "
	\$rewrite_options = array(
		'slug'       => '{$this->get_value('rewrite_slug')}',
		'with_front' => {$this->get_value( 'with_front')},
		'pages'      => {$this->get_value( 'pages')},
		'feeds'      => {$this->get_value( 'feeds')},
 	); 
			";
		} else {
			$rewrite = "\t\t'rewrite'               => $rewrite,\n";
		}

		$custom_capabilities = '';
		$capabilities        = $this->get_value( 'capabilities' );

		if ( 'custom' === $capabilities ) {
			$custom_capabilities = "
	\$capabilities = array(
		'read_post'          => '{$this->get_value( 'read_post')}',
		'read_private_posts' => '{$this->get_value( 'read_private_posts')}',
		'publish_posts'      => '{$this->get_value( 'publish_posts')}',
		'delete_post'        => '{$this->get_value( 'delete_post')}',
		'edit_post'          => '{$this->get_value( 'edit_post')}',
		'edit_posts'         => '{$this->get_value( 'edit_posts')}',
		'edit_others_posts'  => '{$this->get_value( 'edit_others_posts')}',
	);
			";
			$capabilities        = "'capabilities'          => \$capabilities,\n";
		} else {
			$capabilities = "'capability_type'       => '{$this->get_value('capability_type')}',\n";
		}

		return '// Register Custom Post Type
function ' . $this->get_value('function_name') . '() {

    $labels = array(
        \'name\'                  => _x( \'' . $this->get_value('label_count') . '\', \'Post Type General Name\', \'' . $this->get_value('text_domain') . '\' ),
        \'singular_name\'         => _x( \'' . $this->get_value('label') . '\', \'Post Type Singular Name\', \'' . $this->get_value('text_domain') . '\' ),
        \'menu_name\'             => __( \'' . $this->get_value('label_menu_name') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'name_admin_bar\'        => __( \'' . $this->get_value('label_admin_bar_name') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'archives\'              => __( \'' . $this->get_value('label_archives') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'attributes\'            => __( \'' . $this->get_value('label_attributes') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'parent_item_colon\'     => __( \'' . $this->get_value('label_parent_item') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'all_items\'             => __( \'' . $this->get_value('label_all_items') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'add_new_item\'          => __( \'' . $this->get_value('label_add_new_item') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'add_new\'               => __( \'' . $this->get_value('label_add_new') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'new_item\'              => __( \'' . $this->get_value('label_new_item') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'edit_item\'             => __( \'' . $this->get_value('label_edit_item') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'update_item\'           => __( \'' . $this->get_value('label_update_item') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'view_item\'             => __( \'' . $this->get_value('label_view_item') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'view_items\'            => __( \'' . $this->get_value('label_view_items') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'search_items\'          => __( \'' . $this->get_value('label_search_item') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'not_found\'             => __( \'' . $this->get_value('label_not_found') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'not_found_in_trash\'    => __( \'' . $this->get_value('label_not_found_in_trash') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'featured_image\'        => __( \'' . $this->get_value('label_featured_image') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'set_featured_image\'    => __( \'' . $this->get_value('label_set_featured_image') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'remove_featured_image\' => __( \'' . $this->get_value('label_remove_featured_image') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'use_featured_image\'    => __( \'' . $this->get_value('label_use_as_featured_image') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'insert_into_item\'      => __( \'' . $this->get_value('label_label_insert_into_item') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'uploaded_to_this_item\' => __( \'' . $this->get_value('label_uploaded_to_this_item') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'items_list\'            => __( \'' . $this->get_value('label_items_list') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'items_list_navigation\' => __( \'' . $this->get_value('label_items_list_navigation') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'filter_items_list\'     => __( \'' . $this->get_value('label_filter_items_list') . '\', \'' . $this->get_value('text_domain') . '\' ),
    );
    ' . $custom_capabilities . '
    ' . $rewrite_options . '
    $args = array(
        \'label\'                 => __( \'' . $this->get_value('label') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'description\'           => __( \'' . $this->get_value('description') . '\', \'' . $this->get_value('text_domain') . '\' ),
        \'labels\'                => $labels,
        \'supports\'              => ' . $this->get_array_value('supports') . ',
        \'taxonomies\'            => ' . $this->get_value_comma_separated('taxonomies') . ',
        \'hierarchical\'          => ' . $this->get_value('hierarchical') . ',
        \'public\'                => ' . $this->get_value('public') . ',
        \'show_ui\'               => ' . $this->get_value('show_ui') . ',
        \'show_in_menu\'          => ' . $this->get_value('show_in_menu') . ',
        \'menu_position\'         => ' . $this->get_value('menu_position') . ',
        \'show_in_admin_bar\'     => ' . $this->get_value('show_in_admin_bar') . ',
        \'show_in_nav_menus\'     => ' . $this->get_value('show_in_nav_menus') . ',
        \'can_export\'            => ' . $this->get_value('can_export') . ',
        \'has_archive\'           => ' . $has_archive . ',
        \'exclude_from_search\'   => ' . $this->get_value('exclude_from_search') . ',
        \'publicly_queryable\'    => ' . $this->get_value('publicly_queryable') . ',
        ' . $capabilities . $rewrite . $this->get_optional_value('menu_icon', true) . $this->get_optional_value('show_in_rest') . $this->get_optional_value('rest_base', true) . $this->get_optional_value('rest_controller_class', true) . chr(9) . ');
    register_post_type( \'' . $this->get_value('post_type') . '\', $args );

}
add_action( \'init\', \'' . $this->get_value('function_name') . '\', 0 );';
	}

}
includes/generator/class-wpcode-generator-widget.php000064400000046230151331545640016716 0ustar00<?php
/**
 * Generate a snippet to add a custom Widget.
 *
 * @package WPCode
 */

/**
 * WPCode_Generator_Script class.
 */
class WPCode_Generator_Widget extends WPCode_Generator_Type {

	/**
	 * The generator slug.
	 *
	 * @var string
	 */
	public $name = 'widget';

	/**
	 * The categories for this generator.
	 *
	 * @var string[]
	 */
	public $categories = array(
		'design',
	);

	/**
	 * Set the translatable strings.
	 *
	 * @return void
	 */
	protected function set_strings() {
		$this->title       = __( 'Widget', 'insert-headers-and-footers' );
		$this->description = __( 'Generate a snippet to register a custom sidebar widget for your website.', 'insert-headers-and-footers' );
	}

	/**
	 * Load the generator tabs.
	 *
	 * @return void
	 */
	protected function load_tabs() {
		$this->tabs = array(
			'info'    => array(
				'label'   => __( 'Info', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						// Column 1 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Overview', 'insert-headers-and-footers' ),
							'content' => __( 'Using this generator you can easily add a custom sidebar widget with settings.', 'insert-headers-and-footers' ),
						),
					),
					// Column 2.
					array(
						// Column 2 fields.
						array(
							'type'    => 'list',
							'label'   => __( 'Usage', 'insert-headers-and-footers' ),
							'content' => array(
								__( 'Fill in the forms using the menu on the left.', 'insert-headers-and-footers' ),
								__( 'Click the "Update Code" button.', 'insert-headers-and-footers' ),
								__( 'Click on "Use Snippet" to create a new snippet with the generated code.', 'insert-headers-and-footers' ),
								__( 'Activate and save the snippet and you\'re ready to go', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						// Column 3 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Examples', 'insert-headers-and-footers' ),
							'content' => __( 'Sidebar widgets are very useful when you want to display the same content on multiple pages, you can create a widget with contact methods, for example and fields to set a phone number, email, etc.', 'insert-headers-and-footers' ),
						),
					),
				),
			),
			'general' => array(
				'label'   => __( 'General', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Class name', 'insert-headers-and-footers' ),
							'description' => __( 'Make this unique to avoid conflicts with other similar snippets.', 'insert-headers-and-footers' ),
							'id'          => 'class_name',
							'placeholder' => 'Custom_Generated_Widget',
							'default'     => 'Custom_Generated_Widget' . time(),
							// This makes it unique for people who don't want to customize.
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Prefix', 'insert-headers-and-footers' ),
							'description' => __( 'Used to prefix all the field names.', 'insert-headers-and-footers' ),
							'id'          => 'prefix',
							'placeholder' => 'custom_',
							'default'     => 'custom' . time() . '_',
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Text Domain', 'insert-headers-and-footers' ),
							'description' => __( 'Optional textdomain for translations.', 'insert-headers-and-footers' ),
							'id'          => 'text_domain',
							'placeholder' => 'text_domain',
							'default'     => 'text_domain',
						),
					),
				),
			),
			'widget'  => array(
				'label'   => __( 'Widget', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Widget ID', 'insert-headers-and-footers' ),
							'description' => __( 'Unique id for the widget, used in the code.', 'insert-headers-and-footers' ),
							'id'          => 'widget_id',
							'name'        => 'widget_id',
							'default'     => 'custom_widget_id',
							'placeholder' => '',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Widget Title', 'insert-headers-and-footers' ),
							'description' => __( 'The title of the widget (displayed in the admin).', 'insert-headers-and-footers' ),
							'id'          => 'widget_title',
							'name'        => 'widget_title',
							'default'     => 'Custom Widget',
							'placeholder' => '',
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Description', 'insert-headers-and-footers' ),
							'description' => __( 'Description used in the admin to explain what the widget is used for.', 'insert-headers-and-footers' ),
							'id'          => 'description',
							'name'        => 'description',
							'default'     => 'This is a custom widget generated with WPCode',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'CSS Class', 'insert-headers-and-footers' ),
							'description' => __( 'Widget-specific CSS class name.', 'insert-headers-and-footers' ),
							'id'          => 'css_class',
							'default'     => 'custom-generated-widget',
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'textarea',
							'label'       => __( 'Widget Output Code', 'insert-headers-and-footers' ),
							'description' => __( 'PHP Code used for outputting the fields in the frontend. If left empty it will output the fields values in a simple list.', 'insert-headers-and-footers' ),
							'id'          => 'code',
							'code'        => true,
						),
					),
				),
			),
			'fields'  => array(
				'label'   => __( 'Fields', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Field Type', 'insert-headers-and-footers' ),
							'description' => __( 'Pick the type of field you want to use for this setting.', 'insert-headers-and-footers' ),
							'id'          => 'field_type',
							'name'        => 'field_type[]',
							'options'     => array(
								'text'     => __( 'Text', 'insert-headers-and-footers' ),
								'email'    => __( 'Email', 'insert-headers-and-footers' ),
								'url'      => __( 'URL', 'insert-headers-and-footers' ),
								'number'   => __( 'Number', 'insert-headers-and-footers' ),
								'textarea' => __( 'Textarea', 'insert-headers-and-footers' ),
								'select'   => __( 'Select', 'insert-headers-and-footers' ),
								'checkbox' => __( 'Checkboxes', 'insert-headers-and-footers' ),
								'radio'    => __( 'Radio', 'insert-headers-and-footers' ),
							),
							'repeater'    => 'fields',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Field ID', 'insert-headers-and-footers' ),
							'description' => __( 'Unique id for this field, used in the code.', 'insert-headers-and-footers' ),
							'id'          => 'field_id',
							'name'        => 'field_id[]',
							'repeater'    => 'fields',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Field Label', 'insert-headers-and-footers' ),
							'description' => __( 'The label displayed next to this field in the admin form.', 'insert-headers-and-footers' ),
							'id'          => 'field_label',
							'name'        => 'field_label[]',
							'repeater'    => 'fields',
						),
						array(
							'type' => 'spacer',
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Description', 'insert-headers-and-footers' ),
							'description' => __( 'Display a short descriptive text below this field.', 'insert-headers-and-footers' ),
							'id'          => 'field_description',
							'name'        => 'field_description[]',
							'repeater'    => 'fields',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Default', 'insert-headers-and-footers' ),
							'description' => __( 'Set the default value for this field.', 'insert-headers-and-footers' ),
							'id'          => 'field_default',
							'name'        => 'field_default[]',
							'repeater'    => 'fields',
						),
						array(
							'type'        => 'textarea',
							'label'       => __( 'Options', 'insert-headers-and-footers' ),
							'description' => __( 'Use value|label for each line to add options for select, checkbox or radio.', 'insert-headers-and-footers' ),
							'id'          => 'field_options',
							'name'        => 'field_options[]',
							'repeater'    => 'fields',
						),
					),
					// Column 3.
					array(
						array(
							'type'    => 'description',
							'label'   => __( 'Add another field', 'insert-headers-and-footers' ),
							'content' => __( 'Use the "Add field" button below to add as many fields as you need.', 'insert-headers-and-footers' ),
						),
						array(
							'type'        => 'repeater_button',
							'button_text' => __( 'Add field', 'insert-headers-and-footers' ),
							'id'          => 'fields', // Repeater to repeat when clicked.
						),
					),
				),
			),
		);
	}

	/**
	 * Dynamically get the code for a widget field by type.
	 *
	 * @param string $type The type of field.
	 * @param string $id The field id.
	 * @param string $label The field label.
	 * @param string $description The field description.
	 * @param string $options The options for fields that have options.
	 *
	 * @return mixed|string
	 */
	public function get_widget_field_code( $type, $id, $label, $description, $options ) {
		if ( ! method_exists( $this, 'widget_field_' . $type ) ) {
			return '';
		}
		$options           = preg_split( "/\r\n|[\r\n]/", $options );
		$processed_options = array();
		foreach ( $options as $option ) {
			$split_option                          = explode( '|', $option );
			$processed_options[ $split_option[0] ] = $split_option[0];
			if ( isset( $split_option[1] ) ) {
				$processed_options[ $split_option[0] ] = $split_option[1];
			}
		}

		return call_user_func_array(
			array( $this, 'widget_field_' . $type ),
			array(
				$id,
				$label,
				$description,
				$processed_options,
			)
		);
	}

	/**
	 * Get the code for a text field.
	 *
	 * @param string $id The field id.
	 * @param string $label The field label.
	 * @param string $description The field description.
	 * @param array  $options The field options (unused here).
	 * @param string $type The input type, so we can reuse this for similar fields.
	 *
	 * @return string
	 */
	public function widget_field_text( $id, $label, $description, $options = array(), $type = 'text' ) {
		return "
		echo '<p>';
		echo '<label for=\"'. \$this->get_field_id( '$id' ) .'\">'. __( '$label', '{$this->get_value( 'text_domain' ) }' ) .'</label>';
		echo '<input type=\"$type\" id=\"'. \$this->get_field_id( '$id' ) .'\" name=\"'. \$this->get_field_name( '$id' ) .'\" class=\"widefat\" value=\"'. esc_attr(\$instance['$id']) .'\" />';
		{$this->widget_field_description( $description )}
		echo '</p>';
		";
	}

	/**
	 * Email field, uses the text field with a different input type.
	 *
	 * @param string $id The field id.
	 * @param string $label The field label.
	 * @param string $description The field description.
	 * @param array  $options The field options (unused here).
	 *
	 * @return string
	 */
	public function widget_field_email( $id, $label, $description, $options = array() ) {
		return $this->widget_field_text( $id, $label, $description, $options, 'email' );
	}

	/**
	 * URL field, uses the text field with a different input type.
	 *
	 * @param string $id The field id.
	 * @param string $label The field label.
	 * @param string $description The field description.
	 * @param array  $options The field options (unused here).
	 *
	 * @return string
	 */
	public function widget_field_url( $id, $label, $description, $options = array() ) {
		return $this->widget_field_text( $id, $label, $description, $options, 'url' );
	}

	/**
	 * Number field, uses the text field with a different input type.
	 *
	 * @param string $id The field id.
	 * @param string $label The field label.
	 * @param string $description The field description.
	 * @param array  $options The field options (unused here).
	 *
	 * @return string
	 */
	public function widget_field_number( $id, $label, $description, $options = array() ) {
		return $this->widget_field_text( $id, $label, $description, $options, 'number' );
	}

	/**
	 * Textarea field.
	 *
	 * @param string $id The field id.
	 * @param string $label The field label.
	 * @param string $description The field description.
	 * @param array  $options The field options (unused here).
	 *
	 * @return string
	 */
	public function widget_field_textarea( $id, $label, $description, $options = array() ) {
		return "
		echo '<p>';
		echo '<label for=\"'. \$this->get_field_id( '$id' ) .'\">'. __( '$label', '{$this->get_value( 'text_domain' ) }' ) .'</label>';
		echo '<textarea id=\"'. \$this->get_field_id( '$id' ) .'\" name=\"'. \$this->get_field_name( '$id' ) .'\" class=\"widefat\">'. esc_html(\$instance['$id']) .'</textarea>';
		{$this->widget_field_description( $description )}
		echo '</p>';
		";
	}

	/**
	 * Get the code for a text field.
	 *
	 * @param string $id The field id.
	 * @param string $label The field label.
	 * @param string $description The field description.
	 * @param string $options The field options.
	 *
	 * @return string
	 */
	public function widget_field_select( $id, $label, $description, $options = array() ) {
		$field_code = "
		echo '<p>';
		echo '<label for=\"'. \$this->get_field_id( '$id' ) .'\">'. __( '$label', '{$this->get_value( 'text_domain' ) }' ) .'</label>';
		echo '<select id=\"'. \$this->get_field_id( '$id' ) .'\" name=\"'. \$this->get_field_name( '$id' ) .'\" class=\"widefat\">';";

		foreach ( $options as $value => $label ) {
			if ( empty( $value ) ) {
				continue;
			}
			$field_code .= "\n\t\t echo'<option value=\"$value\" '. selected('$value', \$instance['$id'], false) .'>$label</option>';";
		}
		$field_code .= "\n\t\techo '</select>';
		{$this->widget_field_description( $description )}
		echo '</p>';";

		return $field_code;
	}

	/**
	 * Get the code for a checkbox field.
	 *
	 * @param string $id The field id.
	 * @param string $label The field label.
	 * @param string $description The field description.
	 * @param string $options The field options.
	 *
	 * @return string
	 */
	public function widget_field_checkbox( $id, $label, $description, $options = array() ) {
		$field_code = "
		echo '<p>';
		echo '<label for=\"'. \$this->get_field_id( '$id' ) .'\">'. __( '$label', '{$this->get_value( 'text_domain' ) }' ) .'</label>';";
		foreach ( $options as $value => $label ) {
			if ( empty( $value ) ) {
				continue;
			}
			$field_code .= "\n\t\t echo'<div><label><input type=\"checkbox\" value=\"$value\" '. checked( in_array( '$value', \$instance['$id'], true ), true, false) .' name=\"'. \$this->get_field_name( '$id' ) .'[]\"> $label</label></div>';";
		}
		$field_code .= "{$this->widget_field_description( $description )}
		echo '</p>';";

		return $field_code;
	}

	/**
	 * Get the code for a radio field.
	 *
	 * @param string $id The field id.
	 * @param string $label The field label.
	 * @param string $description The field description.
	 * @param string $options The field options.
	 *
	 * @return string
	 */
	public function widget_field_radio( $id, $label, $description, $options = array() ) {
		$field_code = "
		echo '<p>';
		echo '<label for=\"'. \$this->get_field_id( '$id' ) .'\">'. __( '$label', '{$this->get_value( 'text_domain' ) }' ) .'</label>';";
		foreach ( $options as $value => $label ) {
			if ( empty( $value ) ) {
				continue;
			}
			$field_code .= "\n\t\t echo'<div><label><input type=\"radio\" value=\"$value\" '. checked( '$value', \$instance['$id'], false) .' name=\"'. \$this->get_field_name( '$id' ) .'\"> $label</label></div>';";
		}
		$field_code .= "\n{$this->widget_field_description( $description )}
		echo '</p>';";

		return $field_code;
	}

	/**
	 * Get standard markup for the description of a field.
	 *
	 * @param string $description The field description.
	 *
	 * @return string
	 */
	public function widget_field_description( $description ) {
		if ( empty( $description ) ) {
			return '';
		}

		return "echo '<span class=\"description\">' . __( '$description', '{$this->get_value( 'text_domain' ) }' ) . '</span>';";
	}

	/**
	 * Get the snippet code with dynamic values applied.
	 *
	 * @return string
	 */
	public function get_snippet_code() {

		$instance_defaults = '';
		$fields_markup     = '';

		$fields       = $this->get_value( 'field_id' );
		$labels       = $this->get_value( 'field_label' );
		$values       = $this->get_value( 'field_default' );
		$type         = $this->get_value( 'field_type' );
		$options      = $this->get_value( 'field_options' );
		$descriptions = $this->get_value( 'field_description' );

		if ( ! empty( $fields ) && is_array( $fields ) ) {
			foreach ( $fields as $key => $field_id ) {
				if ( empty( $field_id ) ) {
					continue;
				}
				$value = "'$values[$key]'";
				if ( 'checkbox' === $type[ $key ] ) {
					$value = "array('$values[$key]')";
				}
				$instance_defaults .= "\t\t\t'$field_id' => $value,\n";

				$fields_markup .= $this->get_widget_field_code( $type[ $key ], $field_id, $labels[ $key ], $descriptions[ $key ], $options[ $key ] );
			}
		}

		$widget_output = $this->get_value( 'code' );
		if ( empty( $widget_output ) && ! empty( $fields ) && is_array( $fields ) ) {
			// If there's no custom PHP code for the output build a simple list output.
			$widget_output = "\n\t\techo '<ul>';\n";
			foreach ( $fields as $key => $field_id ) {
				if ( empty( $field_id ) ) {
					continue;
				}
				$value = "\$instance['$field_id']";
				if ( 'checkbox' === $type[ $key ] ) {
					$value = "implode( ', ', $value )";
				}
				$widget_output .= "\t\t\techo '<li>{$labels[ $key ]}: ' . $value . '</li>';\n";

			}

			$widget_output .= "\t\techo '</ul>';\n";
		}

		return 'class ' . $this->get_value( 'class_name' ) . ' extends WP_Widget {

    public function __construct() {
        parent::__construct(
            \'' . $this->get_value( 'widget_id' ) . '\',
            __( \'' . $this->get_value( 'widget_title' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
            array(
                \'description\' => __( \'' . $this->get_value( 'description' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
                \'classname\' => \'' . $this->get_value( 'css_class' ) . '\',
            )
        );
    }
    
    public function widget( $args, $instance ) {
            $instance = wp_parse_args( (array) $instance, array(
' . $instance_defaults . '		) );
        // Before widget tag
        echo $args[\'before_widget\'];
' . $widget_output . '
        // After widget tag
        echo $args[\'after_widget\'];
    }
    
    public function form( $instance ) {
            // Set default values
        $instance = wp_parse_args( (array) $instance, array(
' . $instance_defaults . '		) );
        
        ' . $fields_markup . '
    }
}


function ' . $this->get_value( 'prefix' ) . 'register_widgets() {
    register_widget( \'' . $this->get_value( 'class_name' ) . '\' );
}
add_action( \'widgets_init\', \'' . $this->get_value( 'prefix' ) . 'register_widgets\' );
';
	}

}
includes/generator/class-wpcode-generator-style.php000064400000025522151331545640016574 0ustar00<?php
/**
 * Generate a snippet to enqueue styles.
 *
 * @package WPCode
 */

/**
 * WPCode_Generator_Style class.
 */
class WPCode_Generator_Style extends WPCode_Generator_Type {

	/**
	 * The generator slug.
	 *
	 * @var string
	 */
	public $name = 'enqueue_style';

	/**
	 * The categories for this generator.
	 *
	 * @var string[]
	 */
	public $categories = array(
		'core',
	);

	/**
	 * Set the translatable strings.
	 *
	 * @return void
	 */
	protected function set_strings() {
		$this->title       = __( 'Register Stylesheets', 'insert-headers-and-footers' );
		$this->description = __( 'Generate a snippet to load CSS stylesheets using wp_register_style.', 'insert-headers-and-footers' );
	}

	/**
	 * Load the generator tabs.
	 *
	 * @return void
	 */
	protected function load_tabs() {
		$this->tabs = array(
			'info'    => array(
				'label'   => __( 'Info', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						// Column 1 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Overview', 'insert-headers-and-footers' ),
							'content' => __( 'Using this generator you can create a WordPress function to register and enqueue styles.', 'insert-headers-and-footers' ),
						),
					),
					// Column 2.
					array(
						// Column 2 fields.
						array(
							'type'    => 'list',
							'label'   => __( 'Usage', 'insert-headers-and-footers' ),
							'content' => array(
								__( 'Fill in the forms using the menu on the left.', 'insert-headers-and-footers' ),
								__( 'Click the "Update Code" button.', 'insert-headers-and-footers' ),
								__( 'Click on "Use Snippet" to create a new snippet with the generated code.', 'insert-headers-and-footers' ),
								__( 'Activate and save the snippet and you\'re ready to go', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						// Column 3 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Examples', 'insert-headers-and-footers' ),
							'content' => sprintf(
							// Translators: the placeholders add a link to getboostrap.com.
								__( 'You can use this to load external styles or even styles from a theme or plugin. For example, you could load %1$sfontawesome%2$s from a cdn.', 'insert-headers-and-footers' ),
								'<a href="https://fontawesome.com/" target="_blank">',
								'</a>'
							),
						),
					),
				),
			),
			'general' => array(
				'label'   => __( 'General', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Function name', 'insert-headers-and-footers' ),
							'description' => __( 'Make this unique to avoid conflicts with other snippets', 'insert-headers-and-footers' ),
							'id'          => 'function_name',
							'placeholder' => 'add_custom_style',
							'default'     => 'add_custom_style' . time(),
							// This makes it unique for people who don't want to customize.
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Action (hook)', 'insert-headers-and-footers' ),
							'description' => sprintf(
							// Translators: placeholders add links to documentation on wordpress.org.
								__( 'Hook used to add the styles: %1$sfrontend%2$s, %3$sadmin%4$s, %5$slogin%6$s or %7$sembed%8$s.', 'insert-headers-and-footers' ),
								'<a href="https://developer.wordpress.org/reference/hooks/wp_enqueue_scripts/" target="_blank">',
								'</a>',
								'<a href="https://developer.wordpress.org/reference/hooks/admin_enqueue_scripts/" target="_blank">',
								'</a>',
								'<a href="https://developer.wordpress.org/reference/hooks/login_enqueue_scripts/" target="_blank">',
								'</a>',
								'<a href="https://developer.wordpress.org/reference/hooks/enqueue_embed_scripts/" target="_blank">',
								'</a>'
							),
							'id'          => 'hook',
							'default'     => 'wp_enqueue_scripts',
							'options'     => array(
								// Translators: placeholder adds the hook name.
								'wp_enqueue_scripts'    => sprintf( __( 'Frontend (%s)', 'insert-headers-and-footers' ), 'wp_enqueue_scripts' ),
								// Translators: placeholder adds the hook name.
								'admin_enqueue_scripts' => sprintf( __( 'Admin (%s)', 'insert-headers-and-footers' ), 'admin_enqueue_scripts' ),
								// Translators: placeholder adds the hook name.
								'login_enqueue_scripts' => sprintf( __( 'Login (%s)', 'insert-headers-and-footers' ), 'login_enqueue_scripts' ),
								// Translators: placeholder adds the hook name.
								'enqueue_embed_scripts' => sprintf( __( 'Embed (%s)', 'insert-headers-and-footers' ), 'enqueue_embed_scripts' ),
							),
						),
					),
				),
			),
			'styles'  => array(
				'label'   => __( 'Styles', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Style name', 'insert-headers-and-footers' ),
							'description' => __( 'This will be used as an identifier in the code, should be lowercase with no spaces.', 'insert-headers-and-footers' ),
							'id'          => 'style_name',
							'name'        => 'style_name[]',
							'default'     => '',
							'placeholder' => '',
							'repeater'    => 'style',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Stylesheet URL', 'insert-headers-and-footers' ),
							'description' => __( 'The full URL for the stylesheet e.g. https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css.', 'insert-headers-and-footers' ),
							'id'          => 'style_url',
							'name'        => 'style_url[]',
							'default'     => '',
							'placeholder' => '',
							'repeater'    => 'style',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Dependencies', 'insert-headers-and-footers' ),
							'description' => __( 'Comma-separated list of styles required for this style to load, e.g. jquery', 'insert-headers-and-footers' ),
							'id'          => 'style_dependencies',
							'name'        => 'style_dependencies[]',
							'default'     => '',
							'placeholder' => '',
							'repeater'    => 'style',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Style Version', 'insert-headers-and-footers' ),
							'description' => __( 'The style version.', 'insert-headers-and-footers' ),
							'id'          => 'style_version',
							'name'        => 'style_version[]',
							'default'     => '1.0.0',
							'placeholder' => '',
							'repeater'    => 'style',
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Media', 'insert-headers-and-footers' ),
							'description' => sprintf(
							// Translators: placeholders add a link to the W3.org reference.
								__( 'Load the style %1$smedia type%2$s, usually "all".', 'insert-headers-and-footers' ),
								'<a href="https://www.w3.org/TR/CSS2/media.html#media-types" target="_blank">',
								'</a>'
							),
							'id'          => 'style_media',
							'name'        => 'style_media[]',
							'default'     => 'all',
							'repeater'    => 'style',
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Deregister style?', 'insert-headers-and-footers' ),
							'description' => sprintf(
							// Translators: Placeholders for wp.org docs link.
								__( 'Should the style be %1$sderegistered%2$s first? (for example, if you are replacing an existing style).', 'insert-headers-and-footers' ),
								'<a href="https://developer.wordpress.org/reference/functions/wp_deregister_style/" target="_blank">',
								'</a>'
							),
							'id'          => 'style_deregister',
							'name'        => 'style_deregister[]',
							'default'     => 'false',
							'options'     => array(
								'false' => __( 'No', 'insert-headers-and-footers' ),
								'true'  => __( 'Yes', 'insert-headers-and-footers' ),
							),
							'repeater'    => 'style',
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Enqueue style?', 'insert-headers-and-footers' ),
							'description' => sprintf(
							// Translators: Placeholders for wp.org docs link.
								__( 'Should the style be %1$senqueued%2$s or just registered? (select "No" only if you intend enqueueing it later.', 'insert-headers-and-footers' ),
								'<a href="https://developer.wordpress.org/reference/functions/wp_enqueue_style/" target="_blank">',
								'</a>'
							),
							'id'          => 'style_enqueue',
							'name'        => 'style_enqueue[]',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
							'repeater'    => 'style',
						),
						array(
							'type' => 'spacer',
						),
					),
					// Column 3.
					array(
						array(
							'type'    => 'description',
							'label'   => __( 'Add more styles', 'insert-headers-and-footers' ),
							'content' => __( 'Use the "Add style" button below to add multiple styles in this snippet.', 'insert-headers-and-footers' ),
						),
						array(
							'type'        => 'repeater_button',
							'button_text' => __( 'Add style', 'insert-headers-and-footers' ),
							'id'          => 'style', // Repeater to repeat when clicked.
						),
					),
				),
			),
		);
	}

	/**
	 * Get the snippet code with dynamic values applied.
	 *
	 * @return string
	 */
	public function get_snippet_code() {

		$styles            = $this->get_value( 'style_name' );
		$styles_urls       = $this->get_value( 'style_url' );
		$styles_deps       = $this->get_value( 'style_dependencies' );
		$styles_versions   = $this->get_value( 'style_version' );
		$styles_media      = $this->get_value( 'style_media' );
		$styles_deregister = $this->get_value( 'style_deregister' );
		$styles_enqueue    = $this->get_value( 'style_enqueue' );
		$code              = '';

		if ( ! empty( $styles ) ) {
			foreach ( $styles as $key => $style ) {
				if ( empty( $style ) ) {
					continue;
				}
				$style        = sanitize_title( $style );
				$dependencies = explode( ',', $styles_deps[ $key ] );
				$deregister   = 'true' === $styles_deregister[ $key ] ? "wp_deregister_style( '$style' );" : '';
				$enqueue      = 'true' === $styles_enqueue[ $key ] ? "wp_enqueue_style( '$style' );" : '';
				$media        = 'all' !== $styles_media[ $key ] ? ", '$styles_media[$key]'" : '';

				$code .= "
			$deregister
			wp_register_style( '$style', '$styles_urls[$key]', {$this->array_to_code_string($dependencies)}, '$styles_versions[$key]'$media );
			$enqueue
			";
			}
		}

		return '// Add custom styles
function ' . $this->get_value( 'function_name' ) . '() {
' . $code . '
}
add_action( \'' . $this->get_value( 'hook' ) . '\', \'' . $this->get_value( 'function_name' ) . '\' );';
	}

}
includes/generator/class-wpcode-generator-hooks.php000064400000113074151331545640016557 0ustar00<?php
/**
 * Generate a snippet for a hook.
 *
 * @package WPCode
 */

/**
 * WPCode_Generator_Hooks class.
 */
class WPCode_Generator_Hooks extends WPCode_Generator_Type {

	/**
	 * The generator slug.
	 *
	 * @var string
	 */
	public $name = 'hooks';

	/**
	 * The categories for this generator.
	 *
	 * @var string[]
	 */
	public $categories = array(
		'core',
	);

	/**
	 * Set the translatable strings.
	 *
	 * @return void
	 */
	protected function set_strings() {
		$this->title       = __( 'Hooks', 'insert-headers-and-footers' );
		$this->description = __( 'Generate a snippet for an action or a filter using any available hook.', 'insert-headers-and-footers' );
	}

	/**
	 * Return a list of hooks for suggestions in the hook autocomplete.
	 *
	 * @return array
	 */
	protected function get_all_hooks_options() {
		return array(
			'link_category',
			'link_title',
			'signup_another_blog_init',
			'signup_create_blog_meta',
			'add_signup_meta',
			'signup_user_init',
			'signup_blog_init',
			'signup_get_available_languages',
			'wpmu_active_signup',
			'wp_http_cookie_value',
			'customize_panel_active',
			'register_post_type_args',
			'http_origin',
			'allowed_http_origins',
			'allowed_http_origin',
			'wp_mail',
			'wp_mail_from',
			'wp_mail_from_name',
			'wp_mail_content_type',
			'wp_mail_charset',
			'authenticate',
			'auth_cookie',
			'auth_cookie_expiration',
			'secure_auth_cookie',
			'secure_logged_in_cookie',
			'secure_auth_redirect',
			'auth_redirect_scheme',
			'wp_redirect',
			'wp_redirect_status',
			'wp_safe_redirect_fallback',
			'allowed_redirect_hosts',
			'comment_notification_recipients',
			'comment_notification_notify_author',
			'comment_notification_text',
			'comment_notification_subject',
			'comment_notification_headers',
			'notify_moderator',
			'comment_moderation_recipients',
			'comment_moderation_text',
			'comment_moderation_subject',
			'comment_moderation_headers',
			'wp_password_change_notification_email',
			'wp_new_user_notification_email_admin',
			'wp_new_user_notification_email',
			'nonce_life',
			'nonce_user_logged_out',
			'nonce_user_logged_out',
			'salt',
			'salt',
			'check_password',
			'check_password',
			'random_password',
			'pre_get_avatar',
			'style_loader_tag',
			'print_styles_array',
			'style_loader_src',
			'graceful_fail',
			'wp_is_mobile',
			'wp_kses_allowed_html',
			'pre_kses',
			'wp_editor_settings',
			'the_editor_content',
			'quicktags_settings',
			'teeny_mce_plugins',
			'mce_external_plugins',
			'tiny_mce_plugins',
			'mce_external_languages',
			'mce_css',
			'teeny_mce_buttons',
			'mce_buttons',
			'mce_buttons_2',
			'mce_buttons_3',
			'mce_buttons_4',
			'teeny_mce_before_init',
			'tiny_mce_before_init',
			'wp_mce_translation',
			'wp_link_query_args',
			'wp_link_query',
			'use_curl_transport',
			'old_slug_redirect_post_id',
			'old_slug_redirect_url',
			'pre_do_shortcode_tag',
			'do_shortcode_tag',
			'strip_shortcodes_tagnames',
			'wp_http_ixr_client_headers',
			'session_token_manager',
			'attach_session_information',
			'session_token_manager',
			'get_attached_file',
			'update_attached_file',
			'_wp_relative_upload_path',
			'get_post_status',
			'wp_count_attachments',
			'post_mime_types',
			'pre_delete_post',
			'pre_trash_post',
			'pre_untrash_post',
			'wp_insert_post_parent',
			'wp_insert_attachment_data',
			'wp_insert_post_data',
			'wp_unique_post_slug',
			'add_ping',
			'get_enclosed',
			'get_pung',
			'get_to_ping',
			'get_page_uri',
			'wp_get_attachment_metadata',
			'wp_get_attachment_url',
			'wp_get_attachment_caption',
			'wp_get_attachment_thumb_file',
			'wp_get_attachment_thumb_url',
			'icon_dir',
			'icon_dir_uri',
			'icon_dirs',
			'wp_mime_type_icon',
			'get_lastpostdate',
			'pre_get_lastpostmodified',
			'get_lastpostmodified',
			'post_rewrite_rules',
			'date_rewrite_rules',
			'root_rewrite_rules',
			'comments_rewrite_rules',
			'search_rewrite_rules',
			'author_rewrite_rules',
			'page_rewrite_rules',
			'tag_rewrite_rules',
			'rewrite_rules_array',
			'mod_rewrite_rules',
			'rewrite_rules',
			'iis7_url_rewrite_rules',
			'customize_section_active',
			'oembed_providers',
			'pre_oembed_result',
			'oembed_result',
			'oembed_remote_get_args',
			'oembed_fetch_url',
			'oembed_dataparse',
			'rest_url_prefix',
			'rest_url',
			'wp_rest_server_class',
			'rest_avatar_sizes',
			'protected_title_format',
			'private_title_format',
			'the_title',
			'the_guid',
			'get_the_guid',
			'the_content',
			'the_content_more_link',
			'the_excerpt',
			'get_the_excerpt',
			'post_class',
			'body_class',
			'post_password_required',
			'wp_link_pages_args',
			'wp_link_pages_link',
			'wp_link_pages',
			'the_meta_key',
			'wp_dropdown_pages',
			'wp_list_pages_excludes',
			'wp_list_pages',
			'wp_page_menu_args',
			'wp_page_menu',
			'wp_get_attachment_link',
			'prepend_attachment',
			'the_password_form',
			'wp_post_revision_title_expanded',
			'customize_loaded_components',
			'customize_changeset_branching',
			'customize_save_response',
			'customize_changeset_save_data',
			'customize_dynamic_setting_args',
			'customize_dynamic_setting_class',
			'customize_allowed_urls',
			'customize_refresh_nonces',
			'customize_previewable_devices',
			'customize_load_themes',
			'user_has_cap',
			'get_date_sql',
			'core_version_check_locale',
			'core_version_check_query_args',
			'plugins_update_check_locales',
			'themes_update_check_locales',
			'wp_get_update_data',
			'link_category',
			'wp_list_bookmarks',
			'script_loader_src',
			'script_loader_tag',
			'print_scripts_array',
			'wp_admin_bar_class',
			'show_admin_bar',
			'can_add_user_to_blog',
			'is_email_address_unsafe',
			'wpmu_validate_user_signup',
			'minimum_site_name_length',
			'newblogname',
			'wpmu_validate_blog_signup',
			'signup_site_meta',
			'signup_user_meta',
			'newblog_notify_siteadmin',
			'newuser_notify_siteadmin',
			'domain_exists',
			'update_welcome_email',
			'update_welcome_subject',
			'update_welcome_user_email',
			'update_welcome_user_subject',
			'pre_get_space_used',
			'get_space_allowed',
			'wp_is_large_network',
			'subdirectory_reserved_names',
			'new_network_admin_email_content',
			'send_network_admin_email_change_email',
			'network_admin_email_change_email',
			'hook',
			'example_filter',
			'wpdocs_filter',
			'oembed_default_width',
			'oembed_request_post_id',
			'rest_oembed_ttl',
			'wp_feed_cache_transient_lifetime',
			'get_bloginfo_rss',
			'bloginfo_rss',
			'default_feed',
			'get_wp_title_rss',
			'wp_title_rss',
			'the_title_rss',
			'the_content_feed',
			'the_excerpt_rss',
			'the_permalink_rss',
			'comments_link_feed',
			'comment_link',
			'comment_author_rss',
			'comment_text_rss',
			'the_category_rss',
			'rss_enclosure',
			'atom_enclosure',
			'self_link',
			'feed_content_type',
			'wp_doing_ajax',
			'wp_doing_cron',
			'file_mod_allowed',
			'the_sites',
			'site_search_columns',
			'sites_clauses',
			'found_sites_query',
			'the_permalink',
			'user_trailingslashit',
			'pre_post_link',
			'post_link_category',
			'post_link',
			'post_type_link',
			'page_link',
			'_get_page_link',
			'attachment_link',
			'year_link',
			'month_link',
			'day_link',
			'the_feed_link',
			'feed_link',
			'post_comments_feed_link',
			'post_comments_feed_link_html',
			'author_feed_link',
			'category_feed_link',
			'tag_feed_link',
			'taxonomy_feed_link',
			'get_edit_tag_link',
			'edit_tag_link',
			'get_edit_term_link',
			'edit_term_link',
			'search_link',
			'search_feed_link',
			'post_type_archive_feed_link',
			'preview_post_link',
			'get_edit_post_link',
			'edit_post_link',
			'get_delete_post_link',
			'get_edit_comment_link',
			'edit_comment_link',
			'get_edit_bookmark_link',
			'edit_bookmark_link',
			'get_edit_user_link',
			'get_pagenum_link',
			'next_posts_link_attributes',
			'previous_posts_link_attributes',
			'navigation_markup_template',
			'get_comments_pagenum_link',
			'next_comments_link_attributes',
			'previous_comments_link_attributes',
			'home_url',
			'site_url',
			'admin_url',
			'includes_url',
			'content_url',
			'plugins_url',
			'network_site_url',
			'network_home_url',
			'network_admin_url',
			'user_admin_url',
			'self_admin_url',
			'set_url_scheme',
			'user_dashboard_url',
			'edit_profile_url',
			'get_canonical_url',
			'pre_get_shortlink',
			'get_shortlink',
			'the_shortlink',
			'pre_get_avatar_data',
			'get_avatar_comment_types',
			'get_avatar_url',
			'theme_file_uri',
			'parent_theme_file_uri',
			'theme_file_path',
			'parent_theme_file_path',
			'privacy_policy_url',
			'the_privacy_policy_link',
			'date_i18n',
			'number_format_i18n',
			'enclosure_links',
			'removable_query_args',
			'status_header',
			'nocache_headers',
			'robots_txt',
			'upload_dir',
			'wp_unique_filename',
			'wp_upload_bits',
			'wp_check_filetype_and_ext',
			'upload_mimes',
			'wp_die_ajax_handler',
			'wp_die_xmlrpc_handler',
			'wp_die_handler',
			'smilies',
			'iis7_supports_permalinks',
			'get_main_network_id',
			'global_terms_enabled',
			'kses_allowed_protocols',
			'wp_checkdate',
			'wp_auth_check_same_domain',
			'wp_delete_file',
			'admin_memory_limit',
			'image_memory_limit',
			'send_site_admin_email_change_email',
			'site_admin_email_change_email',
			'wp_privacy_anonymize_data',
			'wp_privacy_exports_dir',
			'wp_privacy_exports_url',
			'wp_privacy_export_expiration',
			'the_title',
			'the_title',
			'link_category',
			'the_content_rss',
			'icon_dir',
			'attachment_icon',
			'attachment_innerHTML',
			'the_title',
			'index_rel_link',
			'the_title',
			'parent_post_rel_link',
			'richedit_pre',
			'htmledit_pre',
			'shortcut_link',
			'rest_authentication_errors',
			'rest_send_nocache_headers',
			'rest_jsonp_enabled',
			'rest_post_dispatch',
			'rest_pre_serve_request',
			'rest_pre_echo_response',
			'rest_envelope_response',
			'rest_endpoints',
			'rest_pre_dispatch',
			'rest_request_before_callbacks',
			'rest_dispatch_request',
			'rest_request_after_callbacks',
			'rest_index',
			'rest_namespace_index',
			'rest_endpoints_description',
			'rest_route_data',
			'rest_request_parameter_order',
			'rest_request_from_url',
			'rest_comment_query',
			'rest_allow_anonymous_comments',
			'rest_pre_insert_comment',
			'rest_comment_trashable',
			'rest_prepare_comment',
			'rest_preprocess_comment',
			'rest_comment_collection_params',
			'rest_prepare_attachment',
			'rest_prepare_revision',
			'rest_user_query',
			'rest_prepare_user',
			'rest_pre_insert_user',
			'rest_user_collection_params',
			'rest_pre_get_setting',
			'rest_pre_update_setting',
			'rest_prepare_status',
			'rest_prepare_taxonomy',
			'rest_prepare_post_type',
			'rest_response_link_curies',
			'secure_signon_cookie',
			'wp_authenticate_user',
			'wp_authenticate_user',
			'check_is_user_spammed',
			'get_usernumposts',
			'pre_get_blogs_of_user',
			'get_blogs_of_user',
			'wp_dropdown_users_args',
			'wp_dropdown_users',
			'username_exists',
			'validate_username',
			'pre_user_login',
			'illegal_user_logins',
			'pre_user_nicename',
			'pre_user_url',
			'pre_user_email',
			'pre_user_nickname',
			'pre_user_first_name',
			'pre_user_last_name',
			'pre_user_display_name',
			'pre_user_description',
			'wp_pre_insert_user_data',
			'insert_user_meta',
			'send_password_change_email',
			'send_email_change_email',
			'password_change_email',
			'email_change_email',
			'user_contactmethods',
			'password_hint',
			'allow_password_reset',
			'password_reset_expiration',
			'password_reset_key_expired',
			'user_registration_email',
			'registration_errors',
			'determine_current_user',
			'new_user_email_content',
			'user_request_confirmed_email_to',
			'user_confirmed_action_email_content',
			'user_request_confirmed_email_subject',
			'user_erasure_fulfillment_email_to',
			'user_erasure_complete_email_subject',
			'user_confirmed_action_email_content',
			'user_request_action_confirmed_message',
			'user_request_action_description',
			'user_request_action_email_content',
			'user_request_action_email_subject',
			'user_request_key_expiration',
			'get_terms_defaults',
			'get_terms_args',
			'list_terms_exclusions',
			'get_terms_fields',
			'terms_clauses',
			'get_terms_orderby',
			'list_pages',
			'register_taxonomy_args',
			'get_categories_taxonomy',
			'get_tags',
			'the_comments',
			'comments_clauses',
			'found_comments_query',
			'get_the_categories',
			'the_category_list',
			'the_category',
			'list_cats',
			'list_cats',
			'wp_dropdown_cats',
			'wp_list_categories',
			'wp_tag_cloud',
			'tag_cloud_sort',
			'wp_generate_tag_cloud_data',
			'wp_generate_tag_cloud',
			'get_the_tags',
			'the_tags',
			'get_the_terms',
			'the_terms',
			'pre_get_main_site_id',
			'network_by_path_segments_count',
			'pre_get_network_by_path',
			'get_site',
			'get_network',
			'pre_http_send_through_proxy',
			'customize_partial_render',
			'customize_dynamic_partial_args',
			'customize_dynamic_partial_class',
			'customize_render_partials_response',
			'wp_query_search_exclusion_prefix',
			'wp_search_stopwords',
			'posts_search',
			'posts_search_orderby',
			'posts_where',
			'posts_join',
			'comment_feed_join',
			'comment_feed_where',
			'comment_feed_groupby',
			'comment_feed_orderby',
			'comment_feed_limits',
			'posts_where_paged',
			'posts_groupby',
			'posts_join_paged',
			'posts_orderby',
			'posts_distinct',
			'post_limits',
			'posts_fields',
			'posts_clauses',
			'posts_where_request',
			'posts_groupby_request',
			'posts_join_request',
			'posts_orderby_request',
			'posts_distinct_request',
			'posts_fields_request',
			'post_limits_request',
			'posts_clauses_request',
			'posts_request',
			'posts_pre_query',
			'split_the_query',
			'posts_request_ids',
			'posts_results',
			'comment_feed_orderby',
			'comment_feed_limits',
			'the_preview',
			'the_posts',
			'found_posts_query',
			'found_posts',
			'content_pagination',
			'embed_handler_html',
			'oembed_ttl',
			'embed_oembed_html',
			'embed_oembed_discover',
			'embed_maybe_make_link',
			'is_protected_meta',
			'register_meta_args',
			'customizer_widgets_section_args',
			'is_wide_widget_in_customizer',
			'widget_customizer_setting_args',
			'search_form_format',
			'get_search_form',
			'loginout',
			'loginout',
			'logout_url',
			'login_url',
			'register_url',
			'login_form_defaults',
			'login_form_top',
			'login_form_middle',
			'login_form_bottom',
			'lostpassword_url',
			'register',
			'bloginfo_url',
			'bloginfo',
			'get_site_icon_url',
			'get_custom_logo',
			'pre_get_document_title',
			'document_title_separator',
			'document_title_parts',
			'wp_title_parts',
			'wp_title',
			'single_post_title',
			'post_type_archive_title',
			'single_cat_title',
			'single_tag_title',
			'single_term_title',
			'get_the_archive_title',
			'get_the_archive_description',
			'get_the_post_type_description',
			'get_archives_link',
			'getarchives_where',
			'getarchives_join',
			'get_calendar',
			'get_calendar',
			'the_date',
			'get_the_date',
			'the_modified_date',
			'get_the_modified_date',
			'the_time',
			'get_the_time',
			'get_post_time',
			'the_modified_time',
			'get_the_modified_time',
			'get_post_modified_time',
			'the_weekday',
			'the_weekday_date',
			'site_icon_meta_tags',
			'wp_resource_hints',
			'user_can_richedit',
			'wp_default_editor',
			'wp_code_editor_settings',
			'get_search_query',
			'the_search_query',
			'language_attributes',
			'paginate_links',
			'wp_admin_css_uri',
			'wp_admin_css',
			'wp_generator_type',
			'the_generator',
			'redirect_canonical',
			'role_has_cap',
			'theme_templates',
			'theme_scandir_exclusions',
			'network_allowed_themes',
			'allowed_themes',
			'site_allowed_themes',
			'site_allowed_themes',
			'wp_http_accept_encoding',
			'',
			'incompatible_sql_modes',
			'query',
			'pre_get_table_charset',
			'pre_get_col_charset',
			'stylesheet',
			'stylesheet_directory',
			'stylesheet_directory_uri',
			'stylesheet_uri',
			'locale_stylesheet_uri',
			'template',
			'template_directory',
			'template_directory_uri',
			'theme_root',
			'theme_root_uri',
			'get_header_image_tag',
			'get_header_video_url',
			'header_video_settings',
			'is_header_video_active',
			'wp_get_custom_css',
			'update_custom_css_data',
			'editor_stylesheets',
			'get_theme_starter_content',
			'rss_update_period',
			'rss_update_frequency',
			'pre_cache_alloptions',
			'alloptions',
			'pre_update_option',
			'register_setting_args',
			'post_thumbnail_size',
			'post_thumbnail_html',
			'the_post_thumbnail_caption',
			'category_description',
			'category_css_class',
			'map_meta_cap',
			'editor_max_image_size',
			'get_image_tag_class',
			'get_image_tag',
			'wp_constrain_dimensions',
			'image_resize_dimensions',
			'image_get_intermediate_size',
			'intermediate_image_sizes',
			'wp_get_attachment_image_src',
			'wp_get_attachment_image_attributes',
			'wp_calculate_image_srcset_meta',
			'max_srcset_image_width',
			'wp_calculate_image_srcset',
			'wp_calculate_image_sizes',
			'img_caption_shortcode',
			'img_caption_shortcode_width',
			'post_gallery',
			'gallery_style',
			'post_playlist',
			'wp_mediaelement_fallback',
			'wp_audio_extensions',
			'wp_get_attachment_id3_keys',
			'wp_audio_shortcode_override',
			'wp_audio_shortcode_library',
			'wp_audio_shortcode_class',
			'wp_audio_shortcode',
			'wp_video_extensions',
			'wp_video_shortcode_override',
			'wp_video_shortcode_library',
			'wp_video_shortcode_class',
			'wp_video_shortcode',
			'upload_size_limit',
			'wp_image_editors',
			'plupload_default_settings',
			'plupload_default_params',
			'wp_prepare_attachment_for_js',
			'media_library_show_audio_playlist',
			'media_library_show_video_playlist',
			'media_library_months_with_files',
			'media_view_settings',
			'media_view_strings',
			'get_attached_media_args',
			'get_attached_media',
			'media_embedded_in_content_allowed_types',
			'get_post_galleries',
			'get_post_gallery',
			'attachment_url_to_postid',
			'site_details',
			'page_css_class',
			'page_menu_link_attributes',
			'xmlrpc_methods',
			'pre_option_enable_xmlrpc',
			'option_enable_xmlrpc',
			'xmlrpc_enabled',
			'xmlrpc_login_error',
			'xmlrpc_blog_options',
			'xmlrpc_prepare_taxonomy',
			'xmlrpc_prepare_term',
			'xmlrpc_prepare_post',
			'xmlrpc_prepare_post_type',
			'xmlrpc_prepare_media_item',
			'xmlrpc_prepare_page',
			'xmlrpc_prepare_comment',
			'xmlrpc_prepare_user',
			'xmlrpc_wp_insert_post_data',
			'xmlrpc_default_post_fields',
			'xmlrpc_default_taxonomy_fields',
			'xmlrpc_default_user_fields',
			'xmlrpc_allow_anonymous_comments',
			'xmlrpc_default_posttype_fields',
			'xmlrpc_default_revision_fields',
			'xmlrpc_text_filters',
			'pingback_ping_source_uri',
			'pre_remote_source',
			'xmlrpc_pingback_error',
			'url_to_postid',
			'wp_editor_set_quality',
			'jpeg_quality',
			'image_editor_default_mime_type',
			'post_format_rewrite_base',
			'get_term',
			'get_terms',
			'pre_category_nicename',
			'wp_get_object_terms_args',
			'get_object_terms',
			'wp_get_object_terms',
			'pre_insert_term',
			'wp_insert_term_data',
			'term_id_filter',
			'wp_unique_term_slug',
			'wp_update_term_parent',
			'wp_update_term_data',
			'term_id_filter',
			'pre_term_link',
			'tag_link',
			'category_link',
			'term_link',
			'https_local_ssl_verify',
			'https_ssl_verify',
			'use_streams_transport',
			'embed_defaults',
			'wp_audio_embed_handler',
			'wp_video_embed_handler',
			'wp_embed_handler_youtube',
			'wp_embed_handler_audio',
			'wp_embed_handler_video',
			'oembed_discovery_links',
			'post_embed_url',
			'oembed_endpoint_url',
			'embed_html',
			'oembed_response_data',
			'the_excerpt_embed',
			'embed_site_title_html',
			'xmlrpc_element_limit',
			'xmlrpc_chunk_parsing_size',
			'embed_thumbnail_id',
			'embed_thumbnail_image_size',
			'embed_thumbnail_image_shape',
			'http_headers_useragent',
			'http_request_args',
			'pre_http_request',
			'https_ssl_verify',
			'http_response',
			'http_api_transports',
			'http_response',
			'block_local_requests',
			'schedule_event',
			'schedule_event',
			'cron_schedules',
			'run_wptexturize',
			'no_texturize_tags',
			'no_texturize_shortcodes',
			'sanitize_file_name_chars',
			'sanitize_file_name',
			'sanitize_user',
			'sanitize_key',
			'sanitize_title',
			'sanitize_html_class',
			'format_to_edit',
			'smilies_src',
			'is_email',
			'sanitize_email',
			'human_time_diff',
			'excerpt_length',
			'excerpt_more',
			'wp_trim_excerpt',
			'wp_trim_words',
			'pre_ent2ncr',
			'format_for_editor',
			'clean_url',
			'js_escape',
			'esc_html',
			'attribute_escape',
			'esc_textarea',
			'tag_escape',
			'wp_parse_str',
			'wp_sprintf',
			'sanitize_text_field',
			'sanitize_textarea_field',
			'sanitize_mime_type',
			'sanitize_trackback_urls',
			'wp_spaces_regexp',
			'process_text_diff_html',
			'user_search_columns',
			'found_users_query',
			'wp_get_nav_menu_object',
			'has_nav_menu',
			'wp_get_nav_menu_name',
			'wp_get_nav_menus',
			'wp_get_nav_menu_items',
			'nav_menu_attr_title',
			'nav_menu_description',
			'wp_setup_nav_menu_item',
			'_wp_post_revision_fields',
			'wp_save_post_revision_post_has_changed',
			'wp_revisions_to_keep',
			'ms_site_check',
			'site_by_path_segments_count',
			'pre_get_site_by_path',
			'the_author',
			'the_modified_author',
			'the_author_posts_link',
			'author_link',
			'is_multi_author',
			'get_comment_author',
			'comment_author',
			'get_comment_author_email',
			'author_email',
			'comment_email',
			'get_comment_author_link',
			'get_comment_author_IP',
			'get_comment_author_url',
			'comment_url',
			'get_comment_author_url_link',
			'comment_class',
			'get_comment_date',
			'comment_excerpt_length',
			'get_comment_excerpt',
			'comment_excerpt',
			'get_comment_ID',
			'get_comment_link',
			'get_comments_link',
			'get_comments_number',
			'comments_number',
			'get_comment_text',
			'comment_text',
			'get_comment_time',
			'get_comment_type',
			'trackback_url',
			'comments_open',
			'pings_open',
			'comments_template_query_args',
			'comments_array',
			'comments_template',
			'respond_link',
			'comments_popup_link_attributes',
			'comment_reply_link_args',
			'comment_reply_link',
			'post_comments_link',
			'cancel_comment_reply_link',
			'comment_id_fields',
			'wp_list_comments_args',
			'comment_form_default_fields',
			'comment_form_defaults',
			'comment_form_logged_in',
			'comment_form_fields',
			'comment_form_field_comment',
			'comment_form_submit_button',
			'comment_form_submit_field',
			'get_bookmarks',
			'dynamic_sidebar_params',
			'dynamic_sidebar_has_widgets',
			'is_active_sidebar',
			'sidebars_widgets',
			'customize_control_active',
			'locale',
			'locale',
			'gettext',
			'gettext_with_context',
			'ngettext',
			'ngettext_with_context',
			'override_load_textdomain',
			'load_textdomain_mofile',
			'override_unload_textdomain',
			'plugin_locale',
			'plugin_locale',
			'theme_locale',
			'get_available_languages',
			'the_networks',
			'networks_clauses',
			'found_networks_query',
			'query_vars',
			'request',
			'wp_headers',
			'query_string',
			'widget_categories_dropdown_args',
			'widget_categories_args',
			'widget_title',
			'widget_links_args',
			'widget_nav_menu_args',
			'widget_text',
			'widget_text_content',
			'widget_custom_html_content',
			'comment_max_links_url',
			'get_comment',
			'get_default_comment_status',
			'comment_cookie_lifetime',
			'pre_comment_author_name',
			'pre_comment_author_email',
			'pre_comment_author_url',
			'duplicate_comment_id',
			'pre_comment_approved',
			'comment_flood_filter',
			'get_page_of_comment',
			'wp_get_comment_fields_max_lengths',
			'wp_count_comments',
			'wp_get_current_commenter',
			'pre_user_id',
			'pre_comment_user_agent',
			'pre_comment_content',
			'pre_comment_user_ip',
			'preprocess_comment',
			'notify_post_author',
			'comment_save_pre',
			'wp_update_comment_data',
			'pre_wp_update_comment_count_now',
			'pingback_useragent',
			'close_comments_for_post_types',
			'close_comments_for_post_types',
			'wp_anonymize_comment',
			'customize_nav_menu_available_items',
			'customize_nav_menu_searched_items',
			'customize_nav_menu_available_item_types',
			'wp_nav_menu_args',
			'pre_wp_nav_menu',
			'wp_nav_menu_container_allowedtags',
			'wp_nav_menu_objects',
			'wp_nav_menu_items',
			'wp_nav_menu',
			'nav_menu_submenu_css_class',
			'nav_menu_item_args',
			'nav_menu_css_class',
			'nav_menu_item_id',
			'nav_menu_link_attributes',
			'nav_menu_item_title',
			'walker_nav_menu_start_el',
			'get_meta_sql',
			'meta_query_find_compatible_table_alias',
			'widget_display_callback',
			'widget_update_callback',
			'widget_form_callback',
			'wp_xmlrpc_server_class',
			'comment_post_redirect',
			'edit_comment_misc_actions',
			'myblogs_options',
			'myblogs_blog_actions',
			'wp_nav_locations_listed_per_menu',
			'redirect_term_location',
			'taxonomy_parent_dropdown_args',
			'whitelist_options',
			'redirect_user_admin_request',
			'delete_site_email_content',
			'admin_title',
			'admin_body_class',
			'parent_file',
			'submenu_file',
			'export_args',
			'bulk_post_updated_messages',
			'user_profile_picture_description',
			'post_updated_messages',
			'enter_title_here',
			'tables_to_repair',
			'thread_comments_depth_max',
			'avatar_defaults',
			'default_avatar_select',
			'redirect_network_admin_request',
			'mu_menu_items',
			'media_upload_default_type',
			'media_upload_default_tab',
			'pre_user_login',
			'date_formats',
			'time_formats',
			'admin_footer_text',
			'update_footer',
			'install_themes_tabs',
			'available_permalink_structure_tags',
			'editable_slug',
			'wp_header_image_attachment_metadata',
			'theme_action_links',
			'theme_row_meta',
			'heartbeat_nopriv_received',
			'heartbeat_nopriv_send',
			'term_search_min_chars',
			'wp_check_post_lock_window',
			'ajax_query_attachments_args',
			'wp_refresh_nonces',
			'heartbeat_received',
			'heartbeat_send',
			'wp_ajax_cropped_attachment_metadata',
			'wp_ajax_cropped_attachment_id',
			'wp_privacy_personal_data_exporters',
			'wp_privacy_personal_data_export_page',
			'wp_privacy_personal_data_erasers',
			'wp_privacy_personal_data_erasure_page',
			'intermediate_image_sizes_advanced',
			'attachment_thumbnail_args',
			'fallback_intermediate_image_sizes',
			'wp_generate_attachment_metadata',
			'wp_read_image_metadata',
			'file_is_displayable_image',
			'load_image_to_edit',
			'load_image_to_edit_filesystempath',
			'load_image_to_edit_attachmenturl',
			'load_image_to_edit_path',
			'wpmu_users_columns',
			'ms_user_list_site_actions',
			'ms_user_row_actions',
			'default_content',
			'default_title',
			'default_excerpt',
			'edit_posts_per_page',
			'upload_per_page',
			'get_sample_permalink',
			'get_sample_permalink_html',
			'admin_post_thumbnail_size',
			'admin_post_thumbnail_html',
			'override_post_lock',
			'redirect_post_location',
			'default_hidden_columns',
			'hidden_columns',
			'default_hidden_meta_boxes',
			'hidden_meta_boxes',
			'months_dropdown_results',
			'list_table_primary_column',
			'update_right_now_text',
			'install_themes_nonmenu_tabs',
			'theme_install_actions',
			'plugin_files_exclusions',
			'translations_api',
			'translations_api_result',
			'add_menu_classes',
			'menu_order',
			'manage_pages_columns',
			'manage_posts_columns',
			'post_date_column_status',
			'post_date_column_time',
			'page_row_actions',
			'post_row_actions',
			'quick_edit_dropdown_pages_args',
			'all_plugins',
			'show_network_active_plugins',
			'network_admin_plugin_action_links',
			'plugin_action_links',
			'plugin_row_meta',
			'install_plugin_complete_actions',
			'wp_terms_checklist_args',
			'wp_comment_reply',
			'postmeta_form_keys',
			'postmeta_form_limit',
			'import_upload_size_limit',
			'display_post_states',
			'display_media_states',
			'export_wp_filename',
			'the_content_export',
			'the_excerpt_export',
			'update_bulk_plugins_complete_actions',
			'get_editable_authors',
			'get_others_drafts',
			'wp_create_thumbnail',
			'site_icon_attachment_metadata',
			'site_icon_image_sizes',
			'site_icon_image_sizes',
			'update_feedback',
			'editable_roles',
			'get_users_drafts',
			'post_types_to_delete_with_user',
			'manage_taxonomies_for_attachment_columns',
			'manage_media_columns',
			'media_row_actions',
			'update_bulk_theme_complete_actions',
			'install_theme_complete_actions',
			'update_theme_complete_actions',
			'install_plugins_tabs',
			'install_plugins_nonmenu_tabs',
			'plugin_install_action_links',
			'post_edit_category_parent_dropdown_args',
			'page_attributes_dropdown_pages_args',
			'default_page_template_title',
			'users_list_table_query_args',
			'user_row_actions',
			'manage_users_custom_column',
			'get_role_list',
			'comments_per_page',
			'comment_status_links',
			'term_updated_messages',
			'contextual_help_list',
			'contextual_help',
			'default_contextual_help',
			'screen_layout_columns',
			'screen_settings',
			'screen_options_show_screen',
			'screen_options_show_submit',
			'view_mode_post_types',
			'edit_tags_per_page',
			'tagsperpage',
			'edit_categories_per_page',
			'term_name',
			'tag_row_actions',
			'automatic_updater_disabled',
			'automatic_updates_is_vcs_checkout',
			'auto_core_update_email',
			'automatic_updates_debug_email',
			'async_update_translation',
			'plugins_api_args',
			'plugins_api',
			'plugins_api_result',
			'upgrader_pre_download',
			'upgrader_pre_install',
			'upgrader_source_selection',
			'upgrader_clear_destination',
			'upgrader_post_install',
			'upgrader_package_options',
			'themes_api_args',
			'themes_api',
			'themes_api_result',
			'pre_prepare_themes_for_js',
			'wp_prepare_themes_for_js',
			'dbdelta_queries',
			'dbdelta_create_queries',
			'dbdelta_insert_queries',
			'wp_should_upgrade_global_tables',
			'ms_sites_list_table_query_args',
			'wpmu_blogs_columns',
			'manage_sites_action_links',
			'wp_network_dashboard_widgets',
			'wp_user_dashboard_widgets',
			'wp_dashboard_widgets',
			'dashboard_glance_items',
			'privacy_on_link_title',
			'privacy_on_link_text',
			'dashboard_recent_drafts_query_args',
			'comment_row_actions',
			'dashboard_recent_posts_query_args',
			'browse-happy-notice',
			'try_gutenberg_learn_more_link',
			'allow_minor_auto_core_updates',
			'allow_major_auto_core_updates',
			'media_upload_tabs',
			'image_send_to_editor',
			'image_add_caption_text',
			'image_add_caption_shortcode',
			'media_buttons_context',
			'attachment_fields_to_save',
			'media_send_to_editor',
			'image_send_to_editor_url',
			'attachment_fields_to_edit',
			'get_media_item_args',
			'media_meta',
			'get_media_item_args',
			'attachment_fields_to_edit',
			'upload_post_params',
			'plupload_init',
			'media_upload_form_url',
			'media_upload_form_url',
			'type_url_form_media',
			'media_upload_form_url',
			'media_upload_form_url',
			'media_upload_mime_type_links',
			'media_meta',
			'media_submitbox_misc_sections',
			'audio_submitbox_misc_sections',
			'wp_read_video_metadata',
			'got_rewrite',
			'got_url_rewrite',
			'documentation_ignore_functions',
			'set-screen-option',
			'admin_referrer_policy',
			'new_admin_email_content',
			'wp_get_default_privacy_policy_content',
			'terms_to_edit',
			'populate_network_meta',
			'update_plugin_complete_actions',
			'update_translations_complete_actions',
			'nav_menu_meta_box_object',
			'wp_edit_nav_menu_walker',
			'revision_text_diff_options',
			'wp_get_revision_ui_diff',
			'wp_prepare_revision_for_js',
			'wpmu_drop_tables',
			'wpmu_delete_blog_upload_dir',
			'lang_codes',
			'mu_dropdown_languages',
			'can_edit_network',
			'comment_edit_pre',
			'editable_extensions',
			'wp_theme_editor_filetypes',
			'pre_move_uploaded_file',
			'filesystem_method_file',
			'filesystem_method',
			'request_filesystem_credentials',
			'fs_ftp_connection_types',
			'wp_privacy_personal_data_email_content',
			'image_editor_save_pre',
			'image_save_pre',
			'wp_save_image_editor_file',
			'wp_save_image_file',
			'wp_image_editor_before_change',
			'image_edit_before_change',
			'comment_edit_redirect',
			'shake_error_codes',
			'login_title',
			'login_headerurl',
			'login_headertitle',
			'login_body_class',
			'login_message',
			'login_errors',
			'login_messages',
			'retrieve_password_title',
			'retrieve_password_message',
			'login_link_separator',
			'post_password_expires',
			'logout_redirect',
			'lostpassword_redirect',
			'wp_signup_location',
			'registration_redirect',
			'login_redirect',
			'wp_login_errors',
			'wp_mail_original_content',
			'phone_content',
		);
	}

	/**
	 * Load the generator tabs.
	 *
	 * @return void
	 */
	protected function load_tabs() {
		$this->tabs = array(
			'info' => array(
				'label'   => __( 'Info', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						// Column 1 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Overview', 'insert-headers-and-footers' ),
							'content' => sprintf(
							// Translators: Placeholders add links to the wordpress.org references.
								__( 'Using this generator you can safely add custom %1$shooks%2$s using either %3$sadd_action%4$s or %5$sadd_filter%6$s.', 'insert-headers-and-footers' ),
								'<a href="https://developer.wordpress.org/reference/hooks/" target="_blank">',
								'</a>',
								'<a href="https://developer.wordpress.org/reference/functions/add_action/" target="_blank">',
								'</a>',
								'<a href="https://developer.wordpress.org/reference/functions/add_filter/" target="_blank">',
								'</a>'
							),
						),
					),
					// Column 2.
					array(
						// Column 2 fields.
						array(
							'type'    => 'list',
							'label'   => __( 'Usage', 'insert-headers-and-footers' ),
							'content' => array(
								__( 'Fill in the forms using the menu on the left.', 'insert-headers-and-footers' ),
								__( 'Click the "Update Code" button.', 'insert-headers-and-footers' ),
								__( 'Click on "Use Snippet" to create a new snippet with the generated code.', 'insert-headers-and-footers' ),
								__( 'Activate and save the snippet and you\'re ready to go', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						// Column 3 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Examples', 'insert-headers-and-footers' ),
							'content' => __( 'You can use this to quickly get started with adding an action or filter.', 'insert-headers-and-footers' ),
						),
					),
				),
			),
			'hook' => array(
				'label'   => __( 'Hook Details', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Hook type', 'insert-headers-and-footers' ),
							'description' => __( 'Can be either an action or a filter', 'insert-headers-and-footers' ),
							'id'          => 'hook_type',
							'default'     => 'add_action',
							'options'     => array(
								'add_action' => __( 'Action', 'insert-headers-and-footers' ),
								'add_filter' => __( 'Filter', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'         => 'text',
							'label'        => __( 'Hook name', 'insert-headers-and-footers' ),
							'description'  => __( 'Input hook name or pick one from the suggested list as you type.', 'insert-headers-and-footers' ),
							'id'           => 'hook_name',
							'default'      => '',
							'autocomplete' => $this->get_all_hooks_options(),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Callback function', 'insert-headers-and-footers' ),
							'description' => __( 'Name of the function you want to add to this hook.', 'insert-headers-and-footers' ),
							'id'          => 'callback',
							'default'     => 'custom_function_' . time(),
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Priority', 'insert-headers-and-footers' ),
							'description' => __( 'Priority of this hook, by default 10.', 'insert-headers-and-footers' ),
							'id'          => 'priority',
							'default'     => '10',
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Arguments list', 'insert-headers-and-footers' ),
							'description' => __( 'Add comma-separated custom arguments that will be passed to the callback function depending on the action/filter.', 'insert-headers-and-footers' ),
							'id'          => 'arguments',
							'default'     => '',
						),
					),
				),
			),
			'code' => array(
				'label'   => __( 'Code', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'textarea',
							'label'       => __( 'PHP Code', 'insert-headers-and-footers' ),
							'description' => __( 'Custom PHP code you want to run in the function, you can also edit this after you create the snippet.', 'insert-headers-and-footers' ),
							'id'          => 'code',
							'code'        => true,
						),
					),
				),
			),
		);
	}

	/**
	 * Get the snippet code with dynamic values applied.
	 *
	 * @return string
	 */
	public function get_snippet_code() {

		$arguments = $this->get_value( 'arguments' );

		$arguments_array = explode( ',', $arguments );
		$arguments_array = array_map( 'trim', $arguments_array );
		$count           = count( $arguments_array );
		if ( $count > 1 ) {
			$count = ", $count";
		} else {
			$count = '';
		}
		$arguments_formatted = implode( ', ', $arguments_array );
		$priority            = intval( $this->get_value( 'priority' ) );
		$callback            = str_replace( '-', '_', sanitize_title_with_dashes( $this->get_value( 'callback' ) ) );

		return '// Add a hook.
function ' . $callback . '( ' . $arguments_formatted . ' ) {
' . $this->get_value( 'code' ) . '
}
' . $this->get_value( 'hook_type' ) . '( \'' . $this->get_value( 'hook_name' ) . '\', \'' . $callback . '\', ' . $priority . $count . ' );';
	}

}
includes/generator/class-wpcode-generator-taxonomy.php000064400000060701151331545640017310 0ustar00<?php
/**
 * Generate a snippet to register a new taxonomy.
 *
 * @package WPCode
 */

/**
 * The Taxonomy generator class.
 */
class WPCode_Generator_Taxonomy extends WPCode_Generator_Type {

	/**
	 * The generator slug.
	 *
	 * @var string
	 */
	public $name = 'taxonomy';

	/**
	 * The categories for this generator.
	 *
	 * @var string[]
	 */
	public $categories = array(
		'content',
	);

	/**
	 * Set the translatable strings.
	 *
	 * @return void
	 */
	protected function set_strings() {
		$this->title       = __( 'Taxonomy', 'insert-headers-and-footers' );
		$this->description = __( 'Create a custom taxonomy for your posts using this generator.', 'insert-headers-and-footers' );
	}

	/**
	 * Load the generator tabs.
	 *
	 * @return void
	 */
	protected function load_tabs() {
		$this->tabs = array(
			'info'         => array(
				'label'   => __( 'Info', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						// Column 1 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Overview', 'insert-headers-and-footers' ),
							'content' => __( 'Use this generator to create custom taxonomies for your WordPress site.', 'insert-headers-and-footers' ),
						),
					),
					// Column 2.
					array(
						// Column 2 fields.
						array(
							'type'    => 'list',
							'label'   => __( 'Usage', 'insert-headers-and-footers' ),
							'content' => array(
								__( 'Fill in the forms using the menu on the left.', 'insert-headers-and-footers' ),
								__( 'Click the "Update Code" button.', 'insert-headers-and-footers' ),
								__( 'Click on "Use Snippet" to create a new snippet with the generated code.', 'insert-headers-and-footers' ),
								__( 'Activate and save the snippet and you\'re ready to go', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						// Column 3 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Examples', 'insert-headers-and-footers' ),
							'content' => __( 'Use this to add more taxonomies to posts or custom post types. For example, if you used the Post Type generator to create an Artist post type you can use this one to create a Genre taxonomy.', 'insert-headers-and-footers' ),
						),
					),
				),
			),
			'general'      => array(
				'label'   => __( 'General', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Function name', 'insert-headers-and-footers' ),
							'description' => __( 'Make this unique to avoid conflicts with other snippets', 'insert-headers-and-footers' ),
							'id'          => 'function_name',
							'placeholder' => 'register_custom_taxonomy',
							'default'     => 'register_custom_taxonomy' . time(),
							// This makes it unique for people who don't want to customize.
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Text Domain', 'insert-headers-and-footers' ),
							'description' => __( 'Optional text domain for translations.', 'insert-headers-and-footers' ),
							'id'          => 'text_domain',
							'placeholder' => 'text_domain',
							'default'     => 'text_domain',
						),
					),
				),
			),
			'taxonomy'     => array(
				'label'   => __( 'Taxonomy', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Taxonomy Key', 'insert-headers-and-footers' ),
							'description' => __( 'Name of taxonomy used in the code, lowercase maximum 20 characters.', 'insert-headers-and-footers' ),
							'id'          => 'taxonomy',
							'placeholder' => 'taxonomy',
							'default'     => 'taxonomy',
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Name (Singular)', 'insert-headers-and-footers' ),
							'description' => __( 'The singular taxonomy name (e.g. Genre, Year).', 'insert-headers-and-footers' ),
							'id'          => 'label',
							'placeholder' => 'Taxonomy',
							'default'     => 'Taxonomy',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Name (Plural)', 'insert-headers-and-footers' ),
							'description' => __( 'The taxonomy plural name (e.g. Genres, Years).', 'insert-headers-and-footers' ),
							'id'          => 'label_count',
							'placeholder' => 'Taxonomies',
							'default'     => 'Taxonomies',
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Link To Post Type(s)', 'insert-headers-and-footers' ),
							'description' => __( 'Comma-separated list of Post Types (e.g. post, page)', 'insert-headers-and-footers' ),
							'id'          => 'post_types',
							'placeholder' => 'post',
							'default'     => 'post',
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Hierarchical', 'insert-headers-and-footers' ),
							'description' => __( 'Hierarchical taxonomies can have descendants.', 'insert-headers-and-footers' ),
							'id'          => 'hierarchical',
							'default'     => 'false',
							'options'     => array(
								'false' => __( 'No, like tags', 'insert-headers-and-footers' ),
								'true'  => __( 'Yes, like categories', 'insert-headers-and-footers' ),
							),
						),
					),
				),
			),
			'labels'       => array(
				'label'   => __( 'Labels', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Menu Name', 'insert-headers-and-footers' ),
							'id'          => 'label_menu_name',
							'placeholder' => 'Taxonomy',
							'default'     => 'Taxonomy',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'All Items', 'insert-headers-and-footers' ),
							'id'          => 'label_all_items',
							'placeholder' => 'All Items',
							'default'     => 'All Items',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Parent Item', 'insert-headers-and-footers' ),
							'id'          => 'label_parent_item',
							'placeholder' => 'Parent Item',
							'default'     => 'Item Archives',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Parent Item colon', 'insert-headers-and-footers' ),
							'id'          => 'label_parent_item_colon',
							'placeholder' => 'Parent Item:',
							'default'     => 'Parent Item:',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'New Item Name', 'insert-headers-and-footers' ),
							'id'          => 'label_new_item',
							'placeholder' => 'New Item Name',
							'default'     => 'New Item Name',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Add New Item', 'insert-headers-and-footers' ),
							'id'          => 'label_add_new_item',
							'placeholder' => 'Add New Item',
							'default'     => 'Add New Item',
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Edit Item', 'insert-headers-and-footers' ),
							'id'          => 'label_edit_item',
							'placeholder' => 'Edit Item',
							'default'     => 'Edit Item',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Update Item', 'insert-headers-and-footers' ),
							'id'          => 'label_update_item',
							'placeholder' => 'Update Item',
							'default'     => 'Update Item',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'View Item', 'insert-headers-and-footers' ),
							'id'          => 'label_view_item',
							'placeholder' => 'View Item',
							'default'     => 'View Item',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Separate Items with commas', 'insert-headers-and-footers' ),
							'id'          => 'label_separate_items_with_commas',
							'placeholder' => 'Separate Items with commas',
							'default'     => 'Separate Items with commas',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Add or Remove Items', 'insert-headers-and-footers' ),
							'id'          => 'label_add_or_remove_items',
							'placeholder' => 'Add or remove items',
							'default'     => 'Add or remove items',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Choose From Most Used', 'insert-headers-and-footers' ),
							'id'          => 'label_choose_from_most_used',
							'placeholder' => 'Choose from the most used',
							'default'     => 'Choose from the most used',
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Popular Items', 'insert-headers-and-footers' ),
							'id'          => 'label_popular_items',
							'placeholder' => 'Popular Items',
							'default'     => 'Popular Items',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Search Items', 'insert-headers-and-footers' ),
							'id'          => 'label_search_items',
							'placeholder' => 'Search Items',
							'default'     => 'Search Items',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Not Found', 'insert-headers-and-footers' ),
							'id'          => 'label_not_found',
							'placeholder' => 'Not Found',
							'default'     => 'Not Found',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'No items', 'insert-headers-and-footers' ),
							'id'          => 'label_no_items',
							'placeholder' => 'No items',
							'default'     => 'No items',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Items list', 'insert-headers-and-footers' ),
							'id'          => 'label_items_list',
							'placeholder' => 'Items list',
							'default'     => 'Items list',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Items list navigation', 'insert-headers-and-footers' ),
							'id'          => 'label_items_list_navigation',
							'placeholder' => 'Items list navigation',
							'default'     => 'Items list navigation',
						),
					),
				),
			),
			'visibility'   => array(
				'label'   => __( 'Visibility', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Public', 'insert-headers-and-footers' ),
							// Translators: Placeholders add a link to the wp.org documentation page.
							'description' => sprintf( __( 'Should this taxonomy be %1$svisible to authors%2$s?', 'insert-headers-and-footers' ), '<a href="https://developer.wordpress.org/reference/functions/register_taxonomy/#additional-parameter-information" target="_blank">', '</a>' ),
							'id'          => 'public',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes - default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Show UI', 'insert-headers-and-footers' ),
							'description' => __( 'Should this taxonomy have an User Interface for managing?', 'insert-headers-and-footers' ),
							'id'          => 'show_ui',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes - default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Show Admin Column', 'insert-headers-and-footers' ),
							'description' => __( 'Should this taxonomy add a column in the list of associated post types?', 'insert-headers-and-footers' ),
							'id'          => 'show_admin_column',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes - default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Show Tag Cloud', 'insert-headers-and-footers' ),
							'description' => __( 'Should this taxonomy be visible in the tag cloud widget?', 'insert-headers-and-footers' ),
							'id'          => 'show_tagcloud',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes - default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Show in Navigation Menus', 'insert-headers-and-footers' ),
							'description' => __( 'Should this taxonomy be available in menus (Appearance > Menus).', 'insert-headers-and-footers' ),
							'id'          => 'show_in_nav_menus',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes - default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
					),
				),
			),
			'permalinks'   => array(
				'label'   => __( 'Permalinks', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Permalink Rewrite', 'insert-headers-and-footers' ),
							'description' => __( 'Use Default Permalinks, disable automatic rewriting or use custom permalinks.', 'insert-headers-and-footers' ),
							'id'          => 'rewrite',
							'default'     => 'true',
							'options'     => array(
								'true'   => __( 'Default (taxonomy key)', 'insert-headers-and-footers' ),
								'false'  => __( 'Disable permalink rewrites', 'insert-headers-and-footers' ),
								'custom' => __( 'Custom permalink structure', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'URL Slug', 'insert-headers-and-footers' ),
							'description' => __( 'If you selected custom permalinks use this field for the rewrite base, e.g. taxonomy in https://yoursite.com/taxonomy', 'insert-headers-and-footers' ),
							'id'          => 'rewrite_slug',
							'default'     => '',
							'placeholder' => '',
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Prepend permastruct', 'insert-headers-and-footers' ),
							'description' => __( 'Should the permastruct be prepended to the url (with_front parameter).', 'insert-headers-and-footers' ),
							'id'          => 'rewrite_with_front',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes - default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Hierarchical URL Slug', 'insert-headers-and-footers' ),
							'description' => __( 'For hierarchical taxonomies use the whole hierarchy in the URL?', 'insert-headers-and-footers' ),
							'id'          => 'rewrite_hierarchical',
							'default'     => 'false',
							'options'     => array(
								'false' => __( 'No - default', 'insert-headers-and-footers' ),
								'true'  => __( 'Yes', 'insert-headers-and-footers' ),
							),
						),
					),
				),
			),
			'capabilities' => array(
				'label'   => __( 'Capabilities', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Capabilities', 'insert-headers-and-footers' ),
							// Translators: Placeholders add link to wp.org docs.
							'description' => sprintf( __( 'User capabilities in relation to this taxonomy. %1$sSee Documentation.%2$s', 'insert-headers-and-footers' ), '<a href="https://developer.wordpress.org/reference/functions/register_taxonomy/#additional-parameter-information" target="_blank">', '</a>' ),
							'id'          => 'capabilities',
							'default'     => 'true',
							'options'     => array(
								'true'   => __( 'Base capabilities - default', 'insert-headers-and-footers' ),
								'custom' => __( 'Custom Capabilities', 'insert-headers-and-footers' ),
							),
						),
						array(
							'type'    => 'description',
							'label'   => __( 'Custom Capabilities', 'insert-headers-and-footers' ),
							'content' => __( 'Use the fields on the right to assign custom capabilities for this taxonomy.', 'insert-headers-and-footers' ),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Edit Terms', 'insert-headers-and-footers' ),
							'id'          => 'edit_terms',
							'default'     => 'manage_categories',
							'placeholder' => 'manage_categories',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Delete Terms', 'insert-headers-and-footers' ),
							'id'          => 'delete_terms',
							'default'     => 'manage_categories',
							'placeholder' => 'manage_categories',
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Manage Terms', 'insert-headers-and-footers' ),
							'id'          => 'manage_terms',
							'default'     => 'manage_categories',
							'placeholder' => 'manage_categories',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Assign Terms', 'insert-headers-and-footers' ),
							'id'          => 'assign_terms',
							'default'     => 'edit_posts',
							'placeholder' => 'edit_posts',
						),
					),
				),
			),
			'rest_api'     => array(
				'label'   => __( 'Rest API', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Show in Rest API?', 'insert-headers-and-footers' ),
							'description' => __( 'Add the taxonomy to the WordPress wp-json API.', 'insert-headers-and-footers' ),
							'id'          => 'show_in_rest',
							'default'     => 'false',
							'options'     => array(
								'true'  => __( 'Yes', 'insert-headers-and-footers' ),
								'false' => __( 'No - default', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Rest Base', 'insert-headers-and-footers' ),
							'description' => __( 'The base slug that this taxonomy will use in the REST API.', 'insert-headers-and-footers' ),
							'id'          => 'rest_base',
							'default'     => '',
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Rest Controller Class', 'insert-headers-and-footers' ),
							'description' => __( 'The name of a custom Rest Controller class instead of WP_REST_Terms_Controller.', 'insert-headers-and-footers' ),
							'id'          => 'rest_controller_class',
							'default'     => '',
						),
					),
				),
			),
		);
	}

	/**
	 * Get the snippet code with dynamic values applied.
	 *
	 * @return string
	 */
	public function get_snippet_code() {

		$rewrite         = $this->get_value( 'rewrite' );
		$rewrite_options = '';
		if ( 'true' === $rewrite ) {
			$rewrite = '';
		} elseif ( 'custom' === $rewrite ) {
			$rewrite         = "\t\t'rewrite'                    => \$rewrite_options,";
			$rewrite_options = "
	\$rewrite_options = array(
		'slug'         => '{$this->get_value('rewrite_slug')}',
		'with_front'   => {$this->get_value( 'rewrite_with_front')},
		'hierarchical' => {$this->get_value( 'rewrite_hierarchical')},
 	); 
			";
		} else {
			$rewrite = "\t\t'rewrite'               => $rewrite,";
		}

		$custom_capabilities = '';
		$capabilities        = $this->get_value( 'capabilities' );

		if ( 'custom' === $capabilities ) {
			$custom_capabilities = "
	\$capabilities = array(
		'edit_terms'   => '{$this->get_value( 'edit_terms')}',
		'delete_terms' => '{$this->get_value( 'delete_terms')}',
		'manage_terms' => '{$this->get_value( 'manage_terms')}',
		'assign_terms' => '{$this->get_value( 'assign_terms')}',
	);
			";
			$capabilities        = "        'capabilities'          => \$capabilities,";
		} else {
			$capabilities = '';
		}

		return '// Register Custom Taxonomy
function ' . $this->get_value( 'function_name' ) . '() {

    $labels = array(
        \'name\'                       => _x( \'' . $this->get_value( 'label_count' ) . '\', \'Taxonomy General Name\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'singular_name\'              => _x( \'' . $this->get_value( 'label' ) . '\', \'Taxonomy Singular Name\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'menu_name\'                  => __( \'' . $this->get_value( 'label_menu_name' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'all_items\'                  => __( \'' . $this->get_value( 'label_all_items' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'parent_item\'                => __( \'' . $this->get_value( 'label_parent_item' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'parent_item_colon\'          => __( \'' . $this->get_value( 'label_parent_item_colon' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'new_item_name\'              => __( \'' . $this->get_value( 'label_new_item' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'add_new_item\'               => __( \'' . $this->get_value( 'label_add_new_item' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'edit_item\'                  => __( \'' . $this->get_value( 'label_edit_item' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'update_item\'                => __( \'' . $this->get_value( 'label_update_item' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'view_item\'                  => __( \'' . $this->get_value( 'label_view_item' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'separate_items_with_commas\' => __( \'' . $this->get_value( 'label_separate_items_with_commas' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'add_or_remove_items\'        => __( \'' . $this->get_value( 'label_add_or_remove_items' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'choose_from_most_used\'      => __( \'' . $this->get_value( 'label_choose_from_most_used' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'popular_items\'              => __( \'' . $this->get_value( 'label_popular_items' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'search_items\'               => __( \'' . $this->get_value( 'label_search_items' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'not_found\'                  => __( \'' . $this->get_value( 'label_not_found' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'no_terms\'                   => __( \'' . $this->get_value( 'label_no_items' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'items_list\'                 => __( \'' . $this->get_value( 'label_items_list' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
        \'items_list_navigation\'      => __( \'' . $this->get_value( 'label_items_list_navigation' ) . '\', \'' . $this->get_value( 'text_domain' ) . '\' ),
    );
    ' . $rewrite_options . '
    ' . $custom_capabilities . '
    $args = array(
        \'labels\'                => $labels,
        \'hierarchical\'          => ' . $this->get_value( 'hierarchical' ) . ',
        \'public\'                => ' . $this->get_value( 'public' ) . ',
        \'show_ui\'               => ' . $this->get_value( 'show_ui' ) . ',
        \'show_admin_column\'     => ' . $this->get_value( 'show_admin_column' ) . ',
        \'show_in_nav_menus\'     => ' . $this->get_value( 'show_in_nav_menus' ) . ',
        \'show_tagcloud\'         => ' . $this->get_value( 'show_tagcloud' ) . ',
        \'show_in_rest\'          => ' . $this->get_value( 'show_in_rest' ) . ',
' . $rewrite . '
' . $capabilities . '
' . $this->get_optional_value( 'show_in_rest' ) . $this->get_optional_value( 'rest_base', true ) . $this->get_optional_value( 'rest_controller_class', true ) . '
    );
    register_taxonomy( \'' . $this->get_value( 'taxonomy' ) . '\', ' . $this->get_value_comma_separated( 'post_types' ) . ', $args );

}
add_action( \'init\', \'' . $this->get_value( 'function_name' ) . '\', 5 );';
	}

}
includes/generator/class-wpcode-generator-sidebar.php000064400000020523151331545640017041 0ustar00<?php
/**
 * Generate a snippet for a sidebar.
 *
 * @package WPCode
 */

/**
 * WPCode_Generator_Sidebar class.
 */
class WPCode_Generator_Sidebar extends WPCode_Generator_Type {

	/**
	 * The generator slug.
	 *
	 * @var string
	 */
	public $name = 'sidebar';

	/**
	 * The categories for this generator.
	 *
	 * @var string[]
	 */
	public $categories = array(
		'design',
	);

	/**
	 * Set the translatable strings.
	 *
	 * @return void
	 */
	protected function set_strings() {
		$this->title       = __( 'Sidebar', 'insert-headers-and-footers' );
		$this->description = __( 'Generate a snippet to register a sidebar for your widgets.', 'insert-headers-and-footers' );
	}

	/**
	 * Load the generator tabs.
	 *
	 * @return void
	 */
	protected function load_tabs() {
		$this->tabs = array(
			'info'     => array(
				'label'   => __( 'Info', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						// Column 1 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Overview', 'insert-headers-and-footers' ),
							'content' => sprintf(
							// Translators: Placeholders add links to the wordpress.org references.
								__( 'This generator makes it easy to add sidebars to your website using the "register_sidebar" function.', 'insert-headers-and-footers' ),
								'<a href="https://developer.wordpress.org/reference/functions/register_sidebar/" target="_blank">',
								'</a>'
							),
						),
					),
					// Column 2.
					array(
						// Column 2 fields.
						array(
							'type'    => 'list',
							'label'   => __( 'Usage', 'insert-headers-and-footers' ),
							'content' => array(
								__( 'Fill in the forms using the menu on the left.', 'insert-headers-and-footers' ),
								__( 'Click the "Update Code" button.', 'insert-headers-and-footers' ),
								__( 'Click on "Use Snippet" to create a new snippet with the generated code.', 'insert-headers-and-footers' ),
								__( 'Activate and save the snippet and you\'re ready to go', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						// Column 3 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Examples', 'insert-headers-and-footers' ),
							'content' => __( 'You can add multiple widget areas for your footer or post-type specific sidebars.', 'insert-headers-and-footers' ),
						),
					),
				),
			),
			'general'  => array(
				'label'   => __( 'General', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Function name', 'insert-headers-and-footers' ),
							'description' => __( 'Make this unique to avoid conflicts with other snippets', 'insert-headers-and-footers' ),
							'id'          => 'function_name',
							'placeholder' => 'register_custom_sidebars',
							'default'     => 'register_custom_sidebars' . time(),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Text Domain', 'insert-headers-and-footers' ),
							'description' => __( 'Optional text domain for translations.', 'insert-headers-and-footers' ),
							'id'          => 'text_domain',
							'placeholder' => 'text_domain',
							'default'     => 'text_domain',
						),
					),
				),
			),
			'schedule' => array(
				'label'   => __( 'Sidebars', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Sidebar Id', 'insert-headers-and-footers' ),
							'description' => __( 'This is the sidebar unique id, used in the code, lowercase with no spaces.', 'insert-headers-and-footers' ),
							'id'          => 'sidebar_id',
							'name'        => 'sidebar_id[]',
							'repeater'    => 'sidebars',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Name', 'insert-headers-and-footers' ),
							'description' => __( 'Add a descriptive label for this sidebar to be used in the admin.', 'insert-headers-and-footers' ),
							'id'          => 'sidebar_name',
							'name'        => 'sidebar_name[]',
							'repeater'    => 'sidebars',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Description', 'insert-headers-and-footers' ),
							'description' => __( 'A short description for the the admin area.', 'insert-headers-and-footers' ),
							'id'          => 'sidebar_description',
							'name'        => 'sidebar_description[]',
							'repeater'    => 'sidebars',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'CSS Class', 'insert-headers-and-footers' ),
							'description' => __( 'Use an unique CSS class name for better control over this sidebar\'s styles in the admin.', 'insert-headers-and-footers' ),
							'id'          => 'sidebar_css_class',
							'name'        => 'sidebar_css_class[]',
							'repeater'    => 'sidebars',
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'html',
							'label'       => __( 'Before Title', 'insert-headers-and-footers' ),
							'description' => __( 'HTML code to add before each widget title.', 'insert-headers-and-footers' ),
							'id'          => 'before_title',
							'name'        => 'before_title[]',
							'repeater'    => 'sidebars',
							'default'     => '<h2 class="widgettitle">',
						),
						array(
							'type'        => 'html',
							'label'       => __( 'After Title', 'insert-headers-and-footers' ),
							'description' => __( 'HTML code to add after each widget title.', 'insert-headers-and-footers' ),
							'id'          => 'after_title',
							'name'        => 'after_title[]',
							'repeater'    => 'sidebars',
							'default'     => '</h2>',
						),
						array(
							'type'        => 'html',
							'label'       => __( 'Before Widget', 'insert-headers-and-footers' ),
							'description' => __( 'HTML code to add before each widget.', 'insert-headers-and-footers' ),
							'id'          => 'before_widget',
							'name'        => 'before_widget[]',
							'repeater'    => 'sidebars',
							'default'     => '<li id="%1$s" class="widget %2$s">',
						),
						array(
							'type'        => 'html',
							'label'       => __( 'After Widget', 'insert-headers-and-footers' ),
							'description' => __( 'HTML code to add after each widget.', 'insert-headers-and-footers' ),
							'id'          => 'after_widget',
							'name'        => 'after_widget[]',
							'repeater'    => 'sidebars',
							'default'     => '</li>',
						),
						array(
							'type' => 'spacer',
						),
					),
					// Column 3.
					array(
						array(
							'type'    => 'description',
							'label'   => __( 'Add another sidebar', 'insert-headers-and-footers' ),
							'content' => __( 'Use the "Add Sidebar" button below to add as many sidebars as you need.', 'insert-headers-and-footers' ),
						),
						array(
							'type'        => 'repeater_button',
							'button_text' => __( 'Add Sidebar', 'insert-headers-and-footers' ),
							'id'          => 'sidebars', // Repeater to repeat when clicked.
						),
					),
				),
			),
		);
	}

	/**
	 * Get the snippet code with dynamic values applied.
	 *
	 * @return string
	 */
	public function get_snippet_code() {

		$sidebar_id   = $this->get_value( 'sidebar_id' );
		$sidebar_code = '';

		$values = array(
			'name'          => 'sidebar_name',
			'description'   => 'sidebar_description',
			'class'         => 'sidebar_css_class',
			'before_title'  => 'before_title',
			'after_title'   => 'after_title',
			'before_widget' => 'before_widget',
			'after_widget'  => 'after_widget',
		);

		if ( ! empty( $sidebar_id ) ) {
			foreach ( $sidebar_id as $key => $id ) {
				if ( empty( $id ) ) {
					continue;
				}
				$id        = sanitize_title( $id );
				$optionals = '';
				foreach ( $values as $arg_key => $form_key ) {
					$form_values = $this->get_value( $form_key );

					$optionals .= $this->get_optional_value_code( $form_values[ $key ], $this->get_default_value( $form_key ), $arg_key, true );
				}

				$sidebar_code .= "
\$args = array(
		'id'                    => '$id',
$optionals); 
register_sidebar( \$args );
				";
			}
		}

		return '// Add Sidebars
function ' . $this->get_value( 'function_name' ) . '() {
    ' . $sidebar_code . '
}
add_action( \'widgets_init\', \'' . $this->get_value( 'function_name' ) . '\' );';
	}

}
includes/generator/class-wpcode-generator-menu.php000064400000013172151331545640016376 0ustar00<?php
/**
 * Generate a snippet for adding a custom navigation menu.
 *
 * @package WPCode
 */

/**
 * WPCode_Generator_Menu class.
 */
class WPCode_Generator_Menu extends WPCode_Generator_Type {

	/**
	 * The generator slug.
	 *
	 * @var string
	 */
	public $name = 'menu';

	/**
	 * The categories for this generator.
	 *
	 * @var string[]
	 */
	public $categories = array(
		'design',
	);

	/**
	 * Set the translatable strings.
	 *
	 * @return void
	 */
	protected function set_strings() {
		$this->title       = __( 'Navigation Menu', 'insert-headers-and-footers' );
		$this->description = __( 'Generate a snippet to register new navigation menus for your website.', 'insert-headers-and-footers' );
	}

	/**
	 * Load the generator tabs.
	 *
	 * @return void
	 */
	protected function load_tabs() {
		$this->tabs = array(
			'info'     => array(
				'label'   => __( 'Info', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						// Column 1 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Overview', 'insert-headers-and-footers' ),
							'content' => sprintf(
							// Translators: Placeholders add links to the wordpress.org references.
								__( 'This generator makes it easy to add new navigation menus to your website using the "register_nav_menus" function.', 'insert-headers-and-footers' ),
								'<a href="https://developer.wordpress.org/reference/functions/register_nav_menus/" target="_blank">',
								'</a>'
							),
						),
					),
					// Column 2.
					array(
						// Column 2 fields.
						array(
							'type'    => 'list',
							'label'   => __( 'Usage', 'insert-headers-and-footers' ),
							'content' => array(
								__( 'Fill in the forms using the menu on the left.', 'insert-headers-and-footers' ),
								__( 'Click the "Update Code" button.', 'insert-headers-and-footers' ),
								__( 'Click on "Use Snippet" to create a new snippet with the generated code.', 'insert-headers-and-footers' ),
								__( 'Activate and save the snippet and you\'re ready to go', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						// Column 3 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Examples', 'insert-headers-and-footers' ),
							'content' => __( 'You can add a new navigation menu for your website to display in a flyout menu that is not part of the theme, for example.', 'insert-headers-and-footers' ),
						),
					),
				),
			),
			'general'  => array(
				'label'   => __( 'General', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Function name', 'insert-headers-and-footers' ),
							'description' => __( 'Make this unique to avoid conflicts with other snippets', 'insert-headers-and-footers' ),
							'id'          => 'function_name',
							'placeholder' => 'add_custom_navigation_menu',
							'default'     => 'add_custom_navigation_menu' . time(),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Text Domain', 'insert-headers-and-footers' ),
							'description' => __( 'Optional text domain for translations.', 'insert-headers-and-footers' ),
							'id'          => 'text_domain',
							'placeholder' => 'text_domain',
							'default'     => 'text_domain',
						),
					),
				),
			),
			'schedule' => array(
				'label'   => __( 'Menus', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Menu name', 'insert-headers-and-footers' ),
							'description' => __( 'This is the menu name slug, lowercase and no space.', 'insert-headers-and-footers' ),
							'id'          => 'menu_name',
							'name'        => 'menu_name[]',
							'repeater'    => 'menus',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Menu label', 'insert-headers-and-footers' ),
							'description' => __( 'Add a descriptive label for this menu in the admin.', 'insert-headers-and-footers' ),
							'id'          => 'menu_description',
							'name'        => 'menu_description[]',
							'repeater'    => 'menus',
						),
					),
					// Column 2.
					array(
						array(
							'type'    => 'description',
							'label'   => __( 'Add another menu', 'insert-headers-and-footers' ),
							'content' => __( 'Use the "Add menu" button below to add as many menu locations as you need.', 'insert-headers-and-footers' ),
						),
						array(
							'type'        => 'repeater_button',
							'button_text' => __( 'Add Menu', 'insert-headers-and-footers' ),
							'id'          => 'menus', // Repeater to repeat when clicked.
						),
					),
				),
			),
		);
	}

	/**
	 * Get the snippet code with dynamic values applied.
	 *
	 * @return string
	 */
	public function get_snippet_code() {

		$menus        = $this->get_value( 'menu_name' );
		$descriptions = $this->get_value( 'menu_description' );
		$menus_code   = '';
		$textdomain   = $this->get_value( 'text_domain' );

		if ( ! empty( $menus ) ) {
			$array_code = '';
			foreach ( $menus as $key => $menu ) {
				if ( empty( $menu ) ) {
					continue;
				}
				$array_code .= "'$menu' => __( '$descriptions[$key]', '$textdomain' ),\n\t\t";
			}
			if ( ! empty( $array_code ) ) {
				$menus_code = "\$menus = array( 
		$array_code);
	register_nav_menus( \$menus );
			";
			}
		}

		return '// Add Custom Navigation Menus
function ' . $this->get_value( 'function_name' ) . '() {
    ' . $menus_code . '
}
add_action( \'init\', \'' . $this->get_value( 'function_name' ) . '\' );';
	}

}
includes/generator/class-wpcode-generator-cronjob.php000064400000017121151331545640017064 0ustar00<?php
/**
 * Generate a snippet for scheduling a cronjob.
 *
 * @package WPCode
 */

/**
 * WPCode_Generator_Cronjob class.
 */
class WPCode_Generator_Cronjob extends WPCode_Generator_Type {

	/**
	 * The generator slug.
	 *
	 * @var string
	 */
	public $name = 'cronjob';

	/**
	 * The categories for this generator.
	 *
	 * @var string[]
	 */
	public $categories = array(
		'core',
	);

	/**
	 * Set the translatable strings.
	 *
	 * @return void
	 */
	protected function set_strings() {
		$this->title       = __( 'Schedule a Cron Job', 'insert-headers-and-footers' );
		$this->description = __( 'Generate a snippet to schedule a recurring event using the WordPress cron.', 'insert-headers-and-footers' );
	}

	/**
	 * Load the generator tabs.
	 *
	 * @return void
	 */
	protected function load_tabs() {
		$this->tabs = array(
			'info'     => array(
				'label'   => __( 'Info', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						// Column 1 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Overview', 'insert-headers-and-footers' ),
							'content' => sprintf(
							// Translators: Placeholders add links to the wordpress.org references.
								__( 'This generator makes it easy to generate a snippet that will schedule a recurring event using %1$swp_schedule_event%2$s.', 'insert-headers-and-footers' ),
								'<a href="https://developer.wordpress.org/reference/functions/wp_schedule_event/" target="_blank">',
								'</a>'
							),
						),
					),
					// Column 2.
					array(
						// Column 2 fields.
						array(
							'type'    => 'list',
							'label'   => __( 'Usage', 'insert-headers-and-footers' ),
							'content' => array(
								__( 'Fill in the forms using the menu on the left.', 'insert-headers-and-footers' ),
								__( 'Click the "Update Code" button.', 'insert-headers-and-footers' ),
								__( 'Click on "Use Snippet" to create a new snippet with the generated code.', 'insert-headers-and-footers' ),
								__( 'Activate and save the snippet and you\'re ready to go', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						// Column 3 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Examples', 'insert-headers-and-footers' ),
							'content' => __( 'You may want to run some code once every hour, day or week, for example you could use this to send an email with the number of published posts every week.', 'insert-headers-and-footers' ),
						),
					),
				),
			),
			'general'  => array(
				'label'   => __( 'General', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Function name', 'insert-headers-and-footers' ),
							'description' => __( 'Make this unique to avoid conflicts with other snippets', 'insert-headers-and-footers' ),
							'id'          => 'function_name',
							'placeholder' => 'add_custom_schedule',
							'default'     => 'add_custom_schedule' . time(),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Text Domain', 'insert-headers-and-footers' ),
							'description' => __( 'Optional text domain for translations.', 'insert-headers-and-footers' ),
							'id'          => 'text_domain',
							'placeholder' => 'text_domain',
							'default'     => 'text_domain',
						),
					),
				),
			),
			'schedule' => array(
				'label'   => __( 'Schedule', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Recurrence', 'insert-headers-and-footers' ),
							'description' => __( 'Choose how often you want this event to run.', 'insert-headers-and-footers' ),
							'id'          => 'recurrence',
							'default'     => 'hourly',
							'options'     => array(
								'hourly'     => __( 'Hourly', 'insert-headers-and-footers' ),
								'twicedaily' => __( 'Twice Daily', 'insert-headers-and-footers' ),
								'daily'      => __( 'Daily', 'insert-headers-and-footers' ),
								'custom'     => __( 'Custom', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Custom Recurrence Name', 'insert-headers-and-footers' ),
							'description' => __( 'This is the recurrence name slug, lowercase and no space.', 'insert-headers-and-footers' ),
							'id'          => 'recurrence_name',
							'default'     => 'biweekly',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Custom Recurrence Label', 'insert-headers-and-footers' ),
							'id'          => 'recurrence_label',
							'default'     => 'Once every 2 weeks',
							'description' => __( 'This label will be used in a list of cron events, for example.', 'insert-headers-and-footers' ),
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Custom Recurrence Interval', 'insert-headers-and-footers' ),
							'id'          => 'recurrence_interval',
							'default'     => 1209600,
							'description' => __( 'The number of seconds of this interval.', 'insert-headers-and-footers' ),
						),
					),
				),
			),
			'hook'     => array(
				'label'   => __( 'Code', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Hook name', 'insert-headers-and-footers' ),
							'description' => __( 'Unique name of your hook used to run when scheduled.', 'insert-headers-and-footers' ),
							'id'          => 'hook_name',
							'default'     => 'do_custom_event_' . time(),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'textarea',
							'label'       => __( 'PHP Code', 'insert-headers-and-footers' ),
							'description' => __( 'Custom PHP code that will run when the event is triggered.', 'insert-headers-and-footers' ),
							'id'          => 'code',
							'code'        => true,
						),
					),
				),
			),
		);
	}

	/**
	 * Get the snippet code with dynamic values applied.
	 *
	 * @return string
	 */
	public function get_snippet_code() {

		$function_name       = $this->sanitize_function_name( $this->get_value( 'function_name' ) );
		$hook_name           = $this->sanitize_function_name( $this->get_value( 'hook_name' ) );
		$interval            = $this->get_value( 'recurrence' );
		$recurrence_interval = intval( $this->get_value( 'recurrence_interval' ) );
		$custom_recurrence   = '';

		if ( 'custom' === $interval ) {
			$recurrence_function_name = 'custom_cron_recurrence_' . time();
			$recurrence_name          = $this->sanitize_function_name( $this->get_value( 'recurrence_name' ) );
			$interval                 = $recurrence_name;

			$custom_recurrence = "
function $recurrence_function_name( \$schedules ) {
	\$schedules['$recurrence_name'] = array(
		'display' => __( '{$this->get_value('recurrence_label')}', '{$this->get_value('text_domain')}' ),
		'interval' => $recurrence_interval,
	);
				
	return \$schedules;
}
add_filter( 'cron_schedules', '$recurrence_function_name' );
			";
		}

		return '// Schedule a cron event.
function ' . $hook_name . '() {
    ' . $this->get_value( 'code' ) . '
}
add_action( \'' . $hook_name . '\', \'' . $hook_name . '\' );

' . $custom_recurrence . '
 
function ' . $function_name . '() {
    if ( ! wp_next_scheduled( \'' . $hook_name . '\' ) ) {
        wp_schedule_event( time(), \'' . $interval . '\', \'' . $hook_name . '\' );
    }
}
add_action( \'wp\', \'' . $function_name . '\' );';
	}

}
includes/generator/class-wpcode-generator-admin-bar.php000064400000020703151331545640017262 0ustar00<?php
/**
 * Generate a snippet to add a custom menu to the admin bar.
 *
 * @package WPCode
 */

/**
 * The Post Status generator.
 */
class WPCode_Generator_Admin_Bar extends WPCode_Generator_Type {

	/**
	 * The generator slug.
	 *
	 * @var string
	 */
	public $name = 'admin-bar';

	/**
	 * The categories for this generator.
	 *
	 * @var string[]
	 */
	public $categories = array(
		'admin',
	);

	/**
	 * Set the translatable strings.
	 *
	 * @return void
	 */
	protected function set_strings() {
		$this->title       = __( 'Admin Bar Menu', 'insert-headers-and-footers' );
		$this->description = __( 'Add a custom admin bar menu with links or content.', 'insert-headers-and-footers' );
	}

	/**
	 * Load the generator tabs.
	 *
	 * @return void
	 */
	protected function load_tabs() {
		$this->tabs = array(
			'info'    => array(
				'label'   => __( 'Info', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						// Column 1 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Overview', 'insert-headers-and-footers' ),
							'content' => __( 'Generate a snippet to add a custom menu to the admin bar by filling in a simple form.', 'insert-headers-and-footers' ),
						),
					),
					// Column 2.
					array(
						// Column 2 fields.
						array(
							'type'    => 'list',
							'label'   => __( 'Usage', 'insert-headers-and-footers' ),
							'content' => array(
								__( 'Fill in the forms sections using the menu on the left.', 'insert-headers-and-footers' ),
								__( 'Click the "Update Code" button.', 'insert-headers-and-footers' ),
								__( 'Click on "Use Snippet" to create a new snippet with the generated code.', 'insert-headers-and-footers' ),
								__( 'Activate and save the snippet and you\'re ready to go', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						// Column 3 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Examples', 'insert-headers-and-footers' ),
							'content' => __( 'You could add a new admin bar menu for links you use often, a list of posts, a site you often visit when in the admin, etc.', 'insert-headers-and-footers' ),
						),
					),
				),
			),
			'general' => array(
				'label'   => __( 'General', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Function name', 'insert-headers-and-footers' ),
							'description' => __( 'Make this unique to avoid conflicts with other snippets', 'insert-headers-and-footers' ),
							'id'          => 'function_name',
							'placeholder' => 'add_admin_bar_item',
							'default'     => 'add_admin_bar_item' . time(),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Position', 'insert-headers-and-footers' ),
							'description' => __( 'Select where you want the menu item to be displayed on the admin bar.', 'insert-headers-and-footers' ),
							'id'          => 'priority',
							'default'     => '1100',
							'options'     => array(
								'1100' => __( 'Last item on the left', 'insert-headers-and-footers' ),
								'30'   => __( 'Before Site Name', 'insert-headers-and-footers' ),
								'50'   => __( 'After Site Name', 'insert-headers-and-footers' ),
								'70'   => __( 'Before "New" Button', 'insert-headers-and-footers' ),
								'80'   => __( 'After "New" Button', 'insert-headers-and-footers' ),
							),
						),
					),
				),
			),
			'menu'    => array(
				'label'   => __( 'Menu Structure', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Menu ID', 'insert-headers-and-footers' ),
							'description' => __( 'Unique menu id for the admin bar menu.', 'insert-headers-and-footers' ),
							'id'          => 'menu_id',
							'placeholder' => 'custom_menu_id',
							'default'     => 'custom_menu_id',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Menu Title', 'insert-headers-and-footers' ),
							'description' => __( 'Text or HTML that will show up in the admin bar top-level item. Use HTML if you want to display an image.', 'insert-headers-and-footers' ),
							'id'          => 'menu_title',
							'placeholder' => '',
							'default'     => '',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Menu item link', 'insert-headers-and-footers' ),
							'description' => __( 'If left empty, the top level menu item will not be a link, just text.', 'insert-headers-and-footers' ),
							'id'          => 'menu_href',
							'placeholder' => '',
							'default'     => '',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Menu item target', 'insert-headers-and-footers' ),
							'description' => __( 'The menu item is a link use this field to set the target attribute. Use "_blank" to open the link in a new tab.', 'insert-headers-and-footers' ),
							'id'          => 'menu_target',
							'placeholder' => '',
							'default'     => '',
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Submenu Item Title', 'insert-headers-and-footers' ),
							'description' => __( 'Text or HTML for the submenu item.', 'insert-headers-and-footers' ),
							'id'          => 'submenu_title',
							'name'        => 'submenu_title[]',
							'placeholder' => '',
							'repeater'    => 'submenu',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Submenu item link', 'insert-headers-and-footers' ),
							'description' => __( 'If left empty, this menu item will not be a link, just text.', 'insert-headers-and-footers' ),
							'id'          => 'submenu_href',
							'name'        => 'submenu_href[]',
							'placeholder' => '',
							'repeater'    => 'submenu',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Submenu item target attribute', 'insert-headers-and-footers' ),
							'description' => __( 'If the menu item is a link use this for the target attribute. Use "_blank" to open in a new tab.', 'insert-headers-and-footers' ),
							'id'          => 'submenu_target',
							'name'        => 'submenu_target[]',
							'placeholder' => '',
							'repeater'    => 'submenu',
						),
					),
					// Column 3.
					array(
						array(
							'type'    => 'description',
							'label'   => __( 'Add more submenu items', 'insert-headers-and-footers' ),
							'content' => __( 'Use the "Add submenu item" button below to add multiple submenu items.', 'insert-headers-and-footers' ),
						),
						array(
							'type'        => 'repeater_button',
							'button_text' => __( 'Add submenu item', 'insert-headers-and-footers' ),
							'id'          => 'submenu', // Repeater to repeat when clicked.
						),
					),
				),
			),
		);
	}

	/**
	 * Get the snippet code with dynamic values applied.
	 *
	 * @return string
	 */
	public function get_snippet_code() {

		$submenu_titles  = $this->get_value( 'submenu_title' );
		$submenu_hrefs   = $this->get_value( 'submenu_href' );
		$submenu_targets = $this->get_value( 'submenu_target' );
		$submenus_code   = '';

		if ( ! empty( $submenu_titles ) ) {
			foreach ( $submenu_titles as $key => $submenu_title ) {
				if ( empty( $submenu_title ) ) {
					continue;
				}
				$submenu_href   = empty( $submenu_hrefs[ $key ] ) ? '' : $submenu_hrefs[ $key ];
				$submenu_target = empty( $submenu_targets[ $key ] ) ? '' : $submenu_targets[ $key ];

				$submenus_code .= "
	\$admin_bar->add_menu(
		array(
			'id'     => 'submenu_{$this->get_value( 'menu_id' )}_$key',
			'parent' => '{$this->get_value( 'menu_id' )}',
			'title'  => '$submenu_title',
			'href'   => '$submenu_href',
			'meta'   => array(
				'target' => '$submenu_target',
			),
 		)
	);
			";
			}
		}

		return '// Add a custom menu item.

function ' . $this->get_value( 'function_name' ) . '( $admin_bar ) {
	$admin_bar->add_menu(
		array(
			\'id\'     => \'' . $this->get_value( 'menu_id' ) . '\',
			\'title\'  => \'' . $this->get_value( 'menu_title' ) . '\',
			\'href\'   => \'' . $this->get_value( 'menu_href' ) . '\',
			\'meta\'   => array(
				\'target\' => \'' . $this->get_value( 'menu_target' ) . '\',
			),
		)
	);
	' . $submenus_code . '
}

add_action( \'admin_bar_menu\', \'' . $this->get_value( 'function_name' ) . '\', ' . $this->get_value( 'priority' ) . ' );
';
	}

}
includes/generator/class-wpcode-generator-script.php000064400000025565151331545640016747 0ustar00<?php
/**
 * Generate a snippet to enqueue scripts.
 *
 * @package WPCode
 */

/**
 * WPCode_Generator_Script class.
 */
class WPCode_Generator_Script extends WPCode_Generator_Type {

	/**
	 * The generator slug.
	 *
	 * @var string
	 */
	public $name = 'enqueue_script';

	/**
	 * The categories for this generator.
	 *
	 * @var string[]
	 */
	public $categories = array(
		'core',
	);

	/**
	 * Set the translatable strings.
	 *
	 * @return void
	 */
	protected function set_strings() {
		$this->title       = __( 'Register Scripts', 'insert-headers-and-footers' );
		$this->description = __( 'Generate a snippet to load JavaScript scripts using wp_register_script.', 'insert-headers-and-footers' );
	}

	/**
	 * Load the generator tabs.
	 *
	 * @return void
	 */
	protected function load_tabs() {
		$this->tabs = array(
			'info'    => array(
				'label'   => __( 'Info', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						// Column 1 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Overview', 'insert-headers-and-footers' ),
							'content' => __( 'Using this generator you can create a WordPress function to register and enqueue scripts.', 'insert-headers-and-footers' ),
						),
					),
					// Column 2.
					array(
						// Column 2 fields.
						array(
							'type'    => 'list',
							'label'   => __( 'Usage', 'insert-headers-and-footers' ),
							'content' => array(
								__( 'Fill in the forms using the menu on the left.', 'insert-headers-and-footers' ),
								__( 'Click the "Update Code" button.', 'insert-headers-and-footers' ),
								__( 'Click on "Use Snippet" to create a new snippet with the generated code.', 'insert-headers-and-footers' ),
								__( 'Activate and save the snippet and you\'re ready to go', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						// Column 3 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Examples', 'insert-headers-and-footers' ),
							'content' => sprintf(
							// Translators: the placeholders add a link to getboostrap.com.
								__( 'You can use this to load external scripts or even scripts from a theme or plugin. For example, you could load %1$sbootstrap%2$s from a cdn.', 'insert-headers-and-footers' ),
								'<a href="https://getbootstrap.com/" target="_blank">',
								'</a>'
							),
						),
					),
				),
			),
			'general' => array(
				'label'   => __( 'General', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Function name', 'insert-headers-and-footers' ),
							'description' => __( 'Make this unique to avoid conflicts with other snippets', 'insert-headers-and-footers' ),
							'id'          => 'function_name',
							'placeholder' => 'add_custom_script',
							'default'     => 'add_custom_script' . time(),
							// This makes it unique for people who don't want to customize.
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Action (hook)', 'insert-headers-and-footers' ),
							'description' => sprintf(
							// Translators: placeholders add links to documentation on wordpress.org.
								__( 'Hook used to add the scripts: %1$sfrontend%2$s, %3$sadmin%4$s, %5$slogin%6$s or %7$sembed%8$s.', 'insert-headers-and-footers' ),
								'<a href="https://developer.wordpress.org/reference/hooks/wp_enqueue_scripts/" target="_blank">',
								'</a>',
								'<a href="https://developer.wordpress.org/reference/hooks/admin_enqueue_scripts/" target="_blank">',
								'</a>',
								'<a href="https://developer.wordpress.org/reference/hooks/login_enqueue_scripts/" target="_blank">',
								'</a>',
								'<a href="https://developer.wordpress.org/reference/hooks/enqueue_embed_scripts/" target="_blank">',
								'</a>'
							),
							'id'          => 'hook',
							'default'     => 'wp_enqueue_scripts',
							'options'     => array(
								// Translators: placeholder adds the hook name.
								'wp_enqueue_scripts'    => sprintf( __( 'Frontend (%s)', 'insert-headers-and-footers' ), 'wp_enqueue_scripts' ),
								// Translators: placeholder adds the hook name.
								'admin_enqueue_scripts' => sprintf( __( 'Admin (%s)', 'insert-headers-and-footers' ), 'admin_enqueue_scripts' ),
								// Translators: placeholder adds the hook name.
								'login_enqueue_scripts' => sprintf( __( 'Login (%s)', 'insert-headers-and-footers' ), 'login_enqueue_scripts' ),
								// Translators: placeholder adds the hook name.
								'enqueue_embed_scripts' => sprintf( __( 'Embed (%s)', 'insert-headers-and-footers' ), 'enqueue_embed_scripts' ),
							),
						),
					),
				),
			),
			'scripts' => array(
				'label'   => __( 'Scripts', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Script name', 'insert-headers-and-footers' ),
							'description' => __( 'This will be used as an identifier in the code, should be lowercase with no spaces.', 'insert-headers-and-footers' ),
							'id'          => 'script_name',
							'name'        => 'script_name[]',
							'default'     => '',
							'placeholder' => '',
							'repeater'    => 'script',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Script URL', 'insert-headers-and-footers' ),
							'description' => __( 'The full URL for the script e.g. https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js.', 'insert-headers-and-footers' ),
							'id'          => 'script_url',
							'name'        => 'script_url[]',
							'default'     => '',
							'placeholder' => '',
							'repeater'    => 'script',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Dependencies', 'insert-headers-and-footers' ),
							'description' => __( 'Comma-separated list of scripts required for this script to load, e.g. jquery', 'insert-headers-and-footers' ),
							'id'          => 'script_dependencies',
							'name'        => 'script_dependencies[]',
							'default'     => '',
							'placeholder' => '',
							'repeater'    => 'script',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Script Version', 'insert-headers-and-footers' ),
							'description' => __( 'The script version.', 'insert-headers-and-footers' ),
							'id'          => 'script_version',
							'name'        => 'script_version[]',
							'default'     => '1.0.0',
							'placeholder' => '',
							'repeater'    => 'script',
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Header or Footer?', 'insert-headers-and-footers' ),
							'description' => __( 'Load the script in the page head or in the footer.', 'insert-headers-and-footers' ),
							'id'          => 'script_location',
							'name'        => 'script_location[]',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Footer', 'insert-headers-and-footers' ),
								'false' => __( 'Header', 'insert-headers-and-footers' ),
							),
							'repeater'    => 'script',
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Deregister script?', 'insert-headers-and-footers' ),
							'description' => sprintf(
							// Translators: Placeholders for wp.org docs link.
								__( 'Should the script be %1$sderegistered%2$s first? (for example, if you are replacing an existing script).', 'insert-headers-and-footers' ),
								'<a href="https://developer.wordpress.org/reference/functions/wp_deregister_script/" target="_blank">',
								'</a>'
							),
							'id'          => 'script_deregister',
							'name'        => 'script_deregister[]',
							'default'     => 'false',
							'options'     => array(
								'false' => __( 'No', 'insert-headers-and-footers' ),
								'true'  => __( 'Yes', 'insert-headers-and-footers' ),
							),
							'repeater'    => 'script',
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Enqueue script?', 'insert-headers-and-footers' ),
							'description' => sprintf(
							// Translators: Placeholders for wp.org docs link.
								__( 'Should the script be %1$senqueued%2$s or just registered? (select "No" only if you intend enqueueing it later.', 'insert-headers-and-footers' ),
								'<a href="https://developer.wordpress.org/reference/functions/wp_enqueue_script/" target="_blank">',
								'</a>'
							),
							'id'          => 'script_enqueue',
							'name'        => 'script_enqueue[]',
							'default'     => 'true',
							'options'     => array(
								'true'  => __( 'Yes', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
							'repeater'    => 'script',
						),
						array(
							'type' => 'spacer',
						),
					),
					// Column 3.
					array(
						array(
							'type'    => 'description',
							'label'   => __( 'Add more scripts', 'insert-headers-and-footers' ),
							'content' => __( 'Use the "Add script" button below to add multiple scripts in this snippet.', 'insert-headers-and-footers' ),
						),
						array(
							'type'        => 'repeater_button',
							'button_text' => __( 'Add script', 'insert-headers-and-footers' ),
							'id'          => 'script', // Repeater to repeat when clicked.
						),
					),
				),
			),
		);
	}

	/**
	 * Get the snippet code with dynamic values applied.
	 *
	 * @return string
	 */
	public function get_snippet_code() {

		$scripts            = $this->get_value( 'script_name' );
		$scripts_urls       = $this->get_value( 'script_url' );
		$scripts_deps       = $this->get_value( 'script_dependencies' );
		$scripts_versions   = $this->get_value( 'script_version' );
		$scripts_locations  = $this->get_value( 'script_location' );
		$scripts_deregister = $this->get_value( 'script_deregister' );
		$scripts_enqueue    = $this->get_value( 'script_enqueue' );
		$code               = '';

		if ( ! empty( $scripts ) ) {
			foreach ( $scripts as $key => $script_name ) {
				if ( empty( $script_name ) ) {
					continue;
				}
				$script_name  = sanitize_title( $script_name );
				$dependencies = explode( ',', $scripts_deps[ $key ] );
				$deregister   = 'true' === $scripts_deregister[ $key ] ? "wp_deregister_script( '$script_name' );" : '';
				$enqueue      = 'true' === $scripts_enqueue[ $key ] ? "wp_enqueue_script( '$script_name' );" : '';

				$code .= "
			$deregister
			wp_register_script( '$script_name', '$scripts_urls[$key]', {$this->array_to_code_string($dependencies)}, '$scripts_versions[$key]', $scripts_locations[$key] );
			$enqueue
			";
			}
		}

		return '// Add custom scripts
function ' . $this->get_value( 'function_name' ) . '() {
' . $code . '
}
add_action( \'' . $this->get_value( 'hook' ) . '\', \'' . $this->get_value( 'function_name' ) . '\' );';
	}

}
includes/generator/class-wpcode-generator-post-status.php000064400000017310151331545640017736 0ustar00<?php
/**
 * Generate a snippet to register a new post status.
 *
 * @package WPCode
 */

/**
 * The Post Status generator.
 */
class WPCode_Generator_Post_Status extends WPCode_Generator_Type {

	/**
	 * The generator slug.
	 *
	 * @var string
	 */
	public $name = 'post-status';

	/**
	 * The categories for this generator.
	 *
	 * @var string[]
	 */
	public $categories = array(
		'content',
	);

	/**
	 * Set the translatable strings.
	 *
	 * @return void
	 */
	protected function set_strings() {
		$this->title       = __( 'Post Status', 'insert-headers-and-footers' );
		$this->description = __( 'Use this tool to generate a custom post status for your posts.', 'insert-headers-and-footers' );
	}

	/**
	 * Load the generator tabs.
	 *
	 * @return void
	 */
	protected function load_tabs() {
		$this->tabs = array(
			'info'       => array(
				'label'   => __( 'Info', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						// Column 1 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Overview', 'insert-headers-and-footers' ),
							'content' => __( 'Generate custom post statuses for your posts to improve the way you manage content.', 'insert-headers-and-footers' ),
						),
					),
					// Column 2.
					array(
						// Column 2 fields.
						array(
							'type'    => 'list',
							'label'   => __( 'Usage', 'insert-headers-and-footers' ),
							'content' => array(
								__( 'Fill in the forms using the menu on the left.', 'insert-headers-and-footers' ),
								__( 'Click the "Update Code" button.', 'insert-headers-and-footers' ),
								__( 'Click on "Use Snippet" to create a new snippet with the generated code.', 'insert-headers-and-footers' ),
								__( 'Activate and save the snippet and you\'re ready to go', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						// Column 3 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Examples', 'insert-headers-and-footers' ),
							'content' => __( 'You could add a new status called "Pending Review" that your authors can use before the content will be published', 'insert-headers-and-footers' ),
						),
					),
				),
			),
			'general'    => array(
				'label'   => __( 'General', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Function name', 'insert-headers-and-footers' ),
							'description' => __( 'Make this unique to avoid conflicts with other snippets', 'insert-headers-and-footers' ),
							'id'          => 'function_name',
							'placeholder' => 'custom_post_status',
							'default'     => 'custom_post_status' . time(),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Text Domain', 'insert-headers-and-footers' ),
							'description' => __( 'Optional text domain for translations.', 'insert-headers-and-footers' ),
							'id'          => 'text_domain',
							'placeholder' => 'text_domain',
							'default'     => 'text_domain',
						),
					),
				),
			),
			'status'     => array(
				'label'   => __( 'Status', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Post Status', 'insert-headers-and-footers' ),
							'description' => __( 'Name of status used in the code, lowercase maximum 32 characters.', 'insert-headers-and-footers' ),
							'id'          => 'post_status',
							'placeholder' => 'pending',
							'default'     => 'pending',
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Name', 'insert-headers-and-footers' ),
							'description' => __( 'The singular name that will be displayed in the admin. ', 'insert-headers-and-footers' ),
							'id'          => 'label',
							'placeholder' => 'Pending',
							'default'     => 'Pending',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Name (Plural)', 'insert-headers-and-footers' ),
							'description' => __( 'The post status plural name. For example: Drafts.', 'insert-headers-and-footers' ),
							'id'          => 'label_count',
							'placeholder' => 'Pending',
							'default'     => 'Pending',
						),
					),
				),
			),
			'visibility' => array(
				'label'   => __( 'Visibility', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Public', 'insert-headers-and-footers' ),
							'description' => __( 'Should the posts with this status be visible in the frontend?', 'insert-headers-and-footers' ),
							'id'          => 'public',
							'options'     => array(
								'true'  => __( 'Yes - Default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
							'default'     => 'true',
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Exclude from search results', 'insert-headers-and-footers' ),
							'description' => __( 'Should the posts with this status be visible in the frontend?', 'insert-headers-and-footers' ),
							'id'          => 'exclude_from_search',
							'options'     => array(
								'true'  => __( 'Yes', 'insert-headers-and-footers' ),
								'false' => __( 'No - Default', 'insert-headers-and-footers' ),
							),
							'default'     => 'false',
						),
					),
					// Column 3.
					array(
						array(
							'type'        => 'select',
							'label'       => __( 'Show in admin all list', 'insert-headers-and-footers' ),
							'description' => __( 'Show statuses in the edit listing of the post.', 'insert-headers-and-footers' ),
							'id'          => 'show_in_admin_all_list',
							'options'     => array(
								'true'  => __( 'Yes - Default', 'insert-headers-and-footers' ),
								'false' => __( 'No', 'insert-headers-and-footers' ),
							),
							'default'     => 'true',
						),
						array(
							'type'        => 'select',
							'label'       => __( 'Show in admin status list', 'insert-headers-and-footers' ),
							'description' => __( 'Show statuses list at the top of the edit listings. e.g. Published (12) Custom Status (2)', 'insert-headers-and-footers' ),
							'id'          => 'show_in_admin_status_list',
							'options'     => array(
								'true'  => __( 'Yes', 'insert-headers-and-footers' ),
								'false' => __( 'No - Default', 'insert-headers-and-footers' ),
							),
							'default'     => 'false',
						),
					),
				),
			),
		);
	}

	/**
	 * Get the snippet code with dynamic values applied.
	 *
	 * @return string
	 */
	public function get_snippet_code() {
		return '// Register Custom Status
function '. $this->get_value( 'function_name' ) . '() {

	$args = array(
		\'label\'                     => _x( \'' . $this->get_value( 'label' ) . '\', \'Post Status Name\', \'' . $this->get_value( 'text_domain' ) . '\' ),
		\'label_count\'               => _n_noop( \'' . $this->get_value( 'label' ) . ' (%s)\',  \'' . $this->get_value( 'label_count' ) . ' (%s)\', \'' . $this->get_value( 'text_domain' ) . '\' ), 
		\'public\'                    => ' . $this->get_value( 'public' ) . ',
		\'show_in_admin_all_list\'    => ' . $this->get_value( 'show_in_admin_all_list' ) . ',
		\'show_in_admin_status_list\' => ' . $this->get_value( 'show_in_admin_status_list' ) . ',
		\'exclude_from_search\'       => ' . $this->get_value( 'exclude_from_search' ) . ',
	);
	register_post_status( \'' . $this->get_value( 'post_status' ) . '\', $args );

}
add_action( \'init\', \'' . $this->get_value( 'function_name' ) . '\', 5 );';
	}

}
includes/generator/class-wpcode-generator-contact-methods.php000064400000013631151331545640020526 0ustar00<?php
/**
 * Generate a snippet to add a extra contact methods to user profiles.
 *
 * @package WPCode
 */

/**
 * The Contact Methods generator.
 */
class WPCode_Generator_Contact_Methods extends WPCode_Generator_Type {

	/**
	 * The generator slug.
	 *
	 * @var string
	 */
	public $name = 'contact-methods';

	/**
	 * The categories for this generator.
	 *
	 * @var string[]
	 */
	public $categories = array(
		'admin',
	);

	/**
	 * Set the translatable strings.
	 *
	 * @return void
	 */
	protected function set_strings() {
		$this->title       = __( 'Contact Methods', 'insert-headers-and-footers' );
		$this->description = __( 'Add additional contact methods to WordPress user profiles.', 'insert-headers-and-footers' );
	}

	/**
	 * Load the generator tabs.
	 *
	 * @return void
	 */
	protected function load_tabs() {
		$this->tabs = array(
			'info'    => array(
				'label'   => __( 'Info', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						// Column 1 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Overview', 'insert-headers-and-footers' ),
							'content' => __( 'Use this generator to create a snippet which adds more contact methods to your WordPress users profiles.', 'insert-headers-and-footers' ),
						),
					),
					// Column 2.
					array(
						// Column 2 fields.
						array(
							'type'    => 'list',
							'label'   => __( 'Usage', 'insert-headers-and-footers' ),
							'content' => array(
								__( 'Fill in the forms sections using the menu on the left.', 'insert-headers-and-footers' ),
								__( 'Click the "Update Code" button.', 'insert-headers-and-footers' ),
								__( 'Click on "Use Snippet" to create a new snippet with the generated code.', 'insert-headers-and-footers' ),
								__( 'Activate and save the snippet and you\'re ready to go', 'insert-headers-and-footers' ),
							),
						),
					),
					// Column 3.
					array(
						// Column 3 fields.
						array(
							'type'    => 'description',
							'label'   => __( 'Examples', 'insert-headers-and-footers' ),
							'content' => __( 'You can add extra fields for user profiles like their extended address, city, country, phone number, social media profiles (Facebook, Twitter, etc).', 'insert-headers-and-footers' ),
						),
					),
				),
			),
			'general' => array(
				'label'   => __( 'General', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Function name', 'insert-headers-and-footers' ),
							'description' => __( 'Make this unique to avoid conflicts with other snippets.', 'insert-headers-and-footers' ),
							'id'          => 'function_name',
							'placeholder' => 'add_custom_contact_methods',
							'default'     => 'add_custom_contact_methods_' . time(),
						),
					),
					// Column 2.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Text Domain', 'insert-headers-and-footers' ),
							'description' => __( 'Optional text domain for translations.', 'insert-headers-and-footers' ),
							'id'          => 'text_domain',
							'placeholder' => 'text_domain',
							'default'     => 'text_domain',
						),
					),
				),
			),
			'methods' => array(
				'label'   => __( 'Contact Methods', 'insert-headers-and-footers' ),
				'columns' => array(
					// Column 1.
					array(
						array(
							'type'        => 'text',
							'label'       => __( 'Contact Method Slug', 'insert-headers-and-footers' ),
							'description' => __( 'A lowercase with no spaces slug for usage in the code. For example: "facebook" or "telephone".', 'insert-headers-and-footers' ),
							'id'          => 'contact_method_name',
							'name'        => 'contact_method_name[]',
							'placeholder' => '',
							'repeater'    => 'contact_methods',
						),
						array(
							'type'        => 'text',
							'label'       => __( 'Contact Method Label', 'insert-headers-and-footers' ),
							'description' => __( 'This will show up as a label next to the contact method field. For example: "Facebook URL" or "Phone number".', 'insert-headers-and-footers' ),
							'id'          => 'contact_method_description',
							'name'        => 'contact_method_description[]',
							'placeholder' => '',
							'repeater'    => 'contact_methods',
						),
					),
					// Column 3.
					array(
						array(
							'type'    => 'description',
							'label'   => __( 'Add more contact methods', 'insert-headers-and-footers' ),
							'content' => __( 'Use the "Add contact method" button below to add as many contact methods as you wish.', 'insert-headers-and-footers' ),
						),
						array(
							'type'        => 'repeater_button',
							'button_text' => __( 'Add contact method', 'insert-headers-and-footers' ),
							'id'          => 'contact_methods', // Repeater to repeat when clicked.
						),
					),
				),
			),
		);
	}

	/**
	 * Get the snippet code with dynamic values applied.
	 *
	 * @return string
	 */
	public function get_snippet_code() {

		$contact_method_names        = $this->get_value( 'contact_method_name' );
		$contact_method_descriptions = $this->get_value( 'contact_method_description' );

		$contact_methods_code = '';

		if ( ! empty( $contact_method_names ) ) {
			foreach ( $contact_method_names as $key => $method_name ) {
				if ( empty( $method_name ) ) {
					continue;
				}
				$method_name = sanitize_title( $method_name );
				$description = empty( $contact_method_descriptions[ $key ] ) ? '' : $contact_method_descriptions[ $key ];

				$contact_methods_code .= "
	\$contact_methods[ '$method_name' ] = __( '$description', '{$this->get_value('text_domain')}' );";
			}
		}

		return '// Add custom contact methods

function ' . $this->get_value('function_name') . '( $contact_methods ) {
    ' . $contact_methods_code . '
    
    return $contact_methods;
}

add_filter( \'user_contactmethods\', \'' . $this->get_value('function_name') . '\' );
';
	}

}
includes/execute/class-wpcode-snippet-execute-type.php000064400000003400151331545640017214 0ustar00<?php
/**
 * Abstract class for executing different type of snippets.
 *
 * @package wpcode
 */

/**
 * WPCode_Snippet_Execute_Type class.
 */
abstract class WPCode_Snippet_Execute_Type {

	/**
	 * The type of snippet.
	 *
	 * @var string
	 */
	public $type;

	/**
	 * Loaded post data.
	 *
	 * @var WPCode_Snippet
	 */
	public $snippet;

	/**
	 * Load the snippet by id or post object.
	 *
	 * @param WPCode_Snippet $snippet The snippet post or the id.
	 */
	public function __construct( $snippet ) {
		if ( empty( $snippet->attributes ) ) {
			$shortcode_attributes = $snippet->get_shortcode_attributes();
			foreach ( $shortcode_attributes as $attribute ) {
				$snippet->set_attribute( $attribute, '' );
			}
		}

		$this->snippet = $snippet;

	}

	/**
	 * Get the snippet prepared code and run it through a filter
	 * before returning it.
	 *
	 * @return string
	 */
	public function get_output() {
		if ( ! $this->has_snippet() ) {
			return '';
		}

		$code = $this->prepare_snippet_output();

		$output = apply_filters( "wpcode_snippet_output_{$this->type}", $code, $this->snippet );

		return apply_filters( 'wpcode_snippet_output', $output, $this->snippet );
	}

	/**
	 * Check if the snippet object is set.
	 *
	 * @return bool
	 */
	public function has_snippet() {
		return isset( $this->snippet );
	}

	/**
	 * Override this in child classes to add specific logic for each snippet type.
	 *
	 * @return string
	 */
	protected function prepare_snippet_output() {
		return '';
	}

	/**
	 * Get the snippet code.
	 *
	 * @return string
	 */
	public function get_snippet_code() {
		return $this->snippet->get_code();
	}

	/**
	 * Get the scss snippet code.
	 *
	 * @return string
	 */
	public function get_snippet_compiled_code() {
		return $this->snippet->get_compiled_code();
	}
}
includes/execute/class-wpcode-snippet-execute-html.php000064400000001056151331545640017204 0ustar00<?php
/**
 * Execute html snippets and return their output.
 * This is probably the simplest one.
 *
 * @package wpcode
 */

/**
 * WPCode_Snippet_Execute_HTML class.
 */
class WPCode_Snippet_Execute_HTML extends WPCode_Snippet_Execute_Type {

	/**
	 * The snippet type, HTML for this one.
	 *
	 * @var string
	 */
	public $type = 'html';

	/**
	 * Grab snippet code and return its output.
	 *
	 * @return string
	 */
	protected function prepare_snippet_output() {
		// There's nothing to prepare here at this point.
		return $this->get_snippet_code();
	}
}
includes/execute/class-wpcode-snippet-execute-text.php000064400000001205151331545640017220 0ustar00<?php
/**
 * Execute text snippets and return their output.
 *
 * @package wpcode
 */

/**
 * WPCode_Snippet_Execute_Text class.
 */
class WPCode_Snippet_Execute_Text extends WPCode_Snippet_Execute_Type {

	/**
	 * The snippet type, Text for this one.
	 *
	 * @var string
	 */
	public $type = 'text';

	/**
	 * Grab snippet code and return its output.
	 *
	 * @return string
	 */
	protected function prepare_snippet_output() {
		// There's nothing to prepare here at this point.
		if ( apply_filters( 'wpcode_text_execute_shortcodes', true ) ) {
			return do_shortcode( $this->get_snippet_code() );
		}

		return $this->get_snippet_code();
	}
}
includes/execute/class-wpcode-snippet-execute-css.php000064400000001164151331545640017030 0ustar00<?php
/**
 * Execute CSS snippets and return their output.
 *
 * @package wpcode
 */

/**
 * WPCode_Snippet_Execute_Text class.
 */
class WPCode_Snippet_Execute_CSS extends WPCode_Snippet_Execute_Type {

	/**
	 * The snippet type, JavaScript for this one.
	 *
	 * @var string
	 */
	public $type = 'css';

	/**
	 * Grab snippet code and return its output.
	 *
	 * @return string
	 */
	protected function prepare_snippet_output() {
		$code = $this->get_snippet_code();

		if ( ! empty( $code ) ) {
			// Wrap our code in a style tag.
			$code = '<style class="wpcode-css-snippet">' . $code . '</style>';
		}

		return $code;
	}
}
includes/execute/class-wpcode-snippet-execute-js.php000064400000001141151331545640016647 0ustar00<?php
/**
 * Execute JavaScript snippets and return their output.
 *
 * @package wpcode
 */

/**
 * WPCode_Snippet_Execute_Text class.
 */
class WPCode_Snippet_Execute_JS extends WPCode_Snippet_Execute_Type {

	/**
	 * The snippet type, JavaScript for this one.
	 *
	 * @var string
	 */
	public $type = 'js';

	/**
	 * Grab snippet code and return its output.
	 *
	 * @return string
	 */
	protected function prepare_snippet_output() {
		$code = $this->get_snippet_code();

		if ( ! empty( $code ) ) {
			// Wrap our code in a script tag.
			$code = '<script>' . $code . '</script>';
		}

		return $code;
	}
}
includes/execute/class-wpcode-snippet-execute-php.php000064400000001522151331545640017025 0ustar00<?php
/**
 * Execute php snippets and return their output.
 *
 * @package wpcode
 */

/**
 * WPCode_Snippet_Execute_PHP class.
 */
class WPCode_Snippet_Execute_PHP extends WPCode_Snippet_Execute_Type {

	/**
	 * The snippet type, PHP for this one.
	 *
	 * @var string
	 */
	public $type = 'php';

	/**
	 * Grab snippet code and return its output.
	 *
	 * @return string
	 */
	protected function prepare_snippet_output() {
		$code = $this->get_snippet_code();
		// If we're doing the activation, unslash the code similar to how it will be unslashed before saving in wp_insert_post.
		if ( wpcode()->execute->is_doing_activation() && isset( $_POST['wpcode_snippet_code'] ) ) {  // phpcs:ignore WordPress.Security.NonceVerification.Missing
			$code = wp_unslash( $code );
		}

		return wpcode()->execute->safe_execute_php( $code, $this->snippet );
	}
}
includes/execute/class-wpcode-snippet-execute-universal.php000064400000002056151331545640020251 0ustar00<?php
/**
 * Execute universal snippets and return their output.
 * This type handles both HTML and PHP at the same time in the same way
 * you can write both in a .php file.
 *
 * @package wpcode
 */

/**
 * WPCode_Snippet_Execute_Universal class.
 */
class WPCode_Snippet_Execute_Universal extends WPCode_Snippet_Execute_Type {

	/**
	 * The snippet type, Universal for this one.
	 *
	 * @var string
	 */
	public $type = 'universal';

	/**
	 * Grab snippet code and return its output.
	 *
	 * @return string
	 */
	protected function prepare_snippet_output() {

		$code = $this->get_snippet_code();
		// If we're doing the activation, unslash the code similar to how it will be unslashed before saving in wp_insert_post.
		if ( wpcode()->execute->is_doing_activation() && isset( $_POST['wpcode_snippet_code'] ) ) {  // phpcs:ignore WordPress.Security.NonceVerification.Missing
			$code = wp_unslash( $code );
		}

		// Wrap code with PHP tags, so it gets executed correctly.
		return wpcode()->execute->safe_execute_php( '?>' . $code . '<?php ', $this->snippet );
	}
}
includes/class-wpcode-library-auth.php000064400000015656151331545640014074 0ustar00<?php
/**
 * Class for handling the WPCode library authentication.
 *
 * @package WPCode
 */

/**
 * Class WPCode_Library_Auth.
 */
class WPCode_Library_Auth {
	/**
	 * The base api URL.
	 *
	 * @var string
	 */
	public $library_url = 'https://library.wpcode.com';

	/**
	 * Is the current plugin authenticated with the WPCode Library?
	 *
	 * @var bool
	 */
	private $has_auth;

	/**
	 * The api key used for authenticated requests to the library.
	 *
	 * @var string
	 */
	private $auth_key;

	/**
	 * The auth data from the db.
	 *
	 * @var array
	 */
	private $auth_data;

	/**
	 * Library auth constructor.
	 */
	public function __construct() {
		add_action( 'wp_ajax_wpcode_library_store_auth', array( $this, 'store_auth_key' ) );
		add_action( 'wp_ajax_wpcode_library_delete_auth', array( $this, 'delete_auth' ) );
	}

	/**
	 * Ajax handler that returns the auth url used to start the Connect process.
	 *
	 * @return string
	 */
	public function auth_url() {

		if ( $this->has_auth() ) {
			return '';
		}

		$site_name = get_bloginfo( 'name' );
		if ( empty( $site_name ) ) {
			$site_name = __( 'Your WordPress Site', 'insert-headers-and-footers' );
		}

		// This is needed, so we don't run into issues with special characters.
		// Base64 encode without padding for better compatibility between PHP versions.
		$site_name = rtrim( strtr( base64_encode( $site_name ), '+/', '-_' ), '=' );
		$ajax_url  = rtrim( strtr( base64_encode( admin_url( 'admin-ajax.php' ) ), '+/', '-_' ), '=' );

		$auth_url = add_query_arg(
			array(
				'site'    => $site_name,
				'version' => WPCODE_VERSION,
				'ajax'    => $ajax_url,
			),
			$this->get_api_url( 'connect' )
		);

		return $auth_url;
	}

	/**
	 * Get the full URL to an API endpoint by passing the path.
	 *
	 * @param string $path The path for the API endpoint.
	 *
	 * @return string
	 */
	public function get_api_url( $path ) {
		return trailingslashit( $this->library_url ) . 'api/' . $path;
	}

	/**
	 * Ajax handler to save the auth API key.
	 *
	 * @return void
	 */
	public function store_auth_key() {
		check_ajax_referer( 'wpcode_admin' );

		if ( ! current_user_can( 'wpcode_activate_snippets' ) ) {
			wp_send_json_error( esc_html__( 'You do not have permissions to connect WPCode to the library.', 'insert-headers-and-footers' ) );
		}

		$key               = ! empty( $_POST['key'] ) ? sanitize_key( $_POST['key'] ) : false;
		$username          = ! empty( $_POST['username'] ) ? sanitize_user( wp_unslash( $_POST['username'] ) ) : false;
		$origin            = ! empty( $_POST['origin'] ) ? esc_url_raw( wp_unslash( $_POST['origin'] ) ) : false;
		$deploy_snippet_id = ! empty( $_POST['deploy_snippet_id'] ) ? sanitize_key( $_POST['deploy_snippet_id'] ) : false;
		$webhook_secret    = ! empty( $_POST['webhook_secret'] ) ? sanitize_key( $_POST['webhook_secret'] ) : '';
		$client_id         = ! empty( $_POST['client_id'] ) ? sanitize_key( $_POST['client_id'] ) : false;

		if ( ! $key || $this->library_url !== $origin ) {
			wp_send_json_error();
		}

		$this->save_auth_data( $key, $username, $webhook_secret, $client_id );

		if ( ! empty( $deploy_snippet_id ) ) {
			// If we have a snippet id from the deployment process, set that as a transient to show a notice, so they can pick up where they started.
			set_transient( 'wpcode_deploy_snippet_id', $deploy_snippet_id, HOUR_IN_SECONDS );
		}

		// Reset the auth data.
		unset( $this->auth_data );
		unset( $this->auth_key );
		unset( $this->has_auth );

		do_action( 'wpcode_library_api_auth_connected' );

		wp_send_json_success(
			array(
				'title' => __( 'Authentication successfully completed', 'insert-headers-and-footers' ),
				'text'  => __( 'Reloading page, please wait.', 'insert-headers-and-footers' ),
			)
		);
	}

	/**
	 * Save the auth data to the db.
	 *
	 * @param string $key The auth key.
	 * @param string $username The username.
	 * @param string $webhook_secret The webhook secret.
	 * @param string $client_id The client id.
	 *
	 * @return void
	 */
	public function save_auth_data( $key, $username, $webhook_secret, $client_id ) {
		// Don't autoload this as we'll only need it on some pages and in specific requests.
		update_option(
			'wpcode_library_api_auth',
			array(
				'key'            => $key,
				'username'       => $username,
				'webhook_secret' => $webhook_secret,
				'client_id'      => $client_id,
				'connected_at'   => time(),
			),
			false
		);
	}

	/**
	 * Ajax handler to delete the auth data and disconnect the site from the WPCode Library.
	 *
	 * @return void
	 */
	public function delete_auth() {
		check_ajax_referer( 'wpcode_admin' );

		if ( ! current_user_can( 'wpcode_activate_snippets' ) ) {
			wp_send_json_error( esc_html__( 'You do not have permissions to connect WPCode to the library.', 'insert-headers-and-footers' ) );
		}

		if ( $this->delete_auth_data() ) {
			do_action( 'wpcode_library_api_auth_deleted' );
			wp_send_json_success();
		}

		wp_send_json_error();
	}

	/**
	 * Delete the auth data from the db.
	 *
	 * @return bool
	 */
	public function delete_auth_data() {
		return delete_option( 'wpcode_library_api_auth' );
	}

	/**
	 * Check if the site is authenticated.
	 *
	 * @return bool
	 */
	public function has_auth() {
		if ( ! isset( $this->has_auth ) ) {
			$auth_key = $this->get_auth_key();

			$this->has_auth = ! empty( $auth_key );
		}

		return $this->has_auth;
	}

	/**
	 * The auth key.
	 *
	 * @return bool|string
	 */
	public function get_auth_key() {
		if ( ! isset( $this->auth_key ) ) {
			$data           = $this->get_auth_data();
			$this->auth_key = isset( $data['key'] ) ? $data['key'] : false;
		}

		return $this->auth_key;
	}

	/**
	 * The webhook secret.
	 *
	 * @return bool|string
	 */
	public function get_webhook_secret() {
		$data = $this->get_auth_data();

		return isset( $data['webhook_secret'] ) ? $data['webhook_secret'] : false;
	}

	/**
	 * The client id.
	 *
	 * @return bool|string
	 */
	public function get_client_id() {
		$data = $this->get_auth_data();

		return isset( $data['client_id'] ) ? $data['client_id'] : false;
	}

	/**
	 * Get the auth data from the db.
	 *
	 * @return array|bool
	 */
	public function get_auth_data() {
		if ( ! isset( $this->auth_data ) ) {
			$this->auth_data = $this->load_auth_data();
		}

		return $this->auth_data;
	}

	/**
	 * Get the auth data from the db.
	 *
	 * @return array|bool
	 */
	public function load_auth_data() {
		return get_option( 'wpcode_library_api_auth', false );
	}

	/**
	 * The auth username.
	 *
	 * @return bool|string
	 */
	public function get_auth_username() {
		$data = $this->get_auth_data();

		return isset( $data['username'] ) ? $data['username'] : false;
	}

	/**
	 * Use the API key saved in the db to sign a value, used for authenticating requests from the library to the plugin.
	 *
	 * @param string $string The string to sign.
	 *
	 * @return string
	 */
	public function sign( $string ) {
		$api_key = $this->get_webhook_secret();

		if ( empty( $api_key ) ) {
			return false;
		}

		return hash_hmac( 'sha256', (string) $string, $api_key );
	}
}
includes/class-wpcode-capabilities.php000064400000002157151331545640014112 0ustar00<?php
/**
 * Manage custom capabilities for WPCode.
 *
 * @package WPCode
 */

/**
 * The WPCode_Capabilities class.
 */
class WPCode_Capabilities {
	/**
	 * Function to call on plugin activation.
	 *
	 * @return void
	 */
	public static function add_capabilities() {

		foreach ( self::get_roles() as $role ) {
			if ( $role->has_cap( 'manage_options' ) ) {
				$role->add_cap( 'wpcode_edit_snippets' );
				$role->add_cap( 'wpcode_activate_snippets' );
			}
		}

	}

	/**
	 * Get roles as WP_Role objects.
	 *
	 * @return WP_Role[]
	 */
	public static function get_roles() {
		$roles      = wp_roles()->roles;
		$role_array = array();
		foreach ( array_keys( $roles ) as $role_key ) {
			$role_array[] = get_role( $role_key );
		}

		return $role_array;
	}

	/**
	 * Remove custom capabilities.
	 *
	 * @return void
	 */
	public static function uninstall() {
		foreach ( self::get_roles() as $role ) {
			if ( $role->has_cap( 'wpcode_edit_snippets' ) ) {
				$role->remove_cap( 'wpcode_edit_snippets' );
			}
			if ( $role->has_cap( 'wpcode_activate_snippets' ) ) {
				$role->remove_cap( 'wpcode_activate_snippets' );
			}
		}
	}
}
includes/class-wpcode-snippet.php000064400000066475151331545640013160 0ustar00<?php
/**
 * The main class to work with single WPCode snippets.
 *
 * @package wpcode
 */

/**
 * WPCode_Snippet class.
 */
class WPCode_Snippet {

	/**
	 * Post type used to store.
	 *
	 * @var string
	 */
	public $post_type = 'wpcode';
	/**
	 * Location taxonomy name.
	 *
	 * @var string
	 */
	public $location_taxonomy = 'wpcode_location';
	/**
	 * Code type taxonomy name.
	 *
	 * @var string
	 */
	public $code_type_taxonomy = 'wpcode_type';
	/**
	 * Tags taxonomy name.
	 *
	 * @var string
	 */
	public $tags_taxonomy = 'wpcode_tags';
	/**
	 * The snippet id.
	 *
	 * @var int
	 */
	public $id;
	/**
	 * The WP_Post object for the snippet.
	 *
	 * @var WP_Post
	 */
	public $post_data;
	/**
	 * The snippet title.
	 *
	 * @var string
	 */
	public $title;
	/**
	 * The actual snippet code.
	 *
	 * @var string
	 */
	public $code;
	/**
	 * The code language/type.
	 *
	 * @var string
	 */
	public $code_type;
	/**
	 * The location where the snippet is added.
	 *
	 * @var string
	 */
	public $location;
	/**
	 * Auto-insert or use shortcode?
	 *
	 * @var int
	 */
	public $auto_insert;
	/**
	 * The insert number for paragraphs or posts in an archive.
	 *
	 * @var int
	 */
	public $insert_number;
	/**
	 * If the snippet is active or not, for now this is handled by the post status draft vs published.
	 *
	 * @var bool
	 */
	public $active;
	/**
	 * An array of tags.
	 *
	 * @var string[]
	 */
	public $tags;
	/**
	 * When we load the location from the terms let's store the object here.
	 *
	 * @var WP_Term
	 */
	private $location_term;
	/**
	 * When we load the code type from the terms let's store the object here.
	 *
	 * @var WP_Term
	 */
	private $code_type_term;
	/**
	 * The tag terms.
	 *
	 * @var WP_Term[]
	 */
	private $tags_terms;
	/**
	 * Whether the conditional rules are enabled or disabled.
	 *
	 * @var bool
	 */
	private $use_rules;
	/**
	 * The conditional logic rules.
	 *
	 * @var array
	 */
	private $rules;
	/**
	 * The priority for loading.
	 *
	 * @var int
	 */
	private $priority;

	/**
	 * The library id, if the snippet is created from the snippet library.
	 *
	 * @var int
	 */
	private $library_id;

	/**
	 * The cloud id, if the snippet has been saved to the user's cloud.
	 *
	 * @var string
	 */
	private $cloud_id;

	/**
	 * The custom shortcode name.
	 *
	 * @var string
	 */
	public $custom_shortcode;

	/**
	 * The version of the snippet from the library.
	 *
	 * @var string
	 */
	private $library_version;

	/**
	 * The snippet note.
	 *
	 * @var string
	 */
	private $note;
	/**
	 * The name of the generator used for this snippet (if any).
	 *
	 * @var string
	 */
	private $generator;
	/**
	 * The generator fields.
	 *
	 * @var array
	 */
	private $generator_data;
	/**
	 * The type of device to load this snippet on.
	 *
	 * @var string
	 */
	public $device_type;

	/**
	 * Schedule parameters for this snippet.
	 *
	 * @var array
	 */
	public $schedule;

	/**
	 * Compiled code.
	 *
	 * @var string
	 */
	public $compiled_code;

	/**
	 * Location extra parameters.
	 * This is used to store extra parameters for the location.
	 *
	 * @var array
	 */
	public $location_extra;

	/**
	 * Get an array of the shortcode attributes for this snippet.
	 *
	 * @var array
	 */
	public $shortcode_attributes;

	/**
	 * Used to store the shortcode attributes values.
	 *
	 * @var array
	 */
	public $attributes;

	/**
	 * Whether this snippet should be loaded as a file, specific to CSS and JS snippets.
	 *
	 * @var bool
	 */
	public $load_as_file;

	/**
	 * The last time the snippet was modified.
	 *
	 * @var int
	 */
	public $modified;

	/**
	 * Constructor. If the post passed is not the correct post type
	 * the object will clear itself.
	 *
	 * @param array|int|WP_Post $snippet Load a snippet by id, WP_Post or array.
	 */
	public function __construct( $snippet ) {
		$snippet = apply_filters( 'wpcode_load_snippet', $snippet );

		if ( is_int( $snippet ) ) {
			$this->load_from_id( $snippet );
		} elseif ( $snippet instanceof WP_Post ) {
			$this->post_data = $snippet;
		} elseif ( is_array( $snippet ) ) {
			$this->load_from_array( $snippet );
		}
		if ( isset( $this->post_data ) && $this->post_type !== $this->post_data->post_type ) {
			unset( $this->post_data );
			unset( $this->id );
		}
	}

	/**
	 * Load a snippet by its ID.
	 *
	 * @param int $snippet_id The snippet id.
	 *
	 * @return void
	 */
	public function load_from_id( $snippet_id ) {
		$this->post_data = get_post( $snippet_id );
		if ( $this->post_data ) {
			$this->id = $this->post_data->ID;
		}
	}

	/**
	 * Load snippet from array - useful for creating a new snippet.
	 *
	 * @param array $snippet_data The array of data to load.
	 *
	 * @return void
	 */
	public function load_from_array( $snippet_data ) {
		$available_options = get_object_vars( $this );
		foreach ( $available_options as $key => $value ) {
			if ( isset( $snippet_data[ $key ] ) ) {
				$this->$key = $snippet_data[ $key ];
			}
		}
	}

	/**
	 * Get the snippet location.
	 *
	 * @return string
	 */
	public function get_location() {
		if ( ! isset( $this->location ) ) {
			$this->set_location();
		}

		return $this->location;
	}

	/**
	 * Grab and set the location term and location string.
	 *
	 * @return void
	 */
	public function set_location() {
		// If something below fails, let's not try again.
		$this->location      = '';
		$this->location_term = $this->get_single_term( $this->location_taxonomy );
		if ( $this->location_term ) {
			$this->location = $this->location_term->slug;
		}
	}

	/**
	 * Get a single term for this snippet based on the taxonomy.
	 *
	 * @param string $taxonomy The taxonomy to grab data for.
	 *
	 * @return false|WP_Term
	 */
	public function get_single_term( $taxonomy ) {
		if ( ! isset( $this->post_data ) ) {
			return false;
		}
		$taxonomy_terms = wp_get_post_terms( $this->post_data->ID, $taxonomy );
		if ( ! empty( $taxonomy_terms ) && ! is_wp_error( $taxonomy_terms ) ) {
			return $taxonomy_terms[0];
		}

		return false;
	}

	/**
	 * Get the author from the post object.
	 *
	 * @return int
	 */
	public function get_snippet_author() {
		if ( isset( $this->post_data ) ) {
			return $this->post_data->post_author;
		}

		return 0;
	}

	/**
	 * Get the post data object.
	 *
	 * @return WP_Post
	 */
	public function get_post_data() {
		return isset( $this->post_data ) ? $this->post_data : null;
	}

	/**
	 * Get the snippet title.
	 *
	 * @return string
	 */
	public function get_title() {
		if ( ! isset( $this->title ) ) {
			$this->title = isset( $this->post_data ) ? $this->post_data->post_title : '';
		}

		return $this->title;
	}

	/**
	 * Get the snippet code.
	 *
	 * @return string
	 */
	public function get_code() {
		if ( ! isset( $this->code ) ) {
			$this->code = isset( $this->post_data ) ? $this->post_data->post_content : '';
		}

		return $this->code;
	}

	/**
	 * Get location term.
	 *
	 * @return WP_Term
	 */
	public function get_location_term() {
		if ( ! isset( $this->location_term ) ) {
			$this->set_location();
		}

		return $this->location_term;
	}

	/**
	 * Get the code type term.
	 *
	 * @return WP_Term
	 */
	public function get_code_type_term() {
		if ( ! isset( $this->code_type_term ) ) {
			$this->set_code_type();
		}

		return $this->code_type_term;
	}

	/**
	 * Is the snippet active?
	 *
	 * @return boolean
	 */
	public function is_active() {
		if ( ! isset( $this->active ) ) {
			$this->active = isset( $this->post_data->post_status ) && 'publish' === $this->post_data->post_status;
		}

		return $this->active;
	}

	/**
	 * Shorthand for activating.
	 *
	 * @return void
	 */
	public function activate() {
		$this->active = true;
		$this->get_id();
		$this->save();
	}

	/**
	 * Get the snippet id.
	 *
	 * @return int
	 */
	public function get_id() {
		if ( ! isset( $this->id ) ) {
			$this->id = isset( $this->post_data ) ? $this->post_data->ID : 0;
		}

		return $this->id;
	}

	/**
	 * Store current object in the db.
	 *
	 * @return int|false
	 */
	public function save() {

		// Allow to prevent saving the snippet.
		$pre_save = apply_filters( 'wpcode_pre_save_snippet', false, $this );
		if ( false !== $pre_save ) {
			return $pre_save;
		}

		$post_args = array(
			'post_type' => $this->post_type,
		);
		if ( isset( $this->id ) && 0 !== $this->id ) {
			$post_args['ID'] = $this->id;
			$this->load_from_id( $this->id );
		}
		if ( isset( $this->title ) ) {
			$post_args['post_title'] = $this->title;
		}
		if ( isset( $this->code ) ) {
			$post_args['post_content'] = $this->code;
		}

		// If the user is not allowed to activate/deactivate snippets, prevent it and show error.
		if ( ! current_user_can( 'wpcode_activate_snippets', $this ) ) {
			wpcode()->error->add_error(
				array(
					'message' => __( 'You are not allowed to change snippet status, please contact your webmaster.', 'insert-headers-and-footers' ),
					'type'    => 'permissions',
				)
			);
			unset( $this->active );
		}

		if ( isset( $this->active ) ) {
			// If we're going to activate a snippet let's check if errors will be thrown.
			$this->run_activation_checks();
			$post_args['post_status'] = $this->active ? 'publish' : 'draft';
		}

		do_action( 'wpcode_before_snippet_save', $this );

		if ( isset( $post_args['ID'] ) ) {
			$insert_result = wp_update_post( $post_args );
		} else {
			if ( empty( $post_args['post_title'] ) ) {
				$post_args['post_title'] = $this->get_untitled_title();
			}
			$insert_result = wp_insert_post( $post_args );
		}

		if ( 0 === $insert_result || is_wp_error( $insert_result ) ) {
			return false;
		}
		$this->id = $insert_result;

		// Reset the last error.
		$this->reset_last_error();

		if ( isset( $this->code_type ) ) {
			wp_set_post_terms( $this->id, $this->code_type, $this->code_type_taxonomy );
		}
		if ( isset( $this->auto_insert ) ) {
			// Save this value for reference, but we never query by it.
			update_post_meta( $this->id, '_wpcode_auto_insert', $this->auto_insert );
		}
		if ( isset( $this->location ) && 1 === $this->auto_insert ) {
			wp_set_post_terms( $this->id, $this->location, $this->location_taxonomy );
		} elseif ( isset( $this->auto_insert ) ) {
			// If auto insert is disabled we just empty the taxonomy.
			wp_set_post_terms( $this->id, array(), $this->location_taxonomy );
		}
		if ( isset( $this->tags ) ) {
			wp_set_post_terms( $this->id, $this->tags, $this->tags_taxonomy );
		}
		if ( isset( $this->insert_number ) ) {
			update_post_meta( $this->id, '_wpcode_auto_insert_number', $this->insert_number );
		}
		if ( isset( $this->use_rules ) ) {
			update_post_meta( $this->id, '_wpcode_conditional_logic_enabled', $this->use_rules );
		}
		if ( isset( $this->rules ) ) {
			update_post_meta( $this->id, '_wpcode_conditional_logic', $this->rules );
		}
		if ( isset( $this->priority ) ) {
			update_post_meta( $this->id, '_wpcode_priority', $this->priority );
		}
		if ( isset( $this->library_id ) ) {
			update_post_meta( $this->id, '_wpcode_library_id', $this->library_id );
		}
		if ( isset( $this->library_version ) ) {
			update_post_meta( $this->id, '_wpcode_library_version', $this->library_version );
		}
		if ( isset( $this->note ) ) {
			update_post_meta( $this->id, '_wpcode_note', $this->note );
		}
		if ( isset( $this->generator ) ) {
			update_post_meta( $this->id, '_wpcode_generator', $this->generator );
		}
		if ( isset( $this->generator_data ) ) {
			update_post_meta( $this->id, '_wpcode_generator_data', $this->generator_data );
		}
		if ( isset( $this->location_extra ) ) {
			update_post_meta( $this->id, '_wpcode_location_extra', $this->location_extra );
		}
		if ( isset( $this->cloud_id ) ) {
			$auth_username = wpcode()->library_auth->get_auth_username();
			$cloud_ids     = get_post_meta( $this->id, '_wpcode_cloud_id', true );
			if ( empty( $cloud_ids ) || ! is_array( $cloud_ids ) ) {
				$cloud_ids = array();
			}
			if ( empty( $this->cloud_id ) && isset( $cloud_ids[ $auth_username ] ) ) {
				unset( $cloud_ids[ $auth_username ] );
			} elseif ( ! empty( $this->cloud_id ) ) {
				$cloud_ids[ $auth_username ] = $this->cloud_id;
			}
			update_post_meta(
				$this->id,
				'_wpcode_cloud_id',
				$cloud_ids
			);
		}
		if ( isset( $this->custom_shortcode ) ) {
			if ( empty( $this->custom_shortcode ) ) {
				// Delete this meta if empty because we query by it.
				delete_post_meta( $this->id, '_wpcode_custom_shortcode' );
			} else {
				update_post_meta( $this->id, '_wpcode_custom_shortcode', $this->custom_shortcode );
			}
		}
		if ( isset( $this->device_type ) ) {
			update_post_meta( $this->id, '_wpcode_device_type', $this->device_type );
		}
		if ( isset( $this->schedule ) ) {
			update_post_meta( $this->id, '_wpcode_schedule', $this->schedule );
		}
		if ( isset( $this->shortcode_attributes ) ) {
			update_post_meta( $this->id, '_wpcode_shortcode_attributes', $this->shortcode_attributes );
		}
		if ( isset( $this->load_as_file ) && in_array( $this->get_code_type(), array( 'css', 'js', 'scss' ), true ) ) {
			update_post_meta( $this->id, '_wpcode_load_as_file', $this->load_as_file );
		}
		if ( isset( $this->compiled_code ) ) {
			update_post_meta( $this->id, '_wpcode_compiled_code', $this->compiled_code );
		}

		/**
		 * Run extra logic after the snippet is saved.
		 *
		 * @param int            $id The id of the updated snippet.
		 * @param WPCode_Snippet $snippet The snippet object.
		 */
		do_action( 'wpcode_snippet_after_update', $this->id, $this );

		$this->rebuild_cache();

		return $this->id;
	}

	/**
	 * Method for rebuilding all snippets cache.
	 *
	 * @return void
	 */
	public function rebuild_cache() {
		wpcode()->cache->cache_all_loaded_snippets();
	}

	/**
	 * Check if a snippet can be run without errors before activating it.
	 *
	 * @return void
	 */
	public function run_activation_checks() {
		$executed_types = array(
			'php',
			'universal',
		);
		if ( ! in_array( $this->get_code_type(), $executed_types, true ) ) {
			// If the code is not getting executed just skip.
			return;
		}
		if ( false === $this->active ) {
			// If we're not trying to activate or the snippet is already active, bail.
			return;
		}

		// Make sure no errors are added by something else.
		wpcode()->error->clear_errors();
		// Try running the code.
		// Grab the executor class specific to the code type.
		$executor = wpcode()->execute->get_type_execute_class( $this->get_code_type() );
		// Mark this as an activation attempt.
		wpcode()->execute->doing_activation();
		/**
		 * Added for convenience.
		 *
		 * @var WPCode_Snippet_Execute_Type $executor
		 */
		$execute = new $executor( $this );
		// Grab the output that executes the code.
		$execute->get_output();
		// If any errors are caught, prevent the status from being changed.
		$has_error = wpcode()->error->has_error();
		if ( $has_error ) {
			$this->active = false;
		}

		wpcode()->execute->not_doing_activation();
	}

	/**
	 * Return the code type.
	 *
	 * @return string
	 */
	public function get_code_type() {
		if ( ! isset( $this->code_type ) ) {
			$this->set_code_type();
		}

		return $this->code_type;
	}

	/**
	 * Grab the code type from the taxonomy.
	 *
	 * @return void
	 */
	public function set_code_type() {
		// If something below fails, let's not try again.
		$this->code_type      = '';
		$this->code_type_term = $this->get_single_term( $this->code_type_taxonomy );
		if ( $this->code_type_term ) {
			$this->code_type = $this->code_type_term->slug;
		}
	}

	/**
	 * Get the default title for snippets with no title set.
	 *
	 * @return string
	 */
	public function get_untitled_title() {
		return __( 'Untitled Snippet', 'insert-headers-and-footers' );
	}

	/**
	 * Shorthand for deactivating a snippet.
	 *
	 * @return void
	 */
	public function deactivate() {
		$this->active = false;
		$this->get_id();
		$this->save();
	}

	/**
	 * This deactivates the snippet without regardless of user permissions.
	 * Should only be used for unattended auto-deactivation when a snippet throws a potentially blocking error.
	 *
	 * @return void
	 */
	public function force_deactivate() {
		global $wpdb;

		// Add a filter so we can hijack the deactivate logic if needed.
		$force_deactivate = apply_filters( 'wpcode_force_deactivate_snippet', false, $this );
		if ( false !== $force_deactivate ) {
			return;
		}

		// We need to make a direct call as using wp_update_post will load the post content and if the current user
		// doesn't have the unfiltered_html capability, the code will be changed unexpectedly.
		$update = $wpdb->update( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
			$wpdb->posts,
			array(
				'post_status' => 'draft',
			),
			array(
				'ID' => $this->get_id(),
			)
		);

		if ( $update ) {
			// Rebuild cache to avoid the snippet being loaded again.
			$this->rebuild_cache();

			wpcode()->error->add_error(
				array(
					'message' => sprintf(
					/* translators: %s: Snippet title and ID used in the error log for clarity. */
						esc_html__( 'Snippet %s was automatically deactivated due to a fatal error.', 'insert-headers-and-footers' ),
						sprintf( '"%s" (#%d)', $this->get_title(), $this->get_id() )
					),
				)
			);
		}
	}

	/**
	 * Set the last error for this snippet.
	 *
	 * @param array $error The error details.
	 *
	 * @return void
	 */
	public function set_last_error( $error ) {
		if ( ! isset( $error['message'] ) ) {
			return;
		}
		update_post_meta( $this->get_id(), '_wpcode_last_error', $error );
	}

	/**
	 * Get the last error for this snippet.
	 *
	 * @return array|false
	 */
	public function get_last_error() {
		$error = get_post_meta( $this->get_id(), '_wpcode_last_error', true );

		if ( empty( $error ) || ! is_array( $error ) ) {
			return false;
		}

		return $error;
	}

	/**
	 * Remove the meta that stores the last error.
	 *
	 * @return void
	 */
	public function reset_last_error() {
		delete_post_meta( $this->get_id(), '_wpcode_last_error' );
		wpcode()->error->clear_snippets_errors();
	}

	/**
	 * Get the auto insert number.
	 *
	 * @return int
	 */
	public function get_auto_insert_number() {
		if ( ! isset( $this->insert_number ) ) {
			$this->insert_number = absint( get_post_meta( $this->get_id(), '_wpcode_auto_insert_number', true ) );
			// Default value should be 1.
			if ( 0 === $this->insert_number ) {
				$this->insert_number = 1;
			}
		}

		return $this->insert_number;
	}

	/**
	 * Get the auto-insert value.
	 *
	 * @return int
	 */
	public function get_auto_insert() {
		if ( ! isset( $this->auto_insert ) ) {
			$this->auto_insert = absint( get_post_meta( $this->get_id(), '_wpcode_auto_insert', true ) );
		}

		return $this->auto_insert;
	}

	/**
	 * Get the array of tag slugs.
	 *
	 * @return string[]
	 */
	public function get_tags() {
		if ( ! isset( $this->tags ) ) {
			$this->set_tags();
		}

		return $this->tags;
	}

	/**
	 * Set the tags for the current snippet.
	 *
	 * @return void
	 */
	public function set_tags() {
		$tags      = wp_get_post_terms( $this->get_id(), $this->tags_taxonomy );
		$tag_slugs = array();
		foreach ( $tags as $tag ) {
			/**
			 * The tag term object.
			 *
			 * @var WP_Term $tag
			 */
			$tag_slugs[] = $tag->slug;
		}
		$this->tags       = $tag_slugs;
		$this->tags_terms = $tags;
	}

	/**
	 * Get the conditional logic rules from the db.
	 *
	 * @return array
	 */
	public function get_conditional_rules() {
		if ( ! isset( $this->rules ) ) {
			$rules = get_post_meta( $this->get_id(), '_wpcode_conditional_logic', true );
			if ( empty( $rules ) ) {
				$rules = array();
			}
			$this->rules = $rules;
		}

		return $this->rules;
	}

	/**
	 * Are the conditional logic rules enabled?
	 *
	 * @return bool
	 */
	public function conditional_rules_enabled() {
		if ( ! isset( $this->use_rules ) ) {
			$enabled = get_post_meta( $this->get_id(), '_wpcode_conditional_logic_enabled', true );
			if ( '' === $enabled ) {
				$enabled = false;
			}
			$this->use_rules = boolval( $enabled );
		}

		return $this->use_rules;
	}

	/**
	 * Get the note for this snippet.
	 *
	 * @return string
	 */
	public function get_note() {
		if ( ! isset( $this->note ) ) {
			$this->note = get_post_meta( $this->get_id(), '_wpcode_note', true );
		}

		return $this->note;
	}

	/**
	 * Get the priority number for this snippet.
	 *
	 * @return int
	 */
	public function get_priority() {
		if ( ! isset( $this->priority ) ) {
			$priority = get_post_meta( $this->get_id(), '_wpcode_priority', true );
			if ( '' === $priority ) {
				$priority = 10;
			}
			$this->priority = intval( $priority );
		}

		return $this->priority;
	}

	/**
	 * Get essential data for caching.
	 *
	 * @return array
	 */
	public function get_data_for_caching() {
		$modified  = 0;
		$post_data = $this->get_post_data();
		if ( ! is_null( $post_data ) ) {
			$modified = $post_data->post_modified;
		}

		return array(
			'id'                   => $this->get_id(),
			'title'                => $this->get_title(),
			'code'                 => $this->get_code(),
			'code_type'            => $this->get_code_type(),
			'location'             => $this->get_location(),
			'auto_insert'          => $this->get_auto_insert(),
			'insert_number'        => $this->get_auto_insert_number(),
			'use_rules'            => $this->conditional_rules_enabled(),
			'rules'                => $this->get_conditional_rules(),
			'priority'             => $this->get_priority(),
			'location_extra'       => $this->get_location_extra(),
			'shortcode_attributes' => $this->get_shortcode_attributes(),
			'compiled_code'        => $this->get_compiled_code(),
			'modified'             => $modified,
		);
	}

	/**
	 * Get the cloud id for this snippet.
	 *
	 * @return string
	 */
	public function get_cloud_id() {
		if ( ! isset( $this->cloud_id ) ) {
			if ( wpcode()->library_auth->has_auth() ) {
				$cloud_id = get_post_meta( $this->get_id(), '_wpcode_cloud_id', true );
				if ( empty( $cloud_id ) || ! is_array( $cloud_id ) ) {
					$cloud_id = array();
				}
				$auth_username  = wpcode()->library_auth->get_auth_username();
				$this->cloud_id = isset( $cloud_id[ $auth_username ] ) ? $cloud_id[ $auth_username ] : false;
			} else {
				$this->cloud_id = false;
			}
		}

		return $this->cloud_id;
	}

	/**
	 * Set the cloud id.
	 *
	 * @param string $cloud_id The cloud id to use.
	 *
	 * @return void
	 */
	public function set_cloud_id( $cloud_id ) {
		$this->cloud_id = $cloud_id;
	}

	/**
	 * Get the custom shortcode value.
	 *
	 * @return string
	 */
	public function get_custom_shortcode() {
		if ( ! isset( $this->custom_shortcode ) ) {
			$this->custom_shortcode = get_post_meta( $this->get_id(), '_wpcode_custom_shortcode', true );
		}

		return $this->custom_shortcode;
	}

	/**
	 * Get the device type for this snippet.
	 *
	 * @return string
	 */
	public function get_device_type() {
		if ( ! isset( $this->device_type ) ) {
			$this->device_type = get_post_meta( $this->get_id(), '_wpcode_device_type', true );
			if ( empty( $this->device_type ) ) {
				$this->device_type = 'any';
			}
		}

		return $this->device_type;
	}

	/**
	 * Get the schedule data for this snippet.
	 *
	 * @return array
	 */
	public function get_schedule() {
		if ( ! isset( $this->schedule ) ) {
			$this->schedule = wp_parse_args(
				get_post_meta( $this->get_id(), '_wpcode_schedule', true ),
				array(
					'start' => '',
					'end'   => '',
				)
			);
		}

		return $this->schedule;
	}

	/**
	 * Get the generator data for this snippet, if any.
	 *
	 * @return array|false
	 */
	public function get_generator_data() {
		if ( ! isset( $this->generator_data ) ) {
			$generator_data       = get_post_meta( $this->get_id(), '_wpcode_generator_data', true );
			$this->generator_data = empty( $generator_data ) ? false : $generator_data;
		}

		return $this->generator_data;
	}

	/**
	 * Get the generator name for this snippet.
	 *
	 * @return array|false
	 */
	public function get_generator() {
		if ( ! isset( $this->generator ) ) {
			$generator_name  = get_post_meta( $this->get_id(), '_wpcode_generator', true );
			$this->generator = empty( $generator_name ) ? false : $generator_name;
		}

		return $this->generator;
	}

	/**
	 * Check if the snippet is generated using a WPCode generator..
	 *
	 * @return bool
	 */
	public function is_generated() {
		return ! empty( $this->get_generator() );
	}

	/**
	 * Is this snippet scheduled?
	 *
	 * @return bool
	 */
	public function is_scheduled() {
		$schedule = $this->get_schedule();

		return ! empty( $schedule['start'] ) || ! empty( $schedule['end'] );
	}

	/**
	 * Extra data for the selected auto-insert location.
	 *
	 * @return array
	 */
	public function get_location_extra() {
		if ( ! isset( $this->location_extra ) ) {
			$this->location_extra = get_post_meta( $this->get_id(), '_wpcode_location_extra', true );
		}

		return $this->location_extra;
	}

	/**
	 * Load compiled Code.
	 *
	 * @return string
	 */
	public function get_compiled_code() {
		if ( ! isset( $this->compiled_code ) ) {
			$this->compiled_code = get_post_meta( $this->get_id(), '_wpcode_compiled_code', true );
		}
		return $this->compiled_code;
	}

	/**
	 * Load the shortcode attributes and return.
	 *
	 * @return array
	 */
	public function get_shortcode_attributes() {
		if ( ! isset( $this->shortcode_attributes ) ) {
			$attributes = get_post_meta( $this->get_id(), '_wpcode_shortcode_attributes', true );
			if ( ! is_array( $attributes ) ) {
				$attributes = array();
			}
			$this->shortcode_attributes = $attributes;
		}

		return $this->shortcode_attributes;
	}

	/**
	 * Set shortcode attribute value.
	 *
	 * @param string $key The attribute key.
	 * @param string $value The value for the attribute.
	 *
	 * @return void
	 */
	public function set_attribute( $key, $value ) {
		$this->attributes[ $key ] = $value;
	}

	/**
	 * Duplicates a snippet with all its data.
	 *
	 * @return void
	 */
	public function duplicate() {
		$this->get_data_for_caching();
		$this->get_note();
		$this->get_tags();
		$this->get_custom_shortcode();
		$this->get_device_type();
		$this->get_schedule();
		// Add a suffix to the title.
		$this->title = $this->get_title() . ' - Copy';
		// Make sure the snippet is not active.
		$this->post_data->post_status = 'draft';

		// Let's make sure the slashes don't get removed from the code.
		$this->code = wp_slash( $this->code );
		/**
		 * Fires before a snippet that is about to be duplicated is saved.
		 *
		 * @param WPCode_Snippet $snippet The snippet object.
		 */
		do_action( 'wpcode_before_snippet_duplicated', $this );
		// Remove the id to create a new snippet.
		unset( $this->id );
		// Save the new snippet.
		$this->save();
		/**
		 * Fires after a snippet has been duplicated.
		 *
		 * @param WPCode_Snippet $snippet The snippet object.
		 */
		do_action( 'wpcode_after_snippet_duplicated', $this );
	}

	/**
	 * Get the edit url for this snippet.
	 *
	 * @return string
	 */
	public function get_edit_url() {
		return admin_url( 'admin.php?page=wpcode-snippet-manager&snippet_id=' . absint( $this->get_id() ) );
	}

	/**
	 * Whether this snippet should be load as a file (for JS or CSS snippets, returns false for other code types).
	 *
	 * @return bool
	 */
	public function get_load_as_file() {
		if ( ! isset( $this->load_as_file ) ) {
			$this->load_as_file = in_array( $this->get_code_type(), array( 'js', 'css', 'scss' ), true );
			if ( $this->load_as_file ) {
				$this->load_as_file = boolval( get_post_meta( $this->get_id(), '_wpcode_load_as_file', true ) );
			}
		}

		return $this->load_as_file;
	}

	/**
	 * Execute a snippet on demand.
	 *
	 * @param bool $ignore_conditional_logic Whether to ignore the conditional logic rules.
	 *
	 * @return void
	 */
	public function execute( $ignore_conditional_logic = false ) {

		if ( ! $ignore_conditional_logic ) {
			if ( $this->conditional_rules_enabled() && ! wpcode()->conditional_logic->are_snippet_rules_met( $this ) ) {
				return;
			}
		}

		wpcode()->execute->get_snippet_output( $this );
	}
}
includes/helpers.php000064400000033336151331545640010544 0ustar00<?php
/**
 * Generic helpers used in the plugin.
 *
 * @package WPCode
 */

/**
 * Get a URL with UTM parameters.
 *
 * @param string $url The URL to add the params to.
 * @param string $medium The marketing medium.
 * @param string $campaign The campaign.
 * @param string $ad_content The utm_content param.
 *
 * @return string
 */
function wpcode_utm_url( $url, $medium = '', $campaign = '', $ad_content = '' ) {
	$args = array(
		'utm_source'   => class_exists( 'WPCode_License' ) ? 'proplugin' : 'liteplugin',
		'utm_medium'   => sanitize_key( $medium ),
		'utm_campaign' => sanitize_key( $campaign )
	);

	if ( ! empty( $ad_content ) ) {
		$args['utm_content'] = sanitize_key( $ad_content );
	}

	return add_query_arg(
		$args,
		$url
	);
}

/**
 * Get a standard auto-insert location select menu.
 *
 * @param string $selected_location The location currently selected.
 * @param string $code_type The code type for the current snippet (disables some locations).
 * @param string $name The name for the select (used in the form).
 *
 * @return string
 */
function wpcode_get_auto_insert_location_picker( $selected_location, $code_type = 'html', $name = 'wpcode_auto_insert_location' ) {
	$available_types = wpcode()->auto_insert->get_types();
	ob_start();
	?>
	<select name="<?php echo esc_attr( $name ); ?>" id="<?php echo esc_attr( $name ); ?>" class="wpcode-select2 wpcode-auto-insert-location-picker">
		<?php
		foreach ( $available_types as $type ) {
			$options = $type->get_locations();
			if ( empty( $options ) ) {
				continue;
			}
			$extra_data = '';
			if ( ! empty( $type->upgrade_title ) ) {
				$extra_data = ' data-upgrade-title="' . esc_attr( $type->upgrade_title ) . '"';
			}
			if ( ! empty( $type->upgrade_text ) ) {
				$extra_data .= ' data-upgrade-text="' . esc_attr( $type->upgrade_text ) . '"';
			}
			if ( ! empty( $type->upgrade_link ) ) {
				$extra_data .= ' data-upgrade-link="' . esc_attr( $type->upgrade_link ) . '"';
			}
			if ( ! empty( $type->upgrade_button ) ) {
				$extra_data .= ' data-upgrade-button="' . esc_attr( $type->upgrade_button ) . '"';
			}
			?>
			<optgroup
					label="<?php echo esc_attr( $type->get_label() ); ?>"
					data-code-type="<?php echo esc_attr( $type->code_type ); ?>"
					data-label-pill="<?php echo esc_attr( $type->label_pill ); ?>"
				<?php echo $extra_data; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
			>
				<?php
				foreach ( $options as $key => $location ) {
					$disabled = false;
					if ( 'all' !== $type->code_type && $type->code_type !== $code_type ) {
						$disabled = true;
					}
					$label = wpcode_find_location_label( $key );
					?>
					<option value="<?php echo esc_attr( $key ); ?>" <?php selected( $selected_location, $key ); ?> <?php disabled( $disabled ); ?>>
						<?php echo esc_html( $label ); ?>
					</option>
				<?php } ?>
			</optgroup>
			<?php
		}
		?>
	</select>
	<?php
	return ob_get_clean();
}

/**
 * Get the label for an auto-insert location.
 *
 * @param $location_slug
 *
 * @return string
 */
function wpcode_find_location_label( $location_slug ) {
	$available_types = wpcode()->auto_insert->get_types();
	$location_label  = '';
	foreach ( $available_types as $type ) {
		$options = $type->get_locations();
		foreach ( $options as $key => $location ) {
			if ( $key === $location_slug ) {
				if ( isset( $location['label'] ) ) {
					$label = $location['label'];
				} else {
					$label = $location;
				}
				$location_label = $label;
				break 2;
			}
		}
	}

	return $location_label;
}

/**
 * Get a checkbox wrapped with markup to be displayed as a toggle.
 *
 * @param bool       $checked Is it checked or not.
 * @param string     $name The name for the input.
 * @param string     $description Field description (optional).
 * @param string|int $value Field value (optional).
 * @param string     $label Field label (optional).
 *
 * @return string
 */
function wpcode_get_checkbox_toggle( $checked, $name, $description = '', $value = '', $label = '' ) {
	$markup = '<label class="wpcode-checkbox-toggle">';

	$markup .= '<input type="checkbox" ' . checked( $checked, true, false ) . ' name="' . esc_attr( $name ) . '" id="' . esc_attr( $name ) . '" value="' . esc_attr( $value ) . '" />';
	$markup .= '<span class="wpcode-checkbox-toggle-slider"></span>';
	$markup .= '</label>';
	if ( ! empty( $label ) ) {
		$markup .= '<label class="wpcode-checkbox-toggle-label" for="' . esc_attr( $name ) . '">' . esc_html( $label ) . '</label>';
	}

	if ( ! empty( $description ) ) {
		$markup .= '<p class="description">' . wp_kses_post( $description ) . '</p>';
	}

	return $markup;
}

/**
 * Button that copies target input value to the clipboard.
 *
 * @param string $target The id of the input to copy from.
 * @param string $prefix If you want something prepended to the copied value.
 * @param string $suffix If you want something appended to the copied value.
 *
 * @return string
 */
function wpcode_get_copy_target_button( $target, $prefix = '', $suffix = '' ) {
	return sprintf(
		'<button class="wpcode-button wpcode-button-icon wpcode-button-secondary wpcode-copy-target" data-target="#%4$s" type="button" data-prefix="%5$s" data-suffix="%6$s"><span class="wpcode-default-icon">%1$s</span><span class="wpcode-success-icon">%2$s</span> %3$s</button>',
		get_wpcode_icon( 'copy', 16, 16 ),
		get_wpcode_icon( 'check', 16, 13 ),
		_x( 'Copy', 'Copy to clipboard', 'insert-headers-and-footers' ),
		esc_attr( $target ),
		esc_attr( $prefix ),
		esc_attr( $suffix )
	);
}

/**
 * Get a list of labels for the conditions used in conditional logic.
 *
 * @return array
 */
function wpcode_get_conditions_relation_labels() {
	return array(
		'contains'    => __( 'Contains', 'insert-headers-and-footers' ),
		'notcontains' => __( 'Doesn\'t Contain', 'insert-headers-and-footers' ),
		'='           => __( 'Is', 'insert-headers-and-footers' ),
		'!='          => __( 'Is not', 'insert-headers-and-footers' ),
		'before'      => __( 'Is Before', 'insert-headers-and-footers' ),
		'after'       => __( 'Is After', 'insert-headers-and-footers' ),
		'before-or'   => __( 'Is on or Before', 'insert-headers-and-footers' ),
		'after-or'    => __( 'Is on or After', 'insert-headers-and-footers' ),
	);
}

/**
 * Get an array of locations that support an insert number.
 *
 * @return string[]
 */
function wpcode_get_auto_insert_locations_with_number() {
	return array(
		'before_paragraph',
		'after_paragraph',
		'archive_before_post',
		'archive_after_post',
		'after_words',
		'every_words',
	);
}

/**
 * Returns the site domain.
 *
 * @return string
 */
function wpcode_get_site_domain() {
	return wp_parse_url( home_url(), PHP_URL_HOST );
}

/**
 * Check WP version and include the compatible upgrader skin.
 */
function wpcode_require_upgrader() {

	global $wp_version;

	require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';

	// WP 5.3 changes the upgrader skin.
	if ( version_compare( $wp_version, '5.3', '<' ) ) {
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/class-wpcode-skin-legacy.php';
	} else {
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/class-wpcode-skin.php';
	}
}

/**
 * Get timezone string if the function doesn't exist. (WP < 5.3).
 *
 * @return string
 * @since 2.0.10
 */
function wpcode_wp_timezone_string() {
	if ( function_exists( 'wp_timezone_string' ) ) {
		return wp_timezone_string();
	}
	$timezone_string = get_option( 'timezone_string' );

	if ( $timezone_string ) {
		return $timezone_string;
	}

	$offset  = (float) get_option( 'gmt_offset' );
	$hours   = (int) $offset;
	$minutes = ( $offset - $hours );

	$sign      = ( $offset < 0 ) ? '-' : '+';
	$abs_hour  = abs( $hours );
	$abs_mins  = abs( $minutes * 60 );
	$tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins );

	return $tz_offset;
}

/**
 * Add a new library username to be loaded in the WPCode Library.
 *
 * @param string $slug The username to load snippets for from the WPCode Library.
 * @param string $label The label to display for the username in the library.
 * @param string $version The version of the plugin/theme. Used to filter snippets that should not be loaded for newer versions.
 *
 * @return void
 */
function wpcode_register_library_username( $slug, $label = '', $version = '' ) {
	if ( ! is_admin() || ! isset( wpcode()->library ) ) {
		return;
	}
	wpcode()->library->register_library_username( $slug, $label, $version );
}


/**
 * Load snippets from the library by a specific username.
 * This function also loads the library if it hasn't been loaded yet so that it can be used in API endpoints.
 * It also adds links to install snippets and checks for permissions.
 *
 * @param string $username The username to load snippets for from the WPCode Library.
 *
 * @return array
 */
function wpcode_get_library_snippets_by_username( $username ) {

	wpcode_maybe_load_library();

	$snippets = wpcode()->library->get_snippets_by_username( $username );
	// Let's prepare this a bit for easier output.

	// If there are no snippets just return an empty array.
	if ( empty( $snippets['snippets'] ) ) {
		return array();
	}

	$can_install           = current_user_can( 'wpcode_edit_snippets' );
	$prepared              = array();
	$used_library_snippets = wpcode()->library->get_used_library_snippets();
	foreach ( $snippets['snippets'] as $snippet ) {
		$snippet['installed'] = false;
		// If the user can't install snippets, don't provide an install link.
		if ( ! $can_install ) {
			$url = '';
		} elseif ( ! empty( $used_library_snippets[ $snippet['library_id'] ] ) ) {
			// If the snippet is already installed link to the snippet so they can edit it.
			$snippet['installed'] = true;
			$url                  = wpcode()->library->get_edit_snippet_url( $used_library_snippets[ $snippet['library_id'] ] );
		} else {
			// If the snippet is not yet installed, add a link to install it.
			$url = wpcode()->library->get_install_snippet_url( $snippet['library_id'] );
		}
		$snippet['install'] = $url;
		$prepared[]         = $snippet;
	}

	return $prepared;
}

/**
 * Make sure the WPCode library is loaded, along with the components it needs to run.
 *
 * @return void
 */
function wpcode_maybe_load_library() {
	if ( ! isset( wpcode()->library ) ) {
		// Snippet Library.
		require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-library.php';
		// Load components needed for the library, if not loaded.
		if ( ! isset( wpcode()->file_cache ) ) {
			// File cache.
			require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-file-cache.php';
			wpcode()->file_cache = new WPCode_File_Cache();
		}
		if ( ! isset( wpcode()->library_auth ) ) {
			// Authentication for the library site.
			require_once WPCODE_PLUGIN_PATH . 'includes/class-wpcode-library-auth.php';
			wpcode()->library_auth = new WPCode_Library_Auth();
		}
		wpcode()->library = new WPCode_Library();
	}
}

/**
 * Helper function for testing mode.
 *
 * @return bool
 */
function wpcode_testing_mode_enabled() {
	if ( ! class_exists( 'WPCode_Testing_Mode' ) ) {
		return false;
	}

	return WPCode_Testing_Mode::get_instance()->testing_mode_enabled();
}

/**
 * Get the user's IP address.
 *
 * @return string
 */
function wpcode_get_user_ip() {
	$ip = '127.0.0.1';

	$address_headers = array(
		'HTTP_TRUE_CLIENT_IP',
		'HTTP_CF_CONNECTING_IP',
		'HTTP_X_REAL_IP',
		'HTTP_CLIENT_IP',
		'HTTP_X_FORWARDED_FOR',
		'HTTP_X_FORWARDED',
		'HTTP_X_CLUSTER_CLIENT_IP',
		'HTTP_FORWARDED_FOR',
		'HTTP_FORWARDED',
		'REMOTE_ADDR',
	);

	foreach ( $address_headers as $header ) {
		if ( empty( $_SERVER[ $header ] ) ) {
			continue;
		}

		/*
		 * HTTP_X_FORWARDED_FOR can contain a chain of comma-separated addresses, with or without spaces.
		 * The first address is the original client. It can't be trusted for authenticity,
		 * but we don't need to for this purpose.
		 */

		// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
		$address_chain = explode( ',', wp_unslash( $_SERVER[ $header ] ) );
		$ip            = filter_var( trim( $address_chain[0] ), FILTER_VALIDATE_IP );

		break;
	}

	/**
	 * Filter detected IP address.
	 *
	 * @param string $ip IP address.
	 */
	return filter_var( apply_filters( 'wpcode_get_user_ip', $ip ), FILTER_VALIDATE_IP );
}

/**
 * Is the ip for a localhost. Defaults to the current user ip.
 *
 * @param string $ip The IP to check.
 *
 * @return string
 */
function wpcode_is_local( $ip = null ) {
	if ( ! $ip ) {
		$ip = wpcode_get_user_ip();
	}

	return empty( $ip ) || in_array( $ip, array( '127.0.0.1', '::1' ), true );
}

/**
 * Attempts to detect popular caching plugins and clear their cache.
 *
 * @param string $context The context in which the cache is being cleared.
 *
 * @return void
 */
function wpcode_clear_all_plugins_page_cache( $context = '' ) {

	if ( apply_filters( 'wpcode_skip_clear_all_plugins_cache', false, $context ) ) {
		return;
	}

	// LiteSpeed Cache.
	if ( function_exists( 'run_litespeed_cache' ) && class_exists( 'LiteSpeed\Purge' ) && method_exists( 'LiteSpeed\Purge', 'purge_all' ) ) {
		LiteSpeed\Purge::purge_all();
	}

	// WP Super Cache.
	if ( function_exists( 'wp_cache_clear_cache' ) ) {
		wp_cache_clear_cache();
	}

	// W3 Total Cache.
	if ( function_exists( 'w3tc_flush_all' ) ) {
		w3tc_flush_all();
	}

	// WP-Optimize.
	if ( function_exists( 'WP_Optimize' ) ) {
		WP_Optimize()->get_page_cache()->purge();
	}

	// WP Rocket.
	if ( function_exists( 'rocket_clean_domain' ) ) {
		rocket_clean_domain();
	}

	// WP Fastest Cache.
	if ( function_exists( 'wpfc_clear_all_cache' ) ) {
		wpfc_clear_all_cache();
	}

	// SiteGround Optimizer.
	if ( function_exists( 'sg_cachepress_purge_cache' ) ) {
		sg_cachepress_purge_cache();
	}

	if ( class_exists( 'Swift_Performance_Cache' ) ) {
		if ( method_exists( 'Swift_Performance_Cache', 'clear_all_cache' ) ) {
			Swift_Performance_Cache::clear_all_cache();
		}
	}

	// WP Engine.
	if ( class_exists( 'WpeCommon' ) ) {
		if ( method_exists( 'WpeCommon', 'purge_varnish_cache' ) ) {
			WpeCommon::purge_varnish_cache();
		}
	}
}
includes/icons.php000064400000103255151331545640010213 0ustar00<?php
/**
 * Handle all svg icons in one place.
 *
 * @package WPCode
 */

/**
 * Get an SVG icon by name with width, height and viewbox options.
 *
 * @param string $name The name of the icon.
 * @param int    $width The width.
 * @param int    $height The height.
 * @param string $viewbox The viewbox, will be auto-built from width and height if not set.
 * @param string $id The id of the icon.
 *
 * @return string
 */
function get_wpcode_icon( $name, $width = 20, $height = 20, $viewbox = '', $id = '' ) {
	$icons = wpcode_icons();

	if ( ! isset( $icons[ $name ] ) ) {
		return '';
	}

	if ( empty( $viewbox ) ) {
		$viewbox = sprintf( '0 0 %1$s %2$s', $width, $height );
	}

	return sprintf(
		'<svg class="wpcode-icon wpcode-icon-%5$s" width="%1$s" height="%2$s" viewBox="%3$s" fill="none" xmlns="http://www.w3.org/2000/svg" id="%6$s">%4$s</svg>',
		esc_attr( $width ),
		esc_attr( $height ),
		esc_attr( $viewbox ),
		$icons[ $name ],
		esc_attr( $name ),
		esc_attr( $id )
	);
}

/**
 * Echo an icon in a safe mode.
 *
 * @param string $name The name of the icon.
 * @param int    $width The width.
 * @param int    $height The height.
 * @param string $viewbox The viewbox, will be auto-built from width and height if not set.
 * @param string $id The id of the icon.
 *
 * @return void
 */
function wpcode_icon( $name, $width = 20, $height = 20, $viewbox = '', $id = '' ) {
	$icon = get_wpcode_icon( $name, $width, $height, $viewbox, $id );

	if ( ! empty( $icon ) ) {
		echo wp_kses(
			$icon,
			wpcode_get_icon_allowed_tags()
		);
	}
}

/**
 * Get the allowed tags for svg icons, to be used in wp_kses.
 *
 * @return array
 * @see wpcode_icon()
 * @see wp_kses()
 */
function wpcode_get_icon_allowed_tags() {
	return array(
		'svg'      => array(
			'class'           => true,
			'aria-hidden'     => true,
			'aria-labelledby' => true,
			'role'            => true,
			'xmlns'           => true,
			'width'           => true,
			'height'          => true,
			'viewbox'         => true,
			'id'              => true,
		),
		'g'        => array(
			'fill'      => true,
			'clip-path' => true,
		),
		'title'    => array( 'title' => true ),
		'path'     => array(
			'd'         => true,
			'fill'      => true,
			'fill-rule' => true,
			'clip-rule' => true,
			'data-name' => true,
		),
		'circle'   => array(
			'cx'           => true,
			'cy'           => true,
			'r'            => true,
			'stroke'       => true,
			'stroke-width' => true,
			'fill'         => true,
		),
		'rect'     => array(
			'x'      => true,
			'y'      => true,
			'width'  => true,
			'height' => true,
			'fill'   => true,
		),
		'clipPath' => array(
			'id' => true,
		),
		'defs'     => array(),
	);
}

/**
 * Get the whole array of WPCode SVG icons.
 *
 * @return array
 */
function wpcode_icons() {
	return (array) apply_filters(
		'wpcode_icons',
		array(
			'logo'        => '<path fill-rule="evenodd" clip-rule="evenodd" d="M57.5706 64H6.56732C2.89985 64 0 61.1064 0 57.4468V6.55319C0 2.89362 2.89985 0 6.56732 0H57.5706C61.2381 0 64.1379 2.89362 64.1379 6.55319V57.4468C64.1379 61.1064 61.2381 64 57.5706 64ZM15.863 52.0855C15.5219 52.0855 15.0954 52.0004 14.7543 51.9153C13.2191 51.3196 12.4515 49.6175 13.0485 48.0855L26.439 13.7877C27.036 12.2558 28.7418 11.4898 30.277 12.0855C31.8122 12.6813 32.5798 14.3834 31.9828 15.9153L18.6776 50.2132C18.2512 51.4047 17.0571 52.0855 15.863 52.0855ZM35.0534 47.7445C35.6504 48.3403 36.418 48.5956 37.1856 48.5956C37.9532 48.5956 38.7208 48.3403 39.3179 47.7445L49.8085 37.3616C51.6849 35.4892 51.6849 32.3403 49.8085 30.468L39.3179 19.9999C38.2091 18.8084 36.3327 18.8084 35.1386 19.9999C33.9446 21.1063 33.9446 22.9786 35.1386 24.1701L44.7764 33.8722L35.0534 43.5743C33.8593 44.6807 33.8593 46.5531 35.0534 47.7445Z" fill="white"/>',
			'logo-text'   => '<g clip-path="url(#clip0_529_8422)"><path d="M78.1833 16.4426C78.1833 13.2502 78.9284 11.0637 80.4184 9.4457C81.9085 7.82767 84.012 7.04053 86.7292 7.04053C88.0001 7.04053 89.2272 7.30291 90.279 7.82767C91.3746 8.35244 92.2073 9.05213 92.8646 9.92673C92.9961 10.1017 93.0399 10.2766 93.0399 10.4952C93.0399 10.7576 92.9523 10.9325 92.777 11.1075C92.6017 11.2824 92.4264 11.3698 92.1634 11.3698C91.8567 11.3698 91.6375 11.2386 91.4622 11.02C90.9802 10.364 90.3228 9.79554 89.4463 9.35824C88.6136 8.92093 87.6933 8.70228 86.6853 8.70228C84.5379 8.70228 82.9164 9.35824 81.777 10.6702C80.6375 11.9821 80.0678 13.775 80.0678 16.3988C80.0678 19.1539 80.6375 20.9905 81.7332 22.215C82.8288 23.4394 84.4941 24.0954 86.6853 24.0954C87.6495 24.0954 88.526 23.9205 89.4025 23.5269C90.2351 23.1333 90.9363 22.6086 91.4622 21.8651C91.6375 21.6465 91.8567 21.5153 92.1634 21.5153C92.4264 21.5153 92.6017 21.6028 92.777 21.7777C92.9523 21.9526 93.0399 22.1713 93.0399 22.3899C93.0399 22.5648 92.9961 22.7397 92.8646 22.9147C92.2511 23.7893 91.4184 24.489 90.279 25.0137C89.1395 25.5385 87.9563 25.8009 86.6853 25.8009C83.9244 25.8009 81.8208 25.0137 80.3746 23.4832C78.9284 21.9526 78.1833 19.7223 78.1833 16.4426Z" fill="#11293E"/><path d="M96.4582 24.183C95.4502 23.0897 94.9243 21.4279 94.9243 19.2414C94.9243 17.0549 95.4064 15.4369 96.4144 14.3436C97.4223 13.2504 98.8247 12.7256 100.665 12.7256C102.506 12.7256 103.908 13.2504 104.916 14.3436C105.924 15.4369 106.406 17.0549 106.406 19.2414C106.406 21.4279 105.924 23.0897 104.916 24.183C103.908 25.2762 102.506 25.8447 100.665 25.8447C98.8685 25.8447 97.4661 25.2762 96.4582 24.183ZM96.7211 19.2414C96.7211 22.5649 98.0359 24.2267 100.665 24.2267C103.295 24.2267 104.61 22.5649 104.61 19.2414C104.61 15.9179 103.295 14.2562 100.665 14.2562C98.0359 14.2562 96.7211 15.9616 96.7211 19.2414Z" fill="#11293E"/><path d="M108.072 19.285C108.072 14.912 109.912 12.9879 113.55 12.9879C114.383 12.9879 115.128 13.1628 115.785 13.5126C116.442 13.8625 116.968 14.256 117.275 14.7808V7.91514C117.275 7.65275 117.363 7.47783 117.538 7.30291C117.713 7.12799 117.889 7.04053 118.151 7.04053C118.414 7.04053 118.59 7.12799 118.765 7.30291C118.94 7.47783 119.028 7.65275 119.028 7.91514V20.4658C119.028 22.215 118.546 23.5269 117.538 24.4452C116.574 25.3636 115.259 25.8446 113.638 25.8446C111.841 25.8446 110.438 25.2761 109.474 24.1828C108.554 23.0896 108.072 21.4716 108.072 19.285ZM109.825 19.285C109.825 22.6086 111.096 24.2703 113.681 24.2703C114.777 24.2703 115.653 23.9642 116.311 23.3082C116.968 22.6523 117.275 21.7339 117.275 20.4658V16.9673C117.231 16.9236 117.187 16.8361 117.143 16.7049C117.1 16.5738 116.968 16.3988 116.749 16.1365C116.53 15.8741 116.311 15.6117 116.048 15.393C115.785 15.1744 115.434 14.9995 115.04 14.8245C114.602 14.6496 114.163 14.5622 113.681 14.5622C112.41 14.5622 111.49 14.9557 110.789 15.7866C110.132 16.6175 109.825 17.6233 109.825 19.285Z" fill="#11293E"/><path d="M121.131 19.2412C121.131 17.1421 121.614 15.5241 122.622 14.3871C123.629 13.2501 124.988 12.6816 126.785 12.6816C127.486 12.6816 128.143 12.7691 128.669 12.944C129.239 13.1189 129.721 13.3376 130.072 13.6437C130.422 13.9498 130.773 14.2559 131.036 14.6495C131.299 14.9994 131.518 15.3929 131.649 15.8302C131.781 16.2675 131.869 16.6174 131.956 16.9672C132.044 17.3171 132.044 17.6669 132.044 18.0168C132.044 18.2791 132.044 18.4978 132.044 18.629C132.044 18.7602 132 18.9351 131.912 19.1537C131.869 19.3724 131.737 19.5036 131.562 19.591C131.386 19.6785 131.211 19.7222 130.948 19.7222H122.972C122.972 21.0779 123.323 22.1711 124.068 22.9583C124.813 23.7454 125.821 24.1827 127.092 24.1827C127.793 24.1827 128.406 24.0953 128.888 23.8766C129.371 23.658 129.896 23.3956 130.378 23.002C130.554 22.8708 130.729 22.8271 130.861 22.8271C131.08 22.8271 131.255 22.9146 131.43 23.0458C131.562 23.2207 131.649 23.3956 131.649 23.6142C131.649 23.8329 131.562 24.0516 131.343 24.2265C131.167 24.4014 130.904 24.62 130.598 24.8387C130.291 25.0574 129.809 25.2323 129.151 25.4509C128.494 25.6696 127.793 25.757 127.048 25.757C125.163 25.757 123.717 25.2323 122.709 24.139C121.657 23.1332 121.131 21.4715 121.131 19.2412ZM122.928 18.2354H130.291C130.291 17.7106 130.247 17.2296 130.116 16.7923C130.028 16.355 129.853 15.9614 129.59 15.5678C129.327 15.1743 128.976 14.8682 128.494 14.6495C128.012 14.4309 127.442 14.2997 126.785 14.2997C125.602 14.2997 124.725 14.6495 124.024 15.3492C123.367 16.0489 122.972 17.011 122.928 18.2354Z" fill="#11293E"/><path d="M39.5299 8.61488C39.5299 8.17758 39.7052 7.784 40.012 7.47789C40.3188 7.17178 40.7132 6.99686 41.1514 6.99686C41.5458 6.99686 41.8964 7.12805 42.1594 7.3467C42.4223 7.56535 42.5976 7.82773 42.6853 8.09012L45.8845 19.5475L48.996 8.13385C49.0837 7.784 49.259 7.52162 49.5658 7.30297C49.8725 7.08432 50.1793 6.99686 50.4861 6.99686C50.8367 6.99686 51.1435 7.08432 51.4064 7.30297C51.6693 7.52162 51.8885 7.784 51.9761 8.13385L55.0877 19.5475L58.2869 8.04639C58.3745 7.784 58.5498 7.52162 58.8128 7.30297C59.0757 7.08432 59.3825 6.95312 59.8207 6.95312C60.259 6.95312 60.6096 7.08432 60.9164 7.39043C61.2231 7.69654 61.3546 8.04639 61.3546 8.48369C61.3546 8.65861 61.3108 8.83353 61.267 8.96472L56.5777 24.5765C56.4901 24.8826 56.3148 25.1887 56.008 25.3636C55.745 25.5823 55.4383 25.6698 55.0877 25.6698C54.7371 25.6698 54.4303 25.5823 54.1674 25.3636C53.9044 25.145 53.7291 24.8826 53.6415 24.5328L50.4861 13.3378L47.3307 24.6639C47.2431 25.0138 47.0239 25.2762 46.761 25.4948C46.498 25.7135 46.1474 25.8009 45.7968 25.8009C45.4462 25.8009 45.1395 25.7135 44.8765 25.4948C44.6136 25.2762 44.3944 25.0138 44.3068 24.7077L39.6176 9.09592C39.5737 8.96472 39.5299 8.7898 39.5299 8.61488Z" fill="#11293E"/><path d="M63.5897 24.2703V8.61482C63.5897 8.17752 63.765 7.82767 64.028 7.52156C64.3347 7.21545 64.7292 7.04053 65.1674 7.04053H70.3825C72.0917 7.04053 73.4503 7.52156 74.5021 8.48363C75.5539 9.4457 76.1236 10.8451 76.1236 12.638C76.1236 14.4747 75.5977 15.8303 74.5459 16.7924C73.4941 17.7545 72.0917 18.2355 70.4264 18.2355H66.7889V24.2703C66.7889 24.7076 66.6574 25.1012 66.3507 25.4073C66.0439 25.7134 65.6933 25.8446 65.2112 25.8446C64.7292 25.8446 64.3786 25.6697 64.0718 25.3636C63.7212 25.0575 63.5897 24.7076 63.5897 24.2703ZM66.7451 15.393H70.1196C70.9961 15.393 71.6535 15.1307 72.1355 14.6496C72.6176 14.1686 72.8367 13.4689 72.8367 12.5943C72.8367 11.7197 72.6176 11.02 72.1355 10.539C71.6535 10.0579 70.9961 9.83927 70.1634 9.83927H66.7889V15.393H66.7451Z" fill="#11293E"/><path fill-rule="evenodd" clip-rule="evenodd" d="M29.5817 32.8853H3.3745C1.49004 32.8853 0 31.3984 0 29.518V3.36724C0 1.48683 1.49004 0 3.3745 0H29.5817C31.4661 0 32.9562 1.48683 32.9562 3.36724V29.518C32.9562 31.3984 31.4661 32.8853 29.5817 32.8853ZM8.15142 26.7632C7.97612 26.7632 7.75699 26.7194 7.58169 26.6757C6.79285 26.3696 6.39843 25.495 6.7052 24.7078L13.5857 7.08447C13.8924 6.29732 14.7689 5.90375 15.5578 6.20986C16.3466 6.51597 16.7411 7.39058 16.4343 8.17773L9.59763 25.8011C9.37851 26.4133 8.76496 26.7632 8.15142 26.7632ZM18.0119 24.5327C18.3187 24.8388 18.7131 24.97 19.1075 24.97C19.502 24.97 19.8964 24.8388 20.2032 24.5327L25.5936 19.1976C26.5577 18.2355 26.5577 16.6175 25.5936 15.6554L20.2032 10.2766C19.6334 9.66433 18.6693 9.66433 18.0557 10.2766C17.4422 10.845 17.4422 11.8071 18.0557 12.4193L23.0079 17.4046L18.0119 22.3899C17.3984 22.9584 17.3984 23.9204 18.0119 24.5327Z" fill="#0065FF"/></g><defs><clipPath id="clip0_529_8422"><rect width="132" height="32.8853" fill="white"/></clipPath></defs>',
			'auto'        => '<path d="M9.36005 5.61394V8.56131L13.64 4.63148L9.36005 0.70166V3.64903C4.63065 3.64903 0.800049 7.16622 0.800049 11.5087C0.800049 13.0511 1.29225 14.4855 2.12685 15.6939L3.68905 14.2596C3.20755 13.4441 2.94005 12.501 2.94005 11.5087C2.94005 8.25675 5.81835 5.61394 9.36005 5.61394ZM16.5932 7.32341L15.031 8.7578C15.5018 9.58306 15.78 10.5164 15.78 11.5087C15.78 14.7606 12.9017 17.4034 9.36005 17.4034V14.456L5.08005 18.3859L9.36005 22.3157V19.3683C14.0894 19.3683 17.92 15.8511 17.92 11.5087C17.92 9.96622 17.4278 8.53183 16.5932 7.32341Z" fill="#454545"/>',
			'shortcode'   => '<path d="M0 0.137207H4.47458V1.89055H2.40664V14.2398H4.47458V16.0016H0V0.137207Z" fill="#454545"/><path d="M13.885 0.137207H16.2713L10.5019 16.0016H8.13574L13.885 0.137207Z" fill="#454545"/><path d="M24 0.137207H19.5254V1.89055H21.5934V14.2398H19.5254V16.0016H24V0.137207Z" fill="#454545"/>',
			'copy'        => '<path d="M10.8125 1.125H3.3125C2.625 1.125 2.0625 1.6875 2.0625 2.375V11.125H3.3125V2.375H10.8125V1.125ZM12.6875 3.625H5.8125C5.125 3.625 4.5625 4.1875 4.5625 4.875V13.625C4.5625 14.3125 5.125 14.875 5.8125 14.875H12.6875C13.375 14.875 13.9375 14.3125 13.9375 13.625V4.875C13.9375 4.1875 13.375 3.625 12.6875 3.625ZM12.6875 13.625H5.8125V4.875H12.6875V13.625Z" fill="#777777"/>',
			'check'       => '<path d="M5.8002 10.9L1.6002 6.70005L0.200195 8.10005L5.8002 13.7L17.8002 1.70005L16.4002 0.300049L5.8002 10.9Z" fill="#777777"/>',
			'remove'      => '<circle cx="10" cy="10" r="9" stroke="#777777" stroke-width="2"/><rect x="4.6156" y="9.23071" width="10.7692" height="1.53846" fill="#777777"/>',
			'search'      => '<path d="M11.1292 9.87907H10.4709L10.2375 9.65407C11.0542 8.70407 11.5459 7.47074 11.5459 6.12907C11.5459 3.1374 9.12086 0.712402 6.12919 0.712402C3.13752 0.712402 0.712524 3.1374 0.712524 6.12907C0.712524 9.12074 3.13752 11.5457 6.12919 11.5457C7.47086 11.5457 8.70419 11.0541 9.65419 10.2374L9.87919 10.4707V11.1291L14.0459 15.2874L15.2875 14.0457L11.1292 9.87907ZM6.12919 9.87907C4.05419 9.87907 2.37919 8.20407 2.37919 6.12907C2.37919 4.05407 4.05419 2.37907 6.12919 2.37907C8.20419 2.37907 9.87919 4.05407 9.87919 6.12907C9.87919 8.20407 8.20419 9.87907 6.12919 9.87907Z" fill="#BBBBBB"/>',
			'close'       => '<path d="M14.5649 1.41L13.1587 0L7.58348 5.59L2.00831 0L0.602051 1.41L6.17722 7L0.602051 12.59L2.00831 14L7.58348 8.41L13.1587 14L14.5649 12.59L8.98974 7L14.5649 1.41Z" fill="#8C8F9A"/>',
			'upload'      => '<path d="M10.5 8.25V10.5H1.5V8.25H0V10.5C0 11.325 0.675 12 1.5 12H10.5C11.325 12 12 11.325 12 10.5V8.25H10.5ZM2.25 3.75L3.3075 4.8075L5.25 2.8725V9H6.75V2.8725L8.6925 4.8075L9.75 3.75L6 0L2.25 3.75Z" fill="#777777"/>',
			'folder'      => '<path d="M10.2266 3.00016L12.8933 5.66683H24.6666V19.0002H3.33329V3.00016H10.2266ZM11.3333 0.333496H3.33329C1.86663 0.333496 0.679959 1.5335 0.679959 3.00016L0.666626 19.0002C0.666626 20.4668 1.86663 21.6668 3.33329 21.6668H24.6666C26.1333 21.6668 27.3333 20.4668 27.3333 19.0002V5.66683C27.3333 4.20016 26.1333 3.00016 24.6666 3.00016H14L11.3333 0.333496Z" fill="#777777"/>',
			'arrow'       => '<path d="M1.94006 0L0.0600586 1.88L6.16673 8L0.0600586 14.12L1.94006 16L9.94006 8L1.94006 0Z" fill="#777777"/>',
			'file-text'   => '<path d="M13.8333 2.16667V13.8333H2.16667V2.16667H13.8333ZM13.8333 0.5H2.16667C1.25 0.5 0.5 1.25 0.5 2.16667V13.8333C0.5 14.75 1.25 15.5 2.16667 15.5H13.8333C14.75 15.5 15.5 14.75 15.5 13.8333V2.16667C15.5 1.25 14.75 0.5 13.8333 0.5Z" fill="#DDDDDD"/><path d="M9.66667 12.1667H3.83333V10.5H9.66667V12.1667ZM12.1667 8.83333H3.83333V7.16667H12.1667V8.83333ZM12.1667 5.5H3.83333V3.83333H12.1667V5.5Z" fill="#DDDDDD"/>',
			'help'        => '<path fill-rule="evenodd" clip-rule="evenodd" d="M2.16667 9.99984C2.16667 5.39984 5.90001 1.6665 10.5 1.6665C15.1 1.6665 18.8333 5.39984 18.8333 9.99984C18.8333 14.5998 15.1 18.3332 10.5 18.3332C5.90001 18.3332 2.16667 14.5998 2.16667 9.99984ZM11.3333 13.3332V14.9998H9.66667V13.3332H11.3333ZM10.5 16.6665C6.82501 16.6665 3.83334 13.6748 3.83334 9.99984C3.83334 6.32484 6.82501 3.33317 10.5 3.33317C14.175 3.33317 17.1667 6.32484 17.1667 9.99984C17.1667 13.6748 14.175 16.6665 10.5 16.6665ZM7.16667 8.33317C7.16667 6.4915 8.65834 4.99984 10.5 4.99984C12.3417 4.99984 13.8333 6.4915 13.8333 8.33317C13.8333 9.40227 13.175 9.9776 12.534 10.5378C11.9259 11.0692 11.3333 11.587 11.3333 12.4998H9.66667C9.66667 10.9821 10.4518 10.3803 11.142 9.85123C11.6835 9.43618 12.1667 9.06585 12.1667 8.33317C12.1667 7.4165 11.4167 6.6665 10.5 6.6665C9.58334 6.6665 8.83334 7.4165 8.83334 8.33317H7.16667Z" fill="#777777"/>',
			'inbox'       => '<path fill-rule="evenodd" clip-rule="evenodd" d="M13.3333 0.5H1.66667C0.75 0.5 0 1.25 0 2.16667V13.8333C0 14.75 0.741667 15.5 1.66667 15.5H13.3333C14.25 15.5 15 14.75 15 13.8333V2.16667C15 1.25 14.25 0.5 13.3333 0.5ZM13.3333 13.8333H1.66667V11.3333H4.63333C5.20833 12.325 6.275 13 7.50833 13C8.74167 13 9.8 12.325 10.3833 11.3333H13.3333V13.8333ZM9.175 9.66667H13.3333V2.16667H1.66667V9.66667H5.84167C5.84167 10.5833 6.59167 11.3333 7.50833 11.3333C8.425 11.3333 9.175 10.5833 9.175 9.66667Z" fill="#777777"/>',
			'info'        => '<path d="M7.66667 4.33333H9.33334V6H7.66667V4.33333ZM7.66667 7.66666H9.33334V12.6667H7.66667V7.66666ZM8.50001 0.166664C3.90001 0.166664 0.166672 3.9 0.166672 8.5C0.166672 13.1 3.90001 16.8333 8.50001 16.8333C13.1 16.8333 16.8333 13.1 16.8333 8.5C16.8333 3.9 13.1 0.166664 8.50001 0.166664ZM8.50001 15.1667C4.82501 15.1667 1.83334 12.175 1.83334 8.5C1.83334 4.825 4.82501 1.83333 8.50001 1.83333C12.175 1.83333 15.1667 4.825 15.1667 8.5C15.1667 12.175 12.175 15.1667 8.50001 15.1667Z" fill="#EBAD35"/>',
			'success'     => '<path d="M8.50001 0.666656C3.90001 0.666656 0.166672 4.39999 0.166672 8.99999C0.166672 13.6 3.90001 17.3333 8.50001 17.3333C13.1 17.3333 16.8333 13.6 16.8333 8.99999C16.8333 4.39999 13.1 0.666656 8.50001 0.666656ZM8.50001 15.6667C4.82501 15.6667 1.83334 12.675 1.83334 8.99999C1.83334 5.32499 4.82501 2.33332 8.50001 2.33332C12.175 2.33332 15.1667 5.32499 15.1667 8.99999C15.1667 12.675 12.175 15.6667 8.50001 15.6667ZM12.325 5.31666L6.83334 10.8083L4.675 8.65832L3.50001 9.83332L6.83334 13.1667L13.5 6.49999L12.325 5.31666Z" fill="#09A347"/>',
			'warning'     => '<path d="M12.73 0H5.27L0 5.27V12.73L5.27 18H12.73L18 12.73V5.27L12.73 0ZM16 11.9L11.9 16H6.1L2 11.9V6.1L6.1 2H11.9L16 6.1V11.9ZM11.83 4.76L9 7.59L6.17 4.76L4.76 6.17L7.59 9L4.76 11.83L6.17 13.24L9 10.41L11.83 13.24L13.24 11.83L10.41 9L13.24 6.17L11.83 4.76Z" fill="#DF2A35"/>',
			'file'        => '<path d="M28 4H12C9.8 4 8.02 5.8 8.02 8L8 40C8 42.2 9.78 44 11.98 44H36C38.2 44 40 42.2 40 40V16L28 4ZM12 40V8H26V18H36V40H12Z" fill="#777777"/>',
			'support'     => '<path d="M24 4C12.96 4 4 12.96 4 24C4 35.04 12.96 44 24 44C35.04 44 44 35.04 44 24C44 12.96 35.04 4 24 4ZM38.92 18.24L33.36 20.54C32.34 17.82 30.2 15.66 27.46 14.66L29.76 9.1C33.96 10.7 37.3 14.04 38.92 18.24ZM24 30C20.68 30 18 27.32 18 24C18 20.68 20.68 18 24 18C27.32 18 30 20.68 30 24C30 27.32 27.32 30 24 30ZM18.26 9.08L20.6 14.64C17.84 15.64 15.66 17.82 14.64 20.58L9.08 18.26C10.7 14.04 14.04 10.7 18.26 9.08ZM9.08 29.74L14.64 27.44C15.66 30.2 17.82 32.36 20.58 33.36L18.24 38.92C14.04 37.3 10.7 33.96 9.08 29.74ZM29.76 38.92L27.46 33.36C30.2 32.34 32.36 30.18 33.36 27.42L38.92 29.76C37.3 33.96 33.96 37.3 29.76 38.92Z" fill="#777777"/>',
			'code'        => '<path d="M34 36 31.9 33.9 41.7 24 31.9 14.1 34 12 46 24ZM14 36 2 24 14 12 16.1 14.1 6.3 24 16.1 33.9ZM16 25.75Q15.3 25.75 14.775 25.225Q14.25 24.7 14.25 24Q14.25 23.3 14.775 22.775Q15.3 22.25 16 22.25Q16.7 22.25 17.225 22.775Q17.75 23.3 17.75 24Q17.75 24.7 17.225 25.225Q16.7 25.75 16 25.75ZM24 25.75Q23.3 25.75 22.775 25.225Q22.25 24.7 22.25 24Q22.25 23.3 22.775 22.775Q23.3 22.25 24 22.25Q24.7 22.25 25.225 22.775Q25.75 23.3 25.75 24Q25.75 24.7 25.225 25.225Q24.7 25.75 24 25.75ZM32 25.75Q31.3 25.75 30.775 25.225Q30.25 24.7 30.25 24Q30.25 23.3 30.775 22.775Q31.3 22.25 32 22.25Q32.7 22.25 33.225 22.775Q33.75 23.3 33.75 24Q33.75 24.7 33.225 25.225Q32.7 25.75 32 25.75Z"/>',
			'filter'      => '<path d="M28 26V38Q28 38.85 27.425 39.425Q26.85 40 26 40H22Q21.15 40 20.575 39.425Q20 38.85 20 38V26L8.05 10.75Q7.35 9.9 7.85 8.95Q8.35 8 9.4 8H38.6Q39.65 8 40.15 8.95Q40.65 9.9 39.95 10.75ZM24 26.2 36 11H12ZM24 26.2Z"/>',
			'split'       => '<path d="M22.5 44V34Q22.5 31.6 21.7 30.05Q20.9 28.5 19.25 26.85L21.4 24.7Q22.05 25.25 22.775 26.2Q23.5 27.15 24 27.95Q24.85 26.65 25.675 25.7Q26.5 24.75 27.25 24.1Q30.15 21.75 31.425 18.425Q32.7 15.1 32.4 9.7L27.9 14.2L25.8 12.1L33.9 4L42 12.1L39.9 14.2L35.4 9.7Q35.65 16 34.175 19.625Q32.7 23.25 29.25 26.4Q27.05 28.4 26.275 30.05Q25.5 31.7 25.5 34V44ZM12.9 16.2Q12.7 15.3 12.575 13.575Q12.45 11.85 12.55 9.75L8.1 14.2L6 12.1L14.1 4L22.2 12.1L20.1 14.2L15.6 9.7Q15.5 11.6 15.55 13.025Q15.6 14.45 15.8 15.5ZM17.1 24.75Q16.25 23.85 15.225 22.375Q14.2 20.9 13.65 19.15L16.6 18.4Q17.05 19.65 17.8 20.8Q18.55 21.95 19.2 22.65Z"/>',
			'terminal'    => '<path d="M7 40Q5.8 40 4.9 39.1Q4 38.2 4 37V11Q4 9.8 4.9 8.9Q5.8 8 7 8H41Q42.2 8 43.1 8.9Q44 9.8 44 11V37Q44 38.2 43.1 39.1Q42.2 40 41 40ZM7 37H41Q41 37 41 37Q41 37 41 37V15.2H7V37Q7 37 7 37Q7 37 7 37ZM24.5 33.6V30.6H35.5V33.6ZM15 33.4 12.9 31.3 18.05 26.1 12.85 20.9 15 18.8 22.3 26.1Z"/>',
			'error_badge' => '<path d="M22.5 24.6H25.5V14.25H22.5ZM24 31.3Q24.7 31.3 25.2 30.8Q25.7 30.3 25.7 29.6Q25.7 28.9 25.2 28.4Q24.7 27.9 24 27.9Q23.3 27.9 22.8 28.4Q22.3 28.9 22.3 29.6Q22.3 30.3 22.8 30.8Q23.3 31.3 24 31.3ZM24 43.95Q17 42.2 12.5 35.825Q8 29.45 8 21.85V9.95L24 3.95L40 9.95V21.85Q40 29.45 35.5 35.825Q31 42.2 24 43.95ZM24 24.55Q24 24.55 24 24.55Q24 24.55 24 24.55Q24 24.55 24 24.55Q24 24.55 24 24.55ZM24 40.85Q29.75 38.95 33.375 33.675Q37 28.4 37 21.85V12.05L24 7.15L11 12.05V21.85Q11 28.4 14.625 33.675Q18.25 38.95 24 40.85Z"/>',
			'php'         => '<path d="M19.2 31.25 21.35 29.1 16.3 24 21.35 18.95 19.2 16.8 12 24ZM28.8 31.25 36.05 24 28.85 16.8 26.7 18.95 31.75 24 26.65 29.1ZM9 39H39Q39 39 39 39Q39 39 39 39V9Q39 9 39 9Q39 9 39 9H9Q9 9 9 9Q9 9 9 9V39Q9 39 9 39Q9 39 9 39ZM9 9Q9 9 9 9Q9 9 9 9V39Q9 39 9 39Q9 39 9 39Q9 39 9 39Q9 39 9 39V9Q9 9 9 9Q9 9 9 9ZM9 42Q7.75 42 6.875 41.125Q6 40.25 6 39V9Q6 7.75 6.875 6.875Q7.75 6 9 6H19.25Q19.5 4.25 20.85 3.125Q22.2 2 24 2Q25.8 2 27.15 3.125Q28.5 4.25 28.75 6H39Q40.25 6 41.125 6.875Q42 7.75 42 9V39Q42 40.25 41.125 41.125Q40.25 42 39 42ZM24 8.15Q24.7 8.15 25.225 7.625Q25.75 7.1 25.75 6.4Q25.75 5.7 25.225 5.175Q24.7 4.65 24 4.65Q23.3 4.65 22.775 5.175Q22.25 5.7 22.25 6.4Q22.25 7.1 22.775 7.625Q23.3 8.15 24 8.15Z"/>',
			'trash'       => '<path d="M1.77365 13.8333C1.77365 14.75 2.48972 15.5 3.36491 15.5H9.72993C10.6051 15.5 11.3212 14.75 11.3212 13.8333V3.83333H1.77365V13.8333ZM3.36491 5.5H9.72993V13.8333H3.36491V5.5ZM9.33211 1.33333L8.53648 0.5H4.55835L3.76272 1.33333H0.978027V3H12.1168V1.33333H9.33211Z" fill="#777777"/>',
			'tags'        => '<path d="M18.4678 4.87133C20.5107 6.76412 20.5107 9.80688 18.4678 11.6997L14.0931 15.746C13.7298 16.0817 13.1361 16.0853 12.7689 15.7531C12.3978 15.421 12.3978 14.8781 12.7611 14.5389L17.132 10.4961C18.4561 9.27119 18.4561 7.29982 17.132 6.07486L12.1439 1.45966C11.7768 1.12288 11.7807 0.580398 12.1518 0.247552C12.5189 -0.0852947 13.1126 -0.0820805 13.4408 0.254694L18.4678 4.87133ZM1.17182e-05 7.0534V1.71429C1.17182e-05 0.767535 0.839412 5.96342e-05 1.87491 5.96342e-05H7.71447C8.3785 5.96342e-05 9.01128 0.240766 9.48001 0.669681L16.0422 6.6677C17.0187 7.56053 17.0187 9.01048 16.0422 9.90331L10.8315 14.6674C9.85499 15.5603 8.26913 15.5603 7.29261 14.6674L0.732386 8.66763C0.263386 8.23908 0 7.66052 0 7.0534H1.17182e-05ZM4.37479 2.85711C3.68459 2.85711 3.12485 3.36781 3.12485 3.99993C3.12485 4.63205 3.68459 5.14275 4.37479 5.14275C5.06616 5.14275 5.62473 4.63205 5.62473 3.99993C5.62473 3.36781 5.06616 2.85711 4.37479 2.85711Z" fill="#777777"/>',
			'eye'         => '<path d="M7.99996 1.53873C10.5266 1.53873 12.78 3.02603 13.88 5.37917C12.78 7.73231 10.5266 9.21961 7.99996 9.21961C5.47329 9.21961 3.21996 7.73231 2.11996 5.37917C3.21996 3.02603 5.47329 1.53873 7.99996 1.53873ZM7.99996 0.142212C4.66663 0.142212 1.81996 2.3138 0.666626 5.37917C1.81996 8.44454 4.66663 10.6161 7.99996 10.6161C11.3333 10.6161 14.18 8.44454 15.3333 5.37917C14.18 2.3138 11.3333 0.142212 7.99996 0.142212ZM7.99996 3.63352C8.91996 3.63352 9.66663 4.41557 9.66663 5.37917C9.66663 6.34277 8.91996 7.12482 7.99996 7.12482C7.07996 7.12482 6.33329 6.34277 6.33329 5.37917C6.33329 4.41557 7.07996 3.63352 7.99996 3.63352ZM7.99996 2.237C6.34663 2.237 4.99996 3.64748 4.99996 5.37917C4.99996 7.11086 6.34663 8.52135 7.99996 8.52135C9.65329 8.52135 11 7.11086 11 5.37917C11 3.64748 9.65329 2.237 7.99996 2.237Z" fill="#777777"/>',
			'arrow-left'  => '<path d="M3.99 5L16 5L16 3L3.99 3L3.99 1.04995e-06L-3.49691e-07 4L3.99 8L3.99 5Z" fill="#777777"/>',
			'rewind'      => '<path d="M9.125 0.25C5.3975 0.25 2.375 3.2725 2.375 7H0.125L3.125 9.9925L6.125 7H3.875C3.875 4.0975 6.2225 1.75 9.125 1.75C12.0275 1.75 14.375 4.0975 14.375 7C14.375 9.9025 12.0275 12.25 9.125 12.25C7.6775 12.25 6.365 11.6575 5.42 10.705L4.355 11.77C5.5775 12.9925 7.2575 13.75 9.125 13.75C12.8525 13.75 15.875 10.7275 15.875 7C15.875 3.2725 12.8525 0.25 9.125 0.25ZM8.375 4V7.75L11.5625 9.64L12.14 8.68L9.5 7.1125V4H8.375Z" fill="#777777"/>',
			'cloud'       => '<path d="M8 2.00008C9.74667 2.00008 11.2533 3.24008 11.5933 4.95341L11.7933 5.95341L12.8133 6.02675C13.8533 6.09341 14.6667 6.96675 14.6667 8.00008C14.6667 9.10008 13.7667 10.0001 12.6667 10.0001H4C2.52667 10.0001 1.33333 8.80675 1.33333 7.33341C1.33333 5.96675 2.35333 4.82675 3.70667 4.68675L4.42 4.61341L4.75333 3.98008C5.38667 2.76008 6.62667 2.00008 8 2.00008ZM8 0.666748C6.07333 0.666748 4.4 1.76008 3.56667 3.36008C1.56 3.57341 0 5.27341 0 7.33341C0 9.54008 1.79333 11.3334 4 11.3334H12.6667C14.5067 11.3334 16 9.84008 16 8.00008C16 6.24008 14.6333 4.81341 12.9 4.69341C12.4467 2.39341 10.4267 0.666748 8 0.666748Z" fill="#777777"/>',
			'lock'        => '<path d="M14.5 7.5H13.5V5.5C13.5 2.74 11.26 0.5 8.5 0.5C5.74 0.5 3.5 2.74 3.5 5.5V7.5H2.5C1.4 7.5 0.5 8.4 0.5 9.5V19.5C0.5 20.6 1.4 21.5 2.5 21.5H14.5C15.6 21.5 16.5 20.6 16.5 19.5V9.5C16.5 8.4 15.6 7.5 14.5 7.5ZM5.5 5.5C5.5 3.84 6.84 2.5 8.5 2.5C10.16 2.5 11.5 3.84 11.5 5.5V7.5H5.5V5.5ZM14.5 19.5H2.5V9.5H14.5V19.5ZM8.5 16.5C9.6 16.5 10.5 15.6 10.5 14.5C10.5 13.4 9.6 12.5 8.5 12.5C7.4 12.5 6.5 13.4 6.5 14.5C6.5 15.6 7.4 16.5 8.5 16.5Z" fill="white"/>',
			'exclamation' => '<defs><style>.b{fill:#231f20}</style></defs><g transform="translate(-.066)"><path d="M1.6 24a1.338 1.338 0 01-1.3-2.1L11 .9c.6-1.2 1.6-1.2 2.2 0l10.7 21c.6 1.2 0 2.1-1.3 2.1z" fill="#ffce31"/><path class="b" d="M10.3 8.6l1.1 7.4a.605.605 0 001.2 0l1.1-7.4a1.738 1.738 0 10-3.4 0z"/><circle class="b" cx="1.7" cy="1.7" r="1.7" transform="translate(10.3 17.3)"/></g>',
			'devices'     => '<path d="M4 40v-4.5h4.3V11q0-1.25.875-2.125T11.3 8h31v3h-31v24.5H23V40Zm23.95 0q-.85 0-1.4-.675Q26 38.65 26 37.8V15.95q0-.85.55-1.4.55-.55 1.4-.55h13.6q.95 0 1.7.525T44 15.95V37.8q0 .95-.725 1.575T41.55 40ZM29 35.5h12V17H29Z" fill="#777777"/>',
			'desktop'     => '<path d="M16.7 42v-3H21v-5H7q-1.2 0-2.1-.9Q4 32.2 4 31V9q0-1.2.9-2.1Q5.8 6 7 6h34q1.2 0 2.1.9.9.9.9 2.1v22q0 1.2-.9 2.1-.9.9-2.1.9H27v5h4.3v3ZM7 31h34V9H7v22Zm0 0V9v22Z" fill="#777777"/>',
			'mobile'      => '<path d="M13 46q-1.2 0-2.1-.9-.9-.9-.9-2.1V5q0-1.2.9-2.1.9-.9 2.1-.9h22q1.2 0 2.1.9.9.9.9 2.1v38q0 1.2-.9 2.1-.9.9-2.1.9Zm0-4.5V43h22v-1.5Zm0-3h22v-29H13Zm0-32h22V5H13Zm0 0V5v1.5Zm0 35V43Z" fill="#777777"/>',
			'scheduled'   => '<path d="m31.35 33.65 2.25-2.25-7.95-8V13.35h-3V24.6ZM24 44q-4.1 0-7.75-1.575-3.65-1.575-6.375-4.3-2.725-2.725-4.3-6.375Q4 28.1 4 24t1.575-7.75q1.575-3.65 4.3-6.375 2.725-2.725 6.375-4.3Q19.9 4 24 4t7.75 1.575q3.65 1.575 6.375 4.3 2.725 2.725 4.3 6.375Q44 19.9 44 24t-1.575 7.75q-1.575 3.65-4.3 6.375-2.725 2.725-6.375 4.3Q28.1 44 24 44Zm0-20Zm0 17q7 0 12-5t5-12q0-7-5-12T24 7q-7 0-12 5T7 24q0 7 5 12t12 5Z"/>',
			'plus'        => '<path d="M450 856V606H200v-60h250V296h60v250h250v60H510v250h-60Z" fill="#777777"/>',
			'duplicator'  => '<g><path transform="scale(0.18)" class="st1" d="M430.9,218H420c-0.9,0-1.9-0.3-3.4-0.3c-4.3-0.9-8.4-2.8-12.4-4.7c-0.9-0.6-1.9-0.9-2.8-1.6c-0.3-0.3-0.9-0.6-1.2-0.9c-0.6-0.3-0.9-0.6-1.6-1.2c-1.6-1.2-3.1-2.8-4.7-4.3c0,0,0,0-0.3-0.3c-0.9-0.9-1.6-1.9-2.2-3.1c-0.9-1.2-1.6-2.8-2.8-4c-0.9-1.9-1.9-4-3.1-6.2c-0.3-1.2-0.9-2.8-1.2-4c-0.3-0.9-0.3-1.9-0.6-2.8c0.3-0.9,0-2.2,0-3.7c0-0.3,0-0.6,0-0.9c0-4,0.3-7.8,1.2-11.2c1.6-5.6,4.3-10.9,7.5-15.8c0.6-0.6,1.2-1.2,1.6-2.2l5.9-6.2c5-5,5.3-13.4,0.6-18.6c-5.9-7.5-12.7-14.3-19.9-20.5L179.3,303.7c-3.4,3.1-8.7,0.9-8.7-3.7c0.3-34.8,0.9-94.4,1.2-124.2c0-5,6.5-6.5,9.3-2.2l20.8,36.6c1.6,3.1,5.6,3.4,8.1,0.9l93.1-93.1c0,0-0.3,0-0.3-0.3c-1.2-0.6-2.2-1.2-3.7-1.9c-0.6-0.6-1.6-0.9-2.2-1.6c-0.9-0.6-1.9-1.6-3.1-2.2c-0.3-0.3-0.3-0.3-0.6-0.6c-3.1-3.1-5-5.9-6.8-9.3c-3.1-5.6-5-11.5-5.9-17.7c-0.3-0.9-0.3-2.2-0.6-3.4c0-0.6,0-1.2,0-1.9v-8.7c0-7.8-5.6-13.7-13-14.3c-5.6-0.3-11.2-0.6-17.1-0.6c-5.3,0-10.9,0.3-16.1,0.6c-7.5,0.6-13,6.5-13,14c0,4.3-0.3,9.3-1.2,14.3c-0.9,5.9-3.1,11.8-5.9,17.7c-1.6,3.4-4,6.2-6.8,9c-0.3,0.3-0.3,0.3-0.6,0.6c-0.9,0.9-1.9,1.6-3.1,2.2c-0.6,0.6-1.6,0.9-2.2,1.6c-1.2,0.6-2.2,1.2-3.7,1.9c-1.9,0.9-4.3,1.9-6.2,2.2c-1.6,0.6-3.1,0.9-4.7,0.9c-1.2,0.3-2.2,0.3-3.7,0.3h-0.3c-1.9,0-4.3,0-6.2,0c-0.6,0-1.2,0-1.9-0.3c-0.6,0-1.2-0.3-1.6-0.3c-0.9-0.3-1.9-0.3-3.1-0.6c-4.3-1.2-8.4-3.1-11.8-5c-1.9-0.9-3.7-2.2-5.3-3.7c-0.6-0.6-1.2-0.9-1.9-1.6l-6.5-6.8c-5-5.3-13.7-5.9-19.3-1.2c-9,7.8-17.4,15.8-24.5,24.8c-4.7,5.6-4,13.7,0.6,18.6l5.9,6.2c0.6,0.6,1.2,1.2,1.6,2.2c3.1,4.7,5.9,10.2,7.5,15.8c0.9,3.7,1.2,7.5,1.2,11.2c0,0.3,0,0.6,0,0.9c0,1.2-0.3,2.2-0.3,3.7c0,0.9-0.3,1.9-0.6,2.8c-0.3,1.2-0.6,2.8-1.2,4c-0.6,2.2-1.6,4.3-3.1,6.2c-0.6,1.2-1.6,2.8-2.8,4c-0.6,0.9-1.6,1.9-2.2,3.1c0,0,0,0-0.3,0.3c-1.2,1.6-3.1,3.1-4.7,4.3c-0.6,0.3-0.9,0.9-1.6,1.2c-0.3,0.3-0.9,0.6-1.2,0.9c-0.9,0.6-1.9,0.9-2.8,1.6c-4,1.9-8.1,3.7-12.4,4.7c-0.9,0-1.9,0.3-3.4,0.3H69.1c-6.8,0-13.4,5.3-14,12.7c0.3,6.2,0,13,0,19.3c0,5.3,0.3,10.6,0.6,15.8c0.6,7.5,6.2,13,13.7,13l9.9,0.3c0.9,0,1.9,0,3.1,0.3c4,0.9,7.8,2.2,11.2,4c3.4,1.6,6.2,4,9.3,6.5c0.3,0.3,0.3,0.3,0.6,0.6c0.9,0.9,1.6,1.9,2.2,2.8c0.6,0.6,1.2,1.2,1.6,2.2c0.6,1.2,1.6,2.2,2.2,3.7c0.9,1.9,1.9,4,2.8,6.2c0.6,1.6,0.9,3.1,1.2,4.7c0.3,1.2,0.3,2.2,0.6,3.7v0.3c0.3,1.9,0.3,4.3,0,6.2c0,0.6,0,1.2,0,1.9s0,1.2-0.3,1.6c-0.3,0.9-0.3,1.9-0.6,3.1c-0.9,4.3-2.8,8.4-4.7,11.8c-0.6,1.2-1.2,2.8-2.2,3.7c-0.6,0.6-0.9,1.6-1.9,2.2l-6.2,6.8c-5,5-5.6,13-1.2,18.6c6.8,9,14.9,17.4,23.3,24.5l204.3-200.9c3.4-3.1,8.7-0.9,8.7,3.7c-0.3,34.8-0.9,94.4-1.2,124.2c0,5-6.5,6.5-9.3,2.2L302,287.5c-1.6-3.1-5.6-3.4-8.1-0.9l-97.5,97.8c0,0,0.3,0,0.3,0.3c0.9,0.6,1.9,1.2,3.1,2.2c0,0,0,0,0.3,0.3c1.6,1.2,3.1,2.8,4.3,4.3c0.3,0.6,0.9,0.9,1.2,1.6c0.3,0.3,0.6,0.9,0.9,1.2c0.6,0.9,0.9,1.6,1.6,2.8c2.2,3.7,4,7.8,5,11.8c1.9,7.5,2.8,14.6,2.8,20.8c0,7.5,5.6,13.4,12.7,14c6.8,0.6,14.3,1.2,21.4,1.2c7.1,0,14.3-0.3,21.4-1.2c6.8-0.6,12.7-6.5,12.7-14c0-6.2,0.6-14,2.8-20.8c0.9-4,2.8-8.1,5-11.8c0.6-0.9,0.9-1.6,1.6-2.8c0.3-0.3,0.6-0.9,0.9-1.2c0.3-0.6,0.9-0.9,1.2-1.6c1.2-1.6,2.8-3.1,4.3-4.3c0,0,0,0,0.3-0.3c0.9-0.6,1.9-1.6,3.1-2.2c1.2-0.9,2.8-1.6,4.3-2.2c1.9-0.9,4-1.9,6.2-2.8c1.2-0.3,2.8-0.6,4-0.9c0.9-0.3,1.9-0.3,3.1-0.3s2.2-0.3,3.7-0.3c0.3,0,0.6,0,0.9,0c4,0,7.8,0.6,11.2,1.6c5,1.6,9.6,4,14,6.8c0.6,0.6,1.6,1.2,2.2,1.9l6.8,7.5c5.3,5.3,13.7,5.6,19.3,0.9c9-8.1,17.1-16.1,24.2-25.5c4.3-5.6,3.7-13.7-1.2-18.6l-6.2-6.2c-0.6-0.6-1.2-1.2-1.9-2.2c-0.6-1.2-1.6-2.2-2.2-3.7c-1.9-3.7-3.7-7.8-4.7-11.8c-0.3-0.9-0.6-1.9-0.6-3.1c0-0.6-0.3-1.2-0.3-1.6c0-0.6,0-1.2,0-1.9c0-1.9,0-4,0-6.2v-0.3c0-1.2,0.3-2.2,0.6-3.7c0.3-1.6,0.6-3.1,1.2-4.7c0.6-1.9,1.6-4.3,2.8-6.2c0.6-1.2,1.2-2.2,2.2-3.7c0.6-0.6,0.9-1.6,1.6-2.2c0.6-0.9,1.6-1.9,2.2-2.8c0.3-0.3,0.3-0.3,0.6-0.6c2.8-2.8,5.9-5,9.3-6.5c3.7-1.9,7.5-3.4,11.2-4c0.9-0.3,1.9-0.3,3.1-0.3l9.9-0.3c7.5-0.3,13-5.9,13.7-13c0.3-5.3,0.6-10.6,0.6-15.8c0-6.5-0.3-13-0.9-19.3C443.6,223.6,437.7,218.3,430.9,218z" fill="#FE4715"/></g>',
			'robot'       => '<path d="M160-360q-50 0-85-35t-35-85q0-50 35-85t85-35v-80q0-33 23.5-56.5T240-760h120q0-50 35-85t85-35q50 0 85 35t35 85h120q33 0 56.5 23.5T800-680v80q50 0 85 35t35 85q0 50-35 85t-85 35v160q0 33-23.5 56.5T720-120H240q-33 0-56.5-23.5T160-200v-160Zm200-80q25 0 42.5-17.5T420-500q0-25-17.5-42.5T360-560q-25 0-42.5 17.5T300-500q0 25 17.5 42.5T360-440Zm240 0q25 0 42.5-17.5T660-500q0-25-17.5-42.5T600-560q-25 0-42.5 17.5T540-500q0 25 17.5 42.5T600-440ZM320-280h320v-80H320v80Zm-80 80h480v-480H240v480Zm240-240Z" fill="#777777" />',
			'aisparks'    => '<g id="star-2--reward-rating-rate-social-star-media-favorite-like-stars-spark"><path id="Union" class="cls-1" d="m21.9 12.1-3.38-7.67-3.38 7.67-7.67 3.38 7.67 3.38 3.38 7.67 3.38-7.67 7.67-3.38-7.67-3.38Z"/></g><g id="star-2--reward-rating-rate-social-star-media-favorite-like-stars-spark-2"><path id="Union-2" class="cls-1" d="M8.5 4.5 6.52 0 4.54 4.5.04 6.48l4.5 1.98 1.98 4.5 1.98-4.5L13 6.48 8.5 4.5Z"/></g><g id="star-2--reward-rating-rate-social-star-media-favorite-like-stars-spark-3"><path id="Union-3" class="cls-1" d="m5.91 24.09-1.38-3.14-1.38 3.14-3.14 1.38 3.14 1.38 1.38 3.14 1.38-3.14 3.14-1.38-3.14-1.38Z"/></g>',
			'logo-sr'     => '<path class="cls-1" d="M58,64H7c-3.7,0-6.6-2.9-6.6-6.6V6.6C.5,2.9,3.4,0,7,0h51c3.7,0,6.6,2.9,6.6,6.6v50.9c0,3.7-2.9,6.6-6.6,6.6ZM38.5,47.7c.6.6,1.4.9,2.1.9s1.5-.3,2.1-.9l10.5-10.4c1.9-1.9,1.9-5,0-6.9l-10.5-10.5c-1.1-1.2-3-1.2-4.2,0-1.2,1.1-1.2,3,0,4.2l9.6,9.7-9.7,9.7c-1.2,1.1-1.2,3,0,4.2h0ZM9.1,52c-.8,0-1.5-.3-2.1-.9-.6-.6-.9-1.3-.9-2.1s.3-1.5.9-2.1l7.1-7.1c.4-.4.5-.9.2-1.4-.2-.4-.4-.8-.5-1.3-.4-1.1-.6-2.4-.6-3.7,0-3.2,1.1-5.9,3.3-8.1,2.2-2.2,4.9-3.3,8.1-3.3s5.9,1.1,8.1,3.3c2.2,2.2,3.3,4.9,3.3,8.1s-1.1,5.9-3.3,8.1c-2.2,2.2-4.9,3.3-8.1,3.3s-2.5-.2-3.7-.6c-.4-.2-.9-.3-1.3-.5-.2,0-.3-.1-.5-.1-.3,0-.6.1-.9.4l-7.1,7.1c-.6.6-1.3.9-2.1.9ZM24.5,28.2c-1.6,0-2.8.5-3.9,1.6-1.1,1.1-1.6,2.3-1.6,3.9s.5,2.8,1.6,3.9c1.1,1.1,2.3,1.6,3.9,1.6s2.8-.5,3.9-1.6c1.1-1.1,1.6-2.3,1.6-3.9s-.5-2.8-1.6-3.9-2.3-1.6-3.9-1.6Z" fill="#0065FF" fill-rule="evenodd" stroke="0"/>',
			'step-1'      => '<path data-name="1" d="M47.48 67.35v-22.7h-8.8V39.3a16.779 16.779 0 003.57-.27 9.344 9.344 0 003.1-1.15 7.565 7.565 0 002.33-2.18 7.737 7.737 0 001.25-3.35h5.65v35h-7.1z" fill="#fff" fill-rule="evenodd"/>',
			'step-2'      => '<circle cx="50" cy="50" r="50" fill="#ccc"/><path data-name="2" d="M38.53 41.23a12.807 12.807 0 012.4-4.5 10.792 10.792 0 014.02-3 13.616 13.616 0 015.58-1.08 13.905 13.905 0 014.57.75 11.871 11.871 0 013.83 2.15A10.329 10.329 0 0161.55 39a10.589 10.589 0 01.98 4.6 11 11 0 01-.85 4.55 12.168 12.168 0 01-2.25 3.38 18.894 18.894 0 01-3.18 2.67c-1.18.8-2.37 1.59-3.57 2.38s-2.37 1.62-3.5 2.52a16.035 16.035 0 00-3 3.15h16.55v6.1h-25.7a14.681 14.681 0 01.87-5.3 14.2 14.2 0 012.38-4.02 20.5 20.5 0 013.52-3.28c1.35-1 2.78-2.01 4.28-3.05.77-.53 1.58-1.07 2.45-1.62a15.537 15.537 0 002.37-1.83A9.286 9.286 0 0054.7 47a5.5 5.5 0 00.73-2.85 5.006 5.006 0 00-5.25-5.4 4.569 4.569 0 00-2.63.73 5.345 5.345 0 00-1.72 1.9 9.023 9.023 0 00-.93 2.6 15.122 15.122 0 00-.27 2.82h-6.8a16.741 16.741 0 01.7-5.57z" fill="#fff" fill-rule="evenodd"/>',
			'menu'        => '<path d="M120-240v-80h720v80H120Zm0-200v-80h720v80H120Zm0-200v-80h720v80H120Z" fill="#777777"/>',
		)
	);
}
includes/class-wpcode-file-logger.php000064400000021047151331545640013654 0ustar00<?php
/**
 * This class handles logging errors to files.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * WPCode_File_Logger class.
 */
class WPCode_File_Logger {

	/**
	 * Open file handlers.
	 *
	 * @var array
	 */
	protected $handles = array();

	/**
	 * Limit for log file size.
	 *
	 * @var int
	 */
	public $log_size_limit;

	/**
	 * Cache logs that could not be written directly for writing them later.
	 *
	 * @var array
	 */
	protected $cached_logs = array();

	/**
	 * Whether logging is enabled.
	 *
	 * @var bool
	 */
	public $enabled;

	/**
	 * Constructor.
	 *
	 * @param int $log_size_limit File size limit for log files in bytes.
	 */
	public function __construct( $log_size_limit = null ) {
		if ( null === $log_size_limit ) {
			$log_size_limit = 5 * 1024 * 1024;
		}

		$this->log_size_limit = apply_filters( 'wpcode_log_file_size_limit', $log_size_limit );

		add_action( 'plugins_loaded', array( $this, 'write_cached_logs' ) );
	}

	/**
	 * Close all open file handles.
	 */
	public function __destruct() {
		foreach ( $this->handles as $handle ) {
			if ( is_resource( $handle ) ) {
				fclose( $handle ); // @codingStandardsIgnoreLine.
			}
		}
	}

	/**
	 * Write cached logs.
	 */
	public function write_cached_logs() {
		foreach ( $this->cached_logs as $log ) {
			$this->write( $log['entry'], $log['handle'] );
		}
	}

	/**
	 * Format an entry for the log file.
	 *
	 * @param int    $timestamp The timestamp for the log entry.
	 * @param string $message The error message.
	 *
	 * @return mixed|void
	 */
	public function format_entry( $timestamp, $message ) {
		$time_string = date( 'c', $timestamp );// phpcs:ignore WordPress.DateTime.RestrictedFunctions.date_date
		$entry       = "{$time_string} {$message}";

		return apply_filters(
			'wpcode_format_log_entry',
			$entry,
			array(
				'timestamp' => $timestamp,
				'message'   => $message,
			)
		);
	}

	/**
	 * Handle a direct request to log something & format it before writing.
	 *
	 * @param int    $timestamp The timestamp for the log entry.
	 * @param string $message The error message.
	 * @param string $handle The log handle.
	 *
	 * @return void
	 */
	public function handle( $timestamp, $message, $handle ) {
		if ( ! $this->is_enabled() ) {
			return;
		}
		$entry = $this->format_entry( $timestamp, $message );
		$this->write( $entry, $handle );
	}

	/**
	 * Write an entry to a log file by its handle.
	 *
	 * @param string $entry The entry text.
	 * @param string $handle The log handle.
	 *
	 * @return bool
	 */
	public function write( $entry, $handle ) {
		$result = false;

		if ( $this->should_rotate( $handle ) ) {
			$this->log_rotate( $handle );
		}

		if ( $this->open( $handle ) && is_resource( $this->handles[ $handle ] ) ) {
			$result = fwrite( $this->handles[ $handle ], $entry . PHP_EOL ); // @codingStandardsIgnoreLine.
		} else {
			$this->cache_log( $entry, $handle );
		}

		return false !== $result;
	}

	/**
	 * Should the log file be rotated? Returns true if the file is above the size limit.
	 *
	 * @param string $handle Log handle.
	 *
	 * @return bool
	 */
	public function should_rotate( $handle ) {
		$file = self::get_file_path( $handle );
		if ( $file ) {
			if ( $this->is_open( $handle ) ) {
				$file_stat = fstat( $this->handles[ $handle ] );

				return $file_stat['size'] > $this->log_size_limit;
			} elseif ( file_exists( $file ) ) {
				return filesize( $file ) > $this->log_size_limit;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}

	/**
	 * Rotate log files by adding a suffix up to 10.
	 *
	 * @param string $handle Log handle.
	 */
	protected function log_rotate( $handle ) {
		for ( $i = 8; $i >= 0; $i -- ) {
			$this->increment_log_infix( $handle, $i );
		}
		$this->increment_log_infix( $handle );
	}

	/**
	 * Increment a log file suffix.
	 *
	 * @param string   $handle Log handle.
	 * @param null|int $number Optional. Default null. Log suffix number to be incremented.
	 *
	 * @return bool True if increment was successful, otherwise false.
	 */
	protected function increment_log_infix( $handle, $number = null ) {
		if ( null === $number ) {
			$suffix      = '';
			$next_suffix = '.0';
		} else {
			$suffix      = '.' . $number;
			$next_suffix = '.' . ( $number + 1 );
		}

		$rename_from = self::get_file_path( "{$handle}{$suffix}" );
		$rename_to   = self::get_file_path( "{$handle}{$next_suffix}" );

		if ( $this->is_open( $rename_from ) ) {
			$this->close( $rename_from );
		}

		if ( is_writable( $rename_from ) ) { // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_is_writable
			return rename( $rename_from, $rename_to ); // phpcs:ignore WordPress.WP.AlternativeFunctions.rename_rename
		} else {
			return false;
		}

	}

	/**
	 * Open a log file for writing.
	 *
	 * @param string $handle Log handle.
	 *
	 * @return bool
	 */
	public function open( $handle = 'log' ) {
		if ( $this->is_open( $handle ) ) {
			return true;
		}

		$file = self::get_file_path( $handle );

		if ( $file ) {
			if ( ! file_exists( $file ) ) {
				$temphandle = @fopen( $file, 'w+' ); // @codingStandardsIgnoreLine.
				if ( is_resource( $temphandle ) ) {
					@fclose( $temphandle ); // @codingStandardsIgnoreLine.

					if ( defined( 'FS_CHMOD_FILE' ) ) {
						@chmod( $file, FS_CHMOD_FILE ); // @codingStandardsIgnoreLine.
					}
				}
			}

			$resource = @fopen( $file, 'a' ); // @codingStandardsIgnoreLine.

			if ( $resource ) {
				$this->handles[ $handle ] = $resource;

				return true;
			}
		}

		return false;
	}

	/**
	 * Close a log file.
	 *
	 * @param string $handle Log handle.
	 *
	 * @return void
	 */
	public function close( $handle = 'log' ) {
		if ( $this->is_open( $handle ) ) {
			@fclose( $this->handles[ $handle ] ); // @codingStandardsIgnoreLine.
			unset( $this->handles[ $handle ] );
		}
	}

	/**
	 * Check if a handle is open.
	 *
	 * @param string $handle Log handle.
	 *
	 * @return bool True if $handle is open.
	 */
	protected function is_open( $handle ) {
		return array_key_exists( $handle, $this->handles ) && is_resource( $this->handles[ $handle ] );
	}

	/**
	 * Get the file path for a log handle.
	 *
	 * @param string $handle Log handle.
	 *
	 * @return string
	 */
	public static function get_file_path( $handle ) {

		$date_suffix = date( 'Y-m-d', time() );// phpcs:ignore WordPress.DateTime.RestrictedFunctions.date_date
		$hash_suffix = wp_hash( $handle );
		$filename    = sanitize_file_name( implode( '-', array( $handle, $date_suffix, $hash_suffix ) ) . '.log' );

		return self::get_log_dir() . $filename;
	}

	/**
	 * Get the log directory path while also making sure it exists & we have an index.html and a .htaccess file in it.
	 *
	 * @return string
	 */
	public static function get_log_dir() {
		$uploads = wp_upload_dir();

		$base_path = trailingslashit( $uploads['basedir'] ) . 'wpcode-logs/';
		if ( ! file_exists( $base_path ) ) {
			wp_mkdir_p( $base_path );
			WPCode_File_Cache::create_index_html_file( $base_path );
			WPCode_File_Cache::create_htaccess_file( $base_path );
		}

		return $base_path;
	}

	/**
	 * Store a log entry in the cache for writing later.
	 *
	 * @param string $entry Log entry.
	 * @param string $handle Log handle.
	 *
	 * @return void
	 */
	public function cache_log( $entry, $handle ) {
		$this->cached_logs[] = array(
			'entry'  => $entry,
			'handle' => $handle,
		);
	}

	/**
	 * Is logging errors enabled?
	 *
	 * @return bool
	 */
	public function is_enabled() {
		if ( ! isset( $this->enabled ) ) {
			$this->enabled = boolval( wpcode()->settings->get_option( 'error_logging', false ) );
		}

		return $this->enabled;
	}

	/**
	 * Go through the logs folder and return a list of all .log files.
	 *
	 * @return array
	 */
	public function get_logs() {
		$logs = array();

		$files = glob( self::get_log_dir() . '*.log' );

		if ( ! empty( $files ) ) {
			foreach ( $files as $file ) {
				$logs[] = array(
					'filename' => basename( $file ),
					'path'     => $file,
					'size'     => filesize( $file ),
				);
			}
		}

		return $logs;
	}

	/**
	 * Delete a log file by its name.
	 *
	 * @param string $name Log name.
	 *
	 * @return void
	 */
	public function delete_log( $name ) {
		// If the file doesn't include the .log extension, add it.
		if ( ! preg_match( '/\.log$/', $name ) ) {
			$name .= '.log';
		}

		$real_file_path = realpath( self::get_log_dir() . $name );
		$real_base_path = realpath( self::get_log_dir() ) . DIRECTORY_SEPARATOR;
		if ( false === $real_file_path || strpos( $real_file_path, $real_base_path ) !== 0 ) {
			// Traversal attempt.
			return;
		}

		// Delete the file from the server.
		@unlink( $real_file_path ); // @codingStandardsIgnoreLine.
	}

}
includes/compat.php000064400000010564151331545640010363 0ustar00<?php

defined( 'ABSPATH' ) || exit;

if ( ! function_exists( 'str_contains' ) ) {
	/**
	 * Polyfill for str_contains() function added in PHP 8.0.
	 *
	 * @param string $haystack The string to search in.
	 * @param string $needle The substring to search for in the haystack.
	 *
	 * @return bool True if $needle is in $haystack, otherwise false.
	 */
	function str_contains( $haystack, $needle ) {
		return ( '' === $needle || false !== strpos( $haystack, $needle ) );
	}
}

if ( ! function_exists( 'wp_doing_ajax' ) ) {
	/**
	 * Determines whether the current request is a WordPress Ajax request.
	 *
	 * @return bool True if it's a WordPress Ajax request, false otherwise.
	 * @since 4.7.0
	 *
	 */
	function wp_doing_ajax() {
		/**
		 * Filters whether the current request is a WordPress Ajax request.
		 *
		 * @param bool $wp_doing_ajax Whether the current request is a WordPress Ajax request.
		 *
		 * @since 4.7.0
		 *
		 */
		return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX );
	}
}

if ( ! function_exists( 'wp_doing_cron' ) ) {
	/**
	 * Determines whether the current request is a WordPress cron request.
	 *
	 * @return bool True if it's a WordPress cron request, false otherwise.
	 * @since 4.8.0
	 *
	 */
	function wp_doing_cron() {
		/**
		 * Filters whether the current request is a WordPress cron request.
		 *
		 * @param bool $wp_doing_cron Whether the current request is a WordPress cron request.
		 *
		 * @since 4.8.0
		 *
		 */
		return apply_filters( 'wp_doing_cron', defined( 'DOING_CRON' ) && DOING_CRON );
	}
}

if ( ! function_exists( 'sanitize_textarea_field' ) ) {
	/**
	 * Sanitizes a multiline string from user input or from the database.
	 *
	 * The function is like sanitize_text_field(), but preserves
	 * new lines (\n) and other whitespace, which are legitimate
	 * input in textarea elements.
	 *
	 * @param string $str String to sanitize.
	 *
	 * @return string Sanitized string.
	 * @see sanitize_text_field()
	 *
	 * @since 4.7.0
	 *
	 */
	function sanitize_textarea_field( $str ) {
		$filtered = _sanitize_text_fields( $str, true );

		/**
		 * Filters a sanitized textarea field string.
		 *
		 * @param string $filtered The sanitized string.
		 * @param string $str The string prior to being sanitized.
		 *
		 * @since 4.7.0
		 *
		 */
		return apply_filters( 'sanitize_textarea_field', $filtered, $str );
	}
}

if ( ! function_exists( '_sanitize_text_fields' ) ) {
	/**
	 * Internal helper function to sanitize a string from user input or from the database.
	 *
	 * @param string $str String to sanitize.
	 * @param bool   $keep_newlines Optional. Whether to keep newlines. Default: false.
	 *
	 * @return string Sanitized string.
	 * @since 4.7.0
	 * @access private
	 *
	 */
	function _sanitize_text_fields( $str, $keep_newlines = false ) {
		if ( is_object( $str ) || is_array( $str ) ) {
			return '';
		}

		$str = (string) $str;

		$filtered = wp_check_invalid_utf8( $str );

		if ( strpos( $filtered, '<' ) !== false ) {
			$filtered = wp_pre_kses_less_than( $filtered );
			// This will strip extra whitespace for us.
			$filtered = wp_strip_all_tags( $filtered, false );

			/*
			 * Use HTML entities in a special case to make sure that
			 * later newline stripping stages cannot lead to a functional tag.
			 */
			$filtered = str_replace( "<\n", "&lt;\n", $filtered );
		}

		if ( ! $keep_newlines ) {
			$filtered = preg_replace( '/[\r\n\t ]+/', ' ', $filtered );
		}
		$filtered = trim( $filtered );

		// Remove percent-encoded characters.
		$found = false;
		while ( preg_match( '/%[a-f0-9]{2}/i', $filtered, $match ) ) {
			$filtered = str_replace( $match[0], '', $filtered );
			$found    = true;
		}

		if ( $found ) {
			// Strip out the whitespace that may now exist after removing percent-encoded characters.
			$filtered = trim( preg_replace( '/ +/', ' ', $filtered ) );
		}

		return $filtered;
	}
}

add_filter( 'pto/posts_orderby/ignore', 'wpcode_exclude_post_types_order', 15, 3 );

/**
 * Exclude the wpcode post type from the Post Types Order plugin.
 *
 * @param bool     $ignore Whether to ignore the post type.
 * @param string   $order_by The order by param.
 * @param WP_Query $query The WP_Query instance.
 *
 * @return bool
 */
function wpcode_exclude_post_types_order( $ignore, $order_by, $query ) {
	if ( ! method_exists( $query, 'get' ) ) {
		return $ignore;
	}

	if ( 'wpcode' === $query->get( 'post_type' ) ) {
		$ignore = true;
	}

	return $ignore;
}
includes/capabilities.php000064400000005371151331545640011531 0ustar00<?php
/**
 * Map capabilites with backwards compatibility.
 *
 * @package WPCode
 */

// Prevent direct access.
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

add_filter( 'map_meta_cap', 'wpcode_map_meta_cap', 10, 4 );

/**
 * Map capabilites with backwards compatibility.
 *
 * @param string[] $caps Primitive capabilities required of the user.
 * @param string   $cap Capability being checked.
 * @param int      $user_id The user ID.
 * @param array    $args Adds context to the capability check, typically
 *                          starting with an object ID.
 *
 * @return array
 */
function wpcode_map_meta_cap( $caps, $cap, $user_id, $args ) {

	$custom_capabilities = array(
		'wpcode_edit_php_snippets',
		'wpcode_edit_html_snippets',
		'wpcode_manage_conversion_pixels',
		'wpcode_file_editor',
		'wpcode_manage_settings',
	);

	if ( in_array( $cap, $custom_capabilities, true ) ) {
		return array( 'wpcode_edit_snippets' );
	}

	return $caps;
}

/**
 * Get an array of the custom capabilities that WPCode uses.
 *
 * @return array[]
 */
function wpcode_custom_capabilities() {
	return array(
		'wpcode_edit_text_snippets'       => array(
			'label'       => __( 'Edit Text/Blocks Snippets', 'insert-headers-and-footers' ),
			'description' => __( 'This enables users to edit just text & blocks snippets, no HTML code is allowed.', 'insert-headers-and-footers' ),
		),
		'wpcode_edit_html_snippets'       => array(
			'label'       => __( 'Edit HTML, JavaScript & CSS Snippets', 'insert-headers-and-footers' ),
			'description' => __( 'This enables users to add and manage HTML, JavaScript & CSS snippets but also Text & Blocks snippets.', 'insert-headers-and-footers' ),
		),
		'wpcode_edit_php_snippets'        => array(
			'label'       => __( 'Edit PHP Snippets', 'insert-headers-and-footers' ),
			'description' => __( 'This enables users to add and manage PHP snippets and all the other types of snippets.', 'insert-headers-and-footers' ),
		),
		'wpcode_manage_conversion_pixels' => array(
			'label'       => __( 'Manage Conversion Pixels Settings', 'insert-headers-and-footers' ),
			'description' => __( 'This enables users to manage the conversion pixels settings.', 'insert-headers-and-footers' ),
		),
		'wpcode_file_editor'              => array(
			'label'       => __( 'Use the File Editor', 'insert-headers-and-footers' ),
			'description' => __( 'This enables users to use the file editor.', 'insert-headers-and-footers' ),
		),
	);
}

/**
 * Return just the keys to avoid a gettext call that causes an endless loop with TranslatePress.
 *
 * @return string[]
 */
function wpcode_custom_capabilities_keys() {
	return array(
		'wpcode_edit_text_snippets',
		'wpcode_edit_html_snippets',
		'wpcode_edit_php_snippets',
		'wpcode_manage_conversion_pixels',
		'wpcode_file_editor',
	);
}

includes/class-wpcode-smart-tags.php000064400000016317151331545640013546 0ustar00<?php
/**
 * Base class used for Smart Tags throughout the plugin.
 *
 * @package WPCode
 */

/**
 * WPCode_Smart_Tags class.
 */
class WPCode_Smart_Tags {

	/**
	 * The tags array.
	 *
	 * @var array
	 */
	protected $tags;

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->hooks();
	}

	/**
	 * Add filters to replace the tags in the snippet code.
	 *
	 * @return void
	 */
	public function hooks() {
	}

	/**
	 * Load tags in the instance.
	 *
	 * @return void
	 */
	public function load_tags() {
		$generic_tags = array(
			'id'           => array(
				'label'    => __( 'Content ID', 'insert-headers-and-footers' ),
				'function' => array( $this, 'get_the_ID' ),
			),
			'title'        => array(
				'label'    => __( 'Content title', 'insert-headers-and-footers' ),
				'function' => array( $this, 'get_the_title' ),
			),
			'categories'   => array(
				'label'    => __( 'Content Categories', 'insert-headers-and-footers' ),
				'function' => array( $this, 'tag_value_categories' ),
			),
			'email'        => array(
				'label'    => __( 'User\'s email', 'insert-headers-and-footers' ),
				'function' => array( $this, 'tag_value_email' ),
			),
			'first_name'   => array(
				'label'    => __( 'User\'s first name', 'insert-headers-and-footers' ),
				'function' => array( $this, 'tag_value_first_name' ),
			),
			'last_name'    => array(
				'label'    => __( 'User\'s last name', 'insert-headers-and-footers' ),
				'function' => array( $this, 'tag_value_last_name' ),
			),
			'custom_field' => array(
				'label'      => __( 'Custom Field (meta)', 'insert-headers-and-footers' ),
				'function'   => array( $this, 'tag_value_custom_field' ),
				'editor_tag' => 'custom_field="meta_key"',
			),
			'author_id'    => array(
				'label'    => __( 'Author ID', 'insert-headers-and-footers' ),
				'function' => array( $this, 'tag_value_author_id' ),
			),
			'author_name'  => array(
				'label'    => __( 'Author Name', 'insert-headers-and-footers' ),
				'function' => array( $this, 'tag_value_author_name' ),
			),
			'author_url'   => array(
				'label'    => __( 'Author URL', 'insert-headers-and-footers' ),
				'function' => array( $this, 'tag_value_author_url' ),
			),
			'login_url'    => array(
				'label'    => __( 'Login URL', 'insert-headers-and-footers' ),
				'function' => array( $this, 'tag_value_login_url' ),
			),
			'logout_url'   => array(
				'label'    => __( 'Logout URL', 'insert-headers-and-footers' ),
				'function' => array( $this, 'tag_value_logout_url' ),
			),
			'permalink'    => array(
				'label'    => __( 'Permalink', 'insert-headers-and-footers' ),
				'function' => array( $this, 'tag_value_permalink' ),
			),
		);

		$woocommerce_tags = array(
			'wc_order_number'   => array(
				'label'    => __( 'Order number', 'insert-headers-and-footers' ),
				'function' => array( $this, 'tag_value_wc_order_number' ),
			),
			'wc_order_subtotal' => array(
				'label'    => __( 'Order subtotal', 'insert-headers-and-footers' ),
				'function' => array( $this, 'tag_value_wc_order_subtotal' ),
			),
			'wc_order_total'    => array(
				'label'    => __( 'Order total', 'insert-headers-and-footers' ),
				'function' => array( $this, 'tag_value_wc_order_total' ),
			),
		);

		$tags = array(
			'generic' => array(
				'label' => '',
				'tags'  => $generic_tags,
			),
		);

		if ( $this->woocommerce_available() ) {
			$tags['woocommerce'] = array(
				'label' => 'WooCommerce',
				'tags'  => $woocommerce_tags,
			);
		}

		$this->tags = apply_filters( 'wpcode_smart_tags', $tags );
	}

	/**
	 * Get smart tags with labels.
	 *
	 * @return array
	 */
	public function get_tags() {
		if ( ! isset( $this->tags ) ) {
			$this->load_tags();
		}

		return $this->tags;
	}

	/**
	 * Check if WooCommerce is installed & active on the site.
	 *
	 * @return bool
	 */
	public function woocommerce_available() {
		return class_exists( 'woocommerce' );
	}

	/**
	 * @param $tag
	 *
	 * @return false|mixed
	 */
	public function get_tag_editor_tag( $tag ) {
		$tags = $this->get_tags();
		foreach ( $tags as $category ) {
			if ( isset( $category['tags'][ $tag ]['editor_tag'] ) ) {
				return $category['tags'][ $tag ]['editor_tag'];
			}
		}

		return $tag;
	}

	/**
	 * Get a tag in the format used in the code.
	 *
	 * @param string $tag The tag to wrap in code format.
	 *
	 * @return string
	 */
	public function get_tag_code( $tag ) {
		return "{{$tag}}";
	}

	/**
	 * Smart tags picker markup with a target id where the selected smart tag will be inserted.
	 *
	 * @param string $target The id of the textarea where the smart tag will be inserted.
	 *
	 * @return void
	 */
	public function smart_tags_picker( $target = '' ) {
		$tags        = $this->get_tags();
		$unavailable = ! empty( $this->upgrade_notice_data() ) ? ' wpcode-smart-tags-unavailable' : '';
		?>
		<div class="wpcode-smart-tags <?php echo esc_attr( $unavailable ); ?>">
			<button class="wpcode-smart-tags-toggle" type="button">
				<?php wpcode_icon( 'tags', 20, 16, '0 0 20 16' ); ?>
				<span class="wpcode-text-default">
					<?php esc_html_e( 'Show Smart Tags', 'insert-headers-and-footers' ); ?>
					</span>
				<span class="wpcode-text-active">
					<?php esc_html_e( 'Hide Smart Tags', 'insert-headers-and-footers' ); ?>
					</span>
			</button>
			<div class="wpcode-smart-tags-dropdown" data-target="<?php echo esc_attr( $target ); ?>" <?php $this->upgrade_data_attributes(); ?>>
				<?php
				foreach ( $tags as $tag_category ) {
					?>
					<ul>
						<?php
						if ( ! empty( $tag_category['label'] ) ) {
							printf(
								'<li class="wpcode-smart-tag-category-label">%s</li>',
								esc_html( $tag_category['label'] )
							);
						}
						if ( ! empty( $tag_category['tags'] ) ) {
							foreach ( $tag_category['tags'] as $tag => $tag_data ) {
								if ( empty( $tag_data['label'] ) ) {
									continue;
								}
								$this->tag_button( $tag, $tag_data['label'] );
							}
						}
						?>
					</ul>
					<?php
				}
				?>
				<div class="wpcode-smart-tags-dropdown-footer">
					<a href="<?php echo esc_url( wpcode_utm_url( 'https://wpcode.com/docs/smart-tags', 'smart-tags', 'dropdown' ) ); ?>" target="_blank" rel="noopener noreferrer">
						<?php wpcode_icon( 'help', 21 ); ?>
						<?php esc_html_e( 'Learn more about Smart Tags', 'insert-headers-and-footers' ); ?>
					</a>
				</div>
			</div>
		</div>
		<?php
	}

	/**
	 * Print the tag button markup.
	 *
	 * @param string $tag The tag.
	 * @param string $label The tag label.
	 *
	 * @return void
	 */
	public function tag_button( $tag, $label = '' ) {
		$tag_code   = $this->get_tag_code( $tag );
		$editor_tag = $this->get_tag_code( $this->get_tag_editor_tag( $tag ) );
		printf(
			'<li><button class="wpcode-insert-smart-tag" data-tag="%3$s" type="button"><code>%1$s</code> - %2$s</button></li>',
			esc_html( $tag_code ),
			esc_html( $label ),
			esc_attr( $editor_tag )
		);
	}

	/**
	 * Get upgrade notice data.
	 *
	 * @return array
	 */
	public function upgrade_notice_data() {
		return array();
	}

	/**
	 * Print upgrade notice data attributes, if any.
	 *
	 * @return void
	 */
	public function upgrade_data_attributes() {
		$upgrade_data = $this->upgrade_notice_data();

		foreach ( $upgrade_data as $attribute => $value ) {
			printf( ' data-upgrade-%s="%s"', esc_attr( $attribute ), esc_attr( $value ) );
		}
	}
}
includes/lite/class-wpcode-admin-bar-info-lite.php000064400000005431151331545640016132 0ustar00<?php
/**
 * WPCode_Admin_Bar_Info_Lite class.
 *
 * @package WPCode
 */

/**
 * Class WPCode_Admin_Bar_Info_Lite.
 *
 * @extends WPCode_Admin_Bar_Info
 */
class WPCode_Admin_Bar_Info_Lite extends WPCode_Admin_Bar_Info {

	/**
	 * Add the WPCode info to the admin bar.
	 *
	 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
	 */
	public function add_admin_bar_info( $wp_admin_bar ) {
		parent::add_admin_bar_info( $wp_admin_bar );

		// Only show this on pages where the page scripts is an option.
		if ( is_singular() ) {
			$wp_admin_bar->add_menu(
				array(
					'id'     => 'wpcode-page-scripts',
					'parent' => 'wpcode-admin-bar-info',
					'title'  => esc_html__( 'Page Scripts', 'insert-headers-and-footers' ) . $this->get_pro_indicator(),
					'meta'   => array(
						'class' => 'wpcode-admin-bar-has-upsell-submenu',
					),
				)
			);
			$wp_admin_bar->add_menu(
				array(
					'id'     => 'wpcode-page-scripts-upgrade',
					'parent' => 'wpcode-page-scripts',
					'meta'   => array(
						'class' => 'wpcode-admin-bar-upsell-submenu',
						'html'  => $this->get_upsell_markup(),
					),
				)
			);
		}
	}

	/**
	 * Get the pro indicator.
	 *
	 * @return string
	 */
	public function get_pro_indicator() {
		return ' <span class="wpcode-pro-indicator">PRO</span>';
	}

	/**
	 * Add upgrade link to the admin bar.
	 *
	 * @param WP_Admin_Bar $wp_admin_bar The admin bar instance.
	 *
	 * @return void
	 */
	public function add_admin_bar_quick_links( $wp_admin_bar ) {
		parent::add_admin_bar_quick_links( $wp_admin_bar );

		$wp_admin_bar->add_menu(
			array(
				'id'     => 'wpcode-upgrade',
				'parent' => 'wpcode-admin-bar-info',
				'title'  => esc_html__( 'Upgrade to Pro', 'insert-headers-and-footers' ),
				'meta'   => array(
					'class'  => 'wpcode-admin-bar-info-submenu',
					'target' => '_blank',
					'rel'    => 'noopener noreferrer',
				),
				'href'   => wpcode_utm_url( 'https://wpcode.com/lite/', 'admin-bar', 'upgrade-to-pro' ),
			)
		);
	}

	/**
	 * Get the upsell markup.
	 *
	 * @return string
	 */
	public function get_upsell_markup() {

		$html = '<div class="wpcode-admin-bar-submenu-upsell">';

		$html .= '<span class="wpcode-heading">' . esc_html__( 'Page Scripts is a Pro Feature', 'insert-headers-and-footers' ) . '</span>';
		$html .= '<p>' . esc_html__( 'While you can always use global snippets, in the PRO version you can easily add page-specific scripts and snippets directly from the post edit screen.', 'insert-headers-and-footers' ) . '</p>';
		$html .= '<a class="wpcode-button" href="' . esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'admin-bar', 'page-scripts' ) ) . '" target="_blank" rel="noopener noreferrer">' . esc_html__( 'Upgrade to Pro and Unlock Page Scripts', 'insert-headers-and-footers' ) . '</a>';

		$html .= '</div>';

		return $html;
	}

}includes/lite/class-wpcode-smart-tags-lite.php000064400000001352151331545640015427 0ustar00<?php
/**
 * Smart tags class for the lite version.
 *
 * @package WPCode
 */

/**
 * WPCode_Smart_Tags_Lite class.
 */
class WPCode_Smart_Tags_Lite extends WPCode_Smart_Tags {

	/**
	 * Upgrade notice data.
	 *
	 * @return array
	 */
	public function upgrade_notice_data() {
		return array(
			'title'  => __( 'Smart Tags are a Premium feature', 'insert-headers-and-footers' ),
			'text'   => __( 'Upgrade to PRO today and simplify the way you write advanced snippets using smart tags without having to write any PHP code.', 'insert-headers-and-footers' ),
			'button' => __( 'Upgrade to PRO', 'insert-headers-and-footers' ),
			'link'   => wpcode_utm_url( 'https://wpcode.com/lite/', 'snippet-manager', 'smart-tags', 'upgrade-cta' ),
		);
	}
}
includes/lite/loader.php000064400000006533151331545640011304 0ustar00<?php
/**
 * File used for importing lite-only files.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

if ( is_admin() || defined( 'DOING_CRON' ) && DOING_CRON ) {
	// Revisions display trait lite.
	require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/trait-wpcode-revisions-display.php';
	// Class used for loading the scripts metabox.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/admin/class-wpcode-metabox-snippets-lite.php';
	// Load lite-specific scripts.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/admin/admin-scripts.php';
	// Load lite notices.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/admin/notices.php';
	// Lite-specific admin page loader.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/admin/class-wpcode-admin-page-loader-lite.php';
	// Connect to upgrade.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/admin/class-wpcode-connect.php';
	// Usage tracking abstract.
	require_once WPCODE_PLUGIN_PATH . 'includes/admin/class-wpcode-usage-tracking.php';
	// Usage tracking lite.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/admin/class-wpcode-usage-tracking-lite.php';
	// Load smart tags class.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/class-wpcode-smart-tags-lite.php';
}
// Load the admin bar info.
require_once WPCODE_PLUGIN_PATH . 'includes/lite/class-wpcode-admin-bar-info-lite.php';

add_action( 'plugins_loaded', 'wpcode_plugins_loaded_load_lite_files', 2 );

/**
 * Require files on plugins_loaded.
 *
 * @return void
 */
function wpcode_plugins_loaded_load_lite_files() {
	// Make sure this is loaded in older versions of WP.
	require_once WPCODE_PLUGIN_PATH . 'includes/auto-insert/class-wpcode-auto-insert-type.php';
	// Load WooCommerce auto-insert locations.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php';
	// Load EDD auto-insert locations.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/auto-insert/class-wpcode-auto-insert-edd.php';
	// Load MemberPress auto-insert locations.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php';
	// Load the insert-anywhere class.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/auto-insert/class-wpcode-auto-insert-anywhere.php';
	// Load the content class.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/auto-insert/class-wpcode-auto-insert-content.php';
	// Load Device type conditional logic.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/conditional-logic/class-wpcode-conditional-device.php';
	// Load Location conditional logic.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/conditional-logic/class-wpcode-conditional-location.php';
	// Load WooCommerce conditional logic.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php';
	// Load EDD conditional logic.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/conditional-logic/class-wpcode-conditional-edd.php';
	// Load MemberPress conditional logic.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/conditional-logic/class-wpcode-conditional-memberpress.php';
	// Load Snippet conditional logic.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/conditional-logic/class-wpcode-conditional-snippet.php';
	// Load Schedule conditional logic.
	require_once WPCODE_PLUGIN_PATH . 'includes/lite/conditional-logic/class-wpcode-conditional-schedule.php';
}
includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php000064400000006353151331545640022636 0ustar00<?php
/**
 * Class that handles conditional logic related to WooCommerce.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * The WPCode_Conditional_WooCommerce class.
 */
class WPCode_Conditional_WooCommerce_Lite extends WPCode_Conditional_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'woocommerce';

	/**
	 * The type category.
	 *
	 * @var string
	 */
	public $category = 'ecommerce';

	/**
	 * Set the translatable label.
	 *
	 * @return void
	 */
	protected function set_label() {
		$this->label = 'WooCommerce (PRO)';
	}

	/**
	 * Set the type options for the admin mainly.
	 *
	 * @return void
	 */
	public function load_type_options() {
		$this->options = array(
			'wc_page' => array(
				'label'       => __( 'WooCommerce Page', 'insert-headers-and-footers' ),
				'description' => __( 'Load the snippet on specific WooCommerce pages.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'upgrade'     => array(
					'title' => __( 'WooCommerce Page Rules is a Pro Feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Get access to advanced conditional logic rules for WooCommerce by upgrading to PRO today.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'woocommerce-page' ),
				),
				'options'     => array(
					array(
						'label'    => __( 'Checkout Page', 'insert-headers-and-footers' ),
						'value'    => '',
						'disabled' => true,
					),
					array(
						'label'    => __( 'Thank You Page', 'insert-headers-and-footers' ),
						'value'    => '',
						'disabled' => true,
					),
					array(
						'label'    => __( 'Cart Page', 'insert-headers-and-footers' ),
						'value'    => '',
						'disabled' => true,
					),
					array(
						'label'    => __( 'Single Product Page', 'insert-headers-and-footers' ),
						'value'    => '',
						'disabled' => true,
					),
					array(
						'label'    => __( 'Shop Page', 'insert-headers-and-footers' ),
						'value'    => '',
						'disabled' => true,
					),
					array(
						'label'    => __( 'Product Category Page', 'insert-headers-and-footers' ),
						'value'    => '',
						'disabled' => true,
					),
					array(
						'label'    => __( 'Product Tag Page', 'insert-headers-and-footers' ),
						'value'    => '',
						'disabled' => true,
					),
					array(
						'label'    => __( 'My Account Page', 'insert-headers-and-footers' ),
						'value'    => '',
						'disabled' => true,
					),
				),
			),
			'wc_cart' => array(
				'label'       => __( 'WooCommerce Cart', 'insert-headers-and-footers' ),
				'description' => __( 'Load the snippet based on the WooCommerce Cart Contents.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'options'     => array(),
				'upgrade'     => array(
					'title' => __( 'WooCommerce Cart Contents Rule is a Pro Feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Get access to advanced conditional logic rules for WooCommerce by upgrading to PRO today.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'woocommerce-cart' ),
				),
			),
		);
	}
}

new WPCode_Conditional_WooCommerce_Lite();
includes/lite/conditional-logic/class-wpcode-conditional-location.php000064400000004100151331545640022113 0ustar00<?php
/**
 * Placeholder class that handles conditional logic based on location.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}


/**
 * The WPCode_Conditional_Location class.
 */
class WPCode_Conditional_Location_Lite extends WPCode_Conditional_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'location';

	/**
	 * The type category.
	 *
	 * @var string
	 */
	public $category = 'who';

	/**
	 * Set the type options for the admin mainly.
	 *
	 * @return void
	 */
	public function load_type_options() {
		$this->options = array(
			'country'   => array(
				'label'       => __( 'Country', 'insert-headers-and-footers' ),
				'description' => __( 'Limit loading the snippet based on the visitor\'s country.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'options'     => array(),
				'upgrade'     => array(
					'title' => __( 'Location Rules are a Pro Feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Get access to location-based conditional logic rules by upgrading to PRO today.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'location-country' ),
				),
			),
			'continent' => array(
				'label'       => __( 'Continent', 'insert-headers-and-footers' ),
				'description' => __( 'Target entire continents with ease.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'options'     => array(),
				'upgrade'     => array(
					'title' => __( 'Location Rules are a Pro Feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Get access to location-based conditional logic rules by upgrading to PRO today.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'location-continent' ),
				),
			),
		);
	}

	/**
	 * Set the translatable label.
	 *
	 * @return void
	 */
	protected function set_label() {
		$this->label = __( 'Location', 'insert-headers-and-footers' ) . ' (PRO)';
	}
}

new WPCode_Conditional_Location_Lite();
includes/lite/conditional-logic/class-wpcode-conditional-snippet.php000064400000002717151331545640022001 0ustar00<?php
/**
 * Class that handles conditional logic for snippets type
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * The WPCode_Conditional_Snippet class.
 */
class WPCode_Conditional_Snippet_Lite extends WPCode_Conditional_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'snippet';

	/**
	 * The type category.
	 *
	 * @var string
	 */
	public $category = 'advanced';

	/**
	 * Set the translatable label.
	 *
	 * @return void
	 */
	protected function set_label() {
		$this->label = __( 'Snippet', 'insert-headers-and-footers' ) . ' (PRO)';
	}

	/**
	 * Set the type options for the admin mainly.
	 *
	 * @return void
	 */
	public function load_type_options() {
		$this->options = array(
			'snippet_loaded' => array(
				'label'       => __( 'WPCode Snippet', 'insert-headers-and-footers' ),
				'description' => __( 'Load this snippet based on another snippet being loaded.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'options'     => array(),
				'upgrade'     => array(
					'title' => __( 'WPCode Snippet Loaded Rules are a Pro Feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Upgrade today and use conditional logic rules based on other WPCode snippets being loaded.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'snippet' ),
				),
			),
		);

	}
}

new WPCode_Conditional_Snippet_Lite();
includes/lite/conditional-logic/class-wpcode-conditional-device.php000064400000010163151331545640021550 0ustar00<?php
/**
 * Placeholder Class that handles conditional logic for device type
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * The WPCode_Conditional_Device_Lite class.
 */
class WPCode_Conditional_Device_Lite extends WPCode_Conditional_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'device';

	/**
	 * The type category.
	 *
	 * @var string
	 */
	public $category = 'who';

	/**
	 * Set the translatable label.
	 *
	 * @return void
	 */
	protected function set_label() {
		$this->label = __( 'Device', 'insert-headers-and-footers' ) . ' (PRO)';
	}

	/**
	 * Set the type options for the admin mainly.
	 *
	 * @return void
	 */
	public function load_type_options() {
		$this->options = array(
			'device_type'  => array(
				'label'       => __( 'Device Type', 'insert-headers-and-footers' ),
				'description' => __( 'Target either desktop or mobile devices.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'upgrade'     => array(
					'title' => __( 'Device Type Rules are a Pro Feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Get access to advanced device type conditional logic rules by upgrading to PRO today.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'device-type' ),
				),
				'options'     => array(
					array(
						'label'    => __( 'Desktop', 'insert-headers-and-footers' ),
						'value'    => '',
						'disabled' => true,
					),
					array(
						'label'    => __( 'Mobile', 'insert-headers-and-footers' ),
						'value'    => '',
						'disabled' => true,
					),
				),
			),
			'browser'      => array(
				'label'       => __( 'Browser Type', 'insert-headers-and-footers' ),
				'description' => __( 'Target specific visitor web browsers.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'upgrade'     => array(
					'title' => __( 'Browser Type Rules are a Pro Feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Get access to advanced device conditional logic rules by upgrading to PRO today.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'browser' ),
				),
			),
			'os'           => array(
				'label'       => __( 'Operating System', 'insert-headers-and-footers' ),
				'description' => __( 'Target operating systems like Windows, Mac OS or Linux.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'upgrade'     => array(
					'title' => __( 'Operating System Rules are a Pro Feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Get access to advanced operating system conditional logic rules by upgrading to PRO today.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'os' ),
				),
			),
			'cookie_name'  => array(
				'label'       => __( 'Cookie Name', 'insert-headers-and-footers' ),
				'description' => __( 'Load or hide a snippet by cookie name.', 'insert-headers-and-footers' ),
				'type'        => 'text',
				'upgrade'     => array(
					'title' => __( 'Cookie-based Rules are a Pro Feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Get access to advanced cookie conditional logic rules by upgrading to PRO today.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'cookie-name' ),
				),
			),
			'cookie_value' => array(
				'label'       => __( 'Cookie Value', 'insert-headers-and-footers' ),
				'description' => __( 'Load or hide a snippet by cookie value.', 'insert-headers-and-footers' ),
				'type'        => 'text',
				'upgrade'     => array(
					'title' => __( 'Cookie-based Rules are a Pro Feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Get access to advanced cookie conditional logic rules by upgrading to PRO today.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'cookie-value' ),
				),
			),
		);
	}
}

new WPCode_Conditional_Device_Lite();
includes/lite/conditional-logic/class-wpcode-conditional-edd.php000064400000004244151331545640021050 0ustar00<?php
/**
 * Class that handles conditional logic related to Easy Digital Downloads.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * The WPCode_Conditional_EDD class.
 */
class WPCode_Conditional_EDD_Lite extends WPCode_Conditional_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'edd';

	/**
	 * The type category.
	 *
	 * @var string
	 */
	public $category = 'ecommerce';

	/**
	 * Set the translatable label.
	 *
	 * @return void
	 */
	protected function set_label() {
		$this->label = 'Easy Digital Downloads (PRO)';
	}

	/**
	 * Set the type options for the admin mainly.
	 *
	 * @return void
	 */
	public function load_type_options() {
		$this->options = array(
			'edd_page' => array(
				'label'       => __( 'EDD Page', 'insert-headers-and-footers' ),
				'description' => __( 'Load the snippet on specific Easy Digital Downloads pages.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'upgrade'     => array(
					'title' => __( 'Easy Digital Downloads Page Rules is a Pro Feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Get access to advanced conditional logic rules for Easy Digital Downloads by upgrading to PRO today.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'edd-page' ),
				),
				'options'     => array(
					array(
						'label'    => __( 'Checkout Page', 'insert-headers-and-footers' ),
						'value'    => '',
						'disabled' => true,
					),
					array(
						'label'    => __( 'Confirmation Page', 'insert-headers-and-footers' ),
						'value'    => '',
						'disabled' => true,
					),
					array(
						'label'    => __( 'Single Download Page', 'insert-headers-and-footers' ),
						'value'    => '',
						'disabled' => true,
					),
					array(
						'label'    => __( 'Download Category Page', 'insert-headers-and-footers' ),
						'value'    => '',
						'disabled' => true,
					),
					array(
						'label'    => __( 'Download Tag Page', 'insert-headers-and-footers' ),
						'value'    => '',
						'disabled' => true,
					),
				),
			),
		);
	}
}

new WPCode_Conditional_EDD_Lite();
includes/lite/conditional-logic/class-wpcode-conditional-memberpress.php000064400000005163151331545640022641 0ustar00<?php
/**
 * Class that handles conditional logic related to MemberPress.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}


/**
 * The WPCode_Conditional_MemberPress class.
 */
class WPCode_Conditional_MemberPress_Lite extends WPCode_Conditional_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'memberpress';

	/**
	 * The type category.
	 *
	 * @var string
	 */
	public $category = 'ecommerce';

	/**
	 * Set the translatable label.
	 *
	 * @return void
	 */
	protected function set_label() {
		$this->label = 'MemberPress (PRO)';
	}

	/**
	 * Set the type options for the admin mainly.
	 *
	 * @return void
	 */
	public function load_type_options() {
		$this->options = array(
			'memberpress_page' => array(
				'label'       => __( 'MemberPress Page', 'insert-headers-and-footers' ),
				'description' => __( 'Load the snippet on specific MemberPress pages.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'upgrade'     => array(
					'title' => __( 'MemberPress Page Rules is a Pro Feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Get access to advanced conditional logic rules for MemberPress by upgrading to PRO today.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'memberpress-page' ),
				),
				'options'     => array(
					array(
						'label' => __( 'Registration Page', 'insert-headers-and-footers' ),
						'value' => 'registration',
					),
					array(
						'label' => __( 'Thank You Page', 'insert-headers-and-footers' ),
						'value' => 'thankyou',
					),
					array(
						'label' => __( 'Account Page', 'insert-headers-and-footers' ),
						'value' => 'account',
					),
					array(
						'label' => __( 'Login Page', 'insert-headers-and-footers' ),
						'value' => 'login',
					),
				),
			),
			'memberpress_user' => array(
				'label'       => __( 'User active membership', 'insert-headers-and-footers' ),
				'description' => __( 'Check if the current user has a specific MemberPress subscription active.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'options'     => array(),
				'upgrade'     => array(
					'title' => __( 'MemberPress Active Membership Rules is a Pro Feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Get access to advanced conditional logic rules for MemberPress by upgrading to PRO today.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'memberpress-user' ),
				),
			),
		);
	}
}

new WPCode_Conditional_MemberPress_Lite();
includes/lite/conditional-logic/class-wpcode-conditional-schedule.php000064400000004310151331545640022102 0ustar00<?php
/**
 * Class that handles conditional logic for scheduling snippets.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * The WPCode_Conditional_Schedule_Lite class.
 */
class WPCode_Conditional_Schedule_Lite extends WPCode_Conditional_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'schedule';

	/**
	 * The type category.
	 *
	 * @var string
	 */
	public $category = 'advanced';

	/**
	 * Set the translatable label.
	 *
	 * @return void
	 */
	protected function set_label() {
		$this->label = __( 'Schedule', 'insert-headers-and-footers' ) . ' (PRO)';
	}

	/**
	 * Set the type options for the admin mainly.
	 *
	 * @return void
	 */
	public function load_type_options() {
		$this->options = array(
			'date_is' => array(
				'label'       => __( 'Date', 'insert-headers-and-footers' ),
				'description' => __( 'Check whether today is before or after a date.', 'insert-headers-and-footers' ),
				'type'        => 'date',
			),
			'time_is' => array(
				'label'       => __( 'Date & Time', 'insert-headers-and-footers' ),
				'description' => __( 'Get more specific by also including a specific time.', 'insert-headers-and-footers' ),
				'type'        => 'datetime',
			),
			'weekday' => array(
				'label'       => __( 'Day of the Week', 'insert-headers-and-footers' ),
				'description' => __( 'Load the snippet on specific days of the week.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'multiple'    => true,
			),
			'time'    => array(
				'label'       => __( 'Current time', 'insert-headers-and-footers' ),
				'description' => __( 'Check whether it\'s before or after a specific time', 'insert-headers-and-footers' ),
				'type'        => 'time',
			),
		);

		foreach ( $this->options as $key => $value ) {
			$this->options[ $key ]['upgrade'] = array(
				'title' => __( 'Scheduling rules are a Pro Feature', 'insert-headers-and-footers' ),
				'text'  => __( 'Upgrade today and get access to advanced scheduling conditional logic rules.', 'insert-headers-and-footers' ),
				'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'schedule' ),
			);
		}
	}
}

new WPCode_Conditional_Schedule_Lite();
includes/lite/auto-insert/class-wpcode-auto-insert-edd.php000064400000007625151331545640017701 0ustar00<?php
/**
 * Easy Digital Downloads specific auto-insert locations.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class WPCode_Auto_Insert_EDD.
 */
class WPCode_Auto_Insert_EDD_Lite extends WPCode_Auto_Insert_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'edd';
	/**
	 * The category of this type.
	 *
	 * @var string
	 */
	public $category = 'ecommerce';

	/**
	 * Not available to select.
	 *
	 * @var string
	 */
	public $code_type = 'pro';

	/**
	 * Text to display next to optgroup label.
	 *
	 * @var string
	 */
	public $label_pill = 'PRO';

	/**
	 * Load the available options and labels.
	 *
	 * @return void
	 */
	public function init() {
	}

	/**
	 * Load the label.
	 *
	 * @return void
	 */
	public function load_label() {
		$this->label = 'Easy Digital Downloads';
	}

	/**
	 * Load the available locations.
	 *
	 * @return void
	 */
	public function load_locations() {
		$this->locations = array(
			'edd_purchase_link_top'       => array(
				'label'       => __( 'Before the Purchase Button', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the EDD purchase button.', 'insert-headers-and-footers' ),
			),
			'edd_purchase_link_end'       => array(
				'label'       => __( 'After the Purchase Button', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet after the EDD purchase button.', 'insert-headers-and-footers' ),
			),
			'edd_before_download_content' => array(
				'label'       => __( 'Before the Single Download', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the single EDD download content.', 'insert-headers-and-footers' ),
			),
			'edd_after_download_content'  => array(
				'label'       => __( 'After the Single Download', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet after the single EDD download content.', 'insert-headers-and-footers' ),
			),
			'edd_before_cart'             => array(
				'label'       => __( 'Before the Cart', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the EDD cart.', 'insert-headers-and-footers' ),
			),
			'edd_after_cart'              => array(
				'label'       => __( 'After the Cart', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet after the EDD cart.', 'insert-headers-and-footers' ),
			),
			'edd_before_checkout_cart'    => array(
				'label'       => __( 'Before the Checkout Cart', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the EDD cart on the checkout page.', 'insert-headers-and-footers' ),
			),
			'edd_after_checkout_cart'     => array(
				'label'       => __( 'After the Checkout Cart', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet after the EDD cart on the checkout page.', 'insert-headers-and-footers' ),
			),
			'edd_before_purchase_form'    => array(
				'label'       => __( 'Before the Checkout Form', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the EDD checkout form on the checkout page.', 'insert-headers-and-footers' ),
			),
			'edd_after_purchase_form'     => array(
				'label'       => __( 'After the Checkout Form', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet after the EDD checkout form on the checkout page', 'insert-headers-and-footers' ),
			),
		);
	}

	/**
	 * Load the upgrade strings.
	 *
	 * @return void
	 */
	public function load_upgrade_strings() {
		$this->upgrade_title = __( 'Easy Digital Downloads Locations are a PRO feature', 'insert-headers-and-footers' );
		$this->upgrade_text  = __( 'Upgrade to PRO today and get access to advanced eCommerce auto-insert locations and conditional logic rules for your needs.', 'insert-headers-and-footers' );
		$this->upgrade_link  = wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'auto-insert', 'edd' );
	}
}

new WPCode_Auto_Insert_EDD_Lite();
includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php000064400000012025151331545640021452 0ustar00<?php
/**
 * WooCommerce-specific auto-insert locations.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}


/**
 * Class WPCode_Auto_Insert_WooCommerce_Lite.
 */
class WPCode_Auto_Insert_WooCommerce_Lite extends WPCode_Auto_Insert_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'woocommerce';
	/**
	 * The category of this type.
	 *
	 * @var string
	 */
	public $category = 'ecommerce';

	/**
	 * Not available to select.
	 *
	 * @var string
	 */
	public $code_type = 'pro';

	/**
	 * Text to display next to optgroup label.
	 *
	 * @var string
	 */
	public $label_pill = 'PRO';

	/**
	 * Load the available options and labels.
	 *
	 * @return void
	 */
	public function init() {
	}

	/**
	 * Load the label.
	 *
	 * @return void
	 */
	public function load_label() {
		$this->label = 'WooCommerce';
	}

	/**
	 * Load the available locations.
	 *
	 * @return void
	 */
	public function load_locations() {
		$this->locations = array(
			'wc_before_products_list'              => array(
				'label'       => __( 'Before the List of Products', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the list of products on a WooCommerce page.', 'insert-headers-and-footers' ),
			),
			'wc_after_products_list'               => array(
				'label'       => __( 'After the List of Products', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet after the list of products on a WooCommerce page.', 'insert-headers-and-footers' ),
			),
			'wc_before_single_product'             => array(
				'label'       => __( 'Before the Single Product', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the content on the single WooCommerce product page.', 'insert-headers-and-footers' ),
			),
			'wc_after_single_product'              => array(
				'label'       => __( 'After the Single Product', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet after the content on the single WooCommerce product page.', 'insert-headers-and-footers' ),
			),
			'wc_before_single_product_summary'     => array(
				'label'       => __( 'Before the Single Product Summary', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the product summary on the single WooCommerce product page.', 'insert-headers-and-footers' ),
			),
			'wc_after_single_product_summary'      => array(
				'label'       => __( 'After the Single Product Summary', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet after the product summary on the single WooCommerce product page.', 'insert-headers-and-footers' ),
			),
			'woocommerce_before_cart'              => array(
				'label'       => __( 'Before the Cart', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the cart on WooCommerce pages.', 'insert-headers-and-footers' ),
			),
			'woocommerce_after_cart'               => array(
				'label'       => __( 'After the Cart', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet after the cart on WooCommerce pages.', 'insert-headers-and-footers' ),
			),
			'woocommerce_before_checkout_form'     => array(
				'label'       => __( 'Before the Checkout Form', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the checkout form on the WooCommerce checkout page.', 'insert-headers-and-footers' ),
			),
			'woocommerce_after_checkout_form'      => array(
				'label'       => __( 'After the Checkout Form', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet after the checkout form on the WooCommerce checkout page.', 'insert-headers-and-footers' ),
			),
			'woocommerce_checkout_order_review_19' => array(
				'label'       => __( 'Before Checkout Payment Button', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the checkout payment button on the WooCommerce checkout page.', 'insert-headers-and-footers' ),
			),
			'woocommerce_checkout_order_review_21' => array(
				'label'       => __( 'After Checkout Payment Button', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet after the checkout payment button on the WooCommerce checkout page.', 'insert-headers-and-footers' ),
			),
			'woocommerce_before_thankyou'          => array(
				'label'       => __( 'Before the Thank You Page', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the thank you page content for WooCommerce.', 'insert-headers-and-footers' ),
			),
		);
	}

	/**
	 * Load the upgrade strings.
	 *
	 * @return void
	 */
	public function load_upgrade_strings() {
		$this->upgrade_title = __( 'WooCommerce Locations are a PRO feature', 'insert-headers-and-footers' );
		$this->upgrade_text  = __( 'Upgrade to PRO today and get access to advanced eCommerce auto-insert locations and conditional logic rules for your needs.', 'insert-headers-and-footers' );
		$this->upgrade_link  = wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'auto-insert', 'woocommerce' );
	}
}

new WPCode_Auto_Insert_WooCommerce_Lite();
includes/lite/auto-insert/class-wpcode-auto-insert-anywhere.php000064400000005554151331545640020766 0ustar00<?php
/**
 * Class to auto-insert snippets anywhere by a CSS selector.
 *
 * @package wpcode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class WPCode_Auto_Insert_Anywhere.
 */
class WPCode_Auto_Insert_Anywhere_Lite extends WPCode_Auto_Insert_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'anywhere';
	/**
	 * The category of this type.
	 *
	 * @var string
	 */
	public $category = 'global';

	/**
	 * Not available to select.
	 *
	 * @var string
	 */
	public $code_type = 'pro';

	/**
	 * Text to display next to optgroup label.
	 *
	 * @var string
	 */
	public $label_pill = 'PRO';

	/**
	 * Load the available options and labels.
	 *
	 * @return void
	 */
	public function init() {
	}

	/**
	 * Load the label.
	 *
	 * @return void
	 */
	public function load_label() {
		$this->label = __( 'Anywhere (CSS Selector)', 'insert-headers-and-footers' );
	}

	/**
	 * Load the available locations.
	 *
	 * @return void
	 */
	public function load_locations() {
		$this->locations = array(
			'before_css_selector'  => array(
				'label'       => __( 'Before HTML Element', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the HTML element specified by the CSS selector.', 'insert-headers-and-footers' ),
			),
			'after_css_selector'   => array(
				'label'       => __( 'After HTML Element', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet after the HTML element specified by the CSS selector.', 'insert-headers-and-footers' ),
			),
			'start_css_selector'   => array(
				'label'       => __( 'At the start of HTML Element', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the content of the HTML element specified by CSS selector.', 'insert-headers-and-footers' ),
			),
			'end_css_selector'     => array(
				'label'       => __( 'At the end of HTML Element', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet after the content of the HTML element specified by CSS selector.', 'insert-headers-and-footers' ),
			),
			'replace_css_selector' => array(
				'label'       => __( 'Replace HTML Element', 'insert-headers-and-footers' ),
				'description' => __( 'Completely replace the HTML element specified by the CSS selector with the output of this snippet.', 'insert-headers-and-footers' ),
			),
		);
	}

	/**
	 * Load the upgrade strings.
	 *
	 * @return void
	 */
	public function load_upgrade_strings() {
		$this->upgrade_title = __( 'Insert Anywhere by CSS Selector is a Premium feature', 'insert-headers-and-footers' );
		$this->upgrade_text  = __( 'Upgrade to PRO today and insert snippets anywhere on your site using CSS selectors to target any HTML element.', 'insert-headers-and-footers' );
		$this->upgrade_link  = wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'auto-insert', 'anywhere' );
	}
}

new WPCode_Auto_Insert_Anywhere_Lite();
includes/lite/auto-insert/class-wpcode-auto-insert-content.php000064400000007017151331545640020612 0ustar00<?php
/**
 * Class for auto-insert inside content.
 *
 * @package wpcode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class WPCode_Auto_Insert_Single.
 */
class WPCode_Auto_Insert_Content_Lite extends WPCode_Auto_Insert_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'content';

	/**
	 * The category of this type.
	 *
	 * @var string
	 */
	public $category = 'page';

	/**
	 * Not available to select.
	 *
	 * @var string
	 */
	public $code_type = 'pro';

	/**
	 * Text to display next to optgroup label.
	 *
	 * @var string
	 */
	public $label_pill = 'PRO';

	/**
	 * Load the available options and labels.
	 *
	 * @return void
	 */
	public function init() {
	}

	/**
	 * Load the label.
	 *
	 * @return void
	 */
	public function load_label() {
		$this->label = __( 'Content', 'insert-headers-and-footers' );
	}

	/**
	 * Load the available locations.
	 *
	 * @return void
	 */
	public function load_locations() {
		$this->locations = array(
			'after_words'           => array(
				'label'       => esc_html__( 'Insert After # Words', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet after a minimum number of words.', 'insert-headers-and-footers' ),
			),
			'every_words'           => array(
				'label'       => esc_html__( 'Insert Every # Words', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet every # number of words.', 'insert-headers-and-footers' ),
			),
			'content_half'          => array(
				'label'       => esc_html__( 'Insert in the Middle of the Content', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet in the middle of the post content.', 'insert-headers-and-footers' ),
			),
			'content_quarter'       => array(
				'label'       => esc_html__( 'Insert after first Quarter (25%)', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet after the first quarter of the post content.', 'insert-headers-and-footers' ),
			),
			'content_quarter_third' => array(
				'label'       => esc_html__( 'Insert after 3rd Quarter (75%)', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet after the third quarter of the post content.', 'insert-headers-and-footers' ),
			),
			'content_one_third'     => array(
				'label'       => esc_html__( 'Insert after first Third (33%)', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet after the first third of the post content.', 'insert-headers-and-footers' ),
			),
			'content_two_thirds'    => array(
				'label'       => esc_html__( 'Insert after second Third (66%)', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet after the second third of the post content.', 'insert-headers-and-footers' ),
			),
			'content_80'            => array(
				'label'       => esc_html__( 'Insert after 80%', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet after 80% of the post content.', 'insert-headers-and-footers' ),
			),
		);
	}

	/**
	 * Load the upgrade strings.
	 *
	 * @return void
	 */
	public function load_upgrade_strings() {
		$this->upgrade_title = __( 'Word-based content locations are a PRO feature', 'insert-headers-and-footers' );
		$this->upgrade_text  = __( 'Upgrade to PRO today and get access to automatic word-count based insert locations.', 'insert-headers-and-footers' );
		$this->upgrade_link  = wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'auto-insert', 'content' );
	}

}

new WPCode_Auto_Insert_Content_Lite();
includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php000064400000007342151331545640021465 0ustar00<?php
/**
 * MemberPress-specific auto-insert locations.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class WPCode_Auto_Insert_MemberPress_Lite.
 */
class WPCode_Auto_Insert_MemberPress_Lite extends WPCode_Auto_Insert_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'memberpress';
	/**
	 * The category of this type.
	 *
	 * @var string
	 */
	public $category = 'ecommerce';

	/**
	 * Not available to select.
	 *
	 * @var string
	 */
	public $code_type = 'pro';

	/**
	 * Text to display next to optgroup label.
	 *
	 * @var string
	 */
	public $label_pill = 'PRO';

	/**
	 * Load the available options and labels.
	 *
	 * @return void
	 */
	public function init() {
	}

	/**
	 * Load the label.
	 *
	 * @return void
	 */
	public function load_label() {
		$this->label = 'MemberPress';
	}

	/**
	 * Load the available locations.
	 *
	 * @return void
	 */
	public function load_locations() {
		$this->locations = array(
			'mepr-above-checkout-form'          => array(
				'label'       => __( 'Before the Registration Form', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the MemberPress registration form used for checkout.', 'insert-headers-and-footers' ),
			),
			'mepr-checkout-before-submit'       => array(
				'label'       => __( 'Before Checkout Submit Button', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet right before the MemberPress checkout submit button.', 'insert-headers-and-footers' ),
			),
			'mepr-checkout-before-coupon-field' => array(
				'label'       => __( 'Before Checkout Coupon Field', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the MemberPress checkout coupon field.', 'insert-headers-and-footers' ),
			),
			'mepr-account-home-before-name'     => array(
				'label'       => __( 'Before Account First Name', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet to the Home tab of the MemberPress Account page before First Name field.', 'insert-headers-and-footers' ),
			),
			'mepr_before_account_subscriptions' => array(
				'label'       => __( 'Before Subscriptions Content', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet at the beginning of the Subscriptions tab on the MemberPress Account page.', 'insert-headers-and-footers' ),
			),
			'mepr-login-form-before-submit'     => array(
				'label'       => __( 'Before Login Form Submit', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet before the Remember Me checkbox on the MemberPress Login page.', 'insert-headers-and-footers' ),
			),
			'mepr_unauthorized_message_before'  => array(
				'label'       => __( 'Before the Unauthorized Message', 'insert-headers-and-footers' ),
				'description' => __( 'Insert a snippet before the notice that access to the content is unauthorized. ', 'insert-headers-and-footers' ),
			),
			'mepr_unauthorized_message_after'   => array(
				'label'       => __( 'After the Unauthorized Message', 'insert-headers-and-footers' ),
				'description' => __( 'Insert a snippet after the notice that access to the content is unauthorized. ', 'insert-headers-and-footers' ),
			),
		);
	}

	/**
	 * Load the upgrade strings.
	 *
	 * @return void
	 */
	public function load_upgrade_strings() {
		$this->upgrade_title = __( 'MemberPress Locations are a PRO feature', 'insert-headers-and-footers' );
		$this->upgrade_text  = __( 'Upgrade to PRO today and get access to advanced eCommerce auto-insert locations and conditional logic rules for your needs.', 'insert-headers-and-footers' );
		$this->upgrade_link  = wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'auto-insert', 'memberpress' );
	}
}

new WPCode_Auto_Insert_MemberPress_Lite();
includes/lite/admin/class-wpcode-usage-tracking-lite.php000064400000001012151331545640017332 0ustar00<?php
/**
 * WPCode Usage Tracking Lite
 *
 * @package WPCode
 * @since 2.0.10
 */

/**
 * Class WPCode_Usage_Tracking_Lite
 */
class WPCode_Usage_Tracking_Lite extends WPCode_Usage_Tracking {

	/**
	 * Get the type for the request.
	 *
	 * @return string The plugin type.
	 * @since 2.0.10
	 */
	public function get_type() {
		return 'lite';
	}

	/**
	 * Is the usage tracking enabled?
	 *
	 * @return bool
	 */
	public function is_enabled() {
		return boolval( wpcode()->settings->get_option( 'usage_tracking' ) );
	}
}
includes/lite/admin/notices.php000064400000013233151331545640012565 0ustar00<?php
/**
 * Lite-specific admin notices.
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

add_action( 'admin_init', 'wpcode_maybe_add_library_connect_notice' );
add_action( 'wpcode_admin_page', 'wpcode_maybe_add_lite_top_bar_notice', 4 );
add_action( 'wpcode_admin_page_content_wpcode-headers-footers', 'wpcode_headers_footers_bottom_notice', 250 );

/**
 * Show a prompt to connect to the WPCode Library to get access to more snippets.
 *
 * @return void
 */
function wpcode_maybe_add_library_connect_notice() {
	if ( wpcode()->library_auth->has_auth() || ! isset( $_GET['page'] ) || 0 !== strpos( $_GET['page'], 'wpcode' ) ) {  // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash
		return;
	}
	// Don't show if in headers & footers mode only.
	if ( wpcode()->settings->get_option( 'headers_footers_mode' ) ) {
		return;
	}

	$settings_url = add_query_arg(
		array(
			'page' => 'wpcode-settings',
		),
		admin_url( 'admin.php' )
	);

	$snippets_count = wpcode()->library->get_snippets_count();
	// Translators: more here is used in the sense of "get access to more snippets" and gets replaced with the number of snippets if the library items are loaded correctly.
	$more = $snippets_count > 0 ? $snippets_count : __( 'more', 'insert-headers-and-footers' );

	WPCode_Notice::info(
		sprintf(
		// Translators: %1$s and %2$s add a link to the settings page. %3$s and %4$s make the text bold. %6$s is replaced with the number of snippets and %5$s adds a "new" icon.
			__( '%5$s%1$sConnect to the WPCode Library%2$s to get access to %3$s%6$s FREE snippets%4$s!', 'insert-headers-and-footers' ),
			'<a href="' . $settings_url . '" class="wpcode-start-auth">',
			'</a>',
			'<strong>',
			'</strong>',
			'<span class="wpcode-icon-new">&nbsp;NEW!</span>',
			$more
		),
		array(
			'dismiss' => WPCode_Notice::DISMISS_GLOBAL,
			'slug'    => 'wpcode-library-connect-lite',
		)
	);
}

/**
 * Add a notice to consider more features with offer.
 *
 * @return void
 */
function wpcode_maybe_add_lite_top_bar_notice() {
	// Only add this to the WPCode pages.
	if ( ! isset( $_GET['page'] ) || 0 !== strpos( $_GET['page'], 'wpcode' ) ) {  // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.ValidatedSanitizedInput.MissingUnslash
		return;
	}
	// Don't show in H&F mode.
	if ( wpcode()->settings->get_option( 'headers_footers_mode' ) ) {
		return;
	}

	$screen = get_current_screen();
	if ( isset( $screen->id ) && false !== strpos( $screen->id, 'code-snippets_page_wpcode-' ) ) {
		$screen = str_replace( 'code-snippets_page_wpcode-', '', $screen->id );
	} else {
		$screen = 'snippets-list';
	}

	$upgrade_url = wpcode_utm_url(
		'https://wpcode.com/lite/',
		'top-notice',
		$screen
	);

	WPCode_Notice::top(
		sprintf(
		// Translators: %1$s and %2$s add a link to the upgrade page. %3$s and %4$s make the text bold.
			__( '%3$sYou\'re using WPCode Lite%4$s. To unlock more features consider %1$supgrading to Pro%2$s.', 'insert-headers-and-footers' ),
			'<a href="' . $upgrade_url . '" target="_blank" rel="noopener noreferrer">',
			'</a>',
			'<strong>',
			'</strong>'
		),
		array(
			'dismiss' => WPCode_Notice::DISMISS_USER,
			'slug'    => 'consider-upgrading',
		)
	);
}

/**
 * Show a notice with more features at the bottom of the Headers & Footers page.
 *
 * @return void
 */
function wpcode_headers_footers_bottom_notice() {
	// Don't show if in headers & footers mode only.
	if ( wpcode()->settings->get_option( 'headers_footers_mode' ) ) {
		return;
	}
	// Don't show if other notices were already displayed on the page.
	if ( ! empty( wpcode()->notice->notices ) ) {
		return;
	}

	$html = '<h3>' . esc_html__( 'Get WPCode Pro and Unlock all the Powerful Features', 'insert-headers-and-footers' ) . '</h3>';
	$html .= '<div class="wpcode-features-list">';
	$html .= '<ul>';
	$html .= '<li>' . esc_html__( 'Save & Reuse snippets in your private Cloud Library', 'insert-headers-and-footers' ) . '</li>';
	$html .= '<li>' . esc_html__( 'Add page-specific scripts when editing a post/page.', 'insert-headers-and-footers' ) . '</li>';
	$html .= '<li>' . esc_html__( 'Track all snippet changes with Advanced Code Revisions', 'insert-headers-and-footers' ) . '</li>';
	$html .= '</ul>';
	$html .= '<ul>';
	$html .= '<li>' . esc_html__( 'Load snippets by device (mobile/desktop) with 1-click.', 'insert-headers-and-footers' ) . '</li>';
	$html .= '<li>' . esc_html__( 'Easily insert and reuse content with Custom Shortcodes.', 'insert-headers-and-footers' ) . '</li>';
	$html .= '<li>' . esc_html__( 'Precisely track eCommerce conversions for WooCommerce and EDD.', 'insert-headers-and-footers' ) . '</li>';
	$html .= '</ul>';
	$html .= '</div>';
	$html .= sprintf(
		'<p><a href="%1$s" target="_blank" rel="noopener noreferrer">%2$s</a></p>',
		wpcode_utm_url( 'https://wpcode.com/lite/', 'headers-footers', 'notice', 'get-wpcode-pro' ),
		esc_html__( 'Get WPCode Pro Today and Unlock all the Powerful Features »', 'insert-headers-and-footers' )
	);
	$html .= '<p>';
	$html .= sprintf(
	// Translators: Placeholders make the text bold.
		esc_html__( '%1$sBonus:%2$s WPCode Lite users get %3$s$50 off regular price%4$s, automatically applied at checkout', 'insert-headers-and-footers' ),
		'<strong>',
		'</strong>',
		'<strong style="color:#59A56D;">',
		'</strong>'
	);
	$html .= '</p>';

	// Add our custom notice for this page.
	WPCode_Notice::info(
		$html,
		array(
			'slug'    => 'ihaf-snippets',
			'dismiss' => WPCode_Notice::DISMISS_USER,
		)
	);
	// Display notice we just added so that scripts are loaded.
	wpcode()->notice->display();
}
includes/lite/admin/admin-scripts.php000064400000003244151331545640013677 0ustar00<?php
/**
 * Load lite-specific scripts here.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

add_action( 'admin_enqueue_scripts', 'wpcode_admin_scripts_global_lite' );
add_action( 'admin_head', 'wpcode_listen_for_deploy_message' );

/**
 * Load version-specific global scripts.
 *
 * @return void
 */
function wpcode_admin_scripts_global_lite() {
	// Don't load global admin scripts if headers & footers mode is enabled.
	if ( wpcode()->settings->get_option( 'headers_footers_mode' ) ) {
		return;
	}
	wpcode_admin_scripts_global();
}

/**
 * This is loaded after the plugin is activated and if the installation process was initiated
 * from the WPCode Library site it will redirect the user to the appropriate page to continue
 * that process.
 *
 * @return void
 */
function wpcode_listen_for_deploy_message() {
	// Load this only in the plugins list.
	$screen  = get_current_screen();
	$screens = array(
		'plugins',
		'plugin-install',
	);
	if ( ! isset( $screen->id ) || ! in_array( $screen->id, $screens, true ) ) {
		return;
	}
	$click_page = add_query_arg(
		array(
			'page' => 'wpcode-click',
		),
		admin_url( 'admin.php' )
	)
	?>
	<script>
		if ( window.opener ) {
			window.opener.postMessage(
				'wpcode-plugin-installed',
				'<?php echo esc_url( wpcode()->library_auth->library_url ); ?>'
			);
		}
		window.addEventListener(
			'message',
			( event ) => {
				if ( !event.isTrusted || '<?php echo esc_url( wpcode()->library_auth->library_url ); ?>' !== event.origin || 'wpcode-show-connect' !== event.data ) {
					return;
				}
				window.location.href = '<?php echo esc_url( $click_page ); ?>&message=wpcode-deploy';
			},
			false
		);
	</script>
	<?php
}
includes/lite/admin/class-wpcode-connect.php000064400000016647151331545640015150 0ustar00<?php

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * WPCode Connect.
 *
 * WPCode Connect is our service that makes it easy to upgrade to WPCode Pro
 * without having to manually install the WPCode Pro plugin.
 *
 * @since 2.0.9
 */
class WPCode_Connect {

	/**
	 * Constructor.
	 *
	 * @since 2.0.9
	 */
	public function __construct() {
		$this->hooks();
	}

	/**
	 * Hooks.
	 *
	 * @since 2.0.9
	 */
	public function hooks() {
		add_action( 'wpcode_admin_page_content_wpcode-settings', array( $this, 'settings_enqueues' ) );
		add_action( 'wp_ajax_wpcode_connect_url', array( $this, 'generate_url' ) );
		add_action( 'wp_ajax_nopriv_wpcode_connect_process', array( $this, 'process' ) );
	}

	/**
	 * Settings page enqueues.
	 *
	 * @since 2.0.9
	 */
	public function settings_enqueues() {

		$admin_asset_file = WPCODE_PLUGIN_PATH . 'build/connect.asset.php';

		if ( ! file_exists( $admin_asset_file ) ) {
			return;
		}

		$asset = require $admin_asset_file;

		wp_enqueue_script( 'wpcode-connect-js', WPCODE_PLUGIN_URL . 'build/connect.js', $asset['dependencies'], $asset['version'], true );
	}

	/**
	 * Generate and return the WPCode Connect URL.
	 *
	 * @since 2.0.9
	 */
	public function generate_url() {

		// Run a security check.
		check_ajax_referer( 'wpcode_admin' );

		// Check for permissions.
		if ( ! current_user_can( 'install_plugins' ) ) {
			wp_send_json_error( array( 'message' => esc_html__( 'You are not allowed to install plugins.', 'insert-headers-and-footers' ) ) );
		}

		$key = ! empty( $_POST['key'] ) ? sanitize_text_field( wp_unslash( $_POST['key'] ) ) : '';

		if ( empty( $key ) ) {
			wp_send_json_error( array( 'message' => esc_html__( 'Please enter your license key to connect.', 'insert-headers-and-footers' ) ) );
		}

		if ( class_exists( 'WPCode_Premium' ) ) {
			wp_send_json_error( array( 'message' => esc_html__( 'Only the Lite version can be upgraded.', 'insert-headers-and-footers' ) ) );
		}

		// Verify pro version is not installed.
		$active = activate_plugin( 'wpcode-premium/wpcode.php', false, false, true );

		if ( ! is_wp_error( $active ) ) {

			update_option( 'wpcode_install', 1 ); // Run install routines.
			// Deactivate Lite.
			$plugin = plugin_basename( WPCODE_FILE );

			deactivate_plugins( $plugin );

			do_action( 'wpcode_plugin_deactivated', $plugin );

			wp_send_json_success(
				array(
					'message' => esc_html__( 'WPCode Pro is installed but not activated.', 'insert-headers-and-footers' ),
					'reload'  => true,
				)
			);
		}

		// Generate URL.
		$oth        = hash( 'sha512', wp_rand() );
		$hashed_oth = hash_hmac( 'sha512', $oth, wp_salt() );

		update_option( 'wpcode_connect_token', $oth );
		update_option( 'wpcode_connect', $key );

		$version  = WPCODE_VERSION;
		$endpoint = admin_url( 'admin-ajax.php' );
		$redirect = admin_url( 'admin.php?page=wpcode-settings' );
		$url      = add_query_arg(
			array(
				'key'      => $key,
				'oth'      => $hashed_oth,
				'endpoint' => $endpoint,
				'version'  => $version,
				'siteurl'  => admin_url(),
				'homeurl'  => home_url(),
				'redirect' => rawurldecode( base64_encode( $redirect ) ), // phpcs:ignore
				'v'        => 2,
				'php'      => phpversion(),
				'wp'       => get_bloginfo( 'version' ),
			),
			'https://upgrade.wpcode.com/'
		);

		wp_send_json_success(
			array(
				'url'      => $url,
				'back_url' => add_query_arg(
					array(
						'action' => 'wpcode_connect',
						'oth'    => $oth,
					),
					$endpoint
				),
			)
		);
	}

	/**
	 * Process WPCode Connect.
	 *
	 * @since 2.0.9
	 */
	public function process() {

		$error = esc_html__( 'There was an error while installing an upgrade. Please download the plugin from wpcode.com and install it manually.', 'insert-headers-and-footers' );

		// Verify params present (oth & download link).
		$post_oth = ! empty( $_REQUEST['oth'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['oth'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
		$post_url = ! empty( $_REQUEST['file'] ) ? esc_url_raw( wp_unslash( $_REQUEST['file'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification

		if ( empty( $post_oth ) || empty( $post_url ) ) {
			wp_send_json_error( $error );
		}

		// Verify oth.
		$oth = get_option( 'wpcode_connect_token' );

		if ( hash_hmac( 'sha512', $oth, wp_salt() ) !== $post_oth ) {
			wp_send_json_error( $error );
		}

		// Delete so cannot replay.
		delete_option( 'wpcode_connect_token' );

		// Set the current screen to avoid undefined notices.
		set_current_screen( 'wpcode_page_wpcode-settings' );

		// Prepare variables.
		$url = esc_url_raw(
			add_query_arg(
				array( 'page' => 'wpcode-settings' ),
				admin_url( 'admin.php' )
			)
		);

		// Verify pro not activated.
		if ( class_exists( 'WPCode_Premium' ) ) {
			wp_send_json_success( esc_html__( 'Plugin installed & activated.', 'insert-headers-and-footers' ) );
		}

		// Verify pro not installed.
		$active = activate_plugin( 'wpcode-premium/wpcode.php', $url, false, true );

		if ( ! is_wp_error( $active ) ) {
			$plugin = plugin_basename( WPCODE_FILE );

			deactivate_plugins( $plugin );

			do_action( 'wpcode_plugin_deactivated', $plugin );

			wp_send_json_success( esc_html__( 'Plugin installed & activated.', 'insert-headers-and-footers' ) );
		}

		$creds = request_filesystem_credentials( $url, '', false, false, null );

		// Check for file system permissions.
		if ( false === $creds || ! WP_Filesystem( $creds ) ) {
			wp_send_json_error(
				esc_html__( 'There was an error while installing an upgrade. Please check file system permissions and try again. Also, you can download the plugin from wpcode.com and install it manually.', 'insert-headers-and-footers' )
			);
		}

		/*
		 * We do not need any extra credentials if we have gotten this far, so let's install the plugin.
		 */
		// Do not allow WordPress to search/download translations, as this will break JS output.
		remove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );

		wpcode_require_upgrader();

		// Create the plugin upgrader with our custom skin.
		$installer = new Plugin_Upgrader( new WPCode_Skin() );

		// Error check.
		if ( ! method_exists( $installer, 'install' ) ) {
			wp_send_json_error( $error );
		}

		// Check license key.
		$key = get_option( 'wpcode_connect', false );

		if ( empty( $key ) ) {
			wp_send_json_error(
				new WP_Error(
					'403',
					esc_html__( 'No key provided.', 'insert-headers-and-footers' )
				)
			);
		}

		$installer->install( $post_url ); // phpcs:ignore

		// Flush the cache and return the newly installed plugin basename.
		wp_cache_flush();

		$plugin_basename = $installer->plugin_info();

		if ( $plugin_basename ) {

			// Deactivate the lite version first.
			$plugin = plugin_basename( WPCODE_FILE );

			deactivate_plugins( $plugin );

			do_action( 'wpcode_plugin_deactivated', $plugin );

			// Activate the plugin silently.
			$activated = activate_plugin( $plugin_basename, '', false, true );

			if ( ! is_wp_error( $activated ) ) {
				add_option( 'wpcode_install', 1 );
				wp_send_json_success( esc_html__( 'Plugin installed & activated.', 'insert-headers-and-footers' ) );
			} else {
				// Reactivate the lite plugin if pro activation failed.
				activate_plugin( plugin_basename( WPCODE_FILE ), '', false, true );
				wp_send_json_error( esc_html__( 'Pro version installed but needs to be activated on the Plugins page inside your WordPress admin.', 'insert-headers-and-footers' ) );
			}
		}

		wp_send_json_error( $error );
	}
}

new WPCode_Connect();
includes/lite/admin/class-wpcode-metabox-snippets-lite.php000064400000033170151331545640017742 0ustar00<?php
/**
 * Class used for the lite-specific metabox.
 *
 * @package WPCode
 */

/**
 * Class WPCode_Metabox_Snippets_Lite.
 */
class WPCode_Metabox_Snippets_Lite extends WPCode_Metabox_Snippets {
	use WPCode_Revisions_Display_Lite;

	/**
	 * Override the header tab content to make it specific to this class.
	 *
	 * @param WP_Post $post The post object.
	 *
	 * @return void
	 */
	public function output_tab_header( $post ) {
		$this->form_for_scripts(
			__( 'Header', 'insert-headers-and-footers' )
		);
	}

	/**
	 * Override the footer tab content to make it specific to this class.
	 *
	 * @param WP_Post $post The post object.
	 *
	 * @return void
	 */
	public function output_tab_footer( $post ) {
		$this->form_for_scripts(
			__( 'Footer', 'insert-headers-and-footers' )
		);
	}

	/**
	 * Override the body tab content to make it specific to this class.
	 *
	 * @param WP_Post $post The post object.
	 *
	 * @return void
	 */
	public function output_tab_body( $post ) {
		$this->form_for_scripts(
			__( 'Body', 'insert-headers-and-footers' )
		);
	}

	/**
	 * Override the code tab content to make it specific to this class.
	 *
	 * @param WP_Post $post The post object.
	 *
	 * @return void
	 */
	public function output_tab_code( $post ) {
		?>
		<div class="wpcode-blur-area">
			<p>
				<?php esc_html_e( 'Choose the snippets you want to run on this page. Please note: only active snippets will be executed.', 'insert-headers-and-footers' ); ?>
			</p>
			<div class="wpcode-metabox-snippets">
				<div id="wpcode-snippet-chooser">
					<h3>
						<?php esc_html_e( 'Select snippets', 'insert-headers-and-footers' ); ?>
						<button class="wpcode-button-just-icon wpcode-drawer-toggle" id="wpcode-close-drawer">
							<?php wpcode_icon( 'close' ); ?>
						</button>
					</h3>
					<div class="wpcode-snippets-search">
						<input type="text" id="wpcode-search-snippets" class="wpcode-input-text" placeholder="<?php esc_attr_e( 'Search snippets', 'insert-headers-and-footers' ); ?>"/>
						<span class="wpcode-loading-spinner" id="wpcode-chooser-spinner"></span>
					</div>
					<div class="wpcode-chooser-fixed-height">
						<div id="wpcode-choose-snippets"></div>
						<div class="wpcode-choose-actions">
							<button type="button" class="wpcode-button wpcode-button-secondary" id="wpcode-metabox-load-more"><?php esc_html_e( 'Load more snippets', 'insert-headers-and-footers' ); ?></button>
						</div>
					</div>
				</div>
				<div class="wpcode-picked-snippets-area">
					<h3>
						<button class="wpcode-button wpcode-drawer-toggle" id="wpcode-add-snippet-toggle" type="button">
							<?php esc_html_e( '+ Choose Snippet', 'insert-headers-and-footers' ); ?>
						</button>
					</h3>
					<div id="wpcode-picked-snippets">
						<div class="wpcode-list-item wpcode-selected-snippet-item wpcode-list-item-has-pill">
							<h3>Show site currency</h3>
							<label>Page location</label>
							<select>
								<option>Insert After Post</option>
							</select>
						</div>
						<div class="wpcode-list-item wpcode-selected-snippet-item wpcode-list-item-has-pill">
							<h3>Banner Ad</h3>
							<label>Page location</label>
							<select>
								<option>Insert Before Post</option>
							</select>
						</div>
						<div class="wpcode-list-item wpcode-selected-snippet-item wpcode-list-item-has-pill">
							<h3>Subscribe Reminder</h3>
							<label>Page location</label>
							<select>
								<option>Insert Before Content</option>
							</select>
						</div>
						<div class="wpcode-list-item wpcode-selected-snippet-item wpcode-list-item-has-pill">
							<h3>Event Countdown</h3>
							<label>Page location</label>
							<select>
								<option>Insert After Post</option>
							</select>
						</div>
						<div class="wpcode-list-item wpcode-selected-snippet-item wpcode-list-item-has-pill">
							<h3>Banner Ad 2</h3>
							<label>Page location</label>
							<select>
								<option>Insert After Content</option>
							</select>
						</div>
						<div class="wpcode-list-item wpcode-selected-snippet-item wpcode-list-item-has-pill">
							<h3>Free Download Button</h3>
							<label>Page location</label>
							<select>
								<option>Insert After Post</option>
							</select>
						</div>
					</div>
				</div>
			</div>
		</div>
		<?php
		echo WPCode_Admin_Page::get_upsell_box( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
			__( 'Page Scripts is a Pro Feature', 'insert-headers-and-footers' ),
			sprintf(
				'<p>%s</p>',
				esc_html__( 'While you can always use global snippets, in the PRO version you can easily add page-specific scripts and snippets directly from the post edit screen.', 'insert-headers-and-footers' )
			),
			array(
				'text' => esc_html__( 'Upgrade to Pro and Unlock Page Scripts', 'insert-headers-and-footers' ),
				'url'  => esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'post-editor-metabox', 'custom-snippets', 'upgrade-to-pro' ) ),
			),
			array(
				'text' => esc_html__( 'Learn more about all the features', 'insert-headers-and-footers' ),
				'url'  => esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'post-editor-metabox', 'custom-snippets', 'features' ) ),
			)
		);
	}

	/**
	 * Get the markup for a form using a disabled CodeMirror instance (to avoid loading a script that won't be used).
	 *
	 * @param string $label The label for this tab section.
	 *
	 * @return void
	 */
	public function form_for_scripts( $label ) {
		wp_enqueue_style( 'code-editor' );
		?>
		<div class="wpcode-blur-area">
			<p>
				<?php
				printf(
				// Translators: placeholder for the name of the section (header or footer).
					esc_html__( 'Add scripts below to the %s section of this page.', 'insert-headers-and-footers' ),
					esc_html( $label )
				);
				?>
			</p>
			<p>
				<label>
					<input type="checkbox"/>
					<?php
					printf(
					// Translators: placeholder for the name of the section (header or footer).
						esc_html__( 'Disable global %s scripts on this page', 'insert-headers-and-footers' ),
						esc_html( $label )
					);
					?>
				</label>
			</p>
			<div class="wpcode-input-row">
				<label>
					<?php
					printf(
					// Translators: placeholder for the name of the section (header or footer).
						esc_html__( '%s - any device type', 'insert-headers-and-footers' ),
						esc_html( $label )
					);
					?>
				</label>
				<div class="wpcode-smart-tags">
					<button class="wpcode-smart-tags-toggle">
						<?php wpcode_icon( 'tags', 20, 16, '0 0 20 16' ); ?>
						<span class="wpcode-text-default">
					<?php esc_html_e( 'Show Smart Tags', 'insert-headers-and-footers' ); ?>
					</span>
					</button>
				</div>
				<div class="CodeMirror cm-s-default CodeMirror-wrap">
					<div class="CodeMirror-vscrollbar" style="width: 18px; pointer-events: none;">
						<div style="min-width: 1px; height: 0;"></div>
					</div>
					<div class="CodeMirror-hscrollbar" style="height: 18px; pointer-events: none;">
						<div style="height: 100%; min-height: 1px; width: 0;"></div>
					</div>
					<div class="CodeMirror-scrollbar-filler"></div>
					<div class="CodeMirror-gutter-filler"></div>
					<div class="CodeMirror-scroll" tabindex="-1">
						<div class="CodeMirror-sizer" style="margin-left: 50px; margin-bottom: 0; border-right-width: 30px; min-height: 165px; padding-right: 0; padding-bottom: 0;">
							<div style="position: relative; top: 0;">
								<div class="CodeMirror-lines" role="presentation">
									<div role="presentation" style="position: relative; outline: none;">
										<div class="CodeMirror-measure"></div>
										<div class="CodeMirror-measure"></div>
										<div style="position: relative; z-index: 1;"></div>
										<div class="CodeMirror-cursors"></div>
										<div class="" role="presentation" tabindex="0" style="">
											<div class="CodeMirror-activeline" style="position: relative;">
												<div class="CodeMirror-activeline-background CodeMirror-linebackground"></div>
												<div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -46px; width: 46px;"></div>
												<div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -46px;">
													<div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 16px; width: 21px;">
														1
													</div>
												</div>
												<pre class="CodeMirror-line" role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tag cm-bracket CodeMirror-matchingtag">&lt;</span><span class="cm-tag CodeMirror-matchingtag">script</span><span class=" CodeMirror-matchingtag"> </span><span class="cm-attribute CodeMirror-matchingtag">type</span><span class=" CodeMirror-matchingtag">=</span><span class="cm-string CodeMirror-matchingtag">"text/javascript"</span><span class="cm-tag cm-bracket CodeMirror-matchingtag">&gt;</span></span></pre>
											</div>
											<div style="position: relative;">
												<div class="CodeMirror-gutter-wrapper" style="left: -46px;">
													<div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 16px; width: 21px;">
														2
													</div>
												</div>
												<pre class="CodeMirror-line" role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tab" role="presentation">    </span><span class="cm-variable">console</span>.<span class="cm-property">log</span>( <span class="cm-string">'header'</span> );</span></pre>
											</div>
											<div style="position: relative;">
												<div class="CodeMirror-gutter-wrapper" style="left: -46px;">
													<div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 16px; width: 21px;">
														3
													</div>
												</div>
												<pre class="CodeMirror-line" role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-tag cm-bracket CodeMirror-matchingtag">&lt;/</span><span class="cm-tag CodeMirror-matchingtag">script</span><span class="cm-tag cm-bracket CodeMirror-matchingtag">&gt;</span></span></pre>
											</div>
											<div style="position: relative;">
												<div class="CodeMirror-gutter-wrapper" style="left: -46px;">
													<div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 16px; width: 21px;">
														4
													</div>
												</div>
												<pre class="CodeMirror-line" role="presentation"><span role="presentation" style="padding-right: 0.1px;"></pre>
											</div>
											<div style="position: relative;">
												<div class="CodeMirror-gutter-wrapper" style="left: -46px;">
													<div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 16px; width: 21px;">
														5
													</div>
												</div>
												<pre class="CodeMirror-line" role="presentation"><span role="presentation" style="padding-right: 0.1px;"></pre>
											</div>
										</div>
									</div>
								</div>
							</div>
						</div>
						<div style="position: absolute; height: 30px; width: 1px; border-bottom: 0 solid transparent; top: 165px;"></div>
						<div class="CodeMirror-gutters" style="height: 195px;">
							<div class="CodeMirror-gutter CodeMirror-lint-markers"></div>
							<div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 29px;"></div>
						</div>
					</div>
				</div>
			</div>
		</div>
		<?php
		echo WPCode_Admin_Page::get_upsell_box( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
			__( 'Page Scripts is a Pro Feature', 'insert-headers-and-footers' ),
			sprintf(
				'<p>%s</p>',
				esc_html__( 'While you can always use global snippets, in the PRO version you can easily add page-specific scripts and snippets directly from the post edit screen.', 'insert-headers-and-footers' )
			),
			array(
				'text' => esc_html__( 'Upgrade to Pro and Unlock Page Scripts', 'insert-headers-and-footers' ),
				'url'  => esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'post-editor-metabox', 'main-' . sanitize_title( $label ), 'upgrade-to-pro' ) ),
			),
			array(
				'text' => esc_html__( 'Learn more about all the features', 'insert-headers-and-footers' ),
				'url'  => esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'post-editor-metabox', 'main-' . sanitize_title( $label ), 'features' ) ),
			)
		);
	}

	/**
	 * Override the revisions tab content to make it specific to this class.
	 *
	 * @param WP_Post $post The post object.
	 *
	 * @return void
	 */
	public function output_tab_revisions( $post ) {
		printf(
			'<p>%s</p>',
			esc_html__( 'As you make changes to your page scripts and save, you will get a list of previous versions with all the changes made in each revision. You can compare revisions to the current version or see changes as they have been saved by going through each revision. Any of the revisions can then be restored as needed without interfering with your post/page.', 'insert-headers-and-footers' )
		);

		echo $this->code_revisions_list_with_notice( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
			esc_html__( 'Code Revisions is a Pro Feature', 'insert-headers-and-footers' ),
			sprintf(
				'<p>%s</p>',
				esc_html__( 'Upgrade to WPCode Pro today and start tracking revisions and see exactly who, when and which changes were made to your page scripts.', 'insert-headers-and-footers' )
			),
			array(
				'text' => esc_html__( 'Upgrade to Pro and Unlock Revisions', 'insert-headers-and-footers' ),
				'url'  => esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'post-editor-metabox', 'revisions', 'upgrade-to-pro' ) ),
			),
			array(
				'text' => esc_html__( 'Learn more about all the features', 'insert-headers-and-footers' ),
				'url'  => esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'post-editor-metabox', 'revisions', 'features' ) ),
			)
		);
	}
}
includes/lite/admin/class-wpcode-admin-page-loader-lite.php000064400000005471151331545640017711 0ustar00<?php
/**
 * Lite-specific admin page loader.
 * Extends the default pages with lite-specific items.
 *
 * @package WPCode
 */

/**
 * Class WPCode_Admin_Page_Loader_Lite.
 */
class WPCode_Admin_Page_Loader_Lite extends WPCode_Admin_Page_Loader {

	/**
	 * Load menu items from parent class and add class-specific ones.
	 *
	 * @return void
	 */
	public function hooks() {
		parent::hooks();

		add_action( 'admin_menu', array( $this, 'add_upgrade_menu_item' ), 40 );
		add_action( 'admin_head', array( $this, 'adjust_pro_menu_item_class' ) );
		add_action( 'admin_head', array( $this, 'admin_menu_styles' ), 11 );
	}

	/**
	 * Add lite-specific upgrade to pro menu item.
	 *
	 * @return void
	 */
	public function add_upgrade_menu_item() {
		add_submenu_page(
			'wpcode',
			esc_html__( 'Upgrade to Pro', 'insert-headers-and-footers' ),
			esc_html__( 'Upgrade to Pro', 'insert-headers-and-footers' ),
			'wpcode_edit_snippets',
			esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'wpcode-admin', 'admin-side-menu' ) )
		);
	}

	/**
	 * Add the PRO badge to left sidebar menu item.
	 *
	 * @since 1.7.8
	 */
	public function adjust_pro_menu_item_class() {

		global $submenu;

		// Bail if plugin menu is not registered.
		if ( ! isset( $submenu['wpcode'] ) ) {
			return;
		}

		$upgrade_link_position = key(
			array_filter(
				$submenu['wpcode'],
				static function ( $item ) {
					return strpos( $item[2], 'https://wpcode.com/lite' ) !== false;
				}
			)
		);

		// Bail if "Upgrade to Pro" menu item is not registered.
		if ( is_null( $upgrade_link_position ) ) {
			return;
		}

		$screen = get_current_screen();
		// Let's make sure we have an ID and the link is set in the menu.
		if ( isset( $screen->id ) && isset( $submenu['wpcode'][ $upgrade_link_position ][2] ) ) {
			// Let's clean up the screen id a bit.
			$screen_id = str_replace(
				array(
					'code-snippets_page_',
					'toplevel_page_',
				),
				'',
				$screen->id
			);

			$submenu['wpcode'][ $upgrade_link_position ][2] = str_replace( 'wpcode-admin', $screen_id, $submenu['wpcode'][ $upgrade_link_position ][2] );
		}

		// Prepare a HTML class.
		// phpcs:disable WordPress.WP.GlobalVariablesOverride.Prohibited
		if ( isset( $submenu['wpcode'][ $upgrade_link_position ][4] ) ) {
			$submenu['wpcode'][ $upgrade_link_position ][4] .= ' wpcode-sidebar-upgrade-pro';
		} else {
			$submenu['wpcode'][ $upgrade_link_position ][] = 'wpcode-sidebar-upgrade-pro';
		}
		// phpcs:enable WordPress.WP.GlobalVariablesOverride.Prohibited
	}


	/**
	 * Output inline styles for the admin menu.
	 */
	public function admin_menu_styles() {
		$styles = 'a.wpcode-sidebar-upgrade-pro { background-color: #59A56D !important; color: #fff !important; font-weight: 600 !important; }';

		// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
		printf( '<style>%s</style>', $styles );
	}
}
includes/conditional-logic/class-wpcode-conditional-type.php000064400000012756151331545640020347 0ustar00<?php
/**
 * Base class for types of conditional logic options.
 *
 * @package WPCode
 */

/**
 * Abstract class WPCode_Conditional_Type
 */
abstract class WPCode_Conditional_Type {

	/**
	 * An array of options for this type.
	 *
	 * @var array
	 */
	protected $options;

	/**
	 * The type label.
	 *
	 * @var string
	 */
	public $label;

	/**
	 * The type name.
	 *
	 * @var string
	 */
	public $name;

	/**
	 * The category of this type.
	 *
	 * @var string
	 */
	public $category;

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->register_type();
		$this->hooks();
	}

	/**
	 * Register conditional-logic hooks specific to each type (e.g. ajax callbacks).
	 *
	 * @return void
	 */
	public function hooks() {
	}

	/**
	 * Register this instance to the global auto-insert types.
	 *
	 * @return void
	 */
	private function register_type() {
		wpcode()->conditional_logic->register_type( $this );
	}

	/**
	 * Get the options for this type.
	 *
	 * @return array
	 */
	public function get_type_options() {
		if ( ! isset( $this->options ) ) {
			$this->load_type_options();
		}

		return $this->options;
	}

	/**
	 * Set the type label with a translatable string.
	 *
	 * @return void
	 */
	abstract protected function set_label();

	/**
	 * Load the options for this type of conditions.
	 *
	 * @return void
	 */
	abstract public function load_type_options();

	/**
	 * Get the label.
	 *
	 * @return string
	 */
	public function get_label() {
		if ( ! isset( $this->label ) ) {
			$this->set_label();
		}

		return $this->label;
	}

	/**
	 * Get the category.
	 *
	 * @return string
	 */
	public function get_category() {
		return $this->category;
	}

	/**
	 * Get the type name.
	 *
	 * @return string
	 */
	public function get_name() {
		return $this->name;
	}

	/**
	 * Process a rule group specific to the conditions type.
	 *
	 * @param array          $rule_group An array of rules with keys option,relation and value.
	 * @param WPCode_Snippet $snippet The snippet we are evaluating the rules for.
	 *
	 * @return bool
	 */
    public function evaluate_rule_row( $rule_group, $snippet ) {
        return $this->evaluate_rule( $rule_group['option'], $rule_group['relation'], $rule_group['value'], $snippet );
    }

	/**
	 * This takes an option name from the list of options for the type
	 * and if it finds it, it executes the callback defined in the list of
	 * options and compares that value to the set value using the operator
	 * set in the settings.
	 *
	 * @param string         $option The option to evaluate.
	 * @param string         $relation The comparison relation.
	 * @param string         $value The selected value for this condition.
	 * @param WPCode_Snippet $snippet The snippet we are evaluating the rules for.
	 *
	 * @return bool
	 */
	protected function evaluate_rule( $option, $relation, $value, $snippet ) {
		$options = $this->get_type_options();
		if ( ! isset( $options [ $option ] ) ) {
			return true;
		}
		$option_details = $options[ $option ];

		if ( ! isset( $option_details['callback'] ) ) {
			return false;
		}
		$callback = $option_details['callback'];
		if ( ! is_callable( $callback ) ) {
			return false;
		}

		return $this->get_relation_comparison( $callback( $snippet ), $value, $relation );
	}

	/**
	 * Takes 2 values and an operator and finds the appropriate function
	 * to evaluate the relation between them.
	 *
	 * @param mixed  $value1 This is the first value to compare with value 2.
	 * @param mixed  $value2 This is the 2nd value.
	 * @param string $operator This is the operator string.
	 *
	 * @return bool
	 */
	protected function get_relation_comparison( $value1, $value2, $operator ) {
		switch ( $operator ) {
			case '=':
				$result = $this->equals( $value1, $value2 );
				break;
			case '!=':
				$result = $this->does_not_equal( $value1, $value2 );
				break;
			case 'contains':
				$result = $this->contains( $value1, $value2 );
				break;
			case 'notcontains':
				$result = ! $this->contains( $value1, $value2 );
				break;
			default:
				$result = true;
				break;
		}

		return $result;
	}

	/**
	 * Does an equals comparison (not strict), also handles arrays to
	 * make it easier to compare things like user roles.
	 *
	 * @param mixed $value1 Value 1.
	 * @param mixed $value2 Value to compare value 1 to.
	 *
	 * @return bool
	 */
	private function equals( $value1, $value2 ) {
		if ( is_array( $value1 ) ) {
			if ( is_array( $value2 ) ) {
				return count( array_intersect( $value1, $value2 ) ) > 0;
			}

			return in_array( $value2, $value1 );
		}
		if ( is_array( $value2 ) ) {
			return in_array( $value1, $value2 );
		}

		return $value1 == $value2;
	}

	/**
	 * Does a "does not equal" comparison (not strict), also handles arrays to
	 * make it easier to compare things like user roles.
	 *
	 * @param mixed $value1 Value 1.
	 * @param mixed $value2 Value to compare value 1 to.
	 *
	 * @return bool
	 */
	private function does_not_equal( $value1, $value2 ) {
		if ( is_array( $value1 ) ) {
			if ( is_array( $value2 ) ) {
				return count( array_intersect( $value1, $value2 ) ) === 0;
			}

			return ! in_array( $value2, $value1 );
		}

		if ( is_array( $value2 ) ) {
			return ! in_array( $value1, $value2 );
		}

		return $value1 != $value2;
	}

	/**
	 * Check if value1 contains value2.
	 *
	 * @param string $value1 Value in which to look for value 2.
	 * @param string $value2 The value to look for in value 1.
	 *
	 * @return bool
	 */
	private function contains( $value1, $value2 ) {
		if ( empty( $value2 ) ) {
			return false;
		}
		return false !== strpos( $value1, $value2 );
	}
}
includes/conditional-logic/class-wpcode-conditional-page.php000064400000024355151331545640020300 0ustar00<?php
/**
 * Class that handles conditional logic related to pages.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * The WPCode_Conditional_Page class.
 */
class WPCode_Conditional_Page extends WPCode_Conditional_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'page';

	/**
	 * The category of this type.
	 *
	 * @var string
	 */
	public $category = 'where';

	/**
	 * Set the translatable label.
	 *
	 * @return void
	 */
	protected function set_label() {
		$this->label = __( 'Page', 'insert-headers-and-footers' );
	}

	/**
	 * Set the type options for the admin mainly.
	 *
	 * @return void
	 */
	public function load_type_options() {
		$this->options = array(
			'type_of_page'  => array(
				'label'       => __( 'Type of page', 'insert-headers-and-footers' ),
				'description' => __( 'Choose a WordPress-specific type of page for your rule.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'options'     => array(
					array(
						'label' => __( 'Homepage', 'insert-headers-and-footers' ),
						'value' => 'is_front_page',
					),
					array(
						'label' => __( 'Archive', 'insert-headers-and-footers' ),
						'value' => 'is_archive',
					),
					array(
						'label' => __( 'Single post/page', 'insert-headers-and-footers' ),
						'value' => 'is_single',
					),
					array(
						'label' => __( 'Search page', 'insert-headers-and-footers' ),
						'value' => 'is_search',
					),
					array(
						'label' => __( '404 page', 'insert-headers-and-footers' ),
						'value' => 'is_404',
					),
					array(
						'label' => __( 'Author page', 'insert-headers-and-footers' ),
						'value' => 'is_author',
					),
					array(
						'label' => __( 'Blog home', 'insert-headers-and-footers' ),
						'value' => 'is_home',
					),
				),
				'callback'    => array( $this, 'get_type_of_page' ),
			),
			'post_type'     => array(
				'label'       => __( 'Post type', 'insert-headers-and-footers' ),
				'description' => __( 'Target by post type: posts, pages or custom post types.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'options'     => $this->get_post_types(),
				'callback'    => array( $this, 'get_current_post_type' ),
			),
			'referrer'      => array(
				'label'       => __( 'Referrer', 'insert-headers-and-footers' ),
				'description' => __( 'Use the page referrer/last visited page url as a condition.', 'insert-headers-and-footers' ),
				'type'        => 'text',
				'callback'    => array( $this, 'get_referer' ),
			),
			'taxonomy_page' => array(
				'label'       => __( 'Taxonomy page', 'insert-headers-and-footers' ),
				'description' => __( 'Load only on pages for a specific category/taxonomy.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'options'     => $this->get_taxonomies_options(),
				'callback'    => array( $this, 'get_taxonomy' ),
			),
			'taxonomy_term' => array(
				'label'           => __( 'Taxonomy term', 'insert-headers-and-footers' ),
				'description'     => __( 'Choose category/taxonomy terms to target for single or archive pages.', 'insert-headers-and-footers' ),
				'type'            => 'ajax',
				'options'         => 'wpcode_search_terms',
				'callback'        => array( $this, 'get_term' ),
				'labels_callback' => array( $this, 'get_taxonomy_term_labels' ),
				'multiple'        => true,
			),
			'page_url'      => array(
				'label'       => __( 'Page URL', 'insert-headers-and-footers' ),
				'description' => __( 'Use the page URL to limit where this snippet is loaded.', 'insert-headers-and-footers' ),
				'type'        => 'text',
				'callback'    => array( $this, 'get_page_url' ),
			),
            'post_meta'     => array(
                'label'       => __( 'Post meta', 'insert-headers-and-footers' ) . ' (PRO)',
                'description' => __( 'Target specific posts based on custom post meta values.', 'insert-headers-and-footers' ),
                'type'        => 'text',
                'options'     => array(),
                'upgrade'     => array(
                    'title' => __( 'Post Meta rules are a Pro feature', 'insert-headers-and-footers' ),
                    'text'  => __( 'Upgrade today to create conditional logic rules for specific pages or posts.', 'insert-headers-and-footers' ),
                    'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'post_meta' ),
                ),
            ),
			'post_id'       => array(
				'label'       => __( 'Post/Page', 'insert-headers-and-footers' ) . ' (PRO)',
				'description' => __( 'Pick specific posts or pages to load the snippet on.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'options'     => array(),
				'upgrade'     => array(
					'title' => __( 'Post specific rules are a Pro feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Upgrade today to create conditional logic rules for specific pages or posts.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'post_id' ),
				),
			),
			'page_template' => array(
				'label'       => __( 'Page Template', 'insert-headers-and-footers' ) . ' (PRO)',
				'description' => __( 'Load the snippet only on pages with a specific template.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'options'     => array(),
				'upgrade'     => array(
					'title' => __( 'Page Template rules are a Pro feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Upgrade today to create conditional logic rules for specific page templates.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'page_template' ),
				),
			),
			'post_author'   => array(
				'label'       => __( 'Author', 'insert-headers-and-footers' ) . ' (PRO)',
				'description' => __( 'Load the snippet only on pages with a specific author.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'options'     => array(),
				'upgrade'     => array(
					'title' => __( 'Post Author rules are a Pro feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Upgrade today to create conditional logic rules based on the page/post author.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'post_author' ),
				),
			),
		);
	}

	/**
	 * Get a list of options with post types.
	 *
	 * @return array
	 */
	protected function get_post_types() {
		$post_types = get_post_types( array( 'public' => true ), 'objects' );
		$options    = array();
		foreach ( $post_types as $post_type ) {
			$options[] = array(
				'label' => $post_type->label,
				'value' => $post_type->name,
			);
		}

		return $options;
	}

	/**
	 * Get a list of taxonomy types.
	 *
	 * @return array
	 */
	protected function get_taxonomies_options() {
		$taxonomies = get_taxonomies(
			array(
				'public' => true,
			),
			'objects'
		);
		$options    = array();
		foreach ( $taxonomies as $taxonomy ) {
			if ( 'post_format' === $taxonomy->name ) {
				continue;
			}
			$options[] = array(
				// Translators: this is the name of the taxonomy.
				'label' => $taxonomy->labels->singular_name,
				'value' => $taxonomy->name,
			);
		}

		return $options;
	}

	/**
	 * Get the type of page.
	 *
	 * @return string
	 */
	public function get_type_of_page() {
		global $wp_query;

		if ( ! isset( $wp_query ) ) {
			return '';
		}
		if ( is_front_page() ) {
			return 'is_front_page';
		}
		if ( is_home() ) {
			return 'is_home';
		}
		if ( is_singular() ) {
			return 'is_single';
		}
		if ( is_author() ) {
			return 'is_author';
		}
		if ( is_archive() ) {
			return 'is_archive';
		}
		if ( is_search() ) {
			return 'is_search';
		}
		if ( is_404() ) {
			return 'is_404';
		}

		return '';
	}

	/**
	 * Get the current page post type, if any.
	 *
	 * @return string
	 */
	public function get_current_post_type() {
		return get_post_type();
	}

	/**
	 * Get the referrer from PHP.
	 *
	 * @return string
	 */
	public function get_referer() {
		return isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : '';  // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
	}

	/**
	 * Get the page URL.
	 *
	 * @return string
	 */
	public function get_page_url() {
		global $wp;

		if ( is_admin() ) {
			$url = isset( $_SERVER['REQUEST_URI'] ) ? basename( esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) : '';
			$url = admin_url( $url );
		} else {
			$url = isset( $wp->request ) ? trailingslashit( home_url( $wp->request ) ) : '';
		}

		if ( ! empty( $_GET ) ) { // phpcs:ignore
			foreach ( $_GET as $key => $value ) { // phpcs:ignore
				$key = sanitize_key( $key );
				$url = add_query_arg(
					array(
						$key => sanitize_text_field( wp_unslash( $value ) ),
					),
					$url
				);
			}
		}

		return $url;
	}

	/**
	 * Check if the current page is a taxonomy page and if yes get the taxonomy name.
	 *
	 * @return string
	 */
	public function get_taxonomy() {
		global $wp_query;
		if ( is_null( $wp_query ) ) {
			return '';
		}
		$queried_object = get_queried_object();

		return isset( $queried_object->taxonomy ) ? $queried_object->taxonomy : '';
	}

	/**
	 * Get the term of the current page, if any.
	 *
	 * @return array
	 */
	public function get_term() {
		global $wp_query;
		if ( is_null( $wp_query ) ) {
			return array();
		}
		if ( is_tax() || is_category() || is_tag() ) {
			$queried_object = get_queried_object();

			return isset( $queried_object->term_id ) ? array( $queried_object->term_id ) : array();
		}
		if ( is_singular() ) {
			return get_terms(
				array(
					'object_ids' => array( get_the_ID() ),
					'fields'     => 'ids',
				)
			);
		}

		return array();
	}

	/**
	 * Get the term labels for the taxonomy term value loading in the admin form.
	 *
	 * @param array $values The values that are selected.
	 *
	 * @return array
	 */
	public function get_taxonomy_term_labels( $values ) {
		$labels = array();
		foreach ( $values as $term_id ) {
			$term = get_term( $term_id );
			if ( is_null( $term ) || is_wp_error( $term ) ) {
				continue;
			}
			$labels[] = array(
				'value' => $term_id,
				'label' => $term->name,
			);
		}

		return $labels;
	}
}

new WPCode_Conditional_Page();
includes/conditional-logic/class-wpcode-conditional-user.php000064400000005321151331545640020332 0ustar00<?php
/**
 * Class that handles conditional logic related to users.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * The WPCode_Conditional_User class.
 */
class WPCode_Conditional_User extends WPCode_Conditional_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'user';

	/**
	 * The category of this type.
	 *
	 * @var string
	 */
	public $category = 'who';

	/**
	 * Set the translatable label.
	 *
	 * @return void
	 */
	protected function set_label() {
		$this->label = __( 'User', 'insert-headers-and-footers' );
	}

	/**
	 * Set the type options for the admin mainly.
	 *
	 * @return void
	 */
	public function load_type_options() {
		$this->options = array(
			'logged_in' => array(
				'label'       => __( 'Logged-in', 'insert-headers-and-footers' ),
				'description' => __( 'Check if your site visitor is logged in.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'options'     => array(
					array(
						'label' => __( 'True', 'insert-headers-and-footers' ),
						'value' => true,
					),
					array(
						'label' => __( 'False', 'insert-headers-and-footers' ),
						'value' => false,
					),
				),
				'callback'    => 'is_user_logged_in',
			),
			'user_role' => array(
				'label'       => __( 'User Role', 'insert-headers-and-footers' ),
				'description' => __( 'Target a specific user role.', 'insert-headers-and-footers' ),
				'type'        => 'select',
				'options'     => $this->get_options_user_roles(),
				'callback'    => array( $this, 'get_user_role' ),
			),
			'user_meta' => array(
				'label'       => __( 'User Meta', 'insert-headers-and-footers') . ' (PRO)' ,
				'description' => __( 'Target users based on user meta values.', 'insert-headers-and-footers' ),
				'type'        => 'text',
				'options'     => array(),
				'upgrade'     => array(
					'title' => __( 'User Meta is a Pro Feature', 'insert-headers-and-footers' ),
					'text'  => __( 'Get access to User Meta conditional logic rules by upgrading to PRO today.', 'insert-headers-and-footers' ),
					'link'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'edit-snippet', 'conditional-logic', 'user-meta' ),
				),
			),
		);
	}

	/**
	 * Get a list of options for user roles.
	 *
	 * @return array
	 */
	protected function get_options_user_roles() {
		$user_roles = wp_roles()->roles;
		$options    = array();
		foreach ( $user_roles as $key => $role ) {
			$options[] = array(
				'label' => $role['name'],
				'value' => $key,
			);
		}

		return $options;
	}

	/**
	 * Get an array of user roles for the current user.
	 *
	 * @return string[]
	 */
	public function get_user_role() {
		$user = wp_get_current_user();

		return $user->roles;
	}
}

new WPCode_Conditional_User();
includes/class-wpcode-snippet-cache.php000064400000007742151331545640014211 0ustar00<?php
/**
 * Cache active snippets in a single query.
 *
 * @package WPCode
 */

/**
 * Class WPCode_Snippet_Cache.
 */
class WPCode_Snippet_Cache {

	/**
	 * The option name used for storing data in the db.
	 *
	 * @var string
	 */
	protected $option_name = 'wpcode_snippets';

	/**
	 * The snippets stored in the db.
	 *
	 * @var array
	 */
	protected $snippets;

	/**
	 * Get the snippets data from the cache.
	 *
	 * @return array
	 */
	public function get_cached_snippets() {
		if ( ! isset( $this->snippets ) ) {
			$all_snippets = $this->get_option();
			foreach ( $all_snippets as $location => $snippets ) {
				if ( empty( $snippets ) ) {
					continue;
				}
				if ( ! is_array( $all_snippets[ $location ] ) ) {
					$all_snippets[ $location ] = array();
				}
				// Load minimal snippet data from array.
				foreach ( $snippets as $key => $snippet ) {
					$all_snippets[ $location ][ $key ] = $this->load_snippet( $snippet );
				}

				usort( $all_snippets[ $location ], array( $this, 'priority_order' ) );
			}

			$this->snippets = $all_snippets;
		}

		return $this->snippets;
	}

	/**
	 * Load a snippet by id, WP_Post or array.
	 *
	 * @param array|int|WP_Post $snippet_data Load a snippet by id, WP_Post or array.
	 *
	 * @return WPCode_Snippet
	 */
	public function load_snippet( $snippet_data ) {
		return new WPCode_Snippet( $snippet_data );
	}

	/**
	 * Get cached snippets in an array by their id.
	 *
	 * @return WPCode_Snippet[]
	 */
	public function get_cached_snippets_by_id() {
		$snippets_by_id  = array();
		$cached_snippets = $this->get_cached_snippets();
		foreach ( $cached_snippets as $snippets ) {
			foreach ( $snippets as $snippet ) {
				$snippets_by_id[ $snippet->get_id() ] = $snippet;
			}
		}

		return $snippets_by_id;
	}

	/**
	 * Used for sorting by priority.
	 *
	 * @param WPCode_Snippet $snippet_a The first snippet.
	 * @param WPCode_Snippet $snippet_b The second snippet.
	 *
	 * @return int
	 */
	public function priority_order( $snippet_a, $snippet_b ) {
		return $snippet_a->get_priority() - $snippet_b->get_priority();
	}

	/**
	 * Delete the cache option completely.
	 *
	 * @return void
	 */
	public function delete_cache() {
		update_option( $this->option_name, array() );
	}

	/**
	 * Save all the loaded snippets in a single option.
	 *
	 * @return void
	 */
	public function cache_all_loaded_snippets() {
		if ( ! apply_filters( 'wpcode_cache_active_snippets', true ) ) {
			return;
		}
		$auto_inserts         = wpcode()->auto_insert->get_types();
		$snippets_by_location = array();
		foreach ( $auto_inserts as $auto_insert ) {
			// We don't want to use cached data when gathering stuff for cache.
			add_filter( 'wpcode_use_auto_insert_cache', '__return_false' );
			// Make sure snippets were not already loaded by earlier hooks.
			unset( $auto_insert->snippets );
			$snippets_by_location = array_merge( $auto_insert->get_snippets(), $snippets_by_location );
		}

		$data_for_cache = array();
		foreach ( $snippets_by_location as $location => $snippets ) {
			if ( empty( $snippets ) ) {
				continue;
			}
			$data_for_cache[ $location ] = $this->prepare_snippets_for_caching( $snippets );
		}

		$this->update_option( $data_for_cache );
	}

	/**
	 * Update the option with the new data.
	 *
	 * @param array $data_for_cache The data to store in the option.
	 *
	 * @return bool
	 */
	public function update_option( $data_for_cache ) {
		return update_option( $this->option_name, $data_for_cache );
	}

	/**
	 * Get the option from the db.
	 *
	 * @return array
	 */
	public function get_option() {
		return (array) get_option( $this->option_name, array() );
	}

	/**
	 * Go through an array of snippets and extract just the minimal data
	 * needed for running the snippets.
	 *
	 * @param WPCode_Snippet[] $snippets The snippets array.
	 *
	 * @return array
	 */
	private function prepare_snippets_for_caching( $snippets ) {
		$prepared_snippets = array();
		foreach ( $snippets as $snippet ) {
			$prepared_snippets[] = $snippet->get_data_for_caching();
		}

		return $prepared_snippets;
	}
}
includes/class-wpcode-generator.php000064400000007474151331545640013456 0ustar00<?php
/**
 * Load all generator types and expose them to the admin.
 *
 * @package WPCode
 */

/**
 * The WPCode_Generator class.
 */
class WPCode_Generator {

	/**
	 * The type of generators available.
	 *
	 * @var array
	 */
	public $types = array();

	/**
	 * The available categories.
	 *
	 * @var array
	 */
	public $categories;

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->load_types();
	}

	/**
	 * Require and load all the generators.
	 *
	 * @return void
	 */
	public function load_types() {
		require_once WPCODE_PLUGIN_PATH . 'includes/generator/class-wpcode-generator-type.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/generator/class-wpcode-generator-post-status.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/generator/class-wpcode-generator-post-type.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/generator/class-wpcode-generator-admin-bar.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/generator/class-wpcode-generator-contact-methods.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/generator/class-wpcode-generator-taxonomy.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/generator/class-wpcode-generator-script.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/generator/class-wpcode-generator-style.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/generator/class-wpcode-generator-hooks.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/generator/class-wpcode-generator-cronjob.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/generator/class-wpcode-generator-menu.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/generator/class-wpcode-generator-sidebar.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/generator/class-wpcode-generator-query.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/generator/class-wpcode-generator-widget.php';

		$generators = array(
			'WPCode_Generator_Admin_Bar',
			'WPCode_Generator_Contact_Methods',
			'WPCode_Generator_Cronjob',
			'WPCode_Generator_Hooks',
			'WPCode_Generator_Menu',
			'WPCode_Generator_Post_Status',
			'WPCode_Generator_Post_Type',
			'WPCode_Generator_Script',
			'WPCode_Generator_Sidebar',
			'WPCode_Generator_Style',
			'WPCode_Generator_Taxonomy',
			'WPCode_Generator_Widget',
			'WPCode_Generator_Query',
		);
		foreach ( $generators as $generator_class ) {
			if ( ! class_exists( $generator_class ) ) {
				continue;
			}
			$instance = new $generator_class();

			$this->types[ $instance->name ] = $instance;
		}
		// Sort by displayed title.
		uasort(
			$this->types,
			function( $a, $b ) {
				return strcmp( $a->title, $b->title );
			}
		);
	}

	/**
	 * Load all the categories with their labels.
	 *
	 * @return void
	 */
	private function load_categories() {
		$categories       = array(
			'admin'   => __( 'Admin', 'insert-headers-and-footers' ),
			'content' => __( 'Content', 'insert-headers-and-footers' ),
			'core'    => __( 'Core', 'insert-headers-and-footers' ),
			'design'  => __( 'Design', 'insert-headers-and-footers' ),
			'query'   => __( 'Query', 'insert-headers-and-footers' ),
		);
		$this->categories = array();
		foreach ( $categories as $slug => $name ) {
			$this->categories[] = array(
				'slug' => $slug,
				'name' => $name,
			);
		}
	}

	/**
	 * Get categories.
	 *
	 * @return array
	 */
	public function get_categories() {
		if ( ! isset( $this->categories ) ) {
			$this->load_categories();
		}

		return $this->categories;
	}

	/**
	 * Get all the generator instances.
	 *
	 * @return WPCode_Generator_Type[]
	 */
	public function get_all_generators() {
		return $this->types;
	}

	/**
	 * Get a generator by its name. If not found it returns false.
	 *
	 * @param string $name The name of the generator.
	 *
	 * @return WPCode_Generator_Type|false
	 */
	public function get_type( $name ) {
		$types = $this->get_all_generators();

		return isset( $types[ $name ] ) ? $types[ $name ] : false;
	}
}
includes/class-wpcode-admin-bar-info.php000064400000033173151331545640014246 0ustar00<?php
/**
 * This class adds the WPCode info to the admin bar for logged-in administrator users
 * that can manage snippets (wpcode_activate_snippets capability).
 * The class will gather info about the header & footer items added and all the active snippets
 * and display a count of scripts/snippets added by wpcode after the page is fully loaded.
 */

/**
 * Class WPCode_Admin_Bar_Info
 */
abstract class WPCode_Admin_Bar_Info {

	/**
	 * The global locations disabled for the current page through the Page Scripts settings.
	 *
	 * @var array
	 */
	protected $global_disabled = array();

	/**
	 * The snippets loaded on this page.
	 *
	 * @var array
	 */
	public $loaded_snippets = array();

	/**
	 * The WPCode_Admin_Bar_Info constructor.
	 */
	public function __construct() {
		add_action( 'plugins_loaded', array( $this, 'maybe_init' ), 1 );
	}

	/**
	 * Check if we should be tracking for the current session.
	 *
	 * @return bool
	 */
	public function should_track() {
		if ( ! is_user_logged_in() ) {
			return false;
		}

		if ( ! current_user_can( 'wpcode_activate_snippets' ) ) {
			return false;
		}

		// Don't load the admin bar menu in headers & footers mode.
		if ( wpcode()->settings->get_option( 'headers_footers_mode' ) ) {
			return false;
		}

		$show_menu = wpcode()->settings->get_option( 'admin_bar_info', true );

		if ( ! $show_menu ) {
			return false;
		}

		return true;
	}

	/**
	 * Early on the plugins_loaded hook we check if we should be tracking for the current session.
	 *
	 * @return void
	 */
	public function maybe_init() {
		if ( $this->should_track() ) {
			$this->hooks();
		}
	}

	/**
	 * Add hooks needed to track the way WPCode loads scripts and snippets.
	 */
	public function hooks() {
		// Use the snippet output to more accurately track the snippets loaded.
		add_filter( 'wpcode_snippet_output', array( $this, 'track_snippet_output' ), 999, 2 );

		// Add an admin menu item to display the results.
		add_action( 'admin_bar_menu', array( $this, 'add_admin_bar_info' ), 999 );

		add_action( 'admin_bar_menu', array( $this, 'add_admin_bar_quick_links' ), 1200 );

		// Output results at the end of the page and use JS to populate the admin menu item.
		add_action( 'wp_footer', array( $this, 'add_footer_info' ), 15 );
		add_action( 'admin_footer', array( $this, 'add_footer_info' ), 999999 );

		add_action( 'admin_init', array( $this, 'enqueue_scripts' ), - 5 );
		add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ), 15 );
		add_action( 'template_redirect', array( $this, 'enqueue_scripts' ), - 5 );
	}

	/**
	 * Load the scripts used by the admin bar.
	 *
	 * @return void
	 */
	public function enqueue_scripts() {
		if ( ! is_admin_bar_showing() ) {
			return;
		}
		// Allow other plugins to modify the screens where the admin bar scripts are loaded.
		if ( apply_filters( 'wpcode_load_admin_bar_scripts', false ) ) {
			return;
		}

		$admin_asset_file = WPCODE_PLUGIN_PATH . 'build/admin-bar.asset.php';

		if ( ! file_exists( $admin_asset_file ) ) {
			return;
		}

		$asset = require $admin_asset_file;

		wp_enqueue_style( 'wpcode-admin-bar-css', WPCODE_PLUGIN_URL . 'build/admin-bar.css', null, $asset['version'] );

		wp_enqueue_script( 'wpcode-admin-bar-js', WPCODE_PLUGIN_URL . 'build/admin-bar.js', null, $asset['version'], true );

	}

	/**
	 * Add the WPCode info to the admin bar.
	 *
	 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
	 */
	public function add_admin_bar_info( $wp_admin_bar ) {
		// Let's see if we have any errors.
		$error_count = wpcode()->error->get_error_count();
		$indicator   = '';

		if ( $error_count > 0 ) {
			$indicator = ' <div class="wp-core-ui wp-ui-notification wpcode-menu-notification-counter">' . $error_count . '</div>';
		}

		// Add an admin menu item to append our count to.
		$wp_admin_bar->add_menu(
			array(
				'id'    => 'wpcode-admin-bar-info',
				'title' => 'WPCode' . $indicator,
				'meta'  => array(
					'class' => 'wpcode-admin-bar-info menupop',
				),
				'href'  => add_query_arg( 'page', 'wpcode', admin_url( 'admin.php' ) ),
			)
		);

		do_action( 'wpcode_admin_bar_info_top', $wp_admin_bar );

		if ( ! empty( $error_count ) ) {
			$wp_admin_bar->add_menu(
				array(
					'id'     => 'wpcode-error-count',
					'parent' => 'wpcode-admin-bar-info',
					'title'  => esc_html__( 'Snippets With Errors', 'insert-headers-and-footers' ) . $indicator,
					'meta'   => array(
						'class' => 'wpcode-admin-bar-info-submenu',
					),
					'href'   => add_query_arg(
						array(
							'page' => 'wpcode',
							'view' => 'has_error',
						),
						admin_url( 'admin.php' )
					),
				)
			);
		}

		$wp_admin_bar->add_menu(
			array(
				'id'     => 'wpcode-description',
				'parent' => 'wpcode-admin-bar-info',
				'title'  => esc_html__( 'Loaded on this page', 'insert-headers-and-footers' ),
				'meta'   => array(
					'class' => 'wpcode-admin-bar-info-submenu wpcode-admin-bar-description',
				),
			)
		);

		$global_scripts_data = $this->get_global_scripts_data();

		if ( ! empty( $global_scripts_data ) ) {

			// Calculate total by adding up the "count" property of each item.
			$total = array_sum( wp_list_pluck( $global_scripts_data, 'count' ) );

			$wp_admin_bar->add_menu(
				array(
					'id'     => 'wpcode-global-scripts',
					'parent' => 'wpcode-admin-bar-info',
					'title'  => esc_html(
						sprintf(
						// translators: %d is the total number of global scripts.
							__( 'Global Scripts (%d)', 'insert-headers-and-footers' ),
							$total
						)
					),
					'meta'   => array(
						'class' => 'wpcode-admin-bar-info-submenu',
					),
					'href'   => add_query_arg( 'page', 'wpcode-headers-footers', admin_url( 'admin.php' ) ),
				)
			);

			foreach ( $global_scripts_data as $id => $global_scripts_area ) {
				$wp_admin_bar->add_menu(
					array(
						'id'     => 'wpcode-global-' . $id,
						'parent' => 'wpcode-global-scripts',
						'title'  => esc_html( $global_scripts_area['label'] ),
						'meta'   => array(
							'class' => 'wpcode-admin-bar-info-submenu',
						),
						'href'   => $global_scripts_area['href'],
					)
				);
			}
		}

		$wp_admin_bar->add_menu(
			array(
				'id'     => 'wpcode-loaded-on-this-page',
				'parent' => 'wpcode-admin-bar-info',
				'title'  => esc_html__( 'Code Snippets', 'insert-headers-and-footers' ),
				'meta'   => array(
					'class' => 'wpcode-admin-bar-info-submenu',
				),
				'href'   => add_query_arg( 'page', 'wpcode', admin_url( 'admin.php' ) ),
			)
		);

		$wp_admin_bar->add_menu(
			array(
				'id'     => 'wpcode-admin-bar-info-replace',
				'parent' => 'wpcode-loaded-on-this-page',
				'title'  => '',
				'meta'   => array(
					'class' => 'wpcode-admin-bar-info-submenu',
				),
			)
		);
	}

	/**
	 * Use the filter called in each location to keep tabs of which snippets were actually loaded in each location.
	 *
	 * @param WPCode_Snippet[] $snippets Array of snippets.
	 * @param string           $location The location.
	 *
	 * @return mixed
	 */
	public function track_used_snippets( $snippets, $location ) {

		foreach ( $snippets as $snippet ) {
			if ( ! isset( $this->loaded_snippets[ $location ] ) ) {
				$this->loaded_snippets[ $location ] = array();
			}
			$this->loaded_snippets[ $location ][] = $snippet;
		}

		return $snippets;
	}

	/**
	 * Output a script that builds the admin bar menu with the snippet/scripts info using JS after the page has loaded.
	 *
	 * @return void
	 */
	public function add_footer_info() {

		if ( ! is_admin_bar_showing() ) {
			return;
		}

		$footer_info = array();

		foreach ( $this->loaded_snippets as $location => $snippets ) {

			$location_label = wpcode()->auto_insert->get_location_label( $location );
			if ( 'shortcode' === $location ) {
				$location_label = esc_html__( 'Shortcode', 'insert-headers-and-footers' );
			}
			if ( 'block' === $location ) {
				$location_label = esc_html__( 'Gutenberg Block', 'insert-headers-and-footers' );
			}
			if ( 0 === strpos( $location, 'shortcode-' ) ) {
				$location_label = esc_html__( 'Custom Shortcode', 'insert-headers-and-footers' );
			}
			$location_info = array(
				'label'       => $location_label . ' (' . count( $snippets ) . ')',
				'location_id' => $location,
				'snippets'    => array(),
				'href'        => $this->get_location_filter_link( $location ),
			);
			foreach ( $snippets as $snippet ) {
				$location_info['snippets'][] = array(
					'id'        => $snippet->get_id(),
					'title'     => esc_html( $snippet->get_title() ),
					'edit_link' => $this->get_snippet_edit_link( $snippet ),
				);
			}
			$location_info['count'] = count( $snippets );

			$footer_info[] = $location_info;
		}

		$total_count = 0;
		foreach ( $footer_info as $location ) {
			$total_count += $location['count'];
		}

		// Output $footer_info as a JSON in a JS variable to be used in the script to populate the admin bar.
		?>
		<script>
			var wpcode_admin_bar_info = <?php echo wp_json_encode( $footer_info ); ?>;
			var wpcode_admin_bar_info_count = <?php echo absint( $total_count ); ?>;
		</script>
		<?php
	}

	/**
	 * Get the snippet edit link based on the snippet id.
	 *
	 * @param WPCode_Snippet $snippet The snippet object.
	 *
	 * @return string
	 */
	public function get_snippet_edit_link( $snippet ) {
		return apply_filters( 'wpcode_admin_bar_edit_snippet_link', admin_url( 'admin.php?page=wpcode-snippet-manager&snippet_id=' . $snippet->get_id() ), $snippet );
	}

	/**
	 * Get data related to the global Header & Footer scripts.
	 *
	 * @return array
	 */
	public function get_global_scripts_data() {
		if ( is_admin() ) {
			// Global scripts are never loaded in the admin.
			return array();
		}
		$data = array();

		$global_locations = array(
			'header' => array(
				'label' => __( 'Global Header', 'insert-headers-and-footers' ),
			),
		);
		if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
			$global_locations['body'] = array(
				'label' => __( 'Global Body', 'insert-headers-and-footers' ),
			);
		}
		$global_locations['footer'] = array(
			'label' => __( 'Global Footer', 'insert-headers-and-footers' ),
		);

		$disabled_label = esc_html__( 'Disabled via Page Scripts', 'insert-headers-and-footers' );

		foreach ( $global_locations as $location => $location_texts ) {
			$scripts = get_option( 'ihaf_insert_' . $location );

			$count = ! empty( $scripts ) ? 1 : 0;

			if ( in_array( $location, $this->global_disabled, true ) ) {
				$count = 0;

				$location_texts['label'] .= ' (' . $disabled_label . ')';
			} else {
				$location_texts['label'] .= ' (' . $count . ')';
			}
			$data[ $location ] = array(
				'label' => $location_texts['label'],
				'href'  => admin_url( 'admin.php?page=wpcode-headers-footers#wpcode-global-' . $location ),
				'count' => $count,
			);
		}

		return $data;
	}

	/**
	 * Add the WPCode info to the admin bar.
	 *
	 * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
	 */
	public function add_admin_bar_quick_links( $wp_admin_bar ) {


		$wp_admin_bar->add_menu(
			array(
				'id'     => 'wpcode-admin-bar-info-add-new',
				'parent' => 'wpcode-admin-bar-info',
				'title'  => esc_html__( '+ Add Snippet', 'insert-headers-and-footers' ),
				'href'   => admin_url( 'admin.php?page=wpcode-snippet-manager' ),
				'meta'   => array(
					'class' => 'wpcode-admin-bar-info-submenu wpcode-admin-bar-info-separator-top',
				),
			)
		);

		$wp_admin_bar->add_menu(
			array(
				'id'     => 'wpcode-admin-bar-info-settings',
				'parent' => 'wpcode-admin-bar-info',
				'title'  => esc_html__( 'Settings', 'insert-headers-and-footers' ),
				'href'   => add_query_arg( 'page', 'wpcode-settings', admin_url( 'admin.php' ) ),
				'meta'   => array(
					'class' => 'wpcode-admin-bar-info-submenu',
				),
			)
		);

		// If error logging is enabled add a direct link here.
		if ( wpcode()->settings->get_option( 'error_logging' ) ) {
			$wp_admin_bar->add_menu(
				array(
					'id'     => 'wpcode-admin-bar-info-error-logs',
					'parent' => 'wpcode-admin-bar-info',
					'title'  => esc_html__( 'Logs', 'insert-headers-and-footers' ),
					'href'   => add_query_arg(
						array(
							'page' => 'wpcode-tools',
							'view' => 'logs',

						),
						admin_url( 'admin.php' )
					),
					'meta'   => array(
						'class' => 'wpcode-admin-bar-info-submenu',
					),
				)
			);
		}

		$wp_admin_bar->add_menu(
			array(
				'id'     => 'wpcode-admin-bar-info-help',
				'parent' => 'wpcode-admin-bar-info',
				'title'  => esc_html__( 'Help Docs', 'insert-headers-and-footers' ),
				'href'   => wpcode_utm_url( 'https://wpcode.com/docs/', 'admin-bar', 'help' ),
				'meta'   => array(
					'class'  => 'wpcode-admin-bar-info-submenu',
					'target' => '_blank',
					'rel'    => 'noopener noreferrer',
				),
			)
		);
	}

	/**
	 * Track a snippet output for the admin bar.
	 *
	 * @param string         $output The snippet output (we don't use this).
	 * @param WPCode_Snippet $snippet The snippet object.
	 *
	 * @return string
	 */
	public function track_snippet_output( $output, $snippet ) {

		$location = $snippet->get_location();

		if ( ! isset( $this->loaded_snippets[ $location ] ) ) {
			$this->loaded_snippets[ $location ] = array();
		}
		$this->loaded_snippets[ $location ][] = $snippet;

		return $output;
	}

	/**
	 * Method for the location link.
	 *
	 * @param string $location The location slug.
	 *
	 * @return string
	 */
	public function get_location_filter_link( $location ) {

		if ( in_array( $location, array( 'shortcode', 'block' ), true ) ) {
			// If this is for a shortcode or a block let's try to link to the edit page of the currently loaded post.
			return get_edit_post_link();
		}

		return esc_url(
			add_query_arg(
				array(
					'page'          => 'wpcode',
					'location'      => $location,
					'filter_action' => 'filter',
				),
				admin_url( 'admin.php' )
			)
		);
	}

}
includes/auto-insert/class-wpcode-auto-insert-everywhere.php000064400000011272151331545640020366 0ustar00<?php
/**
 * Class to auto-insert snippets site-wide.
 *
 * @package wpcode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class WPCode_Auto_Insert_Single.
 */
class WPCode_Auto_Insert_Everywhere extends WPCode_Auto_Insert_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'everywhere';

	/**
	 * The category of this type.
	 *
	 * @var string
	 */
	public $category = 'global';

	/**
	 * This should is only available for PHP scripts.
	 *
	 * @var string
	 */
	public $code_type = 'php';

	/**
	 * Load the available options and labels.
	 *
	 * @return void
	 */
	public function init() {
		$this->locations = array(
			'everywhere'    => array(),
			'frontend_only' => array(),
			'admin_only'    => array(),
			'frontend_cl'   => array(),
			'on_demand'     => array(),
		);
	}

	/**
	 * Load the label.
	 *
	 * @return void
	 */
	public function load_label() {
		$this->label = __( 'PHP Snippets Only', 'insert-headers-and-footers' );
	}

	/**
	 * Load the available locations.
	 *
	 * @return void
	 */
	public function load_locations() {
		$this->locations = array(
			'everywhere'    => array(
				'label'       => esc_html__( 'Run Everywhere', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Snippet gets executed everywhere on your website.', 'insert-headers-and-footers' ),
			),
			'frontend_only' => array(
				'label'       => esc_html__( 'Frontend Only', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Snippet gets executed only in the frontend of the website.', 'insert-headers-and-footers' ),
			),
			'admin_only'    => array(
				'label'       => esc_html__( 'Admin Only', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'The snippet only gets executed in the wp-admin area.', 'insert-headers-and-footers' ),
			),
			'frontend_cl'   => array(
				'label'       => esc_html__( 'Frontend Conditional Logic', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Ideal for running the snippet later with conditional logic rules in the frontend.', 'insert-headers-and-footers' ),
			),
			'on_demand'     => array(
				'label'       => esc_html__( 'On Demand', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Execute this snippet on demand or programmatically just when you need it.', 'insert-headers-and-footers' ),
			),
		);
	}

	/**
	 * Execute snippets.
	 *
	 * @return void
	 */
	public function run_snippets() {
		$snippets       = $this->get_snippets_for_location( 'everywhere' );
		$line_reference = array();
		$code           = array();
		$last_line      = 0;
		$last_snippet   = null;

		if ( is_admin() ) {
			$snippets = array_merge( $snippets, $this->get_snippets_for_location( 'admin_only' ) );
		}

		// Merge all the code into 1, so we can track on which line the error occurs, if any.
		foreach ( $snippets as $snippet ) {
			// Use the WPCode_Snippet_Execute_Type filters here for compatibility with class even thought we're skipping it for these particular locations.
			$snippet_code = apply_filters( 'wpcode_snippet_output_php', $snippet->get_code(), $snippet );
			$snippet_code = apply_filters( 'wpcode_snippet_output', $snippet_code, $snippet );
			// Let's see how many lines the code has.
			$lines = substr_count( $snippet_code, PHP_EOL );
			// Let's keep a record of the start and end line of each snippet.
			$last_line ++;
			$line_reference[ $snippet->get_id() ] = array(
				'start' => $last_line,
				'end'   => $last_line + $lines,
			);
			$last_line                            = $last_line + $lines;
			$code[]                               = $snippet_code;
			$last_snippet                         = $snippet;
		}
		if ( ! empty( $code ) ) {
			// Implode all the code and execute it.
			$code = implode( PHP_EOL, $code );
			// Execute the code.
			wpcode()->execute->safe_execute_php( $code, $last_snippet, $line_reference );
		}

		if ( ! is_admin() ) {
			$snippets = $this->get_snippets_for_location( 'frontend_only' );
			foreach ( $snippets as $snippet ) {
				wpcode()->execute->get_snippet_output( $snippet );
			}
		}
	}

	/**
	 * Execute snippets on the init hook to allow using more Conditional Logic options.
	 *
	 * @return void
	 */
	public function run_init_snippets() {
		$snippets = $this->get_snippets_for_location( 'frontend_cl' );
		foreach ( $snippets as $snippet ) {
			wpcode()->execute->get_snippet_output( $snippet );
		}
	}

	/**
	 * Override the default hook and short-circuit any other conditions
	 * checks as these snippets will run everywhere.
	 *
	 * @return void
	 */
	protected function add_start_hook() {
		add_action( 'plugins_loaded', array( $this, 'run_snippets' ), 5 );
		add_action( 'wp', array( $this, 'run_init_snippets' ) );
	}
}

new WPCode_Auto_Insert_Everywhere();
includes/auto-insert/class-wpcode-auto-insert-type.php000064400000022244151331545640017163 0ustar00<?php
/**
 * Base class for of auto-insert options.
 *
 * @package wpcode
 */

/**
 * Abstract class WPCode_Auto_Insert_Type.
 */
abstract class WPCode_Auto_Insert_Type {
	/**
	 * The auto-insert label.
	 *
	 * @var string
	 */
	public $label;

	/**
	 * A unique name for this type.
	 *
	 * @var string
	 */
	public $name;

	/**
	 * An array of locations.
	 * This is an array of unique locations where snippets can be executed in the form
	 * of key => label where the keys should be unique for all the options across
	 * all child classes as those will be used as taxonomy terms to store the
	 * relationship between snippets and their location.
	 *
	 * @var array
	 */
	public $locations;

	/**
	 * Terms of the locations for this type.
	 *
	 * @var array
	 */
	public $locations_terms;

	/**
	 * All the snippets for this location.
	 *
	 * @var array
	 */
	public $snippets;

	/**
	 * For which code type this insert is available.
	 * By default, all.
	 *
	 * @var string
	 */
	public $code_type = 'all';

	/**
	 * If we should skip the cache set this to false.
	 *
	 * @var bool
	 */
	protected $use_cache = true;

	/**
	 * Display a label next to the optgroup title.
	 *
	 * @var string
	 */
	public $label_pill = '';

	/**
	 * Title of the upgrade prompt.
	 *
	 * @var string
	 */
	public $upgrade_title = '';

	/**
	 * Text of the upgrade prompt.
	 *
	 * @var string
	 */
	public $upgrade_text = '';

	/**
	 * URL of the upgrade prompt (CTA) with UTM.
	 *
	 * @var string
	 */
	public $upgrade_link = '';

	/**
	 * Text for the CTA Button.
	 *
	 * @var string
	 */
	public $upgrade_button = '';

	/**
	 * Category used for displaying this type in the admin.
	 *
	 * @var string
	 */
	public $category = '';

	/**
	 * Start the auto insertion.
	 */
	public function __construct() {
		$this->init();
		$this->register_type();
		/**
		 * Constant to enable safe mode.
		 * Filter to allow disabling auto insert.
		 */
		if ( defined( 'WPCODE_SAFE_MODE' ) && WPCODE_SAFE_MODE ) {
			return;
		}
		if ( ! apply_filters( 'wpcode_do_auto_insert', true ) ) {
			return;
		}
		// If we're in headers & footers mode prevent execution of any type of snippet.
		if ( WPCode()->settings->get_option( 'headers_footers_mode' ) ) {
			return;
		}

		add_action( 'admin_init', array( $this, 'load_upgrade_strings' ), 140 );

		$this->add_start_hook();
	}

	/**
	 * Register this instance to the global auto-insert types.
	 *
	 * @return void
	 */
	private function register_type() {
		wpcode()->auto_insert->register_type( $this );
	}

	/**
	 * Init function that is specific to each auto-insert type.
	 *
	 * @return void
	 */
	abstract public function init();

	/**
	 * Give child classes a chance to load on a different hook.
	 *
	 * @return void
	 */
	protected function add_start_hook() {
		add_action( 'wp', array( $this, 'maybe_run_hooks' ) );
	}

	/**
	 * Check if conditions are met before calling the hooks.
	 *
	 * @return void
	 */
	public function maybe_run_hooks() {
		if ( ! $this->conditions() ) {
			return;
		}
		// Go through relevant hooks and output based on settings.
		$this->hooks();
	}

	/**
	 * Conditions that have to be met for the class to do its thing.
	 * For example, in the single post class we'll check if is_single
	 * and only then will we change the_content.
	 *
	 * @return bool
	 */
	public function conditions() {
		// Most types only run on the frontend.
		return ! is_admin();
	}

	/**
	 * Hooks specific to this type of auto-insertion.
	 *
	 * @return void
	 */
	public function hooks() {
	}

	/**
	 * Get an array of options for the admin.
	 * Check if the insert type is compatible with the code type.
	 *
	 * @return array
	 */
	public function get_locations() {
		$this->load_locations();

		return isset( $this->locations ) ? $this->locations : array();
	}

	/**
	 * Load the locations for this type.
	 *
	 * @return void
	 */
	abstract public function load_locations();

	/**
	 * Load the label for this type.
	 *
	 * @return void
	 */
	abstract public function load_label();

	/**
	 * Query snippets by location.
	 *
	 * @param string $location The location slug.
	 *
	 * @return WPCode_Snippet[]
	 */
	public function get_snippets_for_location( $location ) {
		$snippets = $this->get_snippets();

		$snippets_for_location = isset( $snippets[ $location ] ) ? $snippets[ $location ] : array();

		return apply_filters(
			'wpcode_get_snippets_for_location',
			wpcode()->conditional_logic->check_snippets_conditions( $snippets_for_location ),
			$location
		);
	}

	/**
	 * Get the snippets for this type and query on demand.
	 *
	 * @return array
	 */
	public function get_snippets() {
		if ( ! isset( $this->snippets ) ) {
			$this->load_all_snippets_for_type();
		}

		return $this->snippets;
	}

	/**
	 * Load all the snippets for this type and group them by location.
	 * This can be further improved by separating the snippet loading and loading
	 * all the relevant snippets for a screen at once (regardless of type) or just loading all the
	 * active snippets in 1 query.
	 *
	 * @return void
	 */
	public function load_all_snippets_for_type() {

		if ( $this->use_cache() ) {
			$this->snippets = $this->get_snippets_from_cache();

			return;
		}

		$this->snippets = array();
		$args           = array(
			'post_type'      => wpcode_get_post_type(),
			'posts_per_page' => - 1,
			'post_status'    => 'publish',
			'cache_results'  => false,
			// We don't want to cache this query ever as it should only run when snippets are preloaded in case of an error it will provide false values if cached.
		);
		$snippets_query = new WP_Query( $args );
		$snippets       = $snippets_query->posts;

		foreach ( $snippets as $snippet ) {
			$snippet_locations = wp_get_post_terms( $snippet->ID, 'wpcode_location', array( 'fields' => 'slugs' ) );
			if ( empty( $snippet_locations ) || is_wp_error( $snippet_locations ) ) {
				continue;
			}
			$location_key                      = $snippet_locations[0];
			$this->snippets[ $location_key ][] = wpcode_get_snippet( $snippet );
		}
	}

	/**
	 * Get snippets from cache split by relevant locations for this type.
	 *
	 * @return array
	 */
	public function get_snippets_from_cache() {
		$cached_snippets = wpcode()->cache->get_cached_snippets();
		$type_snippets   = array();
		foreach ( $this->locations as $location => $label ) {
			if ( array_key_exists( $location, $cached_snippets ) ) {
				$type_snippets[ $location ] = $cached_snippets[ $location ];
			} else {
				$type_snippets[ $location ] = array();
			}
		}

		return $type_snippets;
	}

	/**
	 * Get the ids of the loaded location terms.
	 *
	 * @return int[]
	 */
	public function get_locations_ids() {
		$terms = $this->get_location_terms();
		$ids   = array();
		foreach ( $terms as $term ) {
			$ids[] = $term->term_id;
		}

		return $ids;
	}

	/**
	 * Get the location terms.
	 *
	 * @return WP_Term[]
	 */
	public function get_location_terms() {
		if ( ! isset( $this->locations_terms ) ) {
			$this->load_locations_terms();
		}

		return $this->locations_terms;
	}

	/**
	 * Query the location terms using get_terms and store them in the instance.
	 *
	 * @return void
	 */
	public function load_locations_terms() {
		$terms = get_terms(
			array(
				'taxonomy' => 'wpcode_location',
				'slug'     => array_keys( $this->locations ),
			)
		);

		$this->locations_terms = array();

		if ( is_wp_error( $terms ) ) {
			// If the terms don't exist, bail early.
			return;
		}

		foreach ( $terms as $term ) {
			$this->locations_terms[ $term->slug ] = $term;
		}
	}

	/**
	 * Change the clauses for our specific query to include the term id in the resulting
	 * WP_Post object so that we can group the results by the type locations.
	 *
	 * @param array $clauses Array of clauses for the SQL query.
	 *
	 * @return mixed
	 */
	public function include_term_in_post( $clauses ) {
		global $wpdb;

		$clauses['fields']  .= ", {$wpdb->term_relationships}.term_taxonomy_id";
		$clauses['groupby'] = '';

		return $clauses;
	}

	/**
	 * Return the type label.
	 *
	 * @return string
	 */
	public function get_label() {
		if ( ! isset( $this->label ) ) {
			$this->load_label();
		}

		return $this->label;
	}

	/**
	 * Grab the use cache value allowing filtering.
	 *
	 * @return bool
	 */
	public function use_cache() {
		return boolval( apply_filters( 'wpcode_use_auto_insert_cache', $this->use_cache ) );
	}

	/**
	 * Get the snippets for a location and echo them executed.
	 *
	 * @param string $location_name The location to grab snippets for.
	 *
	 * @return void
	 */
	public function output_location( $location_name ) {
		$snippets = $this->get_snippets_for_location( $location_name );
		foreach ( $snippets as $snippet ) {
			echo wpcode()->execute->get_snippet_output( $snippet ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
		}
	}

	/**
	 * Get the snippets for a location and return them executed.
	 *
	 * @param string $location_name The location to grab snippets for.
	 *
	 * @return string
	 */
	public function get_location( $location_name ) {
		$content  = '';
		$snippets = $this->get_snippets_for_location( $location_name );
		foreach ( $snippets as $snippet ) {
			$content .= wpcode()->execute->get_snippet_output( $snippet );
		}

		return $content;
	}

	/**
	 * Load the strings for the upgrade prompt, if any.
	 *
	 * @return void
	 */
	public function load_upgrade_strings() {

	}
}
includes/auto-insert/class-wpcode-auto-insert-single.php000064400000020542151331545640017462 0ustar00<?php
/**
 * Class to auto-insert snippets on single posts.
 *
 * @package wpcode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class WPCode_Auto_Insert_Single.
 */
class WPCode_Auto_Insert_Single extends WPCode_Auto_Insert_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'single';

	/**
	 * The category of this type.
	 *
	 * @var string
	 */
	public $category = 'page';

	/**
	 * Used to make sure we only output the before post code once.
	 *
	 * @var bool
	 */
	private $did_before_post_output = false;

	/**
	 * Load the available options and labels.
	 *
	 * @return void
	 */
	public function init() {
		$this->locations = array(
			'before_post'      => array(),
			'after_post'       => array(),
			'before_content'   => array(),
			'after_content'    => array(),
			'before_paragraph' => array(),
			'after_paragraph'  => array(),
		);
	}

	/**
	 * Load the label.
	 *
	 * @return void
	 */
	public function load_label() {
		$this->label = __( 'Page, Post, Custom Post Type', 'insert-headers-and-footers' );
	}

	/**
	 * Load the available locations.
	 *
	 * @return void
	 */
	public function load_locations() {
		$this->locations = array(
			'before_post'      => array(
				'label'       => esc_html__( 'Insert Before Post', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet at the beginning of a post.', 'insert-headers-and-footers' ),
			),
			'after_post'       => array(
				'label'       => esc_html__( 'Insert After Post', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet at the end of a post.', 'insert-headers-and-footers' ),
			),
			'before_content'   => array(
				'label'       => esc_html__( 'Insert Before Content', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet at the beginning of the post content.', 'insert-headers-and-footers' ),
			),
			'after_content'    => array(
				'label'       => esc_html__( 'Insert After Content', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet at the end of the post content.', 'insert-headers-and-footers' ),
			),
			'before_paragraph' => array(
				'label'       => esc_html__( 'Insert Before Paragraph', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet before paragraph # of the post content.', 'insert-headers-and-footers' ),
			),
			'after_paragraph'  => array(
				'label'       => esc_html__( 'Insert After Paragraph', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet after paragraph # of the post content.', 'insert-headers-and-footers' ),
			),
		);
	}

	/**
	 * Checks if we are on a singular page and we should be executing hooks.
	 *
	 * @return bool
	 */
	public function conditions() {
		return is_singular();
	}

	/**
	 * Add hooks specific to single posts.
	 *
	 * @return void
	 */
	public function hooks() {
		add_action( 'the_post', array( $this, 'insert_before_post' ) );
		add_filter( 'render_block_core/template-part', array( $this, 'insert_before_post_fse' ), 15, 2 );
		add_action( 'the_content', array( $this, 'insert_after_post' ) );
		add_filter( 'the_content', array( $this, 'insert_before_content' ) );
		add_filter( 'the_content', array( $this, 'insert_after_content' ) );
		add_filter( 'the_content', array( $this, 'insert_after_before_paragraph' ) );
	}

	/**
	 * Insert snippet before the post.
	 *
	 * @param WP_Post $post_object The post object being loaded.
	 *
	 * @return void
	 */
	public function insert_before_post( $post_object ) {
		if ( ! did_action( 'get_header' ) || get_the_ID() !== $post_object->ID || $this->did_before_post_output ) {
			return;
		}
		$this->output_location( 'before_post' );
		$this->did_before_post_output = true;
	}

	/**
	 * In FSE themes there's no "get_header" action to check for, so we hook after the core template-part header block.
	 *
	 * @param string $block_content The normal block HTML that would be sent to the screen.
	 * @param array  $block An array of data about the block, and the way the user configured it.
	 *
	 * @return string
	 */
	public function insert_before_post_fse( $block_content, $block ) {
		// If the get_header action ran we use the classic output method above.
		if ( did_action( 'get_header' ) ) {
			return $block_content;
		}
		if ( ! isset( $block['attrs']['slug'] ) || 'header' !== $block['attrs']['slug'] ) {
			return $block_content;
		}
		$before_post = '';
		$snippets    = $this->get_snippets_for_location( 'before_post' );
		foreach ( $snippets as $snippet ) {
			$before_post .= wpcode()->execute->get_snippet_output( $snippet );
		}

		return $block_content . $before_post;
	}

	/**
	 * Insert snippet output after the content.
	 *
	 * @param string $content The content of the post.
	 *
	 * @return string
	 */
	public function insert_after_content( $content ) {
		$snippets = $this->get_snippets_for_location( 'after_content' );
		foreach ( $snippets as $snippet ) {
			$content .= wpcode()->execute->get_snippet_output( $snippet );
		}

		return $content;
	}

	/**
	 * Insert snippet after the post
	 *
	 * @param string $content The post content.
	 *
	 * @return string
	 */
	public function insert_after_post( $content ) {
		$snippets = $this->get_snippets_for_location( 'after_post' );
		foreach ( $snippets as $snippet ) {
			$content .= wpcode()->execute->get_snippet_output( $snippet );
		}

		return $content;
	}

	/**
	 * Insert snippets before the content.
	 *
	 * @param string $content The post content.
	 *
	 * @return string
	 */
	public function insert_before_content( $content ) {
		$snippets        = $this->get_snippets_for_location( 'before_content' );
		$snippets_output = '';
		foreach ( $snippets as $snippet ) {
			$snippets_output .= wpcode()->execute->get_snippet_output( $snippet );
		}

		return $snippets_output . $content;
	}

	/**
	 * Insert content before or after paragraphs based on settings.
	 *
	 * @param string $content The post content.
	 *
	 * @return string
	 */
	public function insert_after_before_paragraph( $content ) {

		$snippets = $this->get_snippets_for_location( 'before_paragraph' );
		foreach ( $snippets as $snippet ) {
			$auto_insert_number = $snippet->get_auto_insert_number();
			$auto_insert_number = empty( $auto_insert_number ) ? 1 : absint( $auto_insert_number );
			$snippet_output     = wpcode()->execute->get_snippet_output( $snippet );
			$content            = $this->insert_between_paragraphs( $snippet_output, $auto_insert_number, $content, 'before' );
		}

		$snippets = $this->get_snippets_for_location( 'after_paragraph' );
		foreach ( $snippets as $snippet ) {
			$auto_insert_number = $snippet->get_auto_insert_number();
			$auto_insert_number = empty( $auto_insert_number ) ? 1 : absint( $auto_insert_number );
			$snippet_output     = wpcode()->execute->get_snippet_output( $snippet );
			$content            = $this->insert_between_paragraphs( $snippet_output, $auto_insert_number, $content, 'after' );
		}

		return $content;
	}


	/**
	 * Insert snippet code before or after paragraphs in a post.
	 *
	 * @param string $content_to_insert The content to insert (snippet code output).
	 * @param int    $p_number The paragraph number.
	 * @param string $content_to_add_to The content in which the content should be added.
	 * @param string $before_or_after Add it before or after the paragraph.
	 *
	 * @return string
	 */
	public function insert_between_paragraphs( $content_to_insert, $p_number, $content_to_add_to, $before_or_after = 'after' ) {
		if ( 'before' === $before_or_after ) {
			preg_match_all( '/<p(.*?)>/', $content_to_add_to, $matches );
		} else {
			preg_match_all( '/<\/p>/', $content_to_add_to, $matches );
		}
		$paragraphs = $matches[0];

		// We don't have enough paragraphs to add the snippet.
		if ( count( $paragraphs ) < $p_number ) {
			return $content_to_add_to;
		}

		$p_number = -- $p_number;
		$offset   = 0;
		foreach ( $paragraphs as $p_index => $p ) {
			$position = strpos( $content_to_add_to, $p, $offset );
			if ( $p_index === $p_number ) {
				if ( 'before' === $before_or_after ) {
					$content_to_add_to = substr( $content_to_add_to, 0, $position ) . $content_to_insert . substr( $content_to_add_to, $position );
				} else {
					$content_to_add_to = substr( $content_to_add_to, 0, $position + 4 ) . $content_to_insert . substr( $content_to_add_to, $position + 4 );
				}
				break;
			} else {
				$offset = $position + 1;
			}
		}

		return $content_to_add_to;
	}
}

new WPCode_Auto_Insert_Single();
includes/auto-insert/class-wpcode-auto-insert-site-wide.php000064400000004715151331545640020077 0ustar00<?php
/**
 * Class to auto-insert snippets site-wide.
 *
 * @package wpcode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class WPCode_Auto_Insert_Single.
 */
class WPCode_Auto_Insert_Site_Wide extends WPCode_Auto_Insert_Type {

	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'site_wide';
	/**
	 * The category of this type.
	 *
	 * @var string
	 */
	public $category = 'global';

	/**
	 * Load the available options and labels.
	 *
	 * @return void
	 */
	public function init() {
		$this->locations = array(
			'site_wide_header' => array(),
			'site_wide_body'   => array(),
			'site_wide_footer' => array(),
		);
	}

	/**
	 * Load the label.
	 *
	 * @return void
	 */
	public function load_label() {
		$this->label = __( 'Site Wide (Frontend)', 'insert-headers-and-footers' );
	}

	/**
	 * Load the available locations.
	 *
	 * @return void
	 */
	public function load_locations() {
		$this->locations = array(
			'site_wide_header' => array(
				'label'       => esc_html__( 'Site Wide Header', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet between the head tags of your website on all pages.', 'insert-headers-and-footers' ),
			),
			'site_wide_body'   => array(
				'label'       => esc_html__( 'Site Wide Body', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert the snippet just after the opening body tag.', 'insert-headers-and-footers' ),
			),
			'site_wide_footer' => array(
				'label'       => esc_html__( 'Site Wide Footer', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert the snippet in the footer just before the closing body tag.', 'insert-headers-and-footers' ),
			),
		);
	}

	/**
	 * Add hooks specific to this type.
	 *
	 * @return void
	 */
	public function hooks() {
		add_action( 'wp_head', array( $this, 'insert_header' ) );
		add_action( 'wp_footer', array( $this, 'insert_footer' ) );
		add_action( 'wp_body_open', array( $this, 'insert_body' ) );
	}

	/**
	 * Insert snippets in the header.
	 *
	 * @return void
	 */
	public function insert_header() {
		$this->output_location( 'site_wide_header' );
	}

	/**
	 * Insert snippets in the footer.
	 *
	 * @return void
	 */
	public function insert_footer() {
		$this->output_location( 'site_wide_footer' );
	}

	/**
	 * Insert snippets after the opening body tag.
	 *
	 * @return void
	 */
	public function insert_body() {
		$this->output_location( 'site_wide_body' );
	}
}

new WPCode_Auto_Insert_Site_Wide();
includes/auto-insert/class-wpcode-auto-insert-archive.php000064400000012004151331545640017614 0ustar00<?php
/**
 * Class to auto-insert snippets on archive pages, taxonomies, etc.
 *
 * @package wpcode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class WPCode_Auto_Insert_Archive.
 */
class WPCode_Auto_Insert_Archive extends WPCode_Auto_Insert_Type {
	/**
	 * The type unique name (slug).
	 *
	 * @var string
	 */
	public $name = 'archive';
	/**
	 * The category of this type.
	 *
	 * @var string
	 */
	public $category = 'page';

	/**
	 * Load the available options and labels.
	 *
	 * @return void
	 */
	public function init() {
		$this->locations = array(
			'before_excerpt'      => array(),
			'after_excerpt'       => array(),
			'between_posts'       => array(),
			'archive_before_post' => array(),
			'archive_after_post'  => array(),
		);
	}

	/**
	 * Load the label.
	 *
	 * @return void
	 */
	public function load_label() {
		$this->label = __( 'Categories, Archives, Tags, Taxonomies', 'insert-headers-and-footers' );
	}

	/**
	 * Load the available locations.
	 *
	 * @return void
	 */
	public function load_locations() {
		$this->locations = array(
			'before_excerpt'      => array(
				'label'       => __( 'Insert Before Excerpt', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet above post summary.', 'insert-headers-and-footers' ),
			),
			'after_excerpt'       => array(
				'label'       => __( 'Insert After Excerpt', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet below post summary.', 'insert-headers-and-footers' ),
			),
			'between_posts'       => array(
				'label'       => __( 'Between Posts', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet between multiple posts.', 'insert-headers-and-footers' ),
			),
			'archive_before_post' => array(
				'label'       => __( 'Before Post', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet at the beginning of a post.', 'insert-headers-and-footers' ),
			),
			'archive_after_post'  => array(
				'label'       => __( 'After Post', 'insert-headers-and-footers' ),
				'description' => __( 'Insert snippet at the end of a post.', 'insert-headers-and-footers' ),
			),
		);
	}

	/**
	 * Checks if we are on an archive page and we should be executing hooks.
	 *
	 * @return bool
	 */
	public function conditions() {
		return is_archive() || is_home();
	}

	/**
	 * Add hooks specific to single posts.
	 *
	 * @return void
	 */
	public function hooks() {
		add_filter( 'the_excerpt', array( $this, 'insert_before_excerpt' ) );
		add_filter( 'the_excerpt', array( $this, 'insert_after_excerpt' ) );
		add_action( 'the_post', array( $this, 'insert_between_posts' ), 10, 2 );
		add_action( 'the_post', array( $this, 'insert_before_after_post' ), 10, 2 );
	}

	/**
	 * Output snippet before excerpt on archive pages.
	 *
	 * @param string $excerpt The excerpt text.
	 *
	 * @return string
	 */
	public function insert_before_excerpt( $excerpt ) {
		$snippets = $this->get_snippets_for_location( 'before_excerpt' );

		foreach ( $snippets as $snippet ) {
			$excerpt = wpcode()->execute->get_snippet_output( $snippet ) . $excerpt;
		}

		return $excerpt;
	}

	/**
	 * Output snippet after excerpt on archive pages.
	 *
	 * @param string $excerpt The excerpt text.
	 *
	 * @return string
	 */
	public function insert_after_excerpt( $excerpt ) {
		$snippets = $this->get_snippets_for_location( 'after_excerpt' );

		foreach ( $snippets as $snippet ) {
			$excerpt .= wpcode()->execute->get_snippet_output( $snippet );
		}

		return $excerpt;
	}

	/**
	 * Output snippets between posts in a list of posts.
	 *
	 * @param WP_Post  $post_data The post.
	 * @param WP_Query $query The query.
	 *
	 * @return void
	 */
	public function insert_between_posts( $post_data, $query ) {
		// If the query has at least two posts to display snippets between.
		if ( $query->post_count < 2 ) {
			return;
		}
		// If the current post is not the first one in the list.
		if ( $query->current_post < 1 ) {
			return;
		}
		// If the current post is not the last one in the list.
		if ( $query->post_count <= $query->current_post ) {
			return;
		}
		$this->output_location( 'between_posts' );
	}

	/**
	 * Output snippets before or after posts.
	 *
	 * @param WP_Post  $post_data The post.
	 * @param WP_Query $query The query.
	 *
	 * @return void
	 */
	public function insert_before_after_post( $post_data, $query ) {
		$snippets = $this->get_snippets_for_location( 'archive_before_post' );

		foreach ( $snippets as $snippet ) {
			$insert_number = $snippet->get_auto_insert_number();
			if ( $query->current_post === $insert_number - 1 ) {
				echo wpcode()->execute->get_snippet_output( $snippet ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
			}
		}

		$snippets = $this->get_snippets_for_location( 'archive_after_post' );

		foreach ( $snippets as $snippet ) {
			$insert_number = $snippet->get_auto_insert_number();
			if ( $query->current_post === $insert_number ) {
				echo wpcode()->execute->get_snippet_output( $snippet ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
			}
		}
	}
}

new WPCode_Auto_Insert_Archive();
includes/auto-insert/class-wpcode-auto-insert-admin.php000064400000004301151331545640017264 0ustar00<?php
/**
 * Class to auto-insert snippets in the Admin area.
 *
 * @package wpcode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class WPCode_Auto_Insert_Admin.
 */
class WPCode_Auto_Insert_Admin extends WPCode_Auto_Insert_Type {

	/**
	 * The category of this type.
	 *
	 * @var string
	 */
	public $category = 'global';

	/**
	 * Load the available options and labels.
	 *
	 * @return void
	 */
	public function init() {
		$this->locations = array(
			'admin_head'   => array(),
			'admin_footer' => array(),
		);
	}

	/**
	 * Load the label.
	 *
	 * @return void
	 */
	public function load_label() {
		$this->label = __( 'Admin Area', 'insert-headers-and-footers' );
	}

	/**
	 * Load the available locations.
	 *
	 * @return void
	 */
	public function load_locations() {
		$this->locations = array(
			'admin_head'   => array(
				'label'       => esc_html__( 'Admin header', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet in the wp-admin header area.', 'insert-headers-and-footers' ),
			),
			'admin_footer' => array(
				'label'       => esc_html__( 'Admin footer', 'insert-headers-and-footers' ),
				'description' => esc_html__( 'Insert snippet in the wp-admin footer.', 'insert-headers-and-footers' ),
			),
		);
	}

	/**
	 * Checks if we are on an archive page and we should be executing hooks.
	 *
	 * @return bool
	 */
	public function conditions() {
		return is_admin();
	}

	/**
	 * Add hooks specific to single posts.
	 *
	 * @return void
	 */
	public function hooks() {
		add_action( 'admin_head', array( $this, 'insert_admin_head' ), 9 );
		add_action( 'admin_footer', array( $this, 'insert_admin_footer' ), 9 );
	}

	/**
	 * Output snippet in the admin head.
	 *
	 * @return void
	 */
	public function insert_admin_head() {
		$this->output_location( 'admin_head' );
	}

	/**
	 * Output snippet in the admin footer.
	 *
	 * @return void
	 */
	public function insert_admin_footer() {
		$this->output_location( 'admin_footer' );
	}

	/**
	 * Override the parent method to add the start hook specific to the admin.
	 *
	 * @return void
	 */
	protected function add_start_hook() {
		add_action( 'admin_init', array( $this, 'maybe_run_hooks' ) );
	}
}

new WPCode_Auto_Insert_Admin();
includes/class-wpcode-conditional-logic.php000064400000012356151331545640015061 0ustar00<?php
/**
 * Handle logic for the conditional loading of snippets.
 * You'll find here the available logic options and how they apply to snippets.
 *
 * @package WPCode
 */

/**
 * The main conditional logic class that loads all the types.
 */
class WPCode_Conditional_Logic {

	/**
	 * Types of conditional logic.
	 *
	 * @var WPCode_Conditional_Type[]
	 */
	private $types = array();

	/**
	 * Constructor.
	 */
	public function __construct() {
		add_action( 'plugins_loaded', array( $this, 'load_types' ), 0 );
	}

	/**
	 * Load the different conditional logic types.
	 *
	 * @return void
	 */
	public function load_types() {
		require_once WPCODE_PLUGIN_PATH . 'includes/conditional-logic/class-wpcode-conditional-type.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/conditional-logic/class-wpcode-conditional-user.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/conditional-logic/class-wpcode-conditional-page.php';
	}

	/**
	 * Register an auto-insert type.
	 *
	 * @param WPCode_Conditional_Type $type The type to add to the available types.
	 *
	 * @return void
	 */
	public function register_type( $type ) {
		$this->types[ $type->name ] = $type;
	}

	/**
	 * Get all the admin options for the conditional logic form.
	 *
	 * @param bool $for_js Whether to return the options for JS or not.
	 *
	 * @return array
	 */
	public function get_all_admin_options( $for_js = false ) {
		$options = array();
		foreach ( $this->types as $type ) {
			$type->load_type_options(); // Reload the options in case a global snippet made them get loaded before some post types were registered, for example.
			$options[ $type->get_name() ] = array(
				'label'    => $type->get_label(),
				'name'     => $type->get_name(),
				'category' => $type->get_category(),
				'options'  => $type->get_type_options(),
			);
		}

		// Sort options so the unavailable ones are at the end.
		$available_options   = array();
		$unavailable_options = array();
		foreach ( $options as $key => $option ) {
			if ( empty( $option['options'] ) ) {
				continue;
			}
			$first_option = reset( $option['options'] );
			if ( ! empty( $first_option['upgrade'] ) ) {
				$unavailable_options[ $key ] = $option;
			} else {
				$available_options[ $key ] = $option;
			}
		}

		// For the user logged_in option let's run esc_attr on the option values to save the values correctly.
		if ( $for_js && isset( $available_options['user']['options']['logged_in']['options'] ) ) {
			foreach ( $available_options['user']['options']['logged_in']['options'] as $key => $option ) {
				$available_options['user']['options']['logged_in']['options'][ $key ]['value'] = esc_attr( $option['value'] );
			}
		}

		return apply_filters( 'wpcode_conditional_logic_admin_options', array_merge( $available_options, $unavailable_options ) );
	}

	/**
	 * Goes through a list of snippets and filters out the ones
	 * that don't match the conditional logic rules.
	 *
	 * @param WPCode_Snippet[] $snippets An array of snippets.
	 *
	 * @return WPCode_Snippet[]
	 */
	public function check_snippets_conditions( $snippets ) {
		// If there's nothing to evaluate just return an empty array.
		if ( empty( $snippets ) ) {
			return array();
		}

		$filtered_snippets = array();
		foreach ( $snippets as $snippet ) {
			if ( ! $snippet->conditional_rules_enabled() ) {
				// If rules are disabled, ignore.
				$filtered_snippets[] = $snippet;
				continue;
			}
			$rules = $snippet->get_conditional_rules();
			if ( ! isset( $rules['show'] ) ) {
				continue;
			}
			$show          = 'show' === $rules['show'];
			$rules_are_met = $this->are_snippet_rules_met( $snippet );
			if ( $show && ! $rules_are_met ) {
				// If we should show based on conditions, and conditions
				// are not met, skip.
				continue;
			}
			if ( ! $show && $rules_are_met ) {
				// If we should hide based on conditions, and conditions
				// are met, skip.
				continue;
			}

			$filtered_snippets[] = $snippet;
		}

		return $filtered_snippets;
	}

	/**
	 * Takes a snippet and evaluates if conditional logic rules
	 * are met.
	 *
	 * @param WPCode_Snippet $snippet The snippet instance.
	 *
	 * @return bool
	 */
	public function are_snippet_rules_met( $snippet ) {
		$rules = $snippet->get_conditional_rules();
		if ( empty( $rules ) || ! is_array( $rules ) || empty( $rules['groups'] ) ) {
			return true;
		}

		// Go through all rule groups.
		foreach ( $rules['groups'] as $rule_group ) {
			// If any of the groups are met return true.
			if ( $this->are_group_rules_met( $rule_group, $snippet ) ) {
				return true;
			}
		}

		// If no group rules satisfy the conditions, return false.
		return false;
	}

	/**
	 * Evaluate all the rows of rules in a group.
	 *
	 * @param array          $rule_group An array of rows.
	 * @param WPCode_Snippet $snippet The snippet we are evaluating the rules for.
	 *
	 * @return bool
	 */
	public function are_group_rules_met( $rule_group, $snippet ) {
		foreach ( $rule_group as $rule_row ) {
			if ( ! isset( $rule_row['type'] ) || ! isset( $this->types[ $rule_row['type'] ] ) ) {
				continue;
			}
			$rule_type = $this->types[ $rule_row['type'] ];
			if ( ! $rule_type->evaluate_rule_row( $rule_row, $snippet ) ) {
				// If this row doesn't match, the whole group fails.
				return false;
			}
		}

		// If none of the rows failed the group matches.
		return true;
	}
}
includes/ihaf.php000064400000000314151331545640007777 0ustar00<?php


/**
 * Get the main instance of WPCode.
 *
 * @return WPCode
 */
function WPCode() {// phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
	return WPCode::instance();
}
includes/class-wpcode-file-cache.php000064400000014610151331545640013436 0ustar00<?php
/**
 * File cache class. Store files in the uploads folder.
 * Use the expiration in the get function to control how often a file should be refreshed.
 *
 * @package WPCode
 */

/**
 * WPCode_File_Cache class.
 */
class WPCode_File_Cache {

	/**
	 * Name of the base folder in the Uploads folder.
	 *
	 * @var string
	 */
	private $basedir = 'wpcode';

	/**
	 * Name of the module-specific folder in the base folder.
	 *
	 * @var string
	 */
	private $dirname = 'cache';

	/**
	 * Full upload path, created form the WP uploads folder.
	 *
	 * @var string
	 */
	private $upload_path;

	/**
	 * Write a file to the server with an expiration date.
	 *
	 * @param string $name The key by which to retrieve the data.
	 * @param mixed  $data The data to save - if it's a JSON it should be decoded first as it gets encoded here.
	 *
	 * @return void
	 */
	public function set( $name, $data ) {
		$this->write_file( $this->get_cache_filename_by_key( $name ), wp_json_encode( $data ) );
	}

	/**
	 * Get some data by its name. Checks if the data is expired and if so
	 * returns false so you can update it.
	 *
	 * @param string $name The key of the data to save.
	 * @param int    $ttl For how long since creation should this file be used.
	 *
	 * @return array|false
	 */
	public function get( $name, $ttl = 0 ) {
		$file = $this->get_directory_path( $this->get_cache_filename_by_key( $name ) );

		/**
		 * Filter the $ttl for a file if you want to change it.
		 *
		 * @param int    $ttl The time to live for the cache.
		 * @param string $name The name of the file.
		 *
		 * @return int
		 * @since 2.2.2
		 */
		$ttl = apply_filters( 'wpcode_file_cache_ttl', $ttl, $name );

		// If the file doesn't exist there's not much to do.
		if ( ! file_exists( $file ) ) {
			// Let's see if we have it in the database.
			$option = get_option( 'wpcode_alt_cache_' . $name, false );
			if ( false !== $option ) {
				// Let's check if the time since the option was saved is less than the TTL.
				if ( empty( $option['time'] ) || $ttl > 0 && (int) $option['time'] + $ttl < time() ) {
					// If the option expired let's delete it, so we clean up in case the file will now work.
					delete_option( 'wpcode_alt_cache_' . $name );

					return false;
				}

				return json_decode( $option['data'], true );
			}

			return false;
		}

		// If TTL is 0, always return the file.
		if ( $ttl > 0 && (int) filemtime( $file ) + $ttl < time() ) {
			return false;
		}

		return json_decode( file_get_contents( $file ), true ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
	}

	/**
	 * Delete a cached file by its key.
	 *
	 * @param string $key The key to find the file by.
	 *
	 * @return void
	 */
	public function delete( $key ) {
		$file = $this->get_directory_path( $this->get_cache_filename_by_key( $key ) );

		wp_delete_file( $file );

		delete_option( 'wpcode_alt_cache_' . $key );
	}

	/**
	 * Basically just adds JSON to the end of the key but we should use this
	 * to also make sure it's a proper filename.
	 *
	 * @param string $name The key.
	 *
	 * @return string
	 */
	private function get_cache_filename_by_key( $name ) {
		return $name . '.json';
	}

	/**
	 * Write a file to the cache folder. Data should already be processed when using this.
	 *
	 * @param string $name The name of the file.
	 * @param string $data The data to write to the file.
	 *
	 * @return void
	 */
	private function write_file( $name, $data ) {
		$written = file_put_contents( $this->get_directory_path( $name ), $data ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_file_put_contents
		if ( false === $written ) {
			// If we can't save the file to the file cache let's try to save it to the database.
			// This is not ideal but it prevents having endless requests.
			// phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_read_file_put_contents
			$option = array(
				'time' => time(),
				'data' => $data,
			);
			// $name is the file name, in order to save it in the db we should remove the file extension.
			$name = str_replace( '.json', '', $name );
			update_option( 'wpcode_alt_cache_' . $name, $option, false );
		}
	}

	/**
	 * Get a reliable path to write files to, it also creates the folders needed if they don't exist.
	 *
	 * @param string $filename The file path.
	 *
	 * @return string
	 */
	private function get_directory_path( $filename ) {
		if ( ! isset( $this->upload_path ) ) {
			$uploads           = wp_upload_dir();
			$base_path         = trailingslashit( $uploads['basedir'] ) . $this->basedir;
			$this->upload_path = $base_path . '/' . $this->dirname;

			if ( ! file_exists( $this->upload_path ) || ! wp_is_writable( $this->upload_path ) ) {
				wp_mkdir_p( $this->upload_path );
				$this->create_index_html_file( $this->upload_path );
			}
			// Ensure the base path has an index file.
			$this->create_index_html_file( $base_path );
		}

		$filepath  = trailingslashit( $this->upload_path ) . $filename;
		$directory = dirname( $filepath );
		if ( $directory !== $this->upload_path && ! file_exists( $directory ) ) {
			wp_mkdir_p( $directory );
			$this->create_index_html_file( $directory );
		}

		$this->create_index_html_file( $this->upload_path );

		return $filepath;
	}

	/**
	 * Create index.html file in the specified directory if it doesn't exist.
	 *
	 * @param string $path The path to the directory.
	 *
	 * @return false|int
	 */
	public static function create_index_html_file( $path ) {
		if ( ! is_dir( $path ) || is_link( $path ) ) {
			return false;
		}

		$index_file = wp_normalize_path( trailingslashit( $path ) . 'index.html' );

		// Do nothing if index.html exists in the directory.
		if ( file_exists( $index_file ) ) {
			return false;
		}

		// Create empty index.html.
		return file_put_contents( $index_file, '' ); // phpcs:ignore WordPress.WP.AlternativeFunctions
	}

	/**
	 * Create .htaccess file in the specified directory if it doesn't exist.
	 *
	 * @param string $path The path to the directory.
	 *
	 * @return false|int
	 */
	public static function create_htaccess_file( $path ) {
		if ( ! is_dir( $path ) || is_link( $path ) ) {
			return false;
		}

		$htaccess_file = wp_normalize_path( trailingslashit( $path ) . '.htaccess' );

		// Do nothing if index.html exists in the directory.
		if ( file_exists( $htaccess_file ) ) {
			return false;
		}

		// Create empty index.html.
		return file_put_contents( $htaccess_file, 'deny from all' ); // phpcs:ignore WordPress.WP.AlternativeFunctions
	}
}
includes/admin/pages/class-wpcode-admin-page-code-snippets.php000064400000043213151331545640020423 0ustar00<?php
/**
 * Code snippets admin main list page.
 *
 * @package WPCode
 */

/**
 * Class for the code snippets page.
 */
class WPCode_Admin_Page_Code_Snippets extends WPCode_Admin_Page {

	/**
	 * The page slug to be used when adding the submenu.
	 *
	 * @var string
	 */
	public $page_slug = 'wpcode';

	/**
	 * Instance of the code snippets table.
	 *
	 * @see WP_List_Table
	 * @var WPCode_Code_Snippets_Table
	 */
	protected $snippets_table;

	/**
	 * Call this just to set the page title translatable.
	 */
	public function __construct() {
		$this->page_title = __( 'Code Snippets', 'insert-headers-and-footers' );
		parent::__construct();
	}

	/**
	 * Page-specific hooks, init the custom WP_List_Table.
	 *
	 * @return void
	 */
	public function page_hooks() {
		$this->process_message();

		add_action( 'current_screen', array( $this, 'init_table' ) );
		add_action( 'admin_init', array( $this, 'maybe_capture_filter' ) );
		add_action( 'load-toplevel_page_wpcode', array( $this, 'maybe_process_bulk_action' ) );
		add_action( 'wpcode_admin_notices', array( $this, 'maybe_show_deactivated_notice' ) );

		// Register Screen options.
		add_action( 'load-toplevel_page_wpcode', array( $this, 'add_per_page_option' ) );
		// Hide some columns by default.
		add_filter( 'default_hidden_columns', array( $this, 'hide_columns' ), 10, 2 );
		add_filter( 'wpcode_admin_js_data', array( $this, 'prepare_admin_js_localization_data' ) );
		add_filter( 'screen_settings', array( $this, 'add_custom_screen_option' ), 10, 2 );
		// Hide the duplicated parameter from the URL.
		add_filter( 'removable_query_args', array( $this, 'remove_query_arg_from_url' ) );
	}

	/**
	 * If the referer is set, remove and redirect.
	 *
	 * @return void
	 */
	public function maybe_capture_filter() {
		if ( ! empty( $_REQUEST['_wp_http_referer'] ) && isset( $_SERVER['REQUEST_URI'] ) && isset( $_REQUEST['filter_action'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			wp_safe_redirect(
				remove_query_arg(
					array(
						'_wp_http_referer',
						'_wpnonce',
					),
					wp_unslash( $_SERVER['REQUEST_URI'] ) // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
				)
			);
			exit;
		}
		if ( ! empty( $_REQUEST['_wp_http_referer'] ) && isset( $_SERVER['REQUEST_URI'] ) && isset( $_REQUEST['filter_clear'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			wp_safe_redirect(
				add_query_arg(
					'page',
					'wpcode',
					$this->admin_url( 'admin.php' )
				)
			);

			exit;
		}
	}

	/**
	 * Listener for bulk actions.
	 *
	 * @return void
	 */
	public function maybe_process_bulk_action() {
		// phpcs:disable WordPress.Security.NonceVerification.Recommended
		$ids    = isset( $_GET['snippet_id'] ) ? array_map( 'absint', (array) $_GET['snippet_id'] ) : array();
		$action = isset( $_REQUEST['action'] ) ? sanitize_key( $_REQUEST['action'] ) : false;
		// phpcs:enable WordPress.Security.NonceVerification.Recommended
		if ( empty( $ids ) || empty( $action ) ) {
			return;
		}
		if ( empty( $_GET['_wpnonce'] ) ) {
			return;
		}

		if (
			! wp_verify_nonce( sanitize_key( $_GET['_wpnonce'] ), 'bulk-wpcode-snippets' ) &&
			! wp_verify_nonce( sanitize_key( $_GET['_wpnonce'] ), 'wpcode_' . $action . '_nonce' )
		) {
			return;
		}

		$update_status_actions = array( 'trash', 'untrash' );

		if ( in_array( $action, $update_status_actions, true ) ) {
			$newstatus = 'trash' === $action ? 'trash' : 'draft';
			foreach ( $ids as $id ) {
				wp_update_post(
					array(
						'ID'          => $id,
						'post_status' => $newstatus,
					)
				);
			}
			// Clear errors when a snippet is trashed.
			wpcode()->error->clear_snippets_errors();
		}
		if ( 'delete' === $action ) {
			foreach ( $ids as $id ) {
				wp_delete_post( $id );
			}
			// Clear errors when a snippet is deleted.
			wpcode()->error->clear_snippets_errors();
		}
		$failed = 0;
		if ( 'enable' === $action ) {
			foreach ( $ids as $key => $id ) {
				$snippet = wpcode_get_snippet( $id );
				$snippet->activate();
				if ( ! $snippet->active ) {
					// If failed to activate don't count it.
					unset( $ids[ $key ] );
					++ $failed;
				}
			}
		}
		if ( 'disable' === $action ) {
			foreach ( $ids as $id ) {
				$snippet = wpcode_get_snippet( $id );
				$snippet->deactivate();
			}
		}
		$message = array(
			rtrim( $action, 'e' ) . 'ed' => count( $ids ),
		);
		if ( $failed ) {
			$message['error'] = $failed;
		}

		if ( 'duplicate' === $action ) {
			foreach ( $ids as $id ) {
				// Load all the snippet data in the object.
				$snippet = wpcode_get_snippet( $id );
				$snippet->duplicate();
			}
		}

		wpcode()->cache->cache_all_loaded_snippets();

		// Clear used library snippets.
		delete_transient( 'wpcode_used_library_snippets' );

		wp_safe_redirect(
			add_query_arg(
				$message,
				remove_query_arg(
					array(
						'action',
						'action2',
						'_wpnonce',
						'snippet_id',
						'paged',
						'_wp_http_referer',
					)
				)
			)
		);
		exit;
	}

	/**
	 * Init the custom table for the snippets list.
	 *
	 * @return void
	 */
	public function init_table() {
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/class-wpcode-code-snippets-table.php';

		$this->snippets_table = new WPCode_Code_Snippets_Table();
	}

	/**
	 * Output the custom table and page content.
	 *
	 * @return void
	 */
	public function output_content() {
		$this->snippets_table->prepare_items();

		?>
		<form id="wpcode-code-snippets-table" method="get" action="<?php echo esc_url( $this->admin_url( 'admin.php?page=wpcode' ) ); ?>">
			<input type="hidden" name="page" value="wpcode"/>
			<?php
			$this->snippets_table->search_box( esc_html__( 'Search Snippets', 'insert-headers-and-footers' ), 'wpcode_snippet_search' );
			$this->snippets_table->views();
			$this->snippets_table->display();
			?>

		</form>
		<?php
	}

	/**
	 * Custom Footer for this page.
	 *
	 * @return void
	 */
	public function output_footer() {
		parent::output_footer();
		?>
		<div id="wpcode-loader">
			<div class="wpcode-loader-overlay">
				<img src="<?php echo esc_url( WPCODE_PLUGIN_URL ) . 'admin/images/spinner.svg'; // phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage?>" alt="">
			</div>
		</div>
		<?php
	}

	/**
	 * Get the snippet types for the filters in a normalized format.
	 *
	 * @return array
	 */
	public function get_snippet_types_for_filters() {
		$types        = wpcode()->execute->get_types();
		$snippet_type = isset( $_GET['type'] ) ? sanitize_text_field( wp_unslash( $_GET['type'] ) ) : false;  // phpcs:ignore WordPress.Security.NonceVerification.Recommended

		$type_buttons = array(
			array(
				'is_pro' => false,
				'label'  => esc_html__( 'All Snippets', 'insert-headers-and-footers' ),
				'class'  => ! $snippet_type ? 'active' : '',
				'type'   => '',
			)
		);

		foreach ( $types as $type_key => $type ) {
			$type_buttons[] = array(
				'is_pro' => isset( $type['is_pro'] ) ? $type['is_pro'] : false,
				'label'  => $type['filter_label'],
				'class'  => $snippet_type === $type_key ? 'active' : '',
				'type'   => $type_key,
			);
		}

		return $this->prepare_type_buttons( $type_buttons );
	}

	/**
	 * Reorder the buttons and add version-specific info.
	 *
	 * @param array $type_buttons The type buttons.
	 *
	 * @return array
	 */
	protected function prepare_type_buttons( $type_buttons ) {

		// Reorder items so pro items are always last.
		usort(
			$type_buttons,
			function ( $a, $b ) {
				if ( $a['is_pro'] === $b['is_pro'] ) {
					return 0;
				}

				return $a['is_pro'] ? 1 : - 1;
			}
		);

		// Let's go through the items and add the pro class and update the label.
		foreach ( $type_buttons as $key => $type ) {
			if ( ! $type['is_pro'] ) {
				continue;
			}
			$type_buttons[ $key ]['label'] = sprintf( '%s (PRO)', $type['label'] );
			$type_buttons[ $key ]['class'] .= ' wpcode_pro_type_lite';
		}

		return $type_buttons;
	}

	/**
	 * Generate buttons for available snippet types.
	 *
	 * @return string HTML for the buttons.
	 */
	public function get_snippet_type_buttons() {
		$buttons      = $this->get_snippet_types_for_filters();
		$buttons_html = '';

		foreach ( $buttons as $button ) {
			$buttons_html .= sprintf(
				'<li><a class="%1$s" href="#" data-type="%2$s">%3$s</a></li>',
				esc_attr( $button['class'] ),
				esc_attr( $button['type'] ),
				esc_attr( $button['label'] )
			);
		}

		return $buttons_html;
	}

	/**
	 * Content of the bottom row of the header.
	 *
	 * @return void
	 */
	public function output_header_bottom() {
		$add_new_url = $this->admin_url( 'admin.php?page=wpcode-snippet-manager' );
		?>
		<div class="wpcode-column wpcode-title-button">
			<ul id="wpcode-snippet-type-buttons" class="wpcode-admin-tabs">
				<?php echo $this->get_snippet_type_buttons(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> 
			</ul>
			<button class="wpcode-mobile-dropdown-toggle wpcode-button wpcode-button-just-icon" data-target="#wpcode-snippet-type-buttons">
				<?php wpcode_icon( 'menu', '24', '24', '0 -960 960 960' ); ?>
			</button>
			<a class="wpcode-button" href="<?php echo esc_url( $add_new_url ); ?>">
				<?php esc_html_e( 'Add New', 'insert-headers-and-footers' ); ?>
			</a>
		</div>

		<?php
	}

	/**
	 * Capture screen-specific messages and add notices.
	 *
	 * @return void
	 */
	public function process_message() {

		// phpcs:disable WordPress.Security.NonceVerification
		if ( ! empty( $_GET['trashed'] ) ) {
			$count  = absint( $_GET['trashed'] );
			$notice = sprintf( /* Translators: %d - Trashed snippets count. */
				_n( '%d snippet was successfully moved to Trash.', '%d snippets were successfully moved to Trash.', $count, 'insert-headers-and-footers' ),
				$count
			);
		}

		if ( ! empty( $_GET['untrashed'] ) ) {
			$count  = absint( $_GET['untrashed'] );
			$notice = sprintf( /* translators: %d - Restored from trash snippets count. */
				_n( '%d snippet was successfully restored.', '%d snippet were successfully restored.', $count, 'insert-headers-and-footers' ),
				$count
			);
		}

		if ( ! empty( $_GET['deleted'] ) ) {
			$count  = absint( $_GET['deleted'] );
			$notice = sprintf( /* translators: %d - Deleted snippets count. */
				_n( '%d snippet was successfully permanently deleted.', '%d snippets were successfully permanently deleted.', $count, 'insert-headers-and-footers' ),
				$count
			);
		}

		if ( isset( $_GET['enabled'] ) ) {
			$count  = absint( $_GET['enabled'] );
			$notice = '';
			if ( $count > 0 ) {
				$notice = sprintf( /* translators: %d - Activated snippets count. */
					_n( '%d snippet was successfully activated.', '%d snippets were successfully activated.', $count, 'insert-headers-and-footers' ),
					$count
				);
			}
			if ( isset( $_GET['error'] ) ) {
				$error_count = absint( $_GET['error'] );

				$notice .= ' ';
				$notice .= sprintf( /* translators: %d - Failed to activate snippets count. */
					_n( '%d snippet was not activated due to an error.', '%d snippets were not activated due to errors.', $error_count, 'insert-headers-and-footers' ),
					$error_count
				);
			}
		}

		if ( ! empty( $_GET['disabled'] ) ) {
			$count  = absint( $_GET['disabled'] );
			$notice = sprintf( /* translators: %d - Deactivated snippets count. */
				_n( '%d snippet was successfully deactivated.', '%d snippets were successfully deactivated.', $count, 'insert-headers-and-footers' ),
				$count
			);
		}
		// phpcs:enable WordPress.Security.NonceVerification

		if ( isset( $error_count ) && isset( $notice ) ) {
			$this->set_error_message( $notice );
		} elseif ( isset( $notice ) ) {
			$this->set_success_message( $notice );
		}
	}

	/**
	 * On the deactivated snippets view, show a notice explaining that this view shows the snippets that have been
	 * automatically disabled due to throwing an error and highlight the error logging option, if disabled.
	 *
	 * @return void
	 */
	public function maybe_show_deactivated_notice() {
		if ( ! isset( $_GET['view'] ) || 'has_error' !== $_GET['view'] ) { // phpcs:ignore WordPress.Security.NonceVerification
			return;
		}
		// Let's see if error logging is enabled.
		$logging_enabled = wpcode()->settings->get_option( 'error_logging' );
		$button_text     = esc_html__( 'Enable Error Logging', 'insert-headers-and-footers' );
		$button_url      = add_query_arg(
			array(
				'page' => 'wpcode-settings',
				'view' => 'errors',
			),
			$this->admin_url( 'admin.php' )
		);

		?>
		<div class="info fade notice">
			<p>
				<?php esc_html_e( 'This view lists your snippets that threw errors. Some of the snippets may have also been automatically disabled due to potentially preventing you from accessing the admin.', 'insert-headers-and-footers' ); ?>
				<a href="<?php echo esc_url( wpcode_utm_url( 'https://wpcode.com/docs/php-error-handling-safe-mode/', 'snippet-deactivated-notice', 'deactivated-list' ) ); ?>" target="_blank" rel="noopener noreferrer">
					<?php esc_html_e( 'Learn More', 'insert-headers-and-footers' ); ?>
				</a>
			</p>
			<?php
			if ( ! $logging_enabled ) {
				?>
				<p>
					<?php esc_html_e( 'In order to get more info about the errors please consider enabling error logging.', 'insert-headers-and-footers' ); ?>
				</p>
				<p>
					<a href="<?php echo esc_url( $button_url ); ?>" class="button button-primary">
						<?php echo esc_html( $button_text ); ?>
					</a>
				</p>
			<?php } ?>
		</div>
		<?php
	}

	/**
	 * Add the per page option to the snippets list screen.
	 *
	 * @return void
	 */
	public function add_per_page_option() {
		add_screen_option(
			'per_page',
			array(
				'label'   => esc_html__( 'Number of snippets per page:', 'insert-headers-and-footers' ),
				'option'  => 'wpcode_snippets_per_page',
				'default' => 20,
			)
		);
	}

	/**
	 * Hide the last updated column by default.
	 *
	 * @param array     $hidden The hidden columns.
	 * @param WP_Screen $screen The current screen.
	 *
	 * @return mixed
	 */
	public function hide_columns( $hidden, $screen ) {
		$hidden[] = 'updated';
		$hidden[] = 'id';
		$hidden[] = 'shortcode';
		$hidden[] = 'code_type';

		return $hidden;
	}

	/**
	 * Prepare the data for the admin JS localization.
	 *
	 * @param array $data The data to be localized.
	 *
	 * @return array
	 */
	public function prepare_admin_js_localization_data( $data ) {

		$data['blocks_title']               = __( 'Blocks snippets is a Pro Feature', 'insert-headers-and-footers' );
		$data['blocks_description']         = __( 'Upgrade to PRO today and unlock building snippets using the Gutenberg Block Editor. Create templates using blocks and use the full power of WPCode to insert them in your site.', 'insert-headers-and-footers' );
		$data['blocks_snippet_upgrade_url'] = wpcode_utm_url( 'https://wpcode.com/lite/', 'code_type', 'blocks', 'modal' );
		$data['button_text']                = __( 'Upgrade to PRO', 'insert-headers-and-footers' );
		$data['scss_title']                 = __( 'SCSS snippets is a Pro Feature', 'insert-headers-and-footers' );
		$data['scss_description']           = __( 'Upgrade to PRO today and unlock editing snippets using SCSS code with optimized compiling directly in the WordPress admin.', 'insert-headers-and-footers' );
		$data['scss_snippet_upgrade_url']   = wpcode_utm_url( 'https://wpcode.com/lite/', 'code_type', 'scss', 'modal' );

		return $data;
	}

	/**
	 *
	 * @param string    $screen_settings Screen settings.
	 * @param WP_Screen $screen WP_Screen object.
	 *
	 * @return string
	 */
	public function add_custom_screen_option( $screen_settings, $screen ) {

		$order_by = get_user_option( 'wpcode_snippets_order_by' );
		$order    = get_user_option( 'wpcode_snippets_order' );
		if ( empty( $order_by ) ) {
			$order_by = 'ID';
		}
		if ( empty( $order ) ) {
			$order = 'desc';
		}

		// Pick which column to order by, title, date or last updated using a select.
		$screen_settings .= '<h5>' . esc_html__( 'Order Snippets By', 'insert-headers-and-footers' ) . '</h5>';
		$screen_settings .= '<fieldset>';
		$screen_settings .= '<legend class="screen-reader-text">' . esc_html__( 'Order snippets by', 'insert-headers-and-footers' ) . '</legend>';
		// Use dropdown to choose the column to order by.
		$screen_settings .= '<label for="wpcode_screen_order_by">';
		$screen_settings .= '<select name="wpcode_screen_order_by" id="wpcode_screen_order_by">';
		$screen_settings .= '<option value="title" ' . selected( $order_by, 'title', false ) . '>' . esc_html__( 'Name', 'insert-headers-and-footers' ) . '</option>';
		$screen_settings .= '<option value="ID" ' . selected( $order_by, 'ID', false ) . '>' . esc_html__( 'Created', 'insert-headers-and-footers' ) . '</option>';
		$screen_settings .= '<option value="last_updated" ' . selected( $order_by, 'last_updated', false ) . '>' . esc_html__( 'Last Updated', 'insert-headers-and-footers' ) . '</option>';
		$screen_settings .= '<option value="priority" ' . selected( $order_by, 'priority', false ) . '>' . esc_html__( 'Priority', 'insert-headers-and-footers' ) . '</option>';
		$screen_settings .= '</select>';
		$screen_settings .= '</label>';
		// Display a dropdown to choose the order.
		$screen_settings .= '<label for="wpcode_screen_order">';
		$screen_settings .= '<select name="wpcode_screen_order" id="wpcode_screen_order">';
		$screen_settings .= '<option value="asc" ' . selected( $order, 'asc', false ) . '>' . esc_html__( 'Ascending', 'insert-headers-and-footers' ) . '</option>';
		$screen_settings .= '<option value="desc" ' . selected( $order, 'desc', false ) . '>' . esc_html__( 'Descending', 'insert-headers-and-footers' ) . '</option>';
		$screen_settings .= '</select>';
		$screen_settings .= '</label>';
		$screen_settings .= '</fieldset>';

		return $screen_settings;
	}

	/**
	 * Remove the duplicated parameter from the URL.
	 *
	 * @param array $args The arguments that should be removed from the URL.
	 *
	 * @return array
	 */
	public function remove_query_arg_from_url( $args ) {
		$args[] = 'duplicated';

		return $args;
	}
}
includes/admin/pages/class-wpcode-admin-page-headers-footers.php000064400000025430151331545640020741 0ustar00<?php
/**
 * Headers & Footers admin page.
 *
 * @package WPCode
 */

/**
 * Class for the headers & footers admin page.
 */
class WPCode_Admin_Page_Headers_Footers extends WPCode_Admin_Page {

	use WPCode_Revisions_Display_Lite;

	/**
	 * The page slug to be used when adding the submenu.
	 *
	 * @var string
	 */
	public $page_slug = 'wpcode-headers-footers';

	/**
	 * The action used for the nonce.
	 *
	 * @var string
	 */
	protected $action = 'insert-headers-and-footers';

	/**
	 * If the page should be a submenu of Settings instead of wpcode.
	 *
	 * @var bool
	 */
	protected $settings_submenu = false;

	/**
	 * The nonce name field.
	 *
	 * @var string
	 */
	protected $nonce_name = 'insert-headers-and-footers_nonce';

	/**
	 * The capability required to view this page.
	 *
	 * @var string
	 */
	protected $capability = 'wpcode_edit_html_snippets';

	/**
	 * Call this just to set the page title translatable.
	 */
	public function __construct() {
		if ( wpcode()->settings->get_option( 'headers_footers_mode' ) ) {
			$this->settings_submenu = true;
		}
		$this->page_title = __( 'Header & Footer', 'insert-headers-and-footers' );
		parent::__construct();

		add_action( 'wpcode_admin_page_content_wpcode-headers-footers', array( $this, 'revisions_box' ), 260 );
	}

	/**
	 * Add the submenu page.
	 *
	 * @return void
	 */
	public function add_page() {
		if ( $this->settings_submenu ) {
			add_options_page(
				$this->menu_title,
				$this->page_title,
				'wpcode_edit_snippets',
				$this->page_slug,
				array(
					wpcode()->admin_page_loader,
					'admin_menu_page',
				)
			);

			return;
		}
		parent::add_page();
	}

	/**
	 * Register hook on admin init just for this page.
	 *
	 * @return void
	 */
	public function page_hooks() {
		$this->can_edit = current_user_can( 'unfiltered_html', 'wpcode-editor' );
		add_action( 'admin_init', array( $this, 'submit_listener' ) );
		$this->process_message();
	}

	/**
	 * Process messages specific to this page.
	 *
	 * @return void
	 */
	public function process_message() {
		// phpcs:disable WordPress.Security.NonceVerification
		if ( ! isset( $_GET['message'] ) ) {
			return;
		}

		$messages = array(
			1 => __( 'Headers & Footers mode activated. Use the toggle next to the Save Changes button to disable it at any time.', 'insert-headers-and-footers' ),
			2 => __( 'Headers & Footers mode deactivated, if you wish to switch back please use the option on the settings page.', 'insert-headers-and-footers' ),
		);
		$message  = absint( $_GET['message'] );
		// phpcs:enable WordPress.Security.NonceVerification

		if ( ! isset( $messages[ $message ] ) ) {
			return;
		}
		$this->set_success_message( $messages[ $message ] );
	}

	/**
	 * Wrap this page in a form tag.
	 *
	 * @return void
	 */
	public function output() {
		if ( ! $this->can_edit ) {
			$this->set_error_message( __( 'Sorry, you only have read-only access to this page. Ask your administrator for assistance editing.', 'insert-headers-and-footers' ) );
			$headers_footers_mode = wpcode()->settings->get_option( 'headers_footers_mode' );
			// If in headers & footers mode allow them to update to disable the simple mode.
			if ( ! $headers_footers_mode ) {
				// If the user can't edit the values just don't load form at all.
				parent::output();

				return;
			}
		}
		?>
		<form action="<?php echo esc_url( $this->get_page_action_url() ); ?>" method="post">
			<?php parent::output(); ?>
		</form>
		<?php
	}

	/**
	 * The headers & footers page output.
	 *
	 * @return void
	 */
	public function output_content() {

		$header_desc = sprintf(
		/* translators: %s: The `<head>` tag */
			esc_html__( 'These scripts will be printed in the %s section.', 'insert-headers-and-footers' ),
			'<code>&lt;head&gt;</code>'
		);
		$body_desc   = sprintf(
		/* translators: %s: The `<head>` tag */
			esc_html__( 'These scripts will be printed just below the opening %s tag.', 'insert-headers-and-footers' ),
			'<code>&lt;body&gt;</code>'
		);
		$footer_desc = sprintf(
		/* translators: %s: The `</body>` tag */
			esc_html__( 'These scripts will be printed above the closing %s tag.', 'insert-headers-and-footers' ),
			'<code>&lt;/body&gt;</code>'
		);
		$this->textarea_field( 'header', __( 'Header', 'insert-headers-and-footers' ), $header_desc );
		if ( $this->body_supported() ) {
			$this->textarea_field( 'body', __( 'Body', 'insert-headers-and-footers' ), $body_desc );
		}
		$this->textarea_field( 'footer', __( 'Footer', 'insert-headers-and-footers' ), $footer_desc );
		wp_nonce_field( $this->action, $this->nonce_name );
	}

	/**
	 * Check if the website supports wp_body_open.
	 *
	 * @return bool
	 */
	public function body_supported() {
		return function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' );
	}

	/**
	 * Standard output for a code input field.
	 *
	 * @param string $option The option name as stored in the DB.
	 * @param string $title The title of the input (also used as label).
	 * @param string $desc The description that shows up under the field.
	 *
	 * @return void
	 */
	public function textarea_field( $option, $title, $desc ) {
		$value = wp_unslash( $this->get_option( $option ) );
		?>
		<div class="wpcode-code-textarea" id="wpcode-global-<?php echo esc_attr( $option ); ?>">
			<h2><label for="ihaf_insert_<?php echo esc_attr( $option ); ?>"><?php echo esc_html( $title ); ?></label>
			</h2>
			<textarea name="ihaf_insert_<?php echo esc_attr( $option ); ?>" id="ihaf_insert_<?php echo esc_attr( $option ); ?>" class="widefat" rows="8" <?php disabled( ! current_user_can( 'unfiltered_html', 'wpcode-editor' ) ); ?>><?php echo esc_html( $value ); ?></textarea>
			<p>
				<?php echo wp_kses( $desc, array( 'code' => array() ) ); ?>
			</p>
		</div>
		<?php
	}

	/**
	 * Get the value of an option.
	 *
	 * @param string $option The option name.
	 *
	 * @return mixed
	 */
	public function get_option( $option ) {
		return get_option( 'ihaf_insert_' . $option );
	}

	/**
	 * For this page we output a title and the save button.
	 *
	 * @return void
	 */
	public function output_header_bottom() {
		$headers_footers_mode = wpcode()->settings->get_option( 'headers_footers_mode' );
		$button_disabled      = ! $this->can_edit && ! $headers_footers_mode ? 'disabled' : '';
		?>
		<div class="wpcode-column">
			<h1><?php esc_html_e( 'Global Header and Footer', 'insert-headers-and-footers' ); ?></h1>
		</div>
		<div class="wpcode-column">
			<?php $this->get_submenu_toggle(); ?>
			<button class="wpcode-button" type="submit" <?php echo esc_attr( $button_disabled ); ?>>
				<?php esc_html_e( 'Save Changes', 'insert-headers-and-footers' ); ?>
			</button>
		</div>
		<?php
	}

	/**
	 * Get the toggle to disable submenu mode.
	 *
	 * @return void
	 */
	public function get_submenu_toggle() {
		if ( ! $this->settings_submenu ) {
			return;
		}

		?>
		<div>
			<label for="headers_footers_mode" class="wpcode-status-text"><?php esc_html_e( 'Simple mode', 'insert-headers-and-footers' ); ?></label>
			<?php echo $this->get_checkbox_toggle( true, 'headers_footers_mode' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
		</div>
		<?php
	}

	/**
	 * Page specific scripts. Hooked to 'admin_enqueue_scripts'.
	 *
	 * @return void
	 */
	public function page_scripts() {
		$editor = new WPCode_Code_Editor();

		$editor->register_editor( 'ihaf_insert_header' );
		$editor->register_editor( 'ihaf_insert_footer' );
		if ( $this->body_supported() ) {
			$editor->register_editor( 'ihaf_insert_body' );
		}
		$editor->init_editor();
	}

	/**
	 * If the form is submitted attempt to save the values.
	 *
	 * @return void
	 */
	public function submit_listener() {
		if ( ! isset( $_REQUEST[ $this->nonce_name ] ) || ! wp_verify_nonce( sanitize_key( $_REQUEST[ $this->nonce_name ] ), $this->action ) ) {
			// Nonce is missing, so we're not even going to try.
			return;
		}

		if ( $this->can_edit && isset( $_REQUEST['ihaf_insert_header'] ) && isset( $_REQUEST['ihaf_insert_footer'] ) ) {
			// If they are not allowed to edit the page these should not be processed but we still allow them to save to disable the simple mode.
			update_option( 'ihaf_insert_header', $_REQUEST['ihaf_insert_header'] );  // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			update_option( 'ihaf_insert_footer', $_REQUEST['ihaf_insert_footer'] );  // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
			update_option( 'ihaf_insert_body', isset( $_REQUEST['ihaf_insert_body'] ) ? $_REQUEST['ihaf_insert_body'] : '' );  // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized

			// Clear the cache.
			if ( apply_filters( 'wpcode_clear_cache_on_global_save', true ) ) {
				wpcode_clear_all_plugins_page_cache( 'global' );
			}
		}

		if ( wpcode()->settings->get_option( 'headers_footers_mode' ) && ! isset( $_REQUEST['headers_footers_mode'] ) ) {
			wpcode()->settings->update_option( 'headers_footers_mode', false );
			wp_safe_redirect(
				add_query_arg(
					array(
						'page'    => $this->page_slug,
						'message' => 2,
					),
					admin_url( 'admin.php' )
				)
			);
			exit;
		}

		$this->set_success_message( __( 'Settings Saved. Please don\'t forget to clear the site cache if you are using a cache plugin, so that the changes will be reflected for all users.', 'insert-headers-and-footers' ) );
	}

	/**
	 * Use a different base url when the headers_footers_mode is enabled.
	 *
	 * @return string
	 */
	public function get_page_action_url() {
		$url = parent::get_page_action_url();

		if ( ! wpcode()->settings->get_option( 'headers_footers_mode' ) ) {
			return $url;
		}

		return str_replace( 'admin.php', 'options-general.php', $url );
	}

	/**
	 * Add the revisions box.
	 *
	 * @return void
	 */
	public function revisions_box() {
		$html = $this->code_revisions_list_with_notice(
			esc_html__( 'Code Revisions is a Pro Feature', 'insert-headers-and-footers' ),
			sprintf(
				'<p>%s</p>',
				esc_html__( 'Upgrade to WPCode Pro today and start tracking revisions and see exactly who, when and which changes were made to global Headers & Footers scripts.', 'insert-headers-and-footers' )
			),
			array(
				'text' => esc_html__( 'Upgrade to Pro and Unlock Revisions', 'insert-headers-and-footers' ),
				'url'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'headers-footers', 'revisions', 'upgrade-to-pro' ),
			),
			array(
				'text' => esc_html__( 'Learn more about all the features', 'insert-headers-and-footers' ),
				'url'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'headers-footers', 'revisions', 'features' ),
			)
		);

		$this->metabox(
			__( 'Code Revisions', 'insert-headers-and-footers' ),
			$html,
			__( 'Easily switch back to a previous version of your global scripts.', 'insert-headers-and-footers' )
		);

	}
}
includes/admin/pages/class-wpcode-admin-page-tools.php000064400000100661151331545640017007 0ustar00<?php
/**
 * Tools admin page.
 *
 * @package WPCode
 */

/**
 * Class for the Tools admin page.
 */
class WPCode_Admin_Page_Tools extends WPCode_Admin_Page {

	/**
	 * The page slug to be used when adding the submenu.
	 *
	 * @var string
	 */
	public $page_slug = 'wpcode-tools';

	/**
	 * The action used for the nonce.
	 *
	 * @var string
	 */
	private $action = 'wpcode-tools';

	/**
	 * Default view.
	 *
	 * @var string
	 */
	public $view = 'import';

	/**
	 * The nonce name field.
	 *
	 * @var string
	 */
	private $nonce_name = 'wpcode-tools_nonce';

	/**
	 * Available importers.
	 *
	 * @var WPCode_Importer_Type[]
	 */
	private $importers = array();

	/**
	 * The capability required to view this page.
	 *
	 * @var string
	 */
	protected $capability = 'wpcode_edit_php_snippets';

	/**
	 * Call this just to set the page title translatable.
	 */
	public function __construct() {
		$this->page_title = __( 'Tools', 'insert-headers-and-footers' );
		parent::__construct();
	}

	/**
	 * Register hook on admin init just for this page.
	 *
	 * @return void
	 */
	public function page_hooks() {
		$this->process_message();
		add_action( 'admin_init', array( $this, 'submit_listener' ) );
		add_action( 'admin_print_scripts', array( $this, 'importer_templates' ) );
		add_filter( 'wpcode_admin_js_data', array( $this, 'add_tools_data' ) );
		// Listen for log delete requests.
		add_action( 'admin_init', array( $this, 'maybe_delete_log' ) );
		// Localize script data.
		add_filter( 'wpcode_admin_js_data', array( $this, 'add_tools_strings' ) );
	}


	/**
	 * Process messages specific to this page.
	 *
	 * @return void
	 */
	public function process_message() {
		// phpcs:disable WordPress.Security.NonceVerification
		if ( ! isset( $_GET['message'] ) ) {
			return;
		}

		$messages = array(
			1 => sprintf(
			// Translators: Adds a link to the snippets list in the admin.
				__( 'Import was successfully finished. You can go and check %1$syour snippets%2$s.', 'insert-headers-and-footers' ),
				'<a href="' . esc_url( admin_url( 'admin.php?page=wpcode' ) ) . '">',
				'</a>'
			),
		);
		$message  = absint( $_GET['message'] );
		// phpcs:enable WordPress.Security.NonceVerification

		if ( ! isset( $messages[ $message ] ) ) {
			return;
		}

		$this->set_success_message( $messages[ $message ] );

	}

	/**
	 * @return WPCode_Importer_Type[]
	 */
	public function get_importers() {
		if ( empty( $this->importers ) ) {
			$this->importers = wpcode()->importers->get_importers();
		}

		return $this->importers;
	}

	/**
	 * The Tools page output.
	 *
	 * @return void
	 */
	public function output_content() {
		if ( method_exists( $this, 'output_view_' . $this->view ) ) {
			call_user_func( array( $this, 'output_view_' . $this->view ) );
		}
	}

	/**
	 * The Import view.
	 *
	 * @return void
	 */
	public function output_view_import() {
		?>
		<div class="wpcode-setting-row wpcode-tools">
			<h3><?php esc_html_e( 'WPCode Snippet Import', 'insert-headers-and-footers' ); ?></h3>
			<p><?php esc_html_e( 'Select a WPCode export file', 'insert-headers-and-footers' ); ?></p>

			<form method="post" enctype="multipart/form-data" action="<?php echo esc_url( $this->get_page_action_url() ); ?>">
				<div class="wpcode-file-upload">
					<input type="file" name="file" id="wpcode-tools-snippets-import" class="inputfile" data-multiple-caption="{count} files selected" accept=".json">
					<label for="wpcode-tools-snippets-import">
						<span class="wpcode-file-field"><span class="placeholder"><?php esc_html_e( 'No file chosen', 'insert-headers-and-footers' ); ?></span></span>
						<strong class="wpcode-button wpcode-button-secondary wpcode-button-icon">
							<?php
							wpcode_icon( 'upload', 12, 12 );
							esc_html_e( 'Choose a file&hellip;', 'insert-headers-and-footers' );
							?>
						</strong>
					</label>
				</div>
				<br>
				<input type="hidden" name="action" value="import_snippets">
				<?php wp_nonce_field( $this->action, $this->nonce_name ); ?>
				<button name="submit-import" class="wpcode-button">
					<?php esc_html_e( 'Import', 'insert-headers-and-footers' ); ?>
				</button>
			</form>
		</div>
		<hr/>
		<div class="wpcode-setting-row wpcode-tools">
			<h3><?php esc_html_e( 'Import from Other Code Plugins', 'insert-headers-and-footers' ); ?></h3>
			<p><?php esc_html_e( 'WPCode makes it easy for you to switch by allowing you import your third-party snippet plugins with a single click.', 'insert-headers-and-footers' ); ?></p>
			<form action="<?php echo esc_url( admin_url( 'admin.php' ) ); ?>">
				<select name="provider" id="wpcode-plugins-importer" required>
					<option value=""><?php esc_html_e( 'Select previous Code plugin', 'insert-headers-and-footers' ); ?></option>
					<?php
					foreach ( $this->get_importers() as $importer ) {
						$status = '';

						if ( empty( $importer['installed'] ) ) {
							$status = esc_html__( 'Not Installed', 'insert-headers-and-footers' );
						} elseif ( empty( $importer['active'] ) ) {
							$status = esc_html__( 'Not Active', 'insert-headers-and-footers' );
						}
						printf(
							'<option value="%s" %s>%s %s</option>',
							esc_attr( $importer['slug'] ),
							! empty( $status ) ? 'disabled' : '',
							esc_html( $importer['name'] ),
							! empty( $status ) ? '(' . esc_html( $status ) . ')' : '' //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
						);
					}
					?>
				</select>
				<input type="hidden" name="view" value="importer"/>
				<input type="hidden" name="page" value="<?php echo esc_attr( $this->page_slug ); ?>"/>
				<br/>
				<button class="wpcode-button"><?php esc_html_e( 'Import', 'insert-headers-and-footers' ); ?></button>
			</form>
		</div>
		<hr/>
		<?php
	}

	/**
	 * The export view.
	 *
	 * @return void
	 */
	public function output_view_export() {
		?>
		<div class="wpcode-setting-row wpcode-tools">
			<h3><?php esc_html_e( 'Export Code Snippets', 'insert-headers-and-footers' ); ?></h3>
			<form action="<?php echo esc_url( $this->get_page_action_url() ); ?>" method="post">
				<?php
				$this->metabox_row(
					__( 'Status', 'insert-headers-and-footers' ),
					$this->get_status_dropdown(),
					'wpcode_export_status'
				);
				$this->metabox_row(
					__( 'Code type', 'insert-headers-and-footers' ),
					$this->get_code_type_checkboxes(),
					'wpcode_export_code_type'
				);
				$this->metabox_row(
					__( 'Tags', 'insert-headers-and-footers' ),
					$this->get_tags_checkboxes(),
					'wpcode_export_tags'
				);

				wp_nonce_field( $this->action, $this->nonce_name );
				?>
				<button type="submit" name="wpcode-export-snippets" class="wpcode-button"><?php esc_html_e( 'Export Snippets', 'insert-headers-and-footers' ); ?></button>
			</form>
		</div>
		<?php
	}

	/**
	 * The System Info view.
	 *
	 * @return void
	 */
	public function output_view_info() {
		?>
		<div class="wpcode-setting-row">
			<h3><?php esc_html_e( 'System Information', 'insert-headers-and-footers' ); ?></h3>
			<textarea class="info-area" readonly><?php echo esc_textarea( $this->get_system_info() ); ?></textarea>
		</div>
		<hr/>
		<div class="wpcode-setting-row">
			<h3 id="ssl-verify"><?php esc_html_e( 'Test SSL Connections', 'insert-headers-and-footers' ); ?></h3>
			<p><?php esc_html_e( 'Click the button below to verify your web server can perform SSL connections successfully.', 'insert-headers-and-footers' ); ?></p>
			<button type="button" id="wpcode-ssl-verify" class="wpcode-button">
				<?php esc_html_e( 'Test Connection', 'insert-headers-and-footers' ); ?>
			</button>
		</div>
		<?php
	}

	/**
	 * Importer view (from other plugins).
	 *
	 * @return void
	 */
	public function output_view_importer() {
		$provider = ! empty( $_GET['provider'] ) ? sanitize_text_field( wp_unslash( $_GET['provider'] ) ) : '';// phpcs:ignore WordPress.Security.NonceVerification.Recommended

		$importers     = wpcode()->importers->importers;
		$snippets      = array();
		$provider_name = '';
		if ( isset( $importers[ $provider ] ) ) {
			$snippets      = $importers[ $provider ]->get_snippets();
			$provider_name = $importers[ $provider ]->name;
		}

		?>
		<h2><?php esc_html_e( 'Snippets import', 'insert-headers-and-footers' ); ?></h2>
		<hr/>
		<div id="wpcode-importer-snippets">
			<div class="wpcode-setting-row wpcode-tools">
				<p><?php esc_html_e( 'Select the Snippets you would like to import.', 'insert-headers-and-footers' ); ?></p>

				<div class="wpcode-checkbox-multiselect-columns">
					<div class="first-column">
						<h5 class="header"><?php esc_html_e( 'Available Snippets', 'insert-headers-and-footers' ); ?></h5>

						<ul>
							<?php
							if ( empty( $snippets ) ) {
								echo '<li>' . esc_html__( 'No snippets found.', 'insert-headers-and-footers' ) . '</li>';
							} else {
								foreach ( $snippets as $id => $snippet ) {
									printf(
										'<li><label><input type="checkbox" name="snippets[]" value="%s">%s</label></li>',
										esc_attr( $id ),
										esc_attr( sanitize_text_field( $snippet ) )
									);
								}
							}
							?>
						</ul>

						<?php if ( ! empty( $snippets ) ) : ?>
							<a href="#" class="all"><?php esc_html_e( 'Select All', 'insert-headers-and-footers' ); ?></a>
						<?php endif; ?>

					</div>
					<div class="second-column">
						<h5 class="header"><?php esc_html_e( 'Snippets to Import', 'insert-headers-and-footers' ); ?></h5>
						<ul></ul>
					</div>
				</div>
			</div>

			<?php if ( ! empty( $snippets ) ) : ?>
				<p class="submit">
					<input type="hidden" value="<?php echo esc_attr( $provider ); ?>" id="wpcode-importer-provider"/>
					<button class="wpcode-button" id="wpcode-importer-snippets-submit"><?php esc_html_e( 'Import', 'insert-headers-and-footers' ); ?></button>
				</p>
			<?php endif; ?>
		</div>
		<div id="wpcode-importer-process">

			<p class="process-count">
				<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
				<?php
				printf(
					wp_kses(
					// Translators: These add markup to display which snippet out of the total from the provider name.
						__( 'Importing %1$s of %2$s snippets from %3$s.', 'insert-headers-and-footers' ),
						array(
							'span' => array(
								'class' => array(),
							),
						)
					),
					'<span class="snippet-current">1</span>',
					'<span class="snippet-total">0</span>',
					esc_html( $provider_name )
				);
				?>
			</p>
			<p class="process-completed">
				<?php
				printf(
					wp_kses(
					// Translators: this adds the total snippets count that have been completed.
						__( 'Congrats, the import process has finished! We have successfully imported %s snippets. You can review the results below.', 'insert-headers-and-footers' ),
						array(
							'span' => array(
								'class' => array(),
							),
						)
					),
					'<span class="snippets-completed"></span>'
				);
				?>
			</p>
			<div class="status"></div>
		</div>
		<?php
	}

	/**
	 * Get a dropdown with the status options.
	 *
	 * @return string
	 */
	public function get_status_dropdown() {
		$options = array(
			'all'     => __( 'All', 'insert-headers-and-footers' ),
			'publish' => __( 'Active', 'insert-headers-and-footers' ),
			'draft'   => __( 'Inactive', 'insert-headers-and-footers' ),
		);

		$select = '<select name="wpcode_export_status" id="wpcode_export_status">';
		foreach ( $options as $value => $label ) {
			$select .= sprintf(
				'<option value="%1$s">%2$s</option>',
				esc_attr( $value ),
				esc_html( $label )
			);
		}
		$select .= '</select>';

		return $select;
	}

	/**
	 * Get all the tags in a checkbox list.
	 *
	 * @return string
	 */
	public function get_code_type_checkboxes() {
		$labels  = wpcode()->execute->get_options();
		$tags    = get_terms(
			array(
				'taxonomy' => 'wpcode_type',
				'count'    => true,
			)
		);
		$options = array();

		if ( empty( $tags ) ) {
			return __( 'No snippets available to export.', 'insert-headers-and-footers' );
		}

		foreach ( $tags as $tag ) {
			$label                    = isset( $labels[ $tag->slug ] ) ? $labels[ $tag->slug ] : $tag->name;
			$options[ $tag->term_id ] = $label . ' (' . $tag->count . ')';
		}

		return $this->get_checkboxes_list( $options, 'wpcode_export_code_type' );
	}

	/**
	 * Get all the tags in a checkbox list.
	 *
	 * @return string
	 */
	public function get_tags_checkboxes() {
		$tags = get_terms(
			array(
				'taxonomy' => 'wpcode_tags',
				'count'    => true,
			)
		);

		if ( empty( $tags ) ) {
			return __( 'No tags available.', 'insert-headers-and-footers' );
		}

		$options = array();
		foreach ( $tags as $tag ) {
			$options[ $tag->term_id ] = $tag->name . ' (' . $tag->count . ')';
		}

		return $this->get_checkboxes_list( $options, 'wpcode_export_tags' );
	}

	/**
	 * Get a list of checkboxes from a key=>value array.
	 *
	 * @param array  $options The options to display as checkboxes.
	 * @param string $name The name used for the input name attribute.
	 *
	 * @return string
	 */
	public function get_checkboxes_list( $options, $name ) {
		$checkboxes = '<div class="wpcode-checkboxes-list">';
		foreach ( $options as $value => $label ) {
			$checkboxes .= sprintf(
				'<label><input type="checkbox" name="%1$s[]" value="%2$s" />%3$s</label>',
				$name,
				$value,
				$label
			);
		}
		$checkboxes .= '</div>';

		return $checkboxes;
	}

	/**
	 * For this page we output a menu.
	 *
	 * @return void
	 */
	public function output_header_bottom() {
		?>
		<ul class="wpcode-admin-tabs">
			<?php
			foreach ( $this->views as $slug => $label ) {
				if ( 'importer' === $slug ) {
					continue;
				}
				$class = $this->view === $slug ? 'active' : '';
				?>
				<li>
					<a href="<?php echo esc_url( $this->get_view_link( $slug ) ); ?>" class="<?php echo esc_attr( $class ); ?>"><?php echo esc_html( $label ); ?></a>
				</li>
			<?php } ?>
		</ul>
		<?php
	}

	/**
	 * Setup page-specific views.
	 *
	 * @return void
	 */
	protected function setup_views() {
		$this->views = array(
			'import'   => __( 'Import', 'insert-headers-and-footers' ),
			'export'   => __( 'Export', 'insert-headers-and-footers' ),
			'info'     => __( 'System Info', 'insert-headers-and-footers' ),
			'importer' => __( 'Importer', 'insert-headers-and-footers' ),
			'logs'     => __( 'Logs', 'insert-headers-and-footers' ),
		);
	}

	/**
	 * If the form is submitted attempt to save the values.
	 *
	 * @return void
	 */
	public function submit_listener() {
		if ( ! isset( $_REQUEST[ $this->nonce_name ] ) || ! wp_verify_nonce( sanitize_key( $_REQUEST[ $this->nonce_name ] ), $this->action ) ) {
			// Nonce is missing, so we're not even going to try.
			return;
		}

		if ( isset( $_REQUEST['wpcode-export-snippets'] ) ) {
			$this->handle_export();
		}

		if ( ! isset( $_REQUEST['action'] ) ) {
			return;
		}

		$action = sanitize_text_field( wp_unslash( $_REQUEST['action'] ) );
		if ( 'import_snippets' === $action ) {
			$this->handle_import_file();
		}
	}

	/**
	 * Process export form and download a JSON file.
	 *
	 * @return void
	 */
	public function handle_export() {
		// Already verified nonce in parent method @see submit_listener.
		// phpcs:disable WordPress.Security.NonceVerification
		$status     = isset( $_POST['wpcode_export_status'] ) ? sanitize_text_field( wp_unslash( $_POST['wpcode_export_status'] ) ) : 'all';
		$code_types = isset( $_POST['wpcode_export_code_type'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['wpcode_export_code_type'] ) ) : array();
		$tags       = isset( $_POST['wpcode_export_tags'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['wpcode_export_tags'] ) ) : array();
		if ( 'all' === $status ) {
			$status = array(
				'publish',
				'draft',
			);
		}
		$tax_query = array();

		if ( ! empty( $code_types ) ) {
			$tax_query[] = array(
				'taxonomy' => 'wpcode_type',
				'terms'    => $code_types,
			);
		}
		if ( ! empty( $tags ) ) {
			$tax_query[] = array(
				'taxonomy' => 'wpcode_tags',
				'terms'    => $tags,
			);
		}

		$query_args = array(
			'post_type'   => 'wpcode',
			'post_status' => $status,
			'nopaging'    => true,
		);
		if ( ! empty( $tax_query ) ) {
			$query_args['tax_query'] = $tax_query; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
		}
		$export   = array();
		$snippets = get_posts( $query_args );

		foreach ( $snippets as $snippet ) {
			$snippet                          = new WPCode_Snippet( $snippet );
			$snippet_data                     = $snippet->get_data_for_caching();
			$snippet_data['tags']             = $snippet->get_tags();
			$snippet_data['note']             = $snippet->get_note();
			$snippet_data['cloud_id']         = $snippet->get_cloud_id();
			$snippet_data['custom_shortcode'] = $snippet->get_custom_shortcode();

			$export[] = apply_filters( 'wpcode_export_snippet_data', $snippet_data, $snippet );
		}

		$export = array_reverse( $export );

		ignore_user_abort( true );

		nocache_headers();
		header( 'Content-Type: application/json; charset=utf-8' );
		header( 'Content-Disposition: attachment; filename=wpcode-snippets-export-' . current_time( 'Y-m-d' ) . '.json' );
		header( 'Expires: 0' );

		echo wp_json_encode( $export );
		exit;
	}

	/**
	 * Process import file.
	 *
	 * @return void
	 */
	public function handle_import_file() {

		$ext = '';

		if ( isset( $_FILES['file']['name'] ) ) {
			$ext = strtolower( pathinfo( sanitize_text_field( wp_unslash( $_FILES['file']['name'] ) ), PATHINFO_EXTENSION ) );
		}

		if ( 'json' !== $ext ) {
			wp_die(
				esc_html__( 'Please upload a valid .json snippets export file.', 'insert-headers-and-footers' ),
				esc_html__( 'Error', 'insert-headers-and-footers' ),
				array(
					'response' => 400,
				)
			);
		}

		$tmp_name = isset( $_FILES['file']['tmp_name'] ) ? sanitize_text_field( $_FILES['file']['tmp_name'] ) : ''; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash -- wp_unslash() breaks upload on Windows.
		$snippets = json_decode( $this->remove_utf8_bom( file_get_contents( $tmp_name ) ), true ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents

		if ( empty( $snippets ) || ! is_array( $snippets ) ) {
			wp_die(
				esc_html__( 'Snippets data cannot be imported.', 'insert-headers-and-footers' ),
				esc_html__( 'Error', 'insert-headers-and-footers' ),
				array(
					'response' => 400,
				)
			);
		}

		foreach ( $snippets as $snippet ) {
			if ( empty( $snippet['code_type'] ) ) {
				// Just a minimal check that we have some required fields.
				continue;
			}
			if ( isset( $snippet['id'] ) ) {
				// We don't want to update existing snippets/posts.
				unset( $snippet['id'] );
			}

			$snippet         = apply_filters( 'wpcode_import_snippet_data', $snippet );
			$snippet['code'] = isset( $snippet['code'] ) ? wp_slash( $snippet['code'] ) : '';
			$new_snippet     = new WPCode_Snippet( $snippet );
			$new_snippet->save();

		}

		wp_safe_redirect(
			add_query_arg( 'message', 1, $this->get_page_action_url() )
		);
		exit;
	}

	/**
	 * Remove UTF-8 BOM signature if it is present.
	 *
	 * @param string $string String to process.
	 *
	 * @return string
	 */
	public function remove_utf8_bom( $string ) {
		if ( strpos( bin2hex( $string ), 'efbbbf' ) === 0 ) {
			$string = substr( $string, 3 );
		}

		return $string;
	}

	/**
	 * Templates used by the importer in JS.
	 *
	 * @return void
	 */
	public function importer_templates() {
		?>
		<script type="text/template" id="wpcode-importer-status-update">
			<div class="item">
				<div class="wpcode-clear">
					<span class="name">
						<?php wpcode_icon( 'check', 16, 13 ); ?>
						<span></span>
					</span>
					<span class="actions">
						<a href="" target="_blank"><?php esc_html_e( 'Edit', 'insert-headers-and-footers' ); ?></a>
					</span>
				</div>
			</div>
		</script>
		<?php
	}

	/**
	 * Add tools-specific localization data.
	 *
	 * @param array $data Localization data.
	 *
	 * @return array
	 */
	public function add_tools_data( $data ) {
		$data['testing'] = esc_html__( 'Testing', 'insert-headers-and-footers' );

		return $data;
	}

	/**
	 * Get system information.
	 *
	 * Based on a function from Easy Digital Downloads by Pippin Williamson.
	 *
	 * @link https://github.com/easydigitaldownloads/easy-digital-downloads/blob/master/includes/admin/tools.php#L470
	 *
	 * @return string
	 */
	public function get_system_info() {

		$data = '### Begin System Info ###' . "\n\n";

		$data .= $this->site_info();
		$data .= $this->wp_info();
		$data .= $this->uploads_info();
		$data .= $this->plugins_info();
		$data .= $this->server_info();

		$data .= "\n" . '### End System Info ###';

		return $data;
	}

	/**
	 * Get Site info.
	 *
	 * @return string
	 */
	private function site_info() {

		$data = "\n" . '-- Site Info' . "\n\n";
		$data .= 'Site URL:                 ' . site_url() . "\n";
		$data .= 'Home URL:                 ' . home_url() . "\n";
		$data .= 'Multisite:                ' . ( is_multisite() ? 'Yes' : 'No' ) . "\n";

		return $data;
	}

	/**
	 * Get WordPress Configuration info.
	 *
	 * @return string
	 */
	private function wp_info() {

		global $wpdb;

		$theme_data = wp_get_theme();
		$theme      = $theme_data->name . ' ' . $theme_data->version;

		$data = "\n" . '-- WordPress Configuration' . "\n\n";
		$data .= 'Version:                  ' . get_bloginfo( 'version' ) . "\n";
		$data .= 'Language:                 ' . get_locale() . "\n";
		$data .= 'User Language:            ' . get_user_locale() . "\n";
		$data .= 'Permalink Structure:      ' . ( get_option( 'permalink_structure' ) ? get_option( 'permalink_structure' ) : 'Default' ) . "\n";
		$data .= 'Active Theme:             ' . $theme . "\n";
		$data .= 'Show On Front:            ' . get_option( 'show_on_front' ) . "\n";

		// Only show page specs if front page is set to 'page'.
		if ( get_option( 'show_on_front' ) === 'page' ) {
			$front_page_id = get_option( 'page_on_front' );
			$blog_page_id  = get_option( 'page_for_posts' );

			$data .= 'Page On Front:            ' . ( $front_page_id ? get_the_title( $front_page_id ) . ' (#' . $front_page_id . ')' : 'Unset' ) . "\n";
			$data .= 'Page For Posts:           ' . ( $blog_page_id ? get_the_title( $blog_page_id ) . ' (#' . $blog_page_id . ')' : 'Unset' ) . "\n";
		}
		$data .= 'ABSPATH:                  ' . ABSPATH . "\n";
		$data .= 'Table Prefix:             ' . 'Length: ' . strlen( $wpdb->prefix ) . '   Status: ' . ( strlen( $wpdb->prefix ) > 16 ? 'ERROR: Too long' : 'Acceptable' ) . "\n"; //phpcs:ignore
		$data .= 'WP_DEBUG:                 ' . ( defined( 'WP_DEBUG' ) ? WP_DEBUG ? 'Enabled' : 'Disabled' : 'Not set' ) . "\n";
		$data .= 'Memory Limit:             ' . WP_MEMORY_LIMIT . "\n";
		$data .= 'Registered Post Stati:    ' . implode( ', ', get_post_stati() ) . "\n";
		$data .= 'Revisions:                ' . ( WP_POST_REVISIONS ? WP_POST_REVISIONS > 1 ? 'Limited to ' . WP_POST_REVISIONS : 'Enabled' : 'Disabled' ) . "\n";

		return $data;
	}

	/**
	 * Get Uploads/Constants info.
	 *
	 * @return string
	 */
	private function uploads_info() {

		$data = "\n" . '-- WordPress Uploads/Constants' . "\n\n";
		$data .= 'WP_CONTENT_DIR:           ' . ( defined( 'WP_CONTENT_DIR' ) ? WP_CONTENT_DIR ? WP_CONTENT_DIR : 'Disabled' : 'Not set' ) . "\n";
		$data .= 'WP_CONTENT_URL:           ' . ( defined( 'WP_CONTENT_URL' ) ? WP_CONTENT_URL ? WP_CONTENT_URL : 'Disabled' : 'Not set' ) . "\n";
		$data .= 'UPLOADS:                  ' . ( defined( 'UPLOADS' ) ? UPLOADS ? UPLOADS : 'Disabled' : 'Not set' ) . "\n";

		$uploads_dir = wp_upload_dir();

		$data .= 'wp_uploads_dir() path:    ' . $uploads_dir['path'] . "\n";
		$data .= 'wp_uploads_dir() url:     ' . $uploads_dir['url'] . "\n";
		$data .= 'wp_uploads_dir() basedir: ' . $uploads_dir['basedir'] . "\n";
		$data .= 'wp_uploads_dir() baseurl: ' . $uploads_dir['baseurl'] . "\n";

		return $data;
	}

	/**
	 * Get Plugins info.
	 *
	 * @return string
	 */
	private function plugins_info() {

		// Get plugins that have an update.
		$data = $this->mu_plugins();

		$data .= $this->installed_plugins();
		$data .= $this->multisite_plugins();

		return $data;
	}

	/**
	 * Get MU Plugins info.
	 *
	 * @return string
	 */
	private function mu_plugins() {

		$data = '';

		// Must-use plugins.
		// NOTE: MU plugins can't show updates!
		$muplugins = get_mu_plugins();

		if ( ! empty( $muplugins ) && count( $muplugins ) > 0 ) {
			$data = "\n" . '-- Must-Use Plugins' . "\n\n";

			foreach ( $muplugins as $plugin => $plugin_data ) {
				$data .= $plugin_data['Name'] . ': ' . $plugin_data['Version'] . "\n";
			}
		}

		return $data;
	}

	/**
	 * Get Installed Plugins info.
	 *
	 * @return string
	 */
	private function installed_plugins() {

		$updates = get_plugin_updates();

		// WordPress active plugins.
		$data = "\n" . '-- WordPress Active Plugins' . "\n\n";

		$plugins        = get_plugins();
		$active_plugins = get_option( 'active_plugins', array() );

		foreach ( $plugins as $plugin_path => $plugin ) {
			if ( ! in_array( $plugin_path, $active_plugins, true ) ) {
				continue;
			}
			$update = ( array_key_exists( $plugin_path, $updates ) ) ? ' (needs update - ' . $updates[ $plugin_path ]->update->new_version . ')' : '';
			$data   .= $plugin['Name'] . ': ' . $plugin['Version'] . $update . "\n";
		}

		// WordPress inactive plugins.
		$data .= "\n" . '-- WordPress Inactive Plugins' . "\n\n";

		foreach ( $plugins as $plugin_path => $plugin ) {
			if ( in_array( $plugin_path, $active_plugins, true ) ) {
				continue;
			}
			$update = ( array_key_exists( $plugin_path, $updates ) ) ? ' (needs update - ' . $updates[ $plugin_path ]->update->new_version . ')' : '';
			$data   .= $plugin['Name'] . ': ' . $plugin['Version'] . $update . "\n";
		}

		return $data;
	}

	/**
	 * Get Multisite Plugins info.
	 *
	 * @return string
	 */
	private function multisite_plugins() {

		$data = '';

		if ( ! is_multisite() ) {
			return $data;
		}

		$updates = get_plugin_updates();

		// WordPress Multisite active plugins.
		$data = "\n" . '-- Network Active Plugins' . "\n\n";

		$plugins        = wp_get_active_network_plugins();
		$active_plugins = get_site_option( 'active_sitewide_plugins', array() );

		foreach ( $plugins as $plugin_path ) {
			$plugin_base = plugin_basename( $plugin_path );

			if ( ! array_key_exists( $plugin_base, $active_plugins ) ) {
				continue;
			}
			$update = ( array_key_exists( $plugin_path, $updates ) ) ? ' (needs update - ' . $updates[ $plugin_path ]->update->new_version . ')' : '';
			$plugin = get_plugin_data( $plugin_path );
			$data   .= $plugin['Name'] . ': ' . $plugin['Version'] . $update . "\n";
		}

		return $data;
	}

	/**
	 * Get Server info.
	 *
	 * @return string
	 */
	private function server_info() {

		global $wpdb;

		// Server configuration (really just versions).
		$data = "\n" . '-- Webserver Configuration' . "\n\n";
		$data .= 'PHP Version:              ' . PHP_VERSION . "\n";
		$data .= 'MySQL Version:            ' . $wpdb->db_version() . "\n";
		$data .= 'Webserver Info:           ' . ( isset( $_SERVER['SERVER_SOFTWARE'] ) ? sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ) : '' ) . "\n";

		// PHP configs... now we're getting to the important stuff.
		$data .= "\n" . '-- PHP Configuration' . "\n\n";
		$data .= 'Memory Limit:             ' . ini_get( 'memory_limit' ) . "\n";
		$data .= 'Upload Max Size:          ' . ini_get( 'upload_max_filesize' ) . "\n";
		$data .= 'Post Max Size:            ' . ini_get( 'post_max_size' ) . "\n";
		$data .= 'Upload Max Filesize:      ' . ini_get( 'upload_max_filesize' ) . "\n";
		$data .= 'Time Limit:               ' . ini_get( 'max_execution_time' ) . "\n";
		$data .= 'Max Input Vars:           ' . ini_get( 'max_input_vars' ) . "\n";
		$data .= 'Display Errors:           ' . ( ini_get( 'display_errors' ) ? 'On (' . ini_get( 'display_errors' ) . ')' : 'N/A' ) . "\n";

		// PHP extensions and such.
		$data .= "\n" . '-- PHP Extensions' . "\n\n";
		$data .= 'cURL:                     ' . ( function_exists( 'curl_init' ) ? 'Supported' : 'Not Supported' ) . "\n";
		$data .= 'fsockopen:                ' . ( function_exists( 'fsockopen' ) ? 'Supported' : 'Not Supported' ) . "\n";
		$data .= 'SOAP Client:              ' . ( class_exists( 'SoapClient', false ) ? 'Installed' : 'Not Installed' ) . "\n";
		$data .= 'Suhosin:                  ' . ( extension_loaded( 'suhosin' ) ? 'Installed' : 'Not Installed' ) . "\n";

		// Session stuff.
		$data .= "\n" . '-- Session Configuration' . "\n\n";
		$data .= 'Session:                  ' . ( isset( $_SESSION ) ? 'Enabled' : 'Disabled' ) . "\n";

		// The rest of this is only relevant if session is enabled.
		if ( isset( $_SESSION ) ) {
			$data .= 'Session Name:             ' . esc_html( ini_get( 'session.name' ) ) . "\n";
			$data .= 'Cookie Path:              ' . esc_html( ini_get( 'session.cookie_path' ) ) . "\n";
			$data .= 'Save Path:                ' . esc_html( ini_get( 'session.save_path' ) ) . "\n";
			$data .= 'Use Cookies:              ' . ( ini_get( 'session.use_cookies' ) ? 'On' : 'Off' ) . "\n";
			$data .= 'Use Only Cookies:         ' . ( ini_get( 'session.use_only_cookies' ) ? 'On' : 'Off' ) . "\n";
		}

		return $data;
	}

	/**
	 * Output the log viewer.
	 *
	 * @return void
	 */
	public function output_view_logs() {

		if ( ! current_user_can( 'wpcode_edit_php_snippets' ) ) {
			echo '<p>' . esc_html__( 'You do not have sufficient permissions to view logs.', 'insert-headers-and-footers' ) . '</p>';

			return;
		}

		$logs = wpcode()->logger->get_logs();

		if ( empty( $logs ) ) {
			echo '<p>';
			printf(
			// translators: %1$s: opening anchor tag, %2$s: closing anchor tag.
				esc_html__( 'No logs found. You can enable logging from the %1$ssettings panel%2$s.', 'insert-headers-and-footers' ),
				'<a href="' . esc_url( admin_url( 'admin.php?page=wpcode-settings&view=errors' ) ) . '">',
				'</a>'
			);
			echo '</p>';

			return;
		}
		$selected_log      = $logs[0]['path'];
		$selected_log_name = $logs[0]['filename'];

		if ( isset( $_POST['log'] ) && isset( $_POST['_wpnonce'] ) && wp_verify_nonce( sanitize_key( $_POST['_wpnonce'] ), 'wpcode_view_log' ) ) {
			$selected_log_name = sanitize_text_field( wp_unslash( $_POST['log'] ) );
			// Find the log file path.
			foreach ( $logs as $log ) {
				if ( $log['filename'] === $selected_log_name ) {
					$selected_log = $log['path'];
					break;
				}
			}
		}
		// Load the selected log.
		$log_content = file_get_contents( $selected_log ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents

		$delete_log_url = wp_nonce_url(
			add_query_arg(
				array(
					'wpcode_action' => 'delete_log',
					'log'           => str_replace( '.log', '', $selected_log_name ),
				),
				$this->get_page_action_url()
			),
			'wpcode_delete_log'
		);
		// Log picker form.
		?>
		<div class="alignleft">
			<h2><?php echo esc_html( $selected_log_name ); ?>
				<a class="wpcode-button wpcode-button-secondary wpcode-delete-log" href="<?php echo esc_url( $delete_log_url ); ?>"><?php esc_html_e( 'Delete log', 'insert-headers-and-footers' ); ?></a>
			</h2>
		</div>
		<div class="alignright">
			<form method="post" action="<?php echo esc_url( $this->get_page_action_url() ); ?>">
				<select name="log">
					<?php foreach ( $logs as $log ) : ?>
						<option value="<?php echo esc_attr( $log['filename'] ); ?>" <?php selected( $selected_log_name, $log['filename'] ); ?>><?php echo esc_html( $log['filename'] ); ?></option>
					<?php endforeach; ?>
				</select>
				<button type="submit" class="wpcode-button"><?php esc_html_e( 'View', 'insert-headers-and-footers' ); ?></button>
				<?php wp_nonce_field( 'wpcode_view_log' ); ?>
			</form>
		</div>
		<div class="clear"></div>

		<div id="wpcode-log-data">
			<?php if ( empty( $log_content ) ) : ?>
				<p><?php esc_html_e( 'Log is empty.', 'insert-headers-and-footers' ); ?></p>
			<?php endif; ?>
			<pre><?php echo esc_html( $log_content ); ?></pre>
		</div>
		<?php
	}

	/**
	 * Delete a log file.
	 *
	 * @return void
	 */
	public function maybe_delete_log() {

		if ( ! isset( $_GET['wpcode_action'] ) || 'delete_log' !== $_GET['wpcode_action'] || ! isset( $_GET['log'] ) ) {
			return;
		}

		// Check nonce.
		if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( sanitize_key( $_GET['_wpnonce'] ), 'wpcode_delete_log' ) ) {
			wp_die( esc_html__( 'Link expired. Please refresh the page and retry.', 'insert-headers-and-footers' ) );
		}

		if ( ! current_user_can( 'wpcode_activate_snippets' ) ) {
			echo '<p>' . esc_html__( 'You do not have sufficient permissions to delete logs.', 'insert-headers-and-footers' ) . '</p>';

			return;
		}

		wpcode()->logger->delete_log( sanitize_key( wp_unslash( $_GET['log'] ) ) );

		wp_safe_redirect( $this->get_page_action_url() );
		exit;
	}

	/**
	 * Add tools-specific strings to the JS strings object.
	 *
	 * @param array $data The strings object.
	 *
	 * @return array
	 */
	public function add_tools_strings( $data ) {
		$data['confirm_delete_log'] = __( 'Are you sure you want to delete this log?', 'insert-headers-and-footers' );

		return $data;
	}
}
includes/admin/pages/class-wpcode-admin-page-library.php000064400000013642151331545640017315 0ustar00<?php
/**
 * Admin page for the snippets library.
 *
 * @package WPCode
 */

/**
 * WPCode_Admin_Page_Library class.
 */
class WPCode_Admin_Page_Library extends WPCode_Admin_Page {

	use WPCode_My_Library_Markup_Lite;
	/**
	 * The page slug.
	 *
	 * @var string
	 */
	public $page_slug = 'wpcode-library';
	/**
	 * We always show the library on this page.
	 *
	 * @var bool
	 */
	protected $show_library = true;

	/**
	 *  The default view.
	 *
	 * @var string
	 */
	public $view = 'library';

	/**
	 * The object used for loading data on this page.
	 *
	 * @var WPCode_Library
	 */
	protected $data_handler;

	/**
	 * The capability required to view this page.
	 *
	 * @var string
	 */
	protected $capability = 'wpcode_edit_php_snippets';

	/**
	 * Call this just to set the page title translatable.
	 */
	public function __construct() {
		$this->page_title = __( 'Library', 'insert-headers-and-footers' );
		parent::__construct();
	}

	/**
	 * Setup page-specific views.
	 *
	 * @return void
	 */
	protected function setup_views() {
		$this->views = array(
			'library'      => __( 'Snippets', 'insert-headers-and-footers' ),
			'my_library'   => __( 'My Library', 'insert-headers-and-footers' ),
			'my_favorites' => __( 'My Favorites', 'insert-headers-and-footers' ),
		);
	}

	/**
	 * Add page-specific hooks.
	 *
	 * @return void
	 */
	public function page_hooks() {
		$this->process_message();
		add_action( 'admin_init', array( $this, 'maybe_add_from_library' ) );
	}

	/**
	 * Handle grabbing snippets from the library.
	 *
	 * @return void
	 */
	public function maybe_add_from_library() {
		if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( sanitize_key( $_GET['_wpnonce'] ), 'wpcode_add_from_library' ) ) {
			return;
		}
		$library_id = isset( $_GET['snippet_library_id'] ) ? absint( $_GET['snippet_library_id'] ) : 0;

		if ( empty( $library_id ) ) {
			return;
		}

		$snippet = $this->get_data_handler()->create_new_snippet( $library_id );

		if ( $snippet ) {
			$url = add_query_arg(
				array(
					'page'       => 'wpcode-snippet-manager',
					'snippet_id' => $snippet->get_id(),
				),
				$this->admin_url( 'admin.php' )
			);
		} else {
			$url = add_query_arg(
				array(
					'message' => 1,
				),
				remove_query_arg(
					array(
						'_wpnonce',
						'snippet_library_id',
					)
				)
			);
		}

		wp_safe_redirect( $url );
		exit;
	}

	/**
	 * Markup for the Library page content.
	 *
	 * @return void
	 */
	public function output_content() {

		if ( method_exists( $this, 'output_view_' . $this->view ) ) {
			call_user_func( array( $this, 'output_view_' . $this->view ) );
		}
	}

	/**
	 * Ouptut the library content (default view).
	 *
	 * @return void
	 */
	public function output_view_library() {
		$library_data = $this->get_data_handler()->get_data();
		$categories   = $library_data['categories'];
		$snippets     = $library_data['snippets'];

		$this->get_library_markup( $categories, $snippets );
		$this->library_preview_modal_content();
		$this->library_connect_banner_template();
	}

	/**
	 * For this page we output a menu.
	 *
	 * @return void
	 */
	public function output_header_bottom() {
		?>
		<ul class="wpcode-admin-tabs">
			<?php
			foreach ( $this->views as $slug => $label ) {
				$class = $this->view === $slug ? 'active' : '';
				?>
				<li>
					<a href="<?php echo esc_url( $this->get_view_link( $slug ) ); ?>" class="<?php echo esc_attr( $class ); ?>"><?php echo esc_html( $label ); ?></a>
				</li>
			<?php } ?>
		</ul>
		<?php
	}

	/**
	 * Process messages specific to this page.
	 *
	 * @return void
	 */
	public function process_message() {
		// phpcs:disable WordPress.Security.NonceVerification
		if ( ! isset( $_GET['message'] ) ) {
			return;
		}

		$messages = array(
			1 => __( 'We encountered an error while trying to load the snippet data. Please try again.', 'insert-headers-and-footers' ),
		);
		$message  = absint( $_GET['message'] );
		// phpcs:enable WordPress.Security.NonceVerification

		if ( ! isset( $messages[ $message ] ) ) {
			return;
		}

		$this->set_error_message( $messages[ $message ] );

	}

	/**
	 * Markup for the "My Library" page.
	 *
	 * @return void
	 */
	public function output_view_my_library() {
		$this->get_my_library_markup();
	}

	/**
	 * Markup for the "My Library" page.
	 *
	 * @return void
	 */
	public function output_view_my_favorites() {
		$this->blurred_placeholder_items();
		// Show upsell.
		echo WPCode_Admin_Page::get_upsell_box( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
			esc_html__( 'My Favorites is a PRO Feature', 'insert-headers-and-footers' ),
			'<p>' . esc_html__( 'Upgrade to WPCode PRO today and see the snippets you starred in the WPCode Library directly in the plugin.', 'insert-headers-and-footers' ) . '</p>',
			array(
				'text' => esc_html__( 'Upgrade to PRO and Unlock "My Favorites"', 'insert-headers-and-footers' ),
				'url'  => esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'library-page', 'my-favorites', 'upgrade-and-unlock' ) ),
			),
			array(
				'text' => esc_html__( 'Learn more about all the features', 'insert-headers-and-footers' ),
				'url'  => esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'library-page', 'my-favorites', 'features' ) ),
			),
			array(
				esc_html__( 'Load favorite snippets in the plugin', 'insert-headers-and-footers' ),
				esc_html__( 'Import snippets from the WPCode Library', 'insert-headers-and-footers' ),
				esc_html__( 'Save your snippets to the WPCode Library', 'insert-headers-and-footers' ),
				esc_html__( 'Set up new websites faster', 'insert-headers-and-footers' ),
				esc_html__( 'Easily implement features on multiple sites', 'insert-headers-and-footers' ),
				esc_html__( 'Edit snippets in the WPCode Library', 'insert-headers-and-footers' ),
			)
		);
	}

	/**
	 * Get the data handler for this page.
	 *
	 * @return WPCode_Library
	 */
	public function get_data_handler() {
		if ( ! isset( $this->data_handler ) ) {
			$this->data_handler = wpcode()->library;
		}

		return $this->data_handler;
	}

}
includes/admin/pages/class-wpcode-admin-page-duplicator.php000064400000010675151331545640020022 0ustar00<?php
/**
 * Admin page for the Duplicator tool.
 *
 * @package WPCode
 */

/**
 * Class for the Duplicator admin page.
 */
class WPCode_Admin_Page_Duplicator extends WPCode_Admin_Page {

	/**
	 * The page slug to be used when adding the submenu.
	 *
	 * @var string
	 */
	public $page_slug = 'wpcode-duplicator';

	/**
	 * The action used for the nonce.
	 *
	 * @var string
	 */
	protected $action = 'wpcode-duplicator';

	/**
	 * The nonce name field.
	 *
	 * @var string
	 */
	protected $nonce_name = 'wpcode-duplicator_nonce';

	/**
	 * Call this just to set the page title translatable.
	 */
	public function __construct() {
		$this->page_title = 'Backups';
		$this->menu_title = 'Backups';
		parent::__construct();
	}

	/**
	 * Register hook on admin init just for this page.
	 *
	 * @return void
	 */
	public function page_hooks() {
		add_action( 'admin_init', array( $this, 'maybe_redirect_to_duplicator' ) );
	}

	/**
	 * Override to hide default header on this page.
	 *
	 * @return void
	 */
	public function output_header() {
	}

	/**
	 * Redirect to the Duplicator page if the plugin is active.
	 *
	 * @return void
	 */
	public function maybe_redirect_to_duplicator() {
		if ( class_exists( 'Duplicator\Lite\Requirements' ) ) {
			wp_safe_redirect( admin_url( 'admin.php?page=duplicator' ) );
			exit;
		} elseif ( class_exists( 'Duplicator\Pro\Requirements' ) ) {
			wp_safe_redirect( admin_url( 'admin.php?page=duplicator-pro' ) );
			exit;
		}
	}
	/**
	 * The page output.
	 *
	 * @return void
	 */
	public function output_content() {
		?>
		<div class="wpcode-plugin-page wpcode-plugin-page-duplicator">
			<div class="wpcode-plugin-page-image">
				<?php wpcode_icon( 'duplicator', 90, 90, '198 55 90 396' ); ?>
			</div>
			<div class="wpcode-plugin-page-title">
				<h1>Duplicator – Migration & Backup Plugin by Duplicator</h1>
				<p>
					<?php esc_html_e( 'Easy, Fast and Secure WordPress Backups and Website Migration. Join 1,500,000+ professionals who trust Duplicator. No Code Required.', 'insert-headers-and-footers' ); ?>
				</p>
			</div>
			<section class="wpcode-plugin-screenshot">
				<div class="wpcode-plugin-screenshot-image">
					<img src="<?php echo esc_url( WPCODE_PLUGIN_URL ); // phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage?>admin/images/duplicator.jpg" alt="<?php esc_attr_e( 'Duplicator Screenshot', 'insert-headers-and-footers' ); ?>"/>
					<a href="<?php echo esc_url( WPCODE_PLUGIN_URL ); ?>admin/images/duplicator.jpg" data-lity>
						<?php wpcode_icon( 'search', 16, 16 ); ?>
					</a>
				</div>
				<ul>
					<li><?php esc_html_e( 'Secure Backups.', 'insert-headers-and-footers' ); ?></li>
					<li><?php esc_html_e( 'Website Cloning.', 'insert-headers-and-footers' ); ?></li>
					<li><?php esc_html_e( 'Cloud Storage.', 'insert-headers-and-footers' ); ?></li>
					<li><?php esc_html_e( '1-Click Restore.', 'insert-headers-and-footers' ); ?></li>
				</ul>
			</section>
			<section class="wpcode-plugin-step wpcode-plugin-step-install">
				<aside class="wpcode-plugin-page-step-num">
					<?php wpcode_icon( 'step-1', 50, 50, '0 0 100 100' ); ?>
					<i class="wpcode-plugin-page-step-loader wpcode-plugin-page-step-loader-hidden"></i>
				</aside>
				<div>
					<h2>
						<?php
						printf(
						// translators: %s is the plugin name.
							esc_html__( 'Install and Activate %s', 'insert-headers-and-footers' ),
							'Duplicator'
						)
						?>
					</h2>
					<p>
						<?php
						printf(
						// translators: %s is the plugin name.
							esc_html__( 'Install %s from the WordPress.org plugin repository.', 'insert-headers-and-footers' ),
							'Duplicator'
						)
						?>
					</p>
					<?php
					// Let's check if you can install plugins on this site.
					if ( current_user_can( 'install_plugins' ) && wp_is_file_mod_allowed( 'install_plugins' ) ) {
						?>
						<button class="wpcode-button wpcode-button-install-plugin" data-slug="duplicator">
							<?php
							printf(
							// translators: %s is the plugin name.
								esc_html__( 'Install %s', 'insert-headers-and-footers' ),
								'Duplicator'
							);
							?>
						</button>
						<?php
					} else {
						?>
						<p>
							<?php esc_html_e( 'Please ask your website administrator to install Duplicator.', 'insert-headers-and-footers' ); ?>
						</p>
						<?php
					}
					?>
				</div>
			</section>
		</div>
		<?php
	}

	/**
	 * For this page we output a title and the save button.
	 *
	 * @return void
	 */
	public function output_header_bottom() {
	}
}
includes/admin/pages/trait-wpcode-revisions-display.php000064400000007676151331545640017365 0ustar00<?php
/**
 * Trait for displaying code revisions in the admin.
 *
 * @package WPCode
 */

/**
 * Trait WPCode_Revisions_Display_Lite.
 */
trait WPCode_Revisions_Display_Lite {
	/**
	 * Get a code revisions list with a notice on top.
	 *
	 * @param string $title The title for the notice.
	 * @param string $description Description or text below the title.
	 * @param array  $button_1 Button 1 params for the get_upsell_box method.
	 * @param array  $button_2 Button 2 params for the get_upsell_box method.
	 *
	 * @return string
	 */
	public function code_revisions_list_with_notice( $title, $description = '', $button_1 = array(), $button_2 = array() ) {
		$html = '<div class="wpcode-revisions-list-area">';

		$html .= $this->get_code_revisions_empty_list();
		$html .= WPCode_Admin_Page::get_upsell_box(
			$title,
			$description,
			$button_1,
			$button_2
		);
		$html .= '</div>';// .wpcode-revisions-list-area.

		return $html;
	}

	/**
	 * Get the markup for a revision item in the list of revisions.
	 *
	 * @param int    $author_id The author id to display the avatar and name for.
	 * @param string $date The date used to display time passed.
	 * @param array  $actions Links specific to this row.
	 *
	 * @return string
	 */
	public function get_revision_item( $author_id, $date, $actions = array() ) {
		$list_item = '<li class="wpcode-revision-list-item">';
		if ( ! empty( $author_id ) ) {
			$list_item .= get_avatar( $author_id, 30 );
			$list_item .= sprintf(
				'<span class="wpcode-revision-list-author">%s</span>',
				get_the_author_meta( 'display_name', $author_id )
			);
		} else {
			$list_item .= sprintf(
				'<img src="%s" class="avatar avatar-30 photo" alt="Avatar" width="30" height="30" />',
				esc_url( WPCODE_PLUGIN_URL . 'admin/images/default-user-icon.png' )
			);
			$list_item .= '<span class="wpcode-revision-list-author">John Doe</span>';
		}
		$list_item .= sprintf(
			'<span class="wpcode-revision-list-date">%s</span>',
			$date
		);
		if ( ! empty( $actions ) ) {
			$list_item .= sprintf(
				'<span class="wpcode-revision-list-item-actions">%s</span>',
				implode( '', $actions )
			);
		}
		$list_item .= '</li>';

		return $list_item;
	}

	/**
	 * Get a list of code revisions to use behind the notice.
	 *
	 * @return string
	 */
	public function get_code_revisions_empty_list() {
		$list           = array();
		$post_modified  = isset( $this->snippet ) ? strtotime( $this->snippet->get_post_data()->post_modified ) : time();
		$snippet_author = isset( $this->snippet ) ? $this->snippet->get_snippet_author() : get_current_user_id();
		$revisions_data = array(
			$post_modified,
			$post_modified - DAY_IN_SECONDS,
			$post_modified - WEEK_IN_SECONDS,
			$post_modified - 2 * WEEK_IN_SECONDS,
			$post_modified - MONTH_IN_SECONDS,
			$post_modified - 2 * MONTH_IN_SECONDS,
		);

		$compare = sprintf(
			'<span>%s</span>',
			esc_html__( 'Compare', 'insert-headers-and-footers' )
		);
		$view    = sprintf(
			'<span>%s</a>',
			get_wpcode_icon( 'eye', 16, 11, '0 0 16 11' )
		);

		foreach ( $revisions_data as $revisions_date ) {
			$updated = sprintf(
			// Translators: time since the revision has been updated.
				esc_html__( 'Updated %s ago', 'insert-headers-and-footers' ),
				human_time_diff( $revisions_date )
			);

			$list[] = $this->get_revision_item(
				0,
				$updated,
				array(
					$compare,
					$view,
				)
			);
		}

		$html = '<div class="wpcode-blur-area">';

		$html .= sprintf(
			'<ul class="wpcode-revisions-list">%s</ul>',
			implode( '', $list )
		);

		$button_text = sprintf(
		// Translators: The placeholder gets replaced with the extra number of revisions available.
			esc_html__( '%d Other Revisions', 'insert-headers-and-footers' ),
			3
		);

		$html .= sprintf(
			'<button type="button" class="wpcode-button wpcode-button-secondary wpcode-button-icon" id="wpcode-show-all-snippets">%1$s %2$s</button>',
			get_wpcode_icon( 'rewind', 16, 14 ),
			$button_text
		);

		$html .= '</div>';// .wpcode-blur-area.

		return $html;
	}
}
includes/admin/pages/trait-wpcode-my-library-markup.php000064400000016415151331545640017254 0ustar00<?php

trait WPCode_My_Library_Markup_Lite {

	/**
	 * Get an array of items for the library blurred background.
	 *
	 * @return array
	 */
	public function get_placeholder_library_items() {
		$categories = array(
			'*'           => 'Most Popular',
			'admin'       => 'Admin',
			'archive'     => 'Archive',
			'attachments' => 'Attachments',
			'comments'    => 'Comments',
			'disable'     => 'Disable',
			'login'       => 'Login',
			'rss-feeds'   => 'RSS Feeds',
			'search'      => 'Search',
		);

		$categories_parsed = array();
		foreach ( $categories as $slug => $name ) {
			$categories_parsed[] = array(
				'slug' => $slug,
				'name' => $name,
			);
		}

		return array(
			'categories' => $categories_parsed,
			'snippets'   => array(
				array(
					'library_id' => 0,
					'title'      => 'Add an Edit Post Link to Archives',
					'code'       => '',
					'note'       => 'Make it easier to edit posts when viewing archives. Or on single pages. If you...',
					'categories' =>
						array(
							0 => 'archive',
						),
					'code_type'  => 'php',
				),
				array(
					'library_id' => 0,
					'title'      => 'Add Featured Images to RSS Feeds',
					'code'       => '',
					'note'       => 'Extend your site\'s RSS feeds by including featured images in the feed.',
					'categories' =>
						array(
							0 => 'rss-feeds',
						),
					'code_type'  => 'php',
				),
				array(
					'library_id' => 0,
					'title'      => 'Add the Page Slug to Body Class',
					'code'       => '',
					'note'       => 'Add the page slug to the body class for better styling.',
					'categories' =>
						array(
							0 => 'archive',
						),
					'code_type'  => 'php',
				),
				array(
					'library_id' => 0,
					'title'      => 'Allow SVG Files Upload',
					'code'       => '',
					'note'       => 'Add support for SVG files to be uploaded in WordPress media.',
					'categories' =>
						array(
							0 => 'most-popular',
							1 => 'attachments',
						),
					'code_type'  => 'php',
				),
				array(
					'library_id' => 0,
					'title'      => 'Automatically Link Featured Images to Posts',
					'code'       => '',
					'note'       => 'Wrap featured images in your theme in links to posts.',
					'categories' =>
						array(
							0 => 'attachments',
						),
					'code_type'  => 'php',
				),
				array(
					'library_id' => 0,
					'title'      => 'Change "Howdy Admin" in Admin Bar',
					'code'       => '',
					'note'       => 'Customize the "Howdy" message in the admin bar.',
					'categories' =>
						array(
							0 => 'admin',
						),
					'code_type'  => 'php',
				),
				array(
					'library_id' => 0,
					'title'      => 'Change Admin Panel Footer Text',
					'code'       => '',
					'note'       => 'Display custom text in the admin panel footer with this snippet.',
					'categories' =>
						array(
							0 => 'admin',
						),
					'code_type'  => 'php',
				),
				array(
					'library_id' => 0,
					'title'      => 'Change Excerpt Length',
					'code'       => '',
					'note'       => 'Update the length of the Excerpts on your website using this snippet.',
					'categories' =>
						array(
							0 => 'archive',
						),
					'code_type'  => 'php',
				),
				array(
					'library_id' => 0,
					'title'      => 'Change Read More Text for Excerpts',
					'code'       => '',
					'note'       => 'Customize the "Read More" text that shows up after excerpts.',
					'categories' =>
						array(
							0 => 'archive',
						),
					'code_type'  => 'php',
				),
				array(
					'library_id' => 0,
					'title'      => 'Completely Disable Comments',
					'code'       => '',
					'note'       => 'Disable comments for all post types, in the admin and the frontend.',
					'categories' =>
						array(
							0 => 'most-popular',
							1 => 'comments',
						),
					'code_type'  => 'php',
				),
				array(
					'library_id' => 0,
					'title'      => 'Delay Posts in RSS Feeds',
					'code'       => '',
					'note'       => 'Add a delay before published posts show up in the RSS feeds.',
					'categories' =>
						array(
							0 => 'rss-feeds',
						),
					'code_type'  => 'php',
				),
				array(
					'library_id' => 0,
					'title'      => 'Disable Attachment Pages',
					'code'       => '',
					'note'       => 'Hide the Attachment/Attachments pages on the frontend from all visitors.',
					'categories' =>
						array(
							0 => 'most-popular',
							1 => 'attachments',
						),
					'code_type'  => 'php',
				),
				array(
					'library_id' => 0,
					'title'      => 'Disable Automatic Updates',
					'code'       => '',
					'note'       => 'Use this snippet to completely disable automatic updates on your website.',
					'categories' =>
						array(
							0 => 'most-popular',
							1 => 'disable',
						),
					'code_type'  => 'php',
				),
				array(
					'library_id' => 0,
					'title'      => 'Disable Automatic Updates Emails',
					'code'       => '',
					'note'       => 'Stop getting emails about automatic updates on your WordPress site.',
					'categories' =>
						array(
							0 => 'most-popular',
							1 => 'disable',
						),
					'code_type'  => 'php',
				),
				array(
					'library_id' => 0,
					'title'      => 'Disable Gutenberg Editor (use Classic Editor)',
					'code'       => '',
					'note'       => 'Switch back to the Classic Editor by disablling the Block Editor.',
					'categories' =>
						array(
							0 => 'most-popular',
							1 => 'admin',
						),
					'code_type'  => 'php',
				),
			),
		);
	}

	/**
	 * Get placeholder library items in a blurred box.
	 *
	 * @return void
	 */
	public function blurred_placeholder_items() {
		$snippets = $this->get_placeholder_library_items();
		echo '<div class="wpcode-blur-area">';
		$this->get_library_markup( $snippets['categories'], $snippets['snippets'] );
		echo '</div>';
	}

	/**
	 * Get the markup for the "My Library" section.
	 *
	 * @return void
	 */
	public function get_my_library_markup() {
		$this->blurred_placeholder_items();
		// Show upsell.
		echo WPCode_Admin_Page::get_upsell_box( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
			esc_html__( 'My Library is a PRO Feature', 'insert-headers-and-footers' ),
			'<p>' . esc_html__( 'Upgrade to WPCode PRO today and save your snippets in your private library directly from the plugin and import them with 1-click on other sites.', 'insert-headers-and-footers' ) . '</p>',
			array(
				'text' => esc_html__( 'Upgrade to PRO and Unlock "My Library"', 'insert-headers-and-footers' ),
				'url'  => esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'add-snippet', 'my-library', 'upgrade-and-unlock' ) ),
			),
			array(
				'text' => esc_html__( 'Learn more about all the features', 'insert-headers-and-footers' ),
				'url'  => esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'add-snippet', 'my-library', 'features' ) ),
			),
			array(
				esc_html__( 'Save your snippets to your library', 'insert-headers-and-footers' ),
				esc_html__( '1-click import snippets from you library', 'insert-headers-and-footers' ),
				esc_html__( 'Deploy new snippets from your account', 'insert-headers-and-footers' ),
				esc_html__( 'Update snippets across all your sites', 'insert-headers-and-footers' ),
				esc_html__( 'Set up new websites faster', 'insert-headers-and-footers' ),
				esc_html__( 'Edit snippets in the WPCode Library', 'insert-headers-and-footers' ),
			)
		);
	}
}includes/admin/pages/class-wpcode-admin-page-pixel.php000064400000072344151331545640016776 0ustar00<?php
/**
 * The Conversion Pixels page.
 *
 * @package WPCode
 */

/**
 * Class WPCode_Admin_Page_Pixel.
 */
class WPCode_Admin_Page_Pixel extends WPCode_Admin_Page {

	/**
	 * The page slug to be used when adding the submenu.
	 *
	 * @var string
	 */
	public $page_slug = 'wpcode-pixel';

	/**
	 * Default view.
	 *
	 * @var string
	 */
	public $view = 'facebook';

	/**
	 * The capability required to view this page.
	 *
	 * @var string
	 */
	protected $capability = 'wpcode_manage_conversion_pixels';

	/**
	 * Call this just to set the page title translatable.
	 */
	public function __construct() {
		$this->page_title = __( 'Conversion Pixels', 'insert-headers-and-footers' );
		parent::__construct();
	}

	/**
	 * The Conversion Pixels page output.
	 *
	 * @return void
	 */
	public function output_content() {
		if ( method_exists( $this, 'output_view_' . $this->view ) ) {
			echo '<div class="wpcode-blur-area">';
			call_user_func( array( $this, 'output_view_' . $this->view ) );
			echo '</div>';
			echo $this->get_pixel_overlay(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
		}
	}

	/**
	 * Get the overlay for the pixel settings.
	 *
	 * @return string
	 */
	public function get_pixel_overlay() {

		$text = sprintf(
		// translators: %1$s and %2$s are <u> tags.
			'<p>' . esc_html__( 'While you can always add pixels manually using code snippets, our Conversion Pixels addon helps you %1$ssave time%2$s while %1$sreducing errors%2$s. It lets you properly implement Facebook, Google, Pinterest, TikTok and Snapchat ads tracking with deep integrations for eCommerce events, interaction measurement, and more. This addon is available on WPCode Plus plan or higher.', 'insert-headers-and-footers' ) . '</p>',
			'<u>',
			'</u>'
		);

		return self::get_upsell_box(
			esc_html__( 'Conversion Pixels Addon is a PRO Feature', 'insert-headers-and-footers' ),
			$text,
			array(
				'text' => esc_html__( 'Upgrade to WPCode PRO', 'insert-headers-and-footers' ),
				'url'  => esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'conversion-pixels', 'tab-' . $this->view, 'upgrade-to-pro' ) ),
			),
			array(),
			array(
				esc_html__( 'Seamless integration with WooCommerce, Easy Digital Downloads and MemberPress', 'insert-headers-and-footers' ),
				esc_html__( 'Works with Facebook, Google Ads, Pinterest, TikTok and Snapchat', 'insert-headers-and-footers' ),
				esc_html__( 'No coding required', 'insert-headers-and-footers' ),
				esc_html__( '1-click setup for conversion tracking', 'insert-headers-and-footers' ),
			)
		);
	}

	/**
	 * Setup page-specific views.
	 *
	 * @return void
	 */
	protected function setup_views() {
		$this->views = array(
			'facebook'       => __( 'Facebook', 'insert-headers-and-footers' ),
			'google'         => __( 'Google', 'insert-headers-and-footers' ),
			'pinterest'      => __( 'Pinterest', 'insert-headers-and-footers' ),
			'tiktok'         => __( 'TikTok', 'insert-headers-and-footers' ),
			'snapchat'       => __( 'Snapchat', 'insert-headers-and-footers' ),
			'click_tracking' => __( 'Click Tracking', 'insert-headers-and-footers' ),
		);
	}

	/**
	 * For this page we output a menu.
	 *
	 * @return void
	 */
	public function output_header_bottom() {
		?>
		<ul class="wpcode-admin-tabs">
			<?php
			foreach ( $this->views as $slug => $label ) {
				$class = $this->view === $slug ? 'active' : '';
				?>
				<li>
					<a href="<?php echo esc_url( $this->get_view_link( $slug ) ); ?>" class="<?php echo esc_attr( $class ); ?>"><?php echo esc_html( $label ); ?></a>
				</li>
			<?php } ?>
		</ul>
		<?php
	}

	/**
	 * Form for Facebook Pixel.
	 *
	 * @return void
	 */
	public function output_view_facebook() {
		?>
		<h2><?php esc_html_e( 'Facebook Pixel', 'insert-headers-and-footers' ); ?></h2>
		<?php
		$this->metabox_row(
			__( 'Facebook Pixel ID', 'insert-headers-and-footers' ),
			$this->get_input_text(
				'facebook_pixel_id',
				$this->get_option( 'facebook_pixel_id', '' ),
				sprintf(
				// translators: %1$s and %2$s are the opening and closing anchor tags.
					__( 'You can find your Facebook Pixel ID in the Facebook Ads Manager. %1$sRead our step by step directions%2$s. ', 'insert-headers-and-footers' ),
					'<a target="_blank" href="' . wpcode_utm_url( 'https://wpcode.com/docs/how-to-find-your-facebook-pixel-id-and-conversions-api-token/', 'conversion-pixels', 'facebook', 'pixel' ) . '">',
					'</a>'
				)
			),
			'facebook_pixel_id'
		);
		$this->metabox_row(
			__( 'Conversions API Token', 'insert-headers-and-footers' ),
			$this->get_input_text(
				'facebook_pixel_api_token',
				$this->get_option( 'facebook_pixel_api_token', '' ),
				__( 'The Conversions API token allows you to send API events that are more reliable and can improve audience targeting.', 'insert-headers-and-footers' ),
				true
			),
			'facebook_pixel_api_token'
		);
		$this->metabox_row(
			__( 'Facebook Pixel Events', 'insert-headers-and-footers' ),
			$this->get_checkbox_inputs(
				array(
					array(
						'label'       => __( 'PageView Event', 'insert-headers-and-footers' ),
						'name'        => 'page_view',
						'description' => __( 'Enable the PageView event to track and record page visits on all the pages of your website using the Facebook Pixel.', 'insert-headers-and-footers' ),
						'ecommerce'   => false,
					),
				),
				'facebook_pixel_events' )
		);
		$this->metabox_row(
			__( 'eCommerce Events Tracking', 'insert-headers-and-footers' ),
			$this->get_ecommerce_events_input() . $this->get_checkbox_inputs( $this->get_fb_pixel_events_inputs(), 'facebook_pixel_events' )
		);
		wp_nonce_field( 'wpcode-save-facebook-pixel-data', 'wpcode-pixel-nonce' );
		?>
		<button type="submit" class="wpcode-button">
			<?php esc_html_e( 'Save Changes', 'insert-headers-and-footers' ); ?>
		</button>
		<?php
	}

	/**
	 * Form for Google Pixel.
	 *
	 * @return void
	 */
	public function output_view_google() {
		?>
		<h2><?php esc_html_e( 'Google Analytics & Ads Tracking', 'insert-headers-and-footers' ); ?></h2>
		<?php
		$this->metabox_row(
			__( 'Google Analytics ID', 'insert-headers-and-footers' ),
			$this->get_input_text(
				'google_analytics_id',
				$this->get_option( 'google_analytics_id', '' ),
				sprintf(
				// translators: %1$s and %2$s are the opening and closing anchor tags.
					__( 'You can find your Google Analytics ID in the Google Analytics Admin panel. %1$sRead our step by step directions%2$s. ', 'insert-headers-and-footers' ),
					'<a target="_blank" href="' . wpcode_utm_url( 'https://wpcode.com/docs/how-to-find-your-google-analytics-id/', 'conversion-pixels', 'google', 'pixel' ) . '">',
					'</a>'
				)
			),
			'google_analytics_id'
		);
		$this->metabox_row(
			__( 'Google Ads Tag ID', 'insert-headers-and-footers' ),
			$this->get_input_text(
				'google_ads_id',
				$this->get_option( 'google_ads_id', '' ),
				sprintf(
				// translators: %1$s and %2$s are the opening and closing anchor tags.
					__( 'You can find your Google Ads Tag ID in the Google Ads Settings under Google Tag. %1$sRead our step by step directions%2$s. ', 'insert-headers-and-footers' ),
					'<a target="_blank" href="' . wpcode_utm_url( 'https://wpcode.com/docs/how-to-find-your-google-ads-tag-id/', 'conversion-pixels', 'google', 'pixel' ) . '">',
					'</a>'
				)
			),
			'google_ads_id'
		);
		$this->metabox_row(
			__( 'Ads Conversion Label', 'insert-headers-and-footers' ),
			$this->get_input_text(
				'google_ads_label',
				$this->get_option( 'google_ads_label', '' ),
				sprintf(
				// translators: %1$s and %2$s are the opening and closing anchor tags.
					__( 'Add your Google Ads Conversion Label for tracking conversion events. %1$sLearn More%2$s.', 'insert-headers-and-footers' ),
					'<a target="_blank" href="' . wpcode_utm_url( 'https://wpcode.com/docs/how-to-find-your-google-ads-tag-id/', 'conversion-pixels', 'google', 'pixel' ) . '">',
					'</a>'
				)
			),
			'google_ads_label'
		);
		$this->metabox_row(
			__( 'Google Events', 'insert-headers-and-footers' ),
			$this->get_checkbox_inputs(
				array(
					array(
						'label'       => __( 'PageView Event', 'insert-headers-and-footers' ),
						'name'        => 'page_view',
						'description' => __( 'Enable PageView event on all pages.', 'insert-headers-and-footers' ),
						'ecommerce'   => false,
					),
				),
				'google_pixel_events'
			)
		);
		$this->metabox_row(
			__( 'eCommerce Events Tracking', 'insert-headers-and-footers' ),
			$this->get_ecommerce_events_input() . $this->get_checkbox_inputs( $this->get_google_pixel_events_inputs(), 'google_pixel_events' )
		);
		wp_nonce_field( 'wpcode-save-google-pixel-data', 'wpcode-pixel-nonce' );
		?>
		<button type="submit" class="wpcode-button">
			<?php esc_html_e( 'Save Changes', 'insert-headers-and-footers' ); ?>
		</button>
		<?php
	}

	/**
	 * Settings for the Pinterest pixel.
	 *
	 * @return void
	 */
	public function output_view_pinterest() {
		?>
		<h2><?php esc_html_e( 'Pinterest Tag', 'insert-headers-and-footers' ); ?></h2>
		<?php
		$this->metabox_row(
			__( 'Tag ID', 'insert-headers-and-footers' ),
			$this->get_input_text(
				'pinterest_id',
				$this->get_option( 'pinterest_id', '' ),
				sprintf(
				// translators: %1$s and %2$s are the opening and closing anchor tags.
					__( 'You can find your Tag id in your Pinterest Business account. %1$sRead our step by step directions%2$s. ', 'insert-headers-and-footers' ),
					'<a target="_blank" href="' . wpcode_utm_url( 'https://wpcode.com/docs/how-to-find-your-pinterest-tag-id-and-conversion-access-token/', 'conversion-pixels', 'pinterest', 'pixel' ) . '">',
					'</a>'
				)
			),
			'pinterest_id'
		);
		$this->metabox_row(
			__( 'Ad Account ID', 'insert-headers-and-footers' ),
			$this->get_input_text(
				'pinterest_ad_account_id',
				$this->get_option( 'pinterest_ad_account_id', '' ),
				sprintf(
				// translators: %1$s and %2$s are the opening and closing anchor tags.
					__( 'You can find your Ad Account ID in your Pinterest Business account. %1$sRead more%2$s. ', 'insert-headers-and-footers' ),
					'<a target="_blank" href="' . wpcode_utm_url( 'https://wpcode.com/docs/how-to-find-your-pinterest-tag-id-and-conversion-access-token/', 'conversion-pixels', 'pinterest', 'pixel' ) . '">',
					'</a>'
				)
			),
			'pinterest_ad_account_id'
		);
		$this->metabox_row(
			__( 'Conversion Access Token', 'insert-headers-and-footers' ),
			$this->get_input_text(
				'pinterest_conversion_token',
				$this->get_option( 'pinterest_conversion_token', '' ),
				sprintf(
				// translators: %1$s and %2$s are the opening and closing anchor tags.
					__( 'You can find your Conversion Access Token under Ads > Conversions > Conversion access token. %1$sRead more%2$s. ', 'insert-headers-and-footers' ),
					'<a target="_blank" href="' . wpcode_utm_url( 'https://wpcode.com/docs/how-to-find-your-pinterest-tag-id-and-conversion-access-token/', 'conversion-pixels', 'pinterest', 'pixel' ) . '">',
					'</a>'
				),
				true
			),
			'pinterest_conversion_token'
		);
		$this->metabox_row(
			__( 'eCommerce Events Tracking', 'insert-headers-and-footers' ),
			$this->get_ecommerce_events_input() . $this->get_checkbox_inputs( $this->get_pinterest_pixel_events_inputs(), 'pinterest_pixel_events' )
		);
		wp_nonce_field( 'wpcode-save-pinterest-pixel-data', 'wpcode-pixel-nonce' );
		?>
		<button type="submit" class="wpcode-button">
			<?php esc_html_e( 'Save Changes', 'insert-headers-and-footers' ); ?>
		</button>
		<?php
	}

	/**
	 * Settings for the Pinterest pixel.
	 *
	 * @return void
	 */
	public function output_view_tiktok() {
		?>
		<h2><?php esc_html_e( 'TikTok Pixel', 'insert-headers-and-footers' ); ?></h2>
		<?php
		$this->metabox_row(
			__( 'Pixel ID', 'insert-headers-and-footers' ),
			$this->get_input_text(
				'tiktok_pixel_id',
				$this->get_option( 'tiktok_pixel_id', '' ),
				sprintf(
				// translators: %1$s and %2$s are the opening and closing anchor tags.
					__( 'You can find your Pixel id in your TikTok Business Account. %1$sRead our step by step directions%2$s.', 'insert-headers-and-footers' ),
					'<a target="_blank" href="' . wpcode_utm_url( 'https://wpcode.com/docs/how-to-find-your-tiktok-pixel-id-and-events-api-access-token/', 'conversion-pixels', 'tiktok', 'pixel' ) . '">',
					'</a>'
				)
			),
			'tiktok_pixel_id'
		);
		$this->metabox_row(
			__( 'Events API Access Token', 'insert-headers-and-footers' ),
			$this->get_input_text(
				'tiktok_access_token',
				$this->get_option( 'tiktok_access_token', '' ),
				sprintf(
				// translators: %1$s and %2$s are the opening and closing anchor tags.
					__( 'You can generate an access token in the Pixel Settings under Access Token Generation. %1$sRead more%2$s', 'insert-headers-and-footers' ),
					'<a target="_blank" href="' . wpcode_utm_url( 'https://wpcode.com/docs/how-to-find-your-tiktok-pixel-id-and-events-api-access-token/', 'conversion-pixels', 'tiktok', 'pixel' ) . '">',
					'</a>'
				),
				true
			),
			'tiktok_access_token'
		);
		$this->metabox_row(
			__( 'eCommerce Events Tracking', 'insert-headers-and-footers' ),
			$this->get_ecommerce_events_input() . $this->get_checkbox_inputs( $this->get_tiktok_pixel_events_inputs(), 'tiktok_pixel_events' )
		);
		wp_nonce_field( 'wpcode-save-tiktok-pixel-data', 'wpcode-pixel-nonce' );
		?>
		<button type="submit" class="wpcode-button">
			<?php esc_html_e( 'Save Changes', 'insert-headers-and-footers' ); ?>
		</button>
		<?php
	}

	/**
	 * Page for Snapchat pixel settings.
	 *
	 * @return void
	 */
	public function output_view_snapchat() {
		?>
		<h2><?php esc_html_e( 'Snapchat Pixel', 'insert-headers-and-footers' ); ?></h2>
		<?php
		$this->metabox_row(
			__( 'Snap Pixel ID', 'insert-headers-and-footers' ),
			$this->get_input_text(
				'snapchat_pixel_id',
				$this->get_option( 'snapchat_pixel_id', '' ),
				sprintf(
				// translators: %1$s and %2$s are the opening and closing anchor tags.
					__( 'You can find your Snapchat Pixel ID in the Snapchat Ads Manager. %1$sRead our step by step directions%2$s. ', 'insert-headers-and-footers' ),
					'<a target="_blank" href="' . wpcode_utm_url( 'https://wpcode.com/docs/how-to-find-your-snapchat-pixel-id-and-conversions-api-token/', 'conversion-pixels', 'snapchat', 'pixel' ) . '">',
					'</a>'
				),
				true
			),
			'snapchat_pixel_id'
		);
		$this->metabox_row(
			__( 'Conversions API Token', 'insert-headers-and-footers' ),
			$this->get_input_text(
				'snapchat_pixel_api_token',
				$this->get_option( 'snapchat_pixel_api_token', '' ),
				__( 'The Conversions API token allows you to send API events that are more reliable and can improve audience targeting.', 'insert-headers-and-footers' ),
				true
			),
			'snapchat_pixel_api_token'
		);
		$this->metabox_row(
			__( 'Snapchat Pixel Events', 'insert-headers-and-footers' ),
			$this->get_checkbox_inputs(
				array(
					array(
						'label'       => __( 'Pave View Event', 'insert-headers-and-footers' ),
						'name'        => 'page_view',
						'description' => __( 'Enable the PAGE_VIEW event to track and record page visits on all the pages of your website using the Snapchat Pixel.', 'insert-headers-and-footers' ),
						'ecommerce'   => false,
					),
				),
				'snapchat_pixel_events'
			)
		);
		$this->metabox_row(
			__( 'eCommerce Events Tracking', 'insert-headers-and-footers' ),
			$this->get_ecommerce_events_input() . $this->get_checkbox_inputs( $this->get_snap_pixel_events_inputs(), 'snapchat_pixel_events' )
		);
		wp_nonce_field( 'wpcode-save-snapchat-pixel-data', 'wpcode-pixel-nonce' );
		?>
		<button type="submit" class="wpcode-button">
			<?php esc_html_e( 'Save Changes', 'insert-headers-and-footers' ); ?>
		</button>
		<?php
	}

	/**
	 * Event options checkboxes for Facebook Pixel.
	 *
	 * @return array[]
	 */
	public function get_fb_pixel_events_inputs() {
		return array(
			array(
				'label'       => __( 'ViewContent Event', 'insert-headers-and-footers' ),
				'name'        => 'view_content',
				'description' => __( 'Turn on the "ViewContent" event to track views of product pages on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'view-content',
			),
			array(
				'label'       => __( 'AddtoCart Event', 'insert-headers-and-footers' ),
				'name'        => 'add_to_cart',
				'description' => __( 'Turn on the "AddToCart" event to track when items are added to a shopping cart on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'add-to-cart',
			),
			array(
				'label'       => __( 'InitiateCheckout Event', 'insert-headers-and-footers' ),
				'name'        => 'begin_checkout',
				'description' => __( 'Turn on the "InitiateCheckout" event to track when a user reaches the checkout page on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'begin-checkout',
			),
			array(
				'label'       => __( 'Purchase Event', 'insert-headers-and-footers' ),
				'name'        => 'purchase',
				'description' => __( 'Turn on the "Purchase" event to track successful purchases on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'purchase',
			),
		);
	}

	/**
	 * Events checkboxes for Google Analytics & Ads.
	 *
	 * @return array[]
	 */
	public function get_google_pixel_events_inputs() {
		return array(
			array(
				'label'       => __( 'View Item Event', 'insert-headers-and-footers' ),
				'name'        => 'view_item',
				'description' => __( 'Send the View Item event to track views of product pages on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'view-content',
			),
			array(
				'label'       => __( 'Add to Cart Event', 'insert-headers-and-footers' ),
				'name'        => 'add_to_cart',
				'description' => __( 'Send the Add to Cart event when a product is added to the cart.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'add-to-cart',
			),
			array(
				'label'       => __( 'Begin Checkout Event', 'insert-headers-and-footers' ),
				'name'        => 'begin_checkout',
				'description' => __( 'Send the Begin Checkout event when the user sees the checkout page.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'begin-checkout',
			),
			array(
				'label'       => __( 'Purchase Event', 'insert-headers-and-footers' ),
				'name'        => 'purchase',
				'description' => __( 'Send the Purchase event when the user completes a purchase.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'purchase',
			),
			array(
				'label'       => __( 'Conversion Event', 'insert-headers-and-footers' ),
				'name'        => 'conversion',
				'description' => __( 'Send the conversion event with the Google Ads label set above on a successful purchase.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'conversion',
			),
		);
	}

	/**
	 * Events checkboxes for Pinterest.
	 *
	 * @return array[]
	 */
	public function get_pinterest_pixel_events_inputs() {
		return array(
			array(
				'label'       => __( 'PageVisit Product Event', 'insert-headers-and-footers' ),
				'name'        => 'pagevisit_product',
				'description' => __( 'Turn on the "PageVisit" event to track views of product pages on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'view-content ',
			),
			array(
				'label'       => __( 'Add to Cart Event', 'insert-headers-and-footers' ),
				'name'        => 'add_to_cart',
				'description' => __( 'Turn on the Add to Cart event to track when items are added to a shopping cart on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'add-to-cart',
			),
			array(
				'label'       => __( 'Checkout PageVisit Event', 'insert-headers-and-footers' ),
				'name'        => 'begin_checkout',
				'description' => __( 'Enable the Checkout PageVisit event to track when a user reaches the checkout page on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'begin-checkout',
			),
			array(
				'label'       => __( 'Checkout Event', 'insert-headers-and-footers' ),
				'name'        => 'purchase',
				'description' => __( 'Turn on the "Checkout" event to track successful purchases on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'purchase',
			),
		);
	}

	/**
	 * Events checkboxes for TikTok.
	 *
	 * @return array[]
	 */
	public function get_tiktok_pixel_events_inputs() {
		return array(
			array(
				'label'       => __( 'ViewContent Product Event', 'insert-headers-and-footers' ),
				'name'        => 'view_content',
				'description' => __( 'Turn on the "ViewContent" event to track views of product pages on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'view-content',
			),
			array(
				'label'       => __( 'Add to Cart Event', 'insert-headers-and-footers' ),
				'name'        => 'add_to_cart',
				'description' => __( 'Turn on the "AddToCart" event to track when items are added to a shopping cart on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'add-to-cart',
			),
			array(
				'label'       => __( 'InitiateCheckout Event', 'insert-headers-and-footers' ),
				'name'        => 'begin_checkout',
				'description' => __( 'Turn on the "InitiateCheckout" event to track when a user reaches the checkout page on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'begin-checkout',
			),
			array(
				'label'       => __( 'PlaceAnOrder Event', 'insert-headers-and-footers' ),
				'name'        => 'purchase',
				'description' => __( 'Turn on the "PlaceAnOrder" event to track successful purchases on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'purchase',
			),
		);
	}

	/**
	 * Get the markup for a list of checkboxes.
	 *
	 * @param array  $inputs The details for the checkbox inputs.
	 * @param string $name The name of the inputs.
	 * @param string $pixel_options_key The key of the pixel options (defaults to $name above if not set).
	 *
	 * @return string
	 */
	public function get_checkbox_inputs( $inputs, $name, $pixel_options_key = '' ) {
		$markup = '';
		if ( empty( $pixel_options_key ) ) {
			$pixel_options_key = $name;
		}
		$pixel_options     = $this->get_option( $pixel_options_key, array() );
		$ecommerce_vendors = $this->ecommerce_available();

		foreach ( $inputs as $input ) {
			$row_class  = isset( $input['css_class'] ) ? $input['css_class'] : '';
			$input_name = $name . '[' . $input['name'] . ']';
			$checked    = ! empty( $pixel_options[ $input['name'] ] );
			if ( $input['ecommerce'] && empty( $ecommerce_vendors ) ) {
				$row_class = ' wpcode-checkbox-row-disabled';
			}
			$markup .= '<div class="wpcode-checkbox-row ' . $row_class . '">';
			$markup .= $this->get_checkbox_toggle(
				$checked,
				$input_name,
				$input['description'],
				1,
				$input['label']
			);
			$markup .= '</div>';
		}

		return $markup;
	}

	/**
	 * There's no actual value to show in this instance.
	 *
	 * @param string $key The key of the option.
	 * @param mixed  $default The default value of the option.
	 *
	 * @return mixed
	 */
	public function get_option( $key, $default = false ) {
		return $default;
	}

	/**
	 * Whether we have a supported eCommerce plugin installed.
	 *
	 * @return array
	 */
	public function ecommerce_available() {
		return array();
	}

	/**
	 * Get the markup for the eCommerce events input.
	 *
	 * @return string
	 */
	public function get_ecommerce_events_input() {
		$providers = $this->ecommerce_available();

		$markup = '<div class="wpcode-label-text-row">';
		if ( empty( $providers ) ) {
			$markup .= '<p><strong>' . __( 'Disabled, no eCommerce Platform Detected', 'insert-headers-and-footers' ) . '</strong></p>';
		} else {
			foreach ( $providers as $provider ) {
				// translators: %s is the name of the eCommerce provider.
				$markup .= '<p><strong>' . sprintf( __( '%s Tracking Enabled', 'insert-headers-and-footers' ), $provider ) . '</strong></p>';
			}
		}
		$markup .= '<p>';
		$markup .= sprintf(
		// translators: %s a html break.
			__( 'Advanced eCommerce tracking is available for WooCommerce, Easy Digital Downloads and MemberPress. %s These plugins are detected automatically and when available you can toggle individual events using the options below.', 'insert-headers-and-footers' ),
			'</br>'
		);
		$markup .= '</p>';
		$markup .= '</div>';

		return $markup;
	}

	/**
	 * Event options checkboxes for the Snapchat Pixel.
	 *
	 * @return array[]
	 */
	public function get_snap_pixel_events_inputs() {
		return array(
			array(
				'label'       => __( 'View Content Event', 'insert-headers-and-footers' ),
				'name'        => 'view_content',
				'description' => __( 'Turn on the "VIEW_CONTENT" event to track views of product pages on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'view-content',
			),
			array(
				'label'       => __( 'Add to Cart Event', 'insert-headers-and-footers' ),
				'name'        => 'add_to_cart',
				'description' => __( 'Turn on the "ADD_CART" event to track when items are added to a shopping cart on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'add-to-cart',
			),
			array(
				'label'       => __( 'Start Checkout Event', 'insert-headers-and-footers' ),
				'name'        => 'begin_checkout',
				'description' => __( 'Turn on the "START_CHECKOUT" event to track when a user reaches the checkout page on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'begin-checkout',
			),
			array(
				'label'       => __( 'Purchase Event', 'insert-headers-and-footers' ),
				'name'        => 'purchase',
				'description' => __( 'Turn on the "PURCHASE" event to track successful purchases on your website.', 'insert-headers-and-footers' ),
				'ecommerce'   => true,
				'css_class'   => 'purchase',
			),
		);
	}

	/**
	 * This is the page content for the Custom Events page.
	 *
	 * @return void
	 */
	public function output_view_click_tracking() {
		?>
		<h2><?php esc_html_e( 'Custom Click Tracking', 'insert-headers-and-footers' ); ?></h2>
		<p>
			<?php
			printf(
			/* Translators: %1$s is the opening link tag, %2$s is the closing link tag */
				esc_html__( 'Use this section to add custom click events to your site. You can add as many as you like. Each event can have multiple pixels and each pixel can have a custom event name and value. Read more about how to configure these settings in %1$sthis article%2$s', 'insert-headers-and-footers' ),
				'<a href="' . esc_url( wpcode_utm_url( 'https://wpcode.com/docs/conversion-pixels-custom-click-tracking/' ) ) . '" target="_blank" rel="noopener noreferrer">',
				'</a>'
			);
			?>
		</p>
		<div id="wpcode-settings-repeater" class="wpcode-settings-repeater-group">
			<div class="wpcode-settings-repeater-item">
				<?php
				$this->metabox_row(
					__( 'CSS Selector', 'insert-headers-and-footers' ),
					$this->get_input_text(
						'',
						'',
						sprintf(
						// Translators: %1$s is an opening anchor tag, %2$s is a closing anchor tag.
							esc_html__( 'Define the HTML element that triggers the event upon clicking (button, link, etc). Input the appropriate CSS selector here. %1$sLearn more%2$s', 'insert-headers-and-footers' ),
							'<a href="' . esc_url( wpcode_utm_url( 'https://wpcode.com/docs/finding-css-selector/' ) ) . '" target="_blank" rel="noopener noreferrer">',
							'</a>'
						),
						true
					)
				);
				$this->metabox_row(
					__( 'Event Name', 'insert-headers-and-footers' ),
					$this->get_input_text(
						'',
						'',
						__( 'Assign a unique identifier to your event for easy recognition and categorization. ', 'insert-headers-and-footers' )
					)
				);
				$this->metabox_row(
					__( 'Event Value', 'insert-headers-and-footers' ),
					$this->get_input_text(
						'',
						'',
						__( 'Input a numerical value for your event. This helps in quantifying user interactions for your tracking needs. ', 'insert-headers-and-footers' )
					)
				);
				?>
				<div class="wpcode-pixels-chooser-row">
					<div class="wpcode-metabox-form-row">
						<div class="wpcode-metabox-form-row-label">
							<label for="">Pixels </label>
						</div>
						<div class="wpcode-metabox-form-row-input">
							<p>Choose which pixels to enable for this event. </p>
							<p>You can choose a standard event for each pixel to override the custom event label set
								above.</p>
							<?php
							$pixels = array(
								'Facebook',
								'Google',
								'Pinterest',
								'TikTok',
								'Snapchat',
							);
							foreach ( $pixels as $pixel ) {
								echo '<div class="wpcode-checkbox-row">';
								echo $this->get_checkbox_toggle( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
									true,
									'',
									'',
									1,
									$pixel // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
								);
								echo '</div>';
							}
							?>
						</div>
					</div>
				</div>
			</div>
		</div>
		<button type="button" class="wpcode-button wpcode-button-secondary" id="wpcode-add-click-event">
			<?php esc_html_e( 'Add New Click Event', 'insert-headers-and-footers' ); ?>
		</button>
		<?php
		wp_nonce_field( 'wpcode-save-click-pixel-data', 'insert-headers-and-footers-nonce' );
		?>
		<button type="submit" class="wpcode-button">
			<?php esc_html_e( 'Save Changes', 'insert-headers-and-footers' ); ?>
		</button>
		<?php
	}
}
includes/admin/pages/class-wpcode-admin-page-snippet-manager.php000064400000260641151331545640020746 0ustar00<?php
/**
 * Snippet manager page - add/edit snippets.
 *
 * @package WPCode
 */

/**
 * WPCode_Admin_Page_Snippet_Manager class.
 */
class WPCode_Admin_Page_Snippet_Manager extends WPCode_Admin_Page {

	use WPCode_Revisions_Display_Lite;
	use WPCode_My_Library_Markup_Lite;

	/**
	 * The page slug to be used when adding the submenu.
	 *
	 * @var string
	 */
	public $page_slug = 'wpcode-snippet-manager';
	/**
	 * The publish button text depending on the status.
	 *
	 * @var string
	 */
	public $publish_button_text;
	/**
	 * The header title text depending on the status.
	 *
	 * @var string
	 */
	public $header_title;
	/**
	 * The default code type for this page is HTML.
	 *
	 * @var string
	 */
	public $code_type = 'html';
	/**
	 * The action for the nonce when the current page is submitted.
	 *
	 * @var string
	 */
	protected $action = 'wpcode-save-snippet';

	/**
	 * The name of the nonce used for saving.
	 *
	 * @var string
	 */
	protected $nonce_name = 'wpcode-save-snippet-nonce';
	/**
	 * The snippet id.
	 *
	 * @var int
	 */
	protected $snippet_id;
	/**
	 * The snippet instance.
	 *
	 * @var WPCode_Snippet
	 */
	protected $snippet;

	/**
	 * Whether the snippet is currently edited by someone else.
	 *
	 * @var bool
	 */
	protected $is_locked = false;

	/**
	 * The name of user who locked the snippet.
	 *
	 * @var string
	 */
	protected $locked_by;

	/**
	 * Constructor.
	 */
	public function __construct() {
		// Translators: This adds the name of the plugin "WPCode".
		$this->page_title = sprintf( __( 'Add %s Snippet', 'insert-headers-and-footers' ), 'WPCode' );
		$this->menu_title = sprintf( '+ %s', __( 'Add Snippet', 'insert-headers-and-footers' ) );
		parent::__construct();
	}

	/**
	 * Load the snippet if we're editing one.
	 *
	 * @return void
	 */
	public function load_snippet() {
		if ( isset( $_GET['snippet_id'] ) ) {  // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$snippet_post = get_post( absint( $_GET['snippet_id'] ) );  // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			if ( ! is_null( $snippet_post ) && $this->get_post_type() === $snippet_post->post_type ) {
				$this->snippet_id = $snippet_post->ID;
				$this->snippet    = wpcode_get_snippet( $snippet_post );

				// Let's check if it's not already being edited by someone else.
				$snippet_locked = wp_check_post_lock( $this->snippet_id );
				if ( $snippet_locked ) {
					$locked_by = get_user_by( 'id', $snippet_locked );
					if ( $locked_by ) {
						$this->locked_by = $locked_by->display_name;
						$this->is_locked = true;
					}
				} else {
					wp_set_post_lock( $this->snippet_id );
				}
			}
		}
	}

	/**
	 * Page-specific hooks.
	 *
	 * @return void
	 */
	public function page_hooks() {
		$this->can_edit = current_user_can( 'wpcode_edit_snippets' );
		// phpcs:disable WordPress.Security.NonceVerification.Recommended
		if ( isset( $_GET['snippet_id'] ) ) {
			$this->load_snippet();
			// If the post type does not match the page will act as an add new snippet page, the id will be ignored.
		} elseif ( ! isset( $_GET['custom'] ) ) {
			$this->show_library = apply_filters( 'wpcode_add_snippet_show_library', true );
		}
		// phpcs:enable WordPress.Security.NonceVerification.Recommended
		$this->publish_button_text = __( 'Save Snippet', 'insert-headers-and-footers' );
		$this->header_title        = __( 'Create Custom Snippet', 'insert-headers-and-footers' );
		if ( isset( $this->snippet ) ) {
			$this->header_title        = __( 'Edit Snippet', 'insert-headers-and-footers' );
			$this->publish_button_text = __( 'Update', 'insert-headers-and-footers' );
		}
		if ( $this->show_library ) {
			$this->header_title = __( 'Add Snippet', 'insert-headers-and-footers' );
		}
		$this->process_message();
		add_action( 'admin_init', array( $this, 'check_status' ) );
		add_filter( 'submenu_file', array( $this, 'change_current_menu' ) );
		add_filter( 'admin_title', array( $this, 'change_page_title' ), 15, 2 );
		add_action( 'admin_init', array( $this, 'submit_listener' ) );
		add_action( 'admin_init', array( $this, 'set_code_type' ) );
		add_filter( 'wpcode_admin_js_data', array( $this, 'add_conditional_rules_to_script' ) );
		add_filter( 'admin_body_class', array( $this, 'body_class_code_type' ) );
		add_filter( 'admin_body_class', array( $this, 'maybe_editor_height_auto' ) );
		add_filter( 'admin_body_class', array( $this, 'maybe_syntax_highlighting_disabled' ) );
		add_filter( 'admin_head', array( $this, 'maybe_editor_height' ) );
		add_action( 'wpcode_admin_notices', array( $this, 'maybe_show_error_notice' ) );

		add_filter( 'user_can_richedit', '__return_true', 150 ); // Override other plugins that disable TinyMCE.
	}

	/**
	 * Make sure we can't edit a trashed snippet.
	 *
	 * @return void
	 */
	public function check_status() {
		if ( ! isset( $this->snippet ) ) {
			return;
		}
		$post_data = $this->snippet->get_post_data();
		if ( 'trash' === $post_data->post_status ) {
			wp_die( esc_html__( 'You cannot edit this snippet because it is in the Trash. Please restore it and try again.', 'insert-headers-and-footers' ) );
		}
	}

	/**
	 * Process messages specific to this page.
	 *
	 * @return void
	 */
	public function process_message() {
		// phpcs:disable WordPress.Security.NonceVerification
		if ( ! isset( $_GET['message'] ) ) {
			$snippet_types = array_keys( wpcode()->execute->get_options() );
			if ( in_array( 'html', $snippet_types, true ) && ! current_user_can( 'unfiltered_html', 'wpcode-editor' ) ) {
				$this->set_error_message( __( 'Sorry, you only have read-only access to this page. Ask your administrator for assistance editing.', 'insert-headers-and-footers' ) );
			}

			return;
		}

		$error_details = '';
		if ( isset( $_GET['error'] ) ) {
			$error_details = sanitize_text_field( wp_unslash( $_GET['error'] ) );
		}

		$messages = array(
			1 => __( 'Snippet updated.', 'insert-headers-and-footers' ),
			2 => __( 'Snippet created & Saved.', 'insert-headers-and-footers' ),
			3 => __( 'We encountered an error activating your snippet, please check the syntax and try again.', 'insert-headers-and-footers' ),
			4 => __( 'Sorry, you are not allowed to change the status of the snippet.', 'insert-headers-and-footers' ),
			5 => __( 'Snippet updated & executed.', 'insert-headers-and-footers' ),
			6 => __( 'Your changes are saved but your snippet was deactivated due to an error, please check the syntax and try again.', 'insert-headers-and-footers' ),
		);
		$message  = absint( $_GET['message'] );
		// phpcs:enable WordPress.Security.NonceVerification

		if ( ! isset( $messages[ $message ] ) ) {
			return;
		}

		if ( in_array( $message, array( 3, 6 ), true ) && ! empty( $error_details ) ) {
			$error_message = sprintf(
			/* translators: %s: Error message. */
				esc_html__( 'Error message: %s', 'insert-headers-and-footers' ),
				'<code>' . $error_details . '</code>'
			);

			$messages[ $message ] .= ' ' . $error_message;
		}

		if ( $message > 2 && $message < 5 || 6 === $message ) {
			$this->set_error_message( $messages[ $message ] );
		} else {
			$this->set_success_message( $messages[ $message ] );
		}

		if ( in_array( $message, array( 1, 2 ), true ) ) {
			// The first time the user saves a snippet, if they did not activate it, highlight that and save a user meta to avoid the message from being displayed again.
			add_action( 'wpcode_admin_notices', array( $this, 'maybe_show_saved_without_activation_notice' ), 5 );
		}
	}

	/**
	 * The first time a snippet is saved without being activated, show a notice to the user.
	 *
	 * @return void
	 */
	public function maybe_show_saved_without_activation_notice() {
		if ( ! isset( $this->snippet ) ) {
			return;
		}
		$snippet = $this->snippet;
		if ( ! $snippet->is_active() && ! get_user_meta( get_current_user_id(), 'wpcode_snippet_activate_notice_shown', true ) ) {
			update_user_meta( get_current_user_id(), 'wpcode_snippet_activate_notice_shown', true );
			?>
			<div class="notice-warning fade notice is-dismissible">
				<p><?php esc_html_e( 'Don\'t forget to activate your snippet using the toggle next to the "Update" button when you are ready to start using it.', 'insert-headers-and-footers' ); ?></p>
			</div>
			<?php
		}
	}

	/**
	 * If we're editing a snippet, change the active submenu like WP does.
	 *
	 * @param null|string $submenu_file The submenu file.
	 *
	 * @return null|string
	 */
	public function change_current_menu( $submenu_file ) {
		if ( ! isset( $this->snippet_id ) ) {
			// Only change this for when editing a snippet.
			return $submenu_file;
		}

		return 'wpcode';
	}

	/**
	 * Change the admin page title when editing a snippet.
	 *
	 * @param string $title The admin page title to be displayed.
	 * @param string $original_title The page title before adding the WP suffix.
	 *
	 * @return string
	 */
	public function change_page_title( $title, $original_title ) {
		if ( isset( $this->snippet ) ) {
			// If the snippet post is loaded (so we're editing) replace the original page title with our edit snippet one.
			// Translators: this changes the edit page title to show the snippet title.
			return str_replace( $original_title, sprintf( __( 'Edit snippet "%s"', 'insert-headers-and-footers' ), $this->snippet->get_title() ), $title );
		}

		return $title;
	}

	/**
	 * The main page content.
	 *
	 * @return void
	 */
	public function output_content() {
		if ( $this->show_library ) {
			$this->show_snippet_library();
		} else {
			$this->show_snippet_editor();
		}
	}

	/**
	 * Show the snippet editor markup.
	 *
	 * @return void
	 */
	public function show_snippet_editor() {
		$this->field_title();
		$this->field_code_editor();
		$this->field_insert_options();
		$this->field_device_type();
		$this->field_conditional_logic();
		$this->field_code_revisions();
		$this->field_basic_info();
		$this->hidden_fields();
		wp_nonce_field( $this->action, $this->nonce_name );
	}

	/**
	 * Static items to be displayed in the library list when adding a new snippet.
	 *
	 * @param string $default_category The default category slug.
	 *
	 * @return array
	 */
	public function get_static_snippet_items( $default_category ) {
		return array(
			array(
				'library_id'    => 0,
				'title'         => esc_html__( 'Add Your Custom Code (New Snippet)', 'insert-headers-and-footers' ),
				'note'          => esc_html__( 'Choose this blank snippet to start from scratch and paste any custom code or simply write your own.', 'insert-headers-and-footers' ),
				'categories'    => array(
					$default_category,
				),
				'url'           => add_query_arg(
					array(
						'page'   => 'wpcode-snippet-manager',
						'custom' => true,
					),
					$this->admin_url( 'admin.php' )
				),
				'extra_classes' => array( 'wpcode-custom-snippet' ),
				'button_text'   => '+ ' . esc_html__( 'Add Custom Snippet', 'insert-headers-and-footers' ),
			),
			array(
				'library_id'    => 0,
				'title'         => esc_html__( 'Generate snippet using AI', 'insert-headers-and-footers' ),
				'note'          => esc_html__( 'Generate a new snippet specific to your needs leveraging the power of WPCode\'s AI integration.', 'insert-headers-and-footers' ),
				'categories'    => array(
					$default_category,
				),
				'pill_text'     => 'pro',
				'pill_class'    => 'light',
				'url'           => '#',
				'extra_classes' => array( 'wpcode-library-item-ai', 'wpcode-library-item-ai-not-available' ),
				'button_text'   => '+ ' . esc_html__( 'Generate Snippet', 'insert-headers-and-footers' ),
			),
		);
	}

	/**
	 * Show the snippet library markup.
	 *
	 * @return void
	 */
	public function show_snippet_library() {
		$library_data     = wpcode()->library->get_data();
		$categories       = $library_data['categories'];
		$snippets         = $library_data['snippets'];
		$default_category = isset( $categories[0]['slug'] ) ? $categories[0]['slug'] : '';

		$snippets = array_merge(
			$this->get_static_snippet_items( $default_category ),
			$snippets
		);

		?>
		<div class="wpcode-library-tab-navigation">
			<button class="wpcode-library-tab-button wpcode-library-tab-button-active" data-tab="library" role="button">
				<?php esc_html_e( 'Snippet Library', 'insert-headers-and-footers' ); ?>
			</button>
			<button class="wpcode-library-tab-button " data-tab="generator" role="button">
				<?php esc_html_e( 'Snippet Generators', 'insert-headers-and-footers' ); ?>
			</button>
			<button class="wpcode-library-tab-button" data-tab="plugin-snippets" role="button">
				<?php esc_html_e( 'Plugin Snippets', 'insert-headers-and-footers' ); ?>
			</button>
			<button class="wpcode-library-tab-button" data-tab="my-library" role="button">
				<?php esc_html_e( 'My Library', 'insert-headers-and-footers' ); ?>
			</button>
		</div>
		<div class="wpcode-library-tabs">
			<div class="wpcode-library-tab wpcode-library-tab-active" data-tab="library">
				<div class="wpcode-add-snippet-description">
					<?php
					$custom_url = add_query_arg(
						array(
							'page'   => 'wpcode-snippet-manager',
							'custom' => 1,
						),
						admin_url( 'admin.php' )
					);
					printf(
					// Translators: The placeholders add links to create a new custom snippet or the suggest-a-snippet form.
						esc_html__( 'To speed up the process you can select from one of our pre-made library, or you can start with a %1$sblank snippet%2$s and %1$screate your own%2$s. Have a suggestion for new snippet? %3$sWe’d love to hear it!%4$s', 'insert-headers-and-footers' ),
						'<a href="' . esc_url( $custom_url ) . '">',
						'</a>',
						'<a href="' . esc_url( wpcode_utm_url( 'https://wpcode.com/suggestions/?wpf78_8=Snippet Request', 'add-new', 'suggestions' ) ) . '" target="_blank">',
						'</a>'
					);
					?>
				</div>
				<?php $this->get_library_markup( $categories, $snippets ); ?>
			</div>
			<div class="wpcode-library-tab" data-tab="generator">
				<?php $categories = wpcode()->generator()->get_categories(); ?>
				<div class="wpcode-add-snippet-description">
					<?php esc_html_e( 'Create custom snippets for your website easily by filling out a form. You can also use this form to update your snippets later, without having to write or edit any code.', 'insert-headers-and-footers' ); ?>
				</div>
				<div class="wpcode-items-metabox wpcode-metabox">
					<?php $this->get_items_list_sidebar( $categories, __( 'All Generators', 'insert-headers-and-footers' ), __( 'Search Generators', 'insert-headers-and-footers' ) ); ?>
					<div class="wpcode-items-list">
						<ul class="wpcode-items-list-category">
							<?php
							$generators = wpcode()->generator()->get_all_generators();
							foreach ( $generators as $generator ) {
								$url      = add_query_arg(
									array(
										'page'      => 'wpcode-generator',
										'generator' => $generator->get_name(),
									),
									admin_url( 'admin.php' )
								);
								$button_1 = array(
									'tag'  => 'a',
									'url'  => $url,
									'text' => __( 'Generate', 'insert-headers-and-footers' ),
								);
								$this->get_list_item( $generator->get_name(), $generator->get_title(), $generator->get_description(), $button_1, array(), $generator->get_categories() );
							}
							?>
						</ul>
					</div>
				</div>
			</div>
			<div class="wpcode-library-tab" data-tab="plugin-snippets">
				<div class="wpcode-add-snippet-description">
					<?php esc_html_e( 'Easily add code snippets that extend other plugins on your site from a library maintained by the plugin authors.', 'insert-headers-and-footers' ); ?>
				</div>
				<?php
				$username_library    = wpcode()->library->get_username_snippets();
				$username_categories = $username_library['categories'];
				$username_snippets   = $username_library['snippets'];
				if ( empty( $username_snippets ) ) {
					$library_plugins = WPCode_Suggested_Plugins::get_library_plugins();
					?>
					<div class="wpcode-library-suggest-plugins wpcode-metabox">
						<p class="wpcode-suggestions-title"><?php esc_html_e( 'You don\'t have any plugins installed that extend the WPCode library, install any of the plugins below to start expanding the WPCode snippet library:', 'insert-headers-and-footers' ); ?></p>
						<div class="wpcode-plugin-suggestions">
							<?php foreach ( $library_plugins as $slug => $plugin ) { ?>
								<div class="wpcode-plugin-suggestion-plugin">
									<div class="wpcode-plugin-suggestion-plugin-icon">
										<img width="72" src="<?php echo esc_url( WPCODE_PLUGIN_URL . 'admin/images/' . $plugin['icon'] ); // phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage?>" alt="<?php echo esc_attr( $plugin['name'] ); ?>"/>
									</div>
									<div class="wpcode-plugin-suggesion-plugin-text">
										<h3><?php echo esc_html( $plugin['name'] ); ?></h3>
										<p><?php echo esc_html( $plugin['description'] ); ?></p>
										<button type=" button" class="wpcode-button wpcode-button-secondary wpcode-button-install-plugin" data-slug="<?php echo esc_attr( $slug ); ?>"><?php esc_html_e( 'Install Plugin', 'insert-headers-and-footers' ); ?></button>
									</div>
								</div>
							<?php } ?>
						</div>
					</div>
					<?php
				} else {
					$this->get_library_markup( $username_categories, $username_snippets );
				}
				?>
			</div>
			<div class="wpcode-library-tab" data-tab="my-library">
				<?php $this->get_my_library_markup(); ?>
			</div>
		</div>
		<?php
		$this->library_preview_modal_content();
		$this->library_connect_banner_template();
	}

	/**
	 * Output the snippet title field.
	 *
	 * @return void
	 */
	public function field_title() {
		$value = isset( $this->snippet ) ? $this->snippet->get_title() : '';
		?>
		<div class="wpcode-input-title">
			<input type="text" class="widefat wpcode-input-text" value="<?php echo esc_attr( $value ); ?>" name="wpcode_snippet_title" placeholder="<?php esc_attr_e( 'Add title for snippet', 'insert-headers-and-footers' ); ?>"/>
		</div>
		<?php
	}

	/**
	 * The main code editor field.
	 *
	 * @return void
	 */
	public function field_code_editor() {
		$value = isset( $this->snippet ) ? $this->snippet->get_code() : '';
		?>
		<div class="wpcode-code-textarea" data-code-type="<?php echo esc_attr( $this->code_type ); ?>">
			<div class="wpcode-flex">
				<div class="wpcode-column">
					<h2>
						<label for="wpcode_snippet_code"><?php esc_html_e( 'Code Preview', 'insert-headers-and-footers' ); ?></label>
					</h2>
				</div>
				<div class="wpcode-column">
					<?php $this->ai_generate_button(); ?>
					<?php wpcode()->smart_tags->smart_tags_picker( 'wpcode_snippet_code' ); ?>
					<?php $this->field_code_type(); ?>
				</div>
			</div>
			<textarea name="wpcode_snippet_code" id="wpcode_snippet_code" class="widefat" rows="8"><?php echo esc_textarea( $value ); ?></textarea>
			<?php
			wp_editor(
				$value,
				'wpcode_snippet_text',
				array(
					'wpautop'        => false,
					'default_editor' => 'tinymce',
					'tinymce'        => array(
						'height' => 330,
					),
				)
			);
			?>
		</div>
		<div class="wpcode-resize-handle"></div>
		<?php
	}

	/**
	 * Snippet type field.
	 *
	 * @return void
	 */
	public function field_code_type() {
		$snippet_types = wpcode()->execute->get_options();
		?>
		<div class="wpcode-input-select" id="wpcode_snippet_type-holder">
			<label for="wpcode_snippet_type"><?php esc_html_e( 'Code Type', 'insert-headers-and-footers' ); ?></label>
			<select name="wpcode_snippet_type" id="wpcode_snippet_type">
				<?php
				foreach ( $snippet_types as $key => $label ) {
					$class = wpcode()->execute->is_type_pro( $key ) ? 'wpcode-pro' : '';
					?>
					<option value="<?php echo esc_attr( $key ); ?>" <?php selected( $this->code_type, $key ); ?> class="<?php echo esc_attr( $class ); ?>">
						<?php echo esc_html( $label ); ?>
					</option>
				<?php } ?>
			</select>
		</div>
		<div class="wpcode-code-type-picker-backdrop" id="wpcode-code-type-picker-backdrop"></div>
		<div class="wpcode-code-type-picker">
			<div class="wpcode-code-type-picker-header">
				<h2><?php esc_html_e( 'Select the code type for your snippet:', 'insert-headers-and-footers' ); ?></h2>
				<button type="button" class="wpcode-button-just-icon" id="wpcode-close-code-type-picker">
					<?php wpcode_icon( 'close', 19, 19 ); ?>
				</button>
			</div>
			<div class="wpcode-code-types-list" id="wpcode-code-type-list">
				<?php
				$code_types = wpcode()->execute->get_code_types();
				foreach ( $code_types as $key => $code_type ) {
					$class = 'wpcode-code-type';
					if ( $key === $this->code_type ) {
						$class .= ' wpcode-code-type-selected';
					}
					?>
					<div class="<?php echo esc_attr( $class ); ?>" data-code-type="<?php echo esc_attr( $key ); ?>">
						<div class="wpcode-code-type-image">

						</div>
						<h3><?php echo esc_html( $code_type['label'] ); ?></h3>
						<p class="wpcode-code-type-desc">
							<?php echo wp_kses_post( $code_type['description'] ); ?>
						</p>
					</div>
					<?php
				}
				?>
			</div>
		</div>
		<?php
	}

	/**
	 * The insert options - using a metabox-style layout to output the options.
	 *
	 * @return void
	 */
	public function field_insert_options() {
		$title           = __( 'Insertion', 'insert-headers-and-footers' );
		$insert_toggle   = $this->get_input_insert_toggle();
		$shortcode_field = $this->get_input_shortcode();
		// Build the field markup here.
		ob_start();
		?>
		<p><?php esc_html_e( 'Choose "Auto Insert" if you want the snippet to be automatically executed in one of the locations available. In "Shortcode" mode, the snippet will only be executed where the shortcode is inserted.', 'insert-headers-and-footers' ); ?></p>
		<div class="wpcode-separator"></div>
		<div class="wpcode-metabox-form">
			<?php $this->metabox_row( __( 'Insert Method', 'insert-headers-and-footers' ), $insert_toggle ); ?>
			<div class="wpcode-auto-insert-form-fields" data-show-if-id="#wpcode_auto_insert" data-show-if-value="1">
				<?php $this->metabox_row( __( 'Location', 'insert-headers-and-footers' ), $this->get_selected_auto_insert_location() ); ?>
			</div>
			<div class="wpcode-shortcode-form-fields" data-show-if-id="#wpcode_auto_insert" data-show-if-value="0">
				<?php
				$this->metabox_row( __( 'Shortcode', 'insert-headers-and-footers' ), $shortcode_field, 'wpcode_shortcode' );
				$this->get_input_row_custom_shortcode();
				$this->get_input_row_shortcode_attributes();
				$this->get_shortcode_locations();
				?>
			</div>
		</div>
		<?php $this->get_input_auto_insert_options(); ?>
		<div class="wpcode-metabox-form">
			<?php $this->get_input_row_as_file(); ?>
			<?php $this->get_input_row_schedule(); ?>
		</div>
		<?php
		$content = ob_get_clean();

		$this->metabox(
			$title,
			$content,
			__( 'Your snippet can be either automatically executed or only used as a shortcode. When using the "Auto Insert" option you can choose the location where your snippet will be placed automatically.', 'insert-headers-and-footers' )
		);
	}

	/**
	 * Get all the descriptions for the insert number input with conditional rules.
	 *
	 * @return string
	 */
	public function get_insert_number_descriptions() {
		$descriptions = array(
			'before_paragraph'    => __( 'before paragraph number', 'insert-headers-and-footers' ),
			'after_paragraph'     => __( 'after paragraph number', 'insert-headers-and-footers' ),
			'archive_before_post' => __( 'before post number', 'insert-headers-and-footers' ),
			'archive_after_post'  => __( 'after post number', 'insert-headers-and-footers' ),
			'after_words'         => __( 'minimum number of words', 'insert-headers-and-footers' ),
			'every_words'         => __( 'number of words', 'insert-headers-and-footers' ),
		);
		$markup       = '';
		foreach ( $descriptions as $value => $description ) {
			$markup .= sprintf( '<div class="wpcode-location-extra-input-description" data-show-if-id="[name=\'wpcode_auto_insert_location\']" data-show-if-value="%1$s" style="display:none;">%2$s</div>', $value, esc_html( $description ) );
		}

		return $markup;
	}

	/**
	 * Get the input insert toggle markup.
	 *
	 * @return string
	 */
	public function get_input_insert_toggle() {
		ob_start();
		?>
		<div class="wpcode-button-toggle">
			<button class="wpcode-button wpcode-button-large wpcode-button-secondary <?php echo esc_attr( $this->get_active_toggle_class( 1 ) ); ?>" type="button" value="1">
				<?php wpcode_icon( 'auto', 18, 23 ); ?>
				<span><?php esc_html_e( 'Auto&nbsp;Insert', 'insert-headers-and-footers' ); ?></span>
			</button>
			<button class="wpcode-button wpcode-button-large wpcode-button-secondary <?php echo esc_attr( $this->get_active_toggle_class( 0 ) ); ?>" type="button" value="0">
				<?php wpcode_icon( 'shortcode', 24, 17 ); ?>
				<span><?php esc_html_e( 'Shortcode', 'insert-headers-and-footers' ); ?></span>
			</button>
			<input type="hidden" name="wpcode_auto_insert" class="wpcode-button-toggle-input" id="wpcode_auto_insert" value="<?php echo absint( $this->get_auto_insert_value() ); ?>"/>
		</div>
		<?php
		return ob_get_clean();
	}

	/**
	 * Get the active toggle class based on the auto-insert value.
	 *
	 * @param string|int $value The value of the button.
	 *
	 * @return string
	 */
	private function get_active_toggle_class( $value ) {
		$current_value = $this->get_auto_insert_value();
		if ( absint( $value ) !== $current_value ) {
			return 'wpcode-button-secondary-inactive';
		}

		return '';
	}

	/**
	 * Get the auto-insert value consistently.
	 *
	 * @return int
	 */
	private function get_auto_insert_value() {
		return isset( $this->snippet ) ? $this->snippet->get_auto_insert() : 1;
	}

	/**
	 * Get the markup for the conditional logic picker.
	 *
	 * @return void
	 */
	public function get_conditional_logic_dropdown() {
		$options = wpcode()->conditional_logic->get_all_admin_options();

		$categories = array(
			array(
				'slug' => 'who',
				'name' => __( 'Who (visitor)', 'insert-headers-and-footers' ),
			),
			array(
				'slug' => 'where',
				'name' => __( 'Where (page)', 'insert-headers-and-footers' ),
			),
			array(
				'slug' => 'ecommerce',
				'name' => __( 'eCommerce', 'insert-headers-and-footers' ),
			),
			array(
				'slug' => 'advanced',
				'name' => __( 'Advanced', 'insert-headers-and-footers' ),
			),
		);

		?>
		<div class="wpcode-items-metabox wpcode-items-metabox-inside wpcode-hidden" id="wpcode_cl_picker">
			<?php
			$this->get_items_list_sidebar(
				$categories,
				'',
				__( 'Search Options', 'insert-headers-and-footers' ),
				'*'
			);
			?>
			<div class="wpcode-items-list">
				<ul class="wpcode-items-list-category">
					<?php
					foreach ( $options as $opt_group ) {
						foreach ( $opt_group['options'] as $key => $option ) {
							$style_class = 'wpcode-list-item wpcode-list-item-location';
							if ( ! empty( $option['upgrade'] ) ) {
								$style_class .= ' wpcode-list-item-disabled';
							}
							?>
							<li class="<?php echo esc_attr( $style_class ); ?>" data-id="<?php echo esc_attr( $key ); ?>" data-categories='<?php echo wp_json_encode( array( $opt_group['category'] ) ); ?>'>
								<label>
										<span class="wpcode-list-item-title" title="<?php echo esc_attr( $option['label'] ); ?>" data-selected-label="<?php esc_attr_e( 'Selected', 'insert-headers-and-footers' ); ?>">
											<span class="wpcode-keywords">
											</span>
											<?php echo esc_html( $option['label'] ); ?>
										</span>
									<span class="wpcode-list-item-actions">
											<span class="wpcode-list-item-description">
											<?php echo esc_html( $option['description'] ); ?>
											</span>
										</span>
									<input type="radio" class="wpcode-radio-cl-option" name="wpcode-radio-cl-option" value="<?php echo esc_attr( $key ); ?>" <?php checked( $key, '' ); ?> <?php disabled( isset( $option['disabled'] ) && $option['disabled'], true, false ); ?> />
								</label>
							</li>
						<?php } ?>
					<?php } ?>
				</ul>
			</div>
		</div>
		<?php
	}

	/**
	 * Renders the dropdown with the auto-insert options.
	 * This uses the auto-insert class that loads all the available types.
	 * Each type has some specific options.
	 *
	 * @return void
	 * @see WPCode_Auto_Insert
	 */
	public function get_input_auto_insert_options() {

		$code_type        = $this->code_type;
		$current_location = $this->get_current_snippet_location();

		$locations_by_category = wpcode()->auto_insert->get_type_categories();
		// Let's find the active category from the selected location.
		$active_category = 'global';
		foreach ( $locations_by_category as $category_key => $category_data ) {
			/**
			 * @var WPCode_Auto_Insert_Type $type
			 */
			foreach ( $category_data['types'] as $type ) {
				$locations = $type->get_locations();
				if ( array_key_exists( $current_location, $locations ) ) {
					$active_category = $category_key;
					break 2;
				}
			}
		}

		?>
		<div class="wpcode-items-metabox wpcode-items-metabox-inside" id="wpcode_auto_insert_location">
			<?php
			$this->get_items_list_sidebar(
				wpcode()->auto_insert->get_type_categories_for_sidebar(),
				'',
				__( 'Search locations', 'insert-headers-and-footers' ),
				$active_category
			);
			?>
			<div class="wpcode-items-list">
				<ul class="wpcode-items-list-category">
					<?php
					$index          = 0;
					$selected_label = __( 'Selected', 'insert-headers-and-footers' );
					foreach ( $locations_by_category as $category_key => $category_data ) {
						$style = '';
						if ( $category_key !== $active_category ) {
							$style = 'display:none;';
						}
						foreach ( $category_data['types'] as $type ) {
							$locations  = $type->get_locations();
							$label_pill = '';
							if ( ! empty( $type->label_pill ) ) {
								$label_pill = $type->label_pill;
							}
							?>
							<li class="wpcode-list-item wpcode-list-item-separator" data-index="<?php echo absint( $index ); ?>" data-categories='<?php echo wp_json_encode( array( $category_key ) ); ?>' style="<?php echo esc_attr( $style ); ?>" data-code-type="<?php echo esc_attr( $type->code_type ); ?>">
								<?php echo esc_html( $type->get_label() ); ?>
								<?php if ( ! empty( $label_pill ) ) : ?>
									<span class="wpcode-list-item-pill wpcode-list-item-pill-light"><?php echo esc_html( $label_pill ); ?></span>
								<?php endif; ?>
							</li>
							<?php
							++$index;

							foreach ( $locations as $location_slug => $location ) {
								$description    = '';
								$style_class    = 'wpcode-list-item wpcode-list-item-location';
								$label          = $location;
								$extra_data     = '';
								$input_disabled = false;
								$tabindex       = 'tabindex="0"';
								if ( isset( $location['label'] ) ) {
									$label       = $location['label'];
									$description = $location['description'];
								}
								if ( 'all' !== $type->code_type && $type->code_type !== $code_type ) {
									$style_class .= ' wpcode-list-item-disabled';
									$tabindex     = '';

									$input_disabled = true;
								}
								if ( ! empty( $type->upgrade_title ) ) {
									$extra_data = ' data-upgrade-title="' . esc_attr( $type->upgrade_title ) . '"';
								}
								if ( ! empty( $type->upgrade_text ) ) {
									$extra_data .= ' data-upgrade-text="' . esc_attr( $type->upgrade_text ) . '"';
								}
								if ( ! empty( $type->upgrade_link ) ) {
									$extra_data .= ' data-upgrade-link="' . esc_attr( $type->upgrade_link ) . '"';
								}
								if ( ! empty( $type->upgrade_button ) ) {
									$extra_data .= ' data-upgrade-button="' . esc_attr( $type->upgrade_button ) . '"';
								}
								if ( $location_slug === $current_location ) {
									$style_class .= ' wpcode-list-item-selected';
								}
								?>
								<li class="<?php echo esc_attr( $style_class ); ?>" data-index="<?php echo absint( $index ); ?>" data-id="<?php echo esc_attr( $location_slug ); ?>" data-categories='<?php echo wp_json_encode( array( $category_key ) ); ?>' data-code-type="<?php echo esc_attr( $type->code_type ); ?>" style="<?php echo esc_attr( $style ); ?>" <?php echo $tabindex; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>>
									<label <?php echo $extra_data; // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped ?>>
										<span class="wpcode-list-item-title" title="<?php echo esc_attr( $label ); ?>" data-selected-label="<?php echo esc_attr( $selected_label ); ?>">
											<span class="wpcode-keywords">
												<?php
												// Output the type label to improve search results without displaying the text to the user.
												echo esc_html( $type->label );
												?>
											</span>
											<?php echo esc_html( $label ); ?>
										</span>
										<span class="wpcode-list-item-actions">
											<span class="wpcode-list-item-description">
											<?php echo esc_html( $description ); ?>
											</span>
										</span>
										<input type="radio" name="wpcode_auto_insert_location" value="<?php echo esc_attr( $location_slug ); ?>" <?php checked( $location_slug, $current_location ); ?> <?php disabled( $input_disabled ); ?> />
									</label>
								</li>
								<?php
								++$index;
							}
						}
					}
					?>
				</ul>
			</div>
		</div>
		<?php
	}

	/**
	 * Get the selected auto insert location.
	 *
	 * @return string
	 */
	public function get_selected_auto_insert_location() {
		$current_location = $this->get_current_snippet_location();

		if ( empty( $current_location ) ) {
			$current_location = 'site_wide_header';
		}

		$location_extra = isset( $this->snippet ) ? $this->snippet->get_location_extra() : '';

		// Show a faux select box with the current location.
		$location_label = wpcode()->auto_insert->get_location_label( $current_location );

		$markup = '<input type="hidden" name="wpcode_auto_insert_location_extra" id="wpcode_auto_insert_location_extra" value="' . esc_attr( $location_extra ) . '" />';

		$markup .= '<div class="wpcode-faux-select" id="wpcode-selected-location-display" tabindex="0"><span>' . esc_html( $location_label ) . '</span></div>';
		$markup .= '<div class="wpcode-extra-location-fields">';
		$markup .= '<div class="wpcode-extra-location-input" data-show-if-id="[name=\'wpcode_auto_insert_location\']" data-show-if-value="' . implode( ',', wpcode_get_auto_insert_locations_with_number() ) . '">';
		$markup .= $this->get_insert_number_descriptions();
		$markup .= $this->get_input_number(
			'wpcode_auto_insert_number',
			$this->get_auto_insert_number_value(),
			'',
			1
		);
		$markup .= '</div>';

		/**
		 * Filter the markup for the location display inputs.
		 * This is used to add the number input for auto insert locations.
		 *
		 * @param string               $markup The markup to display.
		 * @param WPCode_Snippet|false $snippet The snippet object.
		 * @param WPCode_Admin_Page    $this The admin page object.
		 */
		$markup = apply_filters( 'wpcode_location_display_inputs', $markup, isset( $this->snippet ) ? $this->snippet : false, $this );

		$markup .= '</div>';// End wpcode-extra-location-fields.

		return $markup;
	}

	/**
	 * Grab the current snippet location.
	 *
	 * @return mixed|string
	 */
	public function get_current_snippet_location() {
		$current_location = 'site_wide_header';
		if ( ! isset( $this->snippet_id ) ) {
			return $current_location;
		}

		return $this->snippet->get_location();
	}

	/**
	 * Get the shortcode field.
	 *
	 * @return string
	 */
	public function get_input_shortcode() {
		$shortcode = __( 'Please save the snippet first', 'insert-headers-and-footers' );
		if ( isset( $this->snippet_id ) ) {
			$shortcode  = sprintf( '[wpcode id="%d"]', $this->snippet_id );
			$attributes = $this->snippet->get_shortcode_attributes();
			if ( ! empty( $attributes ) ) {
				$attributes_string = implode( '="" ', $attributes );
				$shortcode         = str_replace( ']', ' ' . $attributes_string . '=""]', $shortcode );
			}
		}
		$input  = sprintf(
			'<input type="text" value=\'%1$s\' id="wpcode-shortcode" class="wpcode-input-text" readonly />',
			$shortcode
		);
		$button = wpcode_get_copy_target_button( 'wpcode-shortcode' );

		return sprintf( '<div class="wpcode-input-with-button">%1$s %2$s</div>', $input, $button );
	}

	/**
	 * Generic input number function.
	 *
	 * @param string     $id The id of the input field.
	 * @param string|int $value The value of the input.
	 * @param string     $description The description to display under the field.
	 * @param int        $min The minimum value.
	 *
	 * @return string
	 */
	public function get_input_number( $id, $value = '', $description = '', $min = 0 ) {
		$input = '<input type="number" class="wpcode-input-number" id="' . esc_attr( $id ) . '" name="' . esc_attr( $id ) . '" value="' . esc_attr( $value ) . '" min="' . absint( $min ) . '" />';
		if ( ! empty( $description ) ) {
			$input .= '<p>' . $description . '</p>';
		}

		return $input;
	}

	/**
	 * Get a simple textarea field.
	 *
	 * @param string $id The id of the input field.
	 * @param string $value The value of the input.
	 * @param string $description The description to display under the field.
	 *
	 * @return string
	 */
	public function get_input_textarea( $id, $value = '', $description = '' ) {
		ob_start();
		echo '<div class="wpcode-input-textarea">';
		wp_editor(
			wp_kses_post( $value ),
			$id,
			array(
				'media_buttons' => false,
				'textarea_rows' => 3,
				'teeny'         => true,
				'quicktags'     => false,
				'tinymce'       => array(
					'toolbar1' => 'bold,italic,underline,bullist,numlist,link',
					'toolbar2' => '',
					'toolbar3' => '',
				),
			)
		);
		echo '</div>';
		
		if ( ! empty( $description ) ) {
			echo '<p>' . esc_html( $description ) . '</p>';
		}
		
		return ob_get_clean();
	}

	/**
	 * Get the auto-insert value consistently.
	 *
	 * @return int
	 */
	private function get_auto_insert_number_value() {
		return isset( $this->snippet ) ? $this->snippet->get_auto_insert_number() : 1;
	}

	/**
	 * Markup for the basic info metabox.
	 *
	 * @return void
	 */
	public function field_basic_info() {
		$priority = isset( $this->snippet ) ? $this->snippet->get_priority() : 10;
		$note     = isset( $this->snippet ) ? $this->snippet->get_note() : '';

		ob_start();
		$this->metabox_row( __( 'Tag', 'insert-headers-and-footers' ), $this->get_input_tag_picker() );
		$this->metabox_row( __( 'Priority', 'insert-headers-and-footers' ), $this->get_input_number( 'wpcode_priority', $priority ), 'wpcode_priority' );
		$this->metabox_row( __( 'Note', 'insert-headers-and-footers' ), $this->get_input_textarea( 'wpcode_note', $note ), 'wpcode_note' );

		if ( isset( $this->snippet ) && $this->snippet->is_generated() ) {
			$this->metabox_row( __( 'Generator', 'insert-headers-and-footers' ), $this->get_input_generator() );
		}

		$this->metabox(
			__( 'Basic info', 'insert-headers-and-footers' ),
			ob_get_clean(),
			__( 'Tags: Use tags to make it easier to group similar snippets together. <br />Priority: A lower priority will result in the snippet being executed before others with a higher priority. <br />Note: Add a private note related to this snippet.', 'insert-headers-and-footers' )
		);
	}

	/**
	 * The conditional logic field.
	 *
	 * @return void
	 */
	public function field_conditional_logic() {
		$enable_logic = isset( $this->snippet ) && $this->snippet->conditional_rules_enabled();

		$content = '<p>' . __( 'Using conditional logic you can limit the pages where you want the snippet to be auto-inserted.', 'insert-headers-and-footers' ) . '</p>';

		$content .= '<div class="wpcode-separator"></div>';
		ob_start();
		$this->metabox_row( __( 'Enable Logic', 'insert-headers-and-footers' ), $this->get_checkbox_toggle( $enable_logic, 'wpcode_conditional_logic_enable' ), 'wpcode_conditional_logic_enable' );
		$this->metabox_row( __( 'Conditions', 'insert-headers-and-footers' ), $this->get_conditional_logic_input(), 'wpcode_contional_logic_conditions', '#wpcode_conditional_logic_enable', '1' );

		$content .= ob_get_clean();

		$this->metabox(
			__( 'Smart Conditional Logic', 'insert-headers-and-footers' ),
			$content,
			__( 'Enable logic to add rules and limit where your snippets are inserted automatically. Use multiple groups for different sets of rules.', 'insert-headers-and-footers' )
		);

		$this->get_conditional_logic_dropdown();
	}

	/**
	 * Get the tag picker markup.
	 *
	 * @return string
	 */
	public function get_input_tag_picker() {
		$tags        = isset( $this->snippet ) ? $this->snippet->get_tags() : array();
		$tags_string = isset( $this->snippet ) ? implode( ',', $this->snippet->get_tags() ) : '';
		$markup      = '<select multiple="multiple" class="wpcode-tags-picker" data-target="#wpcode-tags">';
		foreach ( $tags as $tag ) {
			$markup .= '<option value="' . esc_attr( $tag ) . '" selected="selected">' . esc_html( $tag ) . '</option>';
		}
		$markup .= '</select>';
		$markup .= '<input type="hidden" name="wpcode_tags" id="wpcode-tags" value="' . esc_attr( $tags_string ) . '" />';

		return $markup;
	}

	/**
	 * Get the link to the generator page for the current snippet.
	 *
	 * @return string
	 */
	public function get_input_generator() {
		$generator = $this->snippet->get_generator();

		return sprintf(
			'<a href="%1$s" class="wpcode-button wpcode-button-secondary">%2$s</a>',
			add_query_arg(
				array(
					'generator' => $generator,
					'page'      => 'wpcode-generator',
					'snippet'   => $this->snippet->get_id(),
				),
				admin_url( 'admin.php' )
			),
			esc_html__( 'Update Generated Snippet', 'insert-headers-and-footers' )
		);
	}

	/**
	 * The hidden fields needed to identify the form submission.
	 *
	 * @return void
	 */
	public function hidden_fields() {
		if ( ! isset( $this->snippet_id ) ) {
			return;
		}
		?>
		<input type="hidden" name="id" value="<?php echo esc_attr( $this->snippet_id ); ?>"/>
		<?php
	}

	/**
	 * Output of the page wrapped in a form.
	 *
	 * @return void
	 */
	public function output() {
		if ( $this->show_library ) {
			// Don't wrap with form when showing library.
			parent::output();

			return;
		}
		?>
		<form action="<?php echo esc_url( $this->get_page_action_url() ); ?>" method="post" id="wpcode-snippet-manager-form" autocomplete="off">
			<?php parent::output(); ?>
		</form>
		<?php
	}

	/**
	 * The bottom of the header part.
	 *
	 * @return void
	 */
	public function output_header_bottom() {
		?>
		<div class="wpcode-column">
			<h1><?php echo esc_html( $this->header_title ); ?></h1>
		</div>
		<?php
		// If we're displaying the libray screen, return early and hide right-side buttons.
		if ( $this->show_library ) {
			return;
		}
		?>
		<div class="wpcode-column">
			<?php $this->header_buttons(); ?>
		</div>
		<?php
	}

	/**
	 * Add header buttons on the right side of the header.
	 *
	 * @return void
	 */
	public function header_buttons() {
		$active = isset( $this->snippet ) && $this->snippet->is_active();
		$this->save_to_library_button();
		?>
		<span class="wpcode-status-toggle" data-show-if-id="[name='wpcode_auto_insert_location']" data-hide-if-value="on_demand">
		<label class="wpcode-status-text" for="wpcode_active">
			<span class="screen-reader-text">
				<?php esc_html_e( 'Snippet Status:', 'insert-headers-and-footers' ); ?>
			</span>
			<span data-show-if-id="#wpcode_active" data-show-if-value="1" style="display: none">
				<?php esc_html_e( 'Active', 'insert-headers-and-footers' ); ?>
			</span>
			<span data-show-if-id="#wpcode_active" data-show-if-value="0" style="display:none;">
				<?php esc_html_e( 'Inactive', 'insert-headers-and-footers' ); ?>
			</span>
		</label>
		<?php echo $this->get_checkbox_toggle( $active, 'wpcode_active' ); ?>
		</span>
		<button
				class="wpcode-button wpcode-button-secondary wpcode-button-execute-now"
				id="wpcode_execute_now"
				data-show-if-id="[name='wpcode_auto_insert_location']"
				data-show-if-value="on_demand"
				type="submit"
				name="execute_now"
				value="execute_now" style="display:none;">
			<?php esc_html_e( 'Execute Snippet Now', 'insert-headers-and-footers' ); ?>
		</button>
		<?php
		$this->update_button();
	}

	/**
	 * The Update snippet button.
	 *
	 * @return void
	 */
	public function update_button() {
		?>
		<button class="wpcode-button" type="submit" value="publish" name="button"><?php echo esc_html( $this->publish_button_text ); ?></button>
		<?php
	}

	/**
	 * Markup for the save to library button.
	 *
	 * @return void
	 */
	public function save_to_library_button() {
		?>
		<button
				class="wpcode-button wpcode-button-text wpcode-button-save-to-library"
				id="wpcode_save_to_library"
				type="button">
			<?php
			wpcode_icon( 'cloud', 16, 12 );
			esc_html_e( 'Save to Library', 'insert-headers-and-footers' );
			?>
		</button>
		<?php
	}

	/**
	 * Handle a form submit here.
	 *
	 * @return void
	 */
	public function submit_listener() {
		if ( ! isset( $_REQUEST[ $this->nonce_name ] ) || ! wp_verify_nonce( sanitize_key( $_REQUEST[ $this->nonce_name ] ), $this->action ) ) {
			// Nonce is missing, so we're not even going to try.
			return;
		}
		if ( ! $this->can_edit ) {
			return;
		}
		$code_type    = isset( $_POST['wpcode_snippet_type'] ) ? sanitize_text_field( wp_unslash( $_POST['wpcode_snippet_type'] ) ) : 'html';
		$snippet_code = isset( $_POST['wpcode_snippet_code'] ) ? $_POST['wpcode_snippet_code'] : '';  // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized

		if ( WPCode_Snippet_Execute::is_code_not_allowed( $snippet_code ) ) {
			$title = esc_html__( 'Restricted Code Detected', 'insert-headers-and-footers' );
			wp_die(
				'<h2>' . $title . '</h2>' .
				sprintf(
				// Translators: %1$s is the opening link tag, %2$s is the closing link tag.
					esc_html__( 'For your protection, we blocked the addition of certain types of code that could compromise your website\'s security. If you believe this is in error or need assistance, please %1$scontact our support team%2$s.', 'insert-headers-and-footers' ),
					'<a href="' . wpcode_utm_url( 'https://wpcode.com/contact', 'error', 'restricted-code' ) . '" target="_blank" rel="noopener noreferrer">',
					'</a>'
				),
				$title
			);
		}

		if ( 'text' === $code_type ) {
			$snippet_code = wpautop( $snippet_code );
		}

		$tags = array();

		if ( isset( $_POST['wpcode_tags'] ) ) {
			$tags = trim( sanitize_text_field( wp_unslash( $_POST['wpcode_tags'] ) ) );
			if ( ! empty( $tags ) ) {
				$tags = explode( ',', $tags );
			}
		}

		if ( 'php' === $code_type ) {
			$snippet_code = preg_replace( '|^\s*<\?(php)?|', '', $snippet_code );
			// Let's also replace the closing php tag if any.
			$snippet_code = preg_replace( '|\?>\s*$|', '', $snippet_code );
		}

		if ( 'js' === $code_type && apply_filters( 'wpcode_strip_script_tags_for_js', true ) ) {
			$snippet_code = preg_replace( '|^\s*<script[^>]*>|', '', $snippet_code );
			$snippet_code = preg_replace( '|</(script)>\s*$|', '', $snippet_code );
		}

		$rules = isset( $_POST['wpcode_cl_rules'] ) ? json_decode( sanitize_textarea_field( wp_unslash( $_POST['wpcode_cl_rules'] ) ), true ) : array();

		if ( isset( $_POST['wpcode_shortcode_attributes'] ) ) {
			$attributes = array_map( 'sanitize_key', wp_unslash( $_POST['wpcode_shortcode_attributes'] ) );
		} else {
			$attributes = array();
		}
		$active      = isset( $_REQUEST['wpcode_active'] );
		$location    = isset( $_POST['wpcode_auto_insert_location'] ) ? sanitize_text_field( wp_unslash( $_POST['wpcode_auto_insert_location'] ) ) : '';
		$execute_now = isset( $_POST['execute_now'] ) && 'execute_now' === $_POST['execute_now'] && 'on_demand' === $location;

		if ( $execute_now ) {
			// If we are executing now we should never save the snippet as active.
			$active = false;
		}
		$snippet_id        = empty( $_REQUEST['id'] ) ? 0 : absint( $_REQUEST['id'] );
		$previous_snippet  = wpcode_get_snippet( $snippet_id );
		$previously_active = $previous_snippet->is_active();

		$snippet = wpcode_get_snippet(
			array(
				'id'                   => $snippet_id,
				'title'                => isset( $_POST['wpcode_snippet_title'] ) ? sanitize_text_field( wp_unslash( $_POST['wpcode_snippet_title'] ) ) : '',
				'code'                 => $snippet_code,
				'active'               => $active,
				'code_type'            => $code_type,
				'location'             => $location,
				'insert_number'        => isset( $_POST['wpcode_auto_insert_number'] ) ? absint( $_POST['wpcode_auto_insert_number'] ) : 0,
				'auto_insert'          => isset( $_POST['wpcode_auto_insert'] ) ? absint( $_POST['wpcode_auto_insert'] ) : 0,
				'tags'                 => $tags,
				'use_rules'            => isset( $_POST['wpcode_conditional_logic_enable'] ),
				'rules'                => $rules,
				'priority'             => isset( $_POST['wpcode_priority'] ) ? intval( $_POST['wpcode_priority'] ) : 10,
				'note'                 => isset( $_POST['wpcode_note'] ) ? wp_kses_post( wp_unslash( $_POST['wpcode_note'] ) ) : '',
				'location_extra'       => isset( $_POST['wpcode_auto_insert_location_extra'] ) ? sanitize_text_field( wp_unslash( $_POST['wpcode_auto_insert_location_extra'] ) ) : '',
				'shortcode_attributes' => $attributes,
			)
		);

		if ( empty( $snippet->title ) ) {
			$snippet->title = $snippet->get_untitled_title();
		}

		$message_number = 1;
		$active_wanted  = $snippet->active;

		if ( 0 === $snippet->id ) {
			// If it's a new snippet display a different message.
			$message_number = 2;
		}

		$this->add_extra_snippet_data( $snippet );

		$id = $snippet->save();

		// Save the last used code type.
		update_user_meta( get_current_user_id(), 'wpcode_default_code_type', $code_type );

		if ( $active_wanted !== $snippet->is_active() ) {
			// If the snippet failed to change status display an error message.
			$message_number = 3;
			// If the current user is not allowed to change snippet status, display a different message.
			if ( ! current_user_can( 'wpcode_activate_snippets' ) ) {
				$message_number = 4;
			}

			if ( $previously_active ) {
				$message_number = 6;
			}
		}

		// Now that we saved the data, let's execute the snippet if needed.
		if ( $execute_now ) {
			wpcode()->execute->doing_activation(); // Mark this to unslash the code.
			$snippet->execute( apply_filters( 'wpcode_on_demand_ignore_conditional_logic', false ) );
			$message_number = 5;
		}

		if ( $id ) {
			wp_safe_redirect( $this->get_after_save_redirect_url( $id, $message_number ) );
			exit;
		}
	}

	/**
	 * Get the URL to redirect to after a snippet is saved.
	 *
	 * @param int $snippet_id The snippet id that was just saved.
	 * @param int $message_number The message number to display.
	 *
	 * @return string
	 */
	protected function get_after_save_redirect_url( $snippet_id, $message_number = 1 ) {
		return add_query_arg(
			array(
				'snippet_id' => $snippet_id,
				'message'    => $message_number,
				'error'      => wpcode()->error->get_last_error_message(),
			),
			$this->get_page_action_url()
		);
	}

	/**
	 * Load page-specific scripts.
	 *
	 * @return void
	 */
	public function page_scripts() {
		if ( $this->show_library ) {
			return;
		}

		$editor = new WPCode_Code_Editor( $this->code_type );
		$editor->load_hint_scripts();
		$editor->set_setting( 'autoCloseTags', true );
		$editor->set_setting( 'matchTags', array( 'bothTags' => true ) );

		$editor->register_editor( 'wpcode_snippet_code' );
		$editor->init_editor();
	}

	/**
	 * Get the snippet type based on the context.
	 *
	 * @return void
	 */
	public function set_code_type() {
		if ( isset( $this->snippet ) ) {
			$this->code_type = $this->snippet->get_code_type();
		} else {
			$user_code_type = get_user_meta( get_current_user_id(), 'wpcode_default_code_type', true );
			if ( ! empty( $user_code_type ) ) {
				$this->code_type = $user_code_type;
			}
			$this->code_type = apply_filters( 'wpcode_default_code_type', $this->code_type );
			$snippet_types   = wpcode()->execute->get_options();
			// If the selected code type is not in the available types, change the selected type to the first available type.
			if ( ! isset( $snippet_types[ $this->code_type ] ) ) {
				$this->code_type = key( $snippet_types );
			}
		}
	}

	/**
	 * Get the conditional logic options input markup.
	 *
	 * @return string
	 */
	public function get_conditional_logic_input() {

		$conditional_rules = isset( $this->snippet ) ? wp_json_encode( $this->snippet->get_conditional_rules() ) : '';

		$markup = $this->get_conditional_select_show_hide();

		$markup .= sprintf( '<div id="wpcode-conditions-holder">%s</div>', $this->build_conditional_rules_form() );
		$markup .= sprintf( '<button type="button" class="wpcode-button" id="wpcode-cl-add-group">%s</button>', __( '+ Add new group', 'insert-headers-and-footers' ) );
		$markup .= sprintf( '<script type="text/template" id="wpcode-conditions-group-markup">%s</script>', $this->get_conditions_group_markup() );
		$markup .= sprintf( '<script type="text/template" id="wpcode-conditions-group-row-markup">%s</script>', $this->get_conditions_group_row_markup() );
		$markup .= sprintf( '<input type="hidden" name="wpcode_cl_rules" id="wpcode-cl-rules" value="%s" />', esc_attr( $conditional_rules ) );

		return $markup;
	}

	/**
	 * Markup for the show/hide select input.
	 *
	 * @return string
	 */
	public function get_conditional_select_show_hide() {
		$rules    = isset( $this->snippet ) ? $this->snippet->get_conditional_rules() : array();
		$selected = empty( $rules ) ? 'show' : $rules['show'];
		$options  = array(
			'show' => __( 'Show', 'insert-headers-and-footers' ),
			'hide' => __( 'Hide', 'insert-headers-and-footers' ),
		);

		$markup = '<div class="wpcode-inline-select">';

		$markup .= '<select id="wpcode-cl-show-hide">';
		foreach ( $options as $value => $label ) {
			$markup .= sprintf(
				'<option value="%1$s" %2$s>%3$s</option>',
				esc_attr( $value ),
				selected( $value, $selected, false ),
				esc_html( $label )
			);
		}
		$markup .= '</select>';
		$markup .= '<label for="wpcode-cl-show-hide">';
		$markup .= sprintf( '<span>%s</span>', __( 'This code snippet if', 'insert-headers-and-footers' ) );
		$markup .= '</label>';
		$markup .= '</div>';

		return $markup;
	}

	/**
	 * Build back the form markup from the stored conditions.
	 *
	 * @return string|void
	 */
	public function build_conditional_rules_form() {
		if ( ! isset( $this->snippet ) ) {
			return;
		}
		$options = wpcode()->conditional_logic->get_all_admin_options();
		$rules   = $this->snippet->get_conditional_rules();
		if ( empty( $rules ) || empty( $rules['groups'] ) ) {
			return;
		}
		$form_groups = array();
		foreach ( $rules['groups'] as $group_rows ) {
			$rows = array();
			foreach ( $group_rows as $row ) {
				$type_options = $options[ $row['type'] ];
				$value_option = $type_options['options'][ $row['option'] ];

				// Construct the meta array
				$meta = array(
					'post' => isset( $row['meta_key'] ) ? $row['meta_key'] : '',
					'user' => isset( $row['user_meta_key'] ) ? $row['user_meta_key'] : '',
				);

				$rows[] = $this->get_conditions_group_row_markup(
					$row['option'],
					$row['relation'],
					$this->get_input_markup_by_type( $value_option, $row['value'] ),
					$meta
				);
			}

			$form_groups[] = $this->get_conditions_group_markup( implode( '', $rows ) );
		}

		return implode( '', $form_groups );
	}

	/**
	 * Process the type options and return the input markup.
	 *
	 * @param array  $data The data with the settings/options.
	 * @param string $value The value currently selected.
	 *
	 * @return string
	 */
	private function get_input_markup_by_type( $data, $value ) {
		$markup = '';
		switch ( $data['type'] ) {
			case 'select':
				$multiple = isset( $data['multiple'] ) && $data['multiple'] ? 'multiple' : '';
				$class    = isset( $data['multiple'] ) && $data['multiple'] ? 'wpcode-select2' : '';
				$markup   = '<select class=' . esc_attr( $class ) . '  ' . $multiple . '>';
				if ( empty( $value ) ) {
					$value = false;
				}
				$selected = ! is_array( $value ) ? array( $value ) : $value;
				foreach ( $data['options'] as $option ) {
					$markup .= '<option value="' . esc_attr( $option['value'] ) . '" ' . selected( in_array( $option['value'], $selected, true ), true, false ) . ' ' . disabled( isset( $option['disabled'] ) && $option['disabled'], true, false ) . '>' . esc_html( $option['label'] ) . '</option>';
				}
				$markup .= '</select>';
				break;
			case 'text':
				$markup = sprintf( '<input type="text" class="wpcode-input-text" value="%s" />', esc_attr( $value ) );
				break;
			case 'time':
				$markup = sprintf( '<input type="text" class="wpcode-input-text wpcode-input-time" value="%s" />', esc_attr( $value ) );
				break;
			case 'date':
				$value  = ! empty( $value ) ? date_i18n( 'Y-m-d', strtotime( $value ) ) : '';
				$markup = sprintf( '<input type="text" class="wpcode-input-text wpcode-input-date" value="%s" />', esc_attr( $value ) );
				break;
			case 'datetime':
				$value  = ! empty( $value ) ? date_i18n( 'Y-m-d H:i', strtotime( $value ) ) : '';
				$markup = sprintf( '<input type="text" class="wpcode-input-text wpcode-input-datetime" value="%s" />', esc_attr( $value ) );
				break;
			case 'ajax':
				$options  = isset( $data['labels_callback'] ) ? $data['labels_callback']( $value ) : array();
				$multiple = isset( $data['multiple'] ) && $data['multiple'] ? 'multiple' : '';
				$markup   = '<select class="wpcode-select2-ajax" data-action="' . esc_attr( $data['options'] ) . '" ' . $multiple . '>';
				foreach ( $options as $option ) {
					$markup .= '<option value="' . esc_attr( $option['value'] ) . '" ' . selected( true, true, false ) . '>' . esc_html( $option['label'] ) . '</option>';
				}
				$markup .= '</select>';
				break;
		}

		return $markup;
	}

	/**
	 * Build the markup for an empty conditional logic group.
	 *
	 * @param string $rows Optional, already-built rows markup.
	 *
	 * @return string
	 */
	private function get_conditions_group_markup( $rows = '' ) {
		$markup = '<div class="wpcode-cl-group">';

		$markup .= $this->get_conditions_group_or_markup();
		$markup .= '<div class="wpcode-cl-group-rules">' . $rows . '</div>';
		$markup .= sprintf(
			'<button class="wpcode-button wpcode-cl-add-row" type="button" title="%2$s">%1$s</button>',
			_x( 'AND', 'Conditional logic add another "and" rules row.', 'insert-headers-and-footers' ),
			esc_attr__( 'Add another "AND" rules row.', 'insert-headers-and-footers' )
		);
		$markup .= '</div>';

		return $markup;
	}

	/**
	 * Build the markup for a conditional logic row. All parameters are optional and if
	 * left empty it will return the template to be used in JS.
	 *
	 * @param string $type The value for the type input.
	 * @param string $relation The value for the relation field.
	 * @param string $value The value selected for this row.
	 *
	 * @return string
	 */
	private function get_conditions_group_row_markup( $type = '', $relation = '', $value = '', $meta = array() ) {
		$options = wpcode()->conditional_logic->get_all_admin_options();

		$markup = '<div class="wpcode-cl-rules-row">';

		$markup .= '<div class="wpcode-cl-rules-row-options">';
		$markup .= '<span class="wpcode-cl-rule-type-container">';
		$markup .= '<select class="wpcode-cl-rule-type">';
		foreach ( $options as $opt_group ) {
			$markup .= '<optgroup label="' . esc_attr( $opt_group['label'] ) . '" data-type="' . esc_attr( $opt_group['name'] ) . '">';
			foreach ( $opt_group['options'] as $key => $option ) {
				$data_attrs = '';
				if ( isset( $option['upgrade'] ) && is_array( $option['upgrade'] ) ) {
					if ( isset( $option['upgrade']['title'] ) ) {
						$data_attrs = 'data-upgrade-title= "' . esc_attr( $option['upgrade']['title'] ) . '"';
					}
					if ( isset( $option['upgrade']['text'] ) ) {
						$data_attrs .= ' data-upgrade-text="' . esc_attr( $option['upgrade']['text'] ) . '"';
					}
					if ( isset( $option['upgrade']['link'] ) ) {
						$data_attrs .= ' data-upgrade-link="' . esc_attr( $option['upgrade']['link'] ) . '"';
					}
					if ( isset( $option['upgrade']['button'] ) ) {
						$data_attrs .= ' data-upgrade-button="' . esc_attr( $option['upgrade']['button'] ) . '"';
					}
				}
				$markup .= '<option value="' . esc_attr( $key ) . '" ' . selected( $type, $key, false ) . ' ' . disabled( isset( $option['disabled'] ) && $option['disabled'], true, false ) . $data_attrs . '>' . esc_html( $option['label'] ) . '</option>';
			}
			$markup .= '</optgroup>';
		}
		$markup .= '</select>';
		$markup .= '</span>'; // wpcode-cl-rule-type-container.

		// Display the appropriate input based on the type
		if ( $type === 'user_meta' || $type === 'post_meta' ) {
			$meta_key = '';
			if ( $type === 'post_meta' && isset( $meta['post'] ) ) {
				$meta_key = $meta['post'];
                $identifier = 'wpcode-cl-rule-meta-key';
			} elseif ( $type === 'user_meta' && isset( $meta['user'] ) ) {
				$meta_key = $meta['user'];
                $identifier = 'wpcode-cl-rule-user-meta-key';
			}

			$markup .= '<div class="'.$identifier.'-container">';
			$markup .= '<input type="text" class="' .$identifier. ' wpcode-input-text" name="' .$identifier. '" placeholder="Enter Meta Key" value="' . esc_attr( $meta_key ) . '">';
			$markup .= '</div>';
		}

		$markup .= $this->get_conditions_relation_select( $relation );
		$markup .= '<div class="wpcode-cl-rule-value">' . $value . '</div>';
		$markup .= '</div>'; // rules-row-options.
		$markup .= '<button class="wpcode-button-just-icon wpcode-cl-remove-row" type="button" title="' . esc_attr__( 'Remove Row', 'insert-headers-and-footers' ) . '">' . get_wpcode_icon( 'remove' ) . '</button>';
		$markup .= '</div>'; // rules-row.

		return $markup;
	}

	/**
	 * Get the markup for the relation field.
	 *
	 * @param string $relation Optional selected relation.
	 *
	 * @return string
	 */
	private function get_conditions_relation_select( $relation = '' ) {
		$options = wpcode_get_conditions_relation_labels();
		$markup  = '<select class="wpcode-cl-rule-relation">';
		foreach ( $options as $value => $label ) {
			$markup .= '<option value="' . esc_attr( $value ) . '" ' . selected( $relation, $value, false ) . '>' . esc_html( $label ) . '</option>';
		}
		$markup .= '</select>';

		return $markup;
	}

	/**
	 * The markup for the "or" displayed between groups.
	 *
	 * @return string
	 */
	private function get_conditions_group_or_markup() {
		$markup = '<div class="wpcode-cl-group-or">';

		$markup .= '<div class="wpcode-cl-group-or-line"></div>';
		$markup .= '<div class="wpcode-cl-group-or-text">' . _x( 'OR', 'Conditional logic "or" another rule', 'insert-headers-and-footers' ) . '</div>';
		$markup .= '</div>';

		return $markup;
	}

	/**
	 * Add conditions to the admin script when on this page.
	 *
	 * @param array $data The localized data used in wp_localize_script.
	 *
	 * @return array
	 * @see wpcode_admin_scripts
	 */
	public function add_conditional_rules_to_script( $data ) {
		if ( ! isset( $data['conditions'] ) ) {
			$data['conditions'] = wpcode()->conditional_logic->get_all_admin_options( true );
		}

		$data['snippet_id']             = isset( $this->snippet_id ) ? $this->snippet_id : 0;
		$data['save_to_library_url']    = wpcode_utm_url( 'https://wpcode.com/lite/', 'snippet-editor', 'save-to-library', 'upgrade-to-pro' );
		$data['save_to_library_title']  = __( 'Save to Library is a Pro Feature', 'insert-headers-and-footers' );
		$data['save_to_library_text']   = __( 'Upgrade to PRO today and save your private snippets to the WPCode library for easy access. You can also share your snippets with other users or load them on other sites.', 'insert-headers-and-footers' );
		$data['save_to_library_button'] = $data['upgrade_button'];
		$data['shortcode_title']        = __( 'Custom Shortcode is a Pro Feature', 'insert-headers-and-footers' );
		$data['shortcode_text']         = __( 'Upgrade today to use a custom shortcode and nerver worry about changing snippet ids again, even when importing your snippets to another site. You\'ll also get access to a private library that makes setting up new sites a lot easier.', 'insert-headers-and-footers' );
		$data['shortcode_url']          = wpcode_utm_url( 'https://wpcode.com/lite/', 'snippet-editor', 'custom-shortcode', 'modal' );
		$data['device_title']           = __( 'Device Type is a Pro Feature', 'insert-headers-and-footers' );
		$data['device_text']            = __( 'Upgrade to PRO today and unlock one-click device targeting for your snippets.', 'insert-headers-and-footers' );
		$data['device_url']             = wpcode_utm_url( 'https://wpcode.com/lite/', 'snippet-editor', 'device-type', 'modal' );
		$data['datetime_title']         = __( 'Scheduling snippets is a Pro Feature', 'insert-headers-and-footers' );
		$data['datetime_text']          = __( 'Upgrade to PRO today and unlock powerful scheduling options to limit when your snippet is active on the site.', 'insert-headers-and-footers' );
		$data['datetime_url']           = wpcode_utm_url( 'https://wpcode.com/lite/', 'snippet-editor', 'schedule', 'modal' );
		$data['blocks_title']           = __( 'Blocks snippets is a Pro Feature', 'insert-headers-and-footers' );
		$data['blocks_text']            = __( 'Upgrade to PRO today and unlock building snippets using the Gutenberg Block Editor. Create templates using blocks and use the full power of WPCode to insert them in your site.', 'insert-headers-and-footers' );
		$data['blocks_url']             = wpcode_utm_url( 'https://wpcode.com/lite/', 'snippet-editor', 'blocks', 'modal' );
		$data['blocks_button']          = $data['save_to_library_button'];
		$data['scss_title']             = __( 'SCSS snippets is a Pro Feature', 'insert-headers-and-footers' );
		$data['scss_text']              = __( 'Upgrade to PRO today and unlock editing snippets using SCSS code with optimized compiling directly in the WordPress admin.', 'insert-headers-and-footers' );
		$data['scss_url']               = wpcode_utm_url( 'https://wpcode.com/lite/', 'snippet-editor', 'scss', 'modal' );
		$data['scss_button']            = $data['save_to_library_button'];
		$data['shortcode_attributes']   = __( 'Shortcode Attributes', 'insert-headers-and-footers' );
		$data['laf_title']              = __( 'Load as file is a Pro Feature', 'insert-headers-and-footers' );
		$data['laf_text']               = __( 'Upgrade to PRO today and unlock loading your CSS and JS snippets as files for better performance and improved compatibility with caching plugins.', 'insert-headers-and-footers' );
		$data['laf_url']                = wpcode_utm_url( 'https://wpcode.com/lite/', 'snippet-editor', 'laf', 'modal' );
		$data['php_cl_location_notice'] = sprintf(
		// Translators: %1$s Opening anchor tag. %2$s Closing anchor tag.
			__( 'For better results using conditional logic with PHP snippets we automatically switched the auto-insert location to "Frontend Conditional Logic" that runs later. If you want to run the snippet earlier please switch back to "Run Everywhere" but note not all conditional logic options will be available. %1$sRead more%2$s', 'insert-headers-and-footers' ),
			'<a href="' . wpcode_utm_url( 'https://wpcode.com/docs/conditional-logic-php-snippets/', 'snippet-editor', 'php-conditional-logic' ) . '" target="_blank">',
			'</a>'
		);

		$error_line = 0;
		if ( isset( $this->snippet ) ) {
			$last_error = $this->snippet->get_last_error();
			if ( ! empty( $last_error['error_line'] ) ) {
				$error_line = $last_error['error_line'];
			}
		}

		$data['cl_labels']          = wpcode_get_conditions_relation_labels();
		$data['cl_labels_custom']   = $this->get_conditional_logic_operators_custom_labels();
		$data['error_line']         = $error_line;
		$data['error_line_message'] = esc_html__( 'The snippet has been recently deactivated due to an error on this line', 'insert-headers-and-footers' );
		$data['is_locked']          = $this->is_locked;
		$data['locked_by']          = $this->locked_by;
		// Translators: The name of the user that is currently editing the snippet is appended at the end.
		$data['edited']           = esc_html__( 'This snippet is currently being edited by ', 'insert-headers-and-footers' );
		$data['ai_title']         = esc_html__( 'AI Snippet Generation is a Pro Feature', 'insert-headers-and-footers' );
		$data['ai_improve_title'] = esc_html__( 'Improving Snippets with AI is a Pro Feature', 'insert-headers-and-footers' );
		$data['ai_text']          = esc_html__( 'Upgrade today to access the WPCode AI code generator, which allows you to create code snippets simply by describing their functionality using the power of AI.', 'insert-headers-and-footers' );
		$data['ai_url']           = wpcode_utm_url( 'https://wpcode.com/lite/', 'snippet-editor', 'ai', 'generate' );
		$data['ai_improve_url']   = wpcode_utm_url( 'https://wpcode.com/lite/', 'snippet-editor', 'ai', 'improve' );
		$data['ai_button']        = esc_html__( 'Upgrade to PRO', 'insert-headers-and-footers' );

		return $data;
	}

	/**
	 * Add a body class specific to the code type of the current snippet.
	 *
	 * @param string $body_class The body class.
	 *
	 * @return string
	 */
	public function body_class_code_type( $body_class ) {
		$body_class .= ' wpcode-code-type-' . $this->code_type;

		if ( empty( $this->snippet ) ) {
			$body_class .= ' wpcode-new-snippet';
		}

		return $body_class;
	}

	/**
	 * If the editor should grow with the code, add a body class.
	 *
	 * @param string $body_class The body class.
	 *
	 * @return string
	 */
	public function maybe_editor_height_auto( $body_class ) {
		$height_auto = wpcode()->settings->get_option( 'editor_height_auto' );
		if ( false !== $height_auto ) {
			$body_class .= ' wpcode-editor-auto ';
		}

		return $body_class;
	}

	/**
	 * If the current user has syntax_highlighting disabled add a body class.
	 *
	 * @param string $body_class The body class.
	 *
	 * @return string
	 */
	public function maybe_syntax_highlighting_disabled( $body_class ) {
		$user = wp_get_current_user();

		if ( ! isset( $user->syntax_highlighting ) || 'false' === $user->syntax_highlighting || ! function_exists( 'wp_enqueue_code_editor' ) ) {
			$body_class .= ' wpcode-syntax-highlighting-disabled ';
		}

		return $body_class;
	}

	/**
	 * If we have a custom height set, output the styles to change that.
	 * Also, check if the auto-height is set.
	 *
	 * @return void
	 */
	public function maybe_editor_height() {
		// Let's check if the auto-height is not enabled.
		$height_auto = wpcode()->settings->get_option( 'editor_height_auto' );
		if ( false !== $height_auto ) {
			return;
		}

		$height = wpcode()->settings->get_option( 'editor_height' );
		if ( ! $height ) {
			return;
		}

		echo '<style>.CodeMirror {height: ' . absint( $height ) . 'px;}</style>';
	}

	/**
	 * Get the markup of the custom shortcode row.
	 *
	 * @return void
	 */
	public function get_input_row_custom_shortcode() {
		$this->metabox_row(
			__( 'Custom Shortcode', 'insert-headers-and-footers' ),
			sprintf(
				'<input type="text" placeholder="%s" class="wpcode-input-text" id="wpcode-custom-shortcode-lite" readonly />',
				__( 'Shortcode name', 'insert-headers-and-footers' )
			),
			'',
			'',
			'',
			__( 'Use this field to define a custom shortcode name instead of the id-based one.', 'insert-headers-and-footers' ),
			true
		);
	}

	/**
	 * Method used to output the markup for the shortcode attributes input.
	 *
	 * @return void
	 */
	public function get_input_row_shortcode_attributes() {
		$button = sprintf(
			'<button class="wpcode-button wpcode-button-icon wpcode-button-secondary" id="wpcode_add_attribute" type="button"><span>%1$s</span> %2$s</button>',
			get_wpcode_icon( 'plus', 16, 16, '0 96 960 960' ),
			__( 'Add&nbsp;Attribute', 'insert-headers-and-footers' )
		);
		$input  = sprintf(
			'<div class="wpcode-input-with-button"><input type="text" id="wpcode-shortcode-attribute-name" placeholder="%1$s" class="wpcode-input-text" />%2$s</div>',
			__( 'Attribute name', 'insert-headers-and-footers' ),
			$button
		);

		$input .= $this->help_icon(
			sprintf(
			// Translators: %1$s is the opening <code> tag, %2$s is the closing </code> tag.
				__( 'Use this field to define the attribute name for your shortcode and click Add Attribute. Attributes added here will be available to use as smart tags and as variables inside snippets. E.g. an attribute named "keyword" will be available in a PHP snippet as %1$s$keyword%2$s. %3$sLearn more%4$s.', 'insert-headers-and-footers' ),
				'<code>',
				'</code>',
				'<a href="' . wpcode_utm_url( 'https://wpcode.com/docs/shortcode-attributes/', 'snippet-editor', 'shortcode-attributes' ) . '" target="_blank">',
				'</a>'
			),
			false
		);

		$input .= '<div id="wpcode-shortcode-attributes-list" class="wpcode-shortcode-attributes-list">';
		$input .= $this->get_shortcode_attributes_list();
		$input .= '<script type="text/template" id="wpcode_shortcode_attribute_list_item_template">' . $this->get_shortcode_attribute_list_item() . '</script>';
		$input .= '</div>';

		$this->metabox_row(
			__( 'Shortcode Attributes', 'insert-headers-and-footers' ),
			$input,
			'wpcode-shortcode-attribute-name',
			'',
			''
		);
	}

	/**
	 * Get the markup of the shortcode attributes list.
	 *
	 * @return string|void
	 */
	public function get_shortcode_attributes_list() {
		if ( ! isset( $this->snippet ) ) {
			return '<ul></ul>';
		}
		$attributes = $this->snippet->get_shortcode_attributes();
		if ( empty( $attributes ) ) {
			return '<ul></ul>';
		}
		$output = '<ul>';
		foreach ( $attributes as $attribute ) {
			$output .= sprintf(
				$this->get_shortcode_attribute_list_item(),
				esc_html( $attribute )
			);
		}
		$output .= '</ul>';

		return $output;
	}

	/**
	 * Get the markup of the shortcode attribute list item.
	 *
	 * @return string
	 */
	public function get_shortcode_attribute_list_item() {
		return sprintf(
			'<li><span class="wpcode-shortcode-attribute-name">%1$s</span><button class="wpcode-shortcode-attribute-remove wpcode-button-just-icon">%2$s</button><input name="wpcode_shortcode_attributes[]" class="wpcode-shortcode-attribute-item-input" value="%1$s" type="hidden" /></li>',
			'%1$s',
			get_wpcode_icon( 'trash' )
		);
	}

	/**
	 * Get the markup of the schedule main dates inputs.
	 *
	 * @return void
	 */
	public function get_input_row_schedule() {
		?>
		<div class="wpcode-schedule-form-fields">
			<?php
			$schedule_label = __( 'Schedule snippet', 'insert-headers-and-footers' );
			$this->metabox_row(
				$schedule_label,
				$this->get_input_row_schedule_contents( '', '', true ),
				'wpcode_schedule',
				'',
				'',
				'',
				true
			);
			?>
		</div>
		<?php
	}

	/**
	 * Get the description of the load as file option.
	 *
	 * @return string
	 */
	public function get_input_row_as_file_description() {
		return sprintf(
		// Translators: Link to the documentation article for files as snippets. %1$s is the opening anchor tag, %2$s is the closing anchor tag.
			esc_html__( 'If enabled, this snippet will be loaded as a physical file instead of being inserted in the source of the page. %1$sLearn more%2$s.', 'insert-headers-and-footers' ),
			'<a target="_blank" rel="noreferrer noopener" href="' . esc_url( wpcode_utm_url( 'https://wpcode.com/docs/snippet-files', 'snippet-manager', 'load-as-file', 'learn-more' ) ) . '">',
			'</a>'
		);
	}

	/**
	 * Get the markup for displaying an option to load the snippet as a file if the code type is CSS or JS.
	 *
	 * @return void
	 */
	public function get_input_row_as_file() {
		$this->metabox_row(
			esc_html__( 'Load as file', 'insert-headers-and-footers' ),
			$this->get_checkbox_toggle(
				false,
				'wpcode_snippet_as_file'
			),
			'wpcode_snippet_as_file',
			'#wpcode_snippet_type',
			'js,css',
			$this->get_input_row_as_file_description(),
			true,
			'wpcode_snippet_as_file_option'
		);
	}

	/**
	 * Get the markup of the schedule inputs.
	 *
	 * @param string $start Start date.
	 * @param string $end End date.
	 * @param bool   $read_only If the inputs should be read-only.
	 *
	 * @return string
	 */
	public function get_input_row_schedule_contents( $start = '', $end = '', $read_only = false ) {
		$markup = '<div class="wpcode-input-row wpcode-input-row-schedule">';

		$markup .= $this->get_input_datetime(
			'wpcode-schedule-start',
			$start,
			esc_html__( 'Start Date', 'insert-headers-and-footers' ),
			esc_html__( 'Start Date', 'insert-headers-and-footers' ),
			esc_html__( 'Clear start date', 'insert-headers-and-footers' ),
			$read_only
		);

		$markup .= $this->get_input_datetime(
			'wpcode-schedule-end',
			$end,
			esc_html__( 'End Date', 'insert-headers-and-footers' ),
			esc_html__( 'End Date', 'insert-headers-and-footers' ),
			esc_html__( 'Clear end date', 'insert-headers-and-footers' ),
			$read_only
		);

		$markup .= '</div>';

		$markup .= $this->help_icon(
			sprintf(
			// Translators: %1$s and %2$s are HTML tags for a link to the documentation article.
				__( 'Looking for more scheduling options? %1$sClick here%2$s to read more about all the available options.', 'insert-headers-and-footers' ),
				'<a href="' . wpcode_utm_url( 'https://wpcode.com/docs/how-to-create-advanced-scheduling-rules/', 'snippet-editor', 'schedule-more' ) . '" target="_blank">',
				'</a>'
			),
			false
		);

		return $markup;
	}

	/**
	 * Get the markup of the schedule main dates inputs.
	 *
	 * @param string $id The id of the input.
	 * @param string $value The value of the input.
	 * @param string $label The label of the input.
	 * @param string $placeholder The placeholder of the input.
	 * @param string $clear_text The text of the clear button.
	 *
	 * @return string
	 */
	public function get_input_datetime( $id, $value = '', $label = '', $placeholder = '', $clear_text = '', $readonly = false ) {

		$markup = '';
		if ( $label ) {
			$markup .= sprintf(
				'<div class="wpcode-input-row-label screen-reader-text">
					<label for="%1$s">%2$s</label>
				</div>',
				esc_attr( $id ),
				esc_html( $label )
			);
		}
		$markup .= '<div class="wpcode-input-row-input">';
		$markup .= sprintf(
			'<input type="text" class="wpcode-input-text wpcode-input-datetime" id="%1$s" name="%1$s" value="%2$s" placeholder="%3$s" %4$s />',
			esc_attr( $id ),
			esc_attr( $value ),
			esc_attr( $placeholder ),
			$readonly ? 'readonly' : ''
		);
		if ( ! empty( $clear_text ) ) {
			$markup .= sprintf(
				'<button type="button" class="wpcode-input-button wpcode-input-button-clear" title="%1$s" style="%3$s">%2$s</button>',
				esc_attr( $clear_text ),
				get_wpcode_icon( 'close', 16, 16 ),
				! empty( $value ) ? '' : 'display:none;'
			);
		}
		$markup .= '</div>';

		return $markup;
	}

	/**
	 * Add extra snippet data.
	 *
	 * @param WPCode_Snippet $snippet Snippet about to be saved, passed by reference.
	 *
	 * @return void
	 */
	public function add_extra_snippet_data( &$snippet ) {
	}

	/**
	 * Markup for shortcode locations
	 * 
	 * @return void
	 */
	public function get_shortcode_locations() {
		$button = sprintf(
			'<button class="wpcode-button wpcode-button-secondary" id="wpcode-find-locations" type="button">
				<span>%s</span>
			</button>',
			__('Find Where This Shortcode Is Used', 'insert-headers-and-footers')
		);
	
		$help = $this->help_icon(
			__( 'Click to search for any posts or pages where this shortcode is being used.', 'insert-headers-and-footers' ),
			false
		);
	
		$input = '<div id="wpcode-shortcode-locations-list" class="wpcode-shortcode-locations-list">';
		$input .= '<div class="wpcode-button-row">' . $button . $help . '</div>';
		$input .= '<div id="wpcode-locations-list"></div>';
		$input .= '</div>';
	
		$this->metabox_row(
			__( 'Locations Used', 'insert-headers-and-footers' ),
			$input,
			'wpcode-shortcode-locations',
			'',
			''
		);
	}

	/**
	 * Markup for the code revisions metabox.
	 *
	 * @return void
	 */
	public function field_code_revisions() {
		$html = sprintf(
			'<p>%s</p><hr />',
			esc_html__( 'As you make changes to your snippet and save, you will get a list of previous versions with all the changes made in each revision. You can compare revisions to the current version or see changes as they have been saved by going through each revision. Any of the revisions can then be restored as needed.', 'insert-headers-and-footers' )
		);

		$html .= $this->code_revisions_list();
		$this->metabox(
			__( 'Code Revisions', 'insert-headers-and-footers' ),
			$html,
			__( 'Easily switch back to a previous version of your snippet.', 'insert-headers-and-footers' )
		);
	}

	/**
	 * Markup for the device type metabox.
	 *
	 * @return void
	 */
	public function field_device_type() {
		$html = sprintf(
			'<p>%s</p>',
			esc_html__( 'Limit where you want this snippet to be loaded by device type. By default, snippets are loaded on all devices.', 'insert-headers-and-footers' )
		);

		$html .= '<div class="wpcode-separator"></div>';
		$html .= $this->device_type_picker();
		$this->metabox(
			__( 'Device Type', 'insert-headers-and-footers' ),
			$html
		);
	}

	/**
	 * This method returns the markup for the device type radio input picker, the
	 * three options available are Any device type, Desktop only and Mobile only.
	 * By default, any device type is selected.
	 *
	 * @return string
	 */
	public function device_type_picker() {
		$html  = '<div class="wpcode-device-type-picker wpcode-device-type-picker-lite">';
		$html .= $this->get_radio_field_icon( 'devices', __( 'Any device type', 'insert-headers-and-footers' ), 'any', '', true );
		$html .= $this->get_radio_field_icon( 'desktop', __( 'Desktop only', 'insert-headers-and-footers' ), 'desktop', '', false, '', true );
		$html .= $this->get_radio_field_icon( 'mobile', __( 'Mobile only', 'insert-headers-and-footers' ), 'mobile', '', false, '', true );
		$html .= '</div>';

		return $html;
	}

	/**
	 * Get a styled radio input with an icon.
	 *
	 * @param string $icon Icon to use for label, @see get_wpcode_icon
	 * @param string $label The text of the label to display.
	 * @param string $value The value of the radio input.
	 * @param string $name The input name (for PHP).
	 * @param bool   $checked Whether the input is checked or not.
	 * @param string $id Unique id for the input, by default name + value will be used.
	 * @param bool   $disabled Whether the input should be disabled.
	 *
	 * @return string
	 */
	public function get_radio_field_icon( $icon = '', $label = '', $value = '', $name = '', $checked = false, $id = '', $disabled = false ) {

		$id    = empty( $id ) ? $name . '-' . $value : $id;
		$html  = '<div class="wpcode-input-radio">';
		$html .= sprintf(
			'<input type="radio" name="%1$s" id="%2$s" value="%3$s" %4$s %5$s />',
			esc_attr( $name ),
			esc_attr( $id ),
			esc_attr( $value ),
			checked( $checked, true, false ),
			disabled( $disabled, true, false )
		);
		$html .= sprintf(
			'<label for="%1$s"><span class="wpcode-input-radio-icon">%2$s</span><span class="wpcode-input-radio-label">%3$s</span></label>',
			esc_attr( $id ),
			get_wpcode_icon( $icon, 48, 48 ),
			wp_kses_post( $label )
		);
		$html .= '</div>';

		return $html;
	}

	/**
	 * List of code revision items.
	 *
	 * @return string
	 */
	public function code_revisions_list() {
		return $this->code_revisions_list_with_notice(
			esc_html__( 'Code Revisions is a Pro Feature', 'insert-headers-and-footers' ),
			sprintf(
				'<p>%s</p>',
				esc_html__( 'Upgrade to WPCode Pro today and start tracking revisions and see exactly who, when and which changes were made to your snippet.', 'insert-headers-and-footers' )
			),
			array(
				'text' => esc_html__( 'Upgrade to Pro and Unlock Revisions', 'insert-headers-and-footers' ),
				'url'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'snippet-editor', 'revisions', 'upgrade-to-pro' ),
			),
			array(
				'text' => esc_html__( 'Learn more about all the features', 'insert-headers-and-footers' ),
				'url'  => wpcode_utm_url( 'https://wpcode.com/lite/', 'snippet-editor', 'revisions', 'features' ),
			)
		);
	}

	/**
	 * Display a notice if the snippet loaded for editing triggered an error.
	 *
	 * @return void
	 */
	public function maybe_show_error_notice() {
		if ( ! isset( $this->snippet ) ) {
			return;
		}
		if ( $this->is_locked ) {
			?>
			<div class="notice-warning fade notice is-dismissible">
				<p>
					<?php
					// Translators: The placeholder gets replaced with the display name of the user currently editing the snippet.
					printf( esc_html__( 'Notice: %1$s is also editing this snippet. Please be aware that your changes could be overwritten.', 'insert-headers-and-footers' ), esc_html( $this->locked_by ) );
					?>
				</p>
			</div>
			<?php
		}
		$last_error = $this->snippet->get_last_error();
		if ( empty( $last_error ) ) {
			return;
		}
		$error_line      = isset( $last_error['error_line'] ) ? $last_error['error_line'] : false;
		$time            = $last_error['time'];
		$logging_enabled = wpcode()->settings->get_option( 'error_logging' );
		if ( $logging_enabled ) {
			$button_text = esc_html__( 'View Error Logs', 'insert-headers-and-footers' );
			$button_url  = add_query_arg(
				array(
					'page' => 'wpcode-tools',
					'view' => 'logs',
				),
				admin_url( 'admin.php' )
			);
		} else {
			$button_text = esc_html__( 'Enable Error Logging', 'insert-headers-and-footers' );
			$button_url  = add_query_arg(
				array(
					'page' => 'wpcode-settings',
					'view' => 'errors',
				),
				admin_url( 'admin.php' )
			);
		}
		?>
		<div class="info fade notice is-dismissible">
			<?php if ( 'deactivated' === $last_error['wpc_type'] ) { ?>
				<p>
					<?php
					printf(
					// Translators: The placeholder gets replaced with the time passed since the snippet was deactivated.
						esc_html__( 'This snippet was automatically deactivated due to an error at %1$s on %2$s (%3$s ago).', 'insert-headers-and-footers' ),
						gmdate( 'H:i:s', $last_error['time'] ),
						gmdate( 'Y-m-d', $last_error['time'] ),
						human_time_diff( $last_error['time'] )
					);
					?>
				</p>
			<?php } else { ?>
				<p>
					<?php
					printf(
					// Translators: The placeholder gets replaced with the time passed since the snippet was deactivated.
						esc_html__( 'This snippet first threw an error at %1$s on %2$s (%3$s ago).', 'insert-headers-and-footers' ),
						gmdate( 'H:i:s', $time ),
						gmdate( 'Y-m-d', $time ),
						human_time_diff( $time )
					);
					?>
				</p>
			<?php } ?>
			<p>
				<?php
				// Display the error message after a label.
				printf( '<strong>%s</strong>', esc_html__( 'Error message:', 'insert-headers-and-footers' ) );
				?>
			</p>
			<pre class="wpcode-error-preview"><?php echo esc_html( wpcode()->error->get_error_message_short( $last_error['message'] ) ); ?></pre>
			<?php if ( $error_line ) { ?>
				<p>
					<?php
					printf(
					// Translators: The placeholders make the text bold and add the line number.
						esc_html__( 'The error occurred on %1$sline %3$d%2$s of this snippet\'s code (highlighted below).', 'insert-headers-and-footers' ),
						'<strong>',
						'</strong>',
						absint( $error_line )
					);
					?>
				</p>
			<?php } ?>

			<?php if ( ! empty( $last_error['url'] ) ) { ?>
				<p>
					<?php
					printf(
					// Translators: The placeholder is replaced with the URL where the error happened.
						esc_html__( 'The error was triggered at the following URL: %1$s', 'insert-headers-and-footers' ),
						'<a href=' . esc_url( $last_error['url'] ) . ' target="_blank" rel="noopener noreferrer">' . esc_url( $last_error['url'] ) . '</a>'
					);
					?>
				</p>
			<?php } ?>
			<p>
				<?php
				if ( $logging_enabled ) {
					printf(
					// Translators: The placeholders are for the link to the error logs.
						esc_html__( 'You can %1$sview the error log%2$s to get more details about the error that caused this. The error will also be in a snippet-specific log whose name starts with snippet-%3$d (the id of this snippet).', 'insert-headers-and-footers' ),
						'<a href="' . esc_url( $button_url ) . '">',
						'</a>',
						absint( $this->snippet->get_id() )
					);
				} else {
					esc_html_e( 'You can enable error logging to get more details about the error that caused this.', 'insert-headers-and-footers' );
				}
				?>
			</p>
			<p>
				<?php esc_html_e( 'This message will disappear when the snippet is updated.', 'insert-headers-and-footers' ); ?>
			</p>
			<p>
				<a href="<?php echo esc_url( $button_url ); ?>" class="button button-primary">
					<?php echo esc_html( $button_text ); ?>
				</a>
				<a href="<?php echo esc_url( wpcode_utm_url( 'https://wpcode.com/docs/how-to-debug-php-errors-in-wpcode/', 'snippet-error-notice', 'edit-snippet' ) ); ?>" class="button button-secondary" target="_blank" rel="noopener noreferrer">
					<?php esc_html_e( 'Learn More', 'insert-headers-and-footers' ); ?>
				</a>
			</p>
		</div>
		<?php
	}

	/**
	 * Get a list of custom conditional logic operators for the conditional logic builder.
	 *
	 * @return array
	 */
	public function get_conditional_logic_operators_custom_labels() {
		$options = wpcode()->conditional_logic->get_all_admin_options();

		$labels = array();

		foreach ( $options as $option ) {
			foreach ( $option['options'] as $key => $opt_group ) {
				if ( ! empty( $opt_group['operator_labels'] ) ) {
					$labels[ $key ] = $opt_group['operator_labels'];
				}
				if ( ! empty( $opt_group['placeholder'] ) ) {
					if ( ! isset( $labels[ $key ] ) ) {
						$labels[ $key ] = array();
					}
					$labels[ $key ]['placeholder'] = $opt_group['placeholder'];
				}
			}
		}

		return $labels;
	}

	/**
	 * Get the markup for the AI generate button.
	 *
	 * @param string $class The class to add to the button.
	 *
	 * @return void
	 */
	public function ai_generate_button( $class = 'wpcode-button-ai-not-available' ) {
		?>
		<button class="wpcode-button wpcode-button-secondary wpcode-button-just-icon wpcode-ai-improve wpcode-button-ai-generate <?php echo esc_attr( $class ); ?>" id="wpcode-ai-improve" type="button" data-show-if-id="#wpcode_snippet_type" data-show-if-value="php" title="<?php esc_attr_e( 'Use AI to improve your snippet by describing the changes you want', 'insert-headers-and-footers' ); ?>">
			<?php wpcode_icon( 'aisparks', 16, 16, '0 0 29.57 30' ); ?>
		</button>
		<?php
	}
}
includes/admin/pages/class-wpcode-admin-page-click.php000064400000027342151331545640016740 0ustar00<?php
/**
 * Admin page for handling 1-click install of public snippets in the WPCode library.
 *
 * @package WPCode
 */

/**
 * Class for the 1-Click admin page.
 */
class WPCode_Admin_Page_Click extends WPCode_Admin_Page {

	/**
	 * The page slug to be used when adding the submenu.
	 *
	 * @var string
	 */
	public $page_slug = 'wpcode-click';

	/**
	 * The action used for the nonce.
	 *
	 * @var string
	 */
	protected $action = 'wpcode-click';

	/**
	 * The nonce name field.
	 *
	 * @var string
	 */
	protected $nonce_name = 'wpcode-click_nonce';

	/**
	 * Hide this page in the menu.
	 *
	 * @var bool
	 */
	public $hide_menu = true;

	/**
	 * Call this just to set the page title translatable.
	 */
	public function __construct() {
		$this->page_title = __( '1-Click', 'insert-headers-and-footers' );
		parent::__construct();
	}

	/**
	 * Register hook on admin init just for this page.
	 *
	 * @return void
	 */
	public function page_hooks() {
		add_action( 'admin_init', array( $this, 'submit_listener' ) );
	}

	/**
	 * Override to hide default header on this page.
	 *
	 * @return void
	 */
	public function output_header() {

	}

	/**
	 * Wrap this page in a form tag.
	 *
	 * @return void
	 */
	public function output() {
		?>
		<form action="<?php echo esc_url( $this->get_page_action_url() ); ?>" method="post">
			<?php parent::output(); ?>
		</form>
		<?php
	}

	/**
	 * The page output.
	 *
	 * @return void
	 */
	public function output_content() {
		?>
		<div class="wpcode-modal-area">
			<div class="wpcode-modal-header">
				<?php $this->logo_image(); ?>
			</div>
			<?php
			$snippet_hash = get_transient( 'wpcode_deploy_snippet_id' );
			// Let's see if we're in the middle of a fresh installation from the library.
			if ( isset( $_GET['message'] ) && 'wpcode-deploy' === $_GET['message'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				if ( ! wpcode()->library_auth->has_auth() ) {
					?>
					<h3><?php esc_html_e( 'Connect your site to the WPCode Library', 'insert-headers-and-footers' ); ?></h3>
					<p><?php esc_html_e( 'You\'re almost there! To finish installing the snippet, you need to connect your site to your account on the WPCode Library. This will allow you to install snippets directly to your site in the future.', 'insert-headers-and-footers' ); ?></p>
					<p><?php esc_html_e( 'You\'ll also get access to tens of free expert-curated snippets that can be installed with 1-click from inside the plugin.', 'insert-headers-and-footers' ); ?></p>
					<div class="wpcode-buttons-row">
						<button class="wpcode-button wpcode-button-large wpcode-start-auth">
							<?php esc_html_e( 'Connect to Library', 'insert-headers-and-footers' ); ?>
						</button>
					</div>
					<?php
				} else {
					// The site is connected to the library but it must mean it's connected to another account in which case they should connect to their own account.
					?>
					<h3><?php esc_html_e( 'Your site is already connected to the  WPCode Library using another account', 'insert-headers-and-footers' ); ?></h3>
					<p>
						<?php esc_html_e( 'In order to continue installing the snippet from the WPCode library you have to either login to the Library with the same account used to connect this site to the WPCode library initially or disconnect this site from the WPCode library and connect using your own account.', 'insert-headers-and-footers' ); ?>
					</p>
					<div class="wpcode-buttons-row">
						<button class="wpcode-button wpcode-delete-auth">
							<?php esc_html_e( 'Disconnect Site From Library', 'insert-headers-and-footers' ); ?>
						</button>
						<a class="wpcode-button" href="<?php echo esc_url( wpcode()->library_auth->library_url ); ?>/account">
							<?php esc_html_e( 'Login with another user on the WPCode Library', 'insert-headers-and-footers' ); ?>
						</a>
					</div>
					<?php
				}
			} elseif ( false !== $snippet_hash && wpcode()->library_auth->has_auth() && ! isset( $_GET['snippet'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				// We have a snippet hash so let's continue the snippet install process.
				$snippet_url = wpcode()->library_auth->library_url . '/snippet/' . $snippet_hash . '/?deploy=1';
				?>
				<h3><?php esc_html_e( 'Congratulations, your site is now connected!', 'insert-headers-and-footers' ); ?></h3>
				<p><?php esc_html_e( 'Your site is now connected to the WPCode Library and you can install snippets directly from the library. Please click the button below to resume installing the snippet you were viewing.', 'insert-headers-and-footers' ); ?></p>
				<div class="wpcode-buttons-row">
					<a href="<?php echo esc_url( $snippet_url ); ?>" class="wpcode-button wpcode-button-large">
						<?php esc_html_e( 'Resume Snippet Installation', 'insert-headers-and-footers' ); ?>
					</a>
				</div>
				<?php
				delete_transient( 'wpcode_deploy_snippet_id' );
			} elseif ( ! wpcode()->library_auth->has_auth() ) { // Let's make sure the site is authenticated with the library.
				?>
				<h3><?php esc_html_e( 'Your site is not connected to the WPCode library.', 'insert-headers-and-footers' ); ?></h3>
				<p><?php esc_html_e( 'Connect now to enable installing public snippets from the WPCode library with 1-click and also get access to tens of expert-curated snippets that you can install from inside the plugin.', 'insert-headers-and-footers' ); ?></p>
				<div class="wpcode-buttons-row">
					<button class="wpcode-button wpcode-button-large wpcode-start-auth">
						<?php esc_html_e( 'Connect to Library', 'insert-headers-and-footers' ); ?>
					</button>
				</div>
				<?php
				// Let's check that we have a snippet hash to load.
			} elseif ( empty( $_GET['snippet'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				?>
				<div class="notice notice-error">
					<p><?php esc_html_e( 'No snippet provided.', 'insert-headers-and-footers' ); ?></p>
				</div>
				<?php
				// Let's check that the site is authenticated.
			} elseif ( empty( $_GET['auth'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				?>
				<div class="notice notice-error">
					<p><?php esc_html_e( 'Missing authentication token, please click the link in the WPCode Library again.', 'insert-headers-and-footers' ); ?></p>
				</div>
				<?php
			} else {
				// Let's make sure they don't get redirect again if they reached this point.
				delete_transient( 'wpcode_deploy_snippet_id' );
				// Let's attempt to load the snippet data from the library.
				$auth            = sanitize_key( $_GET['auth'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$snippet_hash    = sanitize_key( $_GET['snippet'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
				$snippet_request = wpcode()->library->get_public_snippet( $snippet_hash, $auth );

				if ( ! isset( $snippet_request['status'] ) || 'success' !== $snippet_request['status'] ) {
					// We have an error. Let's default to a generic message.
					$error = __( 'We encountered an error loading your snippet, please try again in a few minutes', 'insert-headers-and-footers' );
					if ( isset( $snippet_request['message'] ) ) {
						// If there is a message, let's use that instead.
						$error = sprintf(
						/* translators: %s: The error message from the API. */
							__( 'We encountered the following error loading your snippet: %s', 'insert-headers-and-footers' ),
							$snippet_request['message']
						);
					}
					$go_back_url = wpcode()->library_auth->library_url . '/snippet/' . $snippet_hash;

					?>
					<div class="notice notice-error">
						<p><?php echo esc_html( $error ); ?></p>
					</div>
					<div class="wpcode-buttons-row">
						<a href="<?php echo esc_url( $go_back_url ); ?>" class="wpcode-button"><?php esc_html_e( 'Go back to the library', 'insert-headers-and-footers' ); ?></a>
					</div>
					<?php
				} else {
					$snippet       = $snippet_request['data'];
					$snippet_types = wpcode()->execute->get_options();
					// Let's show a preview of the snippet and ask the user to confirm.
					?>
					<h1><?php esc_html_e( 'Library Snippet Preview', 'insert-headers-and-footers' ); ?></h1>
					<p><?php esc_html_e( 'Please review the snippet below and confirm that you would like to install it.', 'insert-headers-and-footers' ); ?></p>
					<h3>
						<?php
						// Translators: %s: The snippet name.
						printf( esc_html__( 'Snippet title: %s', 'insert-headers-and-footers' ), esc_html( $snippet['title'] ) );
						?>
					</h3>
					<div class="wpcode-code-textarea">
						<div class="wpcode-flex">
							<div class="wpcode-column">
								<h3><?php esc_html_e( 'Code preview', 'insert-headers-and-footers' ); ?></h3>
							</div>
							<div class="wpcode-column">
								<div class="wpcode-input-select">
									<label for="wpcode_snippet_type"><?php esc_html_e( 'Code Type', 'insert-headers-and-footers' ); ?></label>
									<select disabled>
										<?php
										foreach ( $snippet_types as $key => $label ) {
											if ( $key !== $snippet['code_type'] ) {
												continue;
											}
											?>
											<option selected><?php echo esc_html( $label ); ?></option>
											<?php
										}
										?>
									</select>
								</div>
							</div>
						</div>
						<textarea id="wpcode-code-preview"><?php echo esc_textarea( $snippet['code'] ); ?></textarea>
					</div>
					<div class="wpcode-buttons-row">
						<input type="hidden" name="snippet" value="<?php echo esc_attr( $snippet['cloud_id'] ); ?>">
						<input type="hidden" name="auth" value="<?php echo esc_attr( $auth ); ?>">
						<button class="wpcode-button wpcode-button-large"><?php esc_html_e( 'Confirm & Install Snippet', 'insert-headers-and-footers' ); ?></button>
					</div>
					<?php

					$editor = new WPCode_Code_Editor( esc_js( $snippet['code_type'] ) );
					$editor->set_setting( 'readOnly', 'nocursor' );
					$editor->register_editor( 'wpcode-code-preview' );
					$editor->init_editor();
				}

				wp_nonce_field( $this->action, $this->nonce_name );
			}
			?>
		</div>
		<?php
	}

	/**
	 * For this page we output a title and the save button.
	 *
	 * @return void
	 */
	public function output_header_bottom() {
		?>
		<div class="wpcode-column">
			<h1><?php esc_html_e( 'Confirm Snippet Installation', 'insert-headers-and-footers' ); ?></h1>
		</div>
		<?php
	}

	/**
	 * If the form is submitted attempt to save the values.
	 *
	 * @return void
	 */
	public function submit_listener() {
		if ( ! isset( $_REQUEST[ $this->nonce_name ] ) || ! wp_verify_nonce( sanitize_key( $_REQUEST[ $this->nonce_name ] ), $this->action ) ) {
			// Nonce is missing, so we're not even going to try.
			return;
		}

		if ( ! current_user_can( 'wpcode_edit_snippets' ) ) {
			// Should not be able to load this page at all without that permission but let's check anyway.
			return;
		}

		$snippet_hash = isset( $_REQUEST['snippet'] ) ? sanitize_key( $_REQUEST['snippet'] ) : false;
		$auth         = isset( $_REQUEST['auth'] ) ? sanitize_key( $_REQUEST['auth'] ) : false;
		// Let's load the data reliably again - it's saved in a transient so it should be fast.
		$snippet_data = wpcode()->library->get_public_snippet( $snippet_hash, $auth );

		// You should not be able to submit this form if the hash is invalid but let's check anyway.
		if ( ! isset( $snippet_data['status'] ) || 'success' !== $snippet_data['status'] ) {
			// This should not happen if you did not manually change the hash, so we can just return.
			return;
		}

		// Let's create a new snippet.
		$snippet = new WPCode_Snippet( $snippet_data['data'] );
		// Let's save the snippet.
		if ( $snippet->save() ) {
			// If successfully saved let's redirect to the edit screen.
			wp_safe_redirect(
				add_query_arg(
					array(
						'page'       => 'wpcode-snippet-manager',
						'snippet_id' => $snippet->get_id(),
					),
					admin_url( 'admin.php' )
				)
			);
			exit;
		}
	}
}
includes/admin/pages/class-wpcode-admin-page.php000064400000124473151331545640015660 0ustar00<?php
/**
 * Admin pages abstract class.
 *
 * @package WPCode
 */

/**
 * Class Admin_Page
 */
abstract class WPCode_Admin_Page {

	/**
	 * The page slug.
	 *
	 * @var string
	 */
	public $page_slug = '';

	/**
	 * The page title.
	 *
	 * @var string
	 */
	public $page_title = '';

	/**
	 * The menu title, defaults to the page title.
	 *
	 * @var string
	 */
	public $menu_title;

	/**
	 * If there's an error message, let's store it here.
	 *
	 * @var string
	 */
	public $message_error;

	/**
	 * If there's a success message, store it here.
	 *
	 * @var string
	 */
	public $message_success;
	/**
	 * The code type to be used by CodeMirror.
	 *
	 * @var string
	 */
	public $code_type = 'html';
	/**
	 * Whether the current user can edit the code on the current page.
	 *
	 * @var bool
	 */
	protected $can_edit = false;
	/**
	 * If true, the snippet library is shown, otherwise, we display
	 * the snippet editor.
	 *
	 * @var bool
	 */
	protected $show_library = false;

	/**
	 * The current view.
	 *
	 * @var string
	 */
	public $view = '';

	/**
	 * The available views for this page.
	 *
	 * @var array
	 */
	public $views = array();

	/**
	 * If the submenu for the page should be hidden, set this to true.
	 *
	 * @var bool
	 */
	public $hide_menu = false;

	/**
	 * The capability needed for the current user to view this page.
	 *
	 * @var string
	 */
	protected $capability = 'wpcode_edit_snippets';

	/**
	 * Constructor.
	 */
	public function __construct() {
		if ( ! isset( $this->menu_title ) ) {
			$this->menu_title = $this->page_title;
		}

		$this->hooks();
	}

	/**
	 * Add hooks to register the page and output content.
	 *
	 * @return void
	 */
	public function hooks() {
		add_action( 'admin_menu', array( $this, 'add_page' ) );
		$page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		// Only load if we are actually on the desired page.
		if ( $this->page_slug !== $page ) {
			return;
		}
		if ( ! current_user_can( $this->capability ) ) {
			wp_die( esc_html__( 'You do not have permission to access this page.', 'insert-headers-and-footers' ) );
		}
		remove_all_actions( 'admin_notices' );
		remove_all_actions( 'all_admin_notices' );
		add_action( 'wpcode_admin_page', array( $this, 'output' ) );
		add_action( 'wpcode_admin_page', array( $this, 'output_footer' ) );
		add_action( 'admin_enqueue_scripts', array( $this, 'page_scripts' ) );
		add_filter( 'admin_body_class', array( $this, 'page_specific_body_class' ) );
		add_filter( 'wpcode_admin_js_data', array( $this, 'maybe_add_library_data' ) );
		add_action( 'admin_init', array( $this, 'maybe_redirect_to_click' ) );

		$this->setup_views();
		$this->set_current_view();
		$this->page_hooks();
	}

	/**
	 * Get the post type for this page.
	 *
	 * @return string
	 */
	public function get_post_type() {
		return wpcode_get_post_type();
	}

	/**
	 * Override in child class to define page-specific hooks that will run only
	 * after checks have been passed.
	 *
	 * @return void
	 */
	public function page_hooks() {
	}

	/**
	 * Add the submenu page.
	 *
	 * @return void
	 */
	public function add_page() {
		add_submenu_page(
			'wpcode',
			$this->page_title,
			$this->menu_title,
			$this->capability,
			$this->page_slug,
			array(
				wpcode()->admin_page_loader,
				'admin_menu_page',
			)
		);
	}

	/**
	 * If the page has views, this is where you should assign them to $this->views.
	 *
	 * @return void
	 */
	protected function setup_views() {
	}

	/**
	 * Set the current view from the query param also checking it's a registered view for this page.
	 *
	 * @return void
	 */
	protected function set_current_view() {
		// phpcs:disable WordPress.Security.NonceVerification.Recommended
		if ( ! isset( $_GET['view'] ) ) {
			return;
		}
		$view = sanitize_text_field( wp_unslash( $_GET['view'] ) );
		// phpcs:enable WordPress.Security.NonceVerification.Recommended
		if ( array_key_exists( $view, $this->views ) ) {
			$this->view = $view;
		}
	}

	/**
	 * Output the page content.
	 *
	 * @return void
	 */
	public function output() {
		$this->output_header();
		?>
		<div class="wpcode-content">
			<?php
			$this->output_content();
			do_action( "wpcode_admin_page_content_{$this->page_slug}", $this );
			?>
		</div>
		<?php
	}

	/**
	 * Output of the header markup for admin pages.
	 *
	 * @return void
	 */
	public function output_header() {
		?>
		<div class="wpcode-header">
			<div class="wpcode-header-top">
				<div class="wpcode-header-left">
					<?php $this->output_header_left(); ?>
				</div>
				<div class="wpcode-header-right">
					<?php $this->output_header_right(); ?>
				</div>
			</div>
			<div id="wpcode-header-between">
			</div>
			<div class="wpcode-header-bottom">
				<?php $this->output_header_bottom(); ?>
			</div>
		</div>
		<?php $this->maybe_output_message(); ?>
		<?php
	}

	/**
	 * Output footer markup, mostly used for overlays that are fixed.
	 *
	 * @return void
	 */
	public function output_footer() {
		?>
		<div class="wpcode-modal-overlay"></div>
		<div class="wpcode-notifications-overlay"></div>
		<div class="wpcode-docs-overlay" id="wpcode-docs-overlay">
			<?php $this->logo_image( 'wpcode-help-logo' ); ?>
			<button id="wpcode-help-close" class="wpcode-button-just-icon" type="button">
				<?php wpcode_icon( 'close', 19, 19 ); ?>
			</button>
			<div class="wpcode-docs-content">
				<div id="wpcode-help-search" class="wpcode-search-empty">
					<label>
						<span class="screen-reader-text"><?php esc_html_e( 'Search docs', 'insert-headers-and-footers' ); ?></span>
						<?php wpcode_icon( 'search' ); ?>
						<input type="text" class="wpcode-input-text"/>
					</label>
					<div id="wpcode-help-search-clear" title="<?php esc_attr_e( 'Clear', 'insert-headers-and-footers' ); ?>">
						<?php wpcode_icon( 'close', 14, 14 ); ?>
					</div>
				</div>
				<div id="wpcode-help-no-result" style="display: none;">
					<ul class="wpcode-help-docs">
						<li>
							<span><?php esc_html_e( 'No docs found', 'insert-headers-and-footers' ); ?></span>
						</li>
					</ul>
				</div>
				<div id="wpcode-help-result">
					<ul class="wpcode-help-docs"></ul>
				</div>
				<?php
				$docs = new WPCode_Docs();
				$docs->get_categories_accordion();
				$support_url = wpcode_utm_url( 'https://wpcode.com/contact/', 'help-overlay', 'support-url' );
				?>
				<div class="wpcode-help-footer">
					<div class="wpcode-help-footer-box">
						<?php wpcode_icon( 'file', 48, 48 ); ?>
						<h3><?php esc_html_e( 'View Documentation', 'insert-headers-and-footers' ); ?></h3>
						<p><?php esc_html_e( 'Browse documentation, reference material, and tutorials for WPCode.', 'insert-headers-and-footers' ); ?></p>
						<a class="wpcode-button wpcode-button-secondary" href="<?php echo esc_url( wpcode_utm_url( 'https://wpcode.com/docs/', 'help-overlay', 'docs', 'footer' ) ); ?>" target="_blank"><?php esc_html_e( 'View All Documentation', 'insert-headers-and-footers' ); ?></a>
					</div>
					<div class="wpcode-help-footer-box">
						<?php wpcode_icon( 'support', 48, 48 ); ?>
						<h3><?php esc_html_e( 'Get Support', 'insert-headers-and-footers' ); ?></h3>
						<p><?php esc_html_e( 'Submit a ticket and our world class support team will be in touch soon.', 'insert-headers-and-footers' ); ?></p>
						<a class="wpcode-button wpcode-button-secondary" href="<?php echo esc_url( $support_url ); ?>" target="_blank"><?php esc_html_e( 'Submit a Support Ticket', 'insert-headers-and-footers' ); ?></a>
					</div>
				</div>
			</div>
		</div>
		<div class="wpcode-notifications-drawer" id="wpcode-notifications-drawer">
			<div class="wpcode-notifications-header">
				<h3 id="wpcode-active-title">
					<?php
					printf(
						wp_kses_post(
						// Translators: Placeholder for the number of active notifications.
							__( 'New Notifications (%s)', 'insert-headers-and-footers' )
						),
						'<span id="wpcode-notifications-count">' . absint( wpcode()->notifications->get_count() ) . '</span>'
					);
					?>
				</h3>
				<h3 id="wpcode-dismissed-title">
					<?php
					printf(
						wp_kses_post(
						// Translators: Placeholder for the number of dismissed notifications.
							__( 'Notifications (%s)', 'insert-headers-and-footers' )
						),
						'<span id="wpcode-notifications-dismissed-count">' . absint( wpcode()->notifications->get_dismissed_count() ) . '</span>'
					);
					?>
				</h3>
				<button type="button" class="wpcode-button-text" id="wpcode-notifications-show-dismissed">
					<?php esc_html_e( 'Dismissed Notifications', 'insert-headers-and-footers' ); ?>
				</button>
				<button type="button" class="wpcode-button-text" id="wpcode-notifications-show-active">
					<?php esc_html_e( 'Active Notifications', 'insert-headers-and-footers' ); ?>
				</button>
				<button type="button" class="wpcode-just-icon-button wpcode-notifications-close"><?php wpcode_icon( 'close', 12, 12, '0 0 16 16' ); ?></button>
			</div>
			<div class="wpcode-notifications-list">
				<ul class="wpcode-notifications-active">
					<?php
					$notifications = wpcode()->notifications->get_active_notifications();
					foreach ( $notifications as $notification ) {
						$this->get_notification_markup( $notification );
					}
					?>
				</ul>
				<ul class="wpcode-notifications-dismissed">
					<?php
					$notifications = wpcode()->notifications->get_dismissed_notifications();
					foreach ( $notifications as $notification ) {
						$this->get_notification_markup( $notification );
					}
					?>
				</ul>
			</div>
			<div class="wpcode-notifications-footer">
				<button type="button" class="wpcode-button-text wpcode-notification-dismiss" id="wpcode-dismiss-all" data-id="all"><?php esc_html_e( 'Dismiss all', 'insert-headers-and-footers' ); ?></button>
			</div>
		</div>
		<span class="wpcode-loading-spinner" id="wpcode-admin-spinner"></span>
		<?php
	}

	/**
	 * Get the notification HTML markup for displaying in a list.
	 *
	 * @param array $notification The notification array.
	 *
	 * @return void
	 */
	public function get_notification_markup( $notification ) {
		$type = ! empty( $notification['icon'] ) ? $notification['icon'] : 'info';
		?>
		<li>
			<div class="wpcode-notification-icon"><?php wpcode_icon( $type, 18, 18 ); ?></div>
			<div class="wpcode-notification-content">
				<h4><?php echo esc_html( $notification['title'] ); ?></h4>
				<p><?php echo wp_kses_post( $notification['content'] ); ?></p>
				<p class="wpcode-start"><?php echo esc_html( $notification['start'] ); ?></p>
				<div class="wpcode-notification-actions">
					<?php
					$main_button = ! empty( $notification['btns']['main'] ) ? $notification['btns']['main'] : false;
					$alt_button  = ! empty( $notification['btns']['alt'] ) ? $notification['btns']['alt'] : false;
					if ( $main_button ) {
						?>
						<a href="<?php echo esc_url( $main_button['url'] ); ?>" class="wpcode-button wpcode-button-small" target="_blank">
							<?php echo esc_html( $main_button['text'] ); ?>
						</a>
						<?php
					}
					if ( $alt_button ) {
						?>
						<a href="<?php echo esc_url( $alt_button['url'] ); ?>" class="wpcode-button wpcode-button-secondary wpcode-button-small" target="_blank">
							<?php echo esc_html( $alt_button['text'] ); ?>
						</a>
						<?php
					}
					?>
					<button type="button" class="wpcode-button-text wpcode-notification-dismiss" data-id="<?php echo esc_attr( $notification['id'] ); ?>"><?php esc_html_e( 'Dismiss', 'insert-headers-and-footers' ); ?></button>
				</div>
			</div>
		</li>
		<?php
	}

	/**
	 * Left side of the header, usually just the logo in this area.
	 *
	 * @return void
	 */
	public function output_header_left() {
		$this->logo_image();
	}

	/**
	 * Logo image.
	 *
	 * @param string $id Id of the image.
	 *
	 * @return void
	 */
	public function logo_image( $id = 'wpcode-header-logo' ) {
		$logo = get_wpcode_icon( 'logo-text', 132, 33, '0 0 132 33', $id );

		if ( wpcode()->settings->get_option( 'dark_mode' ) ) {
			$logo = str_replace( '11293E', 'CCCCCC', $logo );
		}

		echo wp_kses( $logo, wpcode_get_icon_allowed_tags() );
	}

	/**
	 * Top right area of the header, by default the notifications and help icons.
	 *
	 * @return void
	 */
	public function output_header_right() {
		$notifications_count = wpcode()->notifications->get_count();
		$dismissed_count     = wpcode()->notifications->get_dismissed_count();
		$data_count          = '';
		if ( $notifications_count > 0 ) {
			$data_count = sprintf(
				'data-count="%d"',
				absint( $notifications_count )
			);
		}
		echo '<span class="wpcode-toggle-testing-mode-wrap">';
		echo $this->get_checkbox_toggle( wpcode_testing_mode_enabled(), 'wpcode-toggle-testing-mode', '', '', esc_html__( 'Testing Mode', 'insert-headers-and-footers' ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
		echo '</span>';
		?>
		<button
				type="button"
				id="wpcode-notifications-button"
				class="wpcode-button-just-icon wpcode-notifications-inbox wpcode-open-notifications"
				data-dismissed="<?php echo esc_attr( $dismissed_count ); ?>"
			<?php echo $data_count; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>>
			<?php wpcode_icon( 'inbox', 15, 16 ); ?>
		</button>
		<button class="wpcode-text-button-icon wpcode-show-help" type="button">
			<?php wpcode_icon( 'help', 21 ); ?>
			<?php esc_html_e( 'Help', 'insert-headers-and-footers' ); ?>
		</button>
		<?php
	}

	/**
	 * This is the menu area but on some pages it's just at title.
	 * Tabs could also be used here.
	 *
	 * @return void
	 */
	public function output_header_bottom() {
	}

	/**
	 * Checks if an error or success message is available and outputs using the specific format.
	 *
	 * @return void
	 */
	public function maybe_output_message() {
		$error_message   = $this->get_error_message();
		$success_message = $this->get_success_message();
		?>
		<div class="wrap" id="wpcode-notice-area">
			<?php
			if ( $error_message ) {
				?>
				<div class="error fade notice is-dismissible">
					<p><?php echo wp_kses_post( $error_message ); ?></p>
				</div>
				<?php
			}
			if ( $success_message ) {
				?>
				<div class="updated fade notice is-dismissible">
					<p><?php echo wp_kses_post( $success_message ); ?></p>
				</div>
				<?php
			}
			do_action( 'wpcode_admin_notices' );
			?>
		</div>
		<?php
	}

	/**
	 * If no message is set return false otherwise return the message string.
	 *
	 * @return false|string
	 */
	public function get_error_message() {
		return ! empty( $this->message_error ) ? $this->message_error : false;
	}

	/**
	 * If no message is set return false otherwise return the message string.
	 *
	 * @return false|string
	 */
	public function get_success_message() {
		return ! empty( $this->message_success ) ? $this->message_success : false;
	}

	/**
	 * This is the main page content and you can't get away without it.
	 *
	 * @return void
	 */
	abstract public function output_content();

	/**
	 * If you need to page-specific scripts override this function.
	 * Hooked to 'admin_enqueue_scripts'.
	 *
	 * @return void
	 */
	public function page_scripts() {
	}

	/**
	 * Set a success message to display it in the appropriate place.
	 * Let's use a function so if we decide to display multiple messages in the
	 * same instance it's easy to change the variable to an array.
	 *
	 * @param string $message The message to store as success message.
	 *
	 * @return void
	 */
	public function set_success_message( $message ) {
		$this->message_success = $message;
	}

	/**
	 * Set an error message to display it in the appropriate place.
	 * Let's use a function so if we decide to display multiple messages in the
	 * same instance it's easy to change the variable to an array.
	 *
	 * @param string $message The message to store as error message.
	 *
	 * @return void
	 */
	public function set_error_message( $message ) {
		$this->message_error = $message;
	}

	/**
	 * Add a page-specific body class using the page slug variable.
	 * Add a body class specific to the plugin version (lite/pro).
	 *
	 * @param string $body_class The body class to append.
	 *
	 * @return string
	 */
	public function page_specific_body_class( $body_class ) {

		$body_class .= ' ' . $this->page_slug . ' ';

		if ( ! class_exists( 'WPCode_Premium' ) ) {
			$body_class .= ' wpcode-lite-version ';
		} else {
			$body_class .= ' wpcode-pro-version ';
		}

		return $body_class;
	}

	/**
	 * Get the page url to be used in a form action.
	 *
	 * @return string
	 */
	public function get_page_action_url() {
		$args = array(
			'page' => $this->page_slug,
		);
		if ( ! empty( $this->view ) ) {
			$args['view'] = $this->view;
		}
		if ( ! empty( $this->snippet_id ) ) {
			$args['snippet_id'] = $this->snippet_id;
		}

		return add_query_arg( $args, $this->admin_url( 'admin.php' ) );
	}

	/**
	 * Metabox-style layout for admin pages.
	 *
	 * @param string $title The metabox title.
	 * @param string $content The metabox content.
	 * @param string $help The helper text (optional) - if set, a help icon will show up next to the title.
	 *
	 * @return void
	 */
	public function metabox( $title, $content, $help = '' ) {
		// translators: %s is the title of the metabox.
		$button_title = sprintf( __( 'Collapse Metabox %s', 'insert-headers-and-footers' ), $title )
		?>
		<div class="wpcode-metabox">
			<div class="wpcode-metabox-title">
				<div class="wpcode-metabox-title-text">
					<?php echo wp_kses_post( $title ); ?>
					<?php $this->help_icon( $help ); ?>
				</div>
				<div class="wpcode-metabox-title-toggle">
					<button class="wpcode-metabox-button-toggle" type="button" title="<?php echo esc_attr( $button_title ); ?>">
						<svg width="12" height="8" viewBox="0 0 12 8" fill="none" xmlns="http://www.w3.org/2000/svg">
							<path d="M1.41 7.70508L6 3.12508L10.59 7.70508L12 6.29508L6 0.295079L-1.23266e-07 6.29508L1.41 7.70508Z" fill="#454545"/>
						</svg>
					</button>
				</div>
			</div>
			<div class="wpcode-metabox-content">
				<?php echo $content; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
			</div>
		</div>
		<?php
	}

	/**
	 * Output a help icon with the text passed to it.
	 *
	 * @param string $text The tooltip text.
	 * @param bool   $echo Whether to echo or return the output.
	 *
	 * @return void|string
	 */
	public function help_icon( $text = '', $echo = true ) {
		if ( empty( $text ) ) {
			return;
		}
		if ( ! $echo ) {
			ob_start();
		}
		?>
		<span class="wpcode-help-tooltip">
			<?php wpcode_icon( 'help', 16, 16, '0 0 20 20' ); ?>
			<span class="wpcode-help-tooltip-text"><?php echo wp_kses_post( $text ); ?></span>
		</span>
		<?php
		if ( ! $echo ) {
			return ob_get_clean();
		}
	}

	/**
	 * Get a WPCode metabox row.
	 *
	 * @param string $label The label of the field.
	 * @param string $input The field input (html).
	 * @param string $input_id The id of the input that we use in the label.
	 * @param string $show_if_id Conditional logic id, automatically hide if the value of the field with this id doesn't match show if value.
	 * @param string $show_if_value Value(s) to match against, can be comma-separated string for multiple values.
	 * @param string $description Description to show under the input.
	 * @param bool   $is_pro Whether this is a pro feature and the pro indicator should be shown next to the label.
	 * $param string $id The id of the metabox row.
	 *
	 * @return void
	 */
	public function metabox_row( $label, $input, $input_id = '', $show_if_id = '', $show_if_value = '', $description = '', $is_pro = false, $id = '' ) {
		$show_if_rules = '';
		if ( ! empty( $show_if_id ) ) {
			$show_if_rules = sprintf( 'data-show-if-id="%1$s" data-show-if-value="%2$s"', esc_attr( $show_if_id ), esc_attr( $show_if_value ) );
		}
		$id = ! empty( $id ) ? 'id="' . esc_attr( $id ) . '"' : '';
		?>
		<div class="wpcode-metabox-form-row" <?php echo $show_if_rules; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> <?php echo $id; ?>>
			<div class="wpcode-metabox-form-row-label">
				<label for="<?php echo esc_attr( $input_id ); ?>">
					<?php echo esc_html( $label ); ?>
					<?php
					if ( $is_pro ) {
						echo '<span class="wpcode-pro-pill">PRO</span>';
					}
					?>
				</label>
			</div>
			<div class="wpcode-metabox-form-row-input">
				<?php echo $input; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
				<?php if ( ! empty( $description ) ) { ?>
					<p><?php echo wp_kses_post( $description ); ?></p>
				<?php } ?>
			</div>
		</div>
		<?php
	}

	/**
	 * Get a checkbox wrapped with markup to be displayed as a toggle.
	 *
	 * @param bool       $checked Is it checked or not.
	 * @param string     $name The name for the input.
	 * @param string     $description Field description (optional).
	 * @param string|int $value Field value (optional).
	 * @param string     $label Field label (optional).
	 *
	 * @return string
	 */
	public function get_checkbox_toggle( $checked, $name, $description = '', $value = '', $label = '' ) {
		return wpcode_get_checkbox_toggle( $checked, $name, $description, $value, $label );
	}

	/**
	 * Build the markup for the snippet item. Also used as a template for the js.
	 *
	 * @param array  $snippet The snippet object.
	 * @param string $category The active category to display by default.
	 *
	 * @return void
	 */
	public function get_library_snippet_item( $snippet = array(), $category = '*' ) {
		$title                 = '';
		$url                   = '';
		$description           = '';
		$used_library_snippets = wpcode()->library->get_used_library_snippets();
		$button_text           = __( 'Use snippet', 'insert-headers-and-footers' );
		$pill_text             = '';
		$pill_class            = 'blue';
		if ( isset( $snippet['button_text'] ) ) {
			$button_text = $snippet['button_text'];
		}
		if ( isset( $snippet['button_icon'] ) ) {
			$button_text = get_wpcode_icon( $snippet['button_icon'], 16, 16, '0 96 960 960' ) . ' ' . $button_text;
		}
		if ( ! empty( $snippet ) ) {
			if ( empty( $snippet['url'] ) ) {
				if ( ! empty( $used_library_snippets[ $snippet['library_id'] ] ) ) {
					$url         = wpcode()->library->get_edit_snippet_url( $used_library_snippets[ $snippet['library_id'] ] );
					$button_text = __( 'Edit snippet', 'insert-headers-and-footers' );
					$pill_text   = __( 'Used', 'insert-headers-and-footers' );
				} else {
					$url = wpcode()->library->get_install_snippet_url( $snippet['library_id'] );
				}
			} else {
				$url = $snippet['url'];
			}
			$title       = $snippet['title'];
			$description = $snippet['note'];
		}
		$id            = $snippet['library_id'];
		$button_2_text = '';
		if ( ! empty( $snippet['code'] ) ) {
			$button_2_text = __( 'Preview', 'insert-headers-and-footers' );
		}
		$categories = isset( $snippet['categories'] ) ? $snippet['categories'] : array();

		$button_2 = array(
			'text'  => $button_2_text,
			'class' => 'wpcode-button wpcode-button-secondary wpcode-library-preview-button',
		);

		if ( ! empty( $snippet['needs_auth'] ) ) {
			$unlock_text = __( 'Connect to library to unlock (Free)', 'insert-headers-and-footers' );
			if ( isset( $snippet['needs_auth_text'] ) ) {
				$unlock_text = $snippet['needs_auth_text'];
			}
			$button_1 = array(
				'tag'   => 'button',
				'text'  => get_wpcode_icon( 'lock', 17, 22, '0 0 17 22' ) . $unlock_text,
				'class' => 'wpcode-button wpcode-item-use-button wpcode-start-auth wpcode-button-icon',
			);
		} else {
			$button_1 = array(
				'tag'  => 'a',
				'url'  => $url,
				'text' => $button_text,
			);
		}
		if ( ! empty( $snippet['pill_text'] ) ) {
			$pill_text = $snippet['pill_text'];
		}
		if ( ! empty( $snippet['pill_class'] ) ) {
			$pill_class = $snippet['pill_class'];
		}
		$extra_classes = array();
		if ( ! empty( $snippet['extra_classes'] ) && is_array( $snippet['extra_classes'] ) ) {
			$extra_classes = $snippet['extra_classes'];
		}

		$this->get_list_item( $id, $title, $description, $button_1, $button_2, $categories, $pill_text, $pill_class, $category, $extra_classes );
	}

	/**
	 * Get a list item markup, used for library & generators.
	 *
	 * @param string $id The id used for the data-id param (used for filtering).
	 * @param string $title The title of the item.
	 * @param string $description The item description.
	 * @param array  $button_1 The first button config (@see get_list_item_button).
	 * @param array  $button_2 The second button config (@see get_list_item_button).
	 * @param array  $categories The categories of this object (for filtering).
	 * @param string $pill_text (optional) Display a "pill" with some text in the top right corner.
	 * @param string $pill_class (optional) Custom CSS class for the pill.
	 * @param string $selected_category (optional) Slug of the category selected by default.
	 * @param array  $extra_classes (optional) Extra classes to add to the list item.
	 *
	 * @return void
	 */
	public function get_list_item( $id, $title, $description, $button_1, $button_2 = array(), $categories = array(), $pill_text = '', $pill_class = 'blue', $selected_category = '*', $extra_classes = array() ) {
		$item_class = array(
			'wpcode-list-item',
		);
		if ( ! empty( $pill_text ) ) {
			$item_class[] = 'wpcode-list-item-has-pill';
		}
		if ( ! empty( $extra_classes ) ) {
			$item_class = array_merge( $item_class, $extra_classes );
		}
		$style = '';
		if ( '*' !== $selected_category && ! in_array( $selected_category, $categories, true ) ) {
			$style = 'display:none;';
		}
		$button_1 = wp_parse_args(
			$button_1,
			array(
				'tag'   => 'a',
				'class' => 'wpcode-button wpcode-item-use-button',
			)
		);
		$button_2 = wp_parse_args(
			$button_2,
			array(
				'class' => 'wpcode-button wpcode-button-secondary',
			)
		);
		?>
		<li class="<?php echo esc_attr( implode( ' ', $item_class ) ); ?>" data-id="<?php echo esc_attr( $id ); ?>" data-categories='<?php echo wp_json_encode( $categories ); ?>' style="<?php echo esc_attr( $style ); ?>">
			<h3 title="<?php echo esc_attr( $title ); ?>"><?php echo esc_html( $title ); ?></h3>
			<?php if ( ! empty( $pill_text ) ) { ?>
				<span class="wpcode-list-item-pill wpcode-list-item-pill-<?php echo esc_attr( $pill_class ); ?>"><?php echo esc_html( $pill_text ); ?></span>
			<?php } ?>
			<div class="wpcode-list-item-actions">
				<div class="wpcode-list-item-description">
					<p><?php echo esc_html( $description ); ?></p>
				</div>
				<div class="wpcode-list-item-buttons">
					<?php self::get_list_item_button( $button_1 ); ?>
					<?php self::get_list_item_button( $button_2 ); ?>
				</div>
			</div>
			<?php $this->get_list_item_top_actions( $id ); ?>
		</li>
		<?php
	}

	/**
	 * Allow child classes to display additional buttons.
	 *
	 * @param string|int $id The id of the element passed for generating action urls.
	 *
	 * @return void
	 */
	public function get_list_item_top_actions( $id ) {
	}

	/**
	 * Get a button for the list of items.
	 *
	 * @param array $args Arguments for the button.
	 * @param bool  $echo (optional) Whether to echo the button or return it.
	 *
	 * @return void|string
	 */
	public static function get_list_item_button( $args, $echo = true ) {
		$button_settings = wp_parse_args(
			$args,
			array(
				'tag'        => 'button',
				'url'        => '',
				'text'       => '',
				'class'      => 'wpcode-button',
				'attributes' => array(),
			)
		);

		if ( empty( $button_settings['text'] ) ) {
			return;
		}

		$button_settings['class'] = esc_attr( $button_settings['class'] );

		$parsed_attributes = "class='{$button_settings['class']}' ";
		if ( ! empty( $button_settings['url'] ) && 'a' === $button_settings['tag'] ) {
			$parsed_attributes .= 'href="' . esc_url( $button_settings['url'] ) . '" ';
		}
		if ( ! empty( $button_settings['attributes'] ) ) {
			foreach ( $button_settings['attributes'] as $key => $value ) {
				$parsed_attributes .= esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
			}
		}

		if ( $echo ) {
			printf(
				'<%1$s %2$s>%3$s</%1$s>',
				$button_settings['tag'], // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
				$parsed_attributes, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
				wp_kses( $button_settings['text'], wpcode_get_icon_allowed_tags() )
			);
		} else {
			return sprintf(
				'<%1$s %2$s>%3$s</%1$s>',
				$button_settings['tag'], // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
				$parsed_attributes, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
				wp_kses( $button_settings['text'], wpcode_get_icon_allowed_tags() )
			);
		}
	}

	/**
	 * Output the library markup from an array of categories and an array of snippets.
	 *
	 * @param array  $categories The snippet categories to show.
	 * @param array  $snippets The snippets to show.
	 * @param string $item_method The method in the current class for items output.
	 *
	 * @return void
	 */
	public function get_library_markup( $categories, $snippets, $item_method = 'get_library_snippet_item', $type = 'library' ) {
		$selected_category = isset( $categories[0]['slug'] ) ? $categories[0]['slug'] : '*';
		$count             = 0;
		foreach ( $snippets as $snippet ) {
			if ( isset( $snippet['needs_auth'] ) && empty( $snippet['skip_count'] ) ) {
				++ $count;
			}
		}
		$categories = $this->add_item_counts( $categories, $snippets );
		$categories = $this->add_available_category_label( $categories, $snippets, $count );
		$snippets   = $this->add_available_category_to_snippets( $snippets );
		?>
		<div class="wpcode-items-metabox wpcode-metabox">
			<?php $this->get_items_list_sidebar( $categories, __( 'All Snippets', 'insert-headers-and-footers' ), __( 'Search Snippets', 'insert-headers-and-footers' ), $selected_category, $count ); ?>
			<div class="wpcode-items-list" data-type="<?php echo esc_attr( $type ); ?>">
				<?php
				if ( empty( $snippets ) ) {
					?>
					<div class="wpcode-alert wpcode-alert-warning">
						<?php printf( '<h4>%s</h4>', esc_html__( 'We encountered a problem loading the Snippet Library items, please try again later.', 'insert-headers-and-footers' ) ); ?>
					</div>
					<?php
				}
				?>
				<ul class="wpcode-items-list-category">
					<?php
					foreach ( $snippets as $snippet ) {
						call_user_func( array( $this, $item_method ), $snippet, $selected_category );
					}
					?>
				</ul>
			</div>
		</div>
		<?php
	}

	/**
	 * Goes through snippets and adds the item count to the categories.
	 *
	 * @param array $categories The categories to add the item count to.
	 * @param array $snippets The snippets to count.
	 *
	 * @return array
	 */
	public function add_item_counts( $categories, $snippets ) {
		$category_counts = array();
		foreach ( $snippets as $snippet ) {
			if ( ! isset( $snippet['categories'] ) ) {
				continue;
			}
			if ( empty( $snippet['code'] ) && empty( $snippet['needs_auth'] ) ) {
				continue;
			}
			foreach ( $snippet['categories'] as $category ) {
				if ( ! isset( $category_counts[ $category ] ) ) {
					$category_counts[ $category ] = 0;
				}
				++ $category_counts[ $category ];
			}
		}

		// Add counts to the categories array.
		foreach ( $categories as $category_id => $category ) {
			if ( ! isset( $category['slug'] ) ) {
				continue;
			}
			$categories[ $category_id ]['count'] = isset( $category_counts[ $category['slug'] ] ) ? $category_counts[ $category['slug'] ] : 0;
		}

		return $categories;
	}

	/**
	 * Create a dynamic category for the available snippets. This goes through all the snippets
	 * and counts how many of them need auth to be used, if there are any, it adds the category that shows
	 * how many are available.
	 *
	 * @param array $categories The categories to add the available category to.
	 * @param array $snippets The snippets to count.
	 *
	 * @return array
	 */
	public function add_available_category_label( $categories, $snippets, $total ) {
		if ( wpcode()->library_auth->has_auth() ) {
			return $categories;
		}
		$need_auth_count = 0;
		foreach ( $snippets as $snippet ) {
			if ( ! empty( $snippet['needs_auth'] ) ) {
				++ $need_auth_count;
			}
		}
		if ( $need_auth_count > 0 ) {
			$categories = array_merge(
				array(
					array(
						'name'  => __( 'Available Snippets', 'insert-headers-and-footers' ),
						'slug'  => 'available',
						'count' => $total - $need_auth_count,
					),
				),
				$categories
			);
		}

		return $categories;
	}

	/**
	 * For snippets that don't need auth, add an extra category "available" to allow easy filtering.
	 *
	 * @param array $snippets The snippets to add the category to.
	 *
	 * @return array
	 */
	public function add_available_category_to_snippets( $snippets ) {
		foreach ( $snippets as $key => $snippet ) {
			if ( empty( $snippet['needs_auth'] ) ) {
				$snippets[ $key ]['categories'][] = 'available';
			}
		}

		return $snippets;
	}

	/**
	 * Get the items list sidebar with optional search form.
	 *
	 * @param array  $categories The array of categories to display as filters - each item needs to have the "slug" and "name" keys.
	 * @param string $all_text Text to display on the all items button in the categories list.
	 * @param string $search_label The search label, if left empty the search form is hidden.
	 * @param string $selected_category Slug of the category selected by default.
	 * @param int    $all_count (optional) The number of items in the all category.
	 *
	 * @return void
	 */
	public function get_items_list_sidebar( $categories, $all_text = '', $search_label = '', $selected_category = '', $all_count = 0 ) {
		?>
		<div class="wpcode-items-sidebar">
			<?php if ( ! empty( $search_label ) ) { ?>
				<div class="wpcode-items-search">
					<label for="wpcode-items-search">
						<span class="screen-reader-text"><?php echo esc_html( $search_label ); ?></span>
						<?php wpcode_icon( 'search', 16, 16 ); ?>
					</label>
					<input type="search" class="wpcode-items-search-input" placeholder="<?php echo esc_html( $search_label ); ?>"/>
				</div>
			<?php } ?>
			<ul class="wpcode-items-categories-list wpcode-items-filters">
				<?php if ( ! empty( $all_text ) ) { ?>
					<li>
						<button type="button" data-category="*" class="<?php echo empty( $selected_category ) ? 'wpcode-active' : ''; ?>">
							<?php echo esc_html( $all_text ); ?>
							<?php if ( $all_count ) { ?>
								<span class="wpcode-items-count"><?php echo esc_html( $all_count ); ?></span>
							<?php } ?>
						</button>
					</li>
				<?php } ?>
				<?php
				foreach ( $categories as $category ) {
					// Mark the first category as active.
					$class = $category['slug'] === $selected_category ? 'wpcode-active' : '';
					?>
					<li>
						<button type="button" class="<?php echo esc_attr( $class ); ?>" data-category="<?php echo esc_attr( $category['slug'] ); ?>">
							<?php echo esc_html( $category['name'] ); ?>
							<?php if ( isset( $category['count'] ) ) { ?>
								<span class="wpcode-items-count"><?php echo esc_html( $category['count'] ); ?></span>
							<?php } ?>
						</button>
					</li>
				<?php } ?>
			</ul>
		</div>
		<?php
	}

	/**
	 * Get the preview modal markup.
	 *
	 * @return void
	 */
	public function library_preview_modal_content() {
		?>
		<div class="wpcode-library-preview wpcode-modal" id="wpcode-library-preview">
			<div class="wpcode-library-preview-header">
				<button type="button" class="wpcode-just-icon-button wpcode-close-modal"><?php wpcode_icon( 'close', 15, 14 ); ?></button>
				<h2><?php esc_html_e( 'Preview Snippet', 'insert-headers-and-footers' ); ?></h2>
			</div>
			<div class="wpcode-library-preview-content">
				<h3>
					<label for="wpcode-code-preview" id="wpcode-preview-title"><?php esc_html_e( 'Code Preview', 'insert-headers-and-footers' ); ?></label>
				</h3>
				<textarea id="wpcode-code-preview"></textarea>
			</div>
			<div class="wpcode-library-preview-buttons">
				<a class="wpcode-button wpcode-button-wide" id="wpcode-preview-use-code"><?php esc_html_e( 'Use Snippet', 'insert-headers-and-footers' ); ?></a>
				<a class="wpcode-button wpcode-button-secondary wpcode-my-library-buttons" id="wpcode-preview-edit-snippet" target="_blank"><?php esc_html_e( 'Edit in Library', 'insert-headers-and-footers' ); ?></a>
				<div class="wpcode-preview-updated wpcode-my-library-buttons" id="wpcode-preview-updated"></div>
			</div>
		</div>
		<?php
		$editor = new WPCode_Code_Editor( 'text' );
		$editor->set_setting( 'readOnly', 'nocursor' );
		$editor->set_setting( 'gutters', array() );
		$editor->register_editor( 'wpcode-code-preview' );
		$editor->init_editor();
	}

	/**
	 * Load library data in JS.
	 *
	 * @param array $data The library data.
	 *
	 * @return array
	 */
	public function maybe_add_library_data( $data ) {
		if ( $this->show_library ) {
			$data['library'] = wpcode()->library->get_data();
		}

		return $data;
	}

	/**
	 * Get the full URL for a view of an admin page.
	 *
	 * @param string $view The view slug.
	 *
	 * @return string
	 */
	public function get_view_link( $view ) {
		return add_query_arg(
			array(
				'page' => $this->page_slug,
				'view' => $view,
			),
			$this->admin_url( 'admin.php' )
		);
	}

	/**
	 * Get an upsell box markup.
	 *
	 * @param string $title The main upsell box title.
	 * @param string $text The text displayed under the title.
	 * @param string $button_1 The main CTA button.
	 * @param string $button_2 The text link below the main CTA.
	 * @param array  $features A list of features to display below the text.
	 *
	 * @return string
	 */
	public static function get_upsell_box( $title, $text = '', $button_1 = array(), $button_2 = array(), $features = array() ) {

		$container_class = array(
			'wpcode-upsell-box',
		);

		if ( ! empty( $features ) ) {
			$container_class[] = 'wpcode-upsell-box-with-features';
		}

		$html = sprintf(
			'<div class="%s">',
			esc_attr( implode( ' ', $container_class ) )
		);

		$html .= '<div class="wpcode-upsell-text-content">';

		$html .= sprintf(
			'<h2>%s</h2>',
			wp_kses_post( $title )
		);

		if ( ! empty( $text ) ) {
			$html .= sprintf(
				'<div class="wpcode-upsell-text">%s</div>',
				wp_kses_post( $text )
			);
		}

		if ( ! empty( $features ) ) {
			$html .= '<ul class="wpcode-upsell-features">';
			foreach ( $features as $feature ) {
				$html .= sprintf(
					'<li class="wpcode-upsell-feature">%s</li>',
					wp_kses_post( $feature )
				);
			}
			$html .= '</ul>';
		}
		$button_1 = wp_parse_args(
			$button_1,
			array(
				'tag'        => 'a',
				'text'       => '',
				'url'        => wpcode_utm_url( 'https://wpcode.com/lite/' ),
				'class'      => 'wpcode-button wpcode-button-orange wpcode-button-large',
				'attributes' => array(
					'target' => '_blank',
				),
			)
		);
		$button_2 = wp_parse_args(
			$button_2,
			array(
				'tag'        => 'a',
				'text'       => '',
				'url'        => wpcode_utm_url( 'https://wpcode.com/lite/' ),
				'class'      => 'wpcode-upsell-button-text',
				'attributes' => array(
					'target' => '_blank',
				),
			)
		);

		$html .= '</div>'; // .wpcode-upsell-text-content
		$html .= '<div class="wpcode-upsell-buttons">';

		if ( ! empty( $button_1['text'] ) ) {
			$html .= self::get_list_item_button( $button_1, false );
		}

		if ( ! empty( $button_2['text'] ) ) {
			$html .= '<br />';
			$html .= self::get_list_item_button( $button_2, false );
		}

		$html .= '</div>'; // .wpcode-upsell-buttons

		$html .= '</div>';

		return $html;
	}

	/**
	 * Banner to highlight that connecting to the library gives you access to more snippets.
	 *
	 * @return void
	 */
	public function library_connect_banner_template() {

		if ( wpcode()->library_auth->has_auth() ) {
			return;
		}

		if ( ! current_user_can( 'wpcode_manage_settings' ) ) {
			return;
		}

		$data  = wpcode()->library->get_data();
		$count = 0;
		if ( ! empty( $data['snippets'] ) ) {
			$count = count( $data['snippets'] );
		}
		?>
		<script type="text/html" id="tmpl-wpcode-library-connect-banner">
			<div id="wpcode-library-connect-banner">
				<div class="wpcode-template-content">
					<h3>
						<?php
						/* translators: %d - snippets count. */
						printf( esc_html__( 'Get Access to Our Library of %d FREE Snippets', 'insert-headers-and-footers' ), absint( $count ) );
						?>
					</h3>

					<p>
						<?php esc_html_e( 'Connect your website with WPCode Library and get instant access to FREE code snippets written by our experts. Snippets can be installed with just 1-click from inside the plugin and come automatically-configured to save you time.', 'insert-headers-and-footers' ); ?>
					</p>
				</div>
				<div class="wpcode-template-upgrade-button">
					<button class="wpcode-button wpcode-start-auth"><?php esc_html_e( 'Connect to Library', 'insert-headers-and-footers' ); ?></button>
				</div>
			</div>
		</script>
		<?php
	}

	/**
	 * On any of the plugin pages, if the user installed the plugin from the
	 * deploy a snippet flow, redirect to the 1-click page to allow them to continue that process.
	 *
	 * @return void
	 */
	public function maybe_redirect_to_click() {
		if ( 'wpcode-click' === $this->page_slug ) {
			// Don't redirect this page to avoid an infinite loop.
			return;
		}
		if ( false !== get_transient( 'wpcode_deploy_snippet_id' ) ) {
			// Don't delete the transient here, it will be deleted in the 1-click page.
			wp_safe_redirect( $this->admin_url( 'admin.php?page=wpcode-click' ) );
			exit;
		}
	}

	/**
	 * Get a text field markup.
	 *
	 * @param string $id The id of the text field.
	 * @param string $value The value of the text field.
	 * @param string $description The description of the text field.
	 * @param bool   $wide Whether the text field should be wide.
	 * @param string $type The type of the text field.
	 *
	 * @return string
	 */
	public function get_input_text( $id, $value = '', $description = '', $wide = false, $type = 'text' ) {
		$allowed_types = array(
			'text',
			'email',
			'url',
			'number',
			'password',
		);
		if ( in_array( $type, $allowed_types, true ) ) {
			$type = esc_attr( $type );
		} else {
			$type = 'text';
		}
		$class = 'wpcode-regular-text';
		if ( $wide ) {
			$class .= ' wpcode-wide-text';
		}
		if ( 'text' !== $type ) {
			$class .= ' wpcode-input-' . $type;
		}
		$markup = '<input type="' . esc_attr( $type ) . '" id="' . esc_attr( $id ) . '" name="' . esc_attr( $id ) . '" value="' . esc_attr( $value ) . '" class="' . esc_attr( $class ) . '" autocomplete="off">';
		if ( ! empty( $description ) ) {
			$markup .= '<p>' . wp_kses_post( $description ) . '</p>';
		}

		return $markup;
	}

	/**
	 * Get an email field.
	 *
	 * @param string $id The id of the text field.
	 * @param string $value The value of the text field.
	 * @param string $description The description of the text field.
	 * @param bool   $wide Whether the text field should be wide.
	 *
	 * @return string
	 */
	public function get_input_email( $id, $value = '', $description = '', $wide = false ) {
		return $this->get_input_text( $id, $value, $description, $wide, 'email' );
	}

	/**
	 * Get an admin URL.
	 *
	 * @param string $path The path to append to the admin URL.
	 *
	 * @return string
	 */
	public function admin_url( $path ) {
		return admin_url( $path );
	}
}
includes/admin/pages/class-wpcode-admin-page-file-editor.php000064400000016735151331545640020062 0ustar00<?php
/**
 * File editor page.
 *
 * @package WPCode
 */

/**
 * Class for the file editor page.
 */
class WPCode_Admin_Page_File_Editor extends WPCode_Admin_Page {

	/**
	 * The page slug.
	 *
	 * @var string
	 */
	public $page_slug = 'wpcode-file-editor';

	/**
	 * The default view.
	 *
	 * @var string
	 */
	public $view = 'adstxt';

	/**
	 * The capability required to view this page.
	 *
	 * @var string
	 */
	protected $capability = 'wpcode_file_editor';

	/**
	 * WPCode_Admin_Page_File_Editor constructor.
	 */
	public function __construct() {
		$this->page_title = __( 'File Editor', 'insert-headers-and-footers' );
		parent::__construct();
	}

	/**
	 * Add codemirror settings specific to the needs for this page.
	 *
	 * @return void
	 */
	public function page_hooks() {
		// Add the codemirror settings.
		add_filter( 'wpcode_editor_config', array( $this, 'editor_config' ) );
	}

	/**
	 * Output the page content.
	 *
	 * @return void
	 */
	public function output_content() {
		$this->can_edit = true;
		echo '<div class="wpcode-blur-area" style="min-height: 700px">';
		$this->file_editor_area();
		echo '</div>';
		echo $this->get_pixel_overlay();  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
	}

	/**
	 * File editor area.
	 *
	 * @return void
	 */
	public function file_editor_area() {
		$value = $this->get_value();
		?>
		<div class="wpcode-code-textarea" id="wpcode-edit-<?php echo esc_attr( $this->view ); ?>-area" style="max-width: 1000px">
			<div class="wpcode-flex">
				<div class="wpcode-column">
					<h2>
						<label for="wpcode_file_<?php echo esc_attr( $this->view ); ?>">
							<?php
							printf(
							// Translators: %s is the name of the file.
								esc_html__( '%s Editor', 'insert-headers-and-footers' ),
								esc_html( $this->views[ $this->view ] )
							);
							?>
						</label>
					</h2>
				</div>
				<div class="wpcode-column">
					<div class="wpcode-input-select">
						<label for="<?php echo esc_attr( 'wpcode_file_' . $this->view . '[enabled]' ); ?>">
							<?php esc_html_e( 'Enable file output', 'insert-headers-and-footers' ); ?>
						</label>
						<?php
						echo $this->get_checkbox_toggle( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
							$value['enabled'],
							esc_attr( 'wpcode_file_' . $this->view . '[enabled]' )
						)
						?>
					</div>
				</div>
			</div>
			<textarea name="wpcode_file_<?php echo esc_attr( $this->view ); ?>[content]" id="wpcode_file_<?php echo esc_attr( $this->view ); ?>" class="widefat" rows="8"><?php echo esc_textarea( $value['content'] ); ?></textarea>
			<p>
				<?php
				printf(
				// Translators: %s is the name of the file.
					esc_html__( 'Use this area to edit your %s file.', 'insert-headers-and-footers' ),
					esc_html( $this->views[ $this->view ] )
				);
				?>
			</p>
			<p>
				<?php
				printf(
				// Translators: %1$s is the opening link tag, %2$s is the closing link tag.
					esc_html__( 'The file contents above will be used to generated a dynamic file. There is no physical file created on your server. %1$sLearn more%2$s.', 'insert-headers-and-footers' ),
					'<a href="' . esc_url( wpcode_utm_url( 'https://wpcode.com/docs/file-editor/', 'file-editor', 'docs', 'learn-more' ) ) . '" target="_blank" rel="noopener noreferrer">',
					'</a>'
				);
				?>
			</p>
		</div>
		<?php

		wp_nonce_field( 'wpcode-edit-' . $this->view, 'wpcode-edit-' . $this->view . '-nonce' );

		// If we need to add page-specific content we can do this here.
		if ( method_exists( $this, 'output_view_' . $this->view ) ) {
			call_user_func( array( $this, 'output_view_' . $this->view ) );
		}

		?>
		<button class="wpcode-button" type="submit" <?php echo $this->can_edit ? '' : 'disabled'; ?>>
			<?php esc_html_e( 'Save Changes', 'insert-headers-and-footers' ); ?>
		</button>
		<a href="<?php echo esc_url( home_url() . '/' . $this->views[ $this->view ] ); ?>" class="wpcode-button wpcode-button-secondary" target="_blank" rel="noopener noreferrer">
			<?php esc_html_e( 'View File', 'insert-headers-and-footers' ); ?>
		</a>
		<?php
	}

	/**
	 * For this page we output a menu.
	 *
	 * @return void
	 */
	public function output_header_bottom() {
		?>
		<ul class="wpcode-admin-tabs">
			<?php
			foreach ( $this->views as $slug => $label ) {
				$class = $this->view === $slug ? 'active' : '';
				?>
				<li>
					<a href="<?php echo esc_url( $this->get_view_link( $slug ) ); ?>" class="<?php echo esc_attr( $class ); ?>"><?php echo esc_html( $label ); ?></a>
				</li>
			<?php } ?>
		</ul>
		<?php
	}

	/**
	 * Page specific scripts. Hooked to 'admin_enqueue_scripts'.
	 *
	 * @return void
	 */
	public function page_scripts() {
		$editor = new WPCode_Code_Editor( 'text' );

		$editor->register_editor( 'wpcode_file_' . $this->view );
		$editor->init_editor();
	}

	/**
	 * Disable all the codemirror settings for this page as we need a basic editor.
	 *
	 * @param array $config The WPCode editor config.
	 *
	 * @return array
	 */
	public function editor_config( $config ) {

		if ( 'serviceworkerjs' === $this->view ) {
			$config['type'] = 'text/javascript';
		} else {
			$config['type']       = 'shell';
			$config['codemirror'] = array();
			$config['showHint']   = 'false';
		}

		return $config;
	}

	/**
	 * Output content specific to the robots.txt file.
	 *
	 * @return void
	 */
	public function output_view_robotstxt() {
		?>
		<p>
			<?php esc_html_e( 'Content added here will be appended to the robots.txt content generated by WordPress and other plugins.', 'insert-headers-and-footers' ); ?>
		</p>
		<?php
	}

	/**
	 * Setup page-specific views.
	 *
	 * @return void
	 */
	protected function setup_views() {
		$this->views = array(
			'adstxt'          => 'ads.txt',
			'appadstxt'       => 'app-ads.txt',
			'serviceworkerjs' => 'service-worker.js',
			'robotstxt'       => 'robots.txt',
		);
	}

	/**
	 * Nothing to return by default.
	 *
	 * @return array
	 */
	public function get_value() {
		return array(
			'enabled' => true,
			'content' => '',
		);
	}

	/**
	 * Get the overlay for the file editor page.
	 *
	 * @return string
	 */
	public function get_pixel_overlay() {

		$text = '<p>' . esc_html__( 'Simplify your website management with the WPCode File Editor! Say goodbye to the hassle of manually editing files on your server.', 'insert-headers-and-footers' ) . '<p>';

		$text .= sprintf(
		// translators: %1$s and %2$s are <u> tags.
			'<p>' . esc_html__( 'With this powerful tool, you can easily customize crucial files like %1$sads.txt%2$s, %1$sapp-ads.txt%2$s, %1$srobots.txt%2$s, and %1$sservice-worker.js%2$s right from your WordPress admin.', 'insert-headers-and-footers' ) . '</p>',
			'<u>',
			'</u>'
		);


		return self::get_upsell_box(
			__( 'File Editor is a PRO Feature', 'insert-headers-and-footers' ),
			$text,
			array(
				'text' => esc_html__( 'Upgrade to WPCode PRO', 'insert-headers-and-footers' ),
				'url'  => esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'file-editor', 'tab-' . $this->view, 'upgrade-to-pro' ) ),
			),
			array(
				'text' => esc_html__( 'Learn More about the File Editor', 'insert-headers-and-footers' ),
				'url'  => esc_url( wpcode_utm_url( 'https://wpcode.com/docs/file-editor/', 'file-editor', 'tab-' . $this->view, 'learn-more' ) ),
			),
			array(
				esc_html__( 'No manual coding, no FTP', 'insert-headers-and-footers' ),
				esc_html__( 'Effortless integrations setup', 'insert-headers-and-footers' ),
				esc_html__( 'Reduce the number of plugins', 'insert-headers-and-footers' ),
				esc_html__( 'Prevent advertising fraud', 'insert-headers-and-footers' ),
			)
		);
	}
}
includes/admin/pages/class-wpcode-admin-page-search-replace.php000064400000011004151331545640020515 0ustar00<?php
/**
 * Admin page for the Search & Replace tool.
 *
 * @package WPCode
 */

/**
 * Class for the Search & Replace admin page.
 */
class WPCode_Admin_Page_Search_Replace extends WPCode_Admin_Page {

	/**
	 * The page slug to be used when adding the submenu.
	 *
	 * @var string
	 */
	public $page_slug = 'wpcode-search-replace';

	/**
	 * The action used for the nonce.
	 *
	 * @var string
	 */
	protected $action = 'wpcode-search-replace';

	/**
	 * The nonce name field.
	 *
	 * @var string
	 */
	protected $nonce_name = 'wpcode-search-replace_nonce';

	/**
	 * Call this just to set the page title translatable.
	 */
	public function __construct() {
		$this->page_title = 'Search & Replace Everything';
		$this->menu_title = 'Search & Replace';
		parent::__construct();
	}

	/**
	 * Register hook on admin init just for this page.
	 *
	 * @return void
	 */
	public function page_hooks() {
		add_action( 'admin_init', array( $this, 'maybe_redirect_to_search_replace' ) );
	}

	/**
	 * Override to hide default header on this page.
	 *
	 * @return void
	 */
	public function output_header() {

	}

	/**
	 * Redirect to the search replace page if the plugin is active.
	 *
	 * @return void
	 */
	public function maybe_redirect_to_search_replace() {
		if ( function_exists( 'wsrw_main' ) ) {
			wp_safe_redirect( admin_url( 'tools.php?page=wsrw-search-replace' ) );
			exit;
		}
	}

	/**
	 * The page output.
	 *
	 * @return void
	 */
	public function output_content() {
		?>
		<div class="wpcode-plugin-page wpcode-plugin-page-search-replace">
			<div class="wpcode-plugin-page-image">
				<?php wpcode_icon( 'logo-sr', 90, 90, '0 0 65 64' ); ?>
			</div>
			<div class="wpcode-plugin-page-title">
				<h1>Search & Replace Everything by WPCode</h1>
				<p>
					<?php esc_html_e( 'Confidently replace any text in your database and update images without duplicating uploads, all with a single plugin.', 'insert-headers-and-footers' ); ?>
				</p>
			</div>
			<section class="wpcode-plugin-screenshot">
				<div class="wpcode-plugin-screenshot-image">
					<img src="<?php echo esc_url( WPCODE_PLUGIN_URL ); // phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage?>admin/images/sr-screenshot-thumb.jpg" alt="<?php esc_attr_e( 'Search & Replace Everything Screenshot', 'insert-headers-and-footers' ); ?>"/>
					<a href="<?php echo esc_url( WPCODE_PLUGIN_URL ); ?>admin/images/sr-screenshot.jpg" data-lity>
						<?php wpcode_icon( 'search', 16, 16 ); ?>
					</a>
				</div>
				<ul>
					<li><?php esc_html_e( 'Replace Text Across Your Whole Database.', 'insert-headers-and-footers' ); ?></li>
					<li><?php esc_html_e( 'Preview Changes Every Time.', 'insert-headers-and-footers' ); ?></li>
					<li><?php esc_html_e( 'Replace Image Sources to Clear Up Space.', 'insert-headers-and-footers' ); ?></li>
					<li><?php esc_html_e( 'Support for Serialized Data.', 'insert-headers-and-footers' ); ?></li>
				</ul>
			</section>
			<section class="wpcode-plugin-step wpcode-plugin-step-install">
				<aside class="wpcode-plugin-page-step-num">
					<?php wpcode_icon( 'step-1', 50, 50, '0 0 100 100' ); ?>
					<i class="wpcode-plugin-page-step-loader wpcode-plugin-page-step-loader-hidden"></i>
				</aside>
				<div>
					<h2>
						<?php
						printf(
						// translators: %s is the plugin name.
							esc_html__( 'Install and Activate %s', 'insert-headers-and-footers' ),
							'Search & Replace Everything'
						)
						?>
					</h2>
					<p>
						<?php
						printf(
						// translators: %s is the plugin name.
							esc_html__( 'Install %s from the WordPress.org plugin repository.', 'insert-headers-and-footers' ),
							'Search & Replace Everything'
						)
						?>
					</p>
					<?php
					// Let's check if you can install plugins on this site.
					if ( current_user_can( 'install_plugins' ) && wp_is_file_mod_allowed( 'install_plugins' ) ) {
						?>
						<button class="wpcode-button wpcode-button-install-plugin" data-slug="search-replace-wpcode">
							<?php
							printf(
							// translators: %s is the plugin name.
								esc_html__( 'Install %s', 'insert-headers-and-footers' ),
								'Search & Replace Everything'
							);
							?>
						</button>
						<?php
					} else {
						?>
						<p>
							<?php esc_html_e( 'Please ask your website administrator to install Search & Replace Everything.', 'insert-headers-and-footers' ); ?>
						</p>
						<?php
					}
					?>
				</div>
			</section>
		</div>
		<?php
	}

	/**
	 * For this page we output a title and the save button.
	 *
	 * @return void
	 */
	public function output_header_bottom() {
	}
}
includes/admin/pages/class-wpcode-admin-page-generator.php000064400000017774151331545640017651 0ustar00<?php
/**
 * The admin page for the snippet generator.
 *
 * @package WPCode
 */

/**
 * Class WPCode_Admin_Page_Generator.
 */
class WPCode_Admin_Page_Generator extends WPCode_Admin_Page {

	/**
	 * The page slug.
	 *
	 * @var string
	 */
	public $page_slug = 'wpcode-generator';

	/**
	 * Generator to show, if any.
	 *
	 * @var bool|string
	 */
	public $generator = false;

	/**
	 * Available generators.
	 *
	 * @var WPCode_Generator_Type[]
	 */
	public $generators;

	/**
	 * Set the code type for the editor on this page.
	 *
	 * @var string
	 */
	public $code_type = 'php';

	/**
	 * Set the header title based on what is displayed.
	 *
	 * @var string
	 */
	public $header_title;

	/**
	 * Snippet if editing an existing, generated snippet.
	 *
	 * @var WPCode_Snippet
	 */
	public $snippet;

	/**
	 * The capability required to view this page.
	 *
	 * @var string
	 */
	protected $capability = 'wpcode_edit_php_snippets';

	/**
	 * Hide the generator menu item.
	 *
	 * @var bool
	 */
	public $hide_menu = true;

	/**
	 * Call this just to set the page title translatable.
	 */
	public function __construct() {
		$this->page_title   = __( 'Generator', 'insert-headers-and-footers' );
		$this->header_title = $this->page_title;
		parent::__construct();
	}

	/**
	 * Page-specific hooks & logic.
	 *
	 * @return void
	 */
	public function page_hooks() {
		$this->generators = wpcode()->generator()->get_all_generators();
		// phpcs:disable WordPress.Security.NonceVerification.Recommended
		// Let's see if we should display a generator.
		if ( isset( $_GET['generator'] ) ) {
			$generator = sanitize_text_field( wp_unslash( $_GET['generator'] ) );
			if ( array_key_exists( $generator, $this->generators ) ) {
				$this->generator = $generator;
			}
		}

		$snippet_id = isset( $_GET['snippet'] ) ? absint( $_GET['snippet'] ) : false;
		if ( $snippet_id ) {
			$this->snippet = new WPCode_Snippet( $snippet_id );
			if ( $this->snippet->get_post_data() ) {
				WPCode_Notice::add(
					sprintf(
							// Translators: gets replaced with the snippet title.
						__( 'You are now editing the generated snippet: "%s". Updating the snippet will override any edits you made to the code.', 'insert-headers-and-footers' ),
						$this->snippet->get_title()
					),
					'warning'
				);
			} else {
				unset( $this->snippet );
			}
		}

		// phpcs:enable WordPress.Security.NonceVerification.Recommended
		if ( $this->generator ) {
			// Translators: gets replaced with the generator name.
			$this->header_title = sprintf( __( '%s Generator', 'insert-headers-and-footers' ), $this->generators[ $this->generator ]->get_title() );
		}
	}

	/**
	 * Output the content of the page.
	 *
	 * @return void
	 */
	public function output_content() {
		if ( $this->generator ) {
			$this->show_generator();
		} else {
			$this->show_generators_list();
		}
	}

	/**
	 * Show the list of generators with categories.
	 *
	 * @return void
	 */
	public function show_generators_list() {
		$categories = wpcode()->generator()->get_categories();
		?>
		<div class="wpcode-items-metabox wpcode-metabox">
			<?php $this->get_items_list_sidebar( $categories, __( 'All Generators', 'insert-headers-and-footers' ), __( 'Search Generators', 'insert-headers-and-footers' ) ); ?>
			<div class="wpcode-items-list">
				<ul class="wpcode-items-list-category">
					<?php
					foreach ( $this->generators as $generator ) {
						$url      = add_query_arg(
							array(
								'page'      => $this->page_slug,
								'generator' => $generator->get_name(),
							),
							admin_url( 'admin.php' )
						);
						$button_1 = array(
							'tag'  => 'a',
							'url'  => $url,
							'text' => __( 'Generate', 'insert-headers-and-footers' ),
						);
						$this->get_list_item( $generator->get_name(), $generator->get_title(), $generator->get_description(), $button_1, array(), $generator->get_categories() );
					}
					?>
				</ul>
			</div>
		</div>
		<?php
	}

	/**
	 * Show the generator based on the param.
	 *
	 * @return void
	 */
	public function show_generator() {
		$generator    = $this->generators[ $this->generator ];
		$tabs         = $generator->get_tabs();
		$snippet_data = array();
		if ( isset( $this->snippet ) ) {
			$snippet_data = $this->snippet->get_generator_data();
		}
		?>
		<form id="wpcode_generator_form">
			<div class="wpcode-items-metabox wpcode-metabox">
				<div class="wpcode-items-sidebar">
					<ul class="wpcode-items-categories-list wpcode-items-tabs">
						<?php
						$selected = key( $tabs );
						foreach ( $tabs as $tab_id => $tab ) {
							$class = $tab_id === $selected ? 'wpcode-active' : '';
							?>
							<li>
								<button type="button" class="<?php echo esc_attr( $class ); ?>" data-category="<?php echo esc_attr( $tab_id ); ?>"><?php echo esc_html( $tab['label'] ); ?></button>
							</li>
						<?php } ?>
					</ul>
				</div>
				<div class="wpcode-items-list">
					<?php
					foreach ( $tabs as $tab_id => $tab ) {
						$style = $selected === $tab_id ? '' : 'display:none;';
						?>
						<div class="wpcode-form-tab" data-tab="<?php echo esc_attr( $tab_id ); ?>" style="<?php echo esc_attr( $style ); ?>">
							<?php $generator->render_tab( $tab_id, $snippet_data ); ?>
						</div>
					<?php } ?>
					<div class="wpcode-generator-actions">
						<?php wp_nonce_field( 'wpcode_generate', 'nonce', false ); ?>
						<input type="hidden" name="type" value="<?php echo esc_attr( $this->generator ); ?>"/>
						<input type="hidden" name="action" value="wpcode_generate_snippet"/>
						<button type="submit" class="wpcode-button wpcode-button-secondary" id="wpcode-generator-update-code"><?php esc_html_e( 'Update code', 'insert-headers-and-footers' ); ?></button>
						<?php if ( ! empty( $this->snippet ) ) { ?>
							<input type="hidden" name="snippet_id" value="<?php echo absint( $this->snippet->get_id() ); ?>"/>
						<?php } ?>
					</div>
				</div>
			</div>
		</form>
		<div class="wpcode-generator-preview">
			<div class="wpcode-generator-preview-header">
				<h2><?php esc_html_e( 'Code Preview', 'insert-headers-and-footers' ); ?></h2>
				<?php
				if ( ! empty( $this->snippet ) ) {
					?>
					<button type="button" class="wpcode-button" id="wpcode-generator-use-snippet"><?php esc_html_e( 'Update Snippet', 'insert-headers-and-footers' ); ?></button>
				<?php } else { ?>
					<button type="button" class="wpcode-button" id="wpcode-generator-use-snippet"><?php esc_html_e( 'Use Snippet', 'insert-headers-and-footers' ); ?></button>
				<?php } ?>
				<button class="wpcode-button wpcode-button-icon wpcode-button-secondary wpcode-copy-target" data-target="#wpcode_generator_code_preview" type="button">
					<span class="wpcode-default-icon"><?php wpcode_icon( 'copy', 16, 16 ); ?></span><span class="wpcode-success-icon"><?php wpcode_icon( 'check', 16, 13 ); ?></span> <?php echo esc_html_x( 'Copy Code', 'Copy to clipboard', 'insert-headers-and-footers' ); ?>
				</button>
			</div>
			<textarea id="wpcode_generator_code_preview"><?php echo esc_textarea( $generator->get_snippet_code() ); ?></textarea>
		</div>
		<script type="text/template" id="wpcode-generator-repeater-row">
			<?php $this->repeater_group_template(); ?>
		</script>
		<?php
	}

	/**
	 * The bottom part of the header.
	 *
	 * @return void
	 */
	public function output_header_bottom() {
		?>
		<div class="wpcode-column">
			<h1><?php echo esc_html( $this->header_title ); ?></h1>
		</div>
		<?php
	}

	/**
	 * The template for the repeater row.
	 *
	 * @return void
	 */
	public function repeater_group_template() {
		?>
		<div class="wpcode-repeater-group">
			<button type="button" class="wpcode-button wpcode-button-secondary wpcode-remove-row"><?php esc_html_e( 'Remove Row', 'insert-headers-and-footers' ); ?></button>
		</div>
		<?php
	}

	/**
	 * Add page-specific scripts.
	 *
	 * @return void
	 */
	public function page_scripts() {
		if ( ! $this->generator ) {
			return;
		}
		$editor = new WPCode_Code_Editor( $this->code_type );
		$editor->set_setting( 'readOnly', 'nocursor' );
		$editor->register_editor( 'wpcode_generator_code_preview' );
		$editor->init_editor();

		wp_enqueue_script( 'jquery-ui-autocomplete' );
	}
}
includes/admin/pages/class-wpcode-admin-page-settings.php000064400000057057151331545640017521 0ustar00<?php
/**
 * Settings admin page.
 *
 * @package WPCode
 */

/**
 * Class for the Settings admin page.
 */
class WPCode_Admin_Page_Settings extends WPCode_Admin_Page {

	/**
	 * The page slug to be used when adding the submenu.
	 *
	 * @var string
	 */
	public $page_slug = 'wpcode-settings';

	/**
	 * The action used for the nonce.
	 *
	 * @var string
	 */
	protected $action = 'wpcode-settings';

	/**
	 * The nonce name field.
	 *
	 * @var string
	 */
	protected $nonce_name = 'wpcode-settings_nonce';

	/**
	 * The view to be loaded by default.
	 *
	 * @var string
	 */
	public $view = 'general';

	/**
	 * The capability required to view this page.
	 *
	 * @var string
	 */
	protected $capability = 'wpcode_manage_settings';

	/**
	 * Call this just to set the page title translatable.
	 */
	public function __construct() {
		$this->page_title = __( 'WPCode Settings', 'insert-headers-and-footers' );
		$this->menu_title = __( 'Settings', 'insert-headers-and-footers' );
		parent::__construct();
	}

	/**
	 * Setup page-specific views.
	 *
	 * @return void
	 */
	protected function setup_views() {
		$this->views = array(
			'general' => __( 'General Settings', 'insert-headers-and-footers' ),
			'errors'  => __( 'Error Handling', 'insert-headers-and-footers' ),
			'access'  => __( 'Access Control', 'insert-headers-and-footers' ),
		);
	}

	/**
	 * Register hook on admin init just for this page.
	 *
	 * @return void
	 */
	public function page_hooks() {
		$this->process_message();
		add_action( 'admin_init', array( $this, 'submit_listener' ) );
		add_filter( 'wpcode_admin_js_data', array( $this, 'add_connect_strings' ) );
	}

	/**
	 * Handle the message after the settings are saved with a redirect.
	 *
	 * @return void
	 */
	public function process_message() {
		if ( isset( $_GET['message'] ) && 1 === absint( $_GET['message'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$this->set_success_message( __( 'Settings Saved.', 'insert-headers-and-footers' ) );
		}
	}

	/**
	 * Wrap this page in a form tag.
	 *
	 * @return void
	 */
	public function output() {
		?>
		<form action="<?php echo esc_url( $this->get_page_action_url() ); ?>" method="post">
			<?php parent::output(); ?>
		</form>
		<?php
	}

	/**
	 * The Settings page output.
	 *
	 * @return void
	 */
	public function output_content() {
		if ( method_exists( $this, 'output_view_' . $this->view ) ) {
			call_user_func( array( $this, 'output_view_' . $this->view ) );
		}
	}

	/**
	 * The Settings page output.
	 *
	 * @return void
	 */
	public function output_view_general() {
		$header_and_footers = wpcode()->settings->get_option( 'headers_footers_mode' );
		$usage_tracking     = wpcode()->settings->get_option( 'usage_tracking' );

		$description = __( 'This allows you to disable all Code Snippets functionality and have a single "Headers & Footers" item under the settings menu.', 'insert-headers-and-footers' );

		$description .= '<br />';
		$description .= sprintf(
		// Translators: Placeholders make the text bold.
			__( '%1$sNOTE:%2$s Please use this setting with caution. It will disable all custom snippets that you add using the new snippet management interface.', 'insert-headers-and-footers' ),
			'<strong>',
			'</strong>'
		);

		$this->metabox_row(
			__( 'License Key', 'insert-headers-and-footers' ),
			$this->get_license_key_input()
		);

		$this->metabox_row(
			__( 'Headers & Footers mode', 'insert-headers-and-footers' ),
			$this->get_checkbox_toggle(
				$header_and_footers,
				'headers_footers_mode',
				$description
			),
			'headers_footers_mode'
		);

		$this->common_settings();

		$this->metabox_row(
			__( 'Allow Usage Tracking', 'insert-headers-and-footers' ),
			$this->get_checkbox_toggle(
				$usage_tracking,
				'usage_tracking',
				esc_html__( 'By allowing us to track usage data, we can better help you, as we will know which WordPress configurations, themes, and plugins we should test.', 'insert-headers-and-footers' )
			),
			'usage_tracking'
		);

		$this->uninstall_setting();

		wp_nonce_field( $this->action, $this->nonce_name );

		?>
		<button class="wpcode-button" type="submit">
			<?php esc_html_e( 'Save Changes', 'insert-headers-and-footers' ); ?>
		</button>
		<?php
	}

	/**
	 * Output the uninstall setting.
	 *
	 * @return void
	 */
	public function uninstall_setting() {
		$uninstall_description = esc_html__( 'Remove ALL WPCode data upon plugin deletion.', 'insert-headers-and-footers' );

		$uninstall_description .= '<br />';
		$uninstall_description .= sprintf(
			'<strong style="color: #DF2A35">%s</strong>',
			esc_html__( 'All WPCode snippets & scripts will be unrecoverable.', 'insert-headers-and-footers' )
		);

		$this->metabox_row(
			__( 'Delete All Data on Uninstall', 'insert-headers-and-footers' ),
			$this->get_checkbox_toggle(
				wpcode()->settings->get_option( 'uninstall_data', false ),
				'wpcode-uninstall-data',
				$uninstall_description,
				1
			),
			'wpcode-admin-bar-info'
		);
	}

	/**
	 * Move common settings to a separate method so we can use it in other versions of this page.
	 *
	 * @return void
	 */
	public function common_settings() {
		$this->metabox_row(
			__( 'WPCode Library Connection', 'insert-headers-and-footers' ),
			$this->get_library_connection_input()
		);

		$this->metabox_row(
			__( 'Editor Height', 'insert-headers-and-footers' ),
			$this->get_editor_height_input(),
			'wpcode-editor-height'
		);

		$this->metabox_row(
			__( 'Dark Mode', 'insert-headers-and-footers' ),
			$this->get_checkbox_toggle(
				wpcode()->settings->get_option( 'dark_mode' ),
				'wpcode-dark-mode',
				esc_html__( 'Enable Dark Mode across WPCode.', 'insert-headers-and-footers' ),
				1
			),
			'wpcode-dark-mode'
		);

		$this->metabox_row(
			__( 'Admin Bar Info', 'insert-headers-and-footers' ),
			$this->get_checkbox_toggle(
				wpcode()->settings->get_option( 'admin_bar_info', true ),
				'wpcode-admin-bar-info',
				esc_html__( 'Enable the admin bar menu that shows info about which snippets & scripts are loaded on the current page.', 'insert-headers-and-footers' ),
				1
			),
			'wpcode-admin-bar-info'
		);
	}

	/**
	 * Get an input to connect or disconnect from the snippet library.
	 *
	 * @return string
	 */
	public function get_library_connection_input() {
		$button_classes = array(
			'wpcode-button',
		);
		$button_text    = __( 'Connect to the WPCode Library', 'insert-headers-and-footers' );
		if ( WPCode()->library_auth->has_auth() ) {
			$button_classes[] = 'wpcode-delete-auth';
			$button_text      = __( 'Disconnect from the WPCode Library', 'insert-headers-and-footers' );
		} else {
			$button_classes[] = 'wpcode-start-auth';
		}

		return sprintf(
			'<button type="button" class="%1$s">%2$s</button>',
			esc_attr( implode( ' ', $button_classes ) ),
			esc_html( $button_text )
		);
	}

	/**
	 * For this page we output a menu.
	 *
	 * @return void
	 */
	public function output_header_bottom() {
		?>
		<div class="wpcode-column">
			<ul class="wpcode-admin-tabs">
				<?php
				foreach ( $this->views as $slug => $label ) {
					if ( 'importer' === $slug ) {
						continue;
					}
					$class = $this->view === $slug ? 'active' : '';
					?>
					<li>
						<a href="<?php echo esc_url( $this->get_view_link( $slug ) ); ?>" class="<?php echo esc_attr( $class ); ?>"><?php echo esc_html( $label ); ?></a>
					</li>
				<?php } ?>
			</ul>
		</div>
		<div class="wpcode-column">
		</div>
		<?php

	}

	/**
	 * If the form is submitted attempt to save the values.
	 *
	 * @return void
	 */
	public function submit_listener() {
		if ( ! isset( $_REQUEST[ $this->nonce_name ] ) || ! wp_verify_nonce( sanitize_key( $_REQUEST[ $this->nonce_name ] ), $this->action ) ) {
			// Nonce is missing, so we're not even going to try.
			return;
		}

		if ( 'errors' === $this->view ) {
			$settings = array(
				'error_logging' => isset( $_POST['wpcode-error-logging'] ),
			);
		} else {
			$settings = array(
				'headers_footers_mode' => isset( $_POST['headers_footers_mode'] ),
				'editor_height_auto'   => isset( $_POST['editor_height_auto'] ),
				'editor_height'        => isset( $_POST['editor_height'] ) ? absint( $_POST['editor_height'] ) : 300,
				'usage_tracking'       => isset( $_POST['usage_tracking'] ),
				'admin_bar_info'       => isset( $_POST['wpcode-admin-bar-info'] ),
				'dark_mode'            => isset( $_POST['wpcode-dark-mode'] ),
				'uninstall_data'       => isset( $_POST['wpcode-uninstall-data'] ),
			);
		}

		$settings = $this->before_save( $settings );

		wpcode()->settings->bulk_update_options( $settings );

		if ( true === $settings['headers_footers_mode'] ) {
			wp_safe_redirect(
				add_query_arg(
					array(
						'page'    => 'wpcode-headers-footers',
						'message' => 1,
					),
					admin_url( 'options-general.php' )
				)
			);
			exit;
		}

		wp_safe_redirect(
			add_query_arg(
				array(
					'message' => 1,
				),
				$this->get_page_action_url()
			)
		);
		exit;
	}

	/**
	 * Give child classes a chance to update the settings object before saving.
	 *
	 * @param array $settings The settings to be saved.
	 *
	 * @return array
	 */
	public function before_save( $settings ) {
		return $settings;
	}

	/**
	 * Allow users to change the code editor height.
	 *
	 * @return string
	 */
	public function get_editor_height_input() {
		$editor_auto_height = boolval( wpcode()->settings->get_option( 'editor_height_auto' ) );
		$editor_height      = wpcode()->settings->get_option( 'editor_height', 300 );

		$html = sprintf(
			'<input type="number" min="100" value="%1$d" id="wpcode-editor-height" name="editor_height" %2$s />',
			absint( $editor_height ),
			disabled( $editor_auto_height, true, false )
		);

		$html .= $this->get_checkbox_toggle(
			$editor_auto_height,
			'editor_height_auto'
		);
		$html .= '<label for="editor_height_auto">' . __( 'Auto height', 'insert-headers-and-footers' ) . '</label>';

		$html .= '<p class="description">';
		$html .= esc_html__( 'Set the editor height in pixels or enable auto-grow so the code editor automatically grows in height with the code.', 'insert-headers-and-footers' );
		$html .= '</p>';

		return $html;
	}

	/**
	 * Get the license key input.
	 *
	 * @return string
	 */
	public function get_license_key_input() {
		ob_start();
		?>
		<div class="wpcode-metabox-form">
			<p><?php esc_html_e( 'You\'re using WPCode Lite - no license needed. Enjoy!', 'insert-headers-and-footers' ); ?>
				<img draggable="false" role="img" class="emoji" alt="🙂" src="https://s.w.org/images/core/emoji/14.0.0/svg/1f642.svg"> <?php // phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage ?>
			</p>
			<p>
				<?php
				printf(
				// Translators: %1$s - Opening anchor tag, do not translate. %2$s - Closing anchor tag, do not translate.
					esc_html__( 'To unlock more features consider %1$supgrading to PRO%2$s.', 'insert-headers-and-footers' ),
					'<strong><a href="' . esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'settings-license', 'upgrading-to-pro' ) ) . '" target="_blank" rel="noopener noreferrer">',
					'</a></strong>'
				)
				?>
			</p>
			<hr>
			<p><?php esc_html_e( 'Already purchased? Simply enter your license key below to enable WPCode PRO!', 'insert-headers-and-footers' ); ?></p>
			<p>
				<input type="password" class="wpcode-input-text" id="wpcode-settings-upgrade-license-key" placeholder="<?php esc_attr_e( 'Paste license key here', 'insert-headers-and-footers' ); ?>" value="">
				<button type="button" class="wpcode-button" id="wpcode-settings-connect-btn">
					<?php esc_html_e( 'Verify Key', 'insert-headers-and-footers' ); ?>
				</button>
			</p>
		</div>
		<?php

		return ob_get_clean();
	}

	/**
	 * Add the strings for the connect page to the JS object.
	 *
	 * @param array $data The localized data we already have.
	 *
	 * @return array
	 */
	public function add_connect_strings( $data ) {
		$data['oops']                = esc_html__( 'Oops!', 'insert-headers-and-footers' );
		$data['ok']                  = esc_html__( 'OK', 'insert-headers-and-footers' );
		$data['almost_done']         = esc_html__( 'Almost Done', 'insert-headers-and-footers' );
		$data['plugin_activate_btn'] = esc_html__( 'Activate', 'insert-headers-and-footers' );
		$data['server_error']        = esc_html__( 'Unfortunately there was a server connection error.', 'insert-headers-and-footers' );

		return $data;
	}

	/**
	 * Output the form for the access management tab.
	 *
	 * @return void
	 */
	public function output_view_access() {
		echo '<div class="wpcode-blur-area">';
		$this->access_view_content();
		echo '</div>';
		echo $this->get_access_overlay(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
	}

	/**
	 * Output the form for the access management tab.
	 *
	 * @return void
	 */
	public function output_view_errors() {

		$this->error_view_fields();

		wp_nonce_field( $this->action, $this->nonce_name );

		?>
		<button class="wpcode-button" type="submit">
			<?php esc_html_e( 'Save Changes', 'insert-headers-and-footers' ); ?>
		</button>
		<?php

	}

	/**
	 * The error handling tab fields.
	 *
	 * @return void
	 */
	public function error_view_fields() {
		$this->error_logging_field();

		?>
		<h2><?php esc_html_e( 'Email Notifications', 'insert-headers-and-footers' ); ?>
			&nbsp;<span class="wpcode-pro-pill">PRO</span></h2>
		<p>
			<?php esc_html_e( 'Receive email notifications when snippets throw errors or are automatically deactivated.', 'insert-headers-and-footers' ); ?>
		</p>
		<?php $this->wp_mail_smtp_notice(); ?>
		<hr/>
		<div style="position: relative">
			<div class="wpcode-blur-area">
				<?php
				$this->error_emails_fields();
				?>
			</div>
			<?php
			echo self::get_upsell_box( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
				esc_html__( 'Email Notifications is a Pro Feature', 'insert-headers-and-footers' ),
				'<p>' . esc_html__( 'Do you want to get email notifications the moment your snippets throw an error or are automatically deactivated? Upgrade today and improve your workflow with WPCode Error Email Notifications.', 'insert-headers-and-footers' ) . '</p>',
				array(
					'text' => esc_html__( 'Upgrade to WPCode PRO', 'insert-headers-and-footers' ),
					'url'  => esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'settings', 'tab-' . $this->view, 'email' ) ),
				)
			); 
			?>
		</div>
		<?php
	}

	/**
	 * The fields used for email settings.
	 *
	 * @return void
	 */
	public function error_emails_fields() {
		$this->metabox_row(
			__( 'Error Notifications', 'insert-headers-and-footers' ),
			$this->get_checkbox_toggle(
				wpcode()->settings->get_option( 'emails_errors' ),
				'wpcode-emails-errors',
				sprintf(
				// Translators: %1$s: opening anchor tag, %2$s: closing anchor tag. Link to docs about error notifications.
					esc_html__( 'Send email notifications when snippets throw errors? %1$sLearn more%2$s', 'insert-headers-and-footers' ),
					'<a href="' . esc_url( wpcode_utm_url( 'https://wpcode.com/docs/error-notifications/', 'settings', 'errors', 'errornotifications' ) ) . '" target="_blank" rel="noopener noreferrer">',
					'</a>'
				),
				1
			),
			'wpcode-error-notifications'
		);

		$this->metabox_row(
			__( 'Send To', 'insert-headers-and-footers' ),
			$this->get_input_text(
				'wpcode-emails-errors-addresses',
				wpcode()->settings->get_option( 'emails_errors_addresses', get_option( 'admin_email' ) ),
				__( 'Enter a comma separated list of email addresses to receive error notifications. Defaults to the admin email address.', 'insert-headers-and-footers' ),
				true
			),
			'wpcode-emails-errors-addresses'
		);

		$preview_url = add_query_arg(
			array(
				'wpcode_email_template' => 'error',
				'wpcode_email_preview'  => '1',
			),
			admin_url()
		);

		$this->metabox_row(
			'',
			'<a href="' . esc_url( $preview_url ) . '" class="wpcode-button wpcode-button-secondary" target="_blank" rel="noopener noreferrer">' . esc_html__( 'Preview Email', 'insert-headers-and-footers' ) . '</a>',
			'wpcode-emails-errors-preview'
		);

		$this->metabox_row(
			__( 'Deactivation Notifications', 'insert-headers-and-footers' ),
			$this->get_checkbox_toggle(
				wpcode()->settings->get_option( 'emails_deactivated' ),
				'wpcode-emails-deactivated',
				sprintf(
				// Translators: %1$s: opening anchor tag, %2$s: closing anchor tag. Link to docs about error notifications.
					esc_html__( 'Send an email when a snippet gets automatically deactivated? %1$sLearn more%2$s', 'insert-headers-and-footers' ),
					'<a href="' . esc_url( wpcode_utm_url( 'https://wpcode.com/docs/error-notifications/', 'settings', 'errors', 'deactivated' ) ) . '" target="_blank" rel="noopener noreferrer">',
					'</a>'
				),
				1
			),
			'wpcode-emails-deactivated'
		);

		$this->metabox_row(
			__( 'Send To', 'insert-headers-and-footers' ),
			$this->get_input_text(
				'wpcode-emails-deactivated-addresses',
				wpcode()->settings->get_option( 'emails_deactivated_addresses', get_option( 'admin_email' ) ),
				__( 'Enter a comma separated list of email addresses to receive deactivation notifications. Defaults to the admin email address.', 'insert-headers-and-footers' ),
				true
			),
			'wpcode-emails-deactivated-addresses'
		);

		$preview_url = add_query_arg(
			array(
				'wpcode_email_template' => 'deactivated',
				'wpcode_email_preview'  => '1',
			),
			admin_url()
		);

		$this->metabox_row(
			'',
			'<a href="' . esc_url( $preview_url ) . '" class="wpcode-button wpcode-button-secondary" target="_blank" rel="noopener noreferrer">' . esc_html__( 'Preview Email', 'insert-headers-and-footers' ) . '</a>',
			'wpcode-emails-deactivated-preview'
		);
	}

	/**
	 * The error logging field.
	 *
	 * @return void
	 */
	public function error_logging_field() {
		$this->metabox_row(
			__( 'Error Logging', 'insert-headers-and-footers' ),
			$this->get_checkbox_toggle(
				wpcode()->settings->get_option( 'error_logging' ),
				'wpcode-error-logging',
				sprintf(
				// Translators: %1$s: opening anchor tag, %2$s: closing anchor tag.
					esc_html__( 'Log errors thrown by snippets? %1$sView Logs%2$s', 'insert-headers-and-footers' ),
					'<a href="' . esc_url( admin_url( 'admin.php?page=wpcode-tools&view=logs' ) ) . '">',
					'</a>'
				),
				1
			),
			'wpcode-error-logging'
		);
	}

	/**
	 * The access management tab content.
	 *
	 * @return void
	 */
	public function access_view_content() {
		?>
		<h2><?php esc_html_e( 'Access Control', 'insert-headers-and-footers' ); ?></h2>
		<p>
			<?php
			printf(
			// Translators: %1$s - Opening anchor tag. %2$s - Closing anchor tag.
				esc_html__( 'Select the user roles that are allowed to manage different types of snippets or parts of WPCode. By default, all permissions are provided only to administrator users. Please see our %1$sAccess Control documentation%2$s for more details.', 'insert-headers-and-footers' ),
				'<a href="' . esc_url( wpcode_utm_url( 'https://wpcode.com/docs/access-control/', 'settings-access-controls', 'access-controls-documentation' ) ) . '" target="_blank" rel="noopener noreferrer">',
				'</a>'
			);
			?>
		</p>
		<hr/>
		<?php
		$capabilities = $this->get_capabilites();

		foreach ( $capabilities as $capability => $capability_data ) {
			$selected_roles = wpcode()->settings->get_option( $capability, array() );
			$this->metabox_row(
				$capability_data['label'],
				$this->get_roles_dropdown( $selected_roles, 'wpcode_capability_' . $capability ) .
				'<p class="description">' . esc_html( $capability_data['description'] ) . '</p>'
			);
		}

		$this->php_setting();

		?>
		<button class="wpcode-button" type="submit">
			<?php esc_html_e( 'Save Changes', 'insert-headers-and-footers' ); ?>
		</button>
		<?php
	}

	/**
	 * Access control overlay.
	 *
	 * @return string
	 */
	public function get_access_overlay() {
		$text = sprintf(
		// translators: %1$s and %2$s are <u> tags.
			'<p>' . esc_html__( 'Improve the way you and your team manage your snippets with the WPCode Access Control settings. Enable other users on your site to manage different types of snippets or configure Conversion Pixels settings and update configuration files. This feature is available on the %1$sWPCode Pro%2$s plan or higher.', 'insert-headers-and-footers' ) . '</p>',
			'<u>',
			'</u>'
		);

		return self::get_upsell_box(
			esc_html__( 'Access Control is a PRO Feature', 'insert-headers-and-footers' ),
			$text,
			array(
				'text' => esc_html__( 'Upgrade to WPCode PRO', 'insert-headers-and-footers' ),
				'url'  => esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'settings', 'tab-' . $this->view, 'upgrade-to-pro' ) ),
			),
			array(),
			array(
				esc_html__( 'Save time and improve website management with your team', 'insert-headers-and-footers' ),
				esc_html__( 'Delegate snippet management to other users with full control', 'insert-headers-and-footers' ),
				esc_html__( 'Enable other users to set up ads & 3rd party services', 'insert-headers-and-footers' ),
				esc_html__( 'Choose if PHP snippets should be enabled on the site', 'insert-headers-and-footers' ),
			)
		);
	}

	/**
	 * Output the PHP disable setting.
	 *
	 * @return void
	 */
	public function php_setting() {
		?>
		<h2><?php esc_html_e( 'PHP Snippets', 'insert-headers-and-footers' ); ?></h2>
		<?php
		$this->metabox_row(
			esc_html__( 'Disable PHP snippets', 'insert-headers-and-footers' ),
			$this->get_checkbox_toggle(
				boolval( wpcode()->settings->get_option( 'completely_disable_php' ) ),
				'completely_disable_php',
				esc_html__( 'This option will completely disable PHP snippets execution and the option to edit or add new PHP snippets.', 'insert-headers-and-footers' )
			),
			'wpcode_disable_php'
		);
	}

	/**
	 * Get the custom capabilities.
	 *
	 * @return array[]
	 */
	public function get_capabilites() {
		return wpcode_custom_capabilities();
	}

	/**
	 * Get a dropdown with the user roles.
	 *
	 * @param array  $selected The roles that are selected.
	 * @param string $name The name of the select.
	 * @param string $id The ID of the select, defaults to the name.
	 *
	 * @return string
	 */
	public function get_roles_dropdown( $selected, $name, $id = '' ) {
		if ( empty( $id ) ) {
			$id = $name;
		}
		$user_roles = wp_roles()->roles;
		$dropdown   = '<select name="' . esc_attr( $name ) . '[]" id="' . esc_attr( $id ) . '" class="wpcode-select2" multiple>';
		foreach ( $user_roles as $key => $user_role ) {
			if ( ! isset( $user_role['name'] ) ) {
				continue;
			}
			$check_role = is_multisite() ? 'superadmin' : 'administrator';
			if ( $check_role === $key ) {
				continue;
			}
			$dropdown .= '<option value="' . esc_attr( $key ) . '" ' . selected( in_array( $key, $selected, true ), true, false ) . '>' . esc_html( $user_role['name'] ) . '</option>';
		}
		$dropdown .= '</select>';

		return $dropdown;
	}

	/**
	 * Display a notice to suggest installing WP Mail SMTP.
	 *
	 * @return void
	 */
	public function wp_mail_smtp_notice() {
		if ( function_exists( 'wp_mail_smtp' ) ) {
			return;
		}
		$dismissed_notices = get_option( 'wpcode_admin_notices', array() );
		$slug              = 'emailsmtp';
		$smtp_url          = add_query_arg(
			array(
				'type' => 'term',
				's'    => 'wp mail smtp',
				'tab'  => 'search',
			),
			admin_url( 'plugin-install.php' )
		);
		if ( ! isset( $dismissed_notices[ $slug ] ) || empty( $dismissed_notices[ $slug ]['dismissed'] ) ) {
			?>
			<div class="notice wpcode-notice notice-global is-dismissible" id="wpcode-notice-global-<?php echo esc_attr( $slug ); ?>">
				<h3><?php echo esc_html__( 'Make Sure Important Emails Reach Your Inbox', 'insert-headers-and-footers' ); ?></h3>
				<p>
					<?php
					printf(
					// Translators: %1$s: opening anchor tag, %2$s: closing anchor tag.
						esc_html__( 'Solve common email deliverability issues for good. %1$sGet WP Mail SMTP%2$s!', 'insert-headers-and-footers' ),
						'<a href="' . esc_url( $smtp_url ) . '">',
						'</a>'
					);
					?>
				</p>
			</div>
		<?php
			wpcode()->notice->enqueues();
		}
	}
}
includes/admin/pages/class-wpcode-code-snippets-table.php000064400000103141151331545640017505 0ustar00<?php
/**
 * Table of snippets for the admin list.
 *
 * @package WPCode
 */

/**
 * Generate the table for the list of code snippets.
 */
class WPCode_Code_Snippets_Table extends WP_List_Table {

	/**
	 * Number of snippets to show per page.
	 *
	 * @var int
	 */
	public $per_page;

	/**
	 * @var string $requested_type The requested type of the snippet.
	 */
	public $requested_type;

	/**
	 * Number of snippets in different views.
	 *
	 * @var array
	 */
	private $count;

	/**
	 * Current view.
	 *
	 * @var string
	 */
	private $view;

	/**
	 * Primary class constructor.
	 */
	public function __construct() {

		// Utilize the parent constructor to build the main class properties.
		parent::__construct(
			array(
				'singular' => 'wpcode-snippet',
				'plural'   => 'wpcode-snippets',
				'ajax'     => false,
			)
		);

		// Default number of snippets to show per page.
		$this->per_page = $this->get_items_per_page( 'wpcode_snippets_per_page', (int) apply_filters( 'wpcode_code_snippets_per_page', 20 ) );
		$this->view     = $this->get_current_view();
		$this->process_request_parameters();
	}

	/**
	 * Adjust query arguments based on GET parameters.
	 */
	protected function process_request_parameters() {
		if ( isset( $_GET['type'] ) && ! empty( $_GET['type'] ) ) {  // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			// Store the type in a class property or use it immediately in query preparations.
			$this->requested_type = sanitize_text_field( wp_unslash( $_GET['type'] ) );  // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		} else {
			$this->requested_type = null;
		}
	}

	/**
	 * Load the current view from the get param.
	 *
	 * @return string
	 */
	private function get_current_view() {
		return isset( $_GET['view'] ) ? sanitize_text_field( wp_unslash( $_GET['view'] ) ) : 'all'; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
	}

	/**
	 * Render the checkbox column.
	 *
	 * @param WP_Post $item Snippet.
	 *
	 * @return string
	 */
	public function column_cb( $item ) {
		return '<input type="checkbox" name="snippet_id[]" value="' . absint( $item->ID ) . '" />';
	}

	/**
	 * Load the snippet for the columns.
	 *
	 * @param WP_Post $post The post object.
	 *
	 * @return WPCode_Snippet
	 */
	public function get_snippet( $post ) {
		return new WPCode_Snippet( $post );
	}

	/**
	 * The post type for this view.
	 *
	 * @return string
	 */
	public function get_post_type() {
		return wpcode_get_post_type();
	}

	/**
	 * Render the columns.
	 *
	 * @param WP_Post $item CPT object as a snippet representation.
	 * @param string  $column_name Column Name.
	 *
	 * @return string
	 */
	public function column_default( $item, $column_name ) {
		$snippet = $this->get_snippet( $item );

		switch ( $column_name ) {
			case 'id':
				$value = $snippet->get_id();
				break;

			case 'location':
				$location = $snippet->get_location();
				$value    = '';
				if ( ! empty( $location ) ) {
					$label = wpcode()->auto_insert->get_location_label( $location );
					if ( 'trash' === $this->view ) {
						$value = $label;
					} else {
						$url   = add_query_arg( 'location', $snippet->get_location_term()->slug );
						$url   = remove_query_arg( 'paged', $url );
						$value = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $url ), esc_html( $label ) );
					}
				}
				break;

			case 'created':
				$value = sprintf(
				// Translators: This is the format for displaying the date in the admin list, [date] at [time].
					__( '%1$s at %2$s', 'insert-headers-and-footers' ),
					get_the_time( get_option( 'date_format' ), $snippet->get_post_data() ),
					get_the_time( get_option( 'time_format' ), $snippet->get_post_data() )
				);
				break;

			case 'updated':
				$value = sprintf(
				// Translators: This is the format for displaying the date in the admin list, [date] at [time].
					__( '%1$s at %2$s', 'insert-headers-and-footers' ),
					get_the_modified_date( get_option( 'date_format' ), $snippet->get_post_data() ),
					get_the_modified_date( get_option( 'time_format' ), $snippet->get_post_data() )
				);
				break;

			case 'author':
				$value  = '';
				$author = get_userdata( $snippet->get_snippet_author() );

				if ( ! $author ) {
					break;
				}

				$value         = $author->display_name;
				$user_edit_url = get_edit_user_link( $author->ID );

				if ( ! empty( $user_edit_url ) ) {
					$value = '<a href="' . esc_url( $user_edit_url ) . '">' . esc_html( $value ) . '</a>';
				}
				break;

			case 'tags':
				$tags       = $snippet->get_tags();
				$tags_links = array();
				if ( 'trash' !== $this->view ) {
					foreach ( $tags as $tag ) {
						$url          = add_query_arg( 'tag', $tag );
						$url          = remove_query_arg( 'paged', $url );
						$tags_links[] = sprintf(
							'<a href="%1$s" title="%2$s">%3$s</a>',
							esc_url( $url ),
							// Translators: The tag by which to filter the list of snippets in the admin.
							sprintf( __( 'Filter snippets by tag: %s', 'insert-headers-and-footers' ), esc_attr( $tag ) ),
							esc_html( $tag )
						);
					}
				} else {
					$tags_links = $tags;
				}
				$value = implode( ', ', $tags_links );
				break;

			case 'status':
				$value = $this->get_status_toggle( $snippet->is_active(), $snippet->get_id() );
				break;

			case 'shortcode':
				$shortcode = apply_filters( 'wpcode_shortcode_preview', '[wpcode id="' . absint( $snippet->get_id() ) . '"]', $snippet );
				// Show the shortcode in a code tag so it's easy to copy.
				$value = '<code class="wpcode-copy" data-copy-value="' . esc_attr( $shortcode ) . '">' . esc_html( $shortcode ) . get_wpcode_icon( 'copy' ) . '</code>';
				break;

			case 'code_type':
				// Let's display the code type with a link to filter by code type.
				$code_type = $snippet->get_code_type();
				if ( 'trash' === $this->view ) {
					$value = $code_type;
				} else {
					$url   = add_query_arg(
						array(
							'filter_action' => 'Filter',
							'type'          => $code_type,
						),
						$this->admin_url( 'admin.php?page=wpcode' )
					);
					$value = sprintf( '<a href="%1$s">%2$s</a>', esc_url( $url ), esc_html( $code_type ) );
				}
				break;

			case 'note':
				$notes = $snippet->get_note();
				// Simply apply content filters to properly format the HTML.
				$value = wpautop( wp_kses_post( $notes ) );
				break;

			case 'priority':
				$value = esc_html( $snippet->get_priority() );
				break;

			default:
				$value = '';
		}

		return apply_filters( 'wpcode_code_snippets_table_column_value', $value, $snippet, $column_name );
	}

	/**
	 * Get the markup for the status toggle.
	 *
	 * @param bool $active If the snippet is active or not.
	 * @param int  $snippet_id The id of the snippet.
	 *
	 * @return string
	 */
	public function get_status_toggle( $active, $snippet_id ) {
		$markup = '<label class="wpcode-checkbox-toggle">';

		$markup .= '<input data-id=' . absint( $snippet_id ) . ' type="checkbox" ' . checked( $active, true, false ) . ' class="wpcode-status-toggle" />';
		$markup .= '<span class="wpcode-checkbox-toggle-slider"></span>';
		$markup .= '<span class="screen-reader-text">' . esc_html__( 'Toggle Snippet Status', 'insert-headers-and-footers' ) . '</span>';
		$markup .= '</label>';

		$snippets_with_errors = wpcode()->error->get_snippets_with_errors();
		// Let's check if the snippet threw an error.
		if ( ! empty( $snippets_with_errors ) && in_array( $snippet_id, $snippets_with_errors, true ) ) {
			$last_error = get_post_meta( $snippet_id, '_wpcode_last_error', true );
			if ( ! empty( $last_error ) ) {
				$type = 'error';
				if ( isset( $last_error['wpc_type'] ) && 'deactivated' === $last_error['wpc_type'] ) {
					$tooltip_text = sprintf(
					// Translators: %1$s is the time since the snippet was deactivated, %2$s is the date and time of deactivation.
						__( 'This snippet was automatically deactivated because of a fatal error at %2$s on %3$s (%1$s ago)', 'insert-headers-and-footers' ),
						human_time_diff( $last_error['time'], time() ),
						gmdate( 'H:i:s', $last_error['time'] ),
						gmdate( 'Y-m-d', $last_error['time'] )
					);

					$type = 'deactivated';
				} else {
					$tooltip_text = esc_html__( 'This snippet threw an error, you can see more details when editing the snippet.', 'insert-headers-and-footers' );
				}

				$markup .= '<span class="wpcode-table-status-icon wpcode-help-tooltip wpcode-table-status-icon-' . esc_attr( $type ) . '">' . get_wpcode_icon( 'info' ) . '<span class="wpcode-help-tooltip-text">' . $tooltip_text . '</span></span>';
			}
		}

		return $markup;
	}

	/**
	 * Render the snippet name column with action links.
	 *
	 * @param WP_Post $snippet Snippet.
	 *
	 * @return string
	 */
	public function column_name( $snippet ) {
		// Build the row action links and return the value.
		return $this->get_column_name_title( $snippet ) . $this->get_column_name_row_actions( $snippet );
	}

	/**
	 * Get the snippet name HTML for the snippet name column.
	 *
	 * @param WP_Post $snippet Snippet post object.
	 *
	 * @return string
	 */
	protected function get_column_name_title( $snippet ) {

		$title = ! empty( $snippet->post_title ) ? $snippet->post_title : $snippet->post_name;
		$name  = sprintf(
			'<span><strong>%s</strong></span>',
			esc_html( $title )
		);

		if ( 'trash' === $this->view ) {
			return $name;
		}

		if ( current_user_can( 'edit_post', $snippet->ID ) ) {
			$name = sprintf(
				'<a href="%s" title="%s"><strong>%s</strong></a>',
				esc_url(
					add_query_arg(
						'snippet_id',
						$snippet->ID,
						$this->admin_url( 'admin.php?page=wpcode-snippet-manager' )
					)
				),
				esc_attr__( 'Edit This Snippet', 'insert-headers-and-footers' ),
				esc_html( $title )
			);
		}

		// Check if snippet is locked for editing.
		$post_lock = wp_check_post_lock( $snippet );
		if ( $post_lock ) {
			$user = get_user_by( 'id', $post_lock );

			$currently_editing = sprintf(
			/* translators: %s: User display name */
				esc_html__( '%s is currently editing', 'insert-headers-and-footers' ),
				esc_html( $user->display_name )
			);

			$name = '<div class="wpcode-locked-snippet">' . $currently_editing . '</div>' . $name;
		}

		return $name;
	}

	/**
	 * Get the row actions HTML for the snippet name column.
	 *
	 * @param WP_Post $snippet Snippet object.
	 *
	 * @return string
	 */
	protected function get_column_name_row_actions( $snippet ) {
		/**
		 * Filters row action links on the 'Code Snippets' admin page.
		 *
		 * @param array   $row_actions An array of action links for a given snippet.
		 * @param WP_Post $snippet Snippet object.
		 */
		$actions = array();

		if ( 'trash' === $this->view ) {
			if ( current_user_can( 'edit_post', $snippet->ID ) ) {
				$actions['untrash'] = sprintf(
					'<a href="%s" title="%s">%s</a>',
					esc_url(
						wp_nonce_url(
							add_query_arg(
								array(
									'action'     => 'untrash',
									'snippet_id' => $snippet->ID,
								),
								$this->admin_url( 'admin.php?page=wpcode' )
							),
							'wpcode_untrash_nonce'
						)
					),
					esc_attr__( 'Restore this snippet', 'insert-headers-and-footers' ),
					esc_html__( 'Restore', 'insert-headers-and-footers' )
				);
				$actions['delete']  = sprintf(
					'<a href="%s" title="%s">%s</a>',
					esc_url(
						wp_nonce_url(
							add_query_arg(
								array(
									'action'     => 'delete',
									'snippet_id' => $snippet->ID,
								),
								$this->admin_url( 'admin.php?page=wpcode' )
							),
							'wpcode_delete_nonce'
						)
					),
					esc_attr__( 'Delete this snippet permanently', 'insert-headers-and-footers' ),
					esc_html__( 'Delete Permanently', 'insert-headers-and-footers' )
				);
			}
		} else {

			if ( current_user_can( 'edit_post', $snippet->ID ) ) {
				$actions['edit'] = sprintf(
					'<a href="%s" title="%s">%s</a>',
					esc_url( add_query_arg( 'snippet_id', $snippet->ID, $this->admin_url( 'admin.php?page=wpcode-snippet-manager' ) ) ),
					esc_attr__( 'Edit This Snippet', 'insert-headers-and-footers' ),
					esc_html__( 'Edit', 'insert-headers-and-footers' )
				);
			}

			if ( current_user_can( 'edit_post', $snippet->ID ) && ! wpcode_testing_mode_enabled() ) {
				$actions['trash'] = sprintf(
					'<a href="%s" title="%s">%s</a>',
					esc_url(
						wp_nonce_url(
							add_query_arg(
								array(
									'action'     => 'trash',
									'snippet_id' => $snippet->ID,
								),
								$this->admin_url( 'admin.php?page=wpcode' )
							),
							'wpcode_trash_nonce'
						)
					),
					esc_attr__( 'Move this snippet to trash', 'insert-headers-and-footers' ),
					esc_html__( 'Trash', 'insert-headers-and-footers' )
				);
			}

			if ( current_user_can( 'edit_post', $snippet->ID ) ) {
				$actions['duplicate'] = sprintf(
					'<a href="%s" title="%s">%s</a>',
					esc_url(
						wp_nonce_url(
							add_query_arg(
								array(
									'action'     => 'duplicate',
									'snippet_id' => $snippet->ID,
								),
								$this->admin_url( 'admin.php?page=wpcode' )
							),
							'wpcode_duplicate_nonce'
						)
					),
					esc_attr__( 'Duplicate this snippet', 'insert-headers-and-footers' ),
					esc_html__( 'Duplicate', 'insert-headers-and-footers' )
				);
			}
		}

		return $this->row_actions( apply_filters( 'wpcode_code_snippets_row_actions', $actions, $snippet, $this->view ) );
	}

	/**
	 * Define bulk actions available for our table listing.
	 *
	 * @return array
	 */
	public function get_bulk_actions() {
		if ( 'trash' === $this->view ) {
			$bulk_actions = array(
				'untrash' => esc_html__( 'Restore', 'insert-headers-and-footers' ),
				'delete'  => esc_html__( 'Delete Permanently', 'insert-headers-and-footers' ),
			);
		} else {
			$bulk_actions = array(
				'trash'   => __( 'Trash', 'insert-headers-and-footers' ),
				'enable'  => __( 'Activate', 'insert-headers-and-footers' ),
				'disable' => __( 'Deactivate', 'insert-headers-and-footers' ),
			);
		}

		return apply_filters( 'wpcode_snippets_bulk_actions', $bulk_actions );
	}

	/**
	 * Get hidden columns for snippets table screen
	 *
	 * @return array
	 */
	protected function get_hidden_columns() {
		// Get current screen to ensure correct option name
		$screen        = get_current_screen();
		$screen_option = $screen->get_option( 'id' );

		// Get user's saved preferences
		$hidden = get_user_option( 'manage' . $screen->id . 'columnshidden' );

		// If no user preferences are set, use our defaults
		if ( ! is_array( $hidden ) ) {
			$hidden = array(
				'note',
				'shortcode',
				'updated'
			);

			// Save default preferences
			update_user_option( get_current_user_id(), 'manage' . $screen->id . 'columnshidden', $hidden, true );
		}

		return $hidden;
	}

	/**
	 * Message to be displayed when there are no snippets.
	 *
	 * @since 2.0.0
	 */
	public function no_items() {

		esc_html_e( 'No snippets found.', 'insert-headers-and-footers' );
	}

	/**
	 * Fetch and set up the final data for the table.
	 *
	 * @since 2.0.0
	 */
	public function prepare_items() {

		$columns = $this->get_columns();
		$hidden  = $this->get_hidden_columns();

		$sortable = array(
			'name'     => array( 'title', false ),
			'created'  => array( 'date', false ),
			'updated'  => array( 'last_updated', false ),
			'priority' => array( 'priority', false ),
		);

		$sortable_query_params = array(
			'last_updated' => 'modified',
			'title'        => 'title',
			'date'         => 'id',
			'priority'     => 'priority',
		);

		// Set column headers.
		$this->_column_headers = array( $columns, $hidden, $sortable, 'name' );

		// phpcs:disable WordPress.Security.NonceVerification.Recommended
		$page = $this->get_pagenum();

		// Reset page to 1 if a search or filter is being applied.
		if ( isset( $_REQUEST['submitted'] ) ) {
			$page = 1;
		}

		if ( isset( $_GET['order'] ) ) {
			$order = 'asc' === $_GET['order'] ? 'ASC' : 'DESC';
		} else {
			$order      = 'DESC';
			$user_order = get_user_option( 'wpcode_snippets_order' );
			if ( ! empty( $user_order ) ) {
				$order = $user_order;
			}
		}
		// Same thing but for order by.
		if ( isset( $_GET['orderby'] ) ) {
			$order_by = sanitize_key( $_GET['orderby'] );
		} else {
			$order_by     = 'ID';
			$user_orderby = get_user_option( 'wpcode_snippets_order_by' );
			if ( ! empty( $user_orderby ) ) {
				$order_by = $user_orderby;
			}
		}

		if ( isset( $sortable_query_params[ $order_by ] ) ) {
			$order_by = $sortable_query_params[ $order_by ];
		} else {
			$order_by = 'ID';
		}

		$per_page    = $this->get_items_per_page( 'wpcode_snippets_per_page', $this->per_page );
		$is_filtered = false;

		$args = array(
			'orderby'        => $order_by,
			'order'          => $order,
			'nopaging'       => false,
			'posts_per_page' => $per_page,
			'paged'          => $page,
			'no_found_rows'  => false,
			'post_status'    => array( 'publish', 'draft' ),
			'post_type'      => $this->get_post_type(),
		);

		if ( 'priority' === $order_by ) {
			$args['orderby']  = 'meta_value_num';
			$args['meta_key'] = '_wpcode_priority'; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
		}

		if ( ! empty( $_GET['location'] ) ) {
			$is_filtered       = true;
			$args['tax_query'] = array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
				array(
					'taxonomy' => 'wpcode_location',
					'terms'    => array( sanitize_key( $_GET['location'] ) ),
					'field'    => 'slug',
				),
			);
		}

		if ( ! empty( $_GET['type'] ) ) {
			$is_filtered = true;
			if ( ! isset( $args['tax_query'] ) ) {
				$args['tax_query'] = array(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
			}
			$args['tax_query'][] = array(
				'taxonomy' => 'wpcode_type',
				'terms'    => array( sanitize_text_field( wp_unslash( $_GET['type'] ) ) ),
				'field'    => 'slug',
			);
		}

		if ( ! empty( $this->requested_type ) ) {
			$args['tax_query'][] = array(
				'taxonomy' => 'wpcode_type',
				'terms'    => array( $this->requested_type ),
				'field'    => 'slug',
			);
		}

		if ( ! empty( $_GET['tag'] ) ) {
			$is_filtered = true;
			if ( ! isset( $args['tax_query'] ) ) {
				$args['tax_query'] = array(); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
			}
			$args['tax_query'][] = array(
				'taxonomy' => 'wpcode_tags',
				'terms'    => array( sanitize_text_field( wp_unslash( $_GET['tag'] ) ) ),
				'field'    => 'slug',
			);
		}

		if ( ! empty( $_GET['s'] ) ) {
			$args['s'] = sanitize_text_field( wp_unslash( $_GET['s'] ) );
			// This is a search so let's extend it to meta too.
			$this->add_meta_search();
		}
		// phpcs:enable WordPress.Security.NonceVerification.Recommended

		if ( 'all' !== $this->view ) {
			$args['post_status'] = $this->get_post_status_from_view();
		}

		if ( 'has_error' === $this->view ) {
			$args['meta_query'] = array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
				'relation' => 'OR',
				array(
					'key'     => '_wpcode_last_error',
					'compare' => 'EXISTS',
				),
			);
		}

		/**
		 * Filters the `get_posts()` arguments while preparing items for the code snippets table.
		 *
		 * @param array $args Arguments array.
		 */
		$args = (array) apply_filters( 'wpcode_code_snippets_table_prepare_items_args', $args );

		$items_query = new WP_Query( $args );
		$this->items = $items_query->get_posts();
		// Remove filters to avoid conflicts.
		$this->remove_meta_search();

		$per_page = isset( $args['posts_per_page'] ) ? $args['posts_per_page'] : $this->get_items_per_page( 'wpcode_snippets_per_page', $this->per_page );

		$this->update_count( $args );

		$count_current_view = empty( $this->count[ $this->view ] ) ? 0 : $this->count[ $this->view ];
		if ( $is_filtered ) {
			$count_current_view = $items_query->found_posts;
		}

		// Finalize pagination.
		$this->set_pagination_args(
			array(
				'total_items' => $count_current_view,
				'per_page'    => $per_page,
				'total_pages' => ceil( $count_current_view / $per_page ),
			)
		);
	}

	/**
	 * Retrieve the table columns.
	 *
	 * @return array $columns Array of all the list table columns.
	 */
	public function get_columns() {

		$columns = array(
			'cb'        => '<input type="checkbox" />',
			'id'        => esc_html__( 'ID', 'insert-headers-and-footers' ),
			'name'      => esc_html__( 'Name', 'insert-headers-and-footers' ),
			'author'    => esc_html__( 'Author', 'insert-headers-and-footers' ),
			'location'  => esc_html__( 'Location', 'insert-headers-and-footers' ),
			'created'   => esc_html__( 'Created', 'insert-headers-and-footers' ),
			'updated'   => esc_html__( 'Last Updated', 'insert-headers-and-footers' ),
			'tags'      => esc_html__( 'Tags', 'insert-headers-and-footers' ),
			'shortcode' => esc_html__( 'Shortcode', 'insert-headers-and-footers' ),
			'code_type' => esc_html__( 'Code Type', 'insert-headers-and-footers' ),
			'priority'  => esc_html__( 'Priority', 'insert-headers-and-footers' ),
			'note'      => esc_html__( 'Note', 'insert-headers-and-footers' ),
		);
		if ( 'trash' !== $this->view ) {
			$columns['status'] = esc_html__( 'Status', 'insert-headers-and-footers' );
		}

		return apply_filters( 'wpcode_code_snippets_table_columns', $columns );
	}

	/**
	 * Dynamically add filters to extend search to meta fields.
	 *
	 * @return void
	 */
	public function add_meta_search() {
		add_filter( 'posts_join', array( $this, 'meta_search_join' ) );
		add_filter( 'posts_where', array( $this, 'meta_search_where' ) );
		add_filter( 'posts_distinct', array( $this, 'meta_search_distinct' ) );
	}

	/**
	 * Remove dynamically added filters to avoid spilling to other queries.
	 *
	 * @return void
	 */
	public function remove_meta_search() {
		remove_filter( 'posts_join', array( $this, 'meta_search_join' ) );
		remove_filter( 'posts_where', array( $this, 'meta_search_where' ) );
		remove_filter( 'posts_distinct', array( $this, 'meta_search_distinct' ) );
	}

	/**
	 * Convert custom view names to actual post statuses.
	 *
	 * @return string
	 */
	private function get_post_status_from_view() {
		switch ( $this->view ) {
			case 'active':
				$post_status = 'publish';
				break;
			case 'deactivated':
			case 'inactive':
				$post_status = 'draft';
				break;
			case 'trash':
				$post_status = 'trash';
				break;
			default:
				$post_status = 'all';
				break;
		}

		return $post_status;
	}

	/**
	 * Calculate and update snippets counts.
	 *
	 * @param array $args Get snippets arguments.
	 */
	private function update_count( $args ) {
		/**
		 * Allow counting snippets filtered by a given search criteria.
		 *
		 * If result will not contain `all` key, count All Snippets without filtering will be performed.
		 *
		 * @param array $count Contains counts of snippets in different views.
		 * @param array $args Arguments of the `get_posts`.
		 *
		 * @since 2.0.0
		 */
		$this->count = (array) apply_filters( 'wpcode_code_snippets_table_update_count', array(), $args );

		// We do not need to perform all snippets count if we have the result already.
		if ( isset( $this->count['all'] ) ) {
			return;
		}

		$count_args = array(
			'post_type'      => $this->get_post_type(),
			'posts_per_page' => - 1,  // no pagination for counting.
		);

		// Apply the same filters as used in `prepare_items()`.
		if ( ! empty( $args['tax_query'] ) ) {
			$count_args['tax_query'] = $args['tax_query'];  // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
		}

		// Initialize counts.
		$this->count = array(
			'all'      => 0,
			'active'   => 0,
			'inactive' => 0,
			'trash'    => 0,
		);

		// Calculate counts for each relevant status.
		$status_counts = array(
			'publish' => 'active',
			'draft'   => 'inactive',
			'trash'   => 'trash',
		);

		foreach ( $status_counts as $status => $view ) {
			$count_args['post_status'] = $status;
			$count_query               = new WP_Query( $count_args );
			$this->count[ $view ]      = $count_query->found_posts;

			if ( $status !== 'trash' ) {
				$this->count['all'] += $count_query->found_posts;
			}
		}

		$this->count = (array) apply_filters( 'wpcode_code_snippets_table_update_count_all', $this->count, $args );
	}

	/**
	 * Extend the search to meta fields by joining the post meta table.
	 *
	 * @param string $join Join clause in the query.
	 *
	 * @return string
	 */
	public function meta_search_join( $join ) {
		global $wpdb;

		if ( is_admin() && isset( $_GET['s'] ) ) {  // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$join .= ' LEFT JOIN ' . $wpdb->postmeta . ' ON ' . $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
		}

		return $join;
	}

	/**
	 * Extend the where clause to include the post meta values.
	 *
	 * @param string $where Where clause in the query.
	 *
	 * @return string
	 */
	public function meta_search_where( $where ) {
		global $wpdb;

		if ( is_admin() && isset( $_GET['s'] ) ) {  // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$where = preg_replace(
				'/\(\s*' . $wpdb->posts . ".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
				'(' . $wpdb->posts . '.post_title LIKE $1) OR (' . $wpdb->postmeta . '.meta_value LIKE $1)',
				$where
			);
		}

		return $where;
	}

	/**
	 * Add distinct to the query to avoid duplicate results.
	 *
	 * @param string $distinct The distinct clause in the query.
	 *
	 * @return string
	 */
	public function meta_search_distinct( $distinct ) {

		if ( is_admin() && isset( $_GET['s'] ) ) {  // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			return 'DISTINCT';
		}

		return $distinct;
	}

	/**
	 * Extending the `display_rows()` method in order to add hooks.
	 *
	 * @since 1.5.6
	 */
	public function display_rows() {

		do_action( 'wpcode_code_snippets_table_before_rows', $this );

		parent::display_rows();

		do_action( 'wpcode_code_snippets_table_after_rows', $this );
	}

	/**
	 * Display the pagination.
	 *
	 * @param string $which The location of the table pagination: 'top' or 'bottom'.
	 */
	protected function pagination( $which ) {

		if ( empty( $this->_pagination_args['total_pages'] ) || $this->_pagination_args['total_pages'] <= 1 ) {
			return;
		}

		$total_items  = $this->_pagination_args['total_items'];
		$total_pages  = $this->_pagination_args['total_pages'];
		$current_page = $this->get_pagenum();

		// If form was submitted, reset to page 1.
		// phpcs:disable WordPress.Security.NonceVerification.Recommended
		if ( ! empty( $_GET['submitted'] ) && 'formSubmited' === $_GET['submitted'] ) {
			$current_page = 1;
		}

		// Construct URL base arguments.
		$page_args = array( 'page' => 'wpcode' );
		foreach ( array( 'type', 'filter_action', 'location', 'view' ) as $param ) {
			if ( ! empty( $_GET[ $param ] ) ) {
				$page_args[ $param ] = sanitize_text_field( wp_unslash( $_GET[ $param ] ) );
			}
		}

		// Construct the base URL for pagination.
		$base_url = add_query_arg( $page_args, admin_url( 'admin.php' ) ) . '&paged=%';

		$pagination_links_class = 'pagination-links';
		if ( ! empty( $this->_pagination_args['infinite_scroll'] ) ) {
			$pagination_links_class .= ' hide-if-js';
		}

		// Prepare the pagination links.
		$page_links = array();

		$disable_first = ( 1 === $current_page );
		$disable_last  = ( $current_page === $total_pages );
		$disable_prev  = $disable_first;
		$disable_next  = $disable_last;

		if ( $disable_first ) {
			$page_links[] = '<span class="tablenav-pages-navspan button disabled" aria-hidden="true">&laquo;</span>';
		} else {
			$page_links[] = sprintf(
				'<a class="first-page button" href="%s">%s</a>',
				esc_url( add_query_arg( 'paged', 1, $base_url ) ),
				'&laquo;'
			);
		}

		if ( $disable_prev ) {
			$page_links[] = '<span class="tablenav-pages-navspan button disabled" aria-hidden="true">&lsaquo;</span>';
		} else {
			$page_links[] = sprintf(
				'<a class="prev-page button" href="%s">%s</a>',
				esc_url( add_query_arg( 'paged', max( 1, $current_page - 1 ), $base_url ) ),
				'&lsaquo;'
			);
		}

		// Pagination input with hidden fields for filter parameters.
		$page_links[] = sprintf(
			'<span class="paging-input">
                        <label for="current-page-selector" class="screen-reader-text">%s</label>
                        <input class="current-page" id="current-page-selector" type="text" value="%d" size="%d" aria-describedby="table-paging" />
                        <span class="tablenav-paging-text"> ' . esc_html__( 'of', 'insert-headers-and-footers' ) . ' <span class="total-pages">%s</span></span>
                    </span>',
			esc_html__( 'Current Page', 'insert-headers-and-footers' ),
			esc_html( $current_page ),
			strlen( $total_pages ),
			number_format_i18n( $total_pages )
		);

		if ( $disable_next ) {
			$page_links[] = '<span class="tablenav-pages-navspan button disabled" aria-hidden="true">&rsaquo;</span>';
		} else {
			$page_links[] = sprintf(
				'<a class="next-page button" href="%s">%s</a>',
				esc_url( add_query_arg( 'paged', min( $total_pages, $current_page + 1 ), $base_url ) ),
				'&rsaquo;'
			);
		}

		if ( $disable_last ) {
			$page_links[] = '<span class="tablenav-pages-navspan button disabled" aria-hidden="true">&raquo;</span>';
		} else {
			$page_links[] = sprintf(
				'<a class="last-page button" href="%s">%s</a>',
				esc_url( add_query_arg( 'paged', $total_pages, $base_url ) ),
				'&raquo;'
			);
		}

		// Output the pagination.
		echo '<div class="tablenav-pages">';
		/* Translators: %s: the number of items. */
		echo '<span class="displaying-num">' . esc_html( sprintf( _n( '%s item', '%s items', absint( $total_items ), 'insert-headers-and-footers' ), number_format_i18n( $total_items ) ) ) . '</span>';
		echo '<span class="' . esc_attr( $pagination_links_class ) . '">';
		echo implode( "\n", wp_unslash( $page_links ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
		echo '</span></div>';
	}

	/**
	 * Extra controls to be displayed between bulk actions and pagination.
	 *
	 * @param string $which The location of the table navigation: 'top' or 'bottom'.
	 *
	 * @return void
	 */
	protected function extra_tablenav( $which ) {
		if ( 'top' === $which && 'trash' !== $this->view ) {
			echo '<div class="actions alignleft">';
			$this->location_dropdown( $this->get_post_type() );

			submit_button( __( 'Filter', 'insert-headers-and-footers' ), '', 'filter_action', false, array( 'id' => 'wpcode-filter-submit' ) );

			if ( isset( $_GET['filter_action'] ) || isset( $_GET['tag'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended
				echo '&nbsp;';
				submit_button( __( 'Clear', 'insert-headers-and-footers' ), '', 'filter_clear', false, array( 'id' => 'wpcode-filter-clear' ) );
			}
			echo '</div>';
		}
	}

	/**
	 * The dropdown to filter by location.
	 *
	 * @param string $post_type The post type.
	 *
	 * @return void
	 */
	protected function location_dropdown( $post_type ) {
		if ( ! is_object_in_taxonomy( $post_type, 'wpcode_location' ) ) {
			return;
		}

		$used_locations = get_terms(
			array(
				'taxonomy'   => 'wpcode_location',
				'hide_empty' => true,
			)
		);

		// Return if there are no posts using locations.
		if ( ! $used_locations ) {
			return;
		}

		$displayed_location = isset( $_GET['location'] ) ? sanitize_key( $_GET['location'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		?>
		<label for="filter-by-location" class="screen-reader-text"><?php esc_html_e( 'Filter by location', 'insert-headers-and-footers' ); ?></label>
		<select name="location" id="filter-by-location">
			<option<?php selected( $displayed_location, '' ); ?> value=""><?php esc_html_e( 'All locations', 'insert-headers-and-footers' ); ?></option>
			<?php
			foreach ( $used_locations as $used_location ) {
				$pretty_name = wpcode()->auto_insert->get_location_label( $used_location->slug );
				?>
				<option<?php selected( $displayed_location, $used_location->slug ); ?> value="<?php echo esc_attr( $used_location->slug ); ?>"><?php echo esc_html( $pretty_name ); ?></option>
				<?php
			}
			?>
		</select>
		<?php
	}

	/**
	 * Get the list of views available on the overview table.
	 *
	 * @return array
	 */
	protected function get_views() {
		$views = array();

		if ( $this->count['all'] ) {
			$views['all'] = $this->view_markup( 'all', __( 'All', 'insert-headers-and-footers' ) );
		}
		if ( $this->count['active'] ) {
			$views['active'] = $this->view_markup( 'active', __( 'Active', 'insert-headers-and-footers' ) );
		}
		if ( $this->count['inactive'] ) {
			$views['inactive'] = $this->view_markup( 'inactive', __( 'Inactive', 'insert-headers-and-footers' ) );
		}
		if ( $this->count['trash'] && ! wpcode_testing_mode_enabled() ) {
			$views['trash'] = $this->view_markup( 'trash', __( 'Trash', 'insert-headers-and-footers' ) );
		}

		return $views;
	}

	/**
	 * Get view link markup for the nav above the table.
	 *
	 * @param string $slug The slug of the view.
	 * @param string $label The label for the view.
	 *
	 * @return string
	 */
	private function view_markup( $slug, $label ) {

		$start_url = admin_url( 'admin.php' );
		// Start with a clean URL by removing specific query arguments.
		$base_url = remove_query_arg(
			array(
				'view',
				'trashed',
				'duplicated',
				'untrashed',
				'deleted',
				'enabled',
				'disabled',
				's',
			),
			$start_url
		);

		$base_url       = add_query_arg( 'page', 'wpcode', $base_url );
		$current_params = $_GET;

		// Remove the same specific query arguments from current params to ensure they are not reintroduced.
		$params_to_remove = array(
			'view',
			'trashed',
			'duplicated',
			'untrashed',
			'deleted',
			'enabled',
			'disabled',
			's'
		);
		foreach ( $params_to_remove as $param ) {
			unset( $current_params[ $param ] );
		}

		$current_params['view'] = $slug;

		$url   = add_query_arg( $current_params, $base_url );
		$class = ( $slug === $this->view ) ? 'current' : '';
		$count = isset( $this->count[ $slug ] ) ? $this->count[ $slug ] : 0;

		return sprintf(
			'<a href="%1$s" class="%2$s">%3$s <span class="count">(%4$d)</span></a>',
			esc_url( $url ),
			esc_attr( $class ),
			esc_html( $label ),
			esc_html( $count )
		);
	}


	/**
	 * Get an admin URL.
	 *
	 * @param string $path The path to append to the admin URL.
	 *
	 * @return string
	 */
	public function admin_url( $path ) {
		return admin_url( $path );
	}
}
includes/admin/class-wpcode-code-editor.php000064400000011157151331545640014747 0ustar00<?php
/**
 * Central place to load the Code Editor used throughout the plugin with
 * similar settings.
 *
 * @package WPCode
 */

/**
 * Class WPCode_Code_Editor.
 */
class WPCode_Code_Editor {


	/**
	 * Array of settings used to instantiate the editor.
	 *
	 * @var array
	 */
	private $settings;

	/**
	 * Array of ids of textareas to init as code editors.
	 *
	 * @var array
	 */
	private $editors;

	/**
	 * WPCode_Code_Editor Constructor.
	 *
	 * @param string $code_type The code type that will be converted to the mime type for the editor.
	 */
	public function __construct( $code_type = 'html' ) {
		$this->load_code_mirror( $code_type );
	}

	/**
	 * If called, this loads CodeMirror on the current admin page with checks.
	 *
	 * @param string $code_type The code type that will be converted to the mime type for the editor.
	 *
	 * @return array|false
	 */
	public function load_code_mirror( $code_type ) {
		if ( ! function_exists( 'wp_enqueue_code_editor' ) ) {
			return false;
		}
		$editor_args = array(
			'type'       => wpcode()->execute->get_mime_for_code_type( $code_type ),
			'showHint'   => true,
			'codemirror' => array(
				'matchBrackets'             => true,
				'gutters'                   => array( 'CodeMirror-lint-markers', 'CodeMirror-foldgutter' ),
				'foldGutter'                => true,
				'autoCloseBrackets'         => true,
				'highlightSelectionMatches' => true,
			),
		);
		if ( ! current_user_can( 'wpcode_edit_snippets' ) ) {
			$editor_args['codemirror']['readOnly'] = true;
		}

		// Check if the DISALLOW_UNFILTERED_HTML is defined and print the warning message
		if ( defined( 'DISALLOW_UNFILTERED_HTML' ) && DISALLOW_UNFILTERED_HTML ) {
			WPCode_Notice::warning(
				esc_html__( 'The PHP constant DISALLOW_UNFILTERED_HTML is currently defined, which is preventing WPCode from saving code accurately. Please contact your webmaster for assistance in disabling this restriction.', 'insert-headers-and-footers' )
			);
		}

		// Allow filtering of the editor args.
		$editor_args = apply_filters( 'wpcode_editor_config', $editor_args );

		// Add filter to override the current user meta for syntax highlighting.
		add_filter( 'get_user_metadata', array( $this, 'override_user_meta' ), 10, 4 );
		// Enqueue code editor and settings for manipulating HTML.
		$this->settings = wp_enqueue_code_editor( $editor_args );
		// Remove the filter.
		remove_filter( 'get_user_metadata', array( $this, 'override_user_meta' ) );

		return $this->settings;
	}

	/**
	 * When using the WPCode editor always load syntax highlighting.
	 *
	 * @param mixed  $value The meta value.
	 * @param int    $object_id The user ID.
	 * @param string $meta_key The meta key being looked up.
	 * @param bool   $single True if only the first value should be returned.
	 *
	 * @return bool|mixed
	 */
	public function override_user_meta( $value, $object_id, $meta_key, $single ) {
		if ( 'syntax_highlighting' !== $meta_key || ! apply_filters( 'wpcode_override_syntax_highlighting', true ) ) {
			return $value;
		}

		return true;
	}

	/**
	 * Load hint scripts if needed.
	 *
	 * @return void
	 */
	public function load_hint_scripts() {
		wp_enqueue_script( 'htmlhint' );
		wp_enqueue_script( 'csslint' );
		wp_enqueue_script( 'jshint' );
	}

	/**
	 * Update a setting for the editor instance.
	 *
	 * @param string $key Key of setting to update.
	 * @param mixed  $value Value to set the setting to, can be string, integer, array.
	 *
	 * @return void
	 */
	public function set_setting( $key, $value ) {
		if ( ! isset( $this->settings ) ) {
			return;
		}
		if ( ! isset( $this->settings['codemirror'] ) ) {
			$this->settings['codemirror'] = array();
		}

		$this->settings['codemirror'][ $key ] = $value;
	}

	/**
	 * Load the inline script needed to initiate the code editor using the current settings.
	 *
	 * @param string $id The textarea ID to init the editor for.
	 *
	 * @return void
	 */
	public function register_editor( $id ) {
		$this->editors[] = $id;
	}

	/**
	 * Load the inline script needed to initiate the code editor using the current settings.
	 *
	 * @return void
	 */
	public function init_editor() {
		wp_add_inline_script(
			'code-editor',
			sprintf(
				'
				jQuery( function() {
							window.wpcode_editor = window.wpcode_editor ? window.wpcode_editor : {};
							var ids = %1$s;
							var settings = %2$s;
							for ( var i in ids ) {
								window.wpcode_editor[ids[i]] = wp.codeEditor.initialize( ids[i], settings );
							}
						} );',
				wp_json_encode( $this->editors ),
				wp_json_encode( $this->get_settings() )
			)
		);
	}

	/**
	 * Get the settings.
	 *
	 * @return array
	 */
	public function get_settings() {
		return $this->settings;
	}
}
includes/admin/class-wpcode-review.php000064400000014760151331545640014055 0ustar00<?php

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Ask for some love.
 *
 *
 */
class WPCode_Review {

	/**
	 * Primary class constructor.
	 *
	 *
	 */
	public function __construct() {

		// Admin notice requesting review.
		add_action( 'admin_init', array( $this, 'review_request' ) );

		// Admin footer text.
		add_filter( 'admin_footer_text', array( $this, 'admin_footer' ), 1, 2 );
	}

	/**
	 * Add admin notices as needed for reviews.
	 */
	public function review_request() {

		// Only consider showing the review request to admin users.
		if ( ! is_super_admin() ) {
			return;
		}

		// Don't show notice to headers & footers mode users.
		if ( wpcode()->settings->get_option( 'headers_footers_mode' ) ) {
			return;
		}

		// If this is a multisite and the user is a super admin let's see if they already dismissed this on other sites.
		if ( is_multisite() && is_super_admin() ) {
			$dismissed = get_user_meta( get_current_user_id(), 'wpcode_dismissed_review_request', true );

			if ( ! empty( $dismissed ) ) {
				return;
			}
		}

		// Verify that we can do a check for reviews.
		$notices = get_option( 'wpcode_admin_notices', array() );
		$time    = time();
		$load    = false;

		if ( empty( $notices['review_request'] ) ) {
			$notices['review_request'] = array(
				'time'      => $time,
				'dismissed' => false,
			);

			update_option( 'wpcode_admin_notices', $notices );

			return;
		}

		// Check if it has been dismissed or not.
		if (
			( isset( $notices['review_request']['dismissed'] ) &&
			  ! $notices['review_request']['dismissed'] ) &&
			(
				isset( $notices['review_request']['time'] ) &&
				( ( $notices['review_request']['time'] + DAY_IN_SECONDS ) <= $time )
			)
		) {
			$load = true;
		}

		// If we cannot load, return early.
		if ( ! $load ) {
			return;
		}

		$this->review();
	}

	/**
	 * Maybe show Lite review request.
	 */
	public function review() {

		// Fetch when plugin was initially installed.
		$activated = get_option( 'ihaf_activated', array() );

		if ( ! empty( $activated['wpcode'] ) ) {
			// Only continue if plugin has been installed for at least 14 days.
			if ( ( $activated['wpcode'] + ( DAY_IN_SECONDS * 14 ) ) > time() ) {
				return;
			}
		} else {
			$activated['wpcode'] = time();

			update_option( 'ihaf_activated', $activated );

			return;
		}

		// Only proceed with displaying if the user is using an active snippet.
		$snippet_count = wp_count_posts( 'wpcode' );

		if ( empty( $snippet_count->publish ) ) {
			return;
		}

		$feedback_url = add_query_arg( array(
			'siteurl' => untrailingslashit( home_url() ),
			'plugin' => class_exists( 'WPCode_Premium') ? 'pro' : 'lite',
			'version' => WPCODE_VERSION,
		), 'https://www.wpcode.com/plugin-feedback/' );
		$feedback_url = wpcode_utm_url( $feedback_url, 'review-notice', 'feedback' );

		ob_start();

		// We have a candidate! Output a review message.
		?>
		<div class="wpcode-review-step wpcode-review-step-1">
			<p><?php esc_html_e( 'Are you enjoying WPCode?', 'insert-headers-and-footers' ); ?></p>
			<p>
				<a href="#" class="wpcode-review-switch-step" data-step="3"><?php esc_html_e( 'Yes', 'insert-headers-and-footers' ); ?></a>&nbsp;&bull;&nbsp;<a href="#" class="wpcode-review-switch-step" data-step="2"><?php esc_html_e( 'Not Really', 'insert-headers-and-footers' ); ?></a>
			</p>
		</div>
		<div class="wpcode-review-step wpcode-review-step-2" style="display: none">
			<p><?php esc_html_e( 'We\'re sorry to hear you aren\'t enjoying WPCode. We would love a chance to improve. Could you take a minute and let us know what we can do better?', 'insert-headers-and-footers' ); ?></p>
			<p>
				<a href="<?php echo esc_url( $feedback_url ); ?>" class="wpcode-notice-dismiss" target="_blank"><?php esc_html_e( 'Give Feedback', 'insert-headers-and-footers' ); ?></a>&nbsp;&bull;&nbsp;<a href="#" class="wpcode-notice-dismiss" rel="noopener noreferrer"><?php esc_html_e( 'No thanks', 'insert-headers-and-footers' ); ?></a>
			</p>
		</div>
		<div class="wpcode-review-step wpcode-review-step-3" style="display: none">
			<p><?php esc_html_e( 'That\'s awesome! Could you please do us a BIG favor and give it a 5-star rating on WordPress to help us spread the word and boost our motivation?', 'insert-headers-and-footers' ); ?></p>
			<p>
				<a href="https://wordpress.org/support/plugin/insert-headers-and-footers/reviews/?filter=5#new-post" class="wpcode-notice-dismiss wpcode-review-out" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'Give Feedback', 'insert-headers-and-footers' ); ?></a>&nbsp;&bull;&nbsp;<a href="#" class="wpcode-notice-dismiss" rel="noopener noreferrer"><?php esc_html_e( 'No thanks', 'insert-headers-and-footers' ); ?></a><br>
			</p>
		</div>
		<script type="text/javascript">
			jQuery(document).ready(function ($) {
				$(document).on('click', '.wpcode-review-switch-step', function (e) {
					e.preventDefault();
					var target = $(this).attr('data-step');
					if (target) {
						var notice = $(this).closest('.wpcode-review-notice');
						var review_step = notice.find('.wpcode-review-step-' + target);
						if (review_step.length > 0) {
							notice.find('.wpcode-review-step:visible').fadeOut(function () {
								review_step.fadeIn();
							});
						}
					}
				})
			});
		</script>
		<?php

		WPCode_Notice::info(
			ob_get_clean(),
			array(
				'dismiss' => WPCode_Notice::DISMISS_GLOBAL,
				'slug'    => 'review_request',
				'autop'   => false,
				'class'   => 'wpcode-review-notice',
			)
		);
	}

	/**
	 * When user is on a WPCode related admin page, display footer text
	 * that graciously asks them to rate us.
	 *
	 * @param string $text Footer text.
	 *
	 * @return string
	 *
	 *
	 */
	public function admin_footer( $text ) {

		global $current_screen;

		if ( ! empty( $current_screen->id ) && strpos( $current_screen->id, 'wpcode' ) !== false ) {
			$url  = 'https://wordpress.org/support/plugin/insert-headers-and-footers/reviews/?filter=5#new-post';
			$text = sprintf(
				wp_kses( /* translators: $1$s - WPCode plugin name; $2$s - WP.org review link; $3$s - WP.org review link. */
					__( 'Please rate %1$s <a href="%2$s" target="_blank" rel="noopener noreferrer">&#9733;&#9733;&#9733;&#9733;&#9733;</a> on <a href="%3$s" target="_blank" rel="noopener">WordPress.org</a> to help us spread the word. Thank you from the WPCode team!', 'insert-headers-and-footers' ),
					array(
						'a' => array(
							'href'   => array(),
							'target' => array(),
							'rel'    => array(),
						),
					)
				),
				'<strong>WPCode</strong>',
				$url,
				$url
			);
		}

		return $text;
	}

}

new WPCode_Review();
includes/admin/class-wpcode-admin-page-loader.php000064400000020043151331545640016011 0ustar00<?php
/**
 * Class used to load admin pages allowing child classes
 *  to replace or add pages by changing the classes used.
 *
 * @package WPCode
 */

/**
 * Class WPCode admin page loader.
 */
class WPCode_Admin_Page_Loader {

	/**
	 * Array of admin pages to load.
	 *
	 * @var array
	 */
	public $pages = array();

	/**
	 * Slugs of pages that should not be visible in the submenu.
	 *
	 * @var array
	 */
	public $hidden_pages = array();

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->require_files();

		$this->hooks();
	}

	/**
	 * Hooks.
	 *
	 * @return void
	 */
	public function hooks() {
		add_action( 'admin_menu', array( $this, 'register_admin_menu' ), 9 );
		add_filter( 'plugin_action_links_' . WPCODE_PLUGIN_BASENAME, array( $this, 'add_plugin_action_links' ) );

		// Hide submenus.
		add_filter( 'parent_file', array( $this, 'hide_menus' ), 1020 );

		// Save Screen options.
		add_filter( 'set-screen-option', array( $this, 'screen_options_set' ), 10, 3 );
		add_filter( 'set_screen_option_wpcode_snippets_per_page', array( $this, 'screen_options_set' ), 10, 3 );
	}

	/**
	 * Load required files for the admin pages.
	 *
	 * @return void
	 */
	public function require_files() {
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/trait-wpcode-revisions-display.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/trait-wpcode-my-library-markup.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/class-wpcode-admin-page.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/class-wpcode-admin-page-headers-footers.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/class-wpcode-admin-page-code-snippets.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/class-wpcode-admin-page-snippet-manager.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/class-wpcode-admin-page-library.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/class-wpcode-admin-page-generator.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/class-wpcode-admin-page-tools.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/class-wpcode-admin-page-settings.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/class-wpcode-admin-page-click.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/class-wpcode-admin-page-pixel.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/class-wpcode-admin-page-file-editor.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/class-wpcode-admin-page-search-replace.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/class-wpcode-admin-page-duplicator.php';
	}

	/**
	 * Load the pages classes allowing child classes to replace.
	 *
	 * @return void
	 */
	public function prepare_pages() {

		if ( $this->is_headers_footers_mode() ) {
			$this->pages['headers_footers'] = 'WPCode_Admin_Page_Headers_Footers';

			return;
		}

		$this->pages['code_snippets']   = 'WPCode_Admin_Page_Code_Snippets';
		$this->pages['snippet_manager'] = 'WPCode_Admin_Page_Snippet_Manager';
		$this->pages['headers_footers'] = 'WPCode_Admin_Page_Headers_Footers';
		$this->pages['pixel']           = 'WPCode_Admin_Page_Pixel';
		$this->pages['library']         = 'WPCode_Admin_Page_Library';
		$this->pages['generator']       = 'WPCode_Admin_Page_Generator';
		$this->pages['file_editor']     = 'WPCode_Admin_Page_File_Editor';
		$this->pages['search-replace']  = 'WPCode_Admin_Page_Search_Replace';
		$this->pages['duplicator']      = 'WPCode_Admin_Page_Duplicator';
		$this->pages['tools']           = 'WPCode_Admin_Page_Tools';
		$this->pages['settings']        = 'WPCode_Admin_Page_Settings';
		$this->pages['click']           = 'WPCode_Admin_Page_Click';
	}

	/**
	 * Load the pages using their specific classes.
	 *
	 * @return void
	 */
	public function load_pages() {

		$this->prepare_pages();

		do_action( 'wpcode_before_admin_pages_loaded', $this->pages );

		foreach ( $this->pages as $slug => $page_class ) {
			if ( ! class_exists( $page_class ) ) {
				continue;
			}
			/**
			 * @var WPCode_Admin_Page $new_page
			 */
			$this->pages[ $slug ] = new $page_class();
			if ( $this->pages[ $slug ]->hide_menu ) {
				$this->hidden_pages[] = $this->pages[ $slug ]->page_slug;
			}
		}
	}

	/**
	 * Add the main menu item used for all the other admin pages.
	 *
	 * @return void
	 */
	public function add_main_menu_item() {
		$svg         = get_wpcode_icon( 'logo', 36, 34, '-10 -6 80 80' );
		$wpcode_icon = 'data:image/svg+xml;base64,' . base64_encode( $svg ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode

		add_menu_page(
			__( 'Code Snippets', 'insert-headers-and-footers' ),
			__( 'Code Snippets', 'insert-headers-and-footers' ),
			'wpcode_edit_snippets',
			'wpcode',
			array(
				$this,
				'admin_menu_page',
			),
			$wpcode_icon,
			'81.45687234432916'
		);
	}

	/**
	 * Handler for registering the admin menu & loading pages.
	 *
	 * @return void
	 */
	public function register_admin_menu() {
		if ( ! $this->is_headers_footers_mode() ) {
			$this->add_main_menu_item();
		}

		$this->load_pages();
	}

	/**
	 * Check if the site is in headers & footers only mode.
	 *
	 * @return mixed
	 */
	public function is_headers_footers_mode() {
		return wpcode()->settings->get_option( 'headers_footers_mode' );
	}

	/**
	 * Generic handler for the wpcode pages.
	 *
	 * @return void
	 */
	public function admin_menu_page() {
		do_action( 'wpcode_admin_page' );
	}

	/**
	 * Add a link to the code snippets list in the plugins list view.
	 *
	 * @param array $links The links specific to our plugin.
	 *
	 * @return array
	 */
	public function add_plugin_action_links( $links ) {
		$url  = add_query_arg(
			array(
				'page' => 'wpcode',
			),
			admin_url( 'admin.php' )
		);
		$text = esc_html__( 'Code Snippets', 'insert-headers-and-footers' );
		if ( wpcode()->settings->get_option( 'headers_footers_mode' ) ) {
			$url  = add_query_arg(
				array(
					'page' => 'wpcode-headers-footers',
				),
				admin_url( 'options-general.php' )
			);
			$text = esc_html__( 'Settings', 'insert-headers-and-footers' );
		}
		$custom = array();

		$custom['wpcodepro'] = sprintf(
			'<a href="%1$s" aria-label="%2$s" target="_blank" rel="noopener noreferrer" 
				style="color: #00a32a; font-weight: 700;" 
				onmouseover="this.style.color=\'#008a20\';" 
				onmouseout="this.style.color=\'#00a32a\';"
				>%3$s</a>',
			wpcode_utm_url(
				'https://wpcode.com/lite/',
				'all-plugins',
				'get-wpcode-pro'
			),
			esc_attr__( 'Upgrade to WPCode Pro', 'insert-headers-and-footers' ),
			esc_html__( 'Get WPCode Pro', 'insert-headers-and-footers' )
		);

		$custom['settings'] = sprintf(
			'<a href="%1$s">%2$s</a>',
			$url,
			$text
		);

		return array_merge( $custom, $links );
	}

	/**
	 * Hide menu items for pages that should be hidden.
	 * We're using the parent_file filter to improve compatibility with admin-menu-editor.
	 *
	 * @param string $parent_file The parent file.
	 *
	 * @return string
	 */
	public function hide_menus( $parent_file ) {

		foreach ( $this->hidden_pages as $page ) {
			remove_submenu_page( 'wpcode', $page );
		}

		return $parent_file;
	}


	/**
	 * Set the per page option for the snippets list screen.
	 *
	 * @param $status
	 * @param $option
	 * @param $value
	 *
	 * @return mixed
	 */
	public function screen_options_set( $status, $option, $value ) {

		if ( isset( $_POST['wpcode_screen_order_by'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			$order_by = sanitize_text_field( wp_unslash( $_POST['wpcode_screen_order_by'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
			update_user_option( get_current_user_id(), 'wpcode_snippets_order_by', $order_by );
		}

		if ( isset( $_POST['wpcode_screen_order'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
			$order_by = sanitize_text_field( wp_unslash( $_POST['wpcode_screen_order'] ) ); // phpcs:ignore WordPress.Security.NonceVerification
			update_user_option( get_current_user_id(), 'wpcode_snippets_order', $order_by );
		}

		if ( 'wpcode_snippets_per_page' === $option ) {
			return absint( $value );
		}

		return $status;
	}
}
includes/admin/admin-scripts.php000064400000010602151331545640012736 0ustar00<?php
/**
 * Load scripts for the admin area.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

add_action( 'admin_enqueue_scripts', 'wpcode_admin_scripts' );
add_filter( 'admin_body_class', 'wpcode_admin_body_class' );

/**
 * Load admin scripts here.
 *
 * @return void
 */
function wpcode_admin_scripts() {

	$current_screen = get_current_screen();

	if ( ! isset( $current_screen->id ) || false === strpos( $current_screen->id, 'wpcode' ) ) {
		return;
	}

	$admin_asset_file = WPCODE_PLUGIN_PATH . 'build/admin.asset.php';

	if ( ! file_exists( $admin_asset_file ) ) {
		return;
	}

	$asset = require $admin_asset_file;

	wp_enqueue_style( 'wpcode-admin-css', WPCODE_PLUGIN_URL . 'build/admin.css', null, $asset['version'] );

	wp_enqueue_script( 'wpcode-admin-js', WPCODE_PLUGIN_URL . 'build/admin.js', $asset['dependencies'], $asset['version'], true );

	wp_localize_script(
		'wpcode-admin-js',
		'wpcode',
		apply_filters(
			'wpcode_admin_js_data',
			array(
				'nonce'             => wp_create_nonce( 'wpcode_admin' ),
				'code_type_options' => wpcode()->execute->get_code_type_options(),
				'please_wait'       => __( 'Please wait.', 'insert-headers-and-footers' ),
				'ok'                => __( 'OK', 'insert-headers-and-footers' ),
				'purchased'         => __( 'Already Purchased?', 'insert-headers-and-footers' ),
				'upgrade_link'      => wpcode_utm_url( 'https://wpcode.com/docs/how-to-upgrade-your-wpcode-license/', 'upsell-alert', $current_screen->id ),
				'bonus'             => __( 'Bonus', 'insert-headers-and-footers' ),
				'price'             => __( '$50 off', 'insert-headers-and-footers' ),
				'regular_price'     => __( 'regular price, automatically applied at checkout.', 'insert-headers-and-footers' ),
				'wpcode_lite_users' => __( 'WPCode Lite users get', 'insert-headers-and-footers' ),
				'upgrade_button'    => __( 'Upgrade to PRO', 'insert-headers-and-footers' ),
				'testing_mode'      => array(
					'title'           => __( 'Testing Mode is a Premium Feature', 'insert-headers-and-footers' ),
					'text'            => __( 'Upgrade to PRO today and make changes to your snippets, Header & Footer scripts or Page Scripts without affecting your live site. You choose when and what to publish to your visitors.', 'insert-headers-and-footers' ),
					'button_text'     => __( 'Upgrade to PRO', 'insert-headers-and-footers' ),
					'link'            => wpcode_utm_url( 'https://wpcode.com/lite/', 'testing-mode', $current_screen->id ),
					'learn_more_text' => __( 'Learn more about Testing Mode', 'insert-headers-and-footers' ),
					'learn_more_link' => wpcode_utm_url( 'https://wpcode.com/docs/testing-mode/', 'testing-mode-learn-more', $current_screen->id ),
				),
				'multisite'         => false,
				'connect_url'       => wpcode()->library_auth->auth_url(),
			)
		)
	);

	// Dequeue debug bar console styles on WPCode pages.
	wp_dequeue_style( 'debug-bar-codemirror' );
	wp_dequeue_style( 'debug-bar-console' );
}

/**
 * Scripts needed outside the WPCode admin area (e.g. metabox).
 *
 * @param string $version The version of the scripts to load. Default is 'lite'.
 *
 * @return void
 */
function wpcode_admin_scripts_global( $version = 'lite' ) {

	// Load "globally" but still only on certain screens.
	$current_screen = get_current_screen();

	$dont_load = ! isset( $current_screen->base ) || 'post' !== $current_screen->base;

	// Allow other plugins to modify the screens where the global scripts are loaded.
	if ( apply_filters( 'wpcode_load_global_scripts', $dont_load ) ) {
		return;
	}

	$admin_asset_file = WPCODE_PLUGIN_PATH . "build/admin-global-{$version}.asset.php";

	if ( ! file_exists( $admin_asset_file ) ) {
		return;
	}

	$asset = require $admin_asset_file;

	wp_enqueue_style( 'wpcode-admin-global-css', WPCODE_PLUGIN_URL . "build/admin-global-{$version}.css", null, $asset['version'] );

	wp_enqueue_script( 'wpcode-admin-global-js', WPCODE_PLUGIN_URL . "build/admin-global-{$version}.js", $asset['dependencies'], $asset['version'], true );
}

/**
 * Add stable body class that doesn't change with the translation.
 *
 * @param string $classes The body classes.
 *
 * @return string
 */
function wpcode_admin_body_class( $classes ) {

	$page_parent = get_admin_page_parent();

	if ( 'wpcode' === $page_parent ) {
		$classes .= ' wpcode-admin-page';

		if ( ! empty( wpcode()->settings->get_option( 'dark_mode' ) ) ) {
			$classes .= ' wpcode-dark-mode';
		}
	}

	return $classes;
}
includes/admin/importers/class-wpcode-importer-code-snippets.php000064400000007535151331545640021216 0ustar00<?php
/**
 * Importer for Code Snippets.
 *
 * @package WPCode.
 */

/**
 * Class WPCode_Importer_Code_Snippets.
 */
class WPCode_Importer_Code_Snippets extends WPCode_Importer_Type {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	public $name = 'Code Snippets';

	/**
	 * Importer slug.
	 *
	 * @var string
	 */
	public $slug = 'code-snippets';

	/**
	 * Plugin path.
	 *
	 * @var string
	 */
	public $path = 'code-snippets/code-snippets.php';

	/**
	 * Get an array of snippets for this plugin.
	 *
	 * @return array
	 */
	public function get_snippets() {

		$snippets = array();

		if ( ! $this->is_active() ) {
			return $snippets;
		}

		if ( ! function_exists( '\Code_Snippets\get_snippets' ) ) {
			return $snippets;
		}

		$code_snippets = \Code_Snippets\get_snippets();

		foreach ( $code_snippets as $code_snippet ) {
			/**
			 * The Code Snippets Snippet object.
			 *
			 * @var \Code_Snippets\Snippet $code_snippet
			 */
			$snippets[ $code_snippet->id ] = $code_snippet->name;
		}

		return $snippets;

	}

	/**
	 * Import the snippet data.
	 *
	 * @return void
	 */
	public function import_snippet() {
		// Run a security check.
		check_ajax_referer( 'wpcode_admin' );

		if ( ! current_user_can( 'wpcode_edit_snippets' ) ) {
			wp_send_json_error();
		}

		if ( ! function_exists( '\Code_Snippets\get_snippets' ) ) {
			wp_send_json_error();
		}

		$id = isset( $_POST['snippet_id'] ) ? absint( $_POST['snippet_id'] ) : 0;

		// Grab a snippet from Code Snippets.
		$snippets = \Code_Snippets\get_snippets( array( $id ) );

		if ( empty( $snippets ) || empty( $snippets[0] ) ) {
			wp_send_json_error(
				array(
					'error' => true,
					'name'  => esc_html__( 'Unknown Snippet', 'insert-headers-and-footers' ),
					'msg'   => esc_html__( 'The snippet you are trying to import does not exist.', 'insert-headers-and-footers' ),
				)
			);
		}

		// If we got so far we have a snippet to process.
		$snippet = $snippets[0];

		// Create a new snippet from the snippet data array.
		$new_snippet = new WPCode_Snippet( $this->get_snippet_data( $snippet ) );

		$new_snippet->save();

		if ( ! empty( $new_snippet->get_id() ) ) {
			wp_send_json_success(
				array(
					'name' => $new_snippet->get_title(),
					'edit' => esc_url_raw(
						add_query_arg(
							array(
								'page'       => 'wpcode-snippet-manager',
								'snippet_id' => $new_snippet->get_id(),
							),
							admin_url( 'admin.php' )
						)
					),
				)
			);
		}
	}

	/**
	 * Convert a "Code Snippets" snippet to the format for a WPCode snippet.
	 *
	 * @param \Code_Snippets\Snippet $snippet The snippet object.
	 *
	 * @return array
	 */
	public function get_snippet_data( $snippet ) {

		$code_type   = $this->get_snippet_type( $snippet );
		$auto_insert = 1;
		switch ( $snippet->scope ) {
			case 'admin':
				$location = 'admin_only';
				break;
			case 'front-end':
				$location = 'frontend_only';
				break;
			default:
				$location = 'everywhere';
		}
		if ( 'php' !== $code_type ) {
			$location    = '';
			$auto_insert = 0;
		}

		return array(
			'code'        => wp_slash( $snippet->code ),
			'note'        => $snippet->desc,
			'title'       => $snippet->name,
			'tags'        => $snippet->tags,
			'code_type'   => $code_type,
			'priority'    => $snippet->priority,
			'location'    => $location,
			'auto_insert' => $auto_insert,
		);
	}

	/**
	 * Get the snippet type from the scope as the method in \Code_Snippets\Snippet is private.
	 *
	 * @param \Code_Snippets\Snippet $snippet The snippet to check the scope for.
	 *
	 * @return string
	 */
	public function get_snippet_type( $snippet ) {
		if ( ! isset( $snippet->scope ) ) {
			return 'php';
		}

		if ( '-css' === substr( $snippet->scope, - 4 ) ) {
			return 'css';
		}

		if ( '-js' === substr( $snippet->scope, - 3 ) ) {
			return 'js';
		}

		if ( 'content' === substr( $snippet->scope, - 7 ) ) {
			return 'universal';
		}

		return 'php';
	}
}
includes/admin/importers/class-wpcode-importer-woody.php000064400000006653151331545640017602 0ustar00<?php
/**
 * Importer for Woody.
 *
 * @package WPCode.
 */

/**
 * Class WPCode_Importer_Woody.
 */
class WPCode_Importer_Woody extends WPCode_Importer_Type {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	public $name = 'Woody Code Snippets';

	/**
	 * Importer slug.
	 *
	 * @var string
	 */
	public $slug = 'woody';

	/**
	 * Plugin path.
	 *
	 * @var string
	 */
	public $path = 'insert-php/insert_php.php';

	/**
	 * Get an array of snippets for this plugin.
	 *
	 * @return array
	 */
	public function get_snippets() {

		$snippets = array();

		if ( ! $this->is_active() ) {
			return $snippets;
		}

		$snippets_posts = get_posts(
			array(
				'post_type'      => 'wbcr-snippets',
				'posts_per_page' => - 1,
				'post_status'    => 'any',
			)
		);

		foreach ( $snippets_posts as $post ) {
			$snippets[ $post->ID ] = $post->post_title;
		}

		return $snippets;

	}

	/**
	 * Import the snippet data.
	 *
	 * @return void
	 */
	public function import_snippet() {
		// Run a security check.
		check_ajax_referer( 'wpcode_admin' );

		if ( ! current_user_can( 'wpcode_edit_snippets' ) ) {
			wp_send_json_error();
		}

		if ( ! class_exists( 'WINP_Helper' ) ) {
			wp_send_json_error();
		}

		$id = isset( $_POST['snippet_id'] ) ? absint( $_POST['snippet_id'] ) : 0;

		// Grab a snippet from Code Snippets.
		$snippet = get_post( $id );

		if ( null === $snippet ) {
			wp_send_json_error(
				array(
					'error' => true,
					'name'  => esc_html__( 'Unknown Snippet', 'insert-headers-and-footers' ),
					'msg'   => esc_html__( 'The snippet you are trying to import does not exist.', 'insert-headers-and-footers' ),
				)
			);
		}

		// If we got so far we have a snippet to process.

		// Create a new snippet from the snippet data array.
		$new_snippet = new WPCode_Snippet( $this->get_snippet_data( $snippet ) );

		$new_snippet->save();

		if ( ! empty( $new_snippet->get_id() ) ) {
			wp_send_json_success(
				array(
					'name' => $new_snippet->get_title(),
					'edit' => esc_url_raw(
						add_query_arg(
							array(
								'page'       => 'wpcode-snippet-manager',
								'snippet_id' => $new_snippet->get_id(),
							),
							admin_url( 'admin.php' )
						)
					),
				)
			);
		}
	}


	/**
	 * Convert a "Woody" snippet to the format for a WPCode snippet.
	 *
	 * @param WP_Post $snippet The snippet post.
	 *
	 * @return array
	 */
	public function get_snippet_data( $snippet ) {

		$snippet_location = WINP_Helper::getMetaOption( $snippet->ID, 'snippet_location', '' );
		$scope            = WINP_Helper::getMetaOption( $snippet->ID, 'snippet_scope', '' );
		$auto_insert      = in_array(
			$scope,
			array(
				'auto',
				'evrywhere',
			),
			true
		) ? 1 : 0;

		switch ( $snippet_location ) {
			case 'header':
				$location = 'site_wide_header';
				break;
			case 'footer':
				$location = 'site_wide_footer';
				break;
			default:
				$location = $snippet_location;
		}

		return array(
			'code'        => wp_slash( WINP_Helper::get_snippet_code( $snippet ) ),
			'note'        => WINP_Helper::getMetaOption( $snippet->ID, 'snippet_description', '' ),
			'title'       => $snippet->post_title,
			'tags'        => wp_get_post_terms( $snippet->ID, WINP_SNIPPETS_TAXONOMY, array( 'fields' => 'slugs' ) ),
			'code_type'   => WINP_Helper::get_snippet_type( $snippet->ID ),
			'priority'    => intval( WINP_Helper::getMetaOption( $snippet->ID, 'snippet_priority', '' ) ),
			'location'    => $location,
			'auto_insert' => $auto_insert,
		);
	}
}
includes/admin/importers/class-wpcode-importer-type.php000064400000003602151331545640017411 0ustar00<?php
/**
 * Abstract class for importing data from other plugins.
 *
 * @package WPCode
 */

/**
 * Abstract class WPCode_Importer_Type.
 */
abstract class WPCode_Importer_Type {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	public $name = '';
	/**
	 * The plugin slug.
	 *
	 * @var string
	 */
	public $slug = '';
	/**
	 * The plugin path.
	 *
	 * @var string
	 */
	public $path = '';

	/**
	 * Constructor.
	 */
	public function __construct() {
		add_action( "wp_ajax_wpcode_import_snippet_{$this->slug}", array( $this, 'import_snippet' ) );
	}

	/**
	 * Add to list of registered importers.
	 *
	 * @param array $importers List of supported importers.
	 *
	 * @return array
	 */
	public function register( $importers = array() ) {

		$importers[ $this->slug ] = array(
			'name'      => $this->name,
			'slug'      => $this->slug,
			'path'      => $this->path,
			'installed' => file_exists( trailingslashit( WP_PLUGIN_DIR ) . $this->path ),
			'active'    => $this->is_active(),
		);

		return $importers;
	}

	/**
	 * Get all the snippets for this plugin.
	 *
	 * @return array
	 */
	abstract public function get_snippets();

	/**
	 * Check if the plugin is active.
	 *
	 * @return bool
	 */
	public function is_active() {
		return is_plugin_active( $this->path );
	}

	/**
	 * After a snippet has been successfully imported we track it, so that in the
	 * future we can alert users if they try to import a snippet that has already
	 * been imported.
	 *
	 * @param int $source_id Imported plugin snippet ID.
	 * @param int $wpcode_id WPCode snippet ID.
	 */
	public function track_import( $source_id, $wpcode_id ) {

		$imported = get_option( 'wpcode_imported', array() );

		$imported[ $this->slug ][ $wpcode_id ] = $source_id;

		update_option( 'wpcode_imported', $imported, false );
	}

	/**
	 * Import a single snippet using AJAX.
	 *
	 * @return void
	 */
	abstract public function import_snippet();
}
includes/admin/importers/class-wpcode-importer-code-snippets-premium.php000064400000000746151331545640022667 0ustar00<?php
/**
 * Importer for Code Snippets Pro.
 *
 * @package WPCode.
 */

/**
 * Class WPCode_Importer_Code_Snippets_Pro.
 */
class WPCode_Importer_Code_Snippets_Pro extends WPCode_Importer_Code_Snippets {

	/**
	 * The plugin name.
	 *
	 * @var string
	 */
	public $name = 'Code Snippets Pro';

	/**
	 * Importer slug.
	 *
	 * @var string
	 */
	public $slug = 'code-snippets-pro';

	/**
	 * Plugin path.
	 *
	 * @var string
	 */
	public $path = 'code-snippets-pro/code-snippets.php';
}
includes/admin/class-wpcode-docs.php000064400000010046151331545640013475 0ustar00<?php
/**
 * Load docs data from the server and store it
 * in local file cache in the uplaods folder.
 *
 * @package WPCode
 */

/**
 * The class to load docs data from the server.
 */
class WPCode_Docs {

	/**
	 * The URL from which to grab docs.
	 *
	 * @var string
	 */
	public $url = 'https://cdn.wpcode.com/wp-content/docs.json';

	/**
	 * The categories.
	 *
	 * @var array
	 */
	private $categories;

	/**
	 * The docs data.
	 *
	 * @var array
	 */
	private $docs;

	/**
	 * Load docs data from cache or from the server.
	 *
	 * @return void
	 */
	public function load_docs_data() {
		$docs_data = wpcode()->file_cache->get( 'docs', DAY_IN_SECONDS );
		if ( false === $docs_data ) {
			$docs_data = $this->load_from_server();
			wpcode()->file_cache->set( 'docs', $docs_data );
		}

		$this->categories = isset( $docs_data['categories'] ) ? $docs_data['categories'] : array();
		$this->docs       = isset( $docs_data['docs'] ) ? $docs_data['docs'] : array();
	}

	/**
	 * Get the docs.
	 *
	 * @return array
	 */
	public function get_docs() {
		if ( ! isset( $this->docs ) ) {
			$this->load_docs_data();
		}

		return $this->docs;
	}

	/**
	 * Get the docs categories.
	 *
	 * @return array
	 */
	public function get_categories() {
		if ( ! isset( $this->categories ) ) {
			$this->load_docs_data();
		}

		return $this->categories;
	}

	/**
	 * Load the docs data from the server.
	 *
	 * @return array
	 */
	public function load_from_server() {
		$request = wp_remote_get( $this->url );

		if ( wp_remote_retrieve_response_code( $request ) > 299 ) {
			return array();
		}

		return json_decode( wp_remote_retrieve_body( $request ), true );
	}

	/**
	 * Go through all the docs and retrieve just those for this category.
	 *
	 * @param string $slug The category slug.
	 *
	 * @return array
	 */
	public function get_docs_for_category( $slug ) {
		$docs = $this->get_docs();

		ksort( $docs );
		$category_docs = array();
		// Until we drop PHP 5.2 support to use closure.
		foreach ( $docs as $doc ) {
			if ( ! in_array( $slug, $doc['categories'], true ) ) {
				continue;
			}
			$category_docs[] = $doc;
		}

		return $category_docs;
	}

	/**
	 * Output the docs categories markup.
	 *
	 * @return void
	 */
	public function get_categories_accordion() {
		?>
		<div id="wpcode-help-categories" style="transition: opacity 300ms ease-in 0s; opacity: 1;">
			<ul class="wpcode-help-categories-toggle">
				<?php
				$ci         = 0;
				$categories = $this->get_categories();
				foreach ( $categories as $slug => $category_title ) {
					$style = 0 === $ci ? 'display:block' : '';
					$class = 0 === $ci ? 'wpcode-help-category open' : 'wpcode-help-category';
					$ci ++;
					$docs = $this->get_docs_for_category( $slug );
					$i    = 0;
					?>
					<li class="<?php echo esc_attr( $class ); ?>">
						<header>
							<?php wpcode_icon( 'folder', 28, 22 ); ?>
							<span><?php echo esc_html( $category_title ); ?></span>
							<?php wpcode_icon( 'arrow', 10, 16 ); ?>
						</header>
						<ul class="wpcode-help-docs" style="<?php echo esc_attr( $style ); ?>">
							<?php
							foreach ( $docs as $doc ) {
								$i ++;
								?>
								<li>
									<?php wpcode_icon( 'file-text', 16, 16 ); ?>
									<a href="<?php echo esc_url( wpcode_utm_url( $doc['url'], 'help-overlay', 'view-doc', esc_attr( $doc['title'] ) ) ); ?>" rel="noopener noreferrer" target="_blank">
										<?php echo esc_html( $doc['title'] ); ?>
									</a>
								</li>
								<?php
								if ( 5 === $i && count( $docs ) > 5 ) {
									echo '<div style="display: none;">';
								}
							}
							if ( count( $docs ) > 5 ) {
								echo '</div>' // Hidden div for the rest of the elements.
								?>

								<button class="wpcode-button wpcode-button-secondary viewall" type="button">
									<?php
									printf(
									// Translators: Placeholder for the category name.
										esc_html__( 'View All %s Docs', 'insert-headers-and-footers' ),
										esc_html( $category_title )
									);
									?>
								</button>
							<?php } ?>
						</ul>
					</li>
				<?php } ?>
			</ul>
		</div>
		<?php
	}
}
includes/admin/class-wpcode-upgrade-welcome.php000064400000033227151331545640015633 0ustar00<?php
/**
 * Upgrade Welcome screen.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * This page is shown when the plugin is updated from IHAF to WPCode.
 */
class WPCode_Upgrade_Welcome {

	/**
	 * Hidden welcome page slug.
	 */
	const SLUG = 'wpcode-upgrade-welcome';

	/**
	 * Primary class constructor.
	 */
	public function __construct() {
		add_action( 'init', array( $this, 'hooks' ) );
	}

	/**
	 * Register the pages to be used for the Welcome screen.
	 */
	public function register() {
		add_dashboard_page(
			esc_html__( 'Welcome to WPCode', 'insert-headers-and-footers' ),
			esc_html__( 'Welcome to WPCode', 'insert-headers-and-footers' ),
			'wpcode_edit_snippets',
			self::SLUG,
			array( $this, 'output' )
		);
	}

	/**
	 * Register all WP hooks.
	 */
	public function hooks() {

		// If user is in admin ajax or doing cron, return.
		if ( wp_doing_ajax() || wp_doing_cron() ) {
			return;
		}

		// If user did not update (or can't update) the plugin don't show the screen.
		if ( ! current_user_can( 'update_plugins' ) ) {
			return;
		}

		add_action( 'admin_menu', array( $this, 'register' ) );
		add_filter( 'parent_file', array( $this, 'hide_menu' ), 1020 );
		add_action( 'admin_init', array( $this, 'redirect' ), 9999 );
		add_action( 'admin_body_class', array( $this, 'body_class' ) );
	}

	/**
	 * Remove the dashboard page from the admin menu.
	 * We're using the parent_file filter to improve compatibility with admin-menu-editor.
	 *
	 * @param string $parent_file The parent file.
	 *
	 * @return string
	 */
	public function hide_menu( $parent_file ) {

		remove_submenu_page( 'index.php', self::SLUG );

		return $parent_file;
	}

	/**
	 * Welcome screen redirect. Only redirect if the user was previously using IHAF 1.6.x.
	 */
	public function redirect() {

		$redirect = get_transient( 'wpcode_upgrade_redirect' );

		if ( false === $redirect ) {
			return;
		}

		// Only redirect once.
		delete_transient( 'wpcode_upgrade_redirect' );

		wp_safe_redirect( admin_url( 'index.php?page=' . self::SLUG ) );
		exit;
	}

	/**
	 * Add a body class for this page only.
	 *
	 * @param string $body_class The body class.
	 *
	 * @return string
	 */
	public function body_class( $body_class ) {
		$screen = get_current_screen();

		if ( ! empty( $screen->id ) && false !== strpos( $screen->id, self::SLUG ) ) {
			$body_class .= ' ' . self::SLUG;
		}

		return $body_class;
	}

	/**
	 * Output of the upgrade screen.
	 */
	public function output() {
		$settings_link   = add_query_arg(
			array(
				'page' => 'wpcode-settings',
			),
			admin_url( 'admin.php' )
		);
		$snippets_page   = add_query_arg(
			array(
				'page' => 'wpcode',
			),
			admin_url( 'admin.php' )
		);
		$image_generator = WPCODE_PLUGIN_URL . 'admin/images/upgrade-welcome-generator.jpg';
		$image_settings  = WPCODE_PLUGIN_URL . 'admin/images/upgrade-welcome-headers-footers.jpg';
		$image_cloud     = WPCODE_PLUGIN_URL . 'admin/images/upgrade-welcome-cloud.jpg';
		$features        = array(
			array(
				'icon'  => 'code',
				'title' => __( 'Header & Footer Scripts', 'insert-headers-and-footers' ),
				'desc'  => __( 'Effortlessly manage global headers & footers in a familiar interface.', 'insert-headers-and-footers' ),
			),
			array(
				'icon'  => 'filter',
				'title' => __( 'Conversion Pixels', 'insert-headers-and-footers' ),
				'desc'  => __( 'Easily target specific pages to track conversions reliably.', 'insert-headers-and-footers' ),
			),
			array(
				'icon'  => 'php',
				'title' => __( 'PHP Snippets', 'insert-headers-and-footers' ),
				'desc'  => __( 'Add or remove features with full confidence that your site will not break.', 'insert-headers-and-footers' ),
			),
			array(
				'icon'  => 'split',
				'title' => __( 'Conditional Logic', 'insert-headers-and-footers' ),
				'desc'  => __( 'Create advanced conditional logic rules in an easy-to-use interface.', 'insert-headers-and-footers' ),
			),
			array(
				'icon'  => 'error_badge',
				'title' => __( 'Error Handling', 'insert-headers-and-footers' ),
				'desc'  => __( 'Unique error handling capabilities ensure you will not get locked out of your site.', 'insert-headers-and-footers' ),
			),
			array(
				'icon'  => 'terminal',
				'title' => __( 'Snippets Library', 'insert-headers-and-footers' ),
				'desc'  => __( 'One-click install from our extensive library of commonly-used snippets.', 'insert-headers-and-footers' ),
			),
		);
		$logo_src        = WPCODE_PLUGIN_URL . 'admin/images/wpcode-logo.png';
		// Translators: This simply adds the plugin name before the logo text.
		$logo_alt     = sprintf( __( '%s logo', 'insert-headers-and-footers' ), 'WPCode' );
		$syed_photo   = WPCODE_PLUGIN_URL . 'admin/images/syed.png';
		$mircea_photo = WPCODE_PLUGIN_URL . 'admin/images/mircea.png';
		?>
		<div class="wpcode-welcome-content">
			<div class="wpcode-welcome-logo">
				<img src="<?php echo esc_url( $logo_src ); ?>" width="132" alt="<?php echo esc_attr( $logo_alt ); // phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage?>"/>
			</div>
			<div class="wpcode-welcome-box">
				<h2><?php esc_html_e( 'Insert Headers and Footers is now WPCode', 'insert-headers-and-footers' ); ?></h2>
				<p><?php esc_html_e( 'When we first built Insert Headers and Footers over a decade ago, it was meant to do one very simple thing: add header and footer scripts to your site without editing theme files.', 'insert-headers-and-footers' ); ?></p>
				<p><?php esc_html_e( 'Since then, the plugin has grown to over 1 million active installs with an amazing user base. We have continued to receive feature requests to add more options like controlling which pages the scripts get loaded, allowing more types of code snippets, etc.', 'insert-headers-and-footers' ); ?></p>
				<p><?php esc_html_e( 'We listened to your feedback, and we are excited to present WPCode, the next generation of Insert Headers and Footers. We chose a new name because it was only fair considering the plugin is now 10x more powerful. Aside from adding global headers and footer snippets, you can also add multiple other types of code snippets, have granular control of where the snippets are output with conditional logic, and a whole lot more.', 'insert-headers-and-footers' ); ?></p>
				<p>
					<?php
					printf(
					// Translators: Placeholders 1 & 2 add a link to scroll down the page and 3 & 4 add a link to the suggestions form.
						esc_html__(
							'Please see the full list of features %1$sbelow%2$s and let us know what you\'d like us to add next by %3$ssharing your feedback%4$s.',
							'insert-headers-and-footers'
						),
						'<a href="#features" class="wpcode-scroll-to">',
						'</a>',
						'<a href="' . esc_url( wpcode_utm_url( 'https://wpcode.com/suggestions/', 'welcome', 'intro' ) ) . '" target="_blank">',
						'</a>'
					);
					?>
				</p>
				<p>
					<?php
					printf(
					// Translators: Placeholders add link to the details about settings.
						esc_html__(
							'For those of you who want to limit the functionality and switch back to the old interface, you can do so with one click. %1$sSee details here%2$s.',
							'insert-headers-and-footers'
						),
						'<a href="#old_interface" class="wpcode-scroll-to">',
						'</a>'
					);
					?>
				</p>
				<p><?php esc_html_e( 'We have an exciting roadmap ahead of us since you have shared tons of great ideas with us over the last several years. We truly appreciate your continued support and thank you for being an awesome user.', 'insert-headers-and-footers' ); ?></p>
				<p><?php esc_html_e( 'We truly appreciate your continued support and thank you for using WPCode.', 'insert-headers-and-footers' ); ?></p>
				<div class="wpcode-welcome-syed-mircea">
					<div class="wpcode-welcome-person">
						<div class="wpcode-welcome-person-image">
							<img src="<?php echo esc_attr( $syed_photo ); // phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage ?>" alt="Syed" width="48"/>
						</div>
						<div class="wpcode-welcome-person-text">
							<h4>Syed Balkhi</h4>
							<?php
							printf(
							// Translators: Placeholder for "WPBeginner".
								esc_html__( 'Founder of %s', 'insert-headers-and-footers' ),
								'WPBeginner'
							);
							?>
						</div>
					</div>
					<div class="wpcode-welcome-person">
						<div class="wpcode-welcome-person-image">
							<img src="<?php echo esc_attr( $mircea_photo ); // phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage ?>" alt="Mircea" width="48"/>
						</div>
						<div class="wpcode-welcome-person-text">
							<h4>Mircea Sandu</h4>
							<?php esc_html_e( 'Lead Developer', 'insert-headers-and-footers' ); ?>
						</div>
					</div>
				</div>
			</div>
			<div class="wpcode-welcome-box" id="features">
				<h2><?php esc_html_e( 'What’s New in WPCode (Features & Highlights)', 'insert-headers-and-footers' ); ?></h2>
				<div class="wpcode-welcome-features">
					<?php foreach ( $features as $feature ) { ?>
						<div class="wpcode-welcome-feature">
							<div class="wpcode-welcome-feature-icon">
								<div class="wpcode-welcome-feature-icon-icon">
									<?php wpcode_icon( $feature['icon'], 30, 30, '0 0 48 48' ); ?>
								</div>
							</div>
							<div class="wpcode-welcome-feature-text">
								<h3><?php echo esc_html( $feature['title'] ); ?></h3>
								<p><?php echo esc_html( $feature['desc'] ); ?></p>
							</div>
						</div>
					<?php } ?>
				</div>
			</div>
			<div class="wpcode-welcome-box">
				<div class="wpcode-welcome-highlight">
					<div class="wpcode-welcome-highlight-column">
						<img src="<?php echo esc_url( $image_generator ); // phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage?>" alt="<?php esc_attr_e( 'WPCode Generator Screen capture', 'insert-headers-and-footers' ); ?>"/>
					</div>
					<div class="wpcode-welcome-highlight-column">
						<h3><?php esc_html_e( 'Snippet Generator', 'insert-headers-and-footers' ); ?></h3>
						<p><?php esc_html_e( 'WPCode now includes a snippet generator directly in the plugin.', 'insert-headers-and-footers' ); ?></p>
						<p><?php esc_html_e( 'Using the built-in generators, you can quickly add custom post types, custom post statuses, widgets, menus, build complex WP Queries and much more.', 'insert-headers-and-footers' ); ?></p>
						<p><?php esc_html_e( 'Simply fill in the fields in our guided wizard to generate a custom ready-to-use snippet for your website with 1 click. Try WordPress Snippet Generator.', 'insert-headers-and-footers' ); ?></p>
					</div>
				</div>
			</div>
			<div class="wpcode-welcome-box">
				<div class="wpcode-welcome-highlight">
					<div class="wpcode-welcome-highlight-column">
						<h3><?php esc_html_e( 'Store Snippets in Cloud', 'insert-headers-and-footers' ); ?></h3>
						<p><?php esc_html_e( 'A lot of you requested the ability to save and re-use snippets on multiple websites.', 'insert-headers-and-footers' ); ?></p>
						<p>
							<?php
							printf(
							// Translators: Placeholders add a link to the suggestions page.
								esc_html__(
									'This feature is now available in the %1$sPRO version of the plugin%2$s along with other powerful features.',
									'insert-headers-and-footers'
								),
								'<a href="' . esc_url( wpcode_utm_url( 'https://wpcode.com/lite/', 'upgrade-welcome', 'cloud-snippets' ) ) . '" target="_blank">',
								'</a>'
							);
							?>
						</p>
						<p>
							<?php
							printf(
							// Translators: Placeholders add a link to the suggestions page.
								esc_html__(
									'If you have specific ideas or feature requests, please let us know by %1$sfilling out this form%2$s.',
									'insert-headers-and-footers'
								),
								'<a href="' . esc_url( wpcode_utm_url( 'https://wpcode.com/suggestions/', 'welcome', 'cloud' ) ) . '" target="_blank">',
								'</a>'
							);
							?>
						</p>
					</div>
					<div class="wpcode-welcome-highlight-column">
						<img src="<?php echo esc_url( $image_cloud ); // phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage?>" alt="<?php esc_attr_e( 'WPCode Cloud Screen capture', 'insert-headers-and-footers' ); ?>"/>
					</div>
				</div>
			</div>
			<div class="wpcode-welcome-box">
				<div class="wpcode-welcome-highlight" id="old_interface">
					<div class="wpcode-welcome-highlight-column">
						<img src="<?php echo esc_url( $image_settings ); // phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage?>" alt="<?php esc_attr_e( 'WPCode Generator Screen capture', 'insert-headers-and-footers' ); ?>"/>
					</div>
					<div class="wpcode-welcome-highlight-column">
						<h3><?php esc_html_e( 'Not ready for the new interface?', 'insert-headers-and-footers' ); ?></h3>
						<p><?php esc_html_e( 'If you are not ready to switch to the new interface, or you simply want to use the plugin just for inserting headers and footers we\'ve got you covered.', 'insert-headers-and-footers' ); ?></p>
						<p>
							<?php
							printf(
							// Translators: Placeholders add a link to the settings page.
								esc_html__(
									'You can switch to the simple Headers & Footers interface at any time from the %1$ssettings page%2$s.',
									'insert-headers-and-footers'
								),
								'<a href="' . esc_url( $settings_link ) . '">',
								'</a>'
							);
							?>
						</p>
						<p><?php esc_html_e( 'And if you change your mind later and want to give the full plugin a shot, you can always switch back with just 2 clicks using the option at the top of the page.', 'insert-headers-and-footers' ); ?></p>
					</div>
				</div>
			</div>
			<div class="wpcode-buttons-row">
				<a href="<?php echo esc_url( $snippets_page ); ?>" class="wpcode-button wpcode-button-large"><?php esc_html_e( 'Add Your First Snippet', 'insert-headers-and-footers' ); ?></a>
			</div>
		</div>
		<?php
	}
}

new WPCode_Upgrade_Welcome();
includes/admin/class-wpcode-usage-tracking.php000064400000016641151331545640015460 0ustar00<?php
/**
 * Class WPCode_Usage_Tracking - The abstract class for the usage tracking.
 *
 * @package WPCode
 */

/**
 * The abstract class for the usage tracking.
 */
abstract class WPCode_Usage_Tracking {
	/**
	 * Returns the current plugin version type ("lite" or "pro").
	 *
	 * @return string The version type.
	 * @since 2.0.10
	 */
	abstract public function get_type();

	/**
	 * Is the usage tracking enabled?
	 *
	 * @return bool
	 * @since 2.0.10
	 */
	abstract public function is_enabled();

	/**
	 * Usage Tracking endpoint.
	 *
	 * @since 2.0.10
	 *
	 * @var string
	 */
	private $url = 'https://wpcodeusage.com/v1/track';

	/**
	 * Option name to store the timestamp of the last run.
	 *
	 * @since 2.0.10
	 */
	const LAST_RUN = 'wpcode_send_usage_last_run';

	/**
	 * Class Constructor.
	 *
	 * @since 2.0.10
	 */
	public function __construct() {
		add_action( 'init', array( $this, 'init' ), 2 );
		add_action( 'wpcode_usage_tracking_cron', array( $this, 'process' ) );
		add_action( 'wpcode_library_api_auth_connected', array( $this, 'usage_tracking_auth' ) );
	}

	/**
	 * Initiate the usage tracking cron.
	 *
	 * @return void
	 * @since 2.0.10
	 */
	public function init() {
		if ( ! wp_next_scheduled( 'wpcode_usage_tracking_cron' ) ) {
			$tracking             = array();
			$tracking['day']      = wp_rand( 0, 6 );
			$tracking['hour']     = wp_rand( 0, 23 );
			$tracking['minute']   = wp_rand( 0, 59 );
			$tracking['second']   = wp_rand( 0, 59 );
			$tracking['offset']   = ( $tracking['day'] * DAY_IN_SECONDS ) + ( $tracking['hour'] * HOUR_IN_SECONDS ) + ( $tracking['minute'] * MINUTE_IN_SECONDS ) + $tracking['second'];
			$tracking['initsend'] = strtotime( 'next sunday' ) + $tracking['offset'];

			wp_schedule_event( $tracking['initsend'], 'weekly', 'wpcode_usage_tracking_cron' );
			update_option( 'wpcode_usage_tracking_config', $tracking, false );
		}
	}

	/**
	 * Processes the usage tracking.
	 *
	 * @return void
	 * @since 2.0.10
	 */
	public function process() {
		if ( ! $this->is_enabled() ) {
			return;
		}

		$last_run = get_option( self::LAST_RUN );

		// Make sure we do not run it more than once a day.
		if ( false !== $last_run && ( time() - $last_run ) < DAY_IN_SECONDS ) {
			return;
		}

		wp_remote_post(
			$this->get_url(),
			array(
				'timeout'    => 10,
				'headers'    => array(
					'Content-Type' => 'application/json; charset=utf-8',
				),
				'user-agent' => $this->get_user_agent(),
				'body'       => wp_json_encode( $this->get_data() ),
			)
		);

		// If we have completed successfully, recheck in 1 week.
		update_option( self::LAST_RUN, time() );
	}

	/**
	 * Gets the URL for the notifications api.
	 *
	 * @return string The URL to use for the api requests.
	 * @since 2.0.10
	 */
	private function get_url() {
		if ( defined( 'WPCODE_USAGE_TRACKING_URL' ) ) {
			return WPCODE_USAGE_TRACKING_URL;
		}

		return $this->url;
	}

	/**
	 * Rtrieve the data to send to the usage tracking api.
	 *
	 * @return array
	 * @since 2.0.10
	 */
	public function get_data() {
		global $wpdb;

		$theme_data     = wp_get_theme();
		$activated      = get_option( 'ihaf_activated', array() );
		$installed_date = isset( $activated['wpcode'] ) ? $activated['wpcode'] : null;

		$data = array(
			// Generic data (environment).
			'url'                        => home_url(),
			'php_version'                => PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION,
			'wp_version'                 => get_bloginfo( 'version' ),
			'mysql_version'              => $wpdb->db_version(),
			'server_version'             => isset( $_SERVER['SERVER_SOFTWARE'] ) ? sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ) : '',
			'is_ssl'                     => is_ssl(),
			'is_multisite'               => is_multisite(),
			'sites_count'                => function_exists( 'get_blog_count' ) ? (int) get_blog_count() : 1,
			'active_plugins'             => $this->get_active_plugins(),
			'theme_name'                 => $theme_data->name,
			'theme_version'              => $theme_data->version,
			'user_count'                 => function_exists( 'get_user_count' ) ? get_user_count() : null,
			'locale'                     => get_locale(),
			'timezone_offset'            => wpcode_wp_timezone_string(),
			// WPCode specific data.
			'wpcode_version'             => WPCODE_VERSION,
			'wpcode_license_key'         => null,
			'wpcode_license_type'        => null,
			'wpcode_is_pro'              => false,
			'wpcode_lite_installed_date' => $installed_date,
			'wpcode_settings'            => $this->get_settings(),
		);

		// Add snippets data.
		$data = array_merge( $data, $this->get_snippets_data() );

		return $data;
	}

	/**
	 * Return a list of active plugins.
	 *
	 * @return array An array of active plugin data.
	 * @since 2.0.10
	 */
	private function get_active_plugins() {
		if ( ! function_exists( 'get_plugins' ) ) {
			include ABSPATH . '/wp-admin/includes/plugin.php';
		}
		$active  = get_option( 'active_plugins', array() );
		$plugins = array_intersect_key( get_plugins(), array_flip( $active ) );

		return array_map(
			static function ( $plugin ) {
				if ( isset( $plugin['Version'] ) ) {
					return $plugin['Version'];
				}

				return 'Not Set';
			},
			$plugins
		);
	}

	/**
	 * Get the User Agent string that will be sent to the API.
	 *
	 * @return string
	 * @since 2.0.10
	 */
	public function get_user_agent() {
		return 'WPCode/' . WPCODE_VERSION . '; ' . get_bloginfo( 'url' );
	}

	/**
	 * Get the WPCode settings but anonymize some data.
	 *
	 * @return array
	 */
	public function get_settings() {
		$settings = wpcode()->settings->get_options();

		// By default, don't send the API tokens.
		$settings_to_ignore = apply_filters(
			'wpcode_usage_tracking_excluded_settings',
			array(
				'facebook_pixel_api_token',
				'pinterest_conversion_token',
				'tiktok_access_token',
			)
		);

		foreach ( $settings_to_ignore as $setting ) {
			if ( isset( $settings[ $setting ] ) ) {
				$settings[ $setting ] = '***';
			}
		}

		return $settings;
	}

	/**
	 * After the user has successfully authenticated with the API, we can start sending data.
	 *
	 * @return void
	 */
	public function usage_tracking_auth() {
		// If already enabled, don't do anything.
		if ( $this->is_enabled() ) {
			return;
		}
		wpcode()->settings->update_option( 'usage_tracking', true );
	}

	/**
	 * Track snippet-specific data.
	 *
	 * @return array
	 */
	public function get_snippets_data() {
		$counts        = wp_count_posts( 'wpcode' );
		$snippets_data = array(
			'wpcode_total_snippets'     => array_sum( array( $counts->publish, $counts->draft ) ),
			'wpcode_active_snippets'    => $counts->publish,
			'wpcode_trashed_snippets'   => $counts->trash,
			'wpcode_generated_snippets' => 0,
			'wpcode_generators'         => array(),
		);

		if ( empty( $snippets_data['wpcode_total_snippets'] ) ) {
			// If there are no snippets to look at then we can return early.
			return $snippets_data;
		}
		// Let's see how many snippets were generated with a WPCode Generator.
		$generated_snippets = get_posts(
			array(
				'post_type' => 'wpcode',
				'meta_key'  => '_wpcode_generator', // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
				'fields'    => 'ids',
			)
		);

		if ( ! empty( $generated_snippets ) ) {
			$snippets_data['wpcode_generated_snippets'] = count( $generated_snippets );
			foreach ( $generated_snippets as $snippet_id ) {
				$snippets_data['wpcode_generators'][] = get_post_meta( $snippet_id, '_wpcode_generator', true );
			}
		}

		return $snippets_data;
	}
}
includes/admin/class-wpcode-suggested-plugins.php000064400000030652151331545640016223 0ustar00<?php
/**
 * Suggest other relevant free plugins to our users.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Class WPCode_Suggested_Plugins
 */
class WPCode_Suggested_Plugins {

	/**
	 * WPCode_Suggested_Plugins constructor.
	 */
	public function __construct() {
		$this->hooks();
	}

	/**
	 * Hooks for the class.
	 */
	public function hooks() {
		add_action( 'wp_ajax_wpcode_install_plugin', array( $this, 'install_plugin' ) );
		// Maybe suggest plugins to the current user.
		add_action( 'admin_init', array( $this, 'maybe_suggest_plugins' ) );
	}

	/**
	 * Get all plugins that we suggest.
	 *
	 * @return array
	 */
	public static function all_plugins() {
		$plugins = array(
			'duplicator'             => array(
				'name'        => 'Duplicator',
				'description' => esc_html__( 'Easy, Fast and Secure WordPress and Website Migration.', 'insert-headers-and-footers' ),
				'url'         => 'https://downloads.wordpress.org/plugin/duplicator.zip',
				'slug'        => 'duplicator/duplicator.php',
				'pro_slug'    => 'duplicator-pro/duplicator-pro.php',
				'icon'        => 'icon-duplicator.png',
				'suggested'   => true,
				'library'     => false,
			),
			'search-replace-wpcode'  => array(
				'name'        => 'Search & Replace Everything',
				'description' => esc_html__( 'Replace text across your database or media uploads in a single plugin.', 'insert-headers-and-footers' ),
				'url'         => 'https://downloads.wordpress.org/plugin/search-replace-wpcode.zip',
				'slug'        => 'search-replace-wpcode/wsrw.php',
				'pro_slug'    => 'search-replace-wpcode-pro/wsrw-premium.php',
				'icon'        => 'icon-search-replace-wpcode.png',
				'suggested'   => true,
				'library'     => false,
			),
			'wp-mail-smtp'           => array(
				'name'        => 'WP Mail SMTP',
				'description' => esc_html__( 'Making Email Deliverability Easy for WordPress', 'insert-headers-and-footers' ),
				'url'         => 'https://downloads.wordpress.org/plugin/wp-mail-smtp.zip',
				'slug'        => 'wp-mail-smtp/wp_mail_smtp.php',
				'pro_slug'    => 'wp-mail-smtp-pro/wp_mail_smtp_pro.php',
				'icon'        => 'icon-wp-mail-smtp.png',
				'suggested'   => true,
				'library'     => false,
			),
			'all-in-one-seo-pack'    => array(
				'name'        => 'All in One SEO Pack',
				'description' => esc_html__( 'Powerful SEO Plugin to Boost SEO Rankings & Increase Traffic.', 'insert-headers-and-footers' ),
				'url'         => 'https://downloads.wordpress.org/plugin/all-in-one-seo-pack.zip',
				'slug'        => 'all-in-one-seo-pack/all_in_one_seo_pack.php',
				'pro_slug'    => 'all-in-one-seo-pack-pro/all_in_one_seo_pack.php',
				'icon'        => 'icon-all-in-one-seo-pack.png',
				'suggested'   => true,
				'library'     => true,
			),
			'wpforms'                => array(
				'name'        => 'WPForms',
				'description' => esc_html__( 'The Best Drag & Drop WordPress Form Builder.', 'insert-headers-and-footers' ),
				'url'         => 'https://downloads.wordpress.org/plugin/wpforms-lite.zip',
				'slug'        => 'wpforms-lite/wpforms.php',
				'pro_slug'    => 'wpforms/wpforms.php',
				'icon'        => 'icon-wpforms.png',
				'suggested'   => true,
				'library'     => true,
			),
			'uncanny-automator'      => array(
				'name'        => 'Uncanny Automator',
				'description' => esc_html__( 'Connect your WordPress plugins together and create automated workflows.', 'insert-headers-and-footers' ),
				'url'         => 'https://downloads.wordpress.org/plugin/uncanny-automator.zip',
				'slug'        => 'uncanny-automator/uncanny-automator.php',
				'pro_slug'    => 'uncanny-automator-pro/uncanny-automator-pro.php',
				'icon'        => 'icon-uncanny-automator.png',
				'suggested'   => true,
				'library'     => false,
			),
			'easy-digital-downloads' => array(
				'name'        => 'Easy Digital Downloads',
				'description' => esc_html__( 'The easiest way to sell digital products with WordPress.', 'insert-headers-and-footers' ),
				'url'         => 'https://downloads.wordpress.org/plugin/easy-digital-downloads.zip',
				'slug'        => 'easy-digital-downloads/easy-digital-downloads.php',
				'pro_slug'    => 'easy-digital-downloads-pro/easy-digital-downloads.php',
				'icon'        => 'icon-edd.png',
				'suggested'   => false,
				'library'     => true,
			),
			'charitable'             => array(
				'name'        => 'Charitable',
				'description' => esc_html__( 'Raise more money for your cause with the most powerful WordPress donation and fundraising plugin.', 'insert-headers-and-footers' ),
				'url'         => 'https://downloads.wordpress.org/plugin/charitable.zip',
				'slug'        => 'charitable/charitable.php',
				'pro_slug'    => 'charitable/charitable.php',
				'icon'        => 'icon-charitable.jpg',
				'suggested'   => false,
				'library'     => true,
			),
			'wp-simple-pay'          => array(
				'name'        => 'WP Simple Pay',
				'description' => esc_html__( 'Start accepting one-time and recurring payments on your WordPress site without setting up a shopping cart.', 'insert-headers-and-footers' ),
				'url'         => 'https://downloads.wordpress.org/plugin/stripe.zip',
				'slug'        => 'stripe/stripe-checkout.php',
				'pro_slug'    => 'wp-simple-pay-pro-3/simple-pay.php',
				'icon'        => 'icon-wp-simple-pay.png',
				'suggested'   => false,
				'library'     => true,
			),
		);

		return $plugins;
	}

	/**
	 * Get a list of plugins to suggest.
	 *
	 * @param int $count How many plugins to suggest.
	 *
	 * @return array
	 */
	public function get_suggested_plugins( $count = 3 ) {
		$plugins = self::all_plugins();

		// Let's loop through all the plugins and see which are installed already and only suggest the ones that are not. We should check for the pro version for each one.
		$suggested_plugins = array();
		foreach ( $plugins as $slug => $plugin ) {
			if ( $count <= count( $suggested_plugins ) ) {
				break;
			}
			if ( ! $plugin['suggested'] ) {
				continue;
			}

			if ( ! $this->is_plugin_installed( $plugin['slug'] ) && ! $this->is_plugin_installed( $plugin['pro_slug'] ) ) {
				$suggested_plugins[ $slug ] = $plugin;
			}
		}

		return $suggested_plugins;
	}

	/**
	 * Get a list of plugins that have a library integration so we can show them in the plugin snippets page.
	 *
	 * @return array
	 */
	public static function get_library_plugins() {
		$plugins = self::all_plugins();

		// Filter out just the plugins that have "library" true.
		return array_filter(
			$plugins,
			function ( $plugin ) {
				return $plugin['library'];
			}
		);
	}

	/**
	 * Check if a plugin is installed.
	 *
	 * @param string $slug The plugin slug.
	 *
	 * @return bool
	 */
	public function is_plugin_installed( $slug ) {
		$installed_plugins = array_keys( get_plugins() );

		return in_array( $slug, $installed_plugins, true );
	}

	/**
	 * AJAX callback to install a plugin.
	 *
	 * @return void
	 */
	public function install_plugin() {
		check_ajax_referer( 'wpcode_admin' );

		// If the current user can't install plugins they should not be trying this.
		if ( ! current_user_can( 'install_plugins' ) ) {
			wp_send_json_error();
		}

		require_once ABSPATH . 'wp-admin/includes/file.php';
		require_once ABSPATH . 'wp-admin/includes/template.php';
		require_once ABSPATH . 'wp-admin/includes/class-wp-screen.php';
		require_once ABSPATH . 'wp-admin/includes/screen.php';

		$allowed_plugins = self::all_plugins();
		$slug            = isset( $_POST['slug'] ) ? sanitize_text_field( wp_unslash( $_POST['slug'] ) ) : '';

		if ( ! array_key_exists( $slug, $allowed_plugins ) ) {
			wp_send_json_error();
		}

		$plugin_info = $allowed_plugins[ $slug ];

		// Set the current screen to avoid undefined notices.
		set_current_screen( 'toplevel_page_wpcode' );
		// Do not allow WordPress to search/download translations, as this will break JS output.
		remove_action( 'upgrader_process_complete', array( 'Language_Pack_Upgrader', 'async_upgrade' ), 20 );

		// Let's check if the plugin is already installed.
		if ( is_plugin_active( $plugin_info['slug'] ) ) {
			wp_send_json_success(
				array(
					'msg' => esc_html__( 'Plugin already installed and activated.', 'insert-headers-and-footers' ),
				)
			);
		}

		// Check if the Pro plugin is available first.
		if ( $this->is_plugin_installed( $plugin_info['pro_slug'] ) ) {
			activate_plugin( $plugin_info['pro_slug'] );
			wp_send_json_success(
				array(
					'msg' => esc_html__( 'Plugin activated.', 'insert-headers-and-footers' ),
				)
			);
		}

		if ( $this->is_plugin_installed( $plugin_info['slug'] ) ) {
			activate_plugin( $plugin_info['slug'] );
			wp_send_json_success(
				array(
					'msg' => esc_html__( 'Plugin activated.', 'insert-headers-and-footers' ),
				)
			);
		}

		wpcode_require_upgrader();

		// Create the plugin upgrader with our custom skin.
		$installer = new Plugin_Upgrader( new WPCode_Skin() );

		$installer->install( $allowed_plugins[ $slug ]['url'] );

		// Flush the cache and return the newly installed plugin basename.
		wp_cache_flush();

		$plugin_basename = $installer->plugin_info();
		if ( ! $plugin_basename ) {
			wp_send_json_error();
		}

		// Activate the plugin silently.
		$activated = activate_plugin( $plugin_basename );

		if ( is_wp_error( $activated ) ) {
			wp_send_json_error();
		}

		wp_send_json_success(
			array(
				'message' => esc_html__( 'Plugin installed and activated.', 'insert-headers-and-footers' ),
			)
		);
	}

	/**
	 * Maybe suggest plugins to the current user.
	 */
	public function maybe_suggest_plugins() {
		if ( ! is_super_admin() || ! current_user_can( 'install_plugins' ) ) {
			return;
		}

		// Verify that we can do a check to suggest plugins.
		$notices = get_option( 'wpcode_admin_notices', array() );
		$time    = time();
		$load    = false;

		if ( empty( $notices['suggest_plugins'] ) ) {
			$notices['suggest_plugins'] = array(
				'time'      => $time,
				'dismissed' => false,
			);

			update_option( 'wpcode_admin_notices', $notices );

			return;
		}

		// Check if it has been dismissed or not.
		if (
			( isset( $notices['suggest_plugins']['dismissed'] ) &&
			  ! $notices['suggest_plugins']['dismissed'] ) &&
			(
				isset( $notices['suggest_plugins']['time'] ) &&
				( ( $notices['suggest_plugins']['time'] + DAY_IN_SECONDS ) <= $time )
			)
		) {
			$load = true;
		}

		// If we cannot load, return early.
		if ( ! $load ) {
			return;
		}

		add_action( 'admin_head', array( $this, 'suggest_plugins' ) );
	}

	/**
	 * Suggest plugins to the current user.
	 */
	public function suggest_plugins() {
		// Let's make sure we are on a wpcode screen using get_current_screen.
		$screen = get_current_screen();

		if ( ! $screen || 'toplevel_page_wpcode' !== $screen->id ) {
			return;
		}
		// Fetch when plugin was initially installed.
		$activated = get_option( 'ihaf_activated', array() );

		if ( ! empty( $activated['wpcode'] ) ) {
			// Only continue if plugin has been installed for at least 21 days.
			if ( ( $activated['wpcode'] + ( DAY_IN_SECONDS * 21 ) ) > time() ) {
				return;
			}
		} else {
			$activated['wpcode'] = time();

			update_option( 'ihaf_activated', $activated );

			return;
		}

		$suggested_plugins = $this->get_suggested_plugins();

		if ( empty( $suggested_plugins ) ) {
			return;
		}

		ob_start();
		?>
		<p class="wpcode-suggestions-title"><?php esc_html_e( 'Enjoying WPCode? Check out some of our other top-rated FREE plugins:', 'insert-headers-and-footers' ); ?></p>
		<div class="wpcode-plugin-suggestions">
			<?php foreach ( $suggested_plugins as $slug => $plugin ) { ?>
				<div class="wpcode-plugin-suggestion-plugin">
					<div class="wpcode-plugin-suggestion-plugin-icon">
						<img width="72" src="<?php echo esc_url( add_query_arg( 'v', WPCODE_VERSION, WPCODE_PLUGIN_URL . 'admin/images/' . $plugin['icon'] ) ); ?>" alt="<?php echo esc_attr( $plugin['name'] );  // phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage ?>"/>
					</div>
					<div class="wpcode-plugin-suggesion-plugin-text">
						<h3><?php echo esc_html( $plugin['name'] ); ?></h3>
						<p><?php echo esc_html( $plugin['description'] ); ?></p>
						<button type=" button" class="wpcode-button wpcode-button-secondary wpcode-button-install-plugin" data-slug="<?php echo esc_attr( $slug ); ?>"><?php esc_html_e( 'Install Plugin', 'insert-headers-and-footers' ); ?></button>
					</div>
				</div>
			<?php } ?>
		</div>
		<?php

		WPCode_Notice::info(
			ob_get_clean(),
			array(
				'dismiss' => WPCode_Notice::DISMISS_GLOBAL,
				'slug'    => 'suggest_plugins',
				'autop'   => false,
				'class'   => 'wpcode-suggest-plugins-notice',
			)
		);
	}
}
includes/admin/class-wpcode-admin-notice.php000064400000022664151331545640015125 0ustar00<?php

class WPCode_Notice {

	/**
	 * Not dismissible.
	 *
	 * Constant attended to use as the value of the $args['dismiss'] argument.
	 * DISMISS_NONE means that the notice is not dismissible.
	 *
	 */
	const DISMISS_NONE = 0;

	/**
	 * Dismissible global.
	 *
	 * Constant attended to use as the value of the $args['dismiss'] argument.
	 * DISMISS_GLOBAL means that the notice will have the dismiss button, and after clicking this button, the notice will be dismissed for all users.
	 *
	 */
	const DISMISS_GLOBAL = 1;

	/**
	 * Dismissible per user.
	 *
	 * Constant attended to use as the value of the $args['dismiss'] argument.
	 * DISMISS_USER means that the notice will have the dismiss button, and after clicking this button, the notice will be dismissed only for the current user..
	 *
	 */
	const DISMISS_USER = 2;

	/**
	 * Added notices.
	 *
	 * @var array
	 */
	public $notices = array();

	/**
	 * Top notices, displayed separately.
	 *
	 * @var array
	 */
	public $notices_top = array();

	/**
	 * Init.
	 *
	 */
	public function __construct() {

		$this->hooks();
	}

	/**
	 * Hooks.
	 *
	 */
	public function hooks() {
		add_action( 'admin_notices', array( $this, 'display' ), 999000 );
		// Hook for our specific pages where we hide all other admin notices.
		add_action( 'wpcode_admin_notices', array( $this, 'display' ), 10 );
		add_action( 'wp_ajax_wpcode_notice_dismiss', array( $this, 'dismiss_ajax' ) );

		// Display notices above the header.
		add_action( 'wpcode_admin_page', array( $this, 'display_top' ), 5 );
	}

	/**
	 * Enqueue assets.
	 */
	public function enqueues() {

		wp_enqueue_script(
			'wpcode-admin-notices',
			WPCODE_PLUGIN_URL . 'build/notices.js',
			array( 'jquery' ),
			WPCODE_VERSION,
			true
		);

		wp_localize_script(
			'wpcode-admin-notices',
			'wpcode_admin_notices',
			array(
				'ajax_url' => admin_url( 'admin-ajax.php' ),
				'nonce'    => wp_create_nonce( 'wpcode-admin' ),
			)
		);
	}

	/**
	 * Display the notices.
	 */
	public function display() {

		$dismissed_notices = get_user_meta( get_current_user_id(), 'wpcode_admin_notices', true );
		$dismissed_notices = is_array( $dismissed_notices ) ? $dismissed_notices : array();
		$dismissed_notices = array_merge( $dismissed_notices, (array) get_option( 'wpcode_admin_notices', array() ) );

		foreach ( $this->notices as $slug => $notice ) {
			if ( isset( $dismissed_notices[ $slug ] ) && ! empty( $dismissed_notices[ $slug ]['dismissed'] ) ) {
				unset( $this->notices[ $slug ] );
			}
		}

		$output = implode( '', $this->notices );

		echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped

		// Enqueue script only when it's needed.
		if ( strpos( $output, 'is-dismissible' ) !== false ) {
			$this->enqueues();
		}
	}

	/**
	 * Display the notices at the top of the WPC pages.
	 */
	public function display_top() {
		$dismissed_notices = get_user_meta( get_current_user_id(), 'wpcode_admin_notices', true );
		$dismissed_notices = is_array( $dismissed_notices ) ? $dismissed_notices : array();
		$dismissed_notices = array_merge( $dismissed_notices, (array) get_option( 'wpcode_admin_notices', array() ) );

		foreach ( $this->notices_top as $slug => $notice ) {
			if ( isset( $dismissed_notices[ $slug ] ) && ! empty( $dismissed_notices[ $slug ]['dismissed'] ) ) {
				unset( $this->notices_top[ $slug ] );
			}
		}

		$output = implode( '', $this->notices_top );

		if ( ! empty( $output ) ) {
			echo '<div class="wpcode-notice-top-area">';
			echo $output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
			echo '</div>';
		}

		// Enqueue script only when it's needed.
		if ( strpos( $output, 'is-dismissible' ) !== false ) {
			$this->enqueues();
		}
	}

	/**
	 * Add notice to the registry.
	 *
	 *
	 * @param string $message Message to display.
	 * @param string $type Type of the notice. Can be [ '' (default) | 'info' | 'error' | 'success' | 'warning' ].
	 * @param array  $args The array of additional arguments. Please see the $defaults array below.
	 */
	public static function add( $message, $type = '', $args = [] ) {

		static $uniq_id = 0;

		$defaults = [
			'dismiss' => self::DISMISS_NONE,
			// Dismissible level: one of the self::DISMISS_* const. By default notice is not dismissible.
			'slug'    => '',
			// Slug. Should be unique if dismissible is not equal self::DISMISS_NONE.
			'autop'   => true,
			// `false` if not needed to pass message through wpautop().
			'class'   => '',
			// Additional CSS class.
		];

		$args = wp_parse_args( $args, $defaults );

		$dismissible = (int) $args['dismiss'];
		$dismissible = $dismissible > self::DISMISS_USER ? self::DISMISS_USER : $dismissible;

		$class  = $dismissible > self::DISMISS_NONE ? ' is-dismissible' : '';
		$global = ( $dismissible === self::DISMISS_GLOBAL ) ? 'global-' : '';
		$slug   = sanitize_key( $args['slug'] );

		++ $uniq_id;

		$uniq_id += ( $uniq_id === (int) $slug ) ? 1 : 0;

		$id = 'wpcode-notice-' . $global;

		$id .= empty( $slug ) ? $uniq_id : $slug;

		$type_class = ! empty( $type ) ? 'notice-' . esc_attr( sanitize_key( $type ) ) : '';
		$class      = empty( $args['class'] ) ? $class : $class . ' ' . esc_attr( sanitize_key( $args['class'] ) );
		$message    = $args['autop'] ? wpautop( $message ) : $message;
		$notice     = sprintf(
			'<div class="notice wpcode-notice %s%s" id="%s">%s</div>',
			esc_attr( $type_class ),
			esc_attr( $class ),
			esc_attr( $id ),
			$message
		);

		if ( 'top' === $type ) {
			if ( empty( $slug ) ) {
				wpcode()->notice->notices_top[] = $notice;
			} else {
				wpcode()->notice->notices_top[ $slug ] = $notice;
			}

			return; // Don't mix top notices.
		}

		if ( empty( $slug ) ) {
			wpcode()->notice->notices[] = $notice;
		} else {
			wpcode()->notice->notices[ $slug ] = $notice;
		}
	}

	/**
	 * Add info notice.
	 *
	 *
	 * @param string $message Message to display.
	 * @param array  $args Array of additional arguments. Details in the self::add() method.
	 */
	public static function info( $message, $args = [] ) {

		self::add( $message, 'info', $args );
	}

	/**
	 * Add top notice (displayed before the header on wpcode pages only).
	 *
	 *
	 * @param string $message Message to display.
	 * @param array  $args Array of additional arguments. Details in the self::add() method.
	 */
	public static function top( $message, $args = [] ) {

		self::add( $message, 'top', $args );
	}

	/**
	 * Add error notice.
	 *
	 *
	 * @param string $message Message to display.
	 * @param array  $args Array of additional arguments. Details in the self::add() method.
	 */
	public static function error( $message, $args = [] ) {

		self::add( $message, 'error', $args );
	}

	/**
	 * Add success notice.
	 *
	 *
	 * @param string $message Message to display.
	 * @param array  $args Array of additional arguments. Details in the self::add() method.
	 */
	public static function success( $message, $args = [] ) {

		self::add( $message, 'success', $args );
	}

	/**
	 * Add warning notice.
	 *
	 *
	 * @param string $message Message to display.
	 * @param array  $args Array of additional arguments. Details in the self::add() method.
	 */
	public static function warning( $message, $args = [] ) {

		self::add( $message, 'warning', $args );
	}

	/**
	 * AJAX routine that updates dismissed notices meta data.
	 *

	 */
	public function dismiss_ajax() {

		// Run a security check.
		check_ajax_referer( 'wpcode-admin' );

		// Sanitize POST data.
		$post = array_map( 'sanitize_key', wp_unslash( $_POST ) );

		// Update notices meta data.
		if ( strpos( $post['id'], 'global-' ) !== false ) {

			// Check for permissions.
			if ( ! current_user_can( 'wpcode_edit_snippets' ) ) {
				wp_send_json_error();
			}

			$notices = $this->dismiss_global( $post['id'] );
			$level   = self::DISMISS_GLOBAL;

		} else {

			$notices = $this->dismiss_user( $post['id'] );
			$level   = self::DISMISS_USER;
		}

		/**
		 * Allows developers to apply additional logic to the dismissing notice process.
		 * Executes after updating option or user meta (according to the notice level).
		 *
		 *
		 * @param string  $notice_id Notice ID (slug).
		 * @param integer $level Notice level.
		 * @param array   $notices Dismissed notices.
		 */
		do_action( 'wpcode_admin_notice_dismiss_ajax', $post['id'], $level, $notices );

		wp_send_json_success();
	}

	/**
	 * AJAX sub-routine that updates dismissed notices option.
	 *
	 *
	 * @param string $id Notice Id.
	 *
	 * @return array Notices.
	 */
	private function dismiss_global( $id ) {

		$id             = str_replace( 'global-', '', $id );
		$notices        = get_option( 'wpcode_admin_notices', array() );
		$notices[ $id ] = array(
			'time'      => time(),
			'dismissed' => true,
		);

		update_option( 'wpcode_admin_notices', $notices, true );

		// If this is a multisite, and they dismissed the review-request let's keep a note in the user's meta.
		if ( is_multisite() && is_super_admin() && 'review_request' === $id ) {
			update_user_meta( get_current_user_id(), 'wpcode_dismissed_review_request', true );
		}

		return $notices;
	}

	/**
	 *  AJAX sub-routine that updates dismissed notices user meta.
	 *
	 *
	 * @param string $id Notice Id.
	 *
	 * @return array Notices.
	 */
	private function dismiss_user( $id ) {

		$user_id        = get_current_user_id();
		$notices        = get_user_meta( $user_id, 'wpcode_admin_notices', true );
		$notices        = ! is_array( $notices ) ? array() : $notices;
		$notices[ $id ] = array(
			'time'      => time(),
			'dismissed' => true,
		);

		update_user_meta( $user_id, 'wpcode_admin_notices', $notices );

		return $notices;
	}
}
includes/admin/class-wpcode-skin.php000064400000006063151331545640013515 0ustar00<?php
/**
 * Skin class.
 *
 * @since 2.0.7
 *
 * @package WPCode
 */

// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

class WPCode_Skin extends WP_Upgrader_Skin {

	/**
	 * Primary class constructor.
	 *
	 * @param array $args Empty array of args (we will use defaults).
	 *
	 * @since 2.0.7
	 *
	 */
	public function __construct( $args = array() ) {

		parent::__construct();

	}

	/**
	 * Set the upgrader object and store it as a property in the parent class.
	 *
	 * @param object $upgrader The upgrader object (passed by reference).
	 *
	 * @since 2.0.7
	 *
	 */
	public function set_upgrader( &$upgrader ) {

		if ( is_object( $upgrader ) ) {
			$this->upgrader =& $upgrader;
		}

	}

	/**
	 * Set the upgrader result and store it as a property in the parent class.
	 *
	 * @param object $result The result of the install process.
	 *
	 * @since 2.0.7
	 *
	 */
	public function set_result( $result ) {

		$this->result = $result;

	}

	/**
	 * Empty out the header of its HTML content and only check to see if it has
	 * been performed or not.
	 *
	 * @since 2.0.7
	 */
	public function header() {
	}

	/**
	 * Empty out the footer of its HTML contents.
	 *
	 * @since 2.0.7
	 */
	function footer() {
	}

	/**
	 * Instead of outputting HTML for errors, json_encode the errors and send them
	 * back to the Ajax script for processing.
	 *
	 * @param array $errors Array of errors with the install process.
	 *
	 * @since 2.0.7
	 *
	 */
	function error( $errors ) {

		if ( ! empty( $errors ) ) {
			$error_message = sprintf(
			// Translators: Support link tag starts with url and Support link tag ends.
				esc_html__( 'There was an error installing the addon. Please try again. If you are still having issues, please %1$scontact our support%2$s team.', 'insert-headers-and-footers' ),
				'<a target="_blank" href="' . wpcode_utm_url( 'https://library.wpcode.com/account/support/', 'notice', 'error-installing-addons' ) . '">',
				'</a>'
			);
			if ( is_wp_error( $errors ) ) {
				/**
				 * @var WP_Error $errors
				 */
				$message = $errors->get_error_message();

				if ( ! empty( $message ) ) {
					// Translators: The name of the addon that can't be installed, Support link tag starts with url and Support link tag ends.
					$error_message = sprintf(
					// Translators: The name of the addon that can't be installed, Support link tag starts with url and Support link tag ends.
						esc_html__( 'There was an error installing the addon, %1$s. Please try again. If you are still having issues, please %2$scontact our support%3$s team. ', 'insert-headers-and-footers' ),
						esc_html( $message ),
						'<a target="_blank" href="' . wpcode_utm_url( 'https://library.wpcode.com/account/support/', 'notice', 'error-installing-addons' ) . '">',
						'</a>'
					);
				}
			}

			wp_send_json( array( 'error' => $error_message ) );
		}

	}

	/**
	 * Empty out the feedback method to prevent outputting HTML strings as the install
	 * is progressing.
	 *
	 * @param string $string The feedback string.
	 *
	 * @since 2.0.7
	 *
	 */
	function feedback( $string, ...$args ) {

	}

}
includes/admin/class-wpcode-importers.php000064400000002776151331545640014604 0ustar00<?php
/**
 * Load classes used for importing data from other plugins.
 *
 * @package WPCode
 */

/**
 * WPCode_Importers class.
 */
class WPCode_Importers {

	/**
	 * Available importers.
	 *
	 * @var WPCode_Importer_Type[]
	 */
	public $importers = array();

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->require_files();
		$this->load_importers();
	}

	/**
	 * Require the importer classes.
	 *
	 * @return void
	 */
	private function require_files() {
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/importers/class-wpcode-importer-type.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/importers/class-wpcode-importer-code-snippets.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/importers/class-wpcode-importer-code-snippets-premium.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/admin/importers/class-wpcode-importer-woody.php';
	}

	/**
	 * Load the available importers instances.
	 *
	 * @return void
	 */
	private function load_importers() {
		if ( empty( $this->importers ) ) {
			$this->importers = array(
				'code-snippets'     => new WPCode_Importer_Code_Snippets(),
				'code-snippets-pro' => new WPCode_Importer_Code_Snippets_Pro(),
				'woody'             => new WPCode_Importer_Woody(),
			);
		}
	}

	/**
	 * Get the importers with registered data.
	 *
	 * @return array
	 */
	public function get_importers() {

		$importers = array();

		foreach ( $this->importers as $importer ) {
			$importers = $importer->register( $importers );
		}

		return $importers;
	}
}
includes/admin/class-wpcode-metabox-snippets.php000064400000014417151331545640016055 0ustar00<?php
/**
 * Base class for the WPCode snippets metabox.
 *
 * @package WPCode
 */

/**
 * WPCode metabox snippets.
 */
abstract class WPCode_Metabox_Snippets {

	/**
	 * Id used for registering the metabox using add_meta_box.
	 *
	 * @var string
	 */
	public $id = 'wpcode-metabox-snippets';

	/**
	 * Title of the metabox.
	 *
	 * @var string
	 */
	public $title;

	/**
	 * Tabs for this metabox.
	 *
	 * @var array
	 */
	public $tabs;

	/**
	 * If true, the metabox will scroll into view when the page loads.
	 *
	 * @var bool
	 */
	protected $scroll_into_view = false;

	/**
	 * Register the metabox.
	 */
	public function __construct() {
		$this->hooks();
	}

	/**
	 * Load the translatable strings.
	 *
	 * @return void
	 */
	public function load_strings() {
		$this->title = __( 'WPCode Page Scripts', 'insert-headers-and-footers' );
		$this->tabs  = array(
			'header' => __( 'Header', 'insert-headers-and-footers' ),
			'footer' => __( 'Footer', 'insert-headers-and-footers' ),
		);

		$body_supported = function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' );

		if ( $body_supported ) {
			$this->tabs['body'] = __( 'Body', 'insert-headers-and-footers' );
		}

		$this->tabs['code']      = __( 'Custom Code Snippet', 'insert-headers-and-footers' );
		$this->tabs['revisions'] = __( 'Revisions', 'insert-headers-and-footers' );

	}

	/**
	 * Add hooks.
	 *
	 * @return void
	 */
	public function hooks() {
		add_action( 'admin_init', array( $this, 'load_strings' ) );
		add_action( 'add_meta_boxes', array( $this, 'register_metabox' ) );
		add_action( 'admin_head', array( $this, 'close_metabox_for_current_screen' ) );
	}

	/**
	 * Make sure the metabox is closed by default.
	 *
	 * @return void
	 */
	public function close_metabox_for_current_screen() {
		// Close the metabox by default.
		$screen = get_current_screen();
		if ( ! isset( $screen->id ) ) {
			return;
		}
		if ( apply_filters( 'wpcode_metabox_scripts_force_collapse', true, $screen ) ) {
			add_filter(
				'get_user_option_closedpostboxes_' . $screen->id,
				array(
					$this,
					'add_metabox_to_user_closed',
				)
			);
		}
	}

	/**
	 * Add our metabox id to the array of closed metaboxes when the page loads.
	 *
	 * @param mixed $closed The array of closed metaboxes.
	 *
	 * @return array
	 */
	public function add_metabox_to_user_closed( $closed ) {
		// Make sure it's an array.
		if ( ! is_array( $closed ) ) {
			$closed = array();
		}
		$closed[] = $this->id;

		return $closed;
	}

	/**
	 * Use `add_meta_box` to register the metabox for this class.
	 *
	 * @param string $post_type The post type of the screen where metaboxes are loaded.
	 *
	 * @return void
	 */
	public function register_metabox( $post_type ) {
		// Don't show the metabox to users who aren't allowed to manage snippets.
		if ( ! current_user_can( 'wpcode_edit_html_snippets' ) ) {
			return;
		}

		if ( wpcode()->settings->get_option( 'headers_footers_mode' ) ) {
			// Don't load the metabox when headers & footers mode is enabled.
			return;
		}

		$post_type_details = get_post_type_object( $post_type );

		// Add metabox only on public post types.
		if ( empty( $post_type_details->public ) ) {
			return;
		}

		add_meta_box(
			$this->id,
			$this->title,
			array(
				$this,
				'output_metabox_content',
			),
			$post_type,
			'normal',
			apply_filters( 'wpcode_post_metabox_priority', 'default' )
		);
	}

	/**
	 * Metabox content output callback.
	 *
	 * @param WP_Post $post The post object.
	 *
	 * @return void
	 */
	public function output_metabox_content( $post ) {
		$this->metabox_start();
		echo '<div class="wpcode-content">';
		$this->tabs_navigation();
		$this->tabs_content( $post );
		echo '</div>';
		$this->metabox_end();
	}

	/**
	 * Output the menu for switching between tabs.
	 *
	 * @return void
	 */
	public function tabs_navigation() {
		if ( empty( $this->tabs ) ) {
			return;
		}
		?>
		<div class="wpcode-admin-tabs-navigation">
			<ul class="wpcode-admin-tabs">
				<?php
				$class = '';
				foreach ( $this->tabs as $tab_id => $tab_name ) {
					if ( $this->get_active_tab() === $tab_id ) {
						$class = 'active';
					}
					?>
					<li>
						<button type="button" data-target="<?php echo esc_attr( $this->get_tab_html_id( $tab_id ) ); ?>" class="<?php echo esc_attr( $class ); ?>"><?php echo esc_html( $tab_name ); ?></button>
					</li>
					<?php
					$class = '';
				}
				do_action( 'wpcode_metabox_admin_tabs' )
				?>
			</ul>
		</div>
		<?php
	}

	/**
	 * Output the tabs content using tab-specific methods by their ids.
	 *
	 * @param WP_Post $post The post object.
	 *
	 * @return void
	 */
	public function tabs_content( $post ) {
		$tab_ids = array_keys( $this->tabs );

		foreach ( $tab_ids as $tab_id ) {
			$class = 'wpcode-admin-tab-content';

			$class .= $this->get_active_tab() === $tab_id ? ' active' : '';
			printf(
				'<div class="%1$s" id="%2$s">',
				esc_attr( $class ),
				esc_attr( $this->get_tab_html_id( $tab_id ) )
			);
			if ( method_exists( $this, 'output_tab_' . $tab_id ) ) {
				call_user_func( array( $this, 'output_tab_' . $tab_id ), $post );
			} else {
				$this->output_tab( $tab_id, $post );
			}
			echo '</div>';
		}
	}

	/**
	 * Generic tab content output method.
	 *
	 * @param string  $tab_id The tab id.
	 * @param WP_Post $post The post object.
	 *
	 * @return void
	 */
	public function output_tab( $tab_id, $post ) {
	}

	/**
	 * Get the active tab id.
	 *
	 * @return string
	 */
	public function get_active_tab() {
		$active_tab = 'header';
		if ( isset( $_GET['wpcode-show'] ) && array_key_exists( sanitize_key( $_GET['wpcode-show'] ), $this->tabs ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$active_tab             = sanitize_key( $_GET['wpcode-show'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
			$this->scroll_into_view = true;
		}

		return $active_tab;
	}

	/**
	 * Get a standard tab id from the array key.
	 *
	 * @param string $tab_id The tab id.
	 *
	 * @return string
	 */
	public function get_tab_html_id( $tab_id ) {
		return 'wpcode-tab-' . $tab_id;
	}

	/**
	 * Method for running logic at the start of the metabox.
	 *
	 * @return void
	 */
	public function metabox_start() {
	}

	/**
	 * Method for running logic at the end of the metabox, loading scripts, for example.
	 *
	 * @return void
	 */
	public function metabox_end() {
	}
}
includes/admin/class-wpcode-skin-legacy.php000064400000005724151331545640014762 0ustar00<?php
/**
 * Legacy Skin class used for older versions of WordPress.
 *
 * @since 2.0.7
 *
 * @package WPCode
 */

// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

class WPCode_Skin extends WP_Upgrader_Skin {

	/**
	 * Primary class constructor.
	 *
	 * @param array $args Empty array of args (we will use defaults).
	 *
	 * @since 2.0.7
	 *
	 */
	public function __construct( $args = array() ) {

		parent::__construct();

	}

	/**
	 * Set the upgrader object and store it as a property in the parent class.
	 *
	 * @param object $upgrader The upgrader object (passed by reference).
	 *
	 * @since 2.0.7
	 *
	 */
	public function set_upgrader( &$upgrader ) {

		if ( is_object( $upgrader ) ) {
			$this->upgrader =& $upgrader;
		}

	}

	/**
	 * Set the upgrader result and store it as a property in the parent class.
	 *
	 * @param object $result The result of the install process.
	 *
	 * @since 2.0.7
	 *
	 */
	public function set_result( $result ) {

		$this->result = $result;

	}

	/**
	 * Empty out the header of its HTML content and only check to see if it has
	 * been performed or not.
	 *
	 * @since 2.0.7
	 */
	public function header() {
	}

	/**
	 * Empty out the footer of its HTML contents.
	 *
	 * @since 2.0.7
	 */
	function footer() {
	}

	/**
	 * Instead of outputting HTML for errors, json_encode the errors and send them
	 * back to the Ajax script for processing.
	 *
	 * @param array $errors Array of errors with the install process.
	 *
	 * @since 2.0.7
	 *
	 */
	function error( $errors ) {

		if ( ! empty( $errors ) ) {
			$error_message = sprintf(
			// Translators: Support link tag starts with url and Support link tag ends.
				esc_html__( 'There was an error installing the addon. Please try again. If you are still having issues, please %1$scontact our support%2$s team.', 'insert-headers-and-footers' ),
				'<a target="_blank" href="' . wpcode_utm_url( 'https://library.wpcode.com/account/support/', 'notice', 'error-installing-addons' ) . '">',
				'</a>'
			);
			if ( is_wp_error( $errors ) ) {
				/**
				 * @var WP_Error $errors
				 */
				$message = $errors->get_error_message();

				if ( ! empty( $message ) ) {
					$error_message = sprintf(
					// Translators: The name of the addon that can't be installed, Support link tag starts with url and Support link tag ends.
						esc_html__( 'There was an error installing the addon, %1$s. Please try again. If you are still having issues, please %2$scontact our support%3$s team. ', 'insert-headers-and-footers' ),
						esc_html( $message ),
						'<a target="_blank" href="' . wpcode_utm_url( 'https://library.wpcode.com/account/support/', 'notice', 'error-installing-addons' ) . '">',
						'</a>'
					);
				}
			}

			wp_send_json( array( 'error' => $error_message ) );
		}

	}

	/**
	 * Empty out the feedback method to prevent outputting HTML strings as the install
	 * is progressing.
	 *
	 * @param string $string The feedback string.
	 *
	 * @since 2.0.7
	 *
	 */
	function feedback( $string ) {
	}

}
includes/admin/admin-ajax-handlers.php000064400000032107151331545640013774 0ustar00<?php
/**
 * Ajax handlers for the admin.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

add_action( 'wp_ajax_wpcode_update_snippet_status', 'wpcode_update_snippet_status' );
add_action( 'wp_ajax_wpcode_filter_snippets_by_type', 'wpcode_filter_snippets_by_type' );
add_action( 'wp_ajax_wpcode_search_terms', 'wpcode_search_terms' );
add_action( 'wp_ajax_wpcode_generate_snippet', 'wpcode_generate_snippet' );
add_action( 'wp_ajax_wpcode_save_generated_snippet', 'wpcode_save_generated_snippet' );
add_action( 'wp_ajax_wpcode_verify_ssl', 'wpcode_verify_ssl' );
add_filter( 'heartbeat_received', 'wpcode_heartbeat_data', 10, 3 );
add_action( 'wp_ajax_wpcode_save_editor_height', 'wpcode_save_editor_height' );
add_action( 'wp_ajax_wpcode_get_shortcode_locations', 'wpcode_get_shortcode_locations' );

/**
 * Handles toggling a snippet status from the admin.
 *
 * @return void
 */
function wpcode_update_snippet_status() {
	check_ajax_referer( 'wpcode_admin' );

	if ( empty( $_POST['snippet_id'] ) ) {
		return;
	}
	$snippet_id = absint( $_POST['snippet_id'] );
	$active     = isset( $_POST['active'] ) && 'true' === $_POST['active'];

	$snippet = wpcode_get_snippet( $snippet_id );

	if ( ! current_user_can( 'wpcode_activate_snippets', $snippet ) ) {
		wpcode()->error->add_error(
			array(
				'message' => __( 'You are not allowed to change snippet status, please contact your webmaster.', 'insert-headers-and-footers' ),
				'type'    => 'permissions',
			)
		);
		$active = false;
	} elseif ( $active ) {
		$snippet->activate();
	} else {
		$snippet->deactivate();
	}

	if ( ! isset( $snippet->active ) || $active !== $snippet->active ) {
		$error_message = sprintf(
		// Translators: %2$s is the action that they were trying to perform, either activated or deactivated. %1$s is the error message why the action failed.
			__( 'Snippet not %2$s, the following error was encountered: %1$s', 'insert-headers-and-footers' ),
			'<code>' . wpcode()->error->get_last_error_message() . '</code>',
			$active ? _x( 'activated', 'Snippet status change', 'insert-headers-and-footers' ) : _x( 'deactivated', 'Snippet status change', 'insert-headers-and-footers' )
		);
		// We failed to activate it, so it's an error.
		wp_send_json_error(
			array(
				'message' => $error_message,
			)
		);
	}
	exit;
}

/**
 * Filter snippets by type.
 *
 * @return void
 */
function wpcode_filter_snippets_by_type() {

	check_ajax_referer( 'wpcode_admin' );

	// If the current user can't edit snippets they should not be trying this.
	if ( ! current_user_can( 'wpcode_edit_snippets' ) ) {
		wp_send_json_error();
	}

	if ( ! isset( $_POST['snippet_type'] ) ) {
		wp_send_json_error();
	}

	require_once WPCODE_PLUGIN_PATH . 'includes/admin/pages/class-wpcode-code-snippets-table.php';

	$snippet_type = isset( $_POST['snippet_type'] ) ? sanitize_text_field( wp_unslash( $_POST['snippet_type'] ) ) : '';
	$location     = isset( $_POST['location'] ) ? sanitize_text_field( wp_unslash( $_POST['location'] ) ) : '';
	$search_term  = isset( $_POST['s'] ) ? sanitize_text_field( wp_unslash( $_POST['s'] ) ) : '';

	$screen_id      = 'toplevel_page_wpcode';
	$current_screen = convert_to_screen( $screen_id );
	set_current_screen( $screen_id );

	$snippets_table = new WPCode_Code_Snippets_Table();

	// Used screen object to set up table.
	$snippets_table->screen = $current_screen;

	$_GET['type']     = $snippet_type;
	$_GET['location'] = $location;
	$_GET['s']        = $search_term;

	$snippets_table->prepare_items();
	$count = $snippets_table->get_total_items();

	// Output table HTML.
	ob_start();
	?>
	<input type="hidden" name="page" value="wpcode"/>
	<?php
	$snippets_table->search_box( __( 'Search Snippets', 'insert-headers-and-footers' ), 'wpcode_snippet_search' );
	$snippets_table->views();
	$snippets_table->display();

	$table_html = ob_get_clean();

	// Send success response.
	wp_send_json_success(
		array(
			'html'  => $table_html,
			'count' => $count,
		)
	);
}

/**
 * Ajax handler to search for terms through all the public taxonomies.
 *
 * @return void
 */
function wpcode_search_terms() {
	check_ajax_referer( 'wpcode_admin' );

	if ( ! current_user_can( 'wpcode_edit_snippets' ) ) {
		wp_send_json_error();
	}

	$term = isset( $_GET['term'] ) ? sanitize_text_field( wp_unslash( $_GET['term'] ) ) : '';

	$public_taxonomies = get_taxonomies(
		array(
			'public' => true,
		)
	);

	$terms = get_terms(
		array(
			'search'     => $term,
			'taxonomy'   => $public_taxonomies,
			'hide_empty' => false,
		)
	);

	$results = array();

	foreach ( $terms as $term ) {
		$results[] = array(
			'id'   => $term->term_id,
			'text' => $term->name,
		);
	}

	wp_send_json(
		array(
			'results' => $results,
		)
	);
}

/**
 * Ajax handler for the generator.
 *
 * @return void
 */
function wpcode_generate_snippet() {

	check_ajax_referer( 'wpcode_generate', 'nonce' );

	if ( ! current_user_can( 'wpcode_edit_snippets' ) ) {
		wp_send_json_error();
	}

	$generator_type = isset( $_POST['type'] ) ? sanitize_text_field( wp_unslash( $_POST['type'] ) ) : '';

	$generator = wpcode()->generator()->get_type( $generator_type );

	if ( ! $generator ) {
		wp_send_json_error();
	}

	$snippet_code = $generator->process_form_data( $_POST );

	wp_send_json( $snippet_code );
}

/**
 * Take the values from a generated snippet and save as a new snippet.
 *
 * @return void
 */
function wpcode_save_generated_snippet() {

	check_ajax_referer( 'wpcode_generate', 'nonce' );

	// If the current user can't edit snippets they should not be trying this.
	if ( ! current_user_can( 'wpcode_edit_snippets' ) ) {
		wp_send_json_error();
	}

	$generator_type = isset( $_POST['type'] ) ? sanitize_text_field( wp_unslash( $_POST['type'] ) ) : '';
	$generator      = wpcode()->generator()->get_type( $generator_type );
	// If a snippet id is passed, let's attempt to update it.
	$snippet_id = isset( $_POST['snippet_id'] ) ? absint( $_POST['snippet_id'] ) : '';

	if ( ! $generator ) {
		wp_send_json_error();
	}

	$snippet_code = $generator->process_form_data( $_POST );

	$snippet_data = array(
		// Translators: this an auto-generated title for when a snippet is saved from the generator.
		'title'          => sprintf( __( 'Generated Snippet %s', 'insert-headers-and-footers' ), $generator->get_title() ),
		'code'           => $snippet_code,
		'code_type'      => $generator->get_code_type(),
		'tags'           => $generator->get_tags(),
		'location'       => $generator->get_location(),
		'generator'      => $generator->get_name(),
		'generator_data' => $generator->get_generator_data(),
		'auto_insert'    => $generator->get_auto_insert(),
	);

	// If a snippet id is passed, let's attempt to update the snippet.
	if ( ! empty( $snippet_id ) ) {
		$snippet = new WPCode_Snippet( $snippet_id );
		// Let's make sure this is an id for a snippet.
		if ( null !== $snippet->get_post_data() ) {
			$snippet_data['id']     = $snippet_id;
			$snippet_data['active'] = false;
			// Don't change the title of an existing snippet.
			unset( $snippet_data['title'] );
		}
	}

	$new_snippet = new WPCode_Snippet( $snippet_data );

	$new_snippet_id = $new_snippet->save();

	wp_send_json_success(
		array(
			'url' => add_query_arg(
				array(
					'page'       => 'wpcode-snippet-manager',
					'snippet_id' => $new_snippet_id,
				),
				admin_url( 'admin.php' )
			),
		)
	);
}

/**
 * Ajax handler to verify that the current web host can successfully
 * make outbound SSL connections.
 *
 * @return void
 */
function wpcode_verify_ssl() {
	if ( ! current_user_can( 'wpcode_edit_snippets' ) ) {
		wp_send_json_error();
	}

	$response = wp_remote_post( 'https://wpcode.com' );

	if ( 200 === wp_remote_retrieve_response_code( $response ) ) {
		wp_send_json_success(
			array(
				'msg' => esc_html__( 'Success! Your server can make SSL connections.', 'insert-headers-and-footers' ),
			)
		);
	}

	wp_send_json_error(
		array(
			'msg'   => esc_html__( 'There was an error and the connection failed. Please contact your web host with the technical details below.', 'insert-headers-and-footers' ),
			'debug' => '<pre>' . print_r( map_deep( $response, 'wp_strip_all_tags' ), true ) . '</pre>',
			// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r
		)
	);
}

/**
 * Use heartbeat to update lock status when editing a snippet.
 *
 * @param array  $response The Heartbeat response.
 * @param array  $data The $_POST data sent with the Heartbeat.
 * @param string $screen_id The screen ID.
 *
 * @return array
 */
function wpcode_heartbeat_data( $response, $data, $screen_id ) {
	if ( 'code-snippets_page_wpcode-snippet-manager' === $screen_id && isset( $data['wpcode_lock'] ) ) {
		// Update the post lock while they are still editing.
		wp_set_post_lock( absint( $data['wpcode_lock'] ) );
	}

	return $response;
}

/**
 * AJAX handler to save the editor height.
 *
 * @return void
 */
function wpcode_save_editor_height() {
	check_ajax_referer( 'wpcode_admin' );

	// If the current user can't edit snippets they should not be trying this.
	if ( ! current_user_can( 'wpcode_edit_snippets' ) ) {
		wp_send_json_error();
	}

	$height = isset( $_POST['height'] ) ? absint( $_POST['height'] ) : false;

	if ( false !== $height ) {
		wpcode()->settings->update_option( 'editor_height', $height );

		wp_send_json_success();
	}

	wp_send_json_error();
}

/**
 * Get the list of locations where a shortcode is used.
 *
 * @return void
 */
function wpcode_get_shortcode_locations() {
	check_ajax_referer( 'wpcode_admin', '_wpnonce' );

	if ( ! current_user_can( 'wpcode_edit_snippets' ) ) {
		wp_send_json_error();
	}

	if ( empty( $_POST['snippet_id'] ) ) {
		wp_send_json_error( 'No snippet ID provided' );
	}

	$snippet_id = absint( $_POST['snippet_id'] );
	$snippet    = wpcode_get_snippet( $snippet_id );

	$page     = isset( $_POST['page'] ) ? absint( $_POST['page'] ) : 1;
	$per_page = 100;

	$post_types = array_merge(
		get_post_types( array( 'public' => true ) ),
		array(
			'wp_template',
			'wp_template_part',
			'wpcode',
		)
	);

	// Add post types to params.
	$params = $post_types;

	global $wpdb;

	$search_terms   = array();
	$search_terms[] = '[wpcode';
	if ( $snippet->get_custom_shortcode() ) {
		$search_terms[] = '[' . $snippet->get_custom_shortcode();
	}

	$like_clauses = array();
	foreach ( $search_terms as $term ) {
		$like_clauses[] = 'post_content LIKE %s';
		$params[]       = '%' . $wpdb->esc_like( $term ) . '%';
	}
	$where_like = implode( ' OR ', $like_clauses );

	$offset = ( $page - 1 ) * $per_page;

	$post_type_placeholders = implode( ', ', array_fill( 0, count( $post_types ), '%s' ) );

	$params[] = $per_page;
	$params[] = $offset;

	$candidate_ids = $wpdb->get_col( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.DirectQuery
		$wpdb->prepare( // phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber
			"SELECT ID FROM {$wpdb->posts} 
            WHERE post_type IN ($post_type_placeholders)
            AND post_status != 'trash'
            AND ($where_like)
            LIMIT %d OFFSET %d",
			$params
		)
	);
	$candidate_ids = array_unique( $candidate_ids );

	$matching_posts = array();

	if ( ! empty( $candidate_ids ) ) {
		$candidate_posts = get_posts(
			array(
				'post_type'      => array_values( $post_types ),
				'post_status'    => 'any',
				'posts_per_page' => - 1,
				'include'        => $candidate_ids,
			)
		);

		foreach ( $candidate_posts as $post ) {
			$content = $post->post_content;

			if ( has_shortcode( $content, 'wpcode' ) && preg_match( '/\[wpcode[^\]]*id\s*=\s*["\']\s*' . preg_quote( $snippet_id, '/' ) . '\s*["\'][^\]]*\]/', $content ) ) {
				$matching_posts[] = $post;
				continue;
			}

			if ( $snippet->get_custom_shortcode() && has_shortcode( $content, $snippet->get_custom_shortcode() ) && preg_match( '/\[' . preg_quote( $snippet->get_custom_shortcode(), '/' ) . '[^\]]*\]/', $content ) ) {
				$matching_posts[] = $post;
			}
		}
	}

	if ( empty( $matching_posts ) ) {
		if ( 1 === $page ) {
			$html = '<ul><li>' . esc_html__( 'This shortcode is not used in any content yet.', 'insert-headers-and-footers' ) . '</li></ul>';
		} else {
			$html = '';
		}
	} else {
		$html = '<ul>';
		foreach ( $matching_posts as $post ) {
			if ( 'wpcode' === $post->post_type ) {
				$edit_link       = esc_url( add_query_arg( 'snippet_id', $post->ID, admin_url( 'admin.php?page=wpcode-snippet-manager' ) ) );
				$post_type_label = esc_html__( 'WPCode Snippet', 'insert-headers-and-footers' );
			} else {
				$edit_link       = get_edit_post_link( $post->ID );
				$post_type_obj   = get_post_type_object( $post->post_type );
				$post_type_label = $post_type_obj ? $post_type_obj->labels->singular_name : $post->post_type;
			}

			$html .= sprintf(
				'<li><a href="%1$s" target="_blank" rel="noopener noreferrer">%2$s</a> <span class="wpcode-post-type">(%3$s)</span></li>',
				esc_url( $edit_link ),
				// Translators: %d is the post id.
				esc_html( empty( $post->post_title ) ? sprintf( esc_html__( 'Untitled (#%d)', 'insert-headers-and-footers' ), $post->ID ) : $post->post_title ),
				esc_html( $post_type_label )
			);
		}
		$html .= '</ul>';
	}

	$has_more = count( $candidate_ids ) >= $per_page;

	wp_send_json_success(
		array(
			'html'     => $html,
			'has_more' => $has_more,
			'page'     => $page,
		)
	);
}
includes/admin/class-wpcode-notifications.php000064400000030751151331545640015423 0ustar00<?php
/**
 * Notifications from remote source.
 *
 * @package WPCode
 */

/**
 * Notifications.
 */
class WPCode_Notifications {

	/**
	 * Source of notifications content.
	 *
	 * @var string
	 */
	const SOURCE_URL = 'https://plugin.wpcode.com/wp-content/notifications.json';

	/**
	 * Option value.
	 *
	 * @var bool|array
	 */
	public $option = false;

	/**
	 * The name of the option used to store the data.
	 *
	 * @var string
	 */
	public static $option_name = 'wpcode_notifications';

	/**
	 * WPCode_Notifications constructor.
	 */
	public function __construct() {
		$this->init();
	}

	/**
	 * Initialize class.
	 */
	public function init() {

		$this->hooks();
	}

	/**
	 * Register hooks.
	 */
	public function hooks() {
		add_action( 'wp_ajax_wpcode_notification_dismiss', array( $this, 'dismiss' ) );

		add_action( 'wpcode_admin_notifications_update', array( $this, 'update' ) );
	}

	/**
	 * Check if user has access and is enabled.
	 *
	 * @return bool
	 */
	public function has_access() {
		return apply_filters( 'wpcode_admin_notifications_has_access', ! wpcode()->settings->get_option( 'hide_am_notices', false ) );
	}

	/**
	 * Get option value.
	 *
	 * @param bool $cache Reference property cache if available.
	 *
	 * @return array
	 */
	public function get_option( $cache = true ) {

		if ( $this->option && $cache ) {
			return $this->option;
		}

		$option = get_option( self::$option_name, array() );

		$this->option = array(
			'update'    => ! empty( $option['update'] ) ? $option['update'] : 0,
			'events'    => ! empty( $option['events'] ) ? $option['events'] : array(),
			'feed'      => ! empty( $option['feed'] ) ? $option['feed'] : array(),
			'dismissed' => ! empty( $option['dismissed'] ) ? $option['dismissed'] : array(),
		);

		return $this->option;
	}

	/**
	 * Fetch notifications from feed.
	 *
	 * @return array
	 */
	public function fetch_feed() {

		$res = wp_remote_get( self::SOURCE_URL );

		if ( is_wp_error( $res ) ) {
			return array();
		}

		$body = wp_remote_retrieve_body( $res );

		if ( empty( $body ) ) {
			return array();
		}

		return $this->verify( json_decode( $body, true ) );
	}

	/**
	 * Verify notification data before it is saved.
	 *
	 * @param array $notifications Array of notifications items to verify.
	 *
	 * @return array
	 * @since {VERSION}
	 */
	public function verify( $notifications ) {

		$data = array();

		if ( ! is_array( $notifications ) || empty( $notifications ) ) {
			return $data;
		}

		$option = $this->get_option();

		foreach ( $notifications as $notification ) {

			// The message and license should never be empty, if they are, ignore.
			if ( empty( $notification['content'] ) || empty( $notification['type'] ) ) {
				continue;
			}

			// Ignore if notification is not ready to display(based on start time).
			if ( ! empty( $notification['start'] ) && time() < strtotime( $notification['start'] ) ) {
				continue;
			}

			// Ignore if expired.
			if ( ! empty( $notification['end'] ) && time() > strtotime( $notification['end'] ) ) {
				continue;
			}

			// Check that the license type matches.
			if ( ! in_array( $this->get_license_type(), (array) $notification['type'], true ) ) {
				continue;
			}

			// Ignore if notification has already been dismissed.
			$notification_already_dismissed = false;
			if ( is_array( $option['dismissed'] ) && ! empty( $option['dismissed'] ) ) {
				foreach ( $option['dismissed'] as $dismiss_notification ) {
					if ( $notification['id'] === $dismiss_notification['id'] ) {
						$notification_already_dismissed = true;
						break;
					}
				}
			}

			if ( true === $notification_already_dismissed ) {
				continue;
			}

			// Ignore if notification existed before installing WPCode.
			// Prevents bombarding the user with notifications after activation.
			$activated = get_option( 'ihaf_activated', array() );

			if (
				! empty( $activated['wpcode'] ) &&
				! empty( $notification['start'] ) &&
				$activated['wpcode'] > strtotime( $notification['start'] )
			) {
				continue;
			}

			$data[] = $notification;
		}

		return $data;
	}

	/**
	 * Verify saved notification data for active notifications.
	 *
	 * @param array $notifications Array of notifications items to verify.
	 *
	 * @return array
	 */
	public function verify_active( $notifications ) {

		if ( ! is_array( $notifications ) || empty( $notifications ) ) {
			return array();
		}

		// Remove notifications that are not active, or if the license type not exists.
		foreach ( $notifications as $key => $notification ) {
			if (
				( ! empty( $notification['start'] ) && time() < strtotime( $notification['start'] ) ) ||
				( ! empty( $notification['end'] ) && time() > strtotime( $notification['end'] ) )
			) {
				unset( $notifications[ $key ] );
			}
		}

		return $notifications;
	}

	/**
	 * Get notification data.
	 *
	 * @return array
	 */
	public function get() {

		if ( ! $this->has_access() ) {
			return array();
		}

		$option = $this->get_option();

		// Update notifications using async task.
		if ( empty( $option['update'] ) || time() > $option['update'] + DAY_IN_SECONDS ) {
			if ( false === wp_next_scheduled( 'wpcode_admin_notifications_update' ) ) {
				wp_schedule_single_event( time(), 'wpcode_admin_notifications_update' );
			}
		}

		$events = ! empty( $option['events'] ) ? $this->verify_active( $option['events'] ) : array();
		$feed   = ! empty( $option['feed'] ) ? $this->verify_active( $option['feed'] ) : array();

		$notifications              = array();
		$notifications['active']    = array_merge( $events, $feed );
		$notifications['active']    = $this->get_notifications_with_human_readeable_start_time( $notifications['active'] );
		$notifications['active']    = $this->get_notifications_with_formatted_content( $notifications['active'] );
		$notifications['dismissed'] = ! empty( $option['dismissed'] ) ? $option['dismissed'] : array();
		$notifications['dismissed'] = $this->get_notifications_with_human_readeable_start_time( $notifications['dismissed'] );
		$notifications['dismissed'] = $this->get_notifications_with_formatted_content( $notifications['dismissed'] );

		return $notifications;
	}

	/**
	 * Improve format of the content of notifications before display. By default, it just runs wpautop.
	 *
	 * @param array $notifications The notifications to be parsed.
	 *
	 * @return array
	 */
	public function get_notifications_with_formatted_content( $notifications ) {
		if ( ! is_array( $notifications ) || empty( $notifications ) ) {
			return $notifications;
		}

		foreach ( $notifications as $key => $notification ) {
			if ( ! empty( $notification['content'] ) ) {
				$notifications[ $key ]['content'] = wpautop( $notification['content'] );
				$notifications[ $key ]['content'] = apply_filters( 'wpcode_notification_content_display', $notifications[ $key ]['content'] );
			}
		}

		return $notifications;
	}

	/**
	 * Get notifications start time with human time difference
	 *
	 * @param array $notifications The array of notifications to convert.
	 *
	 * @return array
	 */
	public function get_notifications_with_human_readeable_start_time( $notifications ) {
		if ( ! is_array( $notifications ) || empty( $notifications ) ) {
			return array();
		}

		foreach ( $notifications as $key => $notification ) {
			if ( empty( $notification['start'] ) ) {
				continue;
			}

			// Translators: Human-Readable time to display.
			$modified_start_time            = sprintf( __( '%1$s ago', 'insert-headers-and-footers' ), human_time_diff( strtotime( $notification['start'] ), time() ) );
			$notifications[ $key ]['start'] = $modified_start_time;
		}

		return $notifications;
	}

	/**
	 * Get active notifications.
	 *
	 * @return array $notifications['active'] active notifications
	 */
	public function get_active_notifications() {
		$notifications = $this->get();

		// Show only 5 active notifications plus any that has a priority of 1.
		$all_active = isset( $notifications['active'] ) ? $notifications['active'] : array();
		$displayed  = array();

		foreach ( $all_active as $notification ) {
			if ( ( isset( $notification['priority'] ) && 1 === $notification['priority'] ) || count( $displayed ) < 5 ) {
				$displayed[] = $notification;
			}
		}

		return $displayed;
	}

	/**
	 * Get dismissed notifications.
	 *
	 * @return array $notifications['dismissed'] dismissed notifications
	 */
	public function get_dismissed_notifications() {
		$notifications = $this->get();

		return isset( $notifications['dismissed'] ) ? $notifications['dismissed'] : array();
	}

	/**
	 * Get notification count.
	 *
	 * @return int
	 */
	public function get_count() {
		return count( $this->get_active_notifications() );
	}

	/**
	 * Get the dismissed notifications count.
	 *
	 * @return int
	 */
	public function get_dismissed_count() {
		return count( $this->get_dismissed_notifications() );
	}

	/**
	 * Check if a notification has been dismissed before
	 *
	 * @param array $notification The notification to check if is dismissed.
	 *
	 * @return bool
	 */
	public function is_dismissed( $notification ) {
		if ( empty( $notification['id'] ) ) {
			return true;
		}

		$option = $this->get_option();

		foreach ( $option['dismissed'] as $item ) {
			if ( $item['id'] === $notification['id'] ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Add a manual notification event.
	 *
	 * @param array $notification Notification data.
	 */
	public function add( $notification ) {

		if ( empty( $notification['id'] ) || $this->is_dismissed( $notification ) ) {
			return false;
		}

		$option = $this->get_option();

		$current_notifications = $option['events'];

		foreach ( $current_notifications as $item ) {
			if ( $item['id'] === $notification['id'] ) {
				return false;
			}
		}

		$notification = $this->verify( array( $notification ) );

		$notifications = array_merge( $notification, $current_notifications );

		// Sort notifications by priority.
		usort(
			$notifications,
			function ( $a, $b ) {
				if ( ! isset( $a['priority'] ) || ! isset( $b['priority'] ) ) {
					return 0;
				}

				if ( $a['priority'] === $b['priority'] ) {
					return 0;
				}

				return $a['priority'] < $b['priority'] ? - 1 : 1;
			}
		);

		update_option(
			self::$option_name,
			array(
				'update'    => $option['update'],
				'feed'      => $option['feed'],
				'events'    => $notifications,
				'dismissed' => $option['dismissed'],
			),
			false
		);

		return true;
	}

	/**
	 * Update notification data from feed.
	 *
	 * @since {VERSION}
	 */
	public function update() {

		$feed   = $this->fetch_feed();
		$option = $this->get_option();

		update_option(
			self::$option_name,
			array(
				'update'    => time(),
				'feed'      => $feed,
				'events'    => $option['events'],
				'dismissed' => array_slice( $option['dismissed'], 0, 30 ), // Limit dismissed notifications to last 30.
			),
			false
		);
	}

	/**
	 * Dismiss notification via AJAX.
	 */
	public function dismiss() {
		// Run a security check.
		check_ajax_referer( 'wpcode_admin', 'nonce' );

		// Check for access and required param.
		if ( ! $this->has_access() || empty( $_POST['id'] ) ) {
			wp_send_json_error();
		}

		$id     = sanitize_text_field( wp_unslash( $_POST['id'] ) );
		$option = $this->get_option();

		// Dismiss all notifications and add them to dissmiss array.
		if ( 'all' === $id ) {
			if ( is_array( $option['feed'] ) && ! empty( $option['feed'] ) ) {
				foreach ( $option['feed'] as $key => $notification ) {
					array_unshift( $option['dismissed'], $notification );
					unset( $option['feed'][ $key ] );
				}
			}
			if ( is_array( $option['events'] ) && ! empty( $option['events'] ) ) {
				foreach ( $option['events'] as $key => $notification ) {
					array_unshift( $option['dismissed'], $notification );
					unset( $option['events'][ $key ] );
				}
			}
		}

		$type = is_numeric( $id ) ? 'feed' : 'events';

		// Remove notification and add in dismissed array.
		if ( is_array( $option[ $type ] ) && ! empty( $option[ $type ] ) ) {
			foreach ( $option[ $type ] as $key => $notification ) {
				if ( $notification['id'] == $id ) { // phpcs:ignore WordPress.PHP.StrictComparisons
					// Add notification to dismissed array.
					array_unshift( $option['dismissed'], $notification );
					// Remove notification from feed or events.
					unset( $option[ $type ][ $key ] );
					break;
				}
			}
		}

		update_option( self::$option_name, $option, false );

		wp_send_json_success();
	}

	/**
	 * Delete the notification options.
	 */
	public static function delete_notifications_data() {
		delete_option( self::$option_name );
	}

	/**
	 * Get the license type for the current plugin.
	 *
	 * @return string
	 */
	public function get_license_type() {
		return 'lite';
	}
}
includes/global-output.php000064400000003367151331545640011701 0ustar00<?php
/**
 * Add hooks to output global scripts.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

add_action( 'wp_head', 'wpcode_global_frontend_header' );
add_action( 'wp_footer', 'wpcode_global_frontend_footer' );
add_action( 'wp_body_open', 'wpcode_global_frontend_body', 1 );

/**
 * Output the frontend head scripts.
 *
 * @return void
 */
function wpcode_global_frontend_header() {
	// Filter to prevent specific header output.
	if ( apply_filters( 'disable_ihaf_header', false ) ) {
		return;
	}
	wpcode_global_script_output( 'ihaf_insert_header' );
}

/**
 * Output the frontend footer scripts.
 *
 * @return void
 */
function wpcode_global_frontend_footer() {
	// Filter to prevent specific footer output.
	if ( apply_filters( 'disable_ihaf_footer', false ) ) {
		return;
	}
	wpcode_global_script_output( 'ihaf_insert_footer' );
}

/**
 * Output the frontend body scripts.
 *
 * @return void
 */
function wpcode_global_frontend_body() {
	// Filter to prevent specific body output.
	if ( apply_filters( 'disable_ihaf_body', false ) ) {
		return;
	}
	wpcode_global_script_output( 'ihaf_insert_body' );
}

/**
 * Output everything through this function to get a chance to apply some checks.
 *
 * @param string $option_name The option name to grab data from.
 *
 * @return void
 */
function wpcode_global_script_output( $option_name ) {
	// Ignore admin, feed, robots or trackbacks.
	if ( is_admin() || is_feed() || is_robots() || is_trackback() ) {
		return;
	}
	// Filter to prevent any output.
	if ( apply_filters( 'disable_ihaf', false ) ) {
		return;
	}

	$code = get_option( $option_name );
	if ( empty( $code ) || empty( trim( $code ) ) ) {
		return;
	}

	echo wp_unslash( $code );  // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
includes/class-wpcode-library.php000064400000044474151331545640013135 0ustar00<?php
/**
 * Load snippets from the wpcode.com snippet library.
 *
 * @package WPCode
 */

/**
 * Class WPCode_Library.
 */
class WPCode_Library {

	/**
	 * Key for storing snippets in the cache.
	 *
	 * @var string
	 */
	protected $cache_key = 'snippets';

	/**
	 * Library endpoint for loading all data.
	 *
	 * @var string
	 */
	protected $all_snippets_endpoint = 'get';

	/**
	 * The key for storing individual snippets.
	 *
	 * @var string
	 */
	protected $snippet_key = 'snippets/snippet';

	/**
	 * The base cache folder for this class.
	 *
	 * @var string
	 */
	protected $cache_folder = 'library';

	/**
	 * The data.
	 *
	 * @var array
	 */
	protected $data;

	/**
	 * The default time to live for libary items that are cached.
	 *
	 * @var int
	 */
	protected $ttl = DAY_IN_SECONDS;

	/**
	 * Key for transient used to store already installed snippets.
	 *
	 * @var string
	 */
	protected $used_snippets_transient_key = 'wpcode_used_library_snippets';

	/**
	 * Array of snippet ids that were already loaded from the library.
	 *
	 * @var array
	 */
	protected $library_snippets;

	/**
	 * Meta Key used for storing the library id.
	 *
	 * @var string
	 */
	protected $snippet_library_id_meta_key = '_wpcode_library_id';

	/**
	 * Total number of snippets in the library atm.
	 *
	 * @var int
	 */
	protected $snippets_count;

	/**
	 * Snippets grouped by library username.
	 *
	 * @var array
	 */
	protected $snippets_by_username = array();

	/**
	 * Array of library usernames.
	 *
	 * @var array
	 */
	protected $library_usernames = array();

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->hooks();
	}

	/**
	 * Class-specific hooks.
	 *
	 * @return void
	 */
	protected function hooks() {
		add_action( 'trash_wpcode', array( $this, 'clear_used_snippets' ) );
		add_action( 'transition_post_status', array( $this, 'clear_used_snippets_untrash' ), 10, 3 );
		add_action( 'wpcode_library_api_auth_connected', array( $this, 'delete_cache' ) );
		add_action( 'wpcode_library_api_auth_connected', array( $this, 'get_data_delayed' ), 15 );
		add_action( 'wpcode_library_api_auth_deleted', array( $this, 'delete_cache' ) );
	}

	/**
	 * Wait for the file cache to be cleared before loading the data.
	 *
	 * @return void
	 */
	public function get_data_delayed() {

		// Wait for the cache to be cleared.
		add_action( 'shutdown', array( $this, 'get_data' ) );
	}

	/**
	 * Grab all the available categories from the library.
	 *
	 * @return array
	 */
	public function get_data() {
		if ( ! isset( $this->data ) ) {
			$this->data = $this->load_data();
		}

		return $this->data;
	}

	/**
	 * Get the number of snippets in the library.
	 *
	 * @return int
	 */
	public function get_snippets_count() {
		if ( ! isset( $this->snippets_count ) ) {
			$this->snippets_count = 0;
			$data                 = $this->get_data();
			if ( ! empty( $data['snippets'] ) ) {
				$this->snippets_count = count( $data['snippets'] );
			}
		}

		return $this->snippets_count;
	}

	/**
	 * Grab data from the cache.
	 *
	 * @param string $key The key used to grab from cache.
	 * @param int    $ttl The time to live for cached data, defaults to class ttl.
	 *
	 * @return array|false
	 */
	public function get_from_cache( $key, $ttl = 0 ) {
		if ( empty( $ttl ) ) {
			$ttl = $this->ttl;
		}

		$data = wpcode()->file_cache->get( $this->cache_folder . '/' . $key, $ttl );

		if ( isset( $data['error'] ) && isset( $data['time'] ) ) {
			if ( $data['time'] + 10 * MINUTE_IN_SECONDS < time() ) {
				return false;
			} else {
				return $this->get_empty_array();
			}
		}

		return $data;
	}

	/**
	 * Load the library data either from the server or from cache.
	 *
	 * @return array
	 */
	public function load_data() {
		$this->data = $this->get_from_cache( $this->cache_key );

		if ( false === $this->data ) {
			$this->data = $this->get_from_server();
		}

		$this->maybe_add_usernames_data();

		return $this->data;
	}


	/**
	 * Get data from the server.
	 *
	 * @return array
	 */
	protected function get_from_server() {
		$data = $this->process_response( $this->make_request( $this->all_snippets_endpoint ) );

		if ( empty( $data['snippets'] ) ) {
			return $this->save_temporary_response_fail( $this->cache_key );
		}

		$this->save_to_cache( $this->cache_key, $data );

		return $data;
	}

	/**
	 * Generic request handler with support for authentication.
	 *
	 * @param string $endpoint The API endpoint to load data from.
	 * @param string $method The method used for the request (GET, POST, etc).
	 * @param array  $data The data to pass in the body for POST-like requests.
	 *
	 * @return string
	 */
	public function make_request( $endpoint = '', $method = 'GET', $data = array() ) {
		$args = array(
			'method'  => $method,
			'timeout' => 10,
		);
		if ( wpcode()->library_auth->has_auth() ) {
			$args['headers'] = $this->get_authenticated_headers();
		}
		if ( ! empty( $data ) ) {
			$args['body'] = $data;
		}

		$url = add_query_arg(
			array(
				'site'    => rawurlencode( site_url() ),
				'version' => WPCODE_VERSION,
			),
			wpcode()->library_auth->get_api_url( $endpoint )
		);

		$response = wp_remote_request( $url, $args );

		$response_code = wp_remote_retrieve_response_code( $response );
		if ( $response_code > 299 ) {
			// Temporary error so cache for just 10 minutes and then try again.
			return '';
		}

		return wp_remote_retrieve_body( $response );
	}

	/**
	 * Get the headers for making an authenticated request.
	 *
	 * @return array
	 */
	public function get_authenticated_headers() {
		// Build the headers of the request.
		return array(
			'Content-Type'     => 'application/x-www-form-urlencoded',
			'Cache-Control'    => 'no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0',
			'Pragma'           => 'no-cache',
			'Expires'          => 0,
			'Origin'           => site_url(),
			'WPCode-Referer'   => site_url(),
			'WPCode-Sender'    => 'WordPress',
			'WPCode-Site'      => esc_attr( get_option( 'blogname' ) ),
			'WPCode-Version'   => esc_attr( WPCODE_VERSION ),
			'WPCode-Client-Id' => wpcode()->library_auth->get_client_id(),
			'X-WPCode-ApiKey'  => wpcode()->library_auth->get_auth_key(),
		);
	}

	/**
	 * When we can't fetch from the server we save a temporary error => true file to avoid
	 * subsequent requests for a while. Returns a properly formatted array for frontend output.
	 *
	 * @param string $key The key used for storing the data in the cache.
	 *
	 * @return array
	 */
	public function save_temporary_response_fail( $key ) {
		$data = array(
			'error' => true,
			'time'  => time(),
		);
		$this->save_to_cache( $key, $data );

		return $this->get_empty_array();
	}

	/**
	 * Get an empty array for a consistent response.
	 *
	 * @return array[]
	 */
	public function get_empty_array() {
		return array(
			'categories' => array(),
			'snippets'   => array(),
		);
	}

	/**
	 * Save to cache.
	 *
	 * @param string      $key The key used to store the data in the cache.
	 * @param array|mixed $data The data that will be stored.
	 *
	 * @return void
	 */
	public function save_to_cache( $key, $data ) {
		wpcode()->file_cache->set( $this->cache_folder . '/' . $key, $data );
	}

	/**
	 * Generic handler for grabbing data by slug. Either all categories or the category slug.
	 *
	 * @param string $data Response body from server.
	 *
	 * @return array
	 */
	public function process_response( $data ) {
		$response = json_decode( $data, true );
		if ( ! isset( $response['status'] ) || 'success' !== $response['status'] ) {
			return $this->get_empty_array();
		}

		return $response['data'];
	}

	/**
	 * Get a cache key for a specific snippet id.
	 *
	 * @param int $id The snippet id.
	 *
	 * @return string
	 */
	public function get_snippet_cache_key( $id ) {
		return $this->snippet_key . '_' . $id;
	}

	/**
	 * Create a new snippet by the library id.
	 * This grabs the snippet by its id from the snippet library site and creates
	 * a new snippet on the current site using the response.
	 *
	 * @param int $library_id The id of the snippet on the library site.
	 *
	 * @return false|WPCode_Snippet
	 */
	public function create_new_snippet( $library_id ) {

		$snippet_data = $this->grab_snippet_from_api( $library_id );

		if ( ! $snippet_data ) {
			return false;
		}

		$snippet_data = apply_filters( 'wpcode_library_import_snippet_data', $snippet_data );

		$snippet = wpcode_get_snippet( $snippet_data );

		$snippet->save();

		delete_transient( $this->used_snippets_transient_key );

		return $snippet;
	}

	/**
	 * Grab a snippet data from the API.
	 *
	 * @param int $library_id The id of the snippet in the Library api.
	 *
	 * @return array|array[]|false
	 */
	public function grab_snippet_from_api( $library_id ) {
		$snippet_request = $this->make_request( 'get/' . $library_id );
		$snippet_data    = $this->process_response( $snippet_request );

		if ( empty( $snippet_data ) ) {
			return false;
		}

		return $snippet_data;
	}

	/**
	 * Get all the snippets that were created from the library, by library ID.
	 * Results are cached in a transient.
	 *
	 * @return array
	 */
	public function get_used_library_snippets() {

		if ( isset( $this->library_snippets ) ) {
			return $this->library_snippets;
		}

		$snippets_from_library = get_transient( $this->used_snippets_transient_key );

		if ( false === $snippets_from_library ) {
			$snippets_from_library = array();

			$args     = array(
				'post_type'   => wpcode_get_post_type(),
				'meta_query'  => array( // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
					array(
						'key'     => $this->snippet_library_id_meta_key,
						'compare' => 'EXISTS',
					),
				),
				'fields'      => 'ids',
				'post_status' => 'any',
				'nopaging'    => true,
			);
			$snippets = get_posts( $args );

			foreach ( $snippets as $snippet_id ) {
				$snippets_from_library[ $this->get_snippet_library_id( $snippet_id ) ] = $snippet_id;
			}

			set_transient( $this->used_snippets_transient_key, $snippets_from_library );
		}

		$this->library_snippets = $snippets_from_library;

		return $this->library_snippets;

	}

	/**
	 * Grab the library id from the snippet by snippet id.
	 *
	 * @param int $snippet_id The snippet id.
	 *
	 * @return int
	 */
	public function get_snippet_library_id( $snippet_id ) {
		return absint( get_post_meta( $snippet_id, '_wpcode_library_id', true ) );
	}

	/**
	 * When a snippet is trashed, clear the used snippets transients
	 * for this class instance to avoid confusion in the library.
	 *
	 * @return void
	 */
	public function clear_used_snippets() {
		delete_transient( $this->used_snippets_transient_key );
	}

	/**
	 * Clear used snippets also when a snippet is un-trashed.
	 *
	 * @param string  $new_status The new post status.
	 * @param string  $old_status The old post status.
	 * @param WP_Post $post The post object.
	 *
	 * @return void
	 */
	public function clear_used_snippets_untrash( $new_status, $old_status, $post ) {
		if ( 'wpcode' !== $post->post_type || 'trash' !== $old_status ) {
			return;
		}

		$this->clear_used_snippets();
	}

	/**
	 * Delete the file cache for the snippets library.
	 *
	 * @return void
	 */
	public function delete_cache() {
		wpcode()->file_cache->delete( $this->cache_folder . '/' . $this->cache_key );
		if ( isset( $this->data ) ) {
			unset( $this->data );
		}
	}

	/**
	 * Makes a request to the snippet library API to grab a public snippet by its hash.
	 *
	 * @param string $hash The hash used to identify the snippet on the library server.
	 * @param string $auth The unique user hash used to authenticate the request on the library.
	 *
	 * @return array
	 */
	public function get_public_snippet( $hash, $auth ) {
		// Let's use transients for hashes to avoid unnecessary requests.
		$transient_key = 'wpcode_public_snippet_' . $hash . '_' . $auth;
		$snippet_data  = get_transient( $transient_key );
		if ( false === $snippet_data ) {
			$snippet_request = $this->make_request(
				'public/' . $hash,
				'POST',
				array(
					'auth' => $auth,
				)
			);
			$snippet_data    = json_decode( $snippet_request, true );
			// Transient for 1 minute if error otherwise 30 minutes.
			$timeout = ! isset( $snippet_data['status'] ) || 'error' === $snippet_data['status'] ? 60 : 30 * 60;
			set_transient( $transient_key, $snippet_data, $timeout );
		}

		return $snippet_data;
	}

	/**
	 * Get snippets by username.
	 *
	 * @param string $username The username to grab data for.
	 * @param string $version The version of the library to grab data for.
	 *
	 * @return array
	 */
	public function get_snippets_by_username( $username, $version = '' ) {

		$username = sanitize_key( $username );

		if ( empty( $version ) ) {
			// Let's grab the version from the registered username if no version is explicitly passed.
			$version = $this->get_version_by_username( $username );
		}

		if ( ! isset( $this->snippets_by_username[ $username ] ) ) {
			$this->load_snippets_by_username( $username, $version );
		}

		return $this->snippets_by_username[ $username ];
	}

	/**
	 * Grab the version from the registered username array.
	 *
	 * @param string $username The username to grab version for.
	 *
	 * @return string
	 */
	public function get_version_by_username( $username ) {
		return isset( $this->library_usernames[ $username ] ) ? $this->library_usernames[ $username ]['version'] : '';
	}

	/**
	 * Load snippets in the current instance, either from cache or from the server.
	 *
	 * @param string $username The username to grab data for.
	 * @param string $version The version of the plugin/theme to grab data for.
	 *
	 * @return array
	 */
	private function load_snippets_by_username( $username, $version ) {

		$this->snippets_by_username[ $username ] = $this->get_from_cache( 'profile_' . $username );

		if ( false === $this->snippets_by_username[ $username ] ) {
			$this->snippets_by_username[ $username ] = $this->get_from_server_by_username( $username );
		}

		// Let's filter the loaded data to make sure no snippets aimed at older versions are loaded.
		$this->snippets_by_username[ $username ] = $this->filter_snippets_by_version( $this->snippets_by_username[ $username ], $version );

		return $this->data;
	}

	/**
	 * Go through all the snippets and if they have a maximum version set, remove them if the current version is higher.
	 *
	 * @param array  $profile_data The snippets to filter.
	 * @param string $version The version to filter by.
	 *
	 * @return array
	 */
	public function filter_snippets_by_version( $profile_data, $version ) {
		// If we have no version, we can't filter anything.
		if ( empty( $version ) || empty( $profile_data['snippets'] ) ) {
			return $profile_data;
		}

		$filtered_snippets = array();
		foreach ( $profile_data['snippets'] as $snippet ) {
			if ( empty( $snippet['max_version'] ) || version_compare( $version, $snippet['max_version'], '<=' ) ) {
				$filtered_snippets[] = $snippet;
			}
		}

		$profile_data['snippets'] = $filtered_snippets;

		return $profile_data;
	}

	/**
	 * Grab data from the WPCode library by username.
	 *
	 * @param string $username The username to grab data for.
	 *
	 * @return array|array[]
	 */
	private function get_from_server_by_username( $username ) {
		$data = $this->process_response( $this->make_request( 'profile/' . $username ) );

		if ( empty( $data['snippets'] ) ) {
			return $this->save_temporary_response_fail( 'profile_' . $username );
		}

		$this->save_to_cache( 'profile_' . $username, $data );

		return $data;
	}

	/**
	 * Get a list of usernames that we should attempt to load data from the library for.
	 *
	 * @return array
	 */
	public function get_library_usernames() {
		return $this->library_usernames;
	}

	/**
	 * Add a method to allow other plugins to register usernames to load data for.
	 *
	 * @param string $username The public username on the WPCode Library.
	 * @param string $label The label to display in the WPCode library view.
	 * @param string $max_version The plugin/theme version, used for excluding snippets aimed at older plugin/theme versions.
	 *
	 * @return void
	 */
	public function register_library_username( $username, $label = '', $max_version = '' ) {
		$username = sanitize_key( $username );
		if ( empty( $label ) ) {
			$label = $username;
		}

		$this->library_usernames[ $username ] = array(
			'label'   => $label,
			'version' => $max_version,
		);
	}

	/**
	 * If there are usernames to load data for, add them to the data array.
	 *
	 * @return void
	 */
	public function maybe_add_usernames_data() {
		$usernames = $this->get_library_usernames();
		if ( empty( $usernames ) ) {
			return;
		}

		foreach ( $usernames as $username => $data ) {
			$snippets = $this->get_snippets_by_username( $username, $data['version'] );
			if ( ! empty( $snippets['snippets'] ) ) {
				$this->data['categories'][] = array(
					'slug'  => $username,
					'name'  => $data['label'],
					'count' => count( $snippets['snippets'] ),
				);
				// Append snippets to the $this->data['snippets'] array.
				$this->data['snippets'] = array_merge( $this->data['snippets'], $snippets['snippets'] );
			}
		}
	}

	/**
	 * Get the URL to edit a snippet.
	 *
	 * @param int $snippet_id The snippet id.
	 *
	 * @return string
	 */
	public function get_edit_snippet_url( $snippet_id ) {
		return add_query_arg(
			array(
				'page'       => 'wpcode-snippet-manager',
				'snippet_id' => absint( $snippet_id ),
			),
			admin_url( 'admin.php' )
		);
	}

	/**
	 * Get a direct link to install a snippet by its library URL.
	 *
	 * @param int $snippet_library_id The snippet ID on the WPCode library.
	 *
	 * @return string
	 */
	public function get_install_snippet_url( $snippet_library_id ) {
		return wp_nonce_url(
			add_query_arg(
				array(
					'snippet_library_id' => absint( $snippet_library_id ),
					'page'               => 'wpcode-library',
				),
				admin_url( 'admin.php' )
			),
			'wpcode_add_from_library'
		);
	}

	/**
	 * Get just the snippets from usernames.
	 *
	 * @return array
	 */
	public function get_username_snippets() {
		$usernames = $this->get_library_usernames();

		$snippets   = array();
		$categories = array();

		foreach ( $usernames as $username => $data ) {
			$username_snippets = $this->get_snippets_by_username( $username, $data['version'] );
			if ( ! empty( $username_snippets['snippets'] ) ) {
				$categories[] = array(
					'slug'  => $username,
					'name'  => $data['label'],
					'count' => count( $username_snippets['snippets'] ),
				);
				// Append snippets to the $this->data['snippets'] array.
				$snippets = array_merge( $snippets, $username_snippets['snippets'] );
			}
		}

		return array(
			'categories' => $categories,
			'snippets'   => $snippets,
		);
	}
}
includes/legacy.php000064400000001633151331545640010341 0ustar00<?php
/**
 * Call new methods using the old class for backwards compatibility.
 *
 * @package WPCode
 */

if ( ! class_exists( 'InsertHeadersAndFooters' ) ) {
	/**
	 * Class InsertHeadersAndFooters used in the IHAF 1.x.x.
	 */
	class InsertHeadersAndFooters {

		/**
		 * Output the header code.
		 *
		 * @return void
		 */
		public function frontendHeader() {// phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
			wpcode_global_frontend_header();
		}

		/**
		 * Output the footer code.
		 *
		 * @return void
		 */
		public function frontendFooter() {// phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
			wpcode_global_frontend_footer();
		}

		/**
		 * Output the body code.
		 *
		 * @return void
		 */
		public function frontendBody() {// phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
			wpcode_global_frontend_body();
		}

	}
}
includes/safe-mode.php000064400000010340151331545640010730 0ustar00<?php
/**
 * Safe mode query var logic.
 *
 * @package WPCode
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

add_action( 'plugins_loaded', 'wpcode_maybe_enable_safe_mode' );
add_filter( 'wpcode_do_auto_insert', 'wpcode_maybe_prevent_execution' );

/**
 * Simple check to see if we should be adding safe-mode logic.
 *
 * @return void
 */
function wpcode_maybe_enable_safe_mode() {
	if ( ! isset( $_GET['wpcode-safe-mode'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		return;
	}

	// If we're in safe mode, let's make sure all URLs keep the param until we are safe to get out.
	add_filter( 'home_url', 'wpcode_keep_safe_mode' );
	add_filter( 'admin_url', 'wpcode_keep_safe_mode' );
	add_filter( 'site_url', 'wpcode_keep_safe_mode_login', 10, 3 );
	// The admin menu doesn't offer a hook to change all the menu links so we do it with JS.
	add_action( 'admin_footer', 'wpcode_keep_safe_mode_admin_menu' );
	// Show a notice informing the user we're in safe mode and offer a way to get out.
	add_action( 'admin_notices', 'wpcode_safe_mode_notice' );
	add_action( 'wpcode_admin_notices', 'wpcode_safe_mode_notice' );
}

/**
 * Make sure the URL keeps the safe mode variable.
 *
 * @param string $url The home or admin base URL.
 *
 * @return string
 */
function wpcode_keep_safe_mode( $url ) {
	return add_query_arg( 'wpcode-safe-mode', 1, $url );
}

/**
 * Force safe mode to all URLs displayed in the admin so we can keep navigating
 * using safe mode as there's no hook in WP to change the main admin menu.
 *
 * @return void
 */
function wpcode_keep_safe_mode_admin_menu() {
	// There's no reliable way to filter all the admin menu links so we have to force them via JS.
	// There's also a notice being added to allow users to "exit" safe mode.
	?>
	<script type="text/javascript">
		[...document.querySelectorAll( 'a:not(.wpcode-safe-mode)' )].forEach( e => {
			const url = new URL( e.href );
			url.searchParams.set( 'wpcode-safe-mode', '1' );
			e.href = url.toString();
		} );
	</script>
	<?php
}

/**
 * Show a notice informing the user we're in safe mode and offer a way to get out.
 *
 * @return void
 */
function wpcode_safe_mode_notice() {
	?>
	<div class="notice notice-warning">
		<p><?php esc_html_e( 'WPCode is in Safe Mode which means no snippets are getting executed. Please disable any snippets that have caused errors and when done click the button below to exit safe mode.', 'insert-headers-and-footers' ); ?></p>
		<p><?php esc_html_e( 'The link will open in a new window so if you are still encountering issues you safely can return to this tab and make further adjustments', 'insert-headers-and-footers' ); ?></p>
		<p>
			<a class="button button-secondary wpcode-safe-mode" href="<?php echo esc_url( remove_query_arg( 'wpcode-safe-mode' ) ); ?>" target="_blank"><?php esc_html_e( 'Exit safe mode', 'insert-headers-and-footers' ); ?></a>
		</p>
	</div>
	<?php
}

/**
 * Let's check if we're in the admin or if the current user can manage
 * snippets before allowing them to see the site with snippets disabled.
 *
 * @param bool $execute Execute snippets or not.
 *
 * @return mixed
 */
function wpcode_maybe_prevent_execution( $execute ) {
	if ( ! isset( $_GET['wpcode-safe-mode'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
		return $execute;
	}

	if ( wpcode_is_wplogin() || current_user_can( 'wpcode_activate_snippets' ) ) {
		return false;
	}

	return $execute;
}

/**
 * Checks schema passed to site_url and adds the safe mode query param
 * so we can login using safe mode.
 *
 * @param string $url The site_url already processed.
 * @param string $path The path that was added to the URL.
 * @param string $scheme The scheme that was requested.
 *
 * @return string
 */
function wpcode_keep_safe_mode_login( $url, $path, $scheme ) {
	if ( 'login_post' !== $scheme ) {
		return $url;
	}

	return add_query_arg( 'wpcode-safe-mode', 1, $url );
}

/**
 * Helper function that checks if we are on the login screen
 * to allow admins to attempt to log in and disable snippets
 * without having to edit code.
 *
 * @return bool
 */
function wpcode_is_wplogin() {
	if ( empty( $_SERVER['REQUEST_URI'] ) ) {
		return false;
	}

	return false !== stripos( esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ), strrchr( wp_login_url(), '/' ) );
}
includes/class-wpcode-snippet-execute.php000064400000050726151331545640014610 0ustar00<?php
/**
 * Global class used to execute code across the plugin.
 *
 * @package WPCode
 */

/**
 * WPCode_Snippet_Execute class.
 */
class WPCode_Snippet_Execute {

	/**
	 * Simply mark this as true when activating a snippet
	 * to display the proper custom error message.
	 *
	 * @var bool
	 */
	private $doing_activation = false;

	/**
	 *  The type of executors.
	 *
	 * @var array
	 */
	public $types;

	/**
	 * The snippet types info with labels and descriptions.
	 *
	 * @var array
	 */
	public $types_labels;

	/**
	 * The snippet executed right now, for error handling.
	 *
	 * @var WPCode_Snippet
	 */
	public $snippet_executed;
	/**
	 * Store snippet types by id for already looked-up snippets
	 * to reduce the number of queries.
	 *
	 * @var array
	 */
	private $snippet_types = array();

	/**
	 * Store the line reference for each snippet.
	 *
	 * @var array
	 */
	private $line_reference = array();

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->add_error_handling();
		$this->load_types();
	}

	/**
	 * Register custom error handling functions.
	 *
	 * @return void
	 */
	public function add_error_handling() {
		// Register our custom error catcher.
		register_shutdown_function( array( $this, 'maybe_disable_snippet' ) );
		// Customize WP error message.
		add_filter( 'wp_php_error_message', array( $this, 'custom_error_message' ), 15, 2 );
		add_filter( 'wpcode_snippet_output_php', array( $this, 'dont_load_edited_snippet' ), 10, 2 );
	}

	/**
	 * Load the classes and options available for executing code.
	 *
	 * @return void
	 */
	public function load_types() {
		require_once WPCODE_PLUGIN_PATH . 'includes/execute/class-wpcode-snippet-execute-type.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/execute/class-wpcode-snippet-execute-html.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/execute/class-wpcode-snippet-execute-text.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/execute/class-wpcode-snippet-execute-js.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/execute/class-wpcode-snippet-execute-php.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/execute/class-wpcode-snippet-execute-universal.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/execute/class-wpcode-snippet-execute-css.php';

		$this->types = array(
			'html'      => array(
				'class' => 'WPCode_Snippet_Execute_HTML',
			),
			'text'      => array(
				'class' => 'WPCode_Snippet_Execute_Text',
			),
			'blocks'    => array(
				'class'  => 'WPCode_Snippet_Execute_Blocks',
				'is_pro' => true,
			),
			'css'       => array(
				'class' => 'WPCode_Snippet_Execute_CSS',
			),
			'scss'      => array(
				'class'  => 'WPCode_Snippet_Execute_SCSS',
				'is_pro' => true,
			),
			'js'        => array(
				'class' => 'WPCode_Snippet_Execute_JS',
			),
			'php'       => array(
				'class' => 'WPCode_Snippet_Execute_PHP',
			),
			'universal' => array(
				'class' => 'WPCode_Snippet_Execute_Universal',
			),
		);
	}

	/**
	 * Load the snippet types on demand.
	 *
	 * @return void
	 */
	public function load_snippet_types_on_demand() {
		$this->types = array(
			'html'      => array(
				'class'        => 'WPCode_Snippet_Execute_HTML',
				'filter_label' => 'HTML',
				'label'        => __( 'HTML Snippet', 'insert-headers-and-footers' ),
				'description'  => __( 'Easily insert scripts from other sites or build custom elements using HTML.', 'insert-headers-and-footers' ),
				// Don't want to instantiate the class until it's needed and we need this to be translatable.
			),
			'text'      => array(
				'class'        => 'WPCode_Snippet_Execute_Text',
				'filter_label' => 'Text',
				'label'        => __( 'Text Snippet', 'insert-headers-and-footers' ),
				'description'  => __( 'Create reusable text snippets that you can visually format in a familiar editor.', 'insert-headers-and-footers' ),
			),
			'blocks'    => array(
				'class'        => 'WPCode_Snippet_Execute_Blocks',
				'filter_label' => 'Blocks',
				'label'        => __( 'Blocks Snippet (PRO)', 'insert-headers-and-footers' ),
				'is_pro'       => true,
				'description'  => __( 'Use the Block Editor to create components that you can insert anywhere in your site.', 'insert-headers-and-footers' ),
			),
			'css'       => array(
				'class'        => 'WPCode_Snippet_Execute_CSS',
				'filter_label' => 'CSS',
				'label'        => __( 'CSS Snippet', 'insert-headers-and-footers' ),
				'description'  => __( 'Write CSS styles directly in WPCode and easily customize how your website looks.', 'insert-headers-and-footers' ),
			),
			'scss'      => array(
				'class'        => 'WPCode_Snippet_Execute_SCSS',
				'filter_label' => 'SCSS',
				'label'        => __( 'SCSS Snippet (PRO)', 'insert-headers-and-footers' ),
				'is_pro'       => true,
				'description'  => __( 'Write SCSS styles directly in WPCode and easily customize how your website looks.', 'insert-headers-and-footers' ),
			),
			'js'        => array(
				'class'        => 'WPCode_Snippet_Execute_JS',
				'filter_label' => 'JavaScript',
				'label'        => __( 'JavaScript Snippet', 'insert-headers-and-footers' ),
				'description'  => __( 'Add custom JavaScript code to your site to add interactivity or integrate with other services.', 'insert-headers-and-footers' ),
			),
			'php'       => array(
				'class'        => 'WPCode_Snippet_Execute_PHP',
				'filter_label' => 'PHP',
				'label'        => __( 'PHP Snippet', 'insert-headers-and-footers' ),
				'description'  => __( 'Extend or add functionality using PHP code with full control on where it\'s executed', 'insert-headers-and-footers' ),
			),
			'universal' => array(
				'class'        => 'WPCode_Snippet_Execute_Universal',
				'filter_label' => 'Universal',
				'label'        => __( 'Universal Snippet', 'insert-headers-and-footers' ),
				'description'  => __( 'Start writing HTML and add PHP code like you would in a .php file with Universal snippets.', 'insert-headers-and-footers' ),
			),
		);

		$this->types_labels = true;
	}

	/**
	 * Gets passed a snippet WP_Post or id and returns the processed output.
	 *
	 * @param int|WP_Post|WPCode_Snippet $snippet The snippet id or post object.
	 *
	 * @return string
	 */
	public function get_snippet_output( $snippet ) {
		// If we're in headers & footers mode prevent execution of any type of snippet.
		if ( WPCode()->settings->get_option( 'headers_footers_mode' ) ) {
			return '';
		}
		if ( ! $snippet instanceof WPCode_Snippet ) {
			$snippet = new WPCode_Snippet( $snippet );
		}
		$type  = $snippet->get_code_type();
		$class = $this->get_type_execute_class( $type );

		if ( $class && class_exists( $class ) ) {
			$execute_instance = new $class( $snippet );

			/**
			 * Adding comment for convenience.
			 *
			 * @var WPCode_Snippet_Execute_Type $execute_instance
			 */
			return $execute_instance->get_output();
		}

		// If we can't find the type class for some reason just return empty.
		return '';
	}

	/**
	 * Find the execution type class and returns its name.
	 *
	 * @param string $type The type of code to get the executor for.
	 *
	 * @return string|false
	 */
	public function get_type_execute_class( $type ) {
		$types = $this->get_types();

		if ( isset( $types[ $type ] ) ) {
			return $types[ $type ]['class'];
		}

		return false;
	}

	/**
	 * Get the types of executors.
	 *
	 * @return array
	 */
	public function get_types() {
		if ( ! isset( $this->types_labels ) && did_action( 'init' ) ) {
			$this->load_snippet_types_on_demand();
		}

		return $this->types;
	}

	/**
	 * Get a label from the term slug.
	 *
	 * @param string $type The code type slug.
	 *
	 * @return string
	 */
	public function get_type_label( $type ) {
		$options = $this->get_options();

		return isset( $options[ $type ] ) ? $options[ $type ] : '';
	}

	/**
	 * Grab the options with labels, for display in admin.
	 *
	 * @return array
	 */
	public function get_options() {
		$options = array();
		$types   = $this->get_types();
		foreach ( $types as $type_key => $type_values ) {
			$options[ $type_key ] = $type_values['label'];
		}

		return apply_filters( 'wpcode_code_type_options', $options );
	}

	/**
	 * Get the code types info with labels and descriptions.
	 *
	 * @return array
	 */
	public function get_code_types() {
		$code_types = array();
		$types      = $this->get_types();
		foreach ( $types as $type_key => $type_values ) {
			$code_types[ $type_key ] = array(
				'label'       => $type_values['label'],
				'description' => $type_values['description'],
			);
		}

		return apply_filters( 'wpcode_code_types_for_display', $code_types );
	}

	/**
	 * Get editor options for all code types.
	 *
	 * @return array
	 */
	public function get_code_type_options() {
		$types   = $this->get_options();
		$options = array();
		foreach ( $types as $type => $label ) {
			$options[ $type ] = array(
				'mime' => $this->get_mime_for_code_type( $type ),
				'lint' => $this->code_type_has_lint( $type ),
			);
		}

		return $options;
	}

	/**
	 * Convert generic code type to MIME used by CodeMirror.
	 *
	 * @param string $code_type The code type (php,js,html,etc).
	 *
	 * @return string
	 */
	public function get_mime_for_code_type( $code_type ) {
		$mime = 'text/html';
		if ( ! empty( $code_type ) ) {
			switch ( $code_type ) {
				case 'php':
					$mime = 'application/x-httpd-php-open';
					break;
				case 'universal':
					$mime = 'application/x-httpd-php';
					break;
				case 'js':
					$mime = 'text/javascript';
					break;
				case 'text':
					$mime = 'text/x-markdown';
					break;
				case 'css':
					$mime = 'text/css';
					break;
				case 'scss':
					$mime = 'text/x-scss';
					break;
			}
		}

		return $mime;
	}

	/**
	 * Check if the code type supports linting in CodeMirror.
	 *
	 * @param string $code_type The code type slug.
	 *
	 * @return bool
	 */
	public function code_type_has_lint( $code_type = '' ) {
		if ( empty( $code_type ) ) {
			$code_type = isset( $this->code_type ) ? $this->code_type : '';
		}
		$types_with_lint = array(
			'html',
			'js',
		);

		return in_array( $code_type, $types_with_lint, true );
	}

	/**
	 * Execute the PHP code in a single place.
	 *
	 * @param string         $code The code to execute.
	 * @param WPCode_Snippet $snippet The snippet object (optional) so we deactivate it to prevent the same error.
	 * @param array          $line_reference The line reference for the error.
	 *
	 * @return false|string
	 */
	public function safe_execute_php( $code, $snippet = null, $line_reference = array() ) {

		if ( isset( $snippet ) ) {
			$this->snippet_executed = $snippet;
		}

		// Catch any output from running the code.
		ob_start();

		$error = false;

		// Don't allow executing suspicious code.
		if ( self::is_code_not_allowed( $code ) ) {
			$code = '';
		}

		$this->line_reference = $line_reference;

		try {
			$this->run_eval( $code );
		} catch ( Error $e ) {
			$error = array(
				'message' => $e->getMessage(),
				'line'    => $e->getLine(),
			);
		}

		if ( $error ) {
			$this->maybe_disable_snippet( $error );
		}

		return ob_get_clean();
	}

	/**
	 * Execute the code in a separate method to avoid overriding variable names but still being able to catch errors.
	 *
	 * @param string $code The code to execute.
	 *
	 * @return void
	 */
	public function run_eval( $code ) {
		if ( ! empty( $this->snippet_executed->attributes ) ) {
			extract( $this->snippet_executed->attributes, EXTR_SKIP ); // phpcs:ignore WordPress.PHP.DontExtract.extract_extract
		}
		eval( $code ); // phpcs:ignore Generic.PHP.ForbiddenFunctions.Found
	}

	/**
	 * Callback for register_shutdown_function that checks if the error was thrown by this class
	 * and if so, it disables the last snippet that was executed so that the site continues to run
	 * correctly.
	 *
	 * @param array|null $error The error object.
	 *
	 * @return void
	 */
	public function maybe_disable_snippet( $error = null ) {
		if ( is_null( $error ) ) {
			$error = error_get_last();
		}

		$deactivated = false;

		$error['wpc_type']         = 'error';
		$error['doing_activation'] = $this->is_doing_activation();

		if ( $this->is_error_from_wpcode( $error ) || $this->is_doing_activation() ) {
			// Let's see if we have a line reference stored and the error has a line number.
			if ( ! empty( $error['line'] ) ) {
				$snippet_data = $this->find_snippet_from_line( $error['line'] );
				if ( ! empty( $snippet_data ) ) {
					/**
					 * Added for convenience.
					 *
					 * @var WPCode_Snippet $snippet
					 */
					$snippet             = $snippet_data['snippet'];
					$error_line          = $snippet_data['line'];
					$error['snippet']    = $snippet;
					$error['error_line'] = $error_line;
					// Let's try to determine on which page we are and potentially save that URL in the error details.
					global $wp;
					if ( isset( $wp->query_vars ) && isset( $wp->request ) ) {
						$error['url'] = add_query_arg( $wp->query_vars, home_url( $wp->request ) );
					}
					if ( $this->snippet_location_disable( $snippet ) && $this->should_auto_disable() ) {
						$snippet->force_deactivate();
						$deactivated       = true;
						$error['wpc_type'] = 'deactivated';
					}
				}
			}

			if ( ! $deactivated ) {
				// Check if we should deactivate the last snippet executed.
				if ( isset( $this->snippet_executed ) && $this->snippet_location_disable( $this->snippet_executed ) && $this->should_auto_disable() ) {
					$this->snippet_executed->force_deactivate();
					$error['snippet']  = $this->snippet_executed;
					$error['wpc_type'] = 'deactivated';
				}
			}

			wpcode()->error->add_error( $error );
		}
	}

	/**
	 * Check if the snippet is in a location that might potentially be auto disabled.
	 *
	 * @param WPCode_Snippet $snippet The snippet object.
	 *
	 * @return bool
	 */
	public function snippet_location_disable( $snippet ) {
		return in_array( $snippet->get_location(), $this->get_locations_to_auto_disable(), true );
	}

	/**
	 * Find the snippet that caused the error based on the line number of the error.
	 *
	 * @param int $line The line number of the error.
	 *
	 * @return array|false
	 */
	public function find_snippet_from_line( $line ) {
		if ( empty( $this->line_reference ) ) {
			return false;
		}
		foreach ( $this->line_reference as $snippet_id => $lines ) {
			if ( $lines['start'] <= $line && $lines['end'] >= $line ) {
				// If we have a match, let's deactivate that snippet.
				$snippet    = new WPCode_Snippet( $snippet_id );
				$error_line = $line - $lines['start'] + 1;

				return array(
					'snippet' => $snippet,
					'line'    => $error_line,
				);
			}
		}

		return false;
	}

	/**
	 * Get an error object (from error_get_last) and check if it originated in the WPCode eval function.
	 *
	 * @param array $error The error array.
	 *
	 * @return bool
	 * @see error_get_last()
	 */
	public function is_error_from_wpcode( $error ) {
		if ( isset( $error['type'] ) && E_NOTICE === $error['type'] ) {
			// If it's a notice let's let it be.
			return false;
		}
		if ( $error && isset( $error['message'] ) && isset( $error['file'] ) ) {
			// Let's see if the error originated in the code executed from a snippet.
			$pattern = '/\bwpcode-snippet-execute\.php\b(.*)\beval\b/m';
			if ( preg_match( $pattern, $error['message'] ) || preg_match( $pattern, $error['file'] ) ) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Display a custom error message (not the WP default one) for fatal errors thrown
	 * when trying to activate snippets via AJAX. Only if the error is thrown in the eval code from WPCode.
	 *
	 * @param string $message The error message to be displayed (HTML).
	 * @param array  $error The error object from error_get_last.
	 *
	 * @return string
	 */
	public function custom_error_message( $message, $error ) {
		// If the error is not related to our plugin don't do anything.
		if ( ! $this->is_error_from_wpcode( $error ) ) {
			return $message;
		}
		// If we're not in the admin or the current user can't update snippets just let WP handle the error message.
		if ( ! is_admin() || ! current_user_can( 'wpcode_edit_snippets' ) ) {
			return $message;
		}

		$doing_ajax = defined( 'DOING_AJAX' ) && DOING_AJAX;

		if ( $this->is_doing_activation() ) {
			$message = sprintf( '<p>%s</p>', __( 'Snippet has not been activated due to an error.', 'insert-headers-and-footers' ) );

			if ( ! $doing_ajax ) {
				// Not doing ajax let's ask them to go back.
				$message .= '<p>' . __( 'Please click the back button in the browser to update the snippet.', 'insert-headers-and-footers' ) . '</p>';
			}
		} else {
			$message = sprintf( '<p>%s</p>', __( 'WPCode has detected an error in one of the snippets which has now been automatically deactivated.', 'insert-headers-and-footers' ) );
		}

		if ( ! $doing_ajax ) {
			$message .= '<p>';
			if ( ! empty( $this->snippet_executed ) ) {
				$deactivated_snippets_link = add_query_arg(
					array(
						'page' => 'wpcode',
						'view' => 'has_error',
					),
					admin_url( 'admin.php' )
				);

				$message .= '<a href="' . esc_url( $deactivated_snippets_link ) . '" class="button button-primary">' . __( 'View Snippets With Errors', 'insert-headers-and-footers' ) . '</a>&nbsp;';
			}

			if ( ! $this->is_doing_activation() ) {

				if ( wpcode()->settings->get_option( 'error_logging' ) ) {
					$url = add_query_arg(
						array(
							'page' => 'wpcode-tools',
							'view' => 'logs',
						),
						admin_url( 'admin.php' )
					);

					$message .= '<a href="' . esc_url( $url ) . '" class="button" target="_blank">' . __( 'View error logs', 'insert-headers-and-footers' ) . '</a>';
				} else {
					$url = add_query_arg(
						array(
							'page' => 'wpcode-settings',
						),
						admin_url( 'admin.php' )
					);

					$message .= '<a href="' . esc_url( $url ) . '" class="button" target="_blank">' . __( 'Enable error logging', 'insert-headers-and-footers' ) . '</a>';
				}
			}
			$message .= '</p>';
		}

		$message .= sprintf( '<p>%s</p>', __( 'Error message:', 'insert-headers-and-footers' ) );
		$message .= sprintf( '<code>%s</code>', $error['message'] );

		return $message;
	}

	/**
	 * Mark as doing activation.
	 *
	 * @return void
	 */
	public function doing_activation() {
		$this->doing_activation = true;
	}

	/**
	 * Check if we are in the middle of activating a snippet.
	 * Used for choosing the type of custom error message to display.
	 *
	 * @return bool
	 */
	public function is_doing_activation() {
		return $this->doing_activation;
	}

	/**
	 * Mark as finished activation.
	 *
	 * @return void
	 */
	public function not_doing_activation() {
		$this->doing_activation = false;
	}

	/**
	 * Check if a code type is marked as pro.
	 *
	 * @param string $key The key of the type to check.
	 *
	 * @return bool
	 */
	public function is_type_pro( $key ) {
		$types = $this->get_types();
		// Find type by key in the list of types.
		$pro_types = wp_list_filter( $types, array( 'is_pro' => true ) );
		if ( isset( $pro_types[ $key ] ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Get the list of locations where snippets can be automatically disabled.
	 *
	 * @return array
	 */
	public function get_locations_to_auto_disable() {
		// Use this filter to add locations where the snippet should be auto disabled or disable auto-disable.
		return apply_filters(
			'wpcode_error_locations_auto_disable',
			array(
				'everywhere',
				'admin_only',
			)
		);
	}

	/**
	 * Check if we should auto disable snippets on the frontend.
	 *
	 * @return bool
	 */
	public function should_auto_disable() {
		return apply_filters(
			'wpcode_auto_disable_frontend',
			is_admin()
		);
	}

	/**
	 * Add a method to detect suspicious code.
	 *
	 * @param string $code The code to check.
	 *
	 * @return bool
	 */
	public static function is_code_not_allowed( $code ) {
		if ( preg_match_all( '/(base64_decode|error_reporting|ini_set|eval)\s*\(/i', $code, $matches ) ) {
			if ( count( $matches[0] ) > 5 ) {
				return true;
			}
		}
		if ( preg_match( '/dns_get_record/i', $code ) ) {
			return true;
		}

		return false;
	}

	/**
	 * Callback for the wpcode_snippet_output_php filter to prevent loading the edited snippet.
	 * This allows us to run actual checks on the code without throwing function redeclare errors or similar
	 * by executing the same code twice.
	 *
	 * @param string         $code The code to be output.
	 * @param WPCode_Snippet $snippet The snippet object.
	 *
	 * @return string
	 */
	public function dont_load_edited_snippet( $code, $snippet ) {
		if ( ! is_admin() ) {
			return $code;
		}
		if ( ! isset( $_POST['wpcode-save-snippet-nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['wpcode-save-snippet-nonce'] ), 'wpcode-save-snippet' ) ) {
			return $code;
		}
		// Let's check if $_REQUEST['id'] matches the snippet id.
		if ( ! isset( $_REQUEST['id'] ) || absint( $_REQUEST['id'] ) !== $snippet->get_id() ) {
			return $code;
		}

		return '';
	}
}
includes/class-wpcode-auto-insert.php000064400000007151151331545640013732 0ustar00<?php
/**
 * Central handler of auto-inserting snippets.
 * Loads the different types and processes them.
 *
 * @package WPCode
 */

/**
 * Class WPCode_Auto_Insert.
 */
class WPCode_Auto_Insert {

	/**
	 * The auto-insert types.
	 *
	 * @var array
	 */
	public $types = array();

	/**
	 * The auto-insert categories.
	 *
	 * @var array
	 */
	public $type_categories = array();

	public $categories_with_labels;

	/**
	 * Constructor.
	 */
	public function __construct() {
		$this->hooks();
	}

	/**
	 * Add hooks.
	 *
	 * @return void
	 */
	private function hooks() {
		add_action( 'plugins_loaded', array( $this, 'load_types' ), 1 );
	}

	/**
	 * Define the categories of auto-insert types.
	 *
	 * @return void
	 */
	public function define_category_label() {
		$categories_labels = array(
			'global'    => __( 'Global', 'insert-headers-and-footers' ),
			'page'      => __( 'Page-Specific', 'insert-headers-and-footers' ),
			'ecommerce' => __( 'eCommerce', 'insert-headers-and-footers' ),
		);

		// Add the labels to the $this->type_categories array.
		foreach ( $categories_labels as $key => $category ) {
			$this->type_categories[ $key ]['label'] = $category;
		}

		$this->categories_with_labels = true;
	}

	/**
	 * Load and initialize the different types of auto-insert types.
	 *
	 * @return void
	 */
	public function load_types() {
		require_once WPCODE_PLUGIN_PATH . 'includes/auto-insert/class-wpcode-auto-insert-type.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/auto-insert/class-wpcode-auto-insert-everywhere.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/auto-insert/class-wpcode-auto-insert-site-wide.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/auto-insert/class-wpcode-auto-insert-single.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/auto-insert/class-wpcode-auto-insert-archive.php';
		require_once WPCODE_PLUGIN_PATH . 'includes/auto-insert/class-wpcode-auto-insert-admin.php';
	}

	/**
	 * Register an auto-insert type.
	 *
	 * @param WPCode_Auto_Insert_Type $type The type to add to the available types.
	 *
	 * @return void
	 */
	public function register_type( $type ) {
		$this->types[ $type->name ] = $type;
		if ( isset( $type->category ) ) {
			$this->type_categories[ $type->category ]['types'][ $type->name ] = $type;
		}
	}

	/**
	 * Get the types of auto-insert options.
	 *
	 * @return WPCode_Auto_Insert_Type[]
	 */
	public function get_types() {
		return $this->types;
	}

	/**
	 * Get the categories of auto-insert options.
	 *
	 * @return array
	 */
	public function get_type_categories() {
		if ( ! isset( $this->categories_with_labels ) ) {
			$this->define_category_label();
		}

		return $this->type_categories;
	}

	/**
	 * Get the categories info for the sidebar admin view.
	 *
	 * @return array
	 */
	public function get_type_categories_for_sidebar() {
		$sidebar_categories = array();
		$categories         = $this->get_type_categories();

		foreach ( $categories as $key => $category ) {
			$sidebar_categories[] = array(
				'slug' => $key,
				'name' => $category['label'],
			);
		}

		return $sidebar_categories;
	}

	/**
	 * Get a location label from the class not the term.
	 *
	 * @param string $location The location slug/name.
	 *
	 * @return string
	 */
	public function get_location_label( $location ) {
		foreach ( $this->types as $type ) {
			/**
			 * Added for convenience.
			 *
			 * @var WPCode_Auto_Insert_Type $type
			 */
			$locations = $type->get_locations();
			if ( isset( $locations[ $location ] ) ) {
				if ( isset( $locations[ $location ]['label'] ) ) {
					return $locations[ $location ]['label'];
				} else {
					return $locations[ $location ];
				}
			}
		}

		return '';
	}
}
includes/pluggable.php000064400000001220151331545640011027 0ustar00<?php
/**
 * Pluggable functions for WPCode.
 *
 * @package WPCode
 * @since 2.1.9
 */

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

if ( ! function_exists( 'wpcode_get_snippet' ) ) {
	/**
	 * Load a snippet by id, WP_Post or array.
	 *
	 * @param array|int|WP_Post $snippet Load a snippet by id, WP_Post or array.
	 *
	 * @return WPCode_Snippet
	 */
	function wpcode_get_snippet( $snippet ) {
		return new WPCode_Snippet( $snippet );
	}
}

if ( ! function_exists( 'wpcode_get_post_type' ) ) {
	/**
	 * Get the post type we use for snippets.
	 *
	 * @return string
	 */
	function wpcode_get_post_type() {
		return 'wpcode';
	}
}
readme.txt000064400000061357151331545640006565 0ustar00=== WPCode - Insert Headers and Footers + Custom Code Snippets - WordPress Code Manager ===
Contributors: WPbeginner, smub, gripgrip, wpcodeteam
Tags: code, css, php, header, code snippets
Requires at least: 4.6
Tested up to: 6.7
Requires PHP: 5.5
Stable tag: 2.2.6
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html

Easily add code snippets in WordPress. Insert header & footer scripts, add PHP code snippets with conditional logic, insert ads pixel code, and more.


== Description ==

= Insert Headers & Footers + Full WordPress Code Snippets Plugin =

[WPCode](https://wpcode.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) (formerly known as Insert Headers and Footers by WPBeginner) is the most popular code snippets plugin for WordPress used by over 2 million websites.

We make it easy for you to add code snippets in WordPress without having to edit your theme's functions.php file.

Our simple insert headers and footers interface allows you to insert code like Google Analytics, custom CSS, Facebook Pixel, and more to your WordPress site's header and footer as well other areas of your website. No need to edit your theme files!

Aside from Header and Footer scripts, you can also use WPCode to insert custom PHP code snippets, JavaScript code snippets, CSS code snippets, HTML code snippets, and text snippets with full conditional logic support.

We took the pain out of adding custom code snippets in WordPress and made it easy.

> I have been using Insert Headers and Footers and it is such a useful tool. Super helpful and the very best of its kind. Highly recommend
> The_Gibble - WordPress user

= Quick Overview of WPCode from WPBeginner =

https://www.youtube.com/watch?v=Fo-7MKRRUec

> <strong>Introducing New WPCode Pro</strong><br />
> While WPCode Lite offers tons of powerful features for free, we listened to user feedback and created WPCode Pro with even more amazing features to improve your workflow. This includes smart conditional logic, saving code snippets to cloud library, code revisions, page-specific snippets, deeper integration with popular plugins like WooCommerce, Easy Digital Downloads, and so much more. [Click here to purchase the best premium WordPress code snippet plugin now!](https://wpcode.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin)

= Future Proof Code Snippet Management =

Most [WordPress tutorial websites](https://www.wpbeginner.com/category/wp-tutorials/) ask you to add code snippets to your theme's functions.php file. This makes managing code snippets messy, and it also prevents you from updating your theme.

If you ever update your theme or switch to another theme, then you will lose all custom code functions that you added in your functions.php file.

WPCode solves this by providing you an easy way to insert header and footer scripts along with other code snippets directly from your WordPress dashboard. These code snippets actually run as if they were in your theme's functions.php file.

Our smart code snippet validation helps you prevent common code errors to ensure you never break your website when adding code snippets or header and footer scripts.

<strong>New WPCode Cloud Library</strong> even allows you to store all your custom code snippets in a cloud library, so you can easily re-use code snippets across multiple website projects and save time. You can keep your code snippets completely private or [share it with the community](https://library.wpcode.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin) to give back while boosting your social profile.

> This plugin allows me to not only add things to my site whenever needed, but it takes me only seconds to accomplish it.
> David Weber - WordPress user

= Full Code Snippets Library and Code Generators =

Ever wanted a central place to find all the most popular WordPress code snippets that are tested and proven to work?

When we started Insert Headers and Footers plugin, we did too. So we built a WordPress code snippets library right inside the WPCode plugin.

You will find verified PHP code snippets for popular feature requests like disable REST API, disable XML-RPC, disable comments, allow SVG file uploads, disable Gutenberg, add Classic Editor, and more without installing separate plugins for each.

> I was very hesitant to get into any of the code for my website. Your plugin made it easy for me to do.
> Conbrio75 - WordPress user

We also built the ability to save your code snippets to [WPCode Cloud Library](https://library.wpcode.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin), so you can easily re-use it on your other websites, client projects, or even share it with the larger community.

WPCode Cloud Library helps you better organize your code snippets in one central location, so you can save more time and speed up your workflow when managing websites. No more wasting time looking for custom notes or Github gists.

Aside from our growing code snippets library, we also have WordPress code generators to help you quickly get ready-to-use custom code using the latest WordPress coding standards and API's.

= Conditional Logic for Code Snippets + Code Insertion Priority =

Our goal with WPCode was to create a WordPress code snippets plugin that's both EASY and POWERFUL.

That's why aside from our global header and footer scripts, we added advanced features like conditional logic for code snippets and made it easy.

Instead of learning WordPress conditional logic queries, you can use our beginner-friendly conditional logic user interface to:

* Load code snippets for logged in users only
* Load PHP code snippets for specific user roles
* Load PHP code snippets only on specific page URLs
* Insert header and footer pixel scripts on specific pages
* Show code snippets based on type of page
* Run code snippet only on certain post types
* Load header and footer code snippet based on referrer source
* and more...

We also added both automatic code insertion and manual code output using shortcodes.

Our Auto Insert feature allows you to run the code snippet everywhere or choose from custom options like:

* Run code snippet only on frontend
* Run code snippet only in WordPress admin area
* Add header and footer scripts sitewide
* Insert PHP code snippet before or after post content
* Insert code snippet before or after specific paragraph
* Insert code snippet on specific archive pages
* Insert code snippets after specific WooCommerce function ([Pro Feature](https://wpcode.com/?utm_source=wprepo&utm_medium=link&utm_campaign=liteplugin))

Aside from that, we also added a visual code snippet priority system, so you can choose the order for your custom functions to avoid code conflict.

> This is such a useful plugin! It makes it so much easier to include things on your website!
> Understoryliving - WordPress user

And for even more flexibility and customization, we have added the ability for you to add page-specific code snippets right from the WordPress classic editor as well as the Gutenberg editor. You can even load code snippets based on device type such as mobile only code snippets, desktop only code snippets, etc.

= Import and Export Code Snippets =

Managing multiple websites or developing in a staging environment?

We offer an easy way to import and export your custom code snippets, functions, and header and footer scripts to help you save time.

You can also save your code snippets to WPCode Cloud (Pro feature), so you can easily re-use the same code snippets across multiple websites. This also allows you to better organize your code snippets instead of wasting time searching for random Github gists.

> Simple plugin I use in quite every site. Very useful to insert scripts and tags.
> tommasoperego - WordPress user

= Full WPCode Feature List =

The simple interface of WPCode plugin (formerly known as Insert Headers and Footers) gives you one place where you can insert header and footer scripts as well as custom code snippets rather than dealing with dozens of different plugins.

Below is a full list of WPCode features:

* Quick to set up
* Unlimited code snippets
* Simple to insert header and footer scripts globally
* Beginner Friendly Code Editor with Syntax Highlighter for PHP, JavaScript, and HTML
* Smart Code Validation to Prevent PHP Errors
* Insert header code and/or footer code using Conditional Logic
* Add <strong>Google Analytics</strong> code to header and footer
* Add <strong>custom CSS</strong> code to any theme
* Insert <strong>Facebook pixel</strong> code in header and footer
* Insert any code or script, including HTML and Javascript
* Insert PHP Code Snippets
* Ready-made Code Snippet Library
* Custom WordPress Code Snippet Generator
* Show or Hide PHP Code Snippets based on conditional logic
* Run PHP code and custom code snippets everywhere or in select areas using smart auto-insert rules.
* Manually insert PHP code snippets using shortcodes anywhere on website
* Add Rich Text Ads and Content Snippets automatically on posts & pages.
* Export / Import Code Snippets
* <strong>New</strong> Save snippets to Cloud Library - All your snippets stored in your private code snippet cloud.
* <strong>New</strong> Deep integrations with Gutenberg, WooCommerce, and more.
* Device specific code snippets (such as load code snippets on mobile only, desktop only, etc)
* and more features coming soon.

= Credits =

Insert Headers and Footers plugin was first created by [Syed Balkhi](https://syedbalkhi.com/) and the [WPBeginner](http://www.wpbeginner.com/) team in 2011.

It was later rebranded to WPCode in 2022 by Syed Balkhi to add powerful code snippets features that users were requesting for.

= Branding Guideline =

WPCode™ is a trademark of WPCode LLC. When writing about the Insert Headers and Footers - Code Snippets plugin by WPCode, please make sure to uppercase the initial 3 letters.

WPCode (correct)
WP Code (incorrect)
wpcode (incorrect)
wp code snippets (incorrect)

== Installation ==

1. Install WPCode - Insert Headers, Footers, and Code Snippets plugin by uploading the `insert-headers-and-footers` directory to the `/wp-content/plugins/` directory. (See instructions on <a href="http://www.wpbeginner.com/beginners-guide/step-by-step-guide-to-install-a-wordpress-plugin-for-beginners/" rel="friend">how to install a WordPress plugin</a>.)
2. Activate WPCode - Insert Headers, Footers, and Code Snippets plugin through the `Plugins` menu in WordPress.
3. Insert code in your header and footer or add custom code snippets by going to the `Code Snippets` menu.

[youtube https://www.youtube.com/watch?v=QXbrdVjWaME]

== Screenshots ==

1. WordPress Code Snippets Management Screen
2. Ready-Made Code Snippets Library
3. Edit PHP Snippets with Code Syntax Highlighter
4. Show / Hide Code Snippets with Smart Conditional Logic
5. Custom WordPress Code Generators
6. Example of Custom Post Type Generator
7. Insert Header and Footer Scripts Globally
8. Import and Export Code Snippets
9. Private Snippets Library In Plugin
10. Page-Specific Scripts Metabox

== Frequently Asked Questions ==

= Can I use WPCode - Insert Headers and Footers to install Google Analytics? =

Yes, you can insert your Google Analytics code in the `Scripts in Header` field.

= Can I use WPCode - Insert Headers and Footers for Google AdSense? =

Yes, to verify your account or to tag your page for Auto ads, paste the code AdSense gives you, into the Scripts in Header field.

= Will I lose my snippets if I change my WordPress theme? =

No, the idea behind WPCode - Insert Headers, Footers, and Code Snippets plugin is so you can safely add code snippets.

All code snippets are stored in the WordPress database, independent of the theme upgrades.

= Can I switch back to the old version of Insert Headers and Footers? =

Yes, if you don't want the advanced code snippets functionality, then you can switch back to the old Insert Headers and Footers features by simply going to the Settings Menu and clicking on the Headers & Footers mode.

= What Type of Code Snippets can I add? =

With WPCode, you can add any type of code snippet that you would otherwise add in your theme's functions.php file or in a site-specific plugin.

This includes custom PHP snippets, JavaScript snippets, HTML snippet, CSS snippets, Text Snippets, Conversion pixels, Tracking scripts, AdSense or other banner ads code, and more.

= What are some example plugins WPCode can replace? =

WPCode comes with a ready-made code snippets library that allows you to replace several popular plugins including:

* Disable Comment plugins
* Disable XML-RPC plugins
* Disable Rest API plugins
* Disable Gutenberg plugins
* Classic Editor plugin
* Allow SVG File Upload plugins
* Disable RSS feed plugins
* Disable Search plugins
* Disable Automatic Updates plugins
* Disable Admin Bar plugins
* Disable Widget Blocks plugin
* Classic Widgets plugin
* Remove WordPress Version Number plugins
* Google Analytics plugins
* Facebook Pixel plugins
* Google AdSense plugins
* Custom Post Types UI plugins
* Other WordPress Generator plugins

... and basically any plugin that adds a functionality which can be added via custom code snippets.

== Changelog ==

= 2.2.6 =
* New: Easily find where your snippet is used as a shortcode with our new shortcode finder tool. 1-click search through your site.
* New: Improved editor for snippet notes. You can now add links and format text with a WYSIWYG editor.
* New: Snippet notes column. Display the notes for each snippet in the list of snippets.
* Fix: We improved the code snippets list filtering in the admin to avoid issues when JS errors are encountered on the page from other scripts.

= 2.2.5 =
* New: We added a new way to quickly filter snippets by code type in the list of snippets.
* Tweak: Prevent content_save_pre from modifying snippet code.

= 2.2.4.1 =
* Fix: Shortcode attributes variables were not being set correctly.

= 2.2.4 =
* Tweak: We adjusted the way our plugin adds a version-specific body class to avoid conflicts with other plugins.
* Tweak: We improved the way custom PHP code is executed to avoid conflicts with variables in snippets.
* Fix: When removing the last Conditional Logic group the rule selector was no longer working.

= 2.2.3.1 =
* Tweak: Updated the way we load translatable strings in some components for compatibility with WordPress 6.7.

= 2.2.3 =
* Tweak: We updated the way we validate PHP snippets when making an edit to an active snippet for better feedback when debugging.
* Tweak: We replaced a dependency (SweetAlert2) for a more lightweight alternative to improve performance.

= 2.2.2 =
* New: The Add Snippet screen now makes it easier to get started with more than just our library of snippets, choose from expert-picked snippets, snippet generators or plugin-specific snippets.
* New: We updated the code type picker for more clarity on what each code type is useful for and the last code type you used is now saved for a streamlined experience when adding multiple snippets.
* Tweak: We extended the unfiltered HTML permissions notice when the DISALLOW_UNFILTERED_HTML constant is defined to add more clarity.

= 2.2.1 =
* Fix: We fixed a bug that was causing the selected conditional logic operator to not be displayed correctly for some rules.
* Fix: The auto-insert location picker was not opening again in some situations.

= 2.2.0 =
* New: We updated the conditional logic rules picker for more clarity and ease of use.
* New: We expanded our automatic cache clearing to include the Swift Performance plugin.
* Tweak: The Page URL conditional logic option now supports query params and wp-admin URLs.

= 2.1.14 =
* New: When making changes to the Global Header & Footer WPCode will attempt to automatically clear page cache for popular caching plugins.
* New: Save your snippet with a keyboard shortcut by pressing CTRL+S (Windows) or CMD+S (Mac) in the snippet editor.
* Tweak: Prevent error when TinyMCE is disabled by other plugins.

= 2.1.13 =
* New: We added admin-specific locations for header and footer to streamline customizations in the wp-admin area.
* New: The code editor height can now be adjusted directly from the snippet editor screen. Auto-height is still available as an option on the settings page.
* Fix: When making changes to a snippet, the function to prevent you from navigating away was no longer working.

= 2.1.12 =
* New: We added a new way to execute PHP snippets "On Demand" - look for the "On Demand" location in the Auto Insert settings.
* Tweak: We added checks in place to prevent malicious code patterns from being used in WPCode.
* Fix: We fixed a bug where the conditional logic for logged-in users was not being saved correctly the first time.

= 2.1.11 =
* Tweak: We improved the admin bar menu to fix an JS error in some scenarios and a html validation issue.
* Tweak: We added support for importing snippets from the Code Snippets Pro plugin.
* Fix: We fixed an issue with importing CSS snippets.

= 2.1.10 =
* New: When another user is editing the same snippet, we now show a warning to avoid conflicts.
* Tweak: Improved mobile styles across the plugin admin for better readability.

= 2.1.9 =
* New: Conditional logic rule for Blog home page (posts page)
* Tweak: Improved the connect to library flow to avoid the connect window from getting blocked.
* Fix: Author archive condition was not working as intended.

= 2.1.8 =
* Tweak: We changed the way the code generators are loaded to improve performance overall.
* Tweak: We changed the way translations are loaded for better performance.

= 2.1.7 =
* New: WPCode now has a Dark Mode for those late night coding sessions. Enable it on the settings page.
* Tweak: We improved the way the error messages are displayed in the snippet editor for more clarity.
* Fix: The snippet editor was no longer running syntax checks for PHP snippets upon activation.
* Fix: We fixed a bug where in certain versions of Safari the auto-insert location was being unset when saving a snippet.

= 2.1.6 =
* New: We added the option to delete all the plugin data on uninstall.
* Fix: The code of duplicated snippets was sometimes removing some slashes.
* Fix: Error count was not correctly updated when snippets were trashed or deleted.

= 2.1.5 =
* New: Priority column added to the list of snippets, order by snippet priority.
* Fix: Fixed a notice that was being thrown in new sites when running the installation routines.
* Fix: Filtering by tag or location in the list of snippets was not working correctly.

= 2.1.4.1 =
* Fix: Avoid notices for errors that don't include the file parameter.
* Fix: Improve compatibility with PHP 8.2 for the snippet cache class.

= 2.1.4 =
* New: Enhanced error tracking: Errors generated by PHP snippets on your website will be displayed within the snippet's context, simplifying the debugging process.
* New: We've refined the snippet auto-deactivation process. Now, only snippets that produce fatal errors in the admin section will be deactivated. All other errors will be reported through the newly implemented error tracker.
* New: We introduced three new columns to the snippet list: ID, Code Type, and Shortcode.
* Tweak: We've enhanced our file caching mechanism to prevent redundant requests in scenarios where files aren't written properly due to certain setups.
* Tweak: We've implemented an additional check to ensure that closing PHP tags don't disrupt the execution of snippets.
* Fix: We've corrected the sorting of snippets when arranged by their last updated date.

= 2.1.3.1 =
* Fix: Shortcode attributes were not being correctly parsed in some scenarios.

= 2.1.3 =
* New: We improved how we manage automatic snippet disabling when errors occur. You'll now get detailed insights into which snippet is responsible for the error and the exact line where the problem occurred.
* Tweak: We adjusted the way snippets are preloaded to improve compatibility with object cache.
* Fix: The snippets added as shortcodes were not correctly displayed in the admin bar.

= 2.1.2 =
* Tweak: We adjusted the way snippets are tracked in the Admin Bar Code Spotter to avoid wrong numbers in certain locations.
* Tweak: We improved the way the Admin Bar Code Spotter menu is loaded for better compatibility with other plugins and older themes.
* Tweak: Changed the way assets used by the admin bar are loaded to avoid errors if the head is loaded multiple times.

= 2.1.1 =
* New: Easily duplicate a snippet with all of its settings with the new Duplicate link in the list of snippets.
* Fix: Taxonomy page conditional logic was not being correctly assigned for category and tags archives.
* Tweak: Adjust admin bar markup to avoid using a heading.

= 2.1.0 =
* New: See exactly which scripts and snippets are loaded on the current page with the WPCode admin bar info menu.
* Tweak: Minor update to connect process.

= 2.0.13.1 =
* Fix: Improve compatibility with older WordPress versions before version 4.7.
* Fix: Add escaping to tag filter links in the list of snippets.

= 2.0.13 =
* New: We have added user customization options for the list of snippets in the admin. Now, you can choose snippet list columns, determine the number of snippets to display, and set the default order of the snippets.
* New: When you save a snippet, the WPCode editor will retain the cursor position, making it easier for you to continue editing larger snippets.

= 2.0.12 =
* New: You can now add shortcode attributes and use them in snippets. Any attribute you define becomes available as a variable in PHP & Universal code snippets.
* Tweak: We improved the way the editor is loaded when users enable the “Disable syntax highlighting when editing code” in their profile.
* Tweak: We adjusted the way the editor gets refreshed when changing a snippet code type.
* Fix: The Auto-Insert location was getting reset with every code type change.

= 2.0.11 =
* New: Automatically disabled snippets due to errors will now be highlighted in the list for easier debugging.
* New: We added a filter to allow users to easily customize the Codemirror settings for the WPCode editor.
* Tweak: We extended our plugin-specific snippet loading to allow plugin version checks.

= 2.0.10 =
* New: We added a way to load more snippets in the WPCode Library relevant to other plugins you are using.
* Fix: We added an extra filter removal to prevent WordPress core from automatically adding the rel tag to snippets where it may break the syntax.
* Fix: We improved backwards compatibility with older WordPress versions.

= 2.0.9 =
* New: We redesigned the auto-insert location picker to make it easier to find the right place to insert your snippets.
* Fix: We fixed an edge-case where a snippet getting automatically deactivated due to throwing an error would have its code changed.
* Fix: Inserting a snippet as a shortcode was ignoring the conditional logic rules enable toggle and always applying rules.
* Fix: We updated the way we check the taxonomy term id when applying conditional logic rules.
* Fix: Security hardening for deleting logs.

= 2.0.8.1 =
* Fix: Improve compatibility with PHP 8.1 for our error handling class.

= 2.0.8 =
* New: We added the option to log PHP errors thrown by snippets added with WPCode to make it easier to track down issues.
* New: We added a new auto-insert location to improve the available conditional logic rules you can use with PHP snippets.
* Tweak: We added more info regarding the error thrown when trying to activate a PHP snippet with a syntax error.
* Tweak: Conditional logic rules are now also applied to shortcodes for better control of output.
* Tweak: We updated the code editor for PHP snippets to give you a better experience when editing snippets.
* Fix: We adjusted the permission checks of some ajax endpoints to avoid any potential unwanted usage.
* Fix: The Safe Mode notice was no longer being displayed on the WPCode pages, so we added that back when needed.

= 2.0.7 =
* New: We added the ability to resume editing snippets that were created using the WPCode snippet generator.
* Fix: We adjusted the code output in the editor to improve support for using HTML entities.
* Fix: We made sure conditional logic rules are loaded correctly in the admin when used globally.
* Fix: We added an extra permissions check to the library endpoints to limit access.

= 2.0.6 =
* New: WPCode Library public snippets can now be installed with 1-click on sites connected to the WPCode Library - no more copy/paste needed!
* New: We added a new setting for the editor height, so you can set the editor to a custom height or make it automatically grow with the code.
* Tweak: We adjusted the "Connect To Library" functionality to improve support for site names with special characters or empty names.
* Fix: We added extra checks to prevent errors when certain conditional logic rules were being called too early with PHP snippets.

= 2.0.5 =
* New: 2 new bulk actions are available in the admin to allow enabling or disabling multiple snippets at once.
* New: We added a new search field for snippets in the admin list which allows you to search using all snippet fields.
* New: When adding a JavaScript snippet, WPCode will attempt to remove HTML script tags, if present.

build/notices.asset.php000064400000000137151331545640011146 0ustar00<?php return array('dependencies' => array(), 'version' => 'ab1b681998f921b5812d4439c9a28315');build/admin-bar.css000064400000003632151331545640010222 0ustar00#wpadminbar .wpcode-admin-bar-info-separator-top{margin-top:5px;padding-top:5px;border-top:1px solid}#wpadminbar .wpcode-admin-bar-description .ab-item{font-weight:700}#wpadminbar .wpcode-pro-indicator{background:#bbb;color:#333 !important;text-transform:uppercase;padding:4px 7px;border-radius:9px;font-size:8px;line-height:1;display:inline-block;vertical-align:text-top;font-weight:600}#wpadminbar #wp-admin-bar-wpcode-upgrade a{background-color:#59A56D !important;color:#fff !important}#wpadminbar .quicklinks .wpcode-admin-bar-upsell-submenu .ab-empty-item{display:none}#wpadminbar .quicklinks .wpcode-admin-bar-has-upsell-submenu .ab-sub-wrapper{background:transparent;box-shadow:none}#wpadminbar .wpcode-admin-bar-submenu-upsell{min-width:660px;border-radius:8px;box-shadow:0 2px 5px rgba(0,0,0,.2);background:#fff;color:#1d2327;padding:40px;text-align:center}#wpadminbar .wpcode-admin-bar-submenu-upsell .wpcode-heading{font-size:24px;padding:8px 12px;line-height:1.5}#wpadminbar .wpcode-admin-bar-submenu-upsell p{color:#777777;font-size:16px;margin:16px 0;line-height:1.5}#wpadminbar .wpcode-admin-bar-submenu-upsell .wpcode-button{margin-top:6px !important;background-color:#E06B44;color:#fff !important;font-size:16px;display:inline-block;border-radius:4px;padding:10px 36px;font-weight:700;height:auto}#wpadminbar .wpcode-menu-notification-counter{display:inline-block !important;min-width:18px !important;height:18px !important;border-radius:9px !important;margin:7px 0 0 2px !important;vertical-align:top !important;font-size:11px !important;line-height:1.6 !important;text-align:center !important}#wpadminbar .wpcode-admin-bar-info-submenu .wpcode-menu-notification-counter{float:right;margin-top:5px !important}body:not(.wp-admin) .wpcode-menu-notification-counter{background-color:#d63638 !important;color:#ffffff !important}.wpcode-testing-mode #wp-admin-bar-wpcode-admin-bar-info>.ab-item{color:#fff;background-color:#09A347}

build/admin-global-lite.css000064400000061263151331545640011655 0ustar00:root{--wpcode-background-gray:#F8F8F8;--wpcode-background-highlight:#F6FAFF;--wpcode-background-light:#F3F4F5;--wpcode-background-red:#DF2A35;--wpcode-background-white:#fff;--wpcode-border-color:#ddd;--wpcode-button-disabled-bg:#F5F5F5;--wpcode-button-disabled-border:1px solid #DDDDDD;--wpcode-button-disabled-text:#bbb;--wpcode-button-primary-bg:var(--wpcode-color-primary);--wpcode-button-primary-bg-hover:#397EEB;--wpcode-button-primary-text:#fff;--wpcode-button-primary-text-hover:#fff;--wpcode-button-secondary-bg:#F8F8F8;--wpcode-button-secondary-bg-hover:#fff;--wpcode-button-secondary-border:1px solid #DDDDDD;--wpcode-button-secondary-text:#777;--wpcode-button-orange-bg:#E06B44;--wpcode-button-orange-bg-hover:#e17f5e;--wpcode-button-secondary-text-hover:#454545;--wpcode-color-primary:#3568B7;--wpcode-color-red:#DF2A35;--wpcode-color-red-darker:#AB2028;--wpcode-font-size-l:18px;--wpcode-font-size-m:16px;--wpcode-font-size-s:14px;--wpcode-font-size-xl:22px;--wpcode-font-size-xs:12px;--wpcode-font-size-xxl:24px;--wpcode-input-border:1px solid #DDD;--wpcode-input-border-active:#3568B7;--wpcode-input-text-color:#454545;--wpcode-notice-success-bg:#09A347;--wpcode-notice-success-text:#fff;--wpcode-space-h:36px;--wpcode-space-v:24px;--wpcode-text-color-heading:#454545;--wpcode-text-color-highlight:#3568B7;--wpcode-text-color-light-bg:#848A8A;--wpcode-text-color-paragraph:#777777;--wpcode-text-color-placeholder:#bbb}@media screen and (max-width:782px){:root{--wpcode-space-h:24px}}.wpcode-admin-tabs{font-size:14px;list-style:none;margin:0;overflow:auto;padding:0}.wpcode-admin-tabs li{float:left;margin:0 30px 0 0;padding:0}.wpcode-admin-tabs li button{border:none;background:transparent;cursor:pointer}.wpcode-admin-tabs li button,.wpcode-admin-tabs li a{border-bottom:4px solid #fff;box-shadow:none;color:var(--wpcode-text-color-paragraph);display:block;font-weight:600;padding:20px 0 18px 0;text-decoration:none;transition:border 300ms ease}.wpcode-admin-tabs li button.wpcode_pro_type_lite,.wpcode-admin-tabs li a.wpcode_pro_type_lite{opacity:0.5}.wpcode-admin-tabs li button.wpcode_pro_type_lite:hover,.wpcode-admin-tabs li a.wpcode_pro_type_lite:hover{border:none}.wpcode-admin-tabs li button.wpcode_pro_type_lite:focus,.wpcode-admin-tabs li a.wpcode_pro_type_lite:focus{border:none}.wpcode-admin-tabs li button.active,.wpcode-admin-tabs li a.active{border-color:var(--wpcode-color-primary);color:var(--wpcode-text-color-heading)}.wpcode-admin-tabs li button:focus,.wpcode-admin-tabs li a:focus{border-color:var(--wpcode-color-primary)}.wpcode-admin-tabs li button:hover,.wpcode-admin-tabs li a:hover{border-color:var(--wpcode-text-color-paragraph)}.wpcode-admin-tab-content{display:none;position:relative}.wpcode-admin-tab-content.active{display:block}.wpcode-smart-tags{position:relative;display:inline-block;vertical-align:top}.wpcode-smart-tags.wpcode-smart-tags-unavailable .wpcode-smart-tags-toggle{opacity:0.6}.wpcode-smart-tags .wpcode-smart-tags-toggle{background:none;border:none;color:var(--wpcode-text-color-paragraph);font-size:var(--wpcode-font-size-s);cursor:pointer}.wpcode-smart-tags .wpcode-smart-tags-toggle svg{vertical-align:middle}.wpcode-smart-tags .wpcode-smart-tags-toggle span{text-decoration:underline}.wpcode-smart-tags .wpcode-smart-tags-toggle:hover span{text-decoration:none}.wpcode-smart-tags .wpcode-text-active{display:none}.wpcode-smart-tags .wpcode-smart-tags-dropdown{border:1px solid var(--wpcode-border-color);border-radius:4px;display:none;left:0;position:absolute;top:100%;z-index:1050;background:#fff;width:400px;margin-top:7px}.wpcode-smart-tags .wpcode-smart-tags-dropdown ul{border-top:1px solid var(--wpcode-border-color)}.wpcode-smart-tags .wpcode-smart-tags-dropdown ul:first-child{border-top:none}.wpcode-smart-tags .wpcode-smart-tags-dropdown ul li{padding:0 15px;margin:12px 0}.wpcode-smart-tags .wpcode-smart-tags-dropdown .wpcode-smart-tag-category-label{font-weight:600;font-size:var(--wpcode-font-size-s);color:var(--wpcode-text-color-paragraph)}.wpcode-smart-tags.wpcode-smart-tags-open .wpcode-text-active{display:inline-block}.wpcode-smart-tags.wpcode-smart-tags-open .wpcode-text-default{display:none}.wpcode-smart-tags.wpcode-smart-tags-open .wpcode-smart-tags-dropdown{display:block}.wpcode-insert-smart-tag{border:0;color:var(--wpcode-text-color-paragraph);font-size:var(--wpcode-font-size-s);padding:0;text-align:left;background:none;cursor:pointer}.wpcode-insert-smart-tag:hover code{background-color:rgba(0,0,0,0.15)}.wpcode-smart-tags-dropdown-footer{padding:12px 15px;border-top:1px solid var(--wpcode-border-color);display:flex}.wpcode-smart-tags-dropdown-footer a{color:var(--wpcode-text-color-paragraph);display:inline-flex}.wpcode-smart-tags-dropdown-footer a .wpcode-icon{margin-right:5px}.wpcode-blur-area{filter:blur(2px);pointer-events:none}.wpcode-library .wpcode-content{position:relative}#poststuff .wpcode-upsell-box,.wpcode-upsell-box{position:absolute;z-index:20;background:var(--wpcode-background-white);width:662px;max-width:100%;top:50%;left:50%;transform:translate(-50%,-50%);padding:40px;text-align:center;border-radius:8px;border:1px solid var(--wpcode-border-color)}#poststuff .wpcode-upsell-box *,.wpcode-upsell-box *{box-sizing:border-box}#poststuff .wpcode-upsell-box h2,.wpcode-upsell-box h2{font-size:var(--wpcode-font-size-xxl);margin-top:0;line-height:1.2}#poststuff .wpcode-upsell-box .wpcode-button,.wpcode-upsell-box .wpcode-button{margin-top:6px}#poststuff .wpcode-upsell-box .wpcode-upsell-button-text,.wpcode-upsell-box .wpcode-upsell-button-text{margin-top:16px;display:inline-block;font-size:var(--wpcode-font-size-s);color:var(--wpcode-text-color-light-bg)}#poststuff .wpcode-upsell-box .wpcode-upsell-button-text:hover,.wpcode-upsell-box .wpcode-upsell-button-text:hover{text-decoration:none}#poststuff .wpcode-upsell-box p,.wpcode-upsell-box p{color:var(--wpcode-text-color-paragraph);font-size:var(--wpcode-font-size-m);line-height:1.5}#poststuff .wpcode-upsell-box.wpcode-upsell-box-with-features,.wpcode-upsell-box.wpcode-upsell-box-with-features{width:892px;padding:56px}#poststuff .wpcode-upsell-box.wpcode-upsell-box-with-features .wpcode-upsell-text,.wpcode-upsell-box.wpcode-upsell-box-with-features .wpcode-upsell-text{max-width:600px;margin:0 auto}#poststuff .wpcode-upsell-box .wpcode-upsell-features,.wpcode-upsell-box .wpcode-upsell-features{display:flex;flex-wrap:wrap;justify-content:space-between;margin-top:40px;margin-bottom:24px;text-align:left}#poststuff .wpcode-upsell-box .wpcode-upsell-features .wpcode-upsell-feature,.wpcode-upsell-box .wpcode-upsell-features .wpcode-upsell-feature{width:50%;color:var(--wpcode-text-color-heading);font-size:var(--wpcode-font-size-m);margin-bottom:16px;line-height:1.5;padding-left:34px;position:relative;padding-right:10px}#poststuff .wpcode-upsell-box .wpcode-upsell-features .wpcode-upsell-feature:before,.wpcode-upsell-box .wpcode-upsell-features .wpcode-upsell-feature:before{content:'';background-image:url("data:image/svg+xml,%3Csvg width=%2719%27 height=%2718%27 viewBox=%270 0 19 18%27 fill=%27none%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath fill-rule=%27evenodd%27 clip-rule=%27evenodd%27 d=%27M9.5 0.416016C4.67 0.416016 0.75 4.33602 0.75 9.16602C0.75 13.996 4.67 17.916 9.5 17.916C14.33 17.916 18.25 13.996 18.25 9.16602C18.25 4.33602 14.33 0.416016 9.5 0.416016ZM9.5 16.166C5.64125 16.166 2.5 13.0248 2.5 9.16602C2.5 5.30727 5.64125 2.16602 9.5 2.16602C13.3587 2.16602 16.5 5.30727 16.5 9.16602C16.5 13.0248 13.3587 16.166 9.5 16.166ZM7.75 11.0648L13.5163 5.29852L14.75 6.54102L7.75 13.541L4.25 10.041L5.48375 8.80727L7.75 11.0648Z%27 fill=%27%2309A347%27/%3E%3C/svg%3E");display:block;width:19px;height:18px;position:absolute;left:0;top:3px}.wpcode-pixel .wpcode-upsell-box .wpcode-upsell-text{max-width:750px}@media (max-width:1440px){.wpcode-library .wpcode-upsell-box{top:100px;transform:translate(-50%,0)}}.wpcode-button{background-color:var(--wpcode-button-primary-bg);border:1px solid var(--wpcode-button-primary-bg);border-radius:4px;color:var(--wpcode-button-primary-text);cursor:pointer;display:inline-block;font-size:var(--wpcode-font-size-s);font-weight:700;line-height:1;padding:10px 16px;text-decoration:none}.wpcode-button.wpcode-button-icon{align-items:center;display:inline-flex;padding-bottom:12px;padding-top:12px}.wpcode-button.wpcode-button-icon svg{margin-right:5px}.wpcode-button.wpcode-button-icon.wpcode-copy-target{padding-bottom:10px;padding-top:10px}.wpcode-button.wpcode-button-wide{padding-left:50px;padding-right:50px}.wpcode-button:hover,.wpcode-button:focus{background-color:var(--wpcode-button-primary-bg-hover);border-color:var(--wpcode-button-primary-bg-hover);color:var(--wpcode-button-primary-text-hover)}.wpcode-button.wpcode-button-secondary{background-color:var(--wpcode-button-secondary-bg);border:var(--wpcode-button-secondary-border);color:var(--wpcode-button-secondary-text)}.wpcode-button.wpcode-button-secondary:hover,.wpcode-button.wpcode-button-secondary:focus{background-color:var(--wpcode-button-secondary-bg-hover);color:var(--wpcode-button-secondary-text-hover)}.wpcode-button.wpcode-button-secondary.wpcode-button-secondary-inactive{background-color:var(--wpcode-button-disabled-bg);border-color:var(--wpcode-button-disabled-bg)}.wpcode-button.wpcode-button-secondary.wpcode-button-secondary-selected{border-color:var(--wpcode-button-primary-bg)}.wpcode-button.wpcode-button-orange{background-color:var(--wpcode-button-orange-bg);border-color:var(--wpcode-button-orange-bg);color:var(--wpcode-button-primary-text)}.wpcode-button.wpcode-button-orange:hover,.wpcode-button.wpcode-button-orange:focus{background-color:var(--wpcode-button-orange-bg-hover);color:var(--wpcode-button-primary-text)}.wpcode-button.wpcode-button-large{align-items:center;display:inline-flex;font-size:var(--wpcode-font-size-m);height:56px;justify-content:center;padding-left:var(--wpcode-space-h);padding-right:var(--wpcode-space-h);text-align:center}.wpcode-button.wpcode-button-large svg{margin-right:7px}.wpcode-button.wpcode-button-small{font-size:var(--wpcode-font-size-xs);padding:9px}.wpcode-button:disabled:hover,.wpcode-button:disabled{background-color:var(--wpcode-button-disabled-bg);border:var(--wpcode-button-disabled-border);color:var(--wpcode-button-disabled-text)}.wpcode-button-toggle{align-items:center;display:flex;justify-content:space-between}@media screen and (min-width:783px){.wpcode-button-toggle{min-width:424px}}.wpcode-button-toggle .wpcode-button{width:calc(50% - 5px);background:var(--wpcode-background-white);color:var(--wpcode-input-text-color)}.wpcode-button-toggle .wpcode-button-secondary{border:2px solid var(--wpcode-color-primary)}.wpcode-success-icon{display:none}.wpcode-show-success-icon .wpcode-success-icon{display:inline-block}.wpcode-show-success-icon .wpcode-default-icon{display:none}.wpcode-button-just-icon{background:none;border:none;cursor:pointer;padding:0}.wpcode-button-just-icon .wpcode-icon{display:block}.wpcode-text-button-icon{align-items:center;background:none;border:none;color:var(--wpcode-text-color-paragraph);cursor:pointer;display:inline-flex;font-size:var(--wpcode-font-size-s);font-weight:600;padding:0}.wpcode-text-button-icon:hover{color:var(--wpcode-text-color-heading)}.wpcode-text-button-icon:hover path{fill:var(--wpcode-text-color-heading)}.wpcode-text-button-icon .wpcode-icon{margin-right:5px}.wpcode-just-icon-button{background:none;border:none;cursor:pointer}.wpcode-button-text{background:none;border:none;color:var(--wpcode-text-color-paragraph);cursor:pointer;font-size:var(--wpcode-font-size-xs);padding:0;text-decoration:underline}.wpcode-button-text .wpcode-icon{margin-right:11px}.wpcode-button-text:focus,.wpcode-button-text:hover{text-decoration:none;background:none;color:var(--wpcode-text-color-heading)}.wpcode-button-text:focus svg path,.wpcode-button-text:hover svg path{fill:var(--wpcode-text-color-heading)}#wpbody-content .wpcode-button-ai-generate{position:relative;background:var(--wpcode-color-primary);border:none;color:white;cursor:pointer;overflow:hidden;z-index:1;border-radius:5px;transition:background-color 0.5s ease 0s,color 0.5s ease 0s}#wpbody-content .wpcode-button-ai-generate svg path{fill:#fff;transition:fill 0.5s ease 0s}#wpbody-content .wpcode-button-ai-generate .wpcode-button-ai-text-done,#wpbody-content .wpcode-button-ai-generate .wpcode-button-ai-text-loading{display:none}#wpbody-content .wpcode-button-ai-generate:focus,#wpbody-content .wpcode-button-ai-generate:hover{background:var(--wpcode-color-primary);color:#fff}#wpbody-content .wpcode-button-ai-generate:focus:before,#wpbody-content .wpcode-button-ai-generate:hover:before{opacity:0}#wpbody-content .wpcode-button-ai-generate:before{content:'';position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(90deg,#6e2dfb 0%,#a01cfd 100%);transition:opacity 0.5s ease;z-index:-1}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-loading{background:white;color:#a01cfd}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done:before,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-loading:before{display:none}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done svg path,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-loading svg path{fill:#a01cfd;-webkit-animation-name:wpcode-shape-scale;animation-name:wpcode-shape-scale;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;transform-origin:center center;transform-box:fill-box}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done g:nth-child(2) path,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-loading g:nth-child(2) path{-webkit-animation-delay:0.75s;animation-delay:0.75s}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done g:nth-child(3) path,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-loading g:nth-child(3) path{-webkit-animation-delay:1.5s;animation-delay:1.5s}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done .wpcode-button-ai-text-default,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-loading .wpcode-button-ai-text-default{display:none}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done .wpcode-button-ai-text-loading,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-loading .wpcode-button-ai-text-loading{display:block}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done .wpcode-button-ai-text-done{display:block}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done .wpcode-button-ai-text-default,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done .wpcode-button-ai-text-loading{display:none}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-not-available{filter:grayscale(1)}.wpcode-ai-improve{margin-right:14px;padding:10px 10px}.wpcode-ai-improve svg path{fill:#a01cfd}.wpcode-items-metabox{display:flex;padding:0}@media screen and (max-width:782px){.wpcode-items-metabox{flex-flow:column}}.wpcode-items-sidebar{flex-shrink:0;padding:var(--wpcode-space-v);width:242px}@media screen and (max-width:782px){.wpcode-items-sidebar{width:100%}}.wpcode-items-list{border-left:1px solid var(--wpcode-border-color);min-height:400px;padding:calc(var(--wpcode-space-v) / 2) 12px;width:100%}@media screen and (max-width:782px){.wpcode-items-list{border-top:1px solid var(--wpcode-border-color);border-left:0}}.wpcode-items-categories-list{margin:0}.wpcode-items-categories-list li{margin:0}.wpcode-items-categories-list button{background:transparent;border:none;color:var(--wpcode-text-color-paragraph);cursor:pointer;display:block;font-size:var(--wpcode-font-size-m);font-weight:500;padding:12px 8px;position:relative;text-align:left;width:100%}.wpcode-items-categories-list button:focus,.wpcode-items-categories-list button.wpcode-active{background:var(--wpcode-background-highlight);color:var(--wpcode-text-color-highlight)}.wpcode-items-categories-list button:hover{text-decoration:underline}.wpcode-items-categories-list button .wpcode-items-count{float:right;color:var(--wpcode-text-color-paragraph);opacity:0.5}.wpcode-items-categories-list button.wpcode-active{font-weight:700}.wpcode-items-categories-list button.wpcode-active:hover{text-decoration:none}.wpcode-items-categories-list button.wpcode-active .wpcode-items-count{opacity:1;color:var(--wpcode-text-color-highlight);font-weight:700}.wpcode-items-list-category{align-content:stretch;display:flex;flex-wrap:wrap;justify-content:flex-start}.wpcode-list-item{border:1px solid var(--wpcode-border-color);border-radius:4px;margin-bottom:24px;margin-right:12px;margin-left:12px;max-width:100%;padding:16px 20px;position:relative;width:100%}@media (min-width:961px){.wpcode-list-item{width:calc(50% - 24px)}}@media (min-width:1440px){.wpcode-list-item{width:calc(100% / 3 - 24px)}}.wpcode-list-item h3,.wpcode-list-item .wpcode-list-item-title{font-size:var(--wpcode-font-size-m);line-height:1.2;margin:0;overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.wpcode-list-item p{margin-bottom:0}.wpcode-list-item:hover .wpcode-list-item-description,.wpcode-list-item:focus .wpcode-list-item-description{opacity:0}.wpcode-list-item:hover .wpcode-list-item-buttons,.wpcode-list-item:focus .wpcode-list-item-buttons{opacity:1}@media (hover:none){.wpcode-list-item .wpcode-list-item-description{opacity:0}.wpcode-list-item .wpcode-list-item-buttons{opacity:1}}.wpcode-list-item .wpcode-list-item-pill{position:absolute;top:10px;right:10px;font-size:8px;font-weight:700;text-transform:uppercase;line-height:1;padding:4px 8px;border-radius:40px}.wpcode-list-item .wpcode-list-item-pill.wpcode-list-item-pill-blue{background:var(--wpcode-color-primary);color:#fff}.wpcode-list-item .wpcode-list-item-pill.wpcode-list-item-pill-green{background:var(--wpcode-notice-success-bg);color:#fff}.wpcode-list-item .wpcode-list-item-pill.wpcode-list-item-pill-gray{background:var(--wpcode-text-color-heading);color:#fff}.wpcode-list-item .wpcode-list-item-pill.wpcode-list-item-pill-light{background:var(--wpcode-text-color-placeholder);color:#fff}.wpcode-list-item.wpcode-list-item-has-pill h3{max-width:calc(100% - 60px)}.wpcode-list-item.wpcode-custom-snippet,.wpcode-list-item.wpcode-library-item-ai{background:var(--wpcode-background-highlight)}.wpcode-list-item-actions{position:relative}.wpcode-list-item-description{min-height:40px}.wpcode-list-item-buttons{display:flex;justify-content:space-between;opacity:0;position:absolute;top:0;width:100%;z-index:10}.wpcode-list-item-buttons .wpcode-button{flex-grow:1;margin-left:10px;text-align:center}.wpcode-list-item-buttons .wpcode-button:first-child{margin-left:0}.wpcode-items-search{margin-bottom:20px;position:relative}.wpcode-items-search input{border-color:var(--wpcode-border-color);font-size:var(--wpcode-font-size-s);height:38px;padding-left:32px;width:100%}.wpcode-items-search input::-moz-placeholder{color:var(--wpcode-text-color-placeholder)}.wpcode-items-search input:-ms-input-placeholder{color:var(--wpcode-text-color-placeholder)}.wpcode-items-search input::placeholder{color:var(--wpcode-text-color-placeholder)}.wpcode-items-search label{left:10px;position:absolute;top:11px}.wpcode-library-preview-header{padding-bottom:25px}.wpcode-library-preview-header h2{margin:0}.wpcode-library-preview-header .wpcode-close-modal{float:right}.wpcode-library-preview-content .CodeMirror{background:var(--wpcode-background-gray)}.wpcode-library-preview-content .CodeMirror-activeline-background{background:transparent !important}.wpcode-library-preview-content .CodeMirror-focused .CodeMirror-activeline-background{background:rgba(100,100,100,0.1) !important}.wpcode-library-preview-buttons{margin-top:25px}.wpcode-item-use-button.wpcode-start-auth{padding-top:6px;padding-bottom:6px;justify-content:center}.wpcode-item-use-button.wpcode-start-auth svg{margin-right:9px}#wpcode-library-connect-banner{background:var(--wpcode-button-disabled-bg);margin-bottom:24px;margin-left:12px;border-radius:6px;display:flex;flex-direction:column;justify-content:space-between;align-items:center;padding-right:20px;margin-right:12px}@media (min-width:961px){#wpcode-library-connect-banner{flex-direction:row}}#wpcode-library-connect-banner .wpcode-template-content{padding:20px;color:#444444}@media (min-width:961px){#wpcode-library-connect-banner .wpcode-template-content{width:80%}}#wpcode-library-connect-banner .wpcode-template-upgrade-button{text-align:right;flex-shrink:0;padding-bottom:20px}@media (min-width:961px){#wpcode-library-connect-banner .wpcode-template-upgrade-button{padding-bottom:0}}#wpcode-library-connect-banner .wpcode-template-upgrade-button button{white-space:pre}#wpcode-library-connect-banner h3{margin:0 0 5px}#wpcode-library-connect-banner p{margin:0}.wpcode-library-item-ai-not-available .wpcode-button{opacity:0.7;pointer-events:none}.wpcode-content *{box-sizing:border-box}.wpcode-metabox-snippets:after{display:table;clear:both;content:''}#wpcode-picked-snippets{align-content:stretch;display:flex;flex-wrap:wrap;justify-content:flex-start}.wpcode-snippet-picker-item{border-bottom:1px solid var(--wpcode-border-color);padding:15px 0;display:flex;justify-content:space-between;color:var(--wpcode-text-color-paragraph);font-size:var(--wpcode-font-size-m)}.wpcode-snippet-picker-item .wpcode-checkbox-toggle{flex-shrink:0;flex-grow:0}.wpcode-selected-snippet-item h4{margin-top:12px}.wpcode-selected-snippet-item label{margin:5px 0;display:block}#wpcode-snippet-chooser{width:30%;float:left}#wpcode-snippet-chooser .wpcode-chooser-fixed-height{height:400px;overflow:auto}.wpcode-picked-snippets-area{margin-left:30%;padding-left:16px}.wpcode-picked-snippets-area>h3{margin-left:12px}.wpcode-snippet-chooser-closed #wpcode-snippet-chooser{width:0;overflow:hidden}.wpcode-snippet-chooser-closed .wpcode-picked-snippets-area{margin-left:0;padding-left:0}.wpcode-snippet-chooser-closed .wpcode-picked-snippets-area>h3{margin-left:0}.wpcode-snippet-chooser-closed #wpcode-picked-snippets{margin:0 -12px}.wpcode-snippets-search{padding-bottom:16px;position:relative}.wpcode-snippets-search input{width:100%}#wpcode-close-drawer{float:right}.wpcode-input-row{margin:24px 0}.wpcode-input-row label{font-size:var(--wpcode-font-size-s);color:var(--wpcode-text-color-heading);margin-bottom:20px;display:inline-block;font-weight:600}#wpcode-no-snippets-selected{margin-left:12px}.wpcode-choose-actions{text-align:center}#wpcode-metabox-load-more{margin:15px 0}#wpcode-chooser-spinner{right:0;top:12px}.wpcode-auto-insert-number-wrap.wpcode-hidden{display:none}.wpcode-list-item-location-details{display:flex}.wpcode-list-item-location-details .wpcode-auto-insert-location-wrap{width:100%}.wpcode-list-item-location-details .wpcode-auto-insert-number-wrap input{width:100px}.wpcode-input-row textarea{width:100%;min-height:300px}.wpcode-admin-tabs .wpcode-page-scripts-testing-mode-indicator{float:right;margin-right:0}.wpcode-admin-tabs .wpcode-page-scripts-testing-mode-indicator a{background:#09A347;color:#fff;padding-left:10px;padding-right:10px}#wpcode-tab-revisions .wpcode-revisions-list-area{min-height:250px}#wpcode-tab-revisions .wpcode-loading-spinner{display:block;top:50%;left:50%;width:48px;height:48px;background-size:48px 48px;transform:translate(-50%,-50%)}.wpcode-revisions-list-area{margin:24px 0 24px;position:relative}.wpcode-revisions-list-area #wpcode-show-all-snippets{margin-top:24px}.wpcode-revisions-list{border-left:1px solid var(--wpcode-border-color);padding-left:22px;margin:0}.wpcode-revisions-list.wpcode-revisions-list-collapsed{display:none}.wpcode-revisions-list.wpcode-revisions-list-extra{margin-top:0}.wpcode-revisions-list.wpcode-revisions-list-extra .wpcode-revision-list-item:first-child{background-color:var(--wpcode-button-disabled-bg)}.wpcode-revision-list-item{background:var(--wpcode-button-disabled-bg);padding:6px 9px;font-size:var(--wpcode-font-size-s);position:relative}.wpcode-revision-list-item .avatar{border-radius:50%;vertical-align:middle}.wpcode-revision-list-item:before{position:absolute;content:'';width:7px;height:7px;border-radius:50%;background-color:#C4C4C4;border:2px solid #FFF;right:100%;margin-right:17px;top:50%;margin-top:-5px}.wpcode-revision-list-item:first-child{background-color:var(--wpcode-background-highlight)}.wpcode-revision-list-author{display:inline-block;margin:0 10px 0 12px;font-weight:600;color:var(--wpcode-text-color-heading)}.wpcode-revision-list-date{color:var(--wpcode-text-color-light-bg)}.wpcode-remote-icon{background:#c5c5c6;border-radius:50%;display:inline-block;width:30px;height:30px;vertical-align:middle;text-align:center;line-height:30px}.wpcode-remote-icon svg path{fill:#fff}.wpcode-revision-list-item-actions{float:right;display:inline-flex;vertical-align:middle;align-items:center;margin-top:7px;margin-right:6px}.wpcode-revision-list-item-actions span,.wpcode-revision-list-item-actions a{font-size:12px;color:var(--wpcode-text-color-paragraph);margin-left:14px}.wpcode-revision-list-item-actions span:hover,.wpcode-revision-list-item-actions a:hover{text-decoration:none}

build/admin-bar.js000064400000002440151331545640010042 0ustar00!function(){"use strict";document.addEventListener("DOMContentLoaded",(function(){!function(){if(window.wpcode_admin_bar_info){var e=document.getElementById("wp-admin-bar-wpcode-loaded-on-this-page");if(e){var a=e.querySelector(".ab-submenu");a.innerHTML="",wpcode_admin_bar_info.forEach((function(e){var n=document.createElement("li");n.className="wpcode-admin-bar-info-location menupop",n.setAttribute("data-location-id",e.location_id),n.innerHTML='<a class="ab-item" aria-haspopup="true" href="'+e.href+'"><span class="wp-admin-bar-arrow" aria-hidden="true"></span>'+e.label+"</a>";var i=document.createElement("ul");i.className="ab-submenu",e.snippets.forEach((function(e){var a=document.createElement("li");a.className="wpcode-admin-bar-info-snippet",a.setAttribute("data-snippet-id",e.id),a.innerHTML='<a href="'+e.edit_link+'" class="ab-item">'+e.title+"</a>",i.appendChild(a)}));var t=document.createElement("div");t.className="ab-sub-wrapper",t.appendChild(i),n.appendChild(t),a.appendChild(n)}))}if(0===wpcode_admin_bar_info_count){var n=document.querySelector("#wp-admin-bar-wpcode-loaded-on-this-page .wp-admin-bar-arrow");n&&(n.style.display="none")}var i=document.querySelector("#wp-admin-bar-wpcode-loaded-on-this-page > .ab-item");i&&(i.innerHTML+=" ("+wpcode_admin_bar_info_count+")")}}()}))}();build/admin.css000064400000512035151331545640007462 0ustar00:root{--wpcode-background-gray:#F8F8F8;--wpcode-background-highlight:#F6FAFF;--wpcode-background-light:#F3F4F5;--wpcode-background-red:#DF2A35;--wpcode-background-white:#fff;--wpcode-border-color:#ddd;--wpcode-button-disabled-bg:#F5F5F5;--wpcode-button-disabled-border:1px solid #DDDDDD;--wpcode-button-disabled-text:#bbb;--wpcode-button-primary-bg:var(--wpcode-color-primary);--wpcode-button-primary-bg-hover:#397EEB;--wpcode-button-primary-text:#fff;--wpcode-button-primary-text-hover:#fff;--wpcode-button-secondary-bg:#F8F8F8;--wpcode-button-secondary-bg-hover:#fff;--wpcode-button-secondary-border:1px solid #DDDDDD;--wpcode-button-secondary-text:#777;--wpcode-button-orange-bg:#E06B44;--wpcode-button-orange-bg-hover:#e17f5e;--wpcode-button-secondary-text-hover:#454545;--wpcode-color-primary:#3568B7;--wpcode-color-red:#DF2A35;--wpcode-color-red-darker:#AB2028;--wpcode-font-size-l:18px;--wpcode-font-size-m:16px;--wpcode-font-size-s:14px;--wpcode-font-size-xl:22px;--wpcode-font-size-xs:12px;--wpcode-font-size-xxl:24px;--wpcode-input-border:1px solid #DDD;--wpcode-input-border-active:#3568B7;--wpcode-input-text-color:#454545;--wpcode-notice-success-bg:#09A347;--wpcode-notice-success-text:#fff;--wpcode-space-h:36px;--wpcode-space-v:24px;--wpcode-text-color-heading:#454545;--wpcode-text-color-highlight:#3568B7;--wpcode-text-color-light-bg:#848A8A;--wpcode-text-color-paragraph:#777777;--wpcode-text-color-placeholder:#bbb}@media screen and (max-width:782px){:root{--wpcode-space-h:24px}}:root .wpcode-dark-mode.wpcode-admin-page{--wpcode-background-gray:#2B2B2B;--wpcode-background-highlight:#1E293B;--wpcode-background-light:#3A3A3A;--wpcode-background-red:#A63239;--wpcode-background-white:#1E1E1E;--wpcode-border-color:#555;--wpcode-button-disabled-bg:#424242;--wpcode-button-disabled-border:1px solid #555;--wpcode-button-disabled-text:#777;--wpcode-button-primary-text:#fff;--wpcode-button-primary-text-hover:#fff;--wpcode-button-secondary-bg:#2B2B2B;--wpcode-button-secondary-bg-hover:#3A3A3A;--wpcode-button-secondary-border:1px solid #555;--wpcode-button-secondary-text:#ccc;--wpcode-button-orange-bg:#D97049;--wpcode-button-orange-bg-hover:#e59572;--wpcode-button-secondary-text-hover:#ddd;--wpcode-color-red:#fa525e;--wpcode-color-red-darker:#ec7d83;--wpcode-input-border:1px solid #555;--wpcode-input-border-active:#4A90E2;--wpcode-input-text-color:#ccc;--wpcode-notice-success-bg:#0BA858;--wpcode-notice-success-text:#fff;--wpcode-text-color-heading:#ccc;--wpcode-text-color-highlight:#4A90E2;--wpcode-text-color-light-bg:#A0A4A4;--wpcode-text-color-paragraph:#aaa;--wpcode-text-color-placeholder:#777}:root .wpcode-dark-mode.wpcode-admin-page table.widefat{background-color:var(--wpcode-background-white);border-color:var(--wpcode-border-color)}:root .wpcode-dark-mode.wpcode-admin-page .widefat td,:root .wpcode-dark-mode.wpcode-admin-page .widefat th{color:var(--wpcode-text-color-paragraph)}:root .wpcode-dark-mode.wpcode-admin-page .widefat tfoot tr td,:root .wpcode-dark-mode.wpcode-admin-page .widefat tfoot tr th,:root .wpcode-dark-mode.wpcode-admin-page .widefat thead tr td,:root .wpcode-dark-mode.wpcode-admin-page .widefat thead tr th{color:var(--wpcode-text-color-heading);border-color:var(--wpcode-border-color)}:root .wpcode-dark-mode.wpcode-admin-page.wp-core-ui select{background-color:var(--wpcode-background-gray);color:var(--wpcode-text-color-light-bg)}:root .wpcode-dark-mode.wpcode-admin-page.wpcode .button,:root .wpcode-dark-mode.wpcode-admin-page .button{background-color:var(--wpcode-button-secondary-bg);border-color:var(--wpcode-button-secondary-border);color:var(--wpcode-button-secondary-text)}:root .wpcode-dark-mode.wpcode-admin-page .button.button-primary{background-color:var(--wpcode-color-primary);border-color:var(--wpcode-border-color);color:var(--wpcode-button-primary-text)}:root .wpcode-dark-mode.wpcode-admin-page .wpcode-checkbox-toggle .wpcode-checkbox-toggle-slider{background-color:#555}:root .wpcode-dark-mode.wpcode-admin-page .wpcode-checkbox-toggle .wpcode-checkbox-toggle-slider:before{background-color:#ccc}:root .wpcode-dark-mode.wpcode-admin-page .wpcode-checkbox-toggle input:checked+.wpcode-checkbox-toggle-slider{background-color:var(--wpcode-color-primary)}:root .wpcode-dark-mode.wpcode-admin-page #wpfooter{color:var(--wpcode-text-color-paragraph)}:root .wpcode-dark-mode.wpcode-admin-page #wpfooter a{color:var(--wpcode-color-primary)}:root .wpcode-dark-mode.wpcode-admin-page input[type=color],:root .wpcode-dark-mode.wpcode-admin-page input[type=date],:root .wpcode-dark-mode.wpcode-admin-page input[type=datetime-local],:root .wpcode-dark-mode.wpcode-admin-page input[type=datetime],:root .wpcode-dark-mode.wpcode-admin-page input[type=email],:root .wpcode-dark-mode.wpcode-admin-page input[type=month],:root .wpcode-dark-mode.wpcode-admin-page input[type=number],:root .wpcode-dark-mode.wpcode-admin-page input[type=password],:root .wpcode-dark-mode.wpcode-admin-page input[type=search],:root .wpcode-dark-mode.wpcode-admin-page input[type=tel],:root .wpcode-dark-mode.wpcode-admin-page input[type=text],:root .wpcode-dark-mode.wpcode-admin-page input[type=time],:root .wpcode-dark-mode.wpcode-admin-page input[type=url],:root .wpcode-dark-mode.wpcode-admin-page input[type=week],:root .wpcode-dark-mode.wpcode-admin-page select,:root .wpcode-dark-mode.wpcode-admin-page textarea{background-color:var(--wpcode-background-gray);border-color:var(--wpcode-input-border);color:var(--wpcode-input-text-color)}:root .wpcode-dark-mode.wpcode-admin-page h3{color:var(--wpcode-text-color-heading)}:root .wpcode-dark-mode.wpcode-admin-page ul#adminmenu a.wp-has-current-submenu:after,:root .wpcode-dark-mode.wpcode-admin-page ul#adminmenu>li.current>a.current:after{border-right-color:var(--wpcode-background-light)}:root .wpcode-dark-mode.wpcode-admin-page input[type=checkbox],:root .wpcode-dark-mode.wpcode-admin-page input[type=radio]{background-color:var(--wpcode-background-gray);border-color:var(--wpcode-input-border);color:var(--wpcode-input-text-color)}:root .wpcode-dark-mode.wpcode-admin-page.wp-core-ui .button-disabled,:root .wpcode-dark-mode.wpcode-admin-page.wp-core-ui .button-secondary.disabled,:root .wpcode-dark-mode.wpcode-admin-page.wp-core-ui .button-secondary:disabled,:root .wpcode-dark-mode.wpcode-admin-page.wp-core-ui .button-secondary[disabled],:root .wpcode-dark-mode.wpcode-admin-page.wp-core-ui .button.disabled,:root .wpcode-dark-mode.wpcode-admin-page.wp-core-ui .button:disabled,:root .wpcode-dark-mode.wpcode-admin-page.wp-core-ui .button[disabled]{background-color:var(--wpcode-button-disabled-bg) !important;border-color:var(--wpcode-button-disabled-border) !important;color:var(--wpcode-button-disabled-text) !important}:root .wpcode-dark-mode.wpcode-admin-page a{color:var(--wpcode-text-color-light-bg)}:root .wpcode-dark-mode.wpcode-admin-page a:hover{color:var(--wpcode-input-border-active)}:root .wpcode-dark-mode.wpcode-admin-page .ac_match,:root .wpcode-dark-mode.wpcode-admin-page .subsubsub a.current{color:var(--wpcode-button-primary-text)}:root .wpcode-dark-mode.wpcode-admin-page .subsubsub a .count,:root .wpcode-dark-mode.wpcode-admin-page .subsubsub a.current .count{color:var(--wpcode-button-secondary-text)}:root .wpcode-dark-mode.wpcode-admin-page .wpcode-button{color:var(--wpcode-button-primary-text)}:root .wpcode-dark-mode.wpcode-admin-page .wpcode-button:hover{color:var(--wpcode-button-primary-text-hover)}:root .wpcode-dark-mode.wpcode-admin-page .wp-list-table.wpcode-snippets td.column-tags a{color:var(--wpcode-text-color-light-bg)}:root .wpcode-dark-mode.wpcode-admin-page{color:var(--wpcode-text-color-paragraph)}:root .wpcode-dark-mode.wpcode-admin-page #wpcode-header-between #screen-meta-links .show-settings{color:var(--wpcode-text-color-light-bg)}:root .wpcode-dark-mode.wpcode-admin-page #wpcode-header-between #screen-meta-links .show-settings:hover{color:var(--wpcode-input-border-active)}:root .wpcode-dark-mode.wpcode-admin-page .notice{background:var(--wpcode-background-white);border-color:var(--wpcode-border-color)}:root .wpcode-dark-mode.wpcode-admin-page .select2-container--default .select2-selection--multiple,:root .wpcode-dark-mode.wpcode-admin-page .select2-dropdown{background-color:var(--wpcode-background-gray);border-color:var(--wpcode-input-border);color:var(--wpcode-input-text-color)}:root .wpcode-dark-mode.wpcode-admin-page .wpcode-content .select2-container.select2-container--default .select2-selection--multiple{border-color:var(--wpcode-input-border)}:root .wpcode-dark-mode.wpcode-admin-page .wpcode-button-toggle svg path{fill:var(--wpcode-text-color-light-bg)}:root .wpcode-dark-mode.wpcode-admin-page .flatpickr-calendar{background-color:var(--wpcode-background-gray);border-color:var(--wpcode-input-border);color:var(--wpcode-input-text-color)}:root .wpcode-dark-mode.wpcode-admin-page .flatpickr-day{color:var(--wpcode-input-text-color)}:root .wpcode-dark-mode.wpcode-admin-page .flatpickr-time .flatpickr-time-separator,:root .wpcode-dark-mode.wpcode-admin-page .flatpickr-time .flatpickr-am-pm,:root .wpcode-dark-mode.wpcode-admin-page span.flatpickr-weekday{color:var(--wpcode-text-color-paragraph)}:root .wpcode-dark-mode.wpcode-admin-page .flatpickr-months .flatpickr-prev-month,:root .wpcode-dark-mode.wpcode-admin-page .flatpickr-months .flatpickr-next-month{color:var(--wpcode-text-color-paragraph);fill:var(--wpcode-text-color-paragraph)}:root .wpcode-dark-mode.wpcode-admin-page .flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:var(--wpcode-text-color-paragraph)}:root .wpcode-dark-mode.wpcode-admin-page .flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:var(--wpcode-text-color-paragraph)}:root .wpcode-dark-mode.wpcode-admin-page .wpcode-admin-tabs li button,:root .wpcode-dark-mode.wpcode-admin-page .wpcode-admin-tabs li a{border-bottom-color:var(--wpcode-border-color)}:root .wpcode-dark-mode.wpcode-admin-page .wpcode-admin-tabs li button.active,:root .wpcode-dark-mode.wpcode-admin-page .wpcode-admin-tabs li a.active{border-color:var(--wpcode-color-primary)}:root .wpcode-dark-mode.wpcode-admin-page table.diff .diff-deletedline{background-color:#3b0309}:root .wpcode-dark-mode.wpcode-admin-page table.diff .diff-addedline{background-color:#042a04}.wpcode-button{background-color:var(--wpcode-button-primary-bg);border:1px solid var(--wpcode-button-primary-bg);border-radius:4px;color:var(--wpcode-button-primary-text);cursor:pointer;display:inline-block;font-size:var(--wpcode-font-size-s);font-weight:700;line-height:1;padding:10px 16px;text-decoration:none}.wpcode-button.wpcode-button-icon{align-items:center;display:inline-flex;padding-bottom:12px;padding-top:12px}.wpcode-button.wpcode-button-icon svg{margin-right:5px}.wpcode-button.wpcode-button-icon.wpcode-copy-target{padding-bottom:10px;padding-top:10px}.wpcode-button.wpcode-button-wide{padding-left:50px;padding-right:50px}.wpcode-button:hover,.wpcode-button:focus{background-color:var(--wpcode-button-primary-bg-hover);border-color:var(--wpcode-button-primary-bg-hover);color:var(--wpcode-button-primary-text-hover)}.wpcode-button.wpcode-button-secondary{background-color:var(--wpcode-button-secondary-bg);border:var(--wpcode-button-secondary-border);color:var(--wpcode-button-secondary-text)}.wpcode-button.wpcode-button-secondary:hover,.wpcode-button.wpcode-button-secondary:focus{background-color:var(--wpcode-button-secondary-bg-hover);color:var(--wpcode-button-secondary-text-hover)}.wpcode-button.wpcode-button-secondary.wpcode-button-secondary-inactive{background-color:var(--wpcode-button-disabled-bg);border-color:var(--wpcode-button-disabled-bg)}.wpcode-button.wpcode-button-secondary.wpcode-button-secondary-selected{border-color:var(--wpcode-button-primary-bg)}.wpcode-button.wpcode-button-orange{background-color:var(--wpcode-button-orange-bg);border-color:var(--wpcode-button-orange-bg);color:var(--wpcode-button-primary-text)}.wpcode-button.wpcode-button-orange:hover,.wpcode-button.wpcode-button-orange:focus{background-color:var(--wpcode-button-orange-bg-hover);color:var(--wpcode-button-primary-text)}.wpcode-button.wpcode-button-large{align-items:center;display:inline-flex;font-size:var(--wpcode-font-size-m);height:56px;justify-content:center;padding-left:var(--wpcode-space-h);padding-right:var(--wpcode-space-h);text-align:center}.wpcode-button.wpcode-button-large svg{margin-right:7px}.wpcode-button.wpcode-button-small{font-size:var(--wpcode-font-size-xs);padding:9px}.wpcode-button:disabled:hover,.wpcode-button:disabled{background-color:var(--wpcode-button-disabled-bg);border:var(--wpcode-button-disabled-border);color:var(--wpcode-button-disabled-text)}.wpcode-button-toggle{align-items:center;display:flex;justify-content:space-between}@media screen and (min-width:783px){.wpcode-button-toggle{min-width:424px}}.wpcode-button-toggle .wpcode-button{width:calc(50% - 5px);background:var(--wpcode-background-white);color:var(--wpcode-input-text-color)}.wpcode-button-toggle .wpcode-button-secondary{border:2px solid var(--wpcode-color-primary)}.wpcode-success-icon{display:none}.wpcode-show-success-icon .wpcode-success-icon{display:inline-block}.wpcode-show-success-icon .wpcode-default-icon{display:none}.wpcode-button-just-icon{background:none;border:none;cursor:pointer;padding:0}.wpcode-button-just-icon .wpcode-icon{display:block}.wpcode-text-button-icon{align-items:center;background:none;border:none;color:var(--wpcode-text-color-paragraph);cursor:pointer;display:inline-flex;font-size:var(--wpcode-font-size-s);font-weight:600;padding:0}.wpcode-text-button-icon:hover{color:var(--wpcode-text-color-heading)}.wpcode-text-button-icon:hover path{fill:var(--wpcode-text-color-heading)}.wpcode-text-button-icon .wpcode-icon{margin-right:5px}.wpcode-just-icon-button{background:none;border:none;cursor:pointer}.wpcode-button-text{background:none;border:none;color:var(--wpcode-text-color-paragraph);cursor:pointer;font-size:var(--wpcode-font-size-xs);padding:0;text-decoration:underline}.wpcode-button-text .wpcode-icon{margin-right:11px}.wpcode-button-text:focus,.wpcode-button-text:hover{text-decoration:none;background:none;color:var(--wpcode-text-color-heading)}.wpcode-button-text:focus svg path,.wpcode-button-text:hover svg path{fill:var(--wpcode-text-color-heading)}#wpbody-content .wpcode-button-ai-generate{position:relative;background:var(--wpcode-color-primary);border:none;color:white;cursor:pointer;overflow:hidden;z-index:1;border-radius:5px;transition:background-color 0.5s ease 0s,color 0.5s ease 0s}#wpbody-content .wpcode-button-ai-generate svg path{fill:#fff;transition:fill 0.5s ease 0s}#wpbody-content .wpcode-button-ai-generate .wpcode-button-ai-text-done,#wpbody-content .wpcode-button-ai-generate .wpcode-button-ai-text-loading{display:none}#wpbody-content .wpcode-button-ai-generate:focus,#wpbody-content .wpcode-button-ai-generate:hover{background:var(--wpcode-color-primary);color:#fff}#wpbody-content .wpcode-button-ai-generate:focus:before,#wpbody-content .wpcode-button-ai-generate:hover:before{opacity:0}#wpbody-content .wpcode-button-ai-generate:before{content:'';position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(90deg,#6e2dfb 0%,#a01cfd 100%);transition:opacity 0.5s ease;z-index:-1}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-loading{background:white;color:#a01cfd}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done:before,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-loading:before{display:none}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done svg path,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-loading svg path{fill:#a01cfd;-webkit-animation-name:wpcode-shape-scale;animation-name:wpcode-shape-scale;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;transform-origin:center center;transform-box:fill-box}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done g:nth-child(2) path,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-loading g:nth-child(2) path{-webkit-animation-delay:0.75s;animation-delay:0.75s}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done g:nth-child(3) path,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-loading g:nth-child(3) path{-webkit-animation-delay:1.5s;animation-delay:1.5s}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done .wpcode-button-ai-text-default,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-loading .wpcode-button-ai-text-default{display:none}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done .wpcode-button-ai-text-loading,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-loading .wpcode-button-ai-text-loading{display:block}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done .wpcode-button-ai-text-done{display:block}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done .wpcode-button-ai-text-default,#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-done .wpcode-button-ai-text-loading{display:none}#wpbody-content .wpcode-button-ai-generate.wpcode-button-ai-not-available{filter:grayscale(1)}.wpcode-ai-improve{margin-right:14px;padding:10px 10px}.wpcode-ai-improve svg path{fill:#a01cfd}.wpcode-headers-footers #wpcontent,.wpcode-admin-page #wpcontent{padding-left:0 !important}.wpcode-headers-footers #wpwrap,.wpcode-admin-page #wpwrap{background:var(--wpcode-background-light)}.wpcode-header-top{align-items:center;background:var(--wpcode-background-gray);display:flex;justify-content:space-between;padding:var(--wpcode-space-v) var(--wpcode-space-h)}.wpcode-header-right{display:flex;flex-flow:wrap;justify-content:flex-end}@media screen and (min-width:783px){.wpcode-header-right{display:block}}.wpcode-header-right .wpcode-toggle-testing-mode-wrap{order:3;margin-top:14px}@media screen and (min-width:783px){.wpcode-header-right .wpcode-toggle-testing-mode-wrap{margin-top:0}}.wpcode-header-right button{margin-left:18px;vertical-align:middle;order:1}.wpcode-header-left svg{display:block}.wpcode-header-bottom{align-items:center;background:var(--wpcode-background-white);border-color:var(--wpcode-border-color);border-style:solid;border-width:1px 0;display:flex;justify-content:space-between;min-height:60px;padding:0 var(--wpcode-space-h)}@media screen and (max-width:782px){.wpcode-header-bottom{flex-flow:wrap;padding-top:calc(var(--wpcode-space-v) / 2);padding-bottom:calc(var(--wpcode-space-v) / 2)}}.wpcode-header-bottom h1{color:var(--wpcode-text-color-heading);font-size:var(--wpcode-font-size-xl);margin:0}@media screen and (min-width:783px){.wpcode-header-bottom.wpcode-sticky{left:160px;position:fixed;right:0;top:32px;z-index:1055}}.folded .wpcode-header-bottom.wpcode-sticky{left:36px}.wpcode-column{align-items:center;display:flex;flex-flow:row;margin:6px 0}@media screen and (min-width:783px){.wpcode-column{margin:0}}#wpcode-header-logo{display:block}.wpcode-notifications-inbox{position:relative}.wpcode-notifications-inbox[data-count]:after{background:var(--wpcode-color-red);border-radius:50%;bottom:100%;color:#fff;content:attr(data-count);display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:700;height:16px;left:100%;line-height:18px;min-width:16px;position:absolute;text-align:center;transform:translate(-50%,50%)}.toplevel_page_wpcode .wpcode-header-top{margin-top:40px}@media screen and (min-width:783px){.toplevel_page_wpcode .wpcode-header-top{margin-top:0}}.wpcode-snippet-manager .wpcode-header-bottom .wpcode-column .wpcode-button{margin-left:12px}.wpcode-snippet-manager .wpcode-header-bottom .wpcode-column .wpcode-button.wpcode-button-save-to-library{margin-left:0}@media screen and (max-width:782px){.wpcode-title-button h1{margin-right:20px}}.wpcode-mobile-dropdown-toggle{display:none}@media screen and (max-width:1160px){.wpcode-mobile-dropdown-toggle{display:block}}@media screen and (max-width:1160px){#wpcode-snippet-type-buttons.wpcode-admin-tabs{display:block;overflow:hidden;height:60px}#wpcode-snippet-type-buttons.wpcode-admin-tabs li{float:none !important;display:block}#wpcode-snippet-type-buttons.wpcode-admin-tabs.wpcode-open{height:auto}.wpcode-title-button{display:flex;align-items:flex-start}.wpcode-title-button>.wpcode-button{margin-top:10px}.wpcode-title-button>.wpcode-mobile-dropdown-toggle{margin-top:15px;margin-right:20px}}.wpcode-admin-tabs{font-size:14px;list-style:none;margin:0;overflow:auto;padding:0}.wpcode-admin-tabs li{float:left;margin:0 30px 0 0;padding:0}.wpcode-admin-tabs li button{border:none;background:transparent;cursor:pointer}.wpcode-admin-tabs li button,.wpcode-admin-tabs li a{border-bottom:4px solid #fff;box-shadow:none;color:var(--wpcode-text-color-paragraph);display:block;font-weight:600;padding:20px 0 18px 0;text-decoration:none;transition:border 300ms ease}.wpcode-admin-tabs li button.wpcode_pro_type_lite,.wpcode-admin-tabs li a.wpcode_pro_type_lite{opacity:0.5}.wpcode-admin-tabs li button.wpcode_pro_type_lite:hover,.wpcode-admin-tabs li a.wpcode_pro_type_lite:hover{border:none}.wpcode-admin-tabs li button.wpcode_pro_type_lite:focus,.wpcode-admin-tabs li a.wpcode_pro_type_lite:focus{border:none}.wpcode-admin-tabs li button.active,.wpcode-admin-tabs li a.active{border-color:var(--wpcode-color-primary);color:var(--wpcode-text-color-heading)}.wpcode-admin-tabs li button:focus,.wpcode-admin-tabs li a:focus{border-color:var(--wpcode-color-primary)}.wpcode-admin-tabs li button:hover,.wpcode-admin-tabs li a:hover{border-color:var(--wpcode-text-color-paragraph)}.wpcode-admin-tab-content{display:none;position:relative}.wpcode-admin-tab-content.active{display:block}.wpcode-content{padding:28px var(--wpcode-space-h)}.wpcode-content *{box-sizing:border-box}.wpcode-content h2{color:var(--wpcode-text-color-heading);font-size:var(--wpcode-font-size-l)}.wpcode-content p{color:var(--wpcode-text-color-paragraph);font-size:var(--wpcode-font-size-s)}.wpcode-add-snippet .wpcode-content{padding-top:20px}.wpcode-content>hr{margin-bottom:36px;margin-top:36px}.wpcode-code-textarea h2{margin:12px 0 20px}.wrap{margin:0;padding:0 var(--wpcode-space-h)}.wrap div.error,.wrap div.updated{margin-bottom:0;position:relative}.wrap div:first-child{margin-top:28px}#wpcontent .wrap .wpcode-review-step{margin-top:0}#wpfooter{padding-left:var(--wpcode-space-h);padding-right:var(--wpcode-space-h)}.wpcode-modal-overlay{background:rgba(0,0,0,0.3);bottom:0;display:none;left:0;position:fixed;right:0;top:0;z-index:1000}.admin-bar .wpcode-modal-overlay{top:32px}.wpcode-show-modal .wpcode-modal-overlay{display:block}.wpcode-modal{background:#fff;border:1px solid var(--wpcode-border-color);border-radius:8px;display:none;left:50%;max-width:100%;padding:25px;position:fixed;top:50%;transform:translate(-50%,-50%);width:752px;z-index:1050}.wpcode-show-modal .wpcode-modal{display:block}@media screen and (min-width:783px){.wpcode-modal{margin-left:18px}}@media screen and (min-width:961px){.wpcode-modal{margin-left:80px}.folded .wpcode-modal{margin-left:18px}}.wpcode-content .CodeMirror{border:1px solid var(--wpcode-border-color);border-radius:3px 3px 0 0;font-size:var(--wpcode-font-size-s);line-height:25px}.wpcode-content .CodeMirror .CodeMirror-matchingbracket{background:rgba(219,166,23,.3);color:inherit}.wpcode-content .CodeMirror-linenumber{color:var(--wpcode-text-color-light-bg);font-size:var(--wpcode-font-size-xs)}.wpcode-content .CodeMirror-lines{padding:20px 0}.wpcode-content .CodeMirror-gutters{background-color:var(--wpcode-button-disabled-bg)}.wpcode-content .CodeMirror-focused .cm-matchhighlight{background-color:var(--wpcode-border-color)}.wpcode-editor-auto .CodeMirror{height:auto;min-height:300px;border-radius:3px}.wpcode-editor-auto .CodeMirror-sizer{min-height:300px !important}.CodeMirror-sizer:before{color:var(--wpcode-text-color-light-bg);position:absolute}[data-code-type="php"] .CodeMirror-sizer:before{content:"<?php"}[data-code-type="js"] .CodeMirror-sizer:before{content:"<script>"}.wpcode-dark-mode .CodeMirror{background:#1c1b1b;color:#fff}.wpcode-dark-mode div.CodeMirror-selected{background:#545167 !important}.wpcode-dark-mode .CodeMirror-gutters{background:#1c1b1b;border-right:0}.wpcode-dark-mode .CodeMirror-linenumber{color:#545167}.wpcode-dark-mode .CodeMirror-cursor{border-left:1px solid #ffad5c;border-right:.5em solid #ffad5c;opacity:.5}.wpcode-dark-mode .CodeMirror-activeline-background{background:#363342;opacity:.5}.wpcode-dark-mode .cm-fat-cursor .CodeMirror-cursor{background:#ffad5c;opacity:.5}.wpcode-dark-mode span.cm-atom,.wpcode-dark-mode span.cm-attribute,.wpcode-dark-mode span.cm-hr,.wpcode-dark-mode span.cm-keyword,.wpcode-dark-mode span.cm-link,.wpcode-dark-mode span.cm-quote,.wpcode-dark-mode span.cm-variable{color:#fff}.wpcode-dark-mode span.cm-keyword{color:#88aece}.wpcode-dark-mode span.cm-number{color:#f08d49}.wpcode-dark-mode span.cm-property{color:#9a86fd}.wpcode-dark-mode span.cm-negative,.wpcode-dark-mode span.cm-punctuation,.wpcode-dark-mode span.cm-unit{color:#e09142}.wpcode-dark-mode span.cm-string{color:#b5bd68}.wpcode-dark-mode span.cm-operator{color:#fff}.wpcode-dark-mode span.cm-positive{color:#6a51e6}.wpcode-dark-mode span.cm-string-2,.wpcode-dark-mode span.cm-type,.wpcode-dark-mode span.cm-url,.wpcode-dark-mode span.cm-variable-2,.wpcode-dark-mode span.cm-variable-3{color:#fff}.wpcode-dark-mode span.cm-builtin,.wpcode-dark-mode span.cm-def,.wpcode-dark-mode span.cm-em,.wpcode-dark-mode span.cm-header,.wpcode-dark-mode span.cm-qualifier,.wpcode-dark-mode span.cm-tag{color:#eeebff}.wpcode-dark-mode span.cm-bracket,.wpcode-dark-mode span.cm-comment{color:#999}.wpcode-dark-mode span.cm-error,.wpcode-dark-mode span.cm-invalidchar{color:red}.wpcode-dark-mode span.cm-header{font-weight:400}.wpcode-dark-mode .CodeMirror-matchingbracket{color:#eeebff !important;text-decoration:underline}.wpcode-resize-handle{background:#f7f7f7;height:20px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:row-resize;border-bottom:1px solid #ddd;border-left:1px solid #ddd;border-right:1px solid #ddd;margin-bottom:var(--wpcode-space-h);border-radius:0 0 3px 3px}.wpcode-resize-handle:before{content:'\2261';color:#999;position:absolute;left:50%}.wpcode-resize-handle:hover{background:#f0f0f0}.wpcode-resize-handle:hover:before{color:#000}.wpcode-resizing .CodeMirror{min-height:200px !important}.wpcode-editor-auto .wpcode-resize-handle,.wpcode-code-type-blocks .wpcode-resize-handle,.wpcode-code-type-text .wpcode-resize-handle{display:none}.wpcode-editor-auto .wpcode-code-textarea,.wpcode-code-type-blocks .wpcode-code-textarea,.wpcode-code-type-text .wpcode-code-textarea{margin-bottom:var(--wpcode-space-h)}.wpcode-input-title input.wpcode-input-text{font-size:var(--wpcode-font-size-m)}input.wpcode-input-number,input.wpcode-input-text{border:var(--wpcode-input-border);border-radius:4px;color:var(--wpcode-input-text-color);font-size:var(--wpcode-font-size-s);height:40px}input.wpcode-input-number:focus,input.wpcode-input-text:focus{border-color:var(--wpcode-input-border-active)}input.wpcode-input-text{width:100%}.wpcode-input-textarea{border:var(--wpcode-input-border);border-radius:4px;color:var(--wpcode-input-text-color);font-size:var(--wpcode-font-size-s);max-width:100%;resize:none;width:424px}.wpcode-input-select{align-items:center;display:flex}.wpcode-input-select label{color:var(--wpcode-text-color-heading);font-size:var(--wpcode-font-size-s);font-weight:600}.wpcode-input-select .wpcode-checkbox-toggle,.wpcode-input-select select{margin-left:13px}.wpcode-metabox-form-row-input{width:100%;position:relative}.wpcode-metabox-form-row-input select{min-width:424px}@media screen and (max-width:782px){.wpcode-metabox-form-row-input select{min-width:0;width:100%}}.wpcode-inline-select select{min-width:98px}.wpcode-inline-select>label{color:var(--wpcode-text-color-paragraph);display:inline-block;font-size:13px;margin-left:12px}.wpcode-separator{border-color:var(--wpcode-border-color);border-style:solid;border-width:1px 0 0;margin:var(--wpcode-space-v) 0}.wpcode-checkbox-toggle{display:inline-block;height:20px;position:relative;width:36px}.wpcode-checkbox-toggle input{opacity:0;height:100%;width:100%;position:absolute}.wpcode-checkbox-toggle input:checked+.wpcode-checkbox-toggle-slider{background-color:var(--wpcode-color-primary)}.wpcode-checkbox-toggle input:checked+.wpcode-checkbox-toggle-slider:before{transform:translateX(16px)}.wpcode-checkbox-toggle input:focus+.wpcode-checkbox-toggle-slider{outline:1px dotted #212121;outline:1px auto -webkit-focus-ring-color}.wpcode-checkbox-toggle input:focus:not(:focus-visible)+.wpcode-checkbox-toggle-slider{outline:none}.wpcode-checkbox-toggle .wpcode-checkbox-toggle-slider{background-color:#ccc;border-radius:20px;bottom:0;cursor:pointer;left:0;position:absolute;right:0;top:0;transition:.4s}.wpcode-checkbox-toggle .wpcode-checkbox-toggle-slider:before{background-color:white;border-radius:50%;bottom:3px;content:"";height:14px;left:3px;position:absolute;transition:.4s;width:14px}.wpcode-checkbox-toggle-label{margin-left:14px;color:var(--wpcode-text-color-heading);font-size:14px;font-weight:600}.wpcode-checkbox-row{margin-bottom:25px}.wpcode-checkbox-row.wpcode-checkbox-row-disabled{opacity:0.7;cursor:not-allowed;pointer-events:none}.wpcode-checkbox-row .description{margin:14px 0}.wpcode-input-radio{margin-right:20px;flex:1 1;text-align:center}.wpcode-input-radio label{display:flex;flex-flow:column;border-radius:4px;justify-content:center;padding:20px;background-color:var(--wpcode-button-disabled-bg);border:2px solid var(--wpcode-button-disabled-bg);color:var(--wpcode-text-color-paragraph)}.wpcode-input-radio label:hover{color:var(--wpcode-text-color-heading)}.wpcode-input-radio label:hover svg path{fill:var(--wpcode-text-color-heading)}.wpcode-input-radio input[type="radio"]{opacity:0;position:absolute}.wpcode-input-radio input[type="radio"]:checked+label{border-color:var(--wpcode-color-primary);background:var(--wpcode-background-white);color:var(--wpcode-text-color-heading)}.wpcode-input-radio input[type="radio"]:checked+label svg path{fill:var(--wpcode-text-color-heading)}.wpcode-input-radio input[type="radio"]:disabled+label{opacity:0.9}.wpcode-input-radio input[type="radio"]:disabled+label:hover{color:var(--wpcode-text-color-paragraph)}.wpcode-input-radio input[type="radio"]:disabled+label:hover svg path{fill:var(--wpcode-text-color-paragraph)}.wpcode-input-radio .wpcode-input-radio-icon{text-align:center}.wpcode-input-radio .wpcode-input-radio-label{font-size:16px;font-weight:600;margin-top:10px;display:block}.wpcode-input-with-button{display:flex;width:100%}.wpcode-input-with-button .wpcode-input-text{margin-right:10px;width:100%}.wpcode-input-with-button .wpcode-button{padding-bottom:10px;padding-top:10px}.wpcode-snippet-manager.wp-core-ui select,.wpcode-tools.wp-core-ui select,.wpcode-generator.wp-core-ui select{background-position-x:calc(100% - 13px);border-color:var(--wpcode-border-color);border-radius:4px;color:var(--wpcode-text-color-heading);line-height:38px;min-height:40px;padding-left:12px;padding-right:32px}.wpcode-content .select2-container .select2-search--inline{margin:0}.wpcode-content .select2-container .select2-search--inline .select2-search__field{color:var(--wpcode-text-color-heading);font-size:14px;margin:5px 5px 0}.wpcode-content .select2-container.select2-container--default .select2-selection--multiple{border-color:var(--wpcode-border-color)}.wpcode-content .select2-container.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:var(--wpcode-button-disabled-bg);border:none;border-radius:3px;color:var(--wpcode-text-color-heading);font-size:14px;margin:9px 8px 9px 0;padding:1px 4px}.wpcode-content .select2-container.select2-container--default .select2-selection--multiple .select2-selection__rendered{display:block;padding:0 8px}.wpcode-content .select2-container.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:4px}.wpcode-content .select2-container .select2-selection--single{height:40px;font-size:var(--wpcode-font-size-s);border-color:var(--wpcode-border-color)}.wpcode-content .select2-container .select2-selection--single .select2-selection__rendered{padding:0 8px;line-height:40px}.wpcode-content .select2-container .select2-selection--single .select2-selection__arrow{height:40px;width:30px}.wpcode-admin-page .select2-dropdown{border-color:var(--wpcode-border-color);color:var(--wpcode-text-color-heading)}.wpcode-admin-page .select2-results .wpcode-pro-pill{margin-left:7px;vertical-align:middle}.wpcode-admin-page .select2-results>.select2-results__options>.select2-results__option[role="list"]{padding:0}.wpcode-checkboxes-list label{display:block;margin-bottom:16px}.wpcode-checkboxes-list input{margin-right:12px}.wpcode-file-upload .wpcode-file-field{background-color:var(--wpcode-background-white);border:1px solid #ddd;border-radius:3px;box-shadow:none;color:var(--wpcode-text-color-paragraph);display:inline-block;margin:0 10px 0 0;min-height:40px;overflow:hidden;padding:10px 10px;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap;width:400px}.wpcode-file-upload input[type=file]{height:0.1px;opacity:0;overflow:hidden;position:absolute;width:0.1px;z-index:-1}.wpcode-file-upload label{cursor:pointer;display:inline-flex;outline:none;padding:0;text-overflow:ellipsis;white-space:nowrap}.wpcode-checkbox-multiselect-columns{max-width:600px;position:relative}.wpcode-checkbox-multiselect-columns:after{clear:both;content:".";display:block;font-size:0;height:0;line-height:0;min-height:0;visibility:hidden}.wpcode-checkbox-multiselect-columns:before{background-image:url("data:image/svg+xml,%3Csvg width=%2718%27 height=%2714%27 viewBox=%270 0 18 14%27 fill=%27none%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M3.99 6L0 10L3.99 14V11H11V9H3.99V6ZM18 4L14.01 0V3H7V5H14.01V8L18 4Z%27 fill=%27%23999%27/%3E%3C/svg%3E%0A");color:#999;content:"";display:block;height:14px;left:50%;margin:0 0 0 -10px;position:absolute;top:130px;width:18px}.wpcode-checkbox-multiselect-columns .header{font-size:13px;font-weight:600;margin:0;padding:0 0 5px 0;text-align:center}.wpcode-checkbox-multiselect-columns .first-column,.wpcode-checkbox-multiselect-columns .second-column{float:left;width:45%}.wpcode-checkbox-multiselect-columns .second-column{float:right}.wpcode-checkbox-multiselect-columns .second-column ul li{padding:10px}.wpcode-checkbox-multiselect-columns ul{background-color:#fff;border:1px solid #ddd;border-radius:3px;height:250px;list-style-type:none;margin:0;overflow-y:auto;padding:0;position:relative}.wpcode-checkbox-multiselect-columns ul li{border-bottom:1px #eee solid;color:var(--wpcode-text-color-paragraph);font-size:14px;margin:0}.wpcode-checkbox-multiselect-columns ul li label{display:block;padding:10px 10px 10px 32px;position:relative;vertical-align:baseline}.wpcode-checkbox-multiselect-columns ul li label:hover{background-color:var(--wpcode-color-primary);color:#fff}.wpcode-checkbox-multiselect-columns ul li label:before{color:#ddd;content:"\f0c8";font:normal normal normal 16px/1 Georgia;-webkit-font-smoothing:antialiased;left:10px;-moz-osx-font-smoothing:grayscale;position:absolute;text-rendering:auto;top:12px}.wpcode-checkbox-multiselect-columns ul li label.checked{color:rgba(119,119,119,0.6)}.wpcode-checkbox-multiselect-columns ul li label.checked:hover{color:#fff}.wpcode-checkbox-multiselect-columns ul li label.checked:before{background-image:url("data:image/svg+xml,%3Csvg width=%2710%27 height=%278%27 viewBox=%270 0 10 8%27 fill=%27none%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M1.38462 3.03448L0 4.13793L3.23077 8H4.46154L10 0.965517L8.76923 0L3.69231 4.96552L1.38462 3.03448Z%27 fill=%27%234982BF%27/%3E%3C/svg%3E%0A");background-position:3px 3px;background-repeat:no-repeat;background-size:10px 8px}.wpcode-checkbox-multiselect-columns ul li label input{display:none}.wpcode-checkbox-multiselect-columns .all{color:#999;display:inline-block;font-size:13px;margin:10px 0 0}.wpcode-admin-page .select2-container--default{font-size:12px;font-weight:500}.wpcode-admin-page .select2-container--default .select2-results__option .select2-results__option{padding-left:30px;color:var(--wpcode-text-color-heading);font-weight:500;margin-bottom:0}.wpcode-admin-page .select2-container--default .select2-results__option .select2-results__option[aria-disabled=true]{color:var(--wpcode-text-color-paragraph);opacity:0.5}.wpcode-admin-page .select2-container--default .select2-results__option .select2-results__option[aria-selected=true]{background-color:var(--wpcode-button-primary-bg);color:#fff}.wpcode-admin-page .select2-container--default .select2-results__option--highlighted[aria-selected]{background:var(--wpcode-button-disabled-bg);color:var(--wpcode-text-color-light-bg)}.wpcode-admin-page .select2-container--default .select2-results__group{padding-left:16px;color:var(--wpcode-text-color-paragraph);font-weight:500}label .wpcode-icon-mobile{transform:scale(0.86)}.wpcode-wide-text{width:100%;max-width:500px}.wpcode-metabox-form-row-input .wpcode-alert{max-width:800px}.wpcode-label-text-row p:first-child{margin-top:0}.wpcode-input-row-schedule{display:flex;justify-content:space-between}.wpcode-input-row-schedule .wpcode-input-row-input{width:calc(50% - 10px);position:relative}.wpcode-input-row-schedule+.wpcode-help-tooltip,.wpcode-input-with-button+.wpcode-help-tooltip{position:absolute;left:100%;top:10px;margin-left:15px}@media screen and (max-width:782px){.wpcode-input-row-schedule+.wpcode-help-tooltip,.wpcode-input-with-button+.wpcode-help-tooltip{display:none}}.wpcode-input-button-clear{position:absolute;right:7px;top:15px;width:14px;height:14px;border:none;text-align:center;margin:0;padding:0;background:transparent;cursor:pointer;border-radius:50%}.wpcode-input-button-clear svg{width:14px;height:14px;display:block}.wpcode-input-button-clear svg path{}.wpcode-flex{display:flex}.wpcode-code-textarea>.wpcode-flex{justify-content:space-between}@media screen and (max-width:782px){.wpcode-code-textarea>.wpcode-flex{flex-flow:wrap}}.wpcode-input-title{margin-bottom:8px}#wpcode_snippet_code{display:none}.wpcode-syntax-highlighting-disabled #wpcode_snippet_code{display:block}.wpcode-status-text{color:var(--wpcode-text-color-paragraph);font-size:var(--wpcode-font-size-s);margin-right:8px;min-width:51px}#wpcode_block_editor,#wp-wpcode_snippet_text-wrap{display:none}.wpcode-code-type-text #wpcode_block_editor,.wpcode-code-type-text #wpcode_snippet_code,.wpcode-code-type-text .wpcode-code-textarea .CodeMirror{display:none}.wpcode-code-type-text #wp-wpcode_snippet_text-wrap{display:block}.wpcode-code-type-blocks #wp-wpcode_snippet_text-wrap,.wpcode-code-type-blocks .wpcode-code-textarea .CodeMirror{display:none}.wpcode-code-type-blocks .wpcode-code-textarea{margin:0}.wpcode-code-type-blocks #wpcode_block_editor{display:block}.wpcode-add-snippet-description{padding:var(--wpcode-space-v);background:var(--wpcode-background-white);border:1px solid var(--wpcode-border-color);border-bottom:0;border-radius:0 4px 0 0;font-size:var(--wpcode-font-size-s);color:var(--wpcode-text-color-paragraph)}.wpcode-add-snippet-description a:hover{text-decoration:none}.wpcode-add-snippet-description+.wpcode-metabox{border-radius:0 0 4px 4px}.wpcode-button-save-to-library{margin-right:14px;text-decoration:none;font-size:var(--wpcode-font-size-s);font-weight:600;color:var(--wpcode-text-color-paragraph)}.wpcode-button-save-to-library svg{vertical-align:middle}.wpcode-button-save-to-library svg path{fill:var(--wpcode-text-color-paragraph)}.wpcode-button-save-to-library:hover{text-decoration:underline;color:var(--wpcode-text-color-heading)}.wpcode-button-save-to-library:hover svg path{fill:var(--wpcode-text-color-heading)}.wpcode-button-save-to-library:disabled{background-color:transparent;border:none}.wpcode-button-save-to-library#wpcode_save_to_library{opacity:0.5}.wpcode-device-type-picker{margin:0 0 20px;display:flex;max-width:600px}@media screen and (max-width:782px){.wpcode-device-type-picker{display:block}.wpcode-device-type-picker .wpcode-input-radio{width:100%;margin-bottom:12px}.wpcode-device-type-picker .wpcode-input-radio label{flex-flow:row;justify-content:start;padding:12px;align-items:center}.wpcode-device-type-picker .wpcode-input-radio label .wpcode-input-radio-icon{margin-right:12px}.wpcode-device-type-picker .wpcode-input-radio label .wpcode-input-radio-icon svg{max-width:24px;height:auto}.wpcode-device-type-picker .wpcode-input-radio label .wpcode-input-radio-label{margin-top:0}}.wpcode-device-type-area{position:relative;display:flex;margin-bottom:20px}@media (max-width:1442px){.wpcode-device-type-area{flex-flow:column}}.wpcode-device-type-area .wpcode-blur-area{flex-shrink:0;flex-grow:0;width:600px}.wpcode-device-type-area .wpcode-blur-area .wpcode-device-type-picker{margin-bottom:0}.wpcode-device-type-area .wpcode-upsell-box{padding:20px;width:580px;position:relative;transform:none;left:auto;top:auto;background:var(--wpcode-background-white);border:none;text-align:left;display:flex;justify-content:space-between;align-items:center}@media (max-width:1442px){.wpcode-device-type-area .wpcode-upsell-box{margin-top:20px;width:580px}}.wpcode-device-type-area .wpcode-upsell-box h2{margin-bottom:10px}.wpcode-device-type-area .wpcode-upsell-box .wpcode-upsell-text{margin-bottom:0}.wpcode-device-type-area .wpcode-upsell-box .wpcode-upsell-text p{margin-bottom:0}.wpcode-device-type-area .wpcode-upsell-box .wpcode-upsell-buttons{flex-shrink:0;padding-left:20px}.wpcode-block-editor-area{height:400px;width:100%;display:flex;align-items:center;justify-content:center;background:#fff;border:1px solid var(--wpcode-border-color);border-radius:4px;text-align:center;margin-bottom:var(--wpcode-space-h)}.wpcode-code-textarea .wpcode-smart-tags{margin-right:16px}.wpcode-code-type-css .wpcode-code-textarea .wpcode-smart-tags,.wpcode-code-type-blocks .wpcode-code-textarea .wpcode-smart-tags,.wpcode-code-type-php .wpcode-code-textarea .wpcode-smart-tags{display:none}.wpcode-shortcode-attributes-list ul{max-width:272px}.wpcode-shortcode-attributes-list li{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px;color:var(--wpcode-text-color-paragraph)}.wpcode-shortcode-locations-list{width:100%}.wpcode-shortcode-locations-list .wpcode-button-row{margin-bottom:13px}.wpcode-shortcode-locations-list ul{max-width:none;width:100%;margin:0;padding:0}.wpcode-shortcode-locations-list li{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px;color:var(--wpcode-text-color-paragraph);width:100%;padding:0}.wpcode-shortcode-locations-list li a{flex-grow:1;margin-right:10px}.wpcode-shortcode-locations-list li .wpcode-post-type{flex-shrink:0}.wpcode-line-error-code{background:rgba(250,152,152,0.3)}.wpcode-line-error-icon{background-image:url("data:image/svg+xml,<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15.73 3H8.27L3 8.27V15.73L8.27 21H15.73L21 15.73V8.27L15.73 3ZM19 14.9L14.9 19H9.1L5 14.9V9.1L9.1 5H14.9L19 9.1V14.9ZM14.83 7.76L12 10.59L9.17 7.76L7.76 9.17L10.59 12L7.76 14.83L9.17 16.24L12 13.41L14.83 16.24L16.24 14.83L13.41 12L16.24 9.17L14.83 7.76Z\" fill=\"red\"/></svg>");width:20px;height:20px;background-size:cover;margin-left:5px;margin-top:2px}.wpcode-error-preview{overflow:auto;max-width:100%}#wpcode_snippet_as_file_option .wpcode-checkbox-toggle{opacity:0.6}#wpcode_snippet_as_file_option_pro .wpcode-checkbox-toggle+p{display:inline-block;margin:0 0 0 15px}.wpcode-ai-questions label{width:100%;display:block}.wpcode-ai-questions input{width:100%;max-width:600px}.wpcode-metabox{background:var(--wpcode-background-white);border:1px solid var(--wpcode-border-color);border-radius:4px;margin-bottom:var(--wpcode-space-h)}.wpcode-metabox-title{align-items:center;border-bottom:1px solid var(--wpcode-border-color);display:flex;justify-content:space-between}.wpcode-metabox-title-text{color:var(--wpcode-text-color-heading);font-size:var(--wpcode-font-size-m);font-weight:600;padding:0 var(--wpcode-space-v)}.wpcode-metabox-button-toggle{background-color:var(--wpcode-background-white);border:none;cursor:pointer;height:60px;margin:0;text-align:center;width:60px}.wpcode-metabox-collapsed .wpcode-metabox-button-toggle svg{transform:rotate(180deg)}.wpcode-metabox-content{padding:var(--wpcode-space-v);padding-bottom:0}.wpcode-metabox-collapsed .wpcode-metabox-content{display:none}.wpcode-metabox-content p:first-child{margin-top:0}.wpcode-metabox-content .notice{margin:24px 0}.wpcode-metabox-content .notice p{margin:0.5em 0}.wpcode-metabox-form .wpcode-metabox-form-row{max-width:670px}.wpcode-metabox-form-row{display:flex;margin-bottom:var(--wpcode-space-v)}@media screen and (max-width:782px){.wpcode-metabox-form-row{flex-flow:wrap}}.wpcode-metabox-form-row-label{flex-shrink:0;width:245px}@media screen and (max-width:782px){.wpcode-metabox-form-row-label{margin-bottom:6px}}.wpcode-metabox-form-row-label label{color:var(--wpcode-text-color-heading);font-size:var(--wpcode-font-size-s);font-weight:600}.wp-list-table.wpcode-snippets .column-status{width:100px}@media screen and (min-width:783px){.wp-list-table.wpcode-snippets .column-status{text-align:right}}.wp-list-table.wpcode-snippets .column-status .wpcode-checkbox-toggle{float:right}.wp-list-table.wpcode-snippets .column-name a{color:var(--wpcode-text-color-heading);font-size:14px;text-decoration:none}.wp-list-table.wpcode-snippets .column-name a:hover,.wp-list-table.wpcode-snippets .column-name a:focus{color:var(--wpcode-text-color-paragraph)}.wp-list-table.wpcode-snippets .column-name .delete a,.wp-list-table.wpcode-snippets .column-name .trash a{color:var(--wpcode-background-red)}.wp-list-table.wpcode-snippets .column-name .delete a:hover,.wp-list-table.wpcode-snippets .column-name .delete a:focus,.wp-list-table.wpcode-snippets .column-name .trash a:hover,.wp-list-table.wpcode-snippets .column-name .trash a:focus{color:var(--wpcode-color-red-darker)}.wp-list-table.wpcode-snippets .column-location a,.wp-list-table.wpcode-snippets .column-author a{color:var(--wpcode-text-color-paragraph)}.wp-list-table.wpcode-snippets .column-location a:hover,.wp-list-table.wpcode-snippets .column-location a:focus,.wp-list-table.wpcode-snippets .column-author a:hover,.wp-list-table.wpcode-snippets .column-author a:focus{color:var(--wpcode-text-color-heading)}.wp-list-table.wpcode-snippets th.column-created a{color:var(--wpcode-text-color-heading)}.wp-list-table.wpcode-snippets th.column-created a:hover,.wp-list-table.wpcode-snippets th.column-created a:focus{color:var(--wpcode-text-color-paragraph)}.wp-list-table.wpcode-snippets .column-created{color:var(--wpcode-text-color-paragraph)}.wp-list-table.wpcode-snippets td.column-tags{color:var(--wpcode-color-primary)}.wp-list-table.wpcode-snippets td.column-tags a{color:var(--wpcode-color-primary);text-decoration:underline}.wp-list-table.wpcode-snippets td.column-tags a:hover,.wp-list-table.wpcode-snippets td.column-tags a:focus{text-decoration:none}.wp-list-table.wpcode-snippets .alternate,.wp-list-table.wpcode-snippets.striped>tbody>:nth-child(odd),.wp-list-table.wpcode-snippets ul.striped>:nth-child(odd){background-color:var(--wpcode-background-gray)}.wp-list-table.wpcode-snippets .column-id{width:4.5em}.wp-list-table.wpcode-snippets .wpcode-copy{cursor:pointer;position:relative}.wp-list-table.wpcode-snippets .wpcode-copy .wpcode-icon-copy{display:none;position:absolute;left:100%;top:2px}.wp-list-table.wpcode-snippets .wpcode-copy.wpcode-show-success-icon .wpcode-icon-copy{display:block}.tablenav.bottom form{display:inline}.wpcode-admin-page.wpcode .tablenav.top{margin-bottom:16px}.wpcode-admin-page.wpcode .tablenav.bottom{margin-top:11px}.wpcode-admin-page.wpcode .wpcode-content a{}.wpcode-admin-page.wpcode .button{background:var(--wpcode-background-light);border-color:var(--wpcode-color-primary);color:var(--wpcode-color-primary)}.wpcode-content .has_error a,.wpcode-content .deactivated a{color:var(--wpcode-color-red)}.wpcode-content .has_error a:hover,.wpcode-content .has_error a:focus,.wpcode-content .deactivated a:hover,.wpcode-content .deactivated a:focus{color:var(--wpcode-color-red-darker)}.wpcode-table-status-icon{margin-right:10px;display:inline-block}.wpcode-table-status-icon-deactivated path{fill:var(--wpcode-color-red)}.wpcode-scheduled-icon .wpcode-icon-scheduled{width:20px;height:20px;display:inline-block}.wpcode-scheduled-icon .wpcode-icon-scheduled path{fill:var(--wpcode-color-primary)}#wpcode-header{position:relative}.wpcode-admin-page.wpcode #screen-meta-links{display:none}#wpcode-header-between{position:absolute;right:14px;z-index:92;top:46px}@media screen and (min-width:783px){#wpcode-header-between{top:auto}}#wpcode-header-between #screen-meta{border-color:var(--wpcode-border-color)}#wpcode-header-between #screen-meta-links .show-settings{border-color:var(--wpcode-border-color);background:var(--wpcode-background-gray)}#wpcode-header-between #screen-options-wrap{background:var(--wpcode-background-gray);border-color:var(--wpcode-border-color)}#wpbody-content{position:relative}#wpbody-content #wpcode-loader{display:none;position:absolute;top:0;left:0;z-index:99;right:0;bottom:0;background:transparent}#wpbody-content #wpcode-loader .wpcode-loader-overlay{position:absolute;left:36px;right:36px;background:rgba(255,255,255,0.8)}#wpbody-content #wpcode-loader .wpcode-loader-overlay img{height:20px;width:20px;align-items:center;position:absolute;top:50px;-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite;left:50%;transform:translateX(-50%)}@-webkit-keyframes spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}@keyframes spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.wpcode-cl-group{background:var(--wpcode-button-disabled-bg);border-radius:4px;margin-top:50px;padding:16px;position:relative}.wpcode-cl-group:first-child{margin-top:0}.wpcode-cl-group:first-child .wpcode-cl-group-or{display:none}#wpcode-conditions-holder{margin:16px 0;max-width:710px}.wpcode-cl-group-or{bottom:100%;height:50px;left:0;position:absolute;right:0}.wpcode-cl-group-or .wpcode-cl-group-or-line{background-color:var(--wpcode-button-disabled-bg);height:2px;left:0;position:absolute;right:0;top:50%}.wpcode-cl-group-or .wpcode-cl-group-or-text{background:#F5F5F5;border-radius:10px;color:var(--wpcode-text-color-heading);font-size:12px;font-weight:500;left:50%;padding:2px 9px;position:absolute;top:50%;transform:translate(-50%,-50%)}.wpcode-cl-rules-row{align-items:center;display:flex;justify-content:space-between;margin-bottom:8px}@media screen and (max-width:782px){.wpcode-cl-rules-row{margin-bottom:16px}}.wpcode-cl-rules-row .wpcode-cl-rules-row-options{align-items:flex-start;display:flex;max-width:661px;padding-right:15px;gap:10px}.wpcode-cl-rules-row .wpcode-cl-rules-row-options .wpcode-cl-rule-value{width:145px}.wpcode-cl-rules-row .wpcode-cl-rules-row-options .wpcode-cl-rule-meta-key-container,.wpcode-cl-rules-row .wpcode-cl-rules-row-options .wpcode-cl-rule-user-meta-key-container{width:145px}@media screen and (max-width:782px){.wpcode-cl-rules-row .wpcode-cl-rules-row-options{flex-flow:wrap}}.wpcode-metabox-form-row-input .wpcode-cl-rules-row .wpcode-cl-rule-type-container{cursor:pointer}@media screen and (max-width:782px){.wpcode-metabox-form-row-input .wpcode-cl-rules-row .wpcode-cl-rule-type-container{margin-bottom:6px;width:100%}}.wpcode-metabox-form-row-input .wpcode-cl-rules-row .wpcode-cl-rule-type-container select{pointer-events:none;margin:0}.wpcode-metabox-form-row-input .wpcode-cl-rules-row select{margin:0;min-width:0;width:145px}@media screen and (max-width:782px){.wpcode-metabox-form-row-input .wpcode-cl-rules-row select{width:100%;margin-bottom:6px}}.wpcode-metabox-form-row-input .wpcode-cl-rules-row select.wpcode-cl-rule-relation{width:145px}@media screen and (max-width:782px){.wpcode-metabox-form-row-input .wpcode-cl-rules-row select.wpcode-cl-rule-relation{width:100%}}.wpcode-cl-rules-row .wpcode-cl-remove-row{flex-shrink:0}@media screen and (max-width:782px){.wpcode-cl-rules-row .wpcode-cl-rule-value{display:inline-block;width:100%;margin-right:16px}}#wpcode_cl_picker{margin-left:-258px;margin-right:-16px;margin-top:20px;background-color:var(--wpcode-background-highlight);border-radius:4px 0 0 4px}@media screen and (max-width:782px){#wpcode_cl_picker{margin-left:-16px;margin-right:-16px}#wpcode_cl_picker .wpcode-list-item .wpcode-list-item-description{opacity:1}}#wpcode_cl_picker.wpcode-hidden{display:none}#wpcode_cl_picker .wpcode-items-list:before{left:158px;border-bottom:10px solid var(--wpcode-background-highlight)}@media screen and (max-width:782px){#wpcode_cl_picker .wpcode-items-list:before{display:none}}#wpcode_cl_picker .wpcode-items-sidebar{border-radius:4px 0 0 4px}#wpcode_cl_picker .wpcode-list-item label{cursor:pointer}.wpcode-items-metabox{display:flex;padding:0}@media screen and (max-width:782px){.wpcode-items-metabox{flex-flow:column}}.wpcode-items-sidebar{flex-shrink:0;padding:var(--wpcode-space-v);width:242px}@media screen and (max-width:782px){.wpcode-items-sidebar{width:100%}}.wpcode-items-list{border-left:1px solid var(--wpcode-border-color);min-height:400px;padding:calc(var(--wpcode-space-v) / 2) 12px;width:100%}@media screen and (max-width:782px){.wpcode-items-list{border-top:1px solid var(--wpcode-border-color);border-left:0}}.wpcode-items-categories-list{margin:0}.wpcode-items-categories-list li{margin:0}.wpcode-items-categories-list button{background:transparent;border:none;color:var(--wpcode-text-color-paragraph);cursor:pointer;display:block;font-size:var(--wpcode-font-size-m);font-weight:500;padding:12px 8px;position:relative;text-align:left;width:100%}.wpcode-items-categories-list button:focus,.wpcode-items-categories-list button.wpcode-active{background:var(--wpcode-background-highlight);color:var(--wpcode-text-color-highlight)}.wpcode-items-categories-list button:hover{text-decoration:underline}.wpcode-items-categories-list button .wpcode-items-count{float:right;color:var(--wpcode-text-color-paragraph);opacity:0.5}.wpcode-items-categories-list button.wpcode-active{font-weight:700}.wpcode-items-categories-list button.wpcode-active:hover{text-decoration:none}.wpcode-items-categories-list button.wpcode-active .wpcode-items-count{opacity:1;color:var(--wpcode-text-color-highlight);font-weight:700}.wpcode-items-list-category{align-content:stretch;display:flex;flex-wrap:wrap;justify-content:flex-start}.wpcode-list-item{border:1px solid var(--wpcode-border-color);border-radius:4px;margin-bottom:24px;margin-right:12px;margin-left:12px;max-width:100%;padding:16px 20px;position:relative;width:100%}@media (min-width:961px){.wpcode-list-item{width:calc(50% - 24px)}}@media (min-width:1440px){.wpcode-list-item{width:calc(100% / 3 - 24px)}}.wpcode-list-item h3,.wpcode-list-item .wpcode-list-item-title{font-size:var(--wpcode-font-size-m);line-height:1.2;margin:0;overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.wpcode-list-item p{margin-bottom:0}.wpcode-list-item:hover .wpcode-list-item-description,.wpcode-list-item:focus .wpcode-list-item-description{opacity:0}.wpcode-list-item:hover .wpcode-list-item-buttons,.wpcode-list-item:focus .wpcode-list-item-buttons{opacity:1}@media (hover:none){.wpcode-list-item .wpcode-list-item-description{opacity:0}.wpcode-list-item .wpcode-list-item-buttons{opacity:1}}.wpcode-list-item .wpcode-list-item-pill{position:absolute;top:10px;right:10px;font-size:8px;font-weight:700;text-transform:uppercase;line-height:1;padding:4px 8px;border-radius:40px}.wpcode-list-item .wpcode-list-item-pill.wpcode-list-item-pill-blue{background:var(--wpcode-color-primary);color:#fff}.wpcode-list-item .wpcode-list-item-pill.wpcode-list-item-pill-green{background:var(--wpcode-notice-success-bg);color:#fff}.wpcode-list-item .wpcode-list-item-pill.wpcode-list-item-pill-gray{background:var(--wpcode-text-color-heading);color:#fff}.wpcode-list-item .wpcode-list-item-pill.wpcode-list-item-pill-light{background:var(--wpcode-text-color-placeholder);color:#fff}.wpcode-list-item.wpcode-list-item-has-pill h3{max-width:calc(100% - 60px)}.wpcode-list-item.wpcode-custom-snippet,.wpcode-list-item.wpcode-library-item-ai{background:var(--wpcode-background-highlight)}.wpcode-list-item-actions{position:relative}.wpcode-list-item-description{min-height:40px}.wpcode-list-item-buttons{display:flex;justify-content:space-between;opacity:0;position:absolute;top:0;width:100%;z-index:10}.wpcode-list-item-buttons .wpcode-button{flex-grow:1;margin-left:10px;text-align:center}.wpcode-list-item-buttons .wpcode-button:first-child{margin-left:0}.wpcode-items-search{margin-bottom:20px;position:relative}.wpcode-items-search input{border-color:var(--wpcode-border-color);font-size:var(--wpcode-font-size-s);height:38px;padding-left:32px;width:100%}.wpcode-items-search input::-moz-placeholder{color:var(--wpcode-text-color-placeholder)}.wpcode-items-search input:-ms-input-placeholder{color:var(--wpcode-text-color-placeholder)}.wpcode-items-search input::placeholder{color:var(--wpcode-text-color-placeholder)}.wpcode-items-search label{left:10px;position:absolute;top:11px}.wpcode-library-preview-header{padding-bottom:25px}.wpcode-library-preview-header h2{margin:0}.wpcode-library-preview-header .wpcode-close-modal{float:right}.wpcode-library-preview-content .CodeMirror{background:var(--wpcode-background-gray)}.wpcode-library-preview-content .CodeMirror-activeline-background{background:transparent !important}.wpcode-library-preview-content .CodeMirror-focused .CodeMirror-activeline-background{background:rgba(100,100,100,0.1) !important}.wpcode-library-preview-buttons{margin-top:25px}.wpcode-item-use-button.wpcode-start-auth{padding-top:6px;padding-bottom:6px;justify-content:center}.wpcode-item-use-button.wpcode-start-auth svg{margin-right:9px}#wpcode-library-connect-banner{background:var(--wpcode-button-disabled-bg);margin-bottom:24px;margin-left:12px;border-radius:6px;display:flex;flex-direction:column;justify-content:space-between;align-items:center;padding-right:20px;margin-right:12px}@media (min-width:961px){#wpcode-library-connect-banner{flex-direction:row}}#wpcode-library-connect-banner .wpcode-template-content{padding:20px;color:#444444}@media (min-width:961px){#wpcode-library-connect-banner .wpcode-template-content{width:80%}}#wpcode-library-connect-banner .wpcode-template-upgrade-button{text-align:right;flex-shrink:0;padding-bottom:20px}@media (min-width:961px){#wpcode-library-connect-banner .wpcode-template-upgrade-button{padding-bottom:0}}#wpcode-library-connect-banner .wpcode-template-upgrade-button button{white-space:pre}#wpcode-library-connect-banner h3{margin:0 0 5px}#wpcode-library-connect-banner p{margin:0}.wpcode-library-item-ai-not-available .wpcode-button{opacity:0.7;pointer-events:none}.wpcode-library-tab-navigation{position:relative;z-index:10}.wpcode-library-tab-navigation:before{content:'';width:1px;height:1px;background-color:var(--wpcode-border-color);position:absolute;top:100%;left:0;display:block}.wpcode-library-tab-button{border:1px solid var(--wpcode-border-color);margin-bottom:-1px;padding:10px 25px;font-size:var(--wpcode-font-size-m);border-radius:0 0 0 0;display:inline-block;margin-right:-5px;cursor:pointer;transition:background-color 300ms ease 0s,color 300ms ease;background-color:var(--wpcode-button-secondary-bg);font-weight:400;color:var(--wpcode-button-secondary-text)}.wpcode-library-tab-button.wpcode-library-tab-button-active{border-bottom-color:#fff;background:#fff;color:var(--wpcode-button-secondary-text-hover)}.wpcode-library-tab-button:first-child{border-radius:4px 0 0 0}.wpcode-library-tab-button:last-child{border-radius:0 4px 0 0}.wpcode-library-tab-button:hover,.wpcode-library-tab-button:focus{background:#fff;color:var(--wpcode-button-secondary-text-hover)}.wpcode-library-tab{position:relative;display:none}.wpcode-library-tab .wpcode-items-metabox{border-radius:0 4px 4px 4px}.wpcode-library-tab .wpcode-add-snippet-description+.wpcode-items-metabox{border-radius:0 0 4px 4px}.wpcode-library-tab.wpcode-library-tab-active{display:block}.wpcode-snippet-manager .wpcode-content .wpcode-library-suggest-plugins{padding:var(--wpcode-space-v)}.wpcode-snippet-manager .wpcode-content .wpcode-library-suggest-plugins .wpcode-suggestions-title{margin-bottom:var(--wpcode-space-v);margin-top:0}.wpcode-snippet-manager .wpcode-content .wpcode-library-suggest-plugins .wpcode-plugin-suggestions{flex-flow:wrap}.wpcode-snippet-manager .wpcode-content .wpcode-library-suggest-plugins .wpcode-plugin-suggestion-plugin{width:33.3333%;margin-bottom:var(--wpcode-space-h)}.wpcode-metabox .wpcode-alert{margin:var(--wpcode-space-v)}.wpcode-metabox .wpcode-alert h4{margin-bottom:0}.wpcode-generator .wpcode-items-metabox{margin-bottom:0}.wpcode-generator .wpcode-generator-preview .CodeMirror{height:auto}.wpcode-generator-preview{background-color:var(--wpcode-background-highlight);border-color:var(--wpcode-border-color);border-style:solid;border-width:0 1px 1px;padding:15px 28px 24px}.wpcode-generator-preview-header{align-items:center;display:flex;margin-bottom:14px}.wpcode-generator-preview-header h2{margin:0 8px 0 0}.wpcode-generator-preview-header .wpcode-button{margin-left:12px}.wpcode-form-tab:after{clear:both;content:'';display:table}.wpcode-generator-column{float:left;padding:14px 14px;width:calc(100% / 3)}.wpcode-generator-actions{padding:28px 14px 14px;text-align:center}.wpcode-generator-field{margin-bottom:24px}.wpcode-generator-field label{color:var(--wpcode-text-color-heading);display:block;font-size:var(--wpcode-font-size-s);font-weight:600;margin-bottom:8px}.wpcode-generator-field input[type="text"]{width:100%}.wpcode-generator-field select{max-width:100%;width:100%}.wpcode-field-description{margin-top:8px}.wpcode-generator-field-list ul{color:var(--wpcode-text-color-paragraph);font-size:var(--wpcode-font-size-s);list-style:disc;padding-left:18px}.wpcode-checkbox-line{margin-bottom:14px}.wpcode-checkbox-line .wpcode-checkbox-toggle{margin-right:8px}.wpcode-checkbox-line label{display:inline-block}.wpcode-repeater-group{border-top:1px solid var(--wpcode-border-color);padding-top:24px}.wpcode-repeater-group .wpcode-remove-row{margin-bottom:24px}#wpcode-importer-process{display:none}#wpcode-importer-process .process-completed{display:none}#wpcode-importer-process .status{background-color:#fff;border:1px solid #ddd;border-radius:3px;display:none;margin:20px 0 30px;max-height:800px;overflow-y:scroll}#wpcode-importer-process .item{border-bottom:1px solid #ddd;padding:20px}#wpcode-importer-process .item:last-of-type{border:none}#wpcode-importer-process .item .name{float:left;font-size:14px}#wpcode-importer-process .item .name svg{display:inline-block;margin:0 10px 0 0}#wpcode-importer-process .item .actions{float:right;font-size:14px}.wpcode-clear:after{clear:both;content:" ";display:table}#wpcode-plugins-importer{margin-bottom:20px;max-width:100%;width:400px}.wpcode-tools .pre-error,.wpcode-tools .info-area{background:#fff;border:1px solid #ddd;box-shadow:none;display:block;font-family:Menlo,Monaco,monospace;font-size:12px;height:450px;max-width:1000px;overflow:auto;padding:20px;white-space:pre;width:100%}.wpcode-admin-page .wpcode-alert{border:1px solid transparent;margin-bottom:18px;padding:16px}.wpcode-admin-page .wpcode-alert h4{color:inherit;margin-top:0}.wpcode-admin-page .wpcode-alert p{margin:0 0 15px 0}.wpcode-admin-page .wpcode-alert p:last-of-type{margin:0}.wpcode-admin-page .wpcode-alert.wpcode-alert-nomargin{margin:0}.wpcode-admin-page .wpcode-alert.wpcode-alert-small{font-size:12px}.wpcode-admin-page .wpcode-alert.wpcode-alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.wpcode-admin-page .wpcode-alert.wpcode-alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.wpcode-admin-page .wpcode-alert.wpcode-alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.wpcode-admin-page .wpcode-alert.wpcode-alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}#wpcode-log-data{margin-top:25px;background:var(--wpcode-background-white);border:1px solid var(--wpcode-border-color);padding:5px 20px}#wpcode-log-data pre{font-family:monospace;white-space:pre-wrap;word-wrap:break-word;color:var(--wpcode-text-color-heading)}.wpcode-docs-overlay{background-color:var(--wpcode-background-white);bottom:0;display:none;left:0;max-height:100vh;opacity:1;overflow-y:auto;position:fixed;right:0;top:46px;z-index:100100}.wpcode-docs-overlay *{box-sizing:border-box}@media screen and (min-width:783px){.wpcode-docs-overlay{left:36px;top:32px}}@media screen and (min-width:961px){.wpcode-docs-overlay{left:160px}.folded .wpcode-docs-overlay{left:36px}}#wpcode-help-logo{left:36px;position:absolute;top:24px}#wpcode-help-close{cursor:pointer;display:inline-block;height:30px;padding:5px;position:absolute;right:37px;top:25px;transition:all 0.05s ease-out;width:30px;z-index:10}.wpcode-docs-content{background-color:var(--wpcode-background-white);margin:0 auto 50px auto;max-width:100%;padding:0 30px;width:760px}.wpcode-help-docs{margin-bottom:20px;padding:0 18px}.wpcode-help-docs a{color:var(--wpcode-text-color-paragraph);font-size:var(--wpcode-font-size-m);text-decoration:none}.wpcode-help-docs a:hover,.wpcode-help-docs a:focus{color:var(--wpcode-text-color-heading);text-decoration:underline}.wpcode-help-docs .wpcode-icon-file-text{margin-right:14px}.wpcode-help-docs li{margin-bottom:18px}.wpcode-help-categories-toggle{border-bottom:1px solid var(--wpcode-border-color);margin-bottom:40px}.wpcode-help-category{border-top:1px solid var(--wpcode-border-color);margin:0}.wpcode-help-category header{align-items:center;color:var(--wpcode-text-color-heading);cursor:pointer;display:flex;flex-direction:row;font-size:var(--wpcode-font-size-l);font-weight:600;justify-content:flex-start;padding-left:18px;padding-right:25px}.wpcode-help-category header:hover{color:var(--wpcode-color-primary)}.wpcode-help-category .wpcode-icon-folder{margin:23px 11px 23px 0}.wpcode-help-category .wpcode-icon-arrow{margin-left:auto;transform-origin:center;transition:transform 300ms ease}.wpcode-help-category.open .wpcode-icon-arrow{transform:rotate(90deg)}.wpcode-help-category .wpcode-help-docs{display:none}#wpcode-help-search{padding:74px 0 50px 0;position:relative;text-align:center;top:0}#wpcode-help-search .wpcode-icon-search{display:none;left:17px;position:absolute;top:92px}#wpcode-help-search input{background-image:none;background-position:22px center;background-repeat:no-repeat;background-size:20px 20px;border:1px solid var(--wpcode-border-color);border-radius:3px;color:var(--wpcode-text-color-heading);font-size:20px;letter-spacing:0;line-height:20px;min-height:48px;padding:10px 10px 10px 42px;text-align:left;width:100%}#wpcode-help-search #wpcode-help-search-clear{cursor:pointer;left:17px;opacity:.7;position:absolute;top:92px}#wpcode-help-search.wpcode-search-empty #wpcode-help-search-clear{display:none}#wpcode-help-search.wpcode-search-empty .wpcode-icon-search{display:block}#wpcode-help-no-result li span{color:var(--wpcode-text-color-paragraph);font-size:var(--wpcode-font-size-s)}.wpcode-help-footer{align-items:center;display:flex;justify-content:space-between}.wpcode-help-footer .wpcode-help-footer-box{border:1px solid var(--wpcode-border-color);border-radius:8px;padding:40px 38px;text-align:center;width:calc(50% - 18px)}.wpcode-help-footer .wpcode-help-footer-box h3{font-size:var(--wpcode-font-size-l)}.wpcode-help-footer .wpcode-help-footer-box p{color:var(--wpcode-text-color-paragraph);font-size:var(--wpcode-font-size-m)}.wpcode-notifications-drawer{background:var(--wpcode-background-white);border-left:1px solid var(--wpcode-border-color);bottom:0;position:fixed;right:-375px;top:32px;transition:right 300ms ease 0s,visibility 0s ease 400ms;visibility:hidden;width:375px;z-index:1100}.wpcode-notifications-open .wpcode-notifications-drawer{right:0;transition:right 300ms ease 0s,visibility 0s ease 0ms;visibility:visible}.wpcode-notifications-overlay{background-color:rgba(0,0,0,0.3);bottom:0;display:none;left:0;opacity:.5;position:fixed;right:0;top:46px;transition:.5s;z-index:1052}.folded .wpcode-notifications-overlay{left:36px}.wpcode-notifications-open .wpcode-notifications-overlay{display:block}@media screen and (min-width:783px){.wpcode-notifications-overlay{left:36px}.admin-bar .wpcode-notifications-overlay{top:32px}}@media screen and (min-width:961px){.wpcode-notifications-overlay{left:160px}.folded .wpcode-notifications-overlay{left:36px}}.wpcode-notifications-header{background:var(--wpcode-background-highlight);border-bottom:1px solid var(--wpcode-border-color);padding:18px 40px 18px 20px}.wpcode-notifications-header .wpcode-notifications-close{position:absolute;right:18px;top:22px}.wpcode-notifications-header .wpcode-notifications-close path{fill:var(--wpcode-text-color-heading)}.wpcode-notifications-header h3{color:var(--wpcode-text-color-heading);display:inline-block;font-size:var(--wpcode-font-size-s);font-weight:700;line-height:21px;margin:0 10px 0 0}.wpcode-notifications-list{height:calc(100% - 130px);overflow:auto}.wpcode-notifications-list ul{margin:0}.wpcode-notifications-list li{border-top:1px solid var(--wpcode-border-color);display:flex;margin:0;padding:24px}.wpcode-notifications-list li:first-child{border-top:none}.wpcode-notifications-list li h4{color:var(--wpcode-text-color-heading);font-size:var(--wpcode-font-size-s);font-weight:600;line-height:21px;margin:0}.wpcode-notifications-list p{color:var(--wpcode-text-color-light-bg);font-size:var(--wpcode-font-size-s);margin:8px 0}.wpcode-notifications-list p.wpcode-start{font-size:var(--wpcode-font-size-xs)}.wpcode-notification-actions .wpcode-button{margin-right:10px}.wpcode-notifications-footer{border-top:1px solid var(--wpcode-border-color);padding:24px 27px;text-align:right}#wpcode-dismissed-title,#wpcode-notifications-show-active,.wpcode-notifications-dismissed{display:none}.show-dismissed #wpcode-notifications-show-dismissed,.show-dismissed .wpcode-notifications-active,.show-dismissed #wpcode-active-title{display:none}.show-dismissed #wpcode-notifications-show-active,.show-dismissed #wpcode-dismissed-title{display:inline-block}.show-dismissed .wpcode-notifications-dismissed{display:block}.wpcode-notifications-dismissed .wpcode-notification-dismiss{display:none}.wpcode-notification-icon{margin-right:10px}.wpcode-help-tooltip{cursor:help;display:inline-block;position:relative;vertical-align:middle}.wpcode-help-tooltip .wpcode-help-tooltip-text{background-color:var(--wpcode-color-primary);border-radius:6px;bottom:100%;color:#fff;font-size:var(--wpcode-font-size-s);font-weight:400;left:50%;margin-bottom:12px;margin-left:-90px;padding:12px 12px;position:absolute;text-align:center;visibility:hidden;width:180px;z-index:500}.wpcode-help-tooltip .wpcode-help-tooltip-text:after{border-color:var(--wpcode-color-primary) transparent transparent transparent;border-style:solid;border-width:10px 9px 0 9px;content:'';height:0;left:50%;margin-left:-9px;position:absolute;top:100%;width:0}.wpcode-help-tooltip .wpcode-help-tooltip-text:before{content:'';top:100%;height:20px;left:0;right:0;position:absolute;background:transparent}.wpcode-help-tooltip .wpcode-help-tooltip-text a{color:#fff}.wpcode-help-tooltip:hover .wpcode-help-tooltip-text{visibility:visible}.wpcode-help-tooltip .wpcode-icon-help{margin-top:1px}.wpcode-help-tooltip .wpcode-icon-help path{fill:#8A8A8A}.wpcode-upgrade-welcome{background:#f3f4f5}.wpcode-welcome-content{max-width:1168px;margin:24px auto;clear:both}.wpcode-welcome-content *{box-sizing:border-box}.wpcode-welcome-content h2{font-size:22px;font-weight:600;margin-top:0;line-height:1.2}.wpcode-welcome-content h3{font-size:1.5em}.wpcode-welcome-content p{font-size:1.2em}.wpcode-welcome-box{background:#fff;padding:40px;border:1px solid #ddd;border-radius:4px;margin-bottom:30px}@media (max-width:767px){.wpcode-welcome-box{padding:26px}}.wpcode-welcome-logo{margin:4px 0 28px}.wpcode-welcome-text{width:700px;margin:32px auto;max-width:100%}.wpcode-welcome-features{display:flex;justify-content:space-between;flex-wrap:wrap;margin-top:42px}.wpcode-welcome-features .wpcode-welcome-feature{width:calc(33.3% - 16px);text-align:center;margin-bottom:32px;display:flex}@media (max-width:782px){.wpcode-welcome-features .wpcode-welcome-feature{width:100%}}.wpcode-welcome-features .wpcode-welcome-feature p{font-size:16px}.wpcode-welcome-features .wpcode-welcome-feature h3{font-size:18px;margin-top:6px}.wpcode-welcome-features .wpcode-welcome-feature .wpcode-welcome-feature-text{text-align:left;margin-left:16px}.wpcode-welcome-features .wpcode-welcome-feature-icon-icon path{fill:var(--wpcode-color-primary)}.wpcode-welcome-highlight{grid-template-columns:1fr 1fr;display:grid}@media (max-width:767px){.wpcode-welcome-highlight{grid-template-columns:1fr}}.wpcode-welcome-highlight .wpcode-welcome-highlight-column{padding:16px 0;align-self:center;grid-column-start:2}@media (min-width:768px){.wpcode-welcome-highlight .wpcode-welcome-highlight-column{padding:16px 20px}.wpcode-welcome-highlight .wpcode-welcome-highlight-column:nth-of-type(2n+1){grid-column-start:1}.wpcode-welcome-highlight .wpcode-welcome-highlight-column:nth-of-type(2n){grid-column-start:2}}.wpcode-welcome-highlight img{max-width:100%;width:100%;height:auto}.wpcode-buttons-row{text-align:left}.wpcode-welcome-syed-mircea{font-size:1.2em}.wpcode-welcome-syed-mircea .wpcode-welcome-person{display:inline-flex;align-items:center;margin-right:60px;margin-top:32px}.wpcode-welcome-syed-mircea .wpcode-welcome-person-image{margin-right:15px}.wpcode-welcome-syed-mircea .wpcode-welcome-person-text{font-size:13px;color:var(--wpcode-text-color-paragraph)}.wpcode-welcome-syed-mircea h4{color:var(--wpcode-text-color-heading);margin:0 0 4px;font-size:16px;font-weight:600}.wpcode-welcome-syed-mircea img{display:block;margin-bottom:0}.wpcode-welcome-syed-mircea span{align-self:end}.wpcode-upgrade-welcome #wpcontent{padding-right:10px}@media screen and (min-width:783px){.wpcode-upgrade-welcome #wpcontent{padding-right:20px}}.wpcode-loading-spinner{-webkit-animation:wpcode-spinner-rotation 0.8s linear infinite;animation:wpcode-spinner-rotation 0.8s linear infinite;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MCA4MCI+CiAgICA8cGF0aCBkPSJNNDAgMEMxNy45IDAgMCAxNy45IDAgNDBzMTcuOSA0MCA0MCA0MCA0MC0xNy45IDQwLTQwUzYyLjEgMCA0MCAwem0wIDcyQzIyLjMgNzIgOCA1Ny43IDggNDBTMjIuMyA4IDQwIDhzMzIgMTQuMyAzMiAzMi0xNC4zIDMyLTMyIDMyeiIKICAgICAgICAgIG9wYWNpdHk9Ii4xNSIvPgogICAgPHBhdGggZmlsbD0iIzM1NjhCNyIKICAgICAgICAgIGQ9Ik03NS44IDQ3LjRoLS40Yy0yLjItLjItMy44LTIuMi0zLjYtNC40LjEtMSAuMS0yIC4xLTNDNzIgMjIuNCA1Ny42IDggNDAgOGMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNGMyMi4xIDAgNDAgMTcuOSA0MCA0MCAwIDEuMy0uMSAyLjUtLjIgMy44LS4yIDIuMS0xLjkgMy42LTQgMy42eiIvPgo8L3N2Zz4K);background-repeat:no-repeat;background-size:16px 16px;display:none;height:16px;margin:0 10px;position:absolute;width:16px;z-index:40}@-webkit-keyframes wpcode-spinner-rotation{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}@keyframes wpcode-spinner-rotation{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.wpcode-pro-pill{background:#bbb;color:var(--wpcode-background-white);text-transform:uppercase;padding:4px 7px;border-radius:9px;font-size:8px;line-height:1;display:inline-block;vertical-align:text-top}.wpcode-revisions-list-area{margin:24px 0 24px;position:relative}.wpcode-revisions-list-area #wpcode-show-all-snippets{margin-top:24px}.wpcode-revisions-list{border-left:1px solid var(--wpcode-border-color);padding-left:22px;margin:0}.wpcode-revisions-list.wpcode-revisions-list-collapsed{display:none}.wpcode-revisions-list.wpcode-revisions-list-extra{margin-top:0}.wpcode-revisions-list.wpcode-revisions-list-extra .wpcode-revision-list-item:first-child{background-color:var(--wpcode-button-disabled-bg)}.wpcode-revision-list-item{background:var(--wpcode-button-disabled-bg);padding:6px 9px;font-size:var(--wpcode-font-size-s);position:relative}.wpcode-revision-list-item .avatar{border-radius:50%;vertical-align:middle}.wpcode-revision-list-item:before{position:absolute;content:'';width:7px;height:7px;border-radius:50%;background-color:#C4C4C4;border:2px solid #FFF;right:100%;margin-right:17px;top:50%;margin-top:-5px}.wpcode-revision-list-item:first-child{background-color:var(--wpcode-background-highlight)}.wpcode-revision-list-author{display:inline-block;margin:0 10px 0 12px;font-weight:600;color:var(--wpcode-text-color-heading)}.wpcode-revision-list-date{color:var(--wpcode-text-color-light-bg)}.wpcode-remote-icon{background:#c5c5c6;border-radius:50%;display:inline-block;width:30px;height:30px;vertical-align:middle;text-align:center;line-height:30px}.wpcode-remote-icon svg path{fill:#fff}.wpcode-revision-list-item-actions{float:right;display:inline-flex;vertical-align:middle;align-items:center;margin-top:7px;margin-right:6px}.wpcode-revision-list-item-actions span,.wpcode-revision-list-item-actions a{font-size:12px;color:var(--wpcode-text-color-paragraph);margin-left:14px}.wpcode-revision-list-item-actions span:hover,.wpcode-revision-list-item-actions a:hover{text-decoration:none}.wpcode-blur-area{filter:blur(2px);pointer-events:none}.wpcode-library .wpcode-content{position:relative}#poststuff .wpcode-upsell-box,.wpcode-upsell-box{position:absolute;z-index:20;background:var(--wpcode-background-white);width:662px;max-width:100%;top:50%;left:50%;transform:translate(-50%,-50%);padding:40px;text-align:center;border-radius:8px;border:1px solid var(--wpcode-border-color)}#poststuff .wpcode-upsell-box *,.wpcode-upsell-box *{box-sizing:border-box}#poststuff .wpcode-upsell-box h2,.wpcode-upsell-box h2{font-size:var(--wpcode-font-size-xxl);margin-top:0;line-height:1.2}#poststuff .wpcode-upsell-box .wpcode-button,.wpcode-upsell-box .wpcode-button{margin-top:6px}#poststuff .wpcode-upsell-box .wpcode-upsell-button-text,.wpcode-upsell-box .wpcode-upsell-button-text{margin-top:16px;display:inline-block;font-size:var(--wpcode-font-size-s);color:var(--wpcode-text-color-light-bg)}#poststuff .wpcode-upsell-box .wpcode-upsell-button-text:hover,.wpcode-upsell-box .wpcode-upsell-button-text:hover{text-decoration:none}#poststuff .wpcode-upsell-box p,.wpcode-upsell-box p{color:var(--wpcode-text-color-paragraph);font-size:var(--wpcode-font-size-m);line-height:1.5}#poststuff .wpcode-upsell-box.wpcode-upsell-box-with-features,.wpcode-upsell-box.wpcode-upsell-box-with-features{width:892px;padding:56px}#poststuff .wpcode-upsell-box.wpcode-upsell-box-with-features .wpcode-upsell-text,.wpcode-upsell-box.wpcode-upsell-box-with-features .wpcode-upsell-text{max-width:600px;margin:0 auto}#poststuff .wpcode-upsell-box .wpcode-upsell-features,.wpcode-upsell-box .wpcode-upsell-features{display:flex;flex-wrap:wrap;justify-content:space-between;margin-top:40px;margin-bottom:24px;text-align:left}#poststuff .wpcode-upsell-box .wpcode-upsell-features .wpcode-upsell-feature,.wpcode-upsell-box .wpcode-upsell-features .wpcode-upsell-feature{width:50%;color:var(--wpcode-text-color-heading);font-size:var(--wpcode-font-size-m);margin-bottom:16px;line-height:1.5;padding-left:34px;position:relative;padding-right:10px}#poststuff .wpcode-upsell-box .wpcode-upsell-features .wpcode-upsell-feature:before,.wpcode-upsell-box .wpcode-upsell-features .wpcode-upsell-feature:before{content:'';background-image:url("data:image/svg+xml,%3Csvg width=%2719%27 height=%2718%27 viewBox=%270 0 19 18%27 fill=%27none%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath fill-rule=%27evenodd%27 clip-rule=%27evenodd%27 d=%27M9.5 0.416016C4.67 0.416016 0.75 4.33602 0.75 9.16602C0.75 13.996 4.67 17.916 9.5 17.916C14.33 17.916 18.25 13.996 18.25 9.16602C18.25 4.33602 14.33 0.416016 9.5 0.416016ZM9.5 16.166C5.64125 16.166 2.5 13.0248 2.5 9.16602C2.5 5.30727 5.64125 2.16602 9.5 2.16602C13.3587 2.16602 16.5 5.30727 16.5 9.16602C16.5 13.0248 13.3587 16.166 9.5 16.166ZM7.75 11.0648L13.5163 5.29852L14.75 6.54102L7.75 13.541L4.25 10.041L5.48375 8.80727L7.75 11.0648Z%27 fill=%27%2309A347%27/%3E%3C/svg%3E");display:block;width:19px;height:18px;position:absolute;left:0;top:3px}.wpcode-pixel .wpcode-upsell-box .wpcode-upsell-text{max-width:750px}@media (max-width:1440px){.wpcode-library .wpcode-upsell-box{top:100px;transform:translate(-50%,0)}}.wpcode-hide{display:none}.wpcode-setting-license-wrapper .wpcode-input-text{max-width:400px}.wpcode-settings .wpcode-metabox-form-row-input input[type="number"]{width:80px;margin-right:10px}.wpcode-settings .wpcode-metabox-form-row-input input[type="number"]+label{margin-right:10px}.wpcode-settings .wpcode-metabox-form-row-input>label{color:var(--wpcode-text-color-paragraph);font-size:var(--wpcode-font-size-s)}.wpcode-settings .wpcode-metabox-form-row-input input[type="password"]{width:400px}.wpcode-settings #wpcode-notice-global-emailsmtp{margin-left:0;margin-right:0}.wpcode-settings #wpcode-notice-global-emailsmtp h3{margin-bottom:5px}.wpcode-notice-top-area .notice-top{margin:0;border:0;box-shadow:none;background-color:#dddddd;color:var(--wpcode-text-color-heading);text-align:center}.wpcode-notice-top-area .notice-top a{color:var(--wpcode-color-primary)}.wpcode-icon-new{color:var(--wpcode-notice-success-bg);vertical-align:super;font-size:9px;font-weight:600;padding-left:2px}.wpcode-notice .wpcode-icon-new{margin-right:5px}.wpcode-features-list{display:flex;justify-content:space-between;max-width:1000px}@media (max-width:1200px){.wpcode-features-list{flex-direction:column}}.wpcode-features-list ul{margin:0}.wpcode-features-list li{color:var(--wpcode-text-color-heading);font-size:14px;margin-bottom:15px}.wpcode-features-list li:before{content:'+';margin-right:5px;vertical-align:center}#wpcode-notice-ihaf-snippets{margin:0 0 36px;border-left:1px solid #c3c4c7}#wpcode-notice-ihaf-snippets p{color:var(--wpcode-text-color-heading)}.wpcode-modal-area{border:1px solid var(--wpcode-border-color);padding:26px;width:752px;max-width:100%;margin:60px auto;background:#fff;border-radius:8px}.wpcode-modal-area .notice{margin:0}.wpcode-buttons-row{margin:40px 0 0;text-align:center}.wpcode-modal-header{text-align:center}.wpcode-items-metabox-inside{background-color:var(--wpcode-background-gray);margin-bottom:var(--wpcode-space-v);margin-left:-24px;margin-right:-24px;border-top:1px solid #F5F5F5;border-bottom:1px solid #F5F5F5}.wpcode-items-metabox-inside .wpcode-list-item-location{cursor:pointer}.wpcode-items-metabox-inside .wpcode-list-item-location *{cursor:pointer}.wpcode-items-metabox-inside .wpcode-list-item{padding:0;border:none;font-size:14px;margin-top:12px;margin-bottom:12px}.wpcode-items-metabox-inside .wpcode-list-item.wpcode-list-item-disabled .wpcode-list-item-title{color:#848A8A}.wpcode-items-metabox-inside .wpcode-list-item.wpcode-list-item-disabled .wpcode-list-item-description{color:rgba(119,119,119,0.50)}@media (min-width:961px){.wpcode-items-metabox-inside .wpcode-list-item{width:calc(50% - 24px)}}.wpcode-items-metabox-inside .wpcode-list-item.wpcode-list-item-separator{width:100%;color:var(--wpcode-text-color-heading);font-size:var(--wpcode-font-size-m);font-weight:700;padding:0;border:none;margin-top:16px}.wpcode-items-metabox-inside .wpcode-list-item .wpcode-list-item-title{font-size:var(--wpcode-font-size-s);color:var(--wpcode-text-color-heading);font-weight:700;display:block}.wpcode-items-metabox-inside .wpcode-list-item:hover .wpcode-list-item-description,.wpcode-items-metabox-inside .wpcode-list-item:focus .wpcode-list-item-description{opacity:1}.wpcode-items-metabox-inside .wpcode-list-item input{opacity:0;position:absolute}.wpcode-items-metabox-inside .wpcode-list-item.wpcode-list-item-selected .wpcode-list-item-title:after{content:attr(data-selected-label);display:inline-block;position:absolute;left:auto;top:0;margin-left:5px;vertical-align:middle;background-color:var(--wpcode-color-primary);color:#fff;font-size:8px;font-weight:700;text-transform:uppercase;line-height:1;padding:4px 8px;border-radius:40px}.wpcode-items-metabox-inside .wpcode-list-item-description{margin-top:8px;display:block;min-height:0;color:var(--wpcode-text-color-paragraph)}.wpcode-items-metabox-inside .wpcode-items-list-category{margin-top:0}.wpcode-items-metabox-inside .wpcode-items-list{padding:5px 12px;position:relative}.wpcode-items-metabox-inside .wpcode-items-list:before{content:'';display:block;position:absolute;top:-10px;left:417px;width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-bottom:10px solid var(--wpcode-background-gray);z-index:10}.wpcode-items-metabox-inside .wpcode-items-list:after{content:'';display:block;position:absolute;top:-11px;left:417px;width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-bottom:10px solid #F5F5F5;z-index:5}.wpcode-items-metabox-inside .wpcode-keywords{display:none}.wpcode-items-metabox-inside .wpcode-list-item-pill{display:inline-block;position:relative;right:0;top:0;margin-left:5px;vertical-align:middle;color:#fff}.wpcode-items-metabox-inside .wpcode-items-categories-list .wpcode-active:after{background-image:url("data:image/svg+xml,%3Csvg width=%2716%27 height=%2712%27 viewBox=%270 0 16 12%27 fill=%27none%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M5.33329 9.25326L1.83329 5.75326L0.666626 6.91992L5.33329 11.5866L15.3333 1.58659L14.1666 0.419922L5.33329 9.25326Z%27 fill=%27%233568B7%27/%3E%3C/svg%3E%0A");content:'';height:12px;position:absolute;right:10px;top:50%;transform:translateY(-50%);width:16px}.wpcode-faux-select{border-color:var(--wpcode-border-color);border-radius:4px;border-width:1px;border-style:solid;color:var(--wpcode-text-color-heading);cursor:pointer;line-height:38px;min-height:40px;padding-left:12px;padding-right:32px;font-size:14px;background:var(--wpcode-background-white) url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E") no-repeat right 13px top 55%;max-width:424px;width:100%}.wpcode-faux-select:focus{outline:none;box-shadow:0 0 0 1px var(--wpcode-color-primary)}.wpcode-auto-insert-form-fields .wpcode-metabox-form-row{max-width:100%}.wpcode-auto-insert-form-fields .wpcode-metabox-form-row-input{display:flex;align-items:center;flex-flow:wrap}@media (min-width:1470px){.wpcode-auto-insert-form-fields .wpcode-metabox-form-row-input{flex-flow:row}}.wpcode-auto-insert-form-fields .wpcode-metabox-form-row-input .wpcode-extra-location-fields{display:flex;align-items:center;margin-top:24px;width:100%}@media (min-width:1470px){.wpcode-auto-insert-form-fields .wpcode-metabox-form-row-input .wpcode-extra-location-fields{margin-top:0}}.wpcode-auto-insert-form-fields .wpcode-metabox-form-row-input .wpcode-extra-location-input{display:flex;align-items:center;position:relative;margin-right:18px}@media (min-width:1470px){.wpcode-auto-insert-form-fields .wpcode-metabox-form-row-input .wpcode-extra-location-input{margin-right:0}}.wpcode-auto-insert-form-fields .wpcode-metabox-form-row-input .wpcode-extra-location-input .wpcode-location-extra-input-description{flex-shrink:0}.wpcode-auto-insert-form-fields .wpcode-metabox-form-row-input .wpcode-extra-location-input .wpcode-help-tooltip{margin-left:10px}.wpcode-auto-insert-form-fields .wpcode-location-extra-input-description{color:var(--wpcode-text-color-paragraph);font-size:var(--wpcode-font-size-s);margin:0 18px 0 0}@media (min-width:1470px){.wpcode-auto-insert-form-fields .wpcode-location-extra-input-description{margin-left:18px}}.wpcode-auto-insert-form-fields .wpcode-input-number{max-width:75px}#wpcode_auto_insert_location .wpcode-list-item-description{opacity:1}.wpcode-smart-tags{position:relative;display:inline-block;vertical-align:top}.wpcode-smart-tags.wpcode-smart-tags-unavailable .wpcode-smart-tags-toggle{opacity:0.6}.wpcode-smart-tags .wpcode-smart-tags-toggle{background:none;border:none;color:var(--wpcode-text-color-paragraph);font-size:var(--wpcode-font-size-s);cursor:pointer}.wpcode-smart-tags .wpcode-smart-tags-toggle svg{vertical-align:middle}.wpcode-smart-tags .wpcode-smart-tags-toggle span{text-decoration:underline}.wpcode-smart-tags .wpcode-smart-tags-toggle:hover span{text-decoration:none}.wpcode-smart-tags .wpcode-text-active{display:none}.wpcode-smart-tags .wpcode-smart-tags-dropdown{border:1px solid var(--wpcode-border-color);border-radius:4px;display:none;left:0;position:absolute;top:100%;z-index:1050;background:#fff;width:400px;margin-top:7px}.wpcode-smart-tags .wpcode-smart-tags-dropdown ul{border-top:1px solid var(--wpcode-border-color)}.wpcode-smart-tags .wpcode-smart-tags-dropdown ul:first-child{border-top:none}.wpcode-smart-tags .wpcode-smart-tags-dropdown ul li{padding:0 15px;margin:12px 0}.wpcode-smart-tags .wpcode-smart-tags-dropdown .wpcode-smart-tag-category-label{font-weight:600;font-size:var(--wpcode-font-size-s);color:var(--wpcode-text-color-paragraph)}.wpcode-smart-tags.wpcode-smart-tags-open .wpcode-text-active{display:inline-block}.wpcode-smart-tags.wpcode-smart-tags-open .wpcode-text-default{display:none}.wpcode-smart-tags.wpcode-smart-tags-open .wpcode-smart-tags-dropdown{display:block}.wpcode-insert-smart-tag{border:0;color:var(--wpcode-text-color-paragraph);font-size:var(--wpcode-font-size-s);padding:0;text-align:left;background:none;cursor:pointer}.wpcode-insert-smart-tag:hover code{background-color:rgba(0,0,0,0.15)}.wpcode-smart-tags-dropdown-footer{padding:12px 15px;border-top:1px solid var(--wpcode-border-color);display:flex}.wpcode-smart-tags-dropdown-footer a{color:var(--wpcode-text-color-paragraph);display:inline-flex}.wpcode-smart-tags-dropdown-footer a .wpcode-icon{margin-right:5px}.wpcode-toggle-testing-mode-wrap{opacity:0.6}.wpcode-plugin-page{margin:50px auto;width:700px;max-width:100%;text-align:center}.wpcode-plugin-page-image{margin-bottom:38px}.wpcode-plugin-screenshot{display:flex;text-align:left;margin:50px 0}.wpcode-plugin-screenshot ul{margin-left:30px;margin-top:0}.wpcode-plugin-screenshot ul li{margin:16px 0;padding:0 0 0 24px;font-size:15px;color:var(--wpcode-text-color-paragraph);background-image:url("data:image/svg+xml,%3Csvg width=%2719%27 height=%2718%27 viewBox=%270 0 19 18%27 fill=%27none%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath fill-rule=%27evenodd%27 clip-rule=%27evenodd%27 d=%27M9.5 0.416016C4.67 0.416016 0.75 4.33602 0.75 9.16602C0.75 13.996 4.67 17.916 9.5 17.916C14.33 17.916 18.25 13.996 18.25 9.16602C18.25 4.33602 14.33 0.416016 9.5 0.416016ZM9.5 16.166C5.64125 16.166 2.5 13.0248 2.5 9.16602C2.5 5.30727 5.64125 2.16602 9.5 2.16602C13.3587 2.16602 16.5 5.30727 16.5 9.16602C16.5 13.0248 13.3587 16.166 9.5 16.166ZM7.75 11.0648L13.5163 5.29852L14.75 6.54102L7.75 13.541L4.25 10.041L5.48375 8.80727L7.75 11.0648Z%27 fill=%27%2309A347%27/%3E%3C/svg%3E");background-position:left 3px;background-repeat:no-repeat;background-size:14px}.wpcode-plugin-screenshot-image{width:315px;padding:5px;background:#fff;box-shadow:0 2px 5px 0 rgba(0,0,0,0.05);border-radius:3px;position:relative}.wpcode-plugin-screenshot-image img{max-width:100%;display:block}.wpcode-plugin-screenshot-image a{position:absolute;opacity:0;height:100%;width:100%;top:0;left:0;border:5px solid #ffffff;background-color:rgba(0,0,0,0.15);background-repeat:no-repeat;background-position:center;background-size:50px;transition:all 0.3s;display:flex;justify-content:center;align-items:center}.wpcode-plugin-screenshot-image a:before{content:'';position:absolute;width:50px;height:50px;border-radius:50%;background-color:var(--wpcode-color-primary);opacity:1;top:50%;left:50%;transform:translate(-50%,-50%)}.wpcode-plugin-screenshot-image a svg{position:relative;z-index:10}.wpcode-plugin-screenshot-image a svg path{fill:#fff}.wpcode-plugin-screenshot-image a:hover{opacity:1}.wpcode-plugin-step{background-color:#f9f9f9;box-shadow:0 2px 5px 0 rgba(0,0,0,0.05);border:1px solid #e5e5e5;margin:0 0 25px 0;text-align:left}.wpcode-plugin-step>*{vertical-align:middle}.wpcode-plugin-step .wpcode-plugin-page-step-num{display:inline-block;position:relative;width:100px;height:50px;text-align:center}.wpcode-plugin-step .wpcode-plugin-page-step-num .wpcode-icon-step-1{background-color:#ccc;border-radius:50%}.wpcode-plugin-step div{display:inline-block;width:calc(100% - 104px);background-color:#ffffff;padding:30px;border-left:1px solid #eeeeee}.wpcode-plugin-step div h2{margin-top:0}.wpcode-plugin-page-step-loader{margin:0 auto;position:relative;text-indent:-9999em;border-top:4px solid #969696;border-right:4px solid #969696;border-bottom:4px solid #969696;border-left:4px solid #404040;transform:translateZ(0);-webkit-animation:wpcoderotate1 1.1s infinite linear;animation:wpcoderotate1 1.1s infinite linear;background-color:transparent;display:block;border-radius:50%;width:50px;height:50px;margin-top:-54px}.wpcode-plugin-page-step-loader.wpcode-plugin-page-step-loader-hidden{opacity:0}.wpcode-plugin-page-step-loader:after{display:block;border-radius:50%;width:50px;height:50px}@-webkit-keyframes wpcoderotate1{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes wpcoderotate1{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}/*! Lity - v2.4.1 - 2020-04-26
* http://sorgalla.com/lity/
* Copyright (c) 2015-2020 Jan Sorgalla; Licensed MIT */.lity{z-index:9990;position:fixed;top:0;right:0;bottom:0;left:0;white-space:nowrap;background:#0b0b0b;background:rgba(0,0,0,0.9);outline:none !important;opacity:0;transition:opacity 0.3s ease}.lity.lity-opened{opacity:1}.lity.lity-closed{opacity:0}.lity *{box-sizing:border-box}.lity-wrap{z-index:9990;position:fixed;top:0;right:0;bottom:0;left:0;text-align:center;outline:none !important}.lity-wrap:before{content:'';display:inline-block;height:100%;vertical-align:middle;margin-right:-0.25em}.lity-loader{z-index:9991;color:#fff;position:absolute;top:50%;margin-top:-0.8em;width:100%;text-align:center;font-size:14px;font-family:Arial,Helvetica,sans-serif;opacity:0;transition:opacity 0.3s ease}.lity-loading .lity-loader{opacity:1}.lity-container{z-index:9992;position:relative;text-align:left;vertical-align:middle;display:inline-block;white-space:normal;max-width:100%;max-height:100%;outline:none !important}.lity-content{z-index:9993;width:100%;transform:scale(1);transition:transform 0.3s ease}.lity-loading .lity-content,.lity-closed .lity-content{transform:scale(0.8)}.lity-content:after{content:'';position:absolute;left:0;top:0;bottom:0;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,0.6)}.lity-close{z-index:9994;width:35px;height:35px;position:fixed;right:0;top:0;-webkit-appearance:none;cursor:pointer;text-decoration:none;text-align:center;padding:0;color:#fff;font-style:normal;font-size:35px;font-family:Arial,Baskerville,monospace;line-height:35px;text-shadow:0 1px 2px rgba(0,0,0,0.6);border:0;background:none;outline:none;box-shadow:none}.lity-close::-moz-focus-inner{border:0;padding:0}.lity-close:hover,.lity-close:focus,.lity-close:active,.lity-close:visited{text-decoration:none;text-align:center;padding:0;color:#fff;font-style:normal;font-size:35px;font-family:Arial,Baskerville,monospace;line-height:35px;text-shadow:0 1px 2px rgba(0,0,0,0.6);border:0;background:none;outline:none;box-shadow:none}.lity-close:active{top:1px}.lity-image img{max-width:100%;display:block;line-height:0;border:0}.lity-iframe .lity-container,.lity-youtube .lity-container,.lity-vimeo .lity-container,.lity-facebookvideo .lity-container,.lity-googlemaps .lity-container{width:100%;max-width:964px}.lity-iframe-container{width:100%;height:0;padding-top:56.25%;overflow:auto;pointer-events:auto;transform:translateZ(0);-webkit-overflow-scrolling:touch}.lity-iframe-container iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,0.6);background:#000}.lity-hide{display:none}.wpcode-admin-page .lity{z-index:100000;padding:20px}.wpcode-admin-page .lity-content img{max-height:80vh !important;max-width:80vw !important}.wpcode-content .wpcode-plugin-suggestions,.wrap .wpcode-plugin-suggestions{display:flex;align-items:center;margin-top:0}.wpcode-content .wpcode-plugin-suggestions h3,.wrap .wpcode-plugin-suggestions h3{margin-top:0;margin-bottom:5px}.wpcode-content .wpcode-plugin-suggestions p,.wrap .wpcode-plugin-suggestions p{padding:0}@media (max-width:782px){.wpcode-content .wpcode-plugin-suggestions,.wrap .wpcode-plugin-suggestions{flex-direction:column;align-items:flex-start}}.wpcode-content .wpcode-plugin-suggestions:first-child,.wpcode-content .wpcode-plugin-suggestions div:first-child,.wrap .wpcode-plugin-suggestions:first-child,.wrap .wpcode-plugin-suggestions div:first-child{margin-top:0}.wpcode-content .wpcode-plugin-suggestions .wpcode-plugin-suggestion-plugin,.wrap .wpcode-plugin-suggestions .wpcode-plugin-suggestion-plugin{width:33%;margin:0 0 20px;display:flex}.wpcode-content .wpcode-plugin-suggestions .wpcode-plugin-suggestion-plugin .wpcode-plugin-suggestion-plugin-icon,.wrap .wpcode-plugin-suggestions .wpcode-plugin-suggestion-plugin .wpcode-plugin-suggestion-plugin-icon{margin-right:12px}@media (max-width:782px){.wpcode-content .wpcode-plugin-suggestions .wpcode-plugin-suggestion-plugin,.wrap .wpcode-plugin-suggestions .wpcode-plugin-suggestion-plugin{width:100%}}.wpcode-content .wpcode-suggestions-title,.wrap .wpcode-suggestions-title{padding:0;margin-bottom:12px;margin-top:20px}.wpcode-code-type-picker{position:fixed;left:160px;right:0;z-index:1100;background:#f0f0f1;text-align:left;padding:30px 40px 30px;bottom:-1000px;border-top:1px solid var(--wpcode-border-color);transition:bottom 0.30s ease}.folded .wpcode-code-type-picker{left:36px}@media (max-width:768px){.wpcode-code-type-picker{left:0}.wp-responsive-open .wpcode-code-type-picker{display:none}}.wpcode-code-type-picker .wpcode-code-types-list{display:grid;grid-gap:40px;padding:0 40px;grid-template-columns:repeat(auto-fill,minmax(Max(150px,200px),1fr));max-width:1100px;margin:0 auto}@media (max-width:1239px){.wpcode-code-type-picker .wpcode-code-types-list{padding:0;grid-gap:20px}}@media (max-height:480px) OR (max-width:768px){.wpcode-code-type-picker .wpcode-code-types-list .wpcode-code-type-desc{display:none}}.wpcode-code-textarea{position:relative}.wpcode-code-type{border-radius:6px;height:100%;overflow:hidden;padding:0 0 15px;position:relative;box-shadow:0 0 0 1px #cccccc;transition:box-shadow 0.15s;background:#fff;cursor:pointer}.wpcode-code-type h3{font-size:16px;font-weight:600;line-height:18px;padding:20px 30px 2px;margin:0;overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;color:#444444}.wpcode-code-type .wpcode-code-type-desc{color:#777777;font-size:14px;line-height:18px;margin:10px 0 0;padding:5px 30px}.wpcode-code-type.wpcode-code-type-selected{box-shadow:0 0 0 2px var(--wpcode-color-primary)}.wpcode-code-type-picker-backdrop{left:160px;top:0;z-index:-100;bottom:0;right:0;background:rgba(0,0,0,0.7);position:fixed;opacity:0;transition:opacity 0.30s ease}.folded .wpcode-code-type-picker-backdrop{left:36px}@media (max-width:768px){.wpcode-code-type-picker-backdrop{left:0}.wp-responsive-open .wpcode-code-type-picker-backdrop{display:none}}.wpcode-code-type-picker-header{display:flex;justify-content:space-between;margin:0 auto 20px;width:1020px;max-width:100%}.wpcode-code-type-picker-visible .wpcode-code-type-picker-backdrop{opacity:1;z-index:1070}.wpcode-code-type-picker-visible .wpcode-code-type-picker{bottom:0}#wpcode_snippet_type-holder select{pointer-events:none}/*!
 * jquery-confirm v3.3.4 (http://craftpip.github.io/jquery-confirm/)
 * Author: boniface pereira
 * Website: www.craftpip.com
 * Contact: hey@craftpip.com
 *
 * Copyright 2013-2019 jquery-confirm
 * Licensed under MIT (https://github.com/craftpip/jquery-confirm/blob/master/LICENSE)
 */@-webkit-keyframes jconfirm-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}@keyframes jconfirm-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}body[class*=jconfirm-no-scroll-]{overflow:hidden !important}.jconfirm{position:fixed;top:0;left:0;right:0;bottom:0;z-index:99999999;font-family:inherit;overflow:hidden}.jconfirm .jconfirm-bg{position:fixed;top:0;left:0;right:0;bottom:0;transition:opacity .4s}.jconfirm .jconfirm-bg.jconfirm-bg-h{opacity:0 !important}.jconfirm .jconfirm-scrollpane{perspective:500px;perspective-origin:center;display:table;width:100%;height:100%}.jconfirm .jconfirm-row{display:table-row;width:100%}.jconfirm .jconfirm-cell{display:table-cell;vertical-align:middle}.jconfirm .jconfirm-holder{max-height:100%;padding:50px 0}.jconfirm .jconfirm-box-container{transition:transform}.jconfirm .jconfirm-box-container.jconfirm-no-transition{transition:none !important}.jconfirm .jconfirm-box{background:white;border-radius:4px;position:relative;outline:0;padding:15px 15px 0;overflow:hidden;margin-left:auto;margin-right:auto}@-webkit-keyframes type-blue{1%,100%{border-color:#3498db}50%{border-color:#5faee3}}@keyframes type-blue{1%,100%{border-color:#3498db}50%{border-color:#5faee3}}@-webkit-keyframes type-green{1%,100%{border-color:#2ecc71}50%{border-color:#54d98c}}@keyframes type-green{1%,100%{border-color:#2ecc71}50%{border-color:#54d98c}}@-webkit-keyframes type-red{1%,100%{border-color:#e74c3c}50%{border-color:#ed7669}}@keyframes type-red{1%,100%{border-color:#e74c3c}50%{border-color:#ed7669}}@-webkit-keyframes type-orange{1%,100%{border-color:#f1c40f}50%{border-color:#f4d03f}}@keyframes type-orange{1%,100%{border-color:#f1c40f}50%{border-color:#f4d03f}}@-webkit-keyframes type-purple{1%,100%{border-color:#9b59b6}50%{border-color:#b07cc6}}@keyframes type-purple{1%,100%{border-color:#9b59b6}50%{border-color:#b07cc6}}@-webkit-keyframes type-dark{1%,100%{border-color:#34495e}50%{border-color:#46627f}}@keyframes type-dark{1%,100%{border-color:#34495e}50%{border-color:#46627f}}.jconfirm .jconfirm-box.jconfirm-type-animated{-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.jconfirm .jconfirm-box.jconfirm-type-blue{border-top:solid 7px #3498db;-webkit-animation-name:type-blue;animation-name:type-blue}.jconfirm .jconfirm-box.jconfirm-type-green{border-top:solid 7px #2ecc71;-webkit-animation-name:type-green;animation-name:type-green}.jconfirm .jconfirm-box.jconfirm-type-red{border-top:solid 7px #e74c3c;-webkit-animation-name:type-red;animation-name:type-red}.jconfirm .jconfirm-box.jconfirm-type-orange{border-top:solid 7px #f1c40f;-webkit-animation-name:type-orange;animation-name:type-orange}.jconfirm .jconfirm-box.jconfirm-type-purple{border-top:solid 7px #9b59b6;-webkit-animation-name:type-purple;animation-name:type-purple}.jconfirm .jconfirm-box.jconfirm-type-dark{border-top:solid 7px #34495e;-webkit-animation-name:type-dark;animation-name:type-dark}.jconfirm .jconfirm-box.loading{height:120px}.jconfirm .jconfirm-box.loading:before{content:'';position:absolute;left:0;background:white;right:0;top:0;bottom:0;border-radius:10px;z-index:1}.jconfirm .jconfirm-box.loading:after{opacity:.6;content:'';height:30px;width:30px;border:solid 3px transparent;position:absolute;left:50%;margin-left:-15px;border-radius:50%;-webkit-animation:jconfirm-spin 1s infinite linear;animation:jconfirm-spin 1s infinite linear;border-bottom-color:dodgerblue;top:50%;margin-top:-15px;z-index:2}.jconfirm .jconfirm-box div.jconfirm-closeIcon{height:20px;width:20px;position:absolute;top:10px;right:10px;cursor:pointer;opacity:.6;text-align:center;font-size:27px !important;line-height:14px !important;display:none;z-index:1}.jconfirm .jconfirm-box div.jconfirm-closeIcon:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-closeIcon .fa{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon .glyphicon{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon .zmdi{font-size:16px}.jconfirm .jconfirm-box div.jconfirm-closeIcon:hover{opacity:1}.jconfirm .jconfirm-box div.jconfirm-title-c{display:block;font-size:22px;line-height:20px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;padding-bottom:15px}.jconfirm .jconfirm-box div.jconfirm-title-c.jconfirm-hand{cursor:move}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{font-size:inherit;display:inline-block;vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c i{vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:inherit;font-family:inherit;display:inline-block;vertical-align:middle}.jconfirm .jconfirm-box div.jconfirm-title-c .jconfirm-title:empty{display:none}.jconfirm .jconfirm-box div.jconfirm-content-pane{margin-bottom:15px;height:auto;transition:height .4s ease-in;display:inline-block;width:100%;position:relative;overflow-x:hidden;overflow-y:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane.no-scroll{overflow-y:hidden}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar{width:3px}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-track{background:rgba(0,0,0,0.1)}.jconfirm .jconfirm-box div.jconfirm-content-pane::-webkit-scrollbar-thumb{background:#666;border-radius:3px}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content{overflow:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content img{max-width:100%;height:auto}.jconfirm .jconfirm-box div.jconfirm-content-pane .jconfirm-content:empty{display:none}.jconfirm .jconfirm-box .jconfirm-buttons{padding-bottom:11px}.jconfirm .jconfirm-box .jconfirm-buttons>button{margin-bottom:4px;margin-left:2px;margin-right:2px}.jconfirm .jconfirm-box .jconfirm-buttons button{display:inline-block;padding:6px 12px;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-radius:4px;min-height:1em;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;-webkit-tap-highlight-color:transparent;border:0;background-image:none}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue{background-color:#3498db;color:#FFF;text-shadow:none;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-blue:hover{background-color:#2980b9;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green{background-color:#2ecc71;color:#FFF;text-shadow:none;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-green:hover{background-color:#27ae60;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red{background-color:#e74c3c;color:#FFF;text-shadow:none;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-red:hover{background-color:#c0392b;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange{background-color:#f1c40f;color:#FFF;text-shadow:none;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-orange:hover{background-color:#f39c12;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default{background-color:#ecf0f1;color:#000;text-shadow:none;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-default:hover{background-color:#bdc3c7;color:#000}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple{background-color:#9b59b6;color:#FFF;text-shadow:none;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-purple:hover{background-color:#8e44ad;color:#FFF}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark{background-color:#34495e;color:#FFF;text-shadow:none;transition:background .2s}.jconfirm .jconfirm-box .jconfirm-buttons button.btn-dark:hover{background-color:#2c3e50;color:#FFF}.jconfirm .jconfirm-box.jconfirm-type-red .jconfirm-title-c .jconfirm-icon-c{color:#e74c3c !important}.jconfirm .jconfirm-box.jconfirm-type-blue .jconfirm-title-c .jconfirm-icon-c{color:#3498db !important}.jconfirm .jconfirm-box.jconfirm-type-green .jconfirm-title-c .jconfirm-icon-c{color:#2ecc71 !important}.jconfirm .jconfirm-box.jconfirm-type-purple .jconfirm-title-c .jconfirm-icon-c{color:#9b59b6 !important}.jconfirm .jconfirm-box.jconfirm-type-orange .jconfirm-title-c .jconfirm-icon-c{color:#f1c40f !important}.jconfirm .jconfirm-box.jconfirm-type-dark .jconfirm-title-c .jconfirm-icon-c{color:#34495e !important}.jconfirm .jconfirm-clear{clear:both}.jconfirm.jconfirm-rtl{direction:rtl}.jconfirm.jconfirm-rtl div.jconfirm-closeIcon{left:5px;right:auto}.jconfirm.jconfirm-white .jconfirm-bg,.jconfirm.jconfirm-light .jconfirm-bg{background-color:#444;opacity:.2}.jconfirm.jconfirm-white .jconfirm-box,.jconfirm.jconfirm-light .jconfirm-box{box-shadow:0 2px 6px rgba(0,0,0,0.2);border-radius:5px}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons{float:right}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button{text-transform:uppercase;font-size:14px;font-weight:bold;text-shadow:none}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default{box-shadow:none;color:#333}.jconfirm.jconfirm-white .jconfirm-box .jconfirm-buttons button.btn-default:hover,.jconfirm.jconfirm-light .jconfirm-box .jconfirm-buttons button.btn-default:hover{background:#ddd}.jconfirm.jconfirm-white.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-light.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-black .jconfirm-bg,.jconfirm.jconfirm-dark .jconfirm-bg{background-color:darkslategray;opacity:.4}.jconfirm.jconfirm-black .jconfirm-box,.jconfirm.jconfirm-dark .jconfirm-box{box-shadow:0 2px 6px rgba(0,0,0,0.2);background:#444;border-radius:5px;color:white}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons{float:right}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button{border:0;background-image:none;text-transform:uppercase;font-size:14px;font-weight:bold;text-shadow:none;transition:background .1s;color:white}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default{box-shadow:none;color:#fff;background:0}.jconfirm.jconfirm-black .jconfirm-box .jconfirm-buttons button.btn-default:hover,.jconfirm.jconfirm-dark .jconfirm-box .jconfirm-buttons button.btn-default:hover{background:#666}.jconfirm.jconfirm-black.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c,.jconfirm.jconfirm-dark.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm .jconfirm-box.hilight.jconfirm-hilight-shake{-webkit-animation:shake .82s cubic-bezier(0.36,0.07,0.19,0.97) both;animation:shake .82s cubic-bezier(0.36,0.07,0.19,0.97) both;transform:translate3d(0,0,0)}.jconfirm .jconfirm-box.hilight.jconfirm-hilight-glow{-webkit-animation:glow .82s cubic-bezier(0.36,0.07,0.19,0.97) both;animation:glow .82s cubic-bezier(0.36,0.07,0.19,0.97) both;transform:translate3d(0,0,0)}@-webkit-keyframes shake{10%,90%{transform:translate3d(-2px,0,0)}20%,80%{transform:translate3d(4px,0,0)}30%,50%,70%{transform:translate3d(-8px,0,0)}40%,60%{transform:translate3d(8px,0,0)}}@keyframes shake{10%,90%{transform:translate3d(-2px,0,0)}20%,80%{transform:translate3d(4px,0,0)}30%,50%,70%{transform:translate3d(-8px,0,0)}40%,60%{transform:translate3d(8px,0,0)}}@-webkit-keyframes glow{0%,100%{box-shadow:0 0 0 red}50%{box-shadow:0 0 30px red}}@keyframes glow{0%,100%{box-shadow:0 0 0 red}50%{box-shadow:0 0 30px red}}.jconfirm{perspective:400px}.jconfirm .jconfirm-box{opacity:1;transition-property:all}.jconfirm .jconfirm-box.jconfirm-animation-top,.jconfirm .jconfirm-box.jconfirm-animation-left,.jconfirm .jconfirm-box.jconfirm-animation-right,.jconfirm .jconfirm-box.jconfirm-animation-bottom,.jconfirm .jconfirm-box.jconfirm-animation-opacity,.jconfirm .jconfirm-box.jconfirm-animation-zoom,.jconfirm .jconfirm-box.jconfirm-animation-scale,.jconfirm .jconfirm-box.jconfirm-animation-none,.jconfirm .jconfirm-box.jconfirm-animation-rotate,.jconfirm .jconfirm-box.jconfirm-animation-rotatex,.jconfirm .jconfirm-box.jconfirm-animation-rotatey,.jconfirm .jconfirm-box.jconfirm-animation-scaley,.jconfirm .jconfirm-box.jconfirm-animation-scalex{opacity:0}.jconfirm .jconfirm-box.jconfirm-animation-rotate{transform:rotate(90deg)}.jconfirm .jconfirm-box.jconfirm-animation-rotatex{transform:rotateX(90deg);transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotatexr{transform:rotateX(-90deg);transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotatey{transform:rotatey(90deg);transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-rotateyr{transform:rotatey(-90deg);transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-scaley{transform:scaley(1.5);transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-scalex{transform:scalex(1.5);transform-origin:center}.jconfirm .jconfirm-box.jconfirm-animation-top{transform:translate(0px,-100px)}.jconfirm .jconfirm-box.jconfirm-animation-left{transform:translate(-100px,0px)}.jconfirm .jconfirm-box.jconfirm-animation-right{transform:translate(100px,0px)}.jconfirm .jconfirm-box.jconfirm-animation-bottom{transform:translate(0px,100px)}.jconfirm .jconfirm-box.jconfirm-animation-zoom{transform:scale(1.2)}.jconfirm .jconfirm-box.jconfirm-animation-scale{transform:scale(0.5)}.jconfirm .jconfirm-box.jconfirm-animation-none{visibility:hidden}.jconfirm.jconfirm-supervan .jconfirm-bg{background-color:rgba(54,70,93,0.95)}.jconfirm.jconfirm-supervan .jconfirm-box{background-color:transparent}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-blue{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-green{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-red{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-orange{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-purple{border:0}.jconfirm.jconfirm-supervan .jconfirm-box.jconfirm-type-dark{border:0}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-closeIcon{color:white}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c{text-align:center;color:white;font-size:28px;font-weight:normal}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c>*{padding-bottom:25px}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content-pane{margin-bottom:25px}.jconfirm.jconfirm-supervan .jconfirm-box div.jconfirm-content{text-align:center;color:white}.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons{text-align:center}.jconfirm.jconfirm-supervan .jconfirm-box .jconfirm-buttons button{font-size:16px;border-radius:2px;background:#303f53;text-shadow:none;border:0;color:white;padding:10px;min-width:100px}.jconfirm.jconfirm-supervan.jconfirm-rtl .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-material .jconfirm-bg{background-color:rgba(0,0,0,0.67)}.jconfirm.jconfirm-material .jconfirm-box{background-color:white;box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);padding:30px 25px 10px 25px}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.87)}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,0.87);font-size:22px;font-weight:bold}.jconfirm.jconfirm-material .jconfirm-box div.jconfirm-content{color:rgba(0,0,0,0.87)}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons{text-align:right}.jconfirm.jconfirm-material .jconfirm-box .jconfirm-buttons button{text-transform:uppercase;font-weight:500}.jconfirm.jconfirm-material.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-bootstrap .jconfirm-bg{background-color:rgba(0,0,0,0.21)}.jconfirm.jconfirm-bootstrap .jconfirm-box{background-color:white;box-shadow:0 3px 8px 0 rgba(0,0,0,0.2);border:solid 1px rgba(0,0,0,0.4);padding:15px 0 0}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{margin-right:8px;margin-left:0}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.87)}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,0.87);font-size:22px;font-weight:bold;padding-left:15px;padding-right:15px}.jconfirm.jconfirm-bootstrap .jconfirm-box div.jconfirm-content{color:rgba(0,0,0,0.87);padding:0 15px}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons{text-align:right;padding:10px;margin:-5px 0 0;border-top:solid 1px #ddd;overflow:hidden;border-radius:0 0 4px 4px}.jconfirm.jconfirm-bootstrap .jconfirm-box .jconfirm-buttons button{font-weight:500}.jconfirm.jconfirm-bootstrap.jconfirm-rtl .jconfirm-title-c .jconfirm-icon-c{margin-left:8px;margin-right:0}.jconfirm.jconfirm-modern .jconfirm-bg{background-color:slategray;opacity:.6}.jconfirm.jconfirm-modern .jconfirm-box{background-color:white;box-shadow:0 7px 8px -4px rgba(0,0,0,0.2),0 13px 19px 2px rgba(0,0,0,0.14),0 5px 24px 4px rgba(0,0,0,0.12);padding:30px 30px 15px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-closeIcon{color:rgba(0,0,0,0.87);top:15px;right:15px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c{color:rgba(0,0,0,0.87);font-size:24px;font-weight:bold;text-align:center;margin-bottom:10px}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-title-c .jconfirm-icon-c{transition:transform .5s;transform:scale(0);display:block;margin-right:0;margin-left:0;margin-bottom:10px;font-size:69px;color:#aaa}.jconfirm.jconfirm-modern .jconfirm-box div.jconfirm-content{text-align:center;font-size:15px;color:#777;margin-bottom:25px}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons{text-align:center}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button{font-weight:bold;text-transform:uppercase;transition:background .1s;padding:10px 20px}.jconfirm.jconfirm-modern .jconfirm-box .jconfirm-buttons button+button{margin-left:4px}.jconfirm.jconfirm-modern.jconfirm-open .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{transform:scale(1)}body div.jconfirm *,body div.jconfirm *::before,body div.jconfirm *::after{box-sizing:border-box;font-size:14px;color:#777777;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}.jconfirm.jconfirm-modern .jconfirm-bg{background:rgba(0,0,0,0.4);opacity:1}.jconfirm .jconfirm-box .jconfirm-buttons{padding:0px}body div.jconfirm .jconfirm-box-container .jconfirm-box{display:grid;grid-template-columns:repeat(2,1fr);justify-items:center;-webkit-animation:none;animation:none;background:#ffffff;border-radius:0px;border-top-style:solid;border-top-width:4px;box-shadow:0 3px 6px rgba(0,0,0,0.15);padding:36px 36px 17px}body div.jconfirm.loader-spinner .jconfirm-box-container .jconfirm-box{padding:10px 0 0 0}body div.jconfirm.no-content .jconfirm-box-container .jconfirm-box .jconfirm-title-c .jconfirm-icon-c+.jconfirm-title{margin:0px}body div.jconfirm.no-content .jconfirm-box-container .jconfirm-box .jconfirm-content-pane{display:none}body div.jconfirm.loader-spinner-completed .jconfirm-box-container .jconfirm-box .lds-dual-ring{display:block;text-align:center;margin:20px auto 0px auto}body div.jconfirm.no-content .jconfirm-box-container .jconfirm-box .jconfirm-content-pane{display:none}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-title-c,body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane,body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons{grid-column:1/-1}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-default{border-top-width:0}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-default .jconfirm-title-c{margin-bottom:20px}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-default .jconfirm-title-c .jconfirm-icon-c{font-size:44px;margin-bottom:-6px}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-default button.wpcode-btn-confirm{background-color:#e27730;border-color:#e27730}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons button.btn.wpcode-btn-reject{background-color:#d63638;border-color:#d63638;color:#fff}body div.jconfirm.save-to-cloud .jconfirm-box-container .jconfirm-box .jconfirm-buttons button.btn.wpcode-btn-reject{line-height:15px}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-default button.wpcode-btn-confirm{background-color:#e27730;border-color:#e27730}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-default button.wpcode-btn-confirm:hover{background-color:#cd6622;border-color:#cd6622}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-red{border-top:none}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-red .jconfirm-title-c .jconfirm-icon-c{color:#d63638 !important}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-red button.wpcode-btn-confirm{background-color:#d63638;border-color:#d63638}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-red button.wpcode-btn-confirm:hover{background-color:#b32d2e;border-color:#b32d2e}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-orange{border-top-color:#e27730 !important;border-top:none}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-orange .jconfirm-title-c .jconfirm-icon-c{color:#e27730 !important}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-orange button.wpcode-btn-confirm{background-color:#e27730;border-color:#e27730}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-orange button.wpcode-btn-confirm:hover{background-color:#cd6622;border-color:#cd6622}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-yellow{border-top-color:#ffb900 !important}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-yellow .jconfirm-title-c .jconfirm-icon-c{color:#ffb900 !important}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-yellow button.wpcode-btn-confirm{background-color:#ffb900;border-color:#ffb900}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-yellow button.wpcode-btn-confirm:hover{background-color:#ffaa00;border-color:#ffaa00}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-blue{border-top:0 !important}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-blue .jconfirm-title-c .jconfirm-icon-c{color:var(--wpcode-color-primary) !important}body div.jconfirm.width560px .jconfirm-box-container .jconfirm-box{max-width:560px}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-blue button.wpcode-btn-confirm{background-color:#3085d6;border-color:#3085d6}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-blue button.wpcode-btn-confirm:focus{box-shadow:0 0 0 3px rgb(53 104 183/50%)}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-blue button.wpcode-btn-confirm:hover{background-color:#2b77c0;border-color:#2b77c0}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-blue button.wpcode-btn-reject:hover{background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-blue button.wpcode-btn-cancel:hover{background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-green{border-top-color:#00a32a !important}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-green .jconfirm-title-c .jconfirm-icon-c{color:#00a32a !important}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-green button.wpcode-btn-confirm{background-color:#00a32a;border-color:#00a32a}body div.jconfirm .jconfirm-box-container .jconfirm-box.jconfirm-type-green button.wpcode-btn-confirm:hover{background-color:#008a20;border-color:#008a20}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-closeIcon{font-family:inherit;height:14px;opacity:1;right:17px !important;font-weight:700;right:10px;color:#c1c1c1;top:10px;width:14px}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-closeIcon:after{}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-closeIcon:hover:after{color:#777777 !important}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-title-c{margin:0 0 20px 0;padding:0;font-weight:600}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-title-c .jconfirm-icon-c{font-size:47px;margin:0;transform:none !important;transition:none !important}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-title-c .jconfirm-icon-c+.jconfirm-title{margin-top:0px;margin-bottom:10px}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-title-c .jconfirm-title{color:#444444;display:block;line-height:30px}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane{display:block;margin-bottom:20px}body div.jconfirm.loader-spinner-completed .jconfirm-box-container .jconfirm-box .jconfirm-content-pane{margin-bottom:0px}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content{color:#444444;font-size:16px;line-height:24px;margin-bottom:0;overflow:inherit}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content.lite-upgrade p{color:#777777;font-size:18px;padding:0 20px}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content p{font-size:inherit;line-height:inherit;margin:0 0 16px}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content p:last-of-type{margin:0}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content p.large{font-size:18px}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content p.small{font-size:14px}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content input[type=text],body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content input[type=number],body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content input[type=email],body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content input[type=url],body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content input[type=password],body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content input[type=search],body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content input[type=tel],body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content textarea,body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content select{margin:10px 2px;width:calc(100% - 4px)}body div.jconfirm .jconfirm-box-container .jconfirm-box .feature-video{margin:30px 0 0 0}body div.jconfirm .jconfirm-box-container .jconfirm-box .pro-feature-video{margin:15px 0 10px 0}body div.jconfirm .jconfirm-box-container .jconfirm-box input[type=text]:not(.choices__input){display:block;width:99%;border:1px solid #d6d6d6;padding:10px !important;box-shadow:none;margin:10px 1px 1px 1px !important;line-height:1 !important;outline:0}body div.jconfirm .jconfirm-box-container .jconfirm-box input[type=text]:not(.choices__input):focus{border-color:#007cba;box-shadow:0 0 0 1px #007cba}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons{margin-top:0px}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons button{background:#f8f8f8;border:1px solid #cccccc;border-radius:4px;color:#777777;font-size:14px;font-weight:600;line-height:14px;outline:none;padding:10px 16px;text-transform:none;margin:5px;transition-property:all;transition-duration:0.15s;transition-timing-function:ease-out}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-title-c .jconfirm-title .excl-mark,body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content .excl-mark{height:88px;width:88px;text-align:center;margin:auto;font-weight:400;margin-bottom:30px;font-size:55px;color:#f8bb86c9;border:4px solid #f8bb86c9;border-radius:50%;line-height:66px}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-title-c .jconfirm-title .excl-mark{margin-top:20px}body div.jconfirm.disable-testing-mode .jconfirm-box-container .jconfirm-content-pane p{text-align:left}body div.jconfirm .jconfirm-box-container .jconfirm-content .lds-dual-ring,body div.jconfirm .jconfirm-box-container .jconfirm-content .lds-dual-ring:after{box-sizing:border-box}body div.jconfirm .jconfirm-box-container .jconfirm-content .lds-dual-ring{color:var(--wpcode-color-primary);display:inline-block;width:54px;height:54px}body div.jconfirm .jconfirm-box-container .jconfirm-content .lds-dual-ring:after{content:" ";display:block;color:var(--wpcode-color-primary);width:38px;height:38px;margin:8px;border-radius:50%;border:4px solid var(--wpcode-color-primary);border-color:var(--wpcode-color-primary) transparent var(--wpcode-color-primary) transparent;-webkit-animation:lds-dual-ring 1.2s linear infinite;animation:lds-dual-ring 1.2s linear infinite}@-webkit-keyframes lds-dual-ring{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes lds-dual-ring{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons button:hover{background:#eeeeee;border-color:#cccccc}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons .wpcode-btn-orange{background:var(--wpcode-button-orange-bg);border-color:var(--wpcode-button-orange-bg);color:#fff;height:56px;font-size:var(--wpcode-font-size-m);justify-content:center;padding-left:var(--wpcode-space-h);padding-right:var(--wpcode-space-h);text-align:center}body div.jconfirm .jconfirm-box-container .jconfirm-box .footer-link{grid-column:1/-1;border-top:1px solid #eee;padding-top:16px;margin-top:20px;width:100%;text-align:center}body div.jconfirm .jconfirm-box-container .jconfirm-box .footer-link a{color:#135e96}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons .wpcode-btn-orange:hover{background:var(--wpcode-button-orange-bg-hover);border-color:var(--wpcode-button-orange-bg-hover);background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons button[disabled]{cursor:no-drop;pointer-events:none;opacity:.25}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons button.wpcode-btn-confirm{color:#ffffff}body div.jconfirm.disable-testing-mode .jconfirm-box-container .jconfirm-box .jconfirm-buttons button.wpcode-btn-confirm,body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons button.wpcode-btn-cancel,body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons button.wpcode-btn-reject{font-size:16px;line-height:19px}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons button.wpcode-btn-cancel{background-color:#757575;color:#fff}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane a{color:#135e96}body div.jconfirm.disable-testing-mode .jconfirm-box-container .jconfirm-box .jconfirm-content-pane{padding:0 40px}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons button.hidden+button{margin-left:0;margin-right:0}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons button.btn-block{display:block;margin:0 0 10px 0 !important;text-align:center;width:100%}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons button.btn-normal-case{text-transform:none !important}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-buttons button i{margin:0 10px 0 0}body div.jconfirm .jconfirm-box-container .jconfirm-box .error{color:#d63638;display:none}body div.jconfirm .jconfirm-box-container .jconfirm-box button[disabled]{cursor:no-drop}.choices{font-size:16px;text-align:start}body .jconfirm.has-video div.jconfirm-box-container .jconfirm-box{padding-bottom:0;padding-top:30px}body .jconfirm.has-video div.jconfirm-box-container .feature-video,body .jconfirm.has-video div.jconfirm-box-container .pro-feature-video{grid-row:1/span 4;grid-column-start:2;margin-top:0;margin-left:15px}body .jconfirm.has-video div.jconfirm-box-container .jconfirm-title-c,body .jconfirm.has-video div.jconfirm-box-container .jconfirm-content-pane,body .jconfirm.has-video div.jconfirm-box-container .jconfirm-buttons{grid-column:1/2}body .jconfirm.upgrade-modal .jconfirm-box-container div.jconfirm-box{padding-bottom:30px}body .jconfirm.upgrade-modal .jconfirm-box-container div.jconfirm-box .pro-feature-video{margin-bottom:0}body .jconfirm.upgrade-modal .jconfirm-box-container div.jconfirm-box .jconfirm-buttons{padding-bottom:0}.jconfirm-content-pane svg,.jconfirm-title svg{width:100px;display:block;margin:22px auto 54px auto}.upsell-box .jconfirm-content-pane svg,.jconfirm-title svg{margin:0px auto 10px auto}.jconfirm-content-pane svg circle,.jconfirm-title svg circle{stroke:rgba(165,220,134,.3)}.jconfirm-content-pane svg polyline,.jconfirm-title svg polyline{background-color:#a5dc86;stroke:#a5dc86;stroke-width:7px}.jconfirm-content-pane .path,.jconfirm-title .path{stroke-dasharray:1000;stroke-dashoffset:0}.jconfirm-content-pane .path.circle,.jconfirm-title .path.circle{-webkit-animation:dash .9s ease-in-out;animation:dash .9s ease-in-out}.jconfirm-content-pane .path.line,.jconfirm-title .path.line{stroke-dashoffset:1000;-webkit-animation:dash .9s .35s ease-in-out forwards;animation:dash .9s .35s ease-in-out forwards}.jconfirm-content-pane .path.check,.jconfirm-title .path.check{stroke-dashoffset:-100;-webkit-animation:dash-check .9s .35s ease-in-out forwards;animation:dash-check .9s .35s ease-in-out forwards}.jconfirm-content-pane p,.jconfirm-title p{text-align:center;margin:20px 0 60px;font-size:1.25em}.jconfirm-content-pane p.success,.jconfirm-title p.success{color:#73AF55}.jconfirm-content-pane p.error,.jconfirm-title p.error{color:#D06079}body div.jconfirm .jconfirm-box-container .wpcode-already-purchased{grid-column:1/-1}body div.jconfirm .jconfirm-box-container .wpcode-discount-note{grid-column:1/-1;text-align:center;background-color:#fcf9e8;color:#777777;font-size:16px;line-height:24px;margin:25px -36px 17px;padding:22px 52px 12px 52px;position:relative}body div.jconfirm .jconfirm-box-container .wpcode-discount-note span{font-weight:700;color:#00a32a}body div.jconfirm .jconfirm-box-container .jconfirm-box .jconfirm-content-pane .jconfirm-content.wpcode-lite-upgrade div{font-size:17px}body div.jconfirm .jconfirm-box-container .wpcode-discount-note strong{font-weight:700;font-size:16px}body div.jconfirm .jconfirm-box-container .wpcode-discount-note:after{background-color:#ffffff;border-radius:50%;background-color:#00a32a;content:"";display:inline-block;font:normal normal normal 14px FontAwesome;-webkit-margin-end:-15px;margin-inline-end:-15px;padding:11px 11px;border:6px solid #fff;position:absolute;inset-inline-end:50%;text-rendering:auto;top:-16px;-webkit-font-smoothing:antialiased}body div.jconfirm .jconfirm-box-container .wpcode_check{grid-column:1/-1;grid-row:4;display:inline-block;transform:rotate(45deg);height:13px;width:8px;position:relative;top:31px;left:-2px;border-bottom:3px solid #ffffff;border-right:3px solid #ffffff}body div.jconfirm .jconfirm-box-container .wpcode-already-purchased{grid-column:1/-1}body div.jconfirm .jconfirm-box-container .wpcode-already-purchased a{color:#bbb}body div.jconfirm .jconfirm-box-container .wpcode-already-purchased a:hover{color:#777}@-webkit-keyframes dash{0%{stroke-dashoffset:1000}100%{stroke-dashoffset:0}}@keyframes dash{0%{stroke-dashoffset:1000}100%{stroke-dashoffset:0}}@-webkit-keyframes dash-check{0%{stroke-dashoffset:-100}100%{stroke-dashoffset:900}}@keyframes dash-check{0%{stroke-dashoffset:-100}100%{stroke-dashoffset:900}}@media screen and (max-width:1023px){body .jconfirm.has-video div.jconfirm-box{grid-template-columns:repeat(1,1fr)}body .jconfirm.has-video .feature-video,body .jconfirm.has-video .pro-feature-video{display:none}}

.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-results__option[data-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[data-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[data-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF',endColorstr='#FFEEEEEE',GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE',endColorstr='#FFCCCCCC',GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:linear-gradient(to bottom,#fff 0%,#eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF',endColorstr='#FFEEEEEE',GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE',endColorstr='#FFFFFFFF',GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[data-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}

.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08);box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08)}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1);animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none !important;box-shadow:none !important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:'';height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9);height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1 1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9)}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{left:0}.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{right:0}.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,0.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,0.1)}.numInputWrapper span:active{background:rgba(0,0,0,0.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,0.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,0.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:rgba(0,0,0,0.5)}.numInputWrapper:hover{background:rgba(0,0,0,0.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\0;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:rgba(0,0,0,0.9)}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:rgba(0,0,0,0.9)}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:rgba(0,0,0,0.5);background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1 1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:rgba(0,0,0,0.54);line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1 1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.dayContainer+.dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:rgba(57,57,57,0.3);background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:rgba(57,57,57,0.1)}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:rgba(57,57,57,0.3);background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1 1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:bold}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:bold;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}
build/admin-bar.asset.php000064400000000137151331545640011334 0ustar00<?php return array('dependencies' => array(), 'version' => '8afeca4aaad1d56fefb41623b6b7b000');build/connect.asset.php000064400000000137151331545640011133 0ustar00<?php return array('dependencies' => array(), 'version' => '9c3a931e76deaf8190a85137802b7390');build/connect.js000064400000003170151331545640007642 0ustar00!function(){"use strict";(window.WPCodeConnect||function(n,o,t){jconfirm.defaults={closeIcon:!1,backgroundDismiss:!1,escapeKey:!0,animationBounce:1,useBootstrap:!1,theme:"modern",boxWidth:"560px",type:"blue",animateFromElement:!1,scrollToPreviousElement:!1};var e={$connectBtn:t("#wpcode-settings-connect-btn"),$connectKey:t("#wpcode-settings-upgrade-license-key")},c="<div class='excl-mark'>!</div>",i={init:function(){console.log("WPCodeConnect: init"),t(i.ready)},ready:function(){i.events()},events:function(){i.connectBtnClick()},connectBtnClick:function(){e.$connectBtn.on("click",(function(){i.gotoUpgradeUrl()}))},proAlreadyInstalled:function(n){const e=WPCodeSVG.WPCodeIcon("checkmark",88,88,"0 0 130.2 130.2","iconId","path circle");t.confirm({title:e+wpcode.almost_done,content:n.data.message,type:"blue",buttons:{confirm:{text:wpcode.plugin_activate_btn,btnClass:"wpcode-btn-confirm",action:function(){o.location.reload()}}}})},gotoUpgradeUrl:function(){var n={action:"wpcode_connect_url",key:e.$connectKey.val(),_wpnonce:wpcode.nonce};t.post(ajaxurl,n).done((function(n){if(n.success)return n.data.reload?void i.proAlreadyInstalled(n):void(o.location.href=n.data.url);t.confirm({title:c+wpcode.oops,closeIcon:!1,content:n.data.message,type:"blue",buttons:{ok:{text:wpcode.ok,btnClass:"wpcode-btn-confirm",action:function(){}}}})})).fail((function(n){i.failAlert(n)}))},failAlert:function(n){t.confirm({title:c+wpcode.oops,content:wpcode.server_error+"<br>"+n.status+" "+n.statusText+" "+n.responseText,type:"blue",buttons:{ok:{text:wpcode.ok,btnClass:"wpcode-btn-confirm",action:function(){}}}})}};return i}(document,window,jQuery)).init()}();build/admin.asset.php000064400000000147151331545640010573 0ustar00<?php return array('dependencies' => array('jquery'), 'version' => '70ccb04c632caf88df10991e079c378b');build/admin-global-lite.js000064400000001665151331545640011501 0ustar00!function(){var t={624:function(){jQuery((function(t){t(".wpcode-admin-tabs-navigation").on("click",".wpcode-admin-tabs button",(function(e){e.preventDefault();const n=t(this).data("target");t(this).addClass("active").parent().siblings().find("button").removeClass("active"),t(document.getElementById(n)).addClass("active").siblings().removeClass("active"),t(document).trigger("wpcode-tab-change",n),window.wpcode_editor&&jQuery.each(window.wpcode_editor,(function(t,e){e.codemirror.refresh()}))}))}))}},e={};function n(o){var r=e[o];if(void 0!==r)return r.exports;var i=e[o]={exports:{}};return t[o](i,i.exports,n),i.exports}n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,{a:e}),e},n.d=function(t,e){for(var o in e)n.o(e,o)&&!n.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},function(){"use strict";n(624)}()}();build/admin-global-lite.asset.php000064400000000137151331545640012763 0ustar00<?php return array('dependencies' => array(), 'version' => '0b74b93a8b56d530f4cd5cdea9f40382');build/admin.js000064400000633335151331545640007315 0ustar00!function(){var e={233:function(){(window.WPCodeAdminCodeEditor||function(e,t,n){const o={l18n:wpcode,init(){t.WPCodeAdminCodeEditor=o},switch_code_mode(e,t){const n=o.get_editor(e);if(void 0===n)return!1;n.setOption("mode",o.get_mime_for_code_type(t)),n.setOption("lint",o.get_lint_for_code_type(t)),jQuery(n.getTextArea()).closest(".wpcode-code-textarea").attr("data-code-type",t)},get_editor(e){if("undefined"!=typeof wpcode_editor)return wpcode_editor[e]?wpcode_editor[e].codemirror:void 0},set_value(e,t){const n=o.get_editor(e);if(void 0===n)return!1;n.getDoc().setValue(t)},get_mime_for_code_type:e=>o.l18n.code_type_options[e].mime,get_lint_for_code_type:e=>o.l18n.code_type_options[e].lint,refresh(e){"undefined"!=typeof wpcode_editor&&o.get_editor(e).refresh()},get_value:e=>void 0===o.get_editor(e)?n("#"+e).val():o.get_editor(e).getValue(),refresh_all(){"undefined"!=typeof wpcode_editor&&n.each(wpcode_editor,(function(e,t){t.codemirror.refresh()}))}};return o}(document,window,jQuery)).init()},560:function(){!function(e,t,n){const o={l10n:wpcode,isAjaxInProgress:!1,init:function(){o.should_init()&&(o.init_status_toggle(),o.move_screen_options(),o.init_copy(),o.init_type_filter(),o.init_pagination(),o.init_code_type_mobile())},init_type_filter:function(){n("#wpcode-snippet-type-buttons a").click((function(e){if(n(this).hasClass("active")||n(this).hasClass("wpcode_pro_type_lite"))return;e.preventDefault();const t=n(this).data("type");n(this).closest("ul").find("a").removeClass("active"),n(this).addClass("active"),o.show_loader(),o.update_url_and_filter(t)})),n("#wpcode-snippet-type-buttons a.wpcode_pro_type_lite").click((function(e){e.preventDefault(),"blocks"===n(this).data("type")?WPCodeAdminNotices.show_pro_notice(o.l10n.blocks_title,o.l10n.blocks_description,o.l10n.blocks_snippet_upgrade_url,o.l10n.button_text):WPCodeAdminNotices.show_pro_notice(o.l10n.scss_title,o.l10n.scss_description,o.l10n.scss_snippet_upgrade_url,o.l10n.button_text)}))},show_loader(){try{const e=n("#wpcode-code-snippets-table .wp-list-table");if(0===e.length)throw new Error("Table element not found");const t=e.offset().top-n("#wpadminbar").outerHeight(),o=e.outerHeight();n("#wpcode-loader .wpcode-loader-overlay").css({top:t,height:o}),n("#wpcode-loader").show()}catch(e){console.error("Failed to show loader:",e.message)}},init_pagination:function(){n(e).on("click",".pagination-links a",(function(e){e.preventDefault();const t=n(this).attr("href").split("paged=")[1];o.changePage(t)})),n(e).on("blur","#current-page-selector",(function(){const e=parseInt(n(this).val(),10);isNaN(e)||o.changePage(e)})),n(e).on("keypress","#current-page-selector",(function(e){"Enter"===e.key&&(e.preventDefault(),n(this).blur())}))},changePage:function(e){const n=new URLSearchParams(t.location.search).get("type")||"",i=new URLSearchParams(t.location.search).get("location")||"",a=new URLSearchParams(t.location.search).get("s")||"";o.show_loader(),o.filter_by_type(n,i,a,e).done((function(n){if(n.success){const n=new URL(t.location);n.searchParams.set("paged",e),history.replaceState({},"",n)}}))},update_url_and_filter:function(e){const i=new URL(t.location),a=new URLSearchParams(t.location.search),r=n("#total_pages").val(),s=a.get("s")||"",c=a.get("location")||"",l=a.get("view")||"all",d=a.get("filter_action")||"Filter";e?i.searchParams.set("type",e):i.searchParams.delete("type"),parseInt(r)>1?i.searchParams.set("paged",a.get("paged")||"1"):i.searchParams.delete("paged"),i.searchParams.delete("action"),i.searchParams.delete("action2"),i.searchParams.set("page","wpcode"),i.searchParams.set("view",l),i.searchParams.set("filter_action",d),i.searchParams.set("s",s),i.searchParams.set("location",c),history.pushState({},"",i),o.filter_by_type(e,c,s)},show_button_spinner(e){t.WPCodeSpinner.show_button_spinner(e)},filter_by_type:function(e,t,i){let a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"1";if(!o.isAjaxInProgress)return o.isAjaxInProgress=!0,n.post(ajaxurl,{_wpnonce:wpcode.nonce,action:"wpcode_filter_snippets_by_type",snippet_type:e,location:t,s:i,paged:a}).done((function(e){n("#wpcode-loader").hide(),e.success?(n("#wpbody-content #wpcode-code-snippets-table").html(e.data.html),n("#wpbody-content .wpcode-content > table").remove()):console.error("Failed to update snippets:",e.data)})).fail((function(e,t,o){n("#wpcode-loader").hide(),console.error("AJAX request failed:",t,o)})).always((function(){o.isAjaxInProgress=!1}))},should_init:function(){return null!==e.getElementById("wpcode-code-snippets-table")},init_status_toggle:function(){n("#wpbody-content").on("change",".wpcode-status-toggle",(function(){const e=n(this),t=e.is(":checked"),i=e.data("id");o.update_status(t,i).fail((function(){e.prop("checked",!1)})).done((function(n){!1===n.success&&(e.prop("checked",!t),n.data.message&&WPCodeAdminNotices.add_notice(n.data.message,"error"))})).fail((function(e){e.responseText&&WPCodeAdminNotices.add_notice(e.responseText,"error")}))}))},update_status:function(e,t){return n.post(ajaxurl,{_wpnonce:o.l10n.nonce,action:"wpcode_update_snippet_status",snippet_id:t,active:e,multisite:o.l10n.multisite})},move_screen_options:function(){n("#screen-meta-links, #screen-meta").prependTo("#wpcode-header-between").show()},init_copy:function(){n("#wpbody-content").on("click",".wpcode-copy",(function(e){e.preventDefault();const t=n(this).data("copy-value"),o=n(this);t&&(navigator.clipboard.writeText(t),o.addClass("wpcode-show-success-icon"),setTimeout((function(){o.removeClass("wpcode-show-success-icon")}),500))}))},init_code_type_mobile:function(){n(".wpcode-mobile-dropdown-toggle").on("click",(function(){const e=n(this).data("target");n(e).toggleClass("wpcode-open"),n(e).one("click","a",(function(){n(e).removeClass("wpcode-open")}))}))}};t.WPCodeSnippetsTable=o,o.init()}(document,window,jQuery)},691:function(){jQuery((function(e){WPCodeCodeTypePicker.init()})),window.WPCodeCodeTypePicker=function(e,t,n){const o={hidePicker:function(){o.body.removeClass("wpcode-code-type-picker-visible")},findElements:function(){o.snippet_type_dropdown=n("#wpcode_snippet_type"),o.snippet_type_holder=n("#wpcode_snippet_type-holder"),o.backdrop=n("#wpcode-code-type-picker-backdrop"),o.close=n("#wpcode-close-code-type-picker"),o.body=n("body"),o.code_type_list=n("#wpcode-code-type-list")},init:function(){o.findElements();const e=new URLSearchParams(t.location.search);o.body.hasClass("wpcode-new-snippet")&&!e.has("ai_generate")&&o.showPicker(),o.snippet_type_holder.click((function(e){e.preventDefault(),e.stopPropagation(),o.showPicker()})),o.backdrop.click((function(){o.hidePicker()})),o.close.click((function(){o.hidePicker()})),o.code_type_list.on("click",".wpcode-code-type",(function(e){e.preventDefault();const t=n(this).data("code-type");o.snippet_type_dropdown.val(t).trigger("change"),n(".wpcode-code-type").removeClass("wpcode-code-type-selected"),n(this).addClass("wpcode-code-type-selected"),o.hidePicker()}))},showPicker:function(){o.code_type_list.find(".wpcode-code-type").each((function(){n(this).data("code-type")===o.snippet_type_dropdown.val()?n(this).addClass("wpcode-code-type-selected"):n(this).removeClass("wpcode-code-type-selected")})),o.body.addClass("wpcode-code-type-picker-visible")}};return o}(document,window,jQuery)},707:function(){jconfirm.defaults={closeIcon:!1,backgroundDismiss:!1,escapeKey:!0,animationBounce:1,useBootstrap:!1,theme:"modern",boxWidth:"560px",type:"blue",animateFromElement:!1,scrollToPreviousElement:!1}},786:function(){(window.WPCodeAdminGenerator||function(e,t,n){const o={doing_ajax_call:!1,ajax_snippet_update:!1,editor_id:"wpcode_generator_code_preview",init:function(){o.should_init()&&(o.find_elements(),o.init_generator_form(),o.init_code_editor(),o.init_tabs(),o.init_use_snippet(),o.init_copy_editor(),o.init_repeater(),o.do_spacer(),n(e).ready((function(){o.init_autocomplete()})))},should_init:()=>(o.generator_form=n("#wpcode_generator_form"),o.generator_form.length>0),find_elements(){o.tabs_buttons=n(".wpcode-items-tabs"),o.tabs_content=n(".wpcode-items-list .wpcode-form-tab"),o.use_snippet=n("#wpcode-generator-use-snippet"),o.update_button=n("#wpcode-generator-update-code"),o.repeater_row=n("#wpcode-generator-repeater-row").html()},init_generator_form(){o.generator_form.on("submit",(function(e){e.preventDefault(),o.update_snippet()})),o.generator_form.on("change","input, select",(function(){o.update_snippet()})),o.update_snippet()},update_snippet(){o.doing_ajax_call||(o.ajax_snippet_update&&o.ajax_snippet_update.abort(),o.show_button_spinner(o.update_button),o.ajax_snippet_update=n.post(ajaxurl,n(o.generator_form).serialize()).done((function(e){o.ajax_snippet_update=!1,WPCodeAdminCodeEditor.set_value(o.editor_id,e),o.hide_button_spinner(o.update_button)})))},init_tabs(){o.tabs_buttons.on("click","button",(function(e){e.preventDefault(),o.switch_active_tab(n(this))}))},switch_active_tab(e){o.tabs_buttons.find("button").removeClass("wpcode-active"),e.addClass("wpcode-active");const t=e.data("category");o.tabs_content.hide(),o.tabs_content.filter((function(){return n(this).data("tab")===t})).show(),o.do_spacer(),WPCodeAdminCodeEditor.refresh(o.editor_id)},init_use_snippet(){o.use_snippet.on("click",(function(e){if(e.preventDefault(),o.doing_ajax_call)return;o.doing_ajax_call=!0;const i=o.generator_form.serializeArray(),a=n(this);n.each(i,(function(e,t){"action"===t.name&&(i[e].value="wpcode_save_generated_snippet")})),o.show_button_spinner(a),n.post(ajaxurl,n.param(i)).done((function(e){o.doing_ajax_call=!1,o.hide_button_spinner(a),e.success&&e.data.url&&(t.location=e.data.url)}))}))},show_button_spinner(e){t.WPCodeSpinner.show_button_spinner(e)},hide_button_spinner(e){t.WPCodeSpinner.hide_button_spinner(e)},init_copy_editor:function(){n(".wpcode-copy-target").on("click",(function(e){e.preventDefault();const t=n(this),i=WPCodeAdminCodeEditor.get_value(o.editor_id);i&&(navigator.clipboard.writeText(i),t.addClass("wpcode-show-success-icon"),setTimeout((function(){t.removeClass("wpcode-show-success-icon")}),500))}))},init_repeater(){o.row_id=0,o.tabs_content.on("click",".wpcode-repeater-button",(function(){const e=n(this).data("target"),t=n(n('.wpcode-generator-column > [data-repeater="'+e+'"]').get().reverse());let i,a,r=0;o.row_id++,t.each((function(){const e=n(this).closest(".wpcode-generator-column");e.is(i)||(r++,i=e,a=n(o.repeater_row),r>1?a.find("button").remove():a.find("button").data("target",o.row_id),a.attr("data-id",o.row_id),e.append(a)),n(this).clone().attr("data-repeater",null).prependTo(a).find("input").val(null)}));let s=0,c=n('.wpcode-repeater-group[data-id="'+o.row_id+'"]');c.each((function(){const e=n(this).height();e>s&&(s=e)})),c.height(s),c.first().find("input").first().focus()})),o.tabs_content.on("click",".wpcode-remove-row",(function(){const e=n(this).data("target");n('.wpcode-repeater-group[data-id="'+e+'"]').remove()}))},do_spacer(){n(".wpcode-generator-field-spacer").each((function(){const e=n(this).closest(".wpcode-generator-column"),t=n(this).closest(".wpcode-generator-column").outerHeight();let o=0;e.siblings(".wpcode-generator-column").each((function(){const e=n(this).height();e>o&&(o=e)})),o>t&&n(this).height(o-t+3)}))},init_autocomplete(){n(".wpcode-generator-field-autocomplete").each((function(){const e=n(this).find('input[type="text"]'),t=n(this).find(".wpcode-field-autocomplete").text();e.autocomplete({source:JSON.parse(t)})}))},init_code_editor(){const e=n(".wpcode-generator-code");if(0===e.length)return;const t=wp.codeEditor.initialize(e);o.CodeMirror=t.codemirror,o.CodeMirror.setOption("readOnly",!1),o.CodeMirror.on("change",(function(e){clearTimeout(o.editor_change_handler),o.editor_change_handler=setTimeout((function(){jQuery(e.getTextArea()).val(e.getValue()).change(),o.update_snippet()}),300)}))}};return o}(document,window,jQuery)).init()},448:function(){(window.WPCodeHeader||function(e,t,n){const o={init(){o.should_init()&&n(e).ready((function(){o.init_sticky_header()}))},should_init:()=>n("#wpcode_snippet_code").length>0||n("#ihaf_insert_header").length>0,init_sticky_header(){const e=n(".wpcode-header-bottom"),o=e.height(),i=e.offset().top,a=e.parent();n(t).scroll((function(){const r=n(t).scrollTop();i<r+32?(e.addClass("wpcode-sticky"),a.css("paddingBottom",o+"px")):(e.removeClass("wpcode-sticky"),a.css("paddingBottom",0))}))}};return o}(document,window,jQuery)).init()},847:function(){(window.WPCodeHelp||function(e,t,n){const o={init:function(){o.should_init()&&(o.find_elements(),o.init_show(),o.init_close_button(),o.init_search(),o.init_accordion())},should_init:()=>(o.$overlay=n("#wpcode-docs-overlay"),o.$overlay.length>0),find_elements(){o.$close_button=n("#wpcode-help-close"),o.$search=n("#wpcode-help-search"),o.$no_result=n("#wpcode-help-no-result"),o.$search_results=n("#wpcode-help-result ul"),o.$categories=n("#wpcode-help-categories")},init_close_button(){o.$close_button.on("click",(function(e){e.preventDefault(),o.$overlay.fadeOut(200)}))},init_show(){n(e).on("click",".wpcode-show-help",(function(e){e.preventDefault(),o.$overlay.fadeIn(200)}))},init_accordion(){o.$categories.on("click",".wpcode-help-category header",(function(){const e=n(this).closest(".wpcode-help-category");o.toggle_category(e)})),o.$categories.on("click",".viewall",(function(e){e.preventDefault(),n(this).closest(".wpcode-help-docs").find("div").slideDown(),n(this).hide()}))},toggle_category(e){e.toggleClass("open"),e.find(".wpcode-help-docs").slideToggle()},init_search(){o.$search.on("keyup","input",o.input_search),o.$search.on("click","#wpcode-help-search-clear",o.clear_search)},input_search(){o.$search_results.html("");const e=n(this).val().toLowerCase(),t=n("#wpcode-help-categories .wpcode-help-docs li").filter((function(){return n(this).text().toLowerCase().indexOf(""+e)>-1}));e.length>2&&t.clone().appendTo(o.$search_results),0===t.length?o.$no_result.show():o.$no_result.hide(),o.$search.toggleClass("wpcode-search-empty",!e)},clear_search(){o.$search.find("input").val("").trigger("keyup")}};return o}(document,window,jQuery)).init()},279:function(){const e=window.WPCodeSVG||function(e,t,n){const o={l18n:wpcode,init(){t.WPCodeSVG=o},sanitizeSvg(e,t){const n=(new DOMParser).parseFromString(e,"image/svg+xml");return n.querySelector("parsererror")?(console.error("Error parsing SVG:",n.querySelector("parsererror").textContent),""):(n.querySelectorAll("*").forEach((e=>{const n=e.tagName.toLowerCase();if(t[n])for(let o of[...e.attributes])t[n][o.name.toLowerCase()]||e.removeAttribute(o.name);else e.parentNode.removeChild(e)})),"svg"===n.documentElement.nodeName?n.documentElement.outerHTML:"")},WPCodeIcon(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:20,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"",r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"";const s=o.wpcodeIcons();if(!s.hasOwnProperty(e))return"";i||(i=`0 0 ${t} ${n}`);const c=`<svg class = "wpcode-icon wpcode-icon-${e} ${r}" width = "${t}" height = "${n}" viewBox = "${i}" fill = "none" xmlns = "http://www.w3.org/2000/svg" id = "${a}" > ${s[e]} </svg> `;return this.sanitizeSvg(c,{svg:{class:!0,"aria-hidden":!0,"aria-labelledby":!0,role:!0,xmlns:!0,width:!0,height:!0,viewbox:!0,id:!0},g:{fill:!0,"clip-path":!0},title:{title:!0},path:{d:!0,fill:!0,"fill-rule":!0,"clip-rule":!0,"data-name":!0},circle:{cx:!0,cy:!0,r:!0,stroke:!0,"stroke-width":!0,fill:!0},rect:{x:!0,y:!0,width:!0,height:!0,fill:!0},polyline:{points:!0,fill:!0,stroke:!0,"stroke-width":!0,"stroke-linecap":!0,"stroke-miterlimit":!0},clipPath:{id:!0},defs:{}})},wpcodeIcons:()=>({logo:'<path fill-rule="evenodd" clip-rule="evenodd" d="M57.5706 64H6.56732C2.89985 64 0 61.1064 0 57.4468V6.55319C0 2.89362 2.89985 0 6.56732 0H57.5706C61.2381 0 64.1379 2.89362 64.1379 6.55319V57.4468C64.1379 61.1064 61.2381 64 57.5706 64ZM15.863 52.0855C15.5219 52.0855 15.0954 52.0004 14.7543 51.9153C13.2191 51.3196 12.4515 49.6175 13.0485 48.0855L26.439 13.7877C27.036 12.2558 28.7418 11.4898 30.277 12.0855C31.8122 12.6813 32.5798 14.3834 31.9828 15.9153L18.6776 50.2132C18.2512 51.4047 17.0571 52.0855 15.863 52.0855ZM35.0534 47.7445C35.6504 48.3403 36.418 48.5956 37.1856 48.5956C37.9532 48.5956 38.7208 48.3403 39.3179 47.7445L49.8085 37.3616C51.6849 35.4892 51.6849 32.3403 49.8085 30.468L39.3179 19.9999C38.2091 18.8084 36.3327 18.8084 35.1386 19.9999C33.9446 21.1063 33.9446 22.9786 35.1386 24.1701L44.7764 33.8722L35.0534 43.5743C33.8593 44.6807 33.8593 46.5531 35.0534 47.7445Z" fill="white"/>',checkmark:'<circle class="path circle" fill="none" stroke="#73AF55" stroke-width="6" stroke-miterlimit="10" cx="65.1" cy="65.1" r="62.1"/><polyline class="path check" fill="none" stroke="#73AF55" stroke-width="6" stroke-linecap="round" stroke-miterlimit="10" points="100.2,40.2 51.5,88.8 29.8,67.5 "/>',lock:'<path d="M19 9.33333H17.6666V6.66667C17.6666 2.98667 14.68 0 11 0C7.31998 0 4.33331 2.98667 4.33331 6.66667V9.33333H2.99998C1.53331 9.33333 0.333313 10.5333 0.333313 12V25.3333C0.333313 26.8 1.53331 28 2.99998 28H19C20.4666 28 21.6666 26.8 21.6666 25.3333V12C21.6666 10.5333 20.4666 9.33333 19 9.33333ZM6.99998 6.66667C6.99998 4.45333 8.78665 2.66667 11 2.66667C13.2133 2.66667 15 4.45333 15 6.66667V9.33333H6.99998V6.66667ZM19 25.3333H2.99998V12H19V25.3333ZM11 21.3333C12.4666 21.3333 13.6666 20.1333 13.6666 18.6667C13.6666 17.2 12.4666 16 11 16C9.53331 16 8.33331 17.2 8.33331 18.6667C8.33331 20.1333 9.53331 21.3333 11 21.3333Z" fill="#8A8A8A"/>'})};return o}(document,window,jQuery);e.init()},298:function(){(window.WPCodeInputs||function(e,t,n){const o={init(){n(o.ready)},ready(){o.initFileUploads(),o.initCheckboxMultiselectColumns()},initFileUploads(){n(".wpcode-file-upload").each((function(){const e=n(this).find("input[type=file]"),t=n(this).find("label"),o=t.html();e.on("change",(function(e){let n="";this.files&&this.files.length>1?n=(this.getAttribute("data-multiple-caption")||"").replace("{count}",this.files.length):e.target.value&&(n=e.target.value.split("\\").pop()),n?t.find(".wpcode-file-field").html(n):t.html(o)})),e.on("focus",(function(){e.addClass("has-focus")})).on("blur",(function(){e.removeClass("has-focus")}))}))},initCheckboxMultiselectColumns(){n(e).on("change",".wpcode-checkbox-multiselect-columns input",(function(){var e=n(this),t=e.parent(),o=e.closest(".wpcode-checkbox-multiselect-columns"),i=t.text(),a="check-item-"+e.val(),r=o.find("#"+a);e.prop("checked")?(e.parent().addClass("checked"),r.length||o.find(".second-column ul").append('<li id="'+a+'">'+i+"</li>")):(e.parent().removeClass("checked"),o.find("#"+a).remove())})),n(e).on("click",".wpcode-checkbox-multiselect-columns .all",(function(e){e.preventDefault(),n(this).closest(".wpcode-checkbox-multiselect-columns").find("input[type=checkbox]").prop("checked",!0).trigger("change")}))}};return o}(document,window,jQuery)).init()},900:function(){window.WPCodeItemsList||function(e,t,n){const o=function(e){this.container=n(e),this.category="*",this.search_term="",this.categories_list=this.container.find(".wpcode-items-filters"),this.search_input=this.container.find(".wpcode-items-search-input"),this.items=this.container.find(".wpcode-list-item"),this.banner=null,this.init()};o.prototype={init:function(){this.should_init()&&(this.init_category_switch(),this.init_search(),this.show_connect_banner(),this.init_custom_event_handlers())},init_custom_event_handlers(){this.container.on("wpcode_reset_items",(()=>{this.reset_items()})),this.container.on("wpcode_select_item",((e,t)=>{this.set_item(t)}))},set_item(e){this.reset_items();const t=this.items.filter((function(){return n(this).data("id")===e}));this.items.removeClass("wpcode-list-item-selected"),t.addClass("wpcode-list-item-selected");const o=t.data("categories"),i=o.length>0?o[0]:"*";this.switch_to_category(i);const a=this.categories_list.find(`button[data-category="${i}"]`);this.switch_category_button(a);const r=t.find('input[type="radio"]');r.length>0&&r.prop("checked",!0)},reset_items(){this.search_input.val(""),this.search_term="";const e=this.categories_list.find("button").first();this.switch_to_category(e.data("category")),this.switch_category_button(e)},should_init:function(){return this.categories_list.length>0},init_category_switch:function(){const e=this;this.categories_list.on("click","button",(function(){const t=n(this);t.hasClass("wpcode-active")||(e.switch_to_category(t.data("category")),e.switch_category_button(t))}))},switch_category_button:function(e){this.categories_list.find("button").removeClass("wpcode-active"),e.addClass("wpcode-active")},switch_to_category:function(e){this.category=e,this.filter_items()},filter_items:function(){let e;const t=this,o=this.items.filter((function(){return"*"===t.category||n(this).data("categories").indexOf(t.category)>-1}));if(t.search_term.length>2){const o=t.search_term.toLowerCase();e=this.items.filter((function(){return n(this).text().toLowerCase().indexOf(o)>-1}))}else e=o;t.items.hide(),e.show(),this.update_banner_position()},init_search:function(){const e=this;this.search_input.on("keyup change search",(function(){const t=n(this).val();e.search_term=t.length<3?"":t,e.filter_items()}))},show_connect_banner:function(){const e=n("#tmpl-wpcode-library-connect-banner");if(!e.length)return;const t=this.container.find(".wpcode-items-list-category .wpcode-list-item:visible");t.length>5?t.eq(5).after(e.html()):t.last().after(e.html()),this.banner=this.container.find("#wpcode-library-connect-banner")},update_banner_position:function(){const e=this.container.find(".wpcode-items-list-category .wpcode-list-item:visible");this.banner&&this.banner.length>0&&(e.length>5?this.banner.insertAfter(e.eq(5)):this.banner.insertAfter(e.last()))}},n(e).ready((function(){n(".wpcode-items-metabox").each((function(){new o(this)}))}))}(document,window,jQuery)},118:function(){(window.WPCodeLibraryAuth||function(e,t,n){const o={i18n:t.wpcode,init:function(){o.load_elements(),o.add_event_listeners(),t.WPCodeLibraryAuth=o},load_elements(){o.auth_delete_button=n(".wpcode-delete-auth")},add_event_listeners(){n(e).on("click",".wpcode-start-auth",(function(e){e.preventDefault(),o.start_auth(n(this))})),o.auth_delete_button.on("click",(function(e){e.preventDefault(),o.delete_auth()})),t.addEventListener("message",(e=>{e.isTrusted&&o.store_auth(e.data,e.origin)}),!1)},start_auth(e){let i=t.open(o.i18n.connect_url,"_blank","location=no,width=500,height=730,scrollbars=0");null===i?n.confirm({title:"Your browser blocked the authorization window from opening. Please check your popup settings.",type:"blue",theme:"modern no-content",buttons:{ok:{text:"Ok",btnClass:"wpcode-btn-confirm",action:function(){}}}}):i.focus()},delete_auth(){const e=o.show_please_wait();n.post(ajaxurl,{action:"wpcode_library_delete_auth",_ajax_nonce:o.i18n.nonce,multisite:o.i18n.multisite},(function(o){e.close(),o.success?t.location.reload():n.confirm({title:"Error!",content:"There was an issue processing your request.",buttons:{ok:function(){}}})}))},store_auth(e,i){if(void 0===e.key||void 0===e.username)return;const a=void 0!==e.deploy_snippet_id?e.deploy_snippet_id:0,r=o.show_please_wait();n.post(ajaxurl,{action:"wpcode_library_store_auth",key:e.key,username:e.username,webhook_secret:e.webhook_secret,client_id:e.client_id,deploy_snippet_id:a,origin:i,_ajax_nonce:o.i18n.nonce,multisite:o.i18n.multisite},(function(e){if(r.close(),e.success){let o='<div class="lds-dual-ring"></div>';n.confirm({title:e.data.title,content:e.data.text+o,closeIcon:!1,theme:"modern loader-spinner-completed",buttons:!1,boxWidth:"600px",onOpen:function(){const e=this;setTimeout((function(){e.close(),t.location.reload()}),2e3)}})}}))},show_please_wait:()=>n.confirm({title:o.i18n.please_wait,closeIcon:!1,content:'<div class="lds-dual-ring"></div>',boxWidth:"600px",theme:"modern loader-spinner",buttons:{close:{isHidden:!0}},onOpenBefore:function(){this.buttons.close.hide(),this.$content.parent().addClass("jconfirm-loading")},onClose:function(){this.$content.parent().removeClass("jconfirm-loading")}})};return o}(document,window,jQuery)).init()},508:function(){(window.WPCodeLibraryTabs||function(e,t,n){const o={init:function(){o.find_elements(),o.should_init()&&o.add_events()},find_elements:function(){o.tabs=n(".wpcode-library-tab"),o.buttons=n(".wpcode-library-tab-button")},should_init:function(){return o.tabs.length>0},add_events:function(){o.buttons.on("click",(function(e){e.preventDefault(),o.switch_tab(n(this))}))},switch_tab:function(e){const t=e.data("tab");o.buttons.removeClass("wpcode-library-tab-button-active"),e.addClass("wpcode-library-tab-button-active"),o.tabs.removeClass("wpcode-library-tab-active"),o.tabs.filter('[data-tab="'+t+'"]').addClass("wpcode-library-tab-active")}};return o}(document,window,jQuery)).init()},423:function(){const e=window.WPCodeAdminLibrary||function(e,t,n){const o={l10n:wpcode,init:function(){o.should_init()&&(o.find_elements(),o.init_preview(),o.init_ai_button())},should_init:()=>n(".wpcode-library-preview-button").length>0,find_elements(){o.library_list=n(".wpcode-items-list"),o.code_preview_use=n("#wpcode-preview-use-code"),o.code_preview_edit=n("#wpcode-preview-edit-snippet"),o.code_preview_updated=n("#wpcode-preview-updated"),o.code_preview_title=n("#wpcode-preview-title")},init_preview(){o.library_list.on("click",".wpcode-library-preview-button",(function(e){e.preventDefault();const t=n(this).parent().find(".wpcode-item-use-button"),i=n(this).closest(".wpcode-list-item").data("id"),a=n(this).closest(".wpcode-items-list").data("type");o.show_code_preview(i,t.attr("href"),a),o.code_preview_use.text(t.text())})),n(".wpcode-close-modal, .wpcode-modal-overlay").on("click",(function(){n("body").removeClass("wpcode-show-modal")}))},show_code_preview(e,t){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"library";const a=("library"===i?o.l10n.library.snippets:o.l10n.library.mysnippets).find((t=>t.library_id===e));WPCodeAdminCodeEditor.switch_code_mode("wpcode-code-preview",a.code_type),WPCodeAdminCodeEditor.set_value("wpcode-code-preview",a.code),o.code_preview_use.attr("href",t),o.code_preview_title.text(a.title),"mylibrary"===i?(n(".wpcode-my-library-buttons").show(),o.code_preview_edit.attr("href",o.l10n.cloud_edit_url+e)):n(".wpcode-my-library-buttons").hide(),o.code_preview_updated&&o.code_preview_updated.text(a.updated_text),n("body").addClass("wpcode-show-modal"),WPCodeAdminCodeEditor.refresh("wpcode-code-preview")},init_ai_button(){n(".wpcode-library-item-ai-not-available").on("click",(function(e){e.preventDefault(),e.stopPropagation(),WPCodeAdminNotices.show_pro_notice(o.l10n.ai_title,o.l10n.ai_text,o.l10n.ai_url,o.l10n.ai_button)}))}};return o}(document,window,jQuery);e.init()},5:function(){const e=window.WPCodeAdminNotices||function(e,t,n){const o={l10n:wpcode,init:function(){t.WPCodeAdminNotices=o,o.notice_holder=n(e.getElementById("wpcode-notice-area")),o.document=n(e)},add_notice(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"updated";const n=o.get_notice(e,t);o.notice_holder.append(n),o.document.trigger("wp-updates-notice-added"),n.find("button").focus()},get_notice(e,t){const o=n("<div />"),i=n("<p />");return i.html(e),o.addClass("fade notice is-dismissible"),o.addClass(t),o.append(i),o},show_pro_notice(e,i,a,r){const s=a.startsWith("wpcode-"),c=WPCodeSVG.WPCodeIcon("lock",22,28,"0 0 22 28","iconId");n.confirm({title:c+e,content:i,boxWidth:"560px",theme:"modern upsell-box",onOpenBefore(){this.$btnc.after('<div class="wpcode_check"></div>'),o.l10n.purchased&&this.$btnc.after('<div class="wpcode-already-purchased"><a href=" '+o.l10n.upgrade_link+' ">'+o.l10n.purchased+"</a></div>"),o.l10n.wpcode_lite_users&&(this.$btnc.after('<div class="wpcode-discount-note"><strong> '+o.l10n.bonus+":</strong> "+o.l10n.wpcode_lite_users+"<span> "+o.l10n.price+" </span> "+o.l10n.regular_price+" </div>"),this.$body.find(".jconfirm-content").addClass("wpcode-lite-upgrade"))},buttons:{confirm:{text:r||o.l10n.upgrade_button,btnClass:"wpcode-btn-orange",action:function(){s?s&&WPCodeAddons&&n.confirm({title:o.l10n.please_wait,content:function(){this.showLoading(),WPCodeAddons.install_addon(n("<button></button>").data("addon",a))}}):t.open(a,"_blank","noopener noreferrer")}}},closeIcon:!0,backgroundDismiss:!0,useBootstrap:!1})}};return o}(document,window,jQuery);e.init()},770:function(){(window.WPCodeAdminNotifications||function(e,t,n){const o={init(){o.should_init()&&(o.find_elements(),o.init_open(),o.init_close(),o.init_dismiss(),o.init_view_switch(),o.update_count(o.active_count))},should_init:()=>(o.$drawer=n("#wpcode-notifications-drawer"),o.$drawer.length>0),find_elements(){o.$open_button=n("#wpcode-notifications-button"),o.$count=o.$drawer.find("#wpcode-notifications-count"),o.$dismissed_count=o.$drawer.find("#wpcode-notifications-dismissed-count"),o.active_count=o.$open_button.data("count")?o.$open_button.data("count"):0,o.dismissed_count=o.$open_button.data("dismissed"),o.$body=n("body"),o.$dismissed_button=n("#wpcode-notifications-show-dismissed"),o.$active_button=n("#wpcode-notifications-show-active"),o.$active_list=n(".wpcode-notifications-list .wpcode-notifications-active"),o.$dismissed_list=n(".wpcode-notifications-list .wpcode-notifications-dismissed"),o.$dismiss_all=n("#wpcode-dismiss-all")},update_count(e){o.$open_button.data("count",e).attr("data-count",e),0===e&&o.$open_button.removeAttr("data-count"),o.$count.text(e),o.dismissed_count+=Math.abs(e-o.active_count),o.active_count=e,o.$dismissed_count.text(o.dismissed_count),0===o.active_count&&o.$dismiss_all.hide()},init_open(){o.$open_button.on("click",(function(e){e.preventDefault(),o.$body.addClass("wpcode-notifications-open")}))},init_close(){o.$body.on("click",".wpcode-notifications-close, .wpcode-notifications-overlay",(function(e){e.preventDefault(),o.$body.removeClass("wpcode-notifications-open")}))},init_dismiss(){o.$drawer.on("click",".wpcode-notification-dismiss",(function(e){e.preventDefault();const t=n(this).data("id");if(o.dismiss_notification(t),"all"===t)return o.move_to_dismissed(o.$active_list.find("li")),void o.update_count(0);o.move_to_dismissed(n(this).closest("li")),o.update_count(o.active_count-1)}))},move_to_dismissed(e){e.slideUp((function(){n(this).prependTo(o.$dismissed_list).show()}))},dismiss_notification:e=>n.post(ajaxurl,{action:"wpcode_notification_dismiss",nonce:wpcode.nonce,id:e}),init_view_switch(){o.$dismissed_button.on("click",(function(e){e.preventDefault(),o.$drawer.addClass("show-dismissed")})),o.$active_button.on("click",(function(e){e.preventDefault(),o.$drawer.removeClass("show-dismissed")}))}};return o}(document,window,jQuery)).init()},52:function(){window.WPCodePlugins=window.WPCodePlugins||function(e,t,n){const o={l18n:t.wpcode,init:function(){o.should_init()&&o.init_install()},should_init:()=>(o.$install_buttons=n(".wpcode-button-install-plugin"),o.$install_buttons.length>0),init_install(){o.$install_buttons.on("click",(function(e){e.preventDefault();const t=n(this);o.install_plugin(t)}))},install_plugin(e){const i=e.data("slug");i&&(o.show_button_spinner(e),n.post(ajaxurl,{action:"wpcode_install_plugin",slug:i,_wpnonce:wpcode.nonce,multisite:o.l18n.multisite},(function(i){if(i.success)t.location.reload();else if(o.hide_button_spinner(e),i.data.message){const e="<div class='excl-mark'>!</div>";n.confirm({title:!1,content:e+i.data.message,type:"blue",buttons:{ok:{text:o.l18n.ok,btnClass:"wpcode-btn-confirm",action:function(){}}}})}})))},show_button_spinner(e){t.WPCodeSpinner.show_button_spinner(e)},hide_button_spinner(e){t.WPCodeSpinner.hide_button_spinner(e)}};return o}(document,window,jQuery),WPCodePlugins.init()},670:function(){(window.WPCodeAdminSettings||function(e,t,n){const o={init:function(){o.should_init()&&(o.init_auto_height_toggle(),o.init_select2())},should_init:()=>n("body").hasClass("wpcode-settings"),init_auto_height_toggle(){const e=n("#editor_height_auto"),t=n("#wpcode-editor-height");e.on("change",(function(){n(this).is(":checked")?t.prop("disabled",!0):t.prop("disabled",!1)}))},init_select2(){n(".wpcode-select2").selectWoo()}};return o}(document,window,jQuery)).init()},345:function(){const e=window.WPCodeShortcodeLocations||function(e,t,n){const o={init:function(){if(!wpcode||!wpcode.nonce)return;const t=e.getElementById("wpcode-find-locations");t&&o.bindEvents(t)},bindEvents(e){e.addEventListener("click",o.handleButtonClick)},handleButtonClick(){const t=e.getElementById("wpcode-locations-list");t.innerHTML="";let o=1,i=!0;const a=()=>{i&&n.ajax({url:ajaxurl,type:"POST",data:{action:"wpcode_get_shortcode_locations",_wpnonce:wpcode.nonce,snippet_id:wpcode.snippet_id,page:o},success:function(e){var n;e.success&&e.data?(t.innerHTML+=e.data.html,i=e.data.has_more,o++,i&&a()):(t.innerHTML='<div class="wpcode-notice wpcode-notice-error">'+((null===(n=e.data)||void 0===n?void 0:n.message)||wpcode.text.error)+"</div>",i=!1)},error:function(){t.innerHTML='<div class="wpcode-notice wpcode-notice-error">'+wpcode.text.error+"</div>",i=!1}})};a()}};return o}(document,window,jQuery);document.addEventListener("DOMContentLoaded",e.init)},928:function(){jQuery((function(e){const t=e(".wpcode-smart-tags");let n;function o(){n.removeClass("wpcode-smart-tags-open"),e(document).off("click.wpcode")}t.on("click",".wpcode-smart-tags-toggle",(function(t){t.preventDefault();const i=e(this).closest(".wpcode-smart-tags");i.toggleClass("wpcode-smart-tags-open"),n=i,e(document).on("click.wpcode",(function(t){e(t.target).closest(".wpcode-smart-tags").length||o()}))})),t.on("wpcode_close_smart_tags_dropdown",o),"undefined"!=typeof WPCodeSnippetManager&&t.on("click",".wpcode-insert-smart-tag",(function(t){const n=e(this).closest(".wpcode-smart-tags-dropdown"),o=n.data("upgrade-title");if(o)return t.preventDefault(),t.stopImmediatePropagation(),WPCodeSnippetManager.show_pro_notice(o,n.data("upgrade-text"),n.data("upgrade-link"),n.data("upgrade-button")),!1}))}))},124:function(){const e=window.WPCodeSpinner||function(e,t,n){const o={init(){t.WPCodeSpinner=o,o.spinner=n("#wpcode-admin-spinner")},show_button_spinner(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"right";e.prop("disabled",!0);const i=e.offset(),a=n("#adminmenuwrap").width(),r=n("#wpadminbar").height();let s={};o.spinner.show(),s="right"===t?{left:i.left-a+e.outerWidth(),top:i.top-r+e.outerHeight()/2-o.spinner.height()/2}:{left:i.left-a-o.spinner.outerWidth()-20,top:i.top-r+e.outerHeight()/2-o.spinner.height()/2},o.spinner.css(s)},hide_button_spinner(e){e.prop("disabled",!1),o.spinner.hide()}};return o}(document,window,jQuery);e.init()},978:function(){(window.WPCodeTestingMode||function(e,t,n){const o={l18n:t.wpcode,init:function(){o.should_init()&&o.init_events()},should_init:()=>(o.$toggle=n(".wpcode-lite-version #wpcode-toggle-testing-mode"),o.$toggle.length>0),init_events(){o.$toggle.on("change",o.toggle)},toggle(){const e=WPCodeSVG.WPCodeIcon("lock",22,28,"0 0 22 28","iconId");n.confirm({title:e+o.l18n.testing_mode.title,content:o.l18n.testing_mode.text,closeIcon:!0,boxWidth:"560px",backgroundDismiss:!0,theme:"modern upsell-box-alert width560px",buttons:{confirm:{text:o.l18n.testing_mode.button_text,btnClass:"wpcode-btn-orange wpcode-button-large",action:function(){o.$toggle.prop("checked",!1),t.open(o.l18n.testing_mode.link,"_blank","noopener noreferrer")}}},onContentReady:function(){this.$content.parent().parent().append('<div class="footer-link"><a href="'+o.l18n.testing_mode.learn_more_link+'" target="_blank" rel="noopener noreferrer">'+o.l18n.testing_mode.learn_more_text+"</a></div>")},onClose:function(){o.$toggle.prop("checked",!1)}})}};return o}(document,window,jQuery)).init()},801:function(){(window.WPCodeAdminTools||function(e,t,n){const o={i18n:t.wpcode,init:function(){o.should_init()&&(o.find_elements(),o.init_importer(),o.init_ssl_verify(),o.init_confirm_delete_log())},should_init:()=>n("body").hasClass("wpcode-tools"),find_elements(){o.importer_button=n("#wpcode-importer-snippets-submit"),o.$import_progress=n("#wpcode-importer-process"),o.provider=n("#wpcode-importer-provider").val(),o.status_update=n("#wpcode-importer-status-update").html()},init_importer(){o.importer_button.on("click",(function(e){e.preventDefault();const t=n("#wpcode-importer-snippets input:checked");if(t.length){const e=[];t.each((function(){e.push(n(this).val())})),o.import_snippets(e)}}))},import_snippets(e){o.$import_progress.find(".snippet-total").text(e.length),o.$import_progress.find(".snippet-current").text("1"),n("#wpcode-importer-snippets").hide(),o.$import_progress.show(),o.import_queue=e,o.imported=0,o.import_snippet()},import_snippet(){const e=o.import_queue[0];n.post(ajaxurl,{action:"wpcode_import_snippet_"+o.provider,snippet_id:e,_wpnonce:wpcode.nonce}).done((function(e){if(e.success){o.import_queue.shift(),o.imported++;const t=n(o.status_update);t.find(".name span").text(e.data.name),t.find(".actions a").attr("href",e.data.edit),o.$import_progress.find(".status").prepend(t),o.$import_progress.find(".status").show(),0===o.import_queue.length?(o.$import_progress.find(".process-count").hide(),o.$import_progress.find(".snippets-completed").text(o.imported),o.$import_progress.find(".process-completed").show()):(o.$import_progress.find(".snippet-current").text(o.imported+1),o.import_snippet())}}))},init_ssl_verify(){n(e).on("click","#wpcode-ssl-verify",(function(e){e.preventDefault(),o.verify_ssl()}))},verify_ssl(){const e=n("#wpcode-ssl-verify"),t=e.text(),o=e.outerWidth(),i=e.parent(),a={action:"wpcode_verify_ssl",nonce:wpcode.nonce};e.css("width",o).prop("disabled",!0).text(wpcode.testing),n.post(ajaxurl,a,(function(n){console.log(n),i.find(".wpcode-alert, .wpcode-ssl-error").remove(),n.success&&e.before('<div class="wpcode-alert wpcode-alert-success">'+n.data.msg+"</div>"),!n.success&&n.data.msg&&e.before('<div class="wpcode-alert wpcode-alert-danger">'+n.data.msg+"</div>"),!n.success&&n.data.debug&&e.before('<div class="wpcode-ssl-error pre-error">'+n.data.debug+"</div>"),e.css("width",o).prop("disabled",!1).text(t)}))},init_confirm_delete_log(){n(".wpcode-delete-log").on("click",(function(e){return e.stopPropagation(),t.confirm(o.i18n.confirm_delete_log)}))}};return o}(document,window,jQuery)).init()},868:function(){(window.WPCodeAdminWelcome||function(e,t,n){const o={init:function(){o.add_listener()},add_listener(){n("#wpbody-content").on("click",".wpcode-scroll-to",(function(e){e.preventDefault();const t=n(this).attr("href"),o=n(t);n("html, body").animate({scrollTop:o.offset().top},700)}))}};return o}(document,window,jQuery)).init()},895:function(){"use strict";"function"!=typeof Object.assign&&(Object.assign=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];if(!e)throw TypeError("Cannot convert undefined or null to object");for(var o=function(t){t&&Object.keys(t).forEach((function(n){return e[n]=t[n]}))},i=0,a=t;i<a.length;i++){var r=a[i];o(r)}return e})},357:function(e,t,n){var o,i,a;i=[n(567)],void 0===(a="function"==typeof(o=function(e){var t=window;e.fn.confirm=function(n,o){return void 0===n&&(n={}),"string"==typeof n&&(n={content:n,title:o||!1}),e(this).each((function(){var o=e(this);o.attr("jc-attached")?console.warn("jConfirm has already been attached to this element ",o[0]):(o.on("click",(function(i){i.preventDefault();var a=e.extend({},n);if(o.attr("data-title")&&(a.title=o.attr("data-title")),o.attr("data-content")&&(a.content=o.attr("data-content")),void 0===a.buttons&&(a.buttons={}),a.$target=o,o.attr("href")&&0===Object.keys(a.buttons).length){var r=e.extend(!0,{},t.jconfirm.pluginDefaults.defaultButtons,(t.jconfirm.defaults||{}).defaultButtons||{}),s=Object.keys(r)[0];a.buttons=r,a.buttons[s].action=function(){location.href=o.attr("href")}}a.closeIcon=!1,e.confirm(a)})),o.attr("jc-attached",!0))})),e(this)},e.confirm=function(n,o){void 0===n&&(n={}),"string"==typeof n&&(n={content:n,title:o||!1});var i=!(!1===n.buttons);if("object"!=typeof n.buttons&&(n.buttons={}),0===Object.keys(n.buttons).length&&i){var a=e.extend(!0,{},t.jconfirm.pluginDefaults.defaultButtons,(t.jconfirm.defaults||{}).defaultButtons||{});n.buttons=a}return t.jconfirm(n)},e.alert=function(n,o){void 0===n&&(n={}),"string"==typeof n&&(n={content:n,title:o||!1});var i=!(!1===n.buttons);if("object"!=typeof n.buttons&&(n.buttons={}),0===Object.keys(n.buttons).length&&i){var a=e.extend(!0,{},t.jconfirm.pluginDefaults.defaultButtons,(t.jconfirm.defaults||{}).defaultButtons||{}),r=Object.keys(a)[0];n.buttons[r]=a[r]}return t.jconfirm(n)},e.dialog=function(e,n){return void 0===e&&(e={}),"string"==typeof e&&(e={content:e,title:n||!1,closeIcon:function(){}}),e.buttons={},void 0===e.closeIcon&&(e.closeIcon=function(){}),e.confirmKeys=[13],t.jconfirm(e)},t.jconfirm=function(n){void 0===n&&(n={});var o=e.extend(!0,{},t.jconfirm.pluginDefaults);t.jconfirm.defaults&&(o=e.extend(!0,o,t.jconfirm.defaults)),o=e.extend(!0,{},o,n);var i=new t.Jconfirm(o);return t.jconfirm.instances.push(i),i},t.Jconfirm=function(t){e.extend(this,t),this._init()},t.Jconfirm.prototype={_init:function(){var n=this;t.jconfirm.instances.length||(t.jconfirm.lastFocused=e("body").find(":focus")),this._id=Math.round(99999*Math.random()),this.contentParsed=e(document.createElement("div")),this.lazyOpen||setTimeout((function(){n.open()}),0)},_buildHTML:function(){var t=this;this._parseAnimation(this.animation,"o"),this._parseAnimation(this.closeAnimation,"c"),this._parseBgDismissAnimation(this.backgroundDismissAnimation),this._parseColumnClass(this.columnClass),this._parseTheme(this.theme),this._parseType(this.type);var n=e(this.template);n.find(".jconfirm-box").addClass(this.animationParsed).addClass(this.backgroundDismissAnimationParsed).addClass(this.typeParsed),this.typeAnimated&&n.find(".jconfirm-box").addClass("jconfirm-type-animated"),this.useBootstrap?(n.find(".jc-bs3-row").addClass(this.bootstrapClasses.row),n.find(".jc-bs3-row").addClass("justify-content-md-center justify-content-sm-center justify-content-xs-center justify-content-lg-center"),n.find(".jconfirm-box-container").addClass(this.columnClassParsed),this.containerFluid?n.find(".jc-bs3-container").addClass(this.bootstrapClasses.containerFluid):n.find(".jc-bs3-container").addClass(this.bootstrapClasses.container)):n.find(".jconfirm-box").css("width",this.boxWidth),this.titleClass&&n.find(".jconfirm-title-c").addClass(this.titleClass),n.addClass(this.themeParsed);var o="jconfirm-box"+this._id;n.find(".jconfirm-box").attr("aria-labelledby",o).attr("tabindex",-1),n.find(".jconfirm-content").attr("id",o),null!==this.bgOpacity&&n.find(".jconfirm-bg").css("opacity",this.bgOpacity),this.rtl&&n.addClass("jconfirm-rtl"),this.$el=n.appendTo(this.container),this.$jconfirmBoxContainer=this.$el.find(".jconfirm-box-container"),this.$jconfirmBox=this.$body=this.$el.find(".jconfirm-box"),this.$jconfirmBg=this.$el.find(".jconfirm-bg"),this.$title=this.$el.find(".jconfirm-title"),this.$titleContainer=this.$el.find(".jconfirm-title-c"),this.$content=this.$el.find("div.jconfirm-content"),this.$contentPane=this.$el.find(".jconfirm-content-pane"),this.$icon=this.$el.find(".jconfirm-icon-c"),this.$closeIcon=this.$el.find(".jconfirm-closeIcon"),this.$holder=this.$el.find(".jconfirm-holder"),this.$btnc=this.$el.find(".jconfirm-buttons"),this.$scrollPane=this.$el.find(".jconfirm-scrollpane"),t.setStartingPoint(),this._contentReady=e.Deferred(),this._modalReady=e.Deferred(),this.$holder.css({"padding-top":this.offsetTop,"padding-bottom":this.offsetBottom}),this.setTitle(),this.setIcon(),this._setButtons(),this._parseContent(),this.initDraggable(),this.isAjax&&this.showLoading(!1),e.when(this._contentReady,this._modalReady).then((function(){t.isAjaxLoading?setTimeout((function(){t.isAjaxLoading=!1,t.setContent(),t.setTitle(),t.setIcon(),setTimeout((function(){t.hideLoading(!1),t._updateContentMaxHeight()}),100),"function"==typeof t.onContentReady&&t.onContentReady()}),50):(t._updateContentMaxHeight(),t.setTitle(),t.setIcon(),"function"==typeof t.onContentReady&&t.onContentReady()),t.autoClose&&t._startCountDown()})).then((function(){t._watchContent()})),"none"===this.animation&&(this.animationSpeed=1,this.animationBounce=1),this.$body.css(this._getCSS(this.animationSpeed,this.animationBounce)),this.$contentPane.css(this._getCSS(this.animationSpeed,1)),this.$jconfirmBg.css(this._getCSS(this.animationSpeed,1)),this.$jconfirmBoxContainer.css(this._getCSS(this.animationSpeed,1))},_typePrefix:"jconfirm-type-",typeParsed:"",_parseType:function(e){this.typeParsed=this._typePrefix+e},setType:function(e){var t=this.typeParsed;this._parseType(e),this.$jconfirmBox.removeClass(t).addClass(this.typeParsed)},themeParsed:"",_themePrefix:"jconfirm-",setTheme:function(e){var t=this.theme;this.theme=e||this.theme,this._parseTheme(this.theme),t&&this.$el.removeClass(t),this.$el.addClass(this.themeParsed),this.theme=e},_parseTheme:function(t){var n=this;t=t.split(","),e.each(t,(function(o,i){-1===i.indexOf(n._themePrefix)&&(t[o]=n._themePrefix+e.trim(i))})),this.themeParsed=t.join(" ").toLowerCase()},backgroundDismissAnimationParsed:"",_bgDismissPrefix:"jconfirm-hilight-",_parseBgDismissAnimation:function(t){var n=t.split(","),o=this;e.each(n,(function(t,i){-1===i.indexOf(o._bgDismissPrefix)&&(n[t]=o._bgDismissPrefix+e.trim(i))})),this.backgroundDismissAnimationParsed=n.join(" ").toLowerCase()},animationParsed:"",closeAnimationParsed:"",_animationPrefix:"jconfirm-animation-",setAnimation:function(e){this.animation=e||this.animation,this._parseAnimation(this.animation,"o")},_parseAnimation:function(t,n){n=n||"o";var o=t.split(","),i=this;e.each(o,(function(t,n){-1===n.indexOf(i._animationPrefix)&&(o[t]=i._animationPrefix+e.trim(n))}));var a=o.join(" ").toLowerCase();return"o"===n?this.animationParsed=a:this.closeAnimationParsed=a,a},setCloseAnimation:function(e){this.closeAnimation=e||this.closeAnimation,this._parseAnimation(this.closeAnimation,"c")},setAnimationSpeed:function(e){this.animationSpeed=e||this.animationSpeed},columnClassParsed:"",setColumnClass:function(e){this.useBootstrap?(this.columnClass=e||this.columnClass,this._parseColumnClass(this.columnClass),this.$jconfirmBoxContainer.addClass(this.columnClassParsed)):console.warn("cannot set columnClass, useBootstrap is set to false")},_updateContentMaxHeight:function(){var t=e(window).height()-(this.$jconfirmBox.outerHeight()-this.$contentPane.outerHeight())-(this.offsetTop+this.offsetBottom);this.$contentPane.css({"max-height":t+"px"})},setBoxWidth:function(e){this.useBootstrap?console.warn("cannot set boxWidth, useBootstrap is set to true"):(this.boxWidth=e,this.$jconfirmBox.css("width",e))},_parseColumnClass:function(e){var t;switch(e=e.toLowerCase()){case"xl":case"xlarge":t="col-md-12";break;case"l":case"large":t="col-md-8 col-md-offset-2";break;case"m":case"medium":t="col-md-6 col-md-offset-3";break;case"s":case"small":t="col-md-4 col-md-offset-4";break;case"xs":case"xsmall":t="col-md-2 col-md-offset-5";break;default:t=e}this.columnClassParsed=t},initDraggable:function(){var t=this,n=this.$titleContainer;this.resetDrag(),this.draggable&&(n.on("mousedown",(function(e){n.addClass("jconfirm-hand"),t.mouseX=e.clientX,t.mouseY=e.clientY,t.isDrag=!0})),e(window).on("mousemove."+this._id,(function(e){t.isDrag&&(t.movingX=e.clientX-t.mouseX+t.initialX,t.movingY=e.clientY-t.mouseY+t.initialY,t.setDrag())})),e(window).on("mouseup."+this._id,(function(){n.removeClass("jconfirm-hand"),t.isDrag&&(t.isDrag=!1,t.initialX=t.movingX,t.initialY=t.movingY)})))},resetDrag:function(){this.isDrag=!1,this.initialX=0,this.initialY=0,this.movingX=0,this.movingY=0,this.mouseX=0,this.mouseY=0,this.$jconfirmBoxContainer.css("transform","translate(0px, 0px)")},setDrag:function(){if(this.draggable){this.alignMiddle=!1;var t=this.$jconfirmBox.outerWidth(),n=this.$jconfirmBox.outerHeight(),o=e(window).width(),i=e(window).height(),a=this;if(a.movingX%1==0||a.movingY%1==0){if(a.dragWindowBorder){var r=o/2-t/2,s=i/2-n/2;s-=a.dragWindowGap,(r-=a.dragWindowGap)+a.movingX<0?a.movingX=-r:r-a.movingX<0&&(a.movingX=r),s+a.movingY<0?a.movingY=-s:s-a.movingY<0&&(a.movingY=s)}a.$jconfirmBoxContainer.css("transform","translate("+a.movingX+"px, "+a.movingY+"px)")}}},_scrollTop:function(){if("undefined"!=typeof pageYOffset)return pageYOffset;var e=document.body,t=document.documentElement;return(t=t.clientHeight?t:e).scrollTop},_watchContent:function(){var t=this;this._timer&&clearInterval(this._timer);var n=0;this._timer=setInterval((function(){if(t.smoothContent){var o=t.$content.outerHeight()||0;o!==n&&(n=o);var i=e(window).height();t.offsetTop+t.offsetBottom+t.$jconfirmBox.height()-t.$contentPane.height()+t.$content.height()<i?t.$contentPane.addClass("no-scroll"):t.$contentPane.removeClass("no-scroll")}}),this.watchInterval)},_overflowClass:"jconfirm-overflow",_hilightAnimating:!1,highlight:function(){this.hiLightModal()},hiLightModal:function(){var e=this;if(!this._hilightAnimating){e.$body.addClass("hilight");var t=parseFloat(e.$body.css("animation-duration"))||2;this._hilightAnimating=!0,setTimeout((function(){e._hilightAnimating=!1,e.$body.removeClass("hilight")}),1e3*t)}},_bindEvents:function(){var t=this;this.boxClicked=!1,this.$scrollPane.click((function(e){if(!t.boxClicked){var n,o=!1,i=!1;if("string"==typeof(n="function"==typeof t.backgroundDismiss?t.backgroundDismiss():t.backgroundDismiss)&&void 0!==t.buttons[n]?(o=n,i=!1):i=void 0===n||1==!!n,o){var a=t.buttons[o].action.apply(t);i=void 0===a||!!a}i?t.close():t.hiLightModal()}t.boxClicked=!1})),this.$jconfirmBox.click((function(e){t.boxClicked=!0}));var n=!1;e(window).on("jcKeyDown."+t._id,(function(e){n||(n=!0)})),e(window).on("keyup."+t._id,(function(e){n&&(t.reactOnKey(e),n=!1)})),e(window).on("resize."+this._id,(function(){t._updateContentMaxHeight(),setTimeout((function(){t.resetDrag()}),100)}))},_cubic_bezier:"0.36, 0.55, 0.19",_getCSS:function(e,t){return{"-webkit-transition-duration":e/1e3+"s","transition-duration":e/1e3+"s","-webkit-transition-timing-function":"cubic-bezier("+this._cubic_bezier+", "+t+")","transition-timing-function":"cubic-bezier("+this._cubic_bezier+", "+t+")"}},_setButtons:function(){var t=this,n=0;if("object"!=typeof this.buttons&&(this.buttons={}),e.each(this.buttons,(function(o,i){n+=1,"function"==typeof i&&(t.buttons[o]=i={action:i}),t.buttons[o].text=i.text||o,t.buttons[o].btnClass=i.btnClass||"btn-default",t.buttons[o].action=i.action||function(){},t.buttons[o].keys=i.keys||[],t.buttons[o].isHidden=i.isHidden||!1,t.buttons[o].isDisabled=i.isDisabled||!1,e.each(t.buttons[o].keys,(function(e,n){t.buttons[o].keys[e]=n.toLowerCase()}));var a=e('<button type="button" class="btn"></button>').html(t.buttons[o].text).addClass(t.buttons[o].btnClass).prop("disabled",t.buttons[o].isDisabled).css("display",t.buttons[o].isHidden?"none":"").click((function(e){e.preventDefault();var n=t.buttons[o].action.apply(t,[t.buttons[o]]);t.onAction.apply(t,[o,t.buttons[o]]),t._stopCountDown(),(void 0===n||n)&&t.close()}));t.buttons[o].el=a,t.buttons[o].setText=function(e){a.html(e)},t.buttons[o].addClass=function(e){a.addClass(e)},t.buttons[o].removeClass=function(e){a.removeClass(e)},t.buttons[o].disable=function(){t.buttons[o].isDisabled=!0,a.prop("disabled",!0)},t.buttons[o].enable=function(){t.buttons[o].isDisabled=!1,a.prop("disabled",!1)},t.buttons[o].show=function(){t.buttons[o].isHidden=!1,a.css("display","")},t.buttons[o].hide=function(){t.buttons[o].isHidden=!0,a.css("display","none")},t["$_"+o]=t["$$"+o]=a,t.$btnc.append(a)})),0===n&&this.$btnc.hide(),null===this.closeIcon&&0===n&&(this.closeIcon=!0),this.closeIcon){if(this.closeIconClass){var o='<i class="'+this.closeIconClass+'"></i>';this.$closeIcon.html(o)}this.$closeIcon.click((function(e){e.preventDefault();var n,o=!1,i=!1;if("string"==typeof(n="function"==typeof t.closeIcon?t.closeIcon():t.closeIcon)&&void 0!==t.buttons[n]?(o=n,i=!1):i=void 0===n||1==!!n,o){var a=t.buttons[o].action.apply(t);i=void 0===a||!!a}i&&t.close()})),this.$closeIcon.show()}else this.$closeIcon.hide()},setTitle:function(e,t){if(t=t||!1,void 0!==e)if("string"==typeof e)this.title=e;else if("function"==typeof e){"function"==typeof e.promise&&console.error("Promise was returned from title function, this is not supported.");var n=e();this.title="string"==typeof n&&n}else this.title=!1;this.isAjaxLoading&&!t||(this.$title.html(this.title||""),this.updateTitleContainer())},setIcon:function(e,t){if(t=t||!1,void 0!==e)if("string"==typeof e)this.icon=e;else if("function"==typeof e){var n=e();this.icon="string"==typeof n&&n}else this.icon=!1;this.isAjaxLoading&&!t||(this.$icon.html(this.icon?'<i class="'+this.icon+'"></i>':""),this.updateTitleContainer())},updateTitleContainer:function(){this.title||this.icon?this.$titleContainer.show():this.$titleContainer.hide()},setContentPrepend:function(e,t){e&&this.contentParsed.prepend(e)},setContentAppend:function(e){e&&this.contentParsed.append(e)},setContent:function(e,t){t=!!t;var n=this;e&&this.contentParsed.html("").append(e),this.isAjaxLoading&&!t||(this.$content.html(""),this.$content.append(this.contentParsed),setTimeout((function(){n.$body.find("input[autofocus]:visible:first").focus()}),100))},loadingSpinner:!1,showLoading:function(e){this.loadingSpinner=!0,this.$jconfirmBox.addClass("loading"),e&&this.$btnc.find("button").prop("disabled",!0)},hideLoading:function(e){this.loadingSpinner=!1,this.$jconfirmBox.removeClass("loading"),e&&this.$btnc.find("button").prop("disabled",!1)},ajaxResponse:!1,contentParsed:"",isAjax:!1,isAjaxLoading:!1,_parseContent:function(){var t=this,n="&nbsp;";if("function"==typeof this.content){var o=this.content.apply(this);"string"==typeof o?this.content=o:"object"==typeof o&&"function"==typeof o.always?(this.isAjax=!0,this.isAjaxLoading=!0,o.always((function(e,n,o){t.ajaxResponse={data:e,status:n,xhr:o},t._contentReady.resolve(e,n,o),"function"==typeof t.contentLoaded&&t.contentLoaded(e,n,o)})),this.content=n):this.content=n}if("string"==typeof this.content&&"url:"===this.content.substr(0,4).toLowerCase()){this.isAjax=!0,this.isAjaxLoading=!0;var i=this.content.substring(4,this.content.length);e.get(i).done((function(e){t.contentParsed.html(e)})).always((function(e,n,o){t.ajaxResponse={data:e,status:n,xhr:o},t._contentReady.resolve(e,n,o),"function"==typeof t.contentLoaded&&t.contentLoaded(e,n,o)}))}this.content||(this.content=n),this.isAjax||(this.contentParsed.html(this.content),this.setContent(),t._contentReady.resolve())},_stopCountDown:function(){clearInterval(this.autoCloseInterval),this.$cd&&this.$cd.remove()},_startCountDown:function(){var t=this,n=this.autoClose.split("|");if(2!==n.length)return console.error("Invalid option for autoClose. example 'close|10000'"),!1;var o=n[0],i=parseInt(n[1]);if(void 0===this.buttons[o])return console.error("Invalid button key '"+o+"' for autoClose"),!1;var a=Math.ceil(i/1e3);this.$cd=e('<span class="countdown"> ('+a+")</span>").appendTo(this["$_"+o]),this.autoCloseInterval=setInterval((function(){t.$cd.html(" ("+(a-=1)+") "),a<=0&&(t["$$"+o].trigger("click"),t._stopCountDown())}),1e3)},_getKey:function(e){switch(e){case 192:return"tilde";case 13:return"enter";case 16:return"shift";case 9:return"tab";case 20:return"capslock";case 17:return"ctrl";case 91:return"win";case 18:return"alt";case 27:return"esc";case 32:return"space"}var t=String.fromCharCode(e);return!!/^[A-z0-9]+$/.test(t)&&t.toLowerCase()},reactOnKey:function(t){var n=this,o=e(".jconfirm");if(o.eq(o.length-1)[0]!==this.$el[0])return!1;var i=t.which;if(this.$content.find(":input").is(":focus")&&/13|32/.test(i))return!1;var a,r=this._getKey(i);"esc"===r&&this.escapeKey&&(!0===this.escapeKey?this.$scrollPane.trigger("click"):"string"!=typeof this.escapeKey&&"function"!=typeof this.escapeKey||(a="function"==typeof this.escapeKey?this.escapeKey():this.escapeKey)&&(void 0===this.buttons[a]?console.warn("Invalid escapeKey, no buttons found with key "+a):this["$_"+a].trigger("click"))),e.each(this.buttons,(function(e,t){-1!==t.keys.indexOf(r)&&n["$_"+e].trigger("click")}))},setDialogCenter:function(){console.info("setDialogCenter is deprecated, dialogs are centered with CSS3 tables")},_unwatchContent:function(){clearInterval(this._timer)},close:function(n){var o=this;return"function"==typeof this.onClose&&this.onClose(n),this._unwatchContent(),e(window).unbind("resize."+this._id),e(window).unbind("keyup."+this._id),e(window).unbind("jcKeyDown."+this._id),this.draggable&&(e(window).unbind("mousemove."+this._id),e(window).unbind("mouseup."+this._id),this.$titleContainer.unbind("mousedown")),o.$el.removeClass(o.loadedClass),e("body").removeClass("jconfirm-no-scroll-"+o._id),o.$jconfirmBoxContainer.removeClass("jconfirm-no-transition"),setTimeout((function(){o.$body.addClass(o.closeAnimationParsed),o.$jconfirmBg.addClass("jconfirm-bg-h");var n="none"===o.closeAnimation?1:o.animationSpeed;setTimeout((function(){o.$el.remove(),t.jconfirm.instances;for(var n=t.jconfirm.instances.length-1;n>=0;n--)t.jconfirm.instances[n]._id===o._id&&t.jconfirm.instances.splice(n,1);if(!t.jconfirm.instances.length&&o.scrollToPreviousElement&&t.jconfirm.lastFocused&&t.jconfirm.lastFocused.length&&e.contains(document,t.jconfirm.lastFocused[0])){var i=t.jconfirm.lastFocused;if(o.scrollToPreviousElementAnimate){var a=e(window).scrollTop(),r=t.jconfirm.lastFocused.offset().top,s=e(window).height();if(r>a&&r<a+s)i.focus();else{var c=r-Math.round(s/3);e("html, body").animate({scrollTop:c},o.animationSpeed,"swing",(function(){i.focus()}))}}else i.focus();t.jconfirm.lastFocused=!1}"function"==typeof o.onDestroy&&o.onDestroy()}),.4*n)}),50),!0},open:function(){return!this.isOpen()&&(this._buildHTML(),this._bindEvents(),this._open(),!0)},setStartingPoint:function(){var n=!1;if(!0!==this.animateFromElement&&this.animateFromElement)n=this.animateFromElement,t.jconfirm.lastClicked=!1;else{if(!t.jconfirm.lastClicked||!0!==this.animateFromElement)return!1;n=t.jconfirm.lastClicked,t.jconfirm.lastClicked=!1}if(!n)return!1;var o=n.offset(),i=n.outerHeight()/2,a=n.outerWidth()/2;i-=this.$jconfirmBox.outerHeight()/2,a-=this.$jconfirmBox.outerWidth()/2;var r=o.top+i;r-=this._scrollTop();var s=o.left+a,c=e(window).height()/2,l=e(window).width()/2;if(r-=c-this.$jconfirmBox.outerHeight()/2,s-=l-this.$jconfirmBox.outerWidth()/2,Math.abs(r)>c||Math.abs(s)>l)return!1;this.$jconfirmBoxContainer.css("transform","translate("+s+"px, "+r+"px)")},_open:function(){var e=this;"function"==typeof e.onOpenBefore&&e.onOpenBefore(),this.$body.removeClass(this.animationParsed),this.$jconfirmBg.removeClass("jconfirm-bg-h"),this.$body.focus(),e.$jconfirmBoxContainer.css("transform","translate(0px, 0px)"),setTimeout((function(){e.$body.css(e._getCSS(e.animationSpeed,1)),e.$body.css({"transition-property":e.$body.css("transition-property")+", margin"}),e.$jconfirmBoxContainer.addClass("jconfirm-no-transition"),e._modalReady.resolve(),"function"==typeof e.onOpen&&e.onOpen(),e.$el.addClass(e.loadedClass)}),this.animationSpeed)},loadedClass:"jconfirm-open",isClosed:function(){return!this.$el||0===this.$el.parent().length},isOpen:function(){return!this.isClosed()},toggle:function(){this.isOpen()?this.close():this.open()}},t.jconfirm.instances=[],t.jconfirm.lastFocused=!1,t.jconfirm.pluginDefaults={template:'<div class="jconfirm"><div class="jconfirm-bg jconfirm-bg-h"></div><div class="jconfirm-scrollpane"><div class="jconfirm-row"><div class="jconfirm-cell"><div class="jconfirm-holder"><div class="jc-bs3-container"><div class="jc-bs3-row"><div class="jconfirm-box-container jconfirm-animated"><div class="jconfirm-box" role="dialog" aria-labelledby="labelled" tabindex="-1"><div class="jconfirm-closeIcon">&times;</div><div class="jconfirm-title-c"><span class="jconfirm-icon-c"></span><span class="jconfirm-title"></span></div><div class="jconfirm-content-pane"><div class="jconfirm-content"></div></div><div class="jconfirm-buttons"></div><div class="jconfirm-clear"></div></div></div></div></div></div></div></div></div></div>',title:"Hello",titleClass:"",type:"default",typeAnimated:!0,draggable:!0,dragWindowGap:15,dragWindowBorder:!0,animateFromElement:!0,alignMiddle:!0,smoothContent:!0,content:"Are you sure to continue?",buttons:{},defaultButtons:{ok:{action:function(){}},close:{action:function(){}}},contentLoaded:function(){},icon:"",lazyOpen:!1,bgOpacity:null,theme:"light",animation:"scale",closeAnimation:"scale",animationSpeed:400,animationBounce:1,escapeKey:!0,rtl:!1,container:"body",containerFluid:!1,backgroundDismiss:!1,backgroundDismissAnimation:"shake",autoClose:!1,closeIcon:null,closeIconClass:!1,watchInterval:100,columnClass:"col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1",boxWidth:"50%",scrollToPreviousElement:!0,scrollToPreviousElementAnimate:!0,useBootstrap:!0,offsetTop:40,offsetBottom:40,bootstrapClasses:{container:"container",containerFluid:"container-fluid",row:"row"},onContentReady:function(){},onOpenBefore:function(){},onOpen:function(){},onClose:function(){},onDestroy:function(){},onAction:function(){}};var n=!1;e(window).on("keydown",(function(t){if(!n){var o=!1;e(t.target).closest(".jconfirm-box").length&&(o=!0),o&&e(window).trigger("jcKeyDown"),n=!0}})),e(window).on("keyup",(function(){n=!1})),t.jconfirm.lastClicked=!1,e(document).on("mousedown","button, a, [jc-source]",(function(){t.jconfirm.lastClicked=e(this)}))})?o.apply(t,i):o)||(e.exports=a)},180:function(e,t,n){var o,i;!function(a,r){o=[n(567)],i=function(e){return function(e,t){"use strict";var n=e.document,o=t(e),i=t.Deferred,a=t("html"),r=[],s="aria-hidden",c="lity-aria-hidden",l='a[href],area[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),iframe,object,embed,[contenteditable],[tabindex]:not([tabindex^="-"])',d={esc:!0,handler:null,handlers:{image:C,inline:function(e,n){var o,i,a;try{o=t(e)}catch(e){return!1}return!!o.length&&(i=t('<i style="display:none !important"></i>'),a=o.hasClass("lity-hide"),n.element().one("lity:remove",(function(){i.before(o).remove(),a&&!o.closest(".lity-content").length&&o.addClass("lity-hide")})),o.removeClass("lity-hide").after(i))},youtube:function(e){var n=p.exec(e);return!!n&&x(b(e,y("https://www.youtube"+(n[2]||"")+".com/embed/"+n[4],t.extend({autoplay:1},w(n[5]||"")))))},vimeo:function(e){var n=h.exec(e);return!!n&&x(b(e,y("https://player.vimeo.com/video/"+n[3],t.extend({autoplay:1},w(n[4]||"")))))},googlemaps:function(e){var t=f.exec(e);return!!t&&x(b(e,y("https://www.google."+t[3]+"/maps?"+t[6],{output:t[6].indexOf("layer=c")>0?"svembed":"embed"})))},facebookvideo:function(e){var n=m.exec(e);return!!n&&(0!==e.indexOf("http")&&(e="https:"+e),x(b(e,y("https://www.facebook.com/plugins/video.php?href="+e,t.extend({autoplay:1},w(n[4]||""))))))},iframe:x},template:'<div class="lity" role="dialog" aria-label="Dialog Window (Press escape to close)" tabindex="-1"><div class="lity-wrap" data-lity-close role="document"><div class="lity-loader" aria-hidden="true">Loading...</div><div class="lity-container"><div class="lity-content"></div><button class="lity-close" type="button" aria-label="Close (Press escape to close)" data-lity-close>&times;</button></div></div></div>'},u=/(^data:image\/)|(\.(png|jpe?g|gif|svg|webp|bmp|ico|tiff?)(\?\S*)?$)/i,p=/(youtube(-nocookie)?\.com|youtu\.be)\/(watch\?v=|v\/|u\/|embed\/?)?([\w-]{11})(.*)?/i,h=/(vimeo(pro)?.com)\/(?:[^\d]+)?(\d+)\??(.*)?$/,f=/((maps|www)\.)?google\.([^\/\?]+)\/?((maps\/?)?\?)(.*)/i,m=/(facebook\.com)\/([a-z0-9_-]*)\/videos\/([0-9]*)(.*)?$/i,g=function(){var e=n.createElement("div"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var o in t)if(void 0!==e.style[o])return t[o];return!1}();function _(e){var t=i();return g&&e.length?(e.one(g,t.resolve),setTimeout(t.resolve,500)):t.resolve(),t.promise()}function v(e,n,o){if(1===arguments.length)return t.extend({},e);if("string"==typeof n){if(void 0===o)return void 0===e[n]?null:e[n];e[n]=o}else t.extend(e,n);return this}function w(e){for(var t,n=decodeURI(e.split("#")[0]).split("&"),o={},i=0,a=n.length;i<a;i++)n[i]&&(o[(t=n[i].split("="))[0]]=t[1]);return o}function y(e,n){return e+(e.indexOf("?")>-1?"&":"?")+t.param(n)}function b(e,t){var n=e.indexOf("#");return-1===n?t:(n>0&&(e=e.substr(n)),t+e)}function C(e,n){var o=n.opener()&&n.opener().data("lity-desc")||"Image with no description",a=t('<img src="'+e+'" alt="'+o+'"/>'),r=i(),s=function(){var e;r.reject((e="Failed loading image",t('<span class="lity-error"></span>').append(e)))};return a.on("load",(function(){if(0===this.naturalWidth)return s();r.resolve(a)})).on("error",s),r.promise()}function x(e){return'<div class="lity-iframe-container"><iframe frameborder="0" allowfullscreen allow="autoplay; fullscreen" src="'+e+'"/></div>'}function D(){return n.documentElement.clientHeight?n.documentElement.clientHeight:Math.round(o.height())}function k(e){var t=A();t&&(27===e.keyCode&&t.options("esc")&&t.close(),9===e.keyCode&&function(e,t){var o=t.element().find(l),i=o.index(n.activeElement);e.shiftKey&&i<=0?(o.get(o.length-1).focus(),e.preventDefault()):e.shiftKey||i!==o.length-1||(o.get(0).focus(),e.preventDefault())}(e,t))}function $(){t.each(r,(function(e,t){t.resize()}))}function A(){return 0===r.length?null:r[0]}function j(e,l,u,p){var h,f,m,g,w=this,y=!1,b=!1;l=t.extend({},d,l),f=t(l.template),w.element=function(){return f},w.opener=function(){return u},w.options=t.proxy(v,w,l),w.handlers=t.proxy(v,w,l.handlers),w.resize=function(){y&&!b&&m.css("max-height",D()+"px").trigger("lity:resize",[w])},w.close=function(){if(y&&!b){b=!0,(l=w).element().attr(s,"true"),1===r.length&&(a.removeClass("lity-active"),o.off({resize:$,keydown:k})),((r=t.grep(r,(function(e){return l!==e}))).length?r[0].element():t(".lity-hidden")).removeClass("lity-hidden").each((function(){var e=t(this),n=e.data(c);n?e.attr(s,n):e.removeAttr(s),e.removeData(c)}));var e=i();if(p&&(n.activeElement===f[0]||t.contains(f[0],n.activeElement)))try{p.focus()}catch(e){}return m.trigger("lity:close",[w]),f.removeClass("lity-opened").addClass("lity-closed"),_(m.add(f)).always((function(){m.trigger("lity:remove",[w]),f.remove(),f=void 0,e.resolve()})),e.promise()}var l},h=function(e,n,o,i){var a,r="inline",s=t.extend({},o);return i&&s[i]?(a=s[i](e,n),r=i):(t.each(["inline","iframe"],(function(e,t){delete s[t],s[t]=o[t]})),t.each(s,(function(t,o){return!o||!(!o.test||o.test(e,n))||(!1!==(a=o(e,n))?(r=t,!1):void 0)}))),{handler:r,content:a||""}}(e,w,l.handlers,l.handler),f.attr(s,"false").addClass("lity-loading lity-opened lity-"+h.handler).appendTo("body").focus().on("click","[data-lity-close]",(function(e){t(e.target).is("[data-lity-close]")&&w.close()})).trigger("lity:open",[w]),g=w,1===r.unshift(g)&&(a.addClass("lity-active"),o.on({resize:$,keydown:k})),t("body > *").not(g.element()).addClass("lity-hidden").each((function(){var e=t(this);void 0===e.data(c)&&e.data(c,e.attr(s)||null)})).attr(s,"true"),t.when(h.content).always((function(e){m=t(e).css("max-height",D()+"px"),f.find(".lity-loader").each((function(){var e=t(this);_(e).always((function(){e.remove()}))})),f.removeClass("lity-loading").find(".lity-content").empty().append(m),y=!0,m.trigger("lity:ready",[w])}))}function M(e,o,i){e.preventDefault?(e.preventDefault(),e=(i=t(this)).data("lity-target")||i.attr("href")||i.attr("src")):i=t(i);var a=new j(e,t.extend({},i.data("lity-options")||i.data("lity"),o),i,n.activeElement);if(!e.preventDefault)return a}return C.test=function(e){return u.test(e)},M.version="2.4.1",M.options=t.proxy(v,M,d),M.handlers=t.proxy(v,M,d.handlers),M.current=A,t(n).on("click.lity","[data-lity]",M),M}(a,e)}.apply(t,o),void 0===i||(e.exports=i)}("undefined"!=typeof window?window:this)},207:function(e,t,n){var o,i,a;i=[n(567)],o=function(e){var t=function(){if(e&&e.fn&&e.fn.select2&&e.fn.select2.amd)var t=e.fn.select2.amd;var n,o,i;return t&&t.requirejs||(t?o=t:t={},function(e){var t,a,r,s,c={},l={},d={},u={},p=Object.prototype.hasOwnProperty,h=[].slice,f=/\.js$/;function m(e,t){return p.call(e,t)}function g(e,t){var n,o,i,a,r,s,c,l,u,p,h,m=t&&t.split("/"),g=d.map,_=g&&g["*"]||{};if(e){for(r=(e=e.split("/")).length-1,d.nodeIdCompat&&f.test(e[r])&&(e[r]=e[r].replace(f,"")),"."===e[0].charAt(0)&&m&&(e=m.slice(0,m.length-1).concat(e)),u=0;u<e.length;u++)if("."===(h=e[u]))e.splice(u,1),u-=1;else if(".."===h){if(0===u||1===u&&".."===e[2]||".."===e[u-1])continue;u>0&&(e.splice(u-1,2),u-=2)}e=e.join("/")}if((m||_)&&g){for(u=(n=e.split("/")).length;u>0;u-=1){if(o=n.slice(0,u).join("/"),m)for(p=m.length;p>0;p-=1)if((i=g[m.slice(0,p).join("/")])&&(i=i[o])){a=i,s=u;break}if(a)break;!c&&_&&_[o]&&(c=_[o],l=u)}!a&&c&&(a=c,s=l),a&&(n.splice(0,s,a),e=n.join("/"))}return e}function _(t,n){return function(){var o=h.call(arguments,0);return"string"!=typeof o[0]&&1===o.length&&o.push(null),a.apply(e,o.concat([t,n]))}}function v(e){return function(t){c[e]=t}}function w(n){if(m(l,n)){var o=l[n];delete l[n],u[n]=!0,t.apply(e,o)}if(!m(c,n)&&!m(u,n))throw new Error("No "+n);return c[n]}function y(e){var t,n=e?e.indexOf("!"):-1;return n>-1&&(t=e.substring(0,n),e=e.substring(n+1,e.length)),[t,e]}function b(e){return e?y(e):[]}function C(e){return function(){return d&&d.config&&d.config[e]||{}}}r=function(e,t){var n,o,i=y(e),a=i[0],r=t[1];return e=i[1],a&&(n=w(a=g(a,r))),a?e=n&&n.normalize?n.normalize(e,(o=r,function(e){return g(e,o)})):g(e,r):(a=(i=y(e=g(e,r)))[0],e=i[1],a&&(n=w(a))),{f:a?a+"!"+e:e,n:e,pr:a,p:n}},s={require:function(e){return _(e)},exports:function(e){var t=c[e];return void 0!==t?t:c[e]={}},module:function(e){return{id:e,uri:"",exports:c[e],config:C(e)}}},t=function(t,n,o,i){var a,d,p,h,f,g,y,C=[],x=typeof o;if(g=b(i=i||t),"undefined"===x||"function"===x){for(n=!n.length&&o.length?["require","exports","module"]:n,f=0;f<n.length;f+=1)if("require"===(d=(h=r(n[f],g)).f))C[f]=s.require(t);else if("exports"===d)C[f]=s.exports(t),y=!0;else if("module"===d)a=C[f]=s.module(t);else if(m(c,d)||m(l,d)||m(u,d))C[f]=w(d);else{if(!h.p)throw new Error(t+" missing "+d);h.p.load(h.n,_(i,!0),v(d),{}),C[f]=c[d]}p=o?o.apply(c[t],C):void 0,t&&(a&&a.exports!==e&&a.exports!==c[t]?c[t]=a.exports:p===e&&y||(c[t]=p))}else t&&(c[t]=o)},n=o=a=function(n,o,i,c,l){if("string"==typeof n)return s[n]?s[n](o):w(r(n,b(o)).f);if(!n.splice){if((d=n).deps&&a(d.deps,d.callback),!o)return;o.splice?(n=o,o=i,i=null):n=e}return o=o||function(){},"function"==typeof i&&(i=c,c=l),c?t(e,n,o,i):setTimeout((function(){t(e,n,o,i)}),4),a},a.config=function(e){return a(e)},n._defined=c,(i=function(e,t,n){if("string"!=typeof e)throw new Error("See almond README: incorrect module build, no module name");t.splice||(n=t,t=[]),m(c,e)||m(l,e)||(l[e]=[e,t,n])}).amd={jQuery:!0}}(),t.requirejs=n,t.require=o,t.define=i),t.define("almond",(function(){})),t.define("jquery",[],(function(){var t=e||$;return null==t&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),t})),t.define("select2/utils",["jquery"],(function(e){var t={};function n(e){var t=e.prototype,n=[];for(var o in t)"function"==typeof t[o]&&"constructor"!==o&&n.push(o);return n}t.Extend=function(e,t){var n={}.hasOwnProperty;function o(){this.constructor=e}for(var i in t)n.call(t,i)&&(e[i]=t[i]);return o.prototype=t.prototype,e.prototype=new o,e.__super__=t.prototype,e},t.Decorate=function(e,t){var o=n(t),i=n(e);function a(){var n=Array.prototype.unshift,o=t.prototype.constructor.length,i=e.prototype.constructor;o>0&&(n.call(arguments,e.prototype.constructor),i=t.prototype.constructor),i.apply(this,arguments)}t.displayName=e.displayName,a.prototype=new function(){this.constructor=a};for(var r=0;r<i.length;r++){var s=i[r];a.prototype[s]=e.prototype[s]}for(var c=function(e){var n=function(){};e in a.prototype&&(n=a.prototype[e]);var o=t.prototype[e];return function(){return Array.prototype.unshift.call(arguments,n),o.apply(this,arguments)}},l=0;l<o.length;l++){var d=o[l];a.prototype[d]=c(d)}return a};var o=function(){this.listeners={}};return o.prototype.on=function(e,t){this.listeners=this.listeners||{},e in this.listeners?this.listeners[e].push(t):this.listeners[e]=[t]},o.prototype.trigger=function(e){var t=Array.prototype.slice,n=t.call(arguments,1);this.listeners=this.listeners||{},null==n&&(n=[]),0===n.length&&n.push({}),n[0]._type=e,e in this.listeners&&this.invoke(this.listeners[e],t.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},o.prototype.invoke=function(e,t){for(var n=0,o=e.length;n<o;n++)e[n].apply(this,t)},t.Observable=o,t.generateChars=function(e){for(var t="",n=0;n<e;n++)t+=Math.floor(36*Math.random()).toString(36);return t},t.bind=function(e,t){return function(){e.apply(t,arguments)}},t._convertData=function(e){for(var t in e){var n=t.split("-"),o=e;if(1!==n.length){for(var i=0;i<n.length;i++){var a=n[i];(a=a.substring(0,1).toLowerCase()+a.substring(1))in o||(o[a]={}),i==n.length-1&&(o[a]=e[t]),o=o[a]}delete e[t]}}return e},t.hasScroll=function(t,n){var o=e(n),i=n.style.overflowX,a=n.style.overflowY;return(i!==a||"hidden"!==a&&"visible"!==a)&&("scroll"===i||"scroll"===a||o.innerHeight()<n.scrollHeight||o.innerWidth()<n.scrollWidth)},t.escapeMarkup=function(e){var t={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,(function(e){return t[e]}))},t.appendMany=function(t,n){if("1.7"===e.fn.jquery.substr(0,3)){var o=e();e.map(n,(function(e){o=o.add(e)})),n=o}t.append(n)},t.isTouchscreen=function(){return void 0===t._isTouchscreenCache&&(t._isTouchscreenCache="ontouchstart"in document.documentElement),t._isTouchscreenCache},t})),t.define("select2/results",["jquery","./utils"],(function(e,t){function n(e,t,o){this.$element=e,this.data=o,this.options=t,n.__super__.constructor.call(this)}return t.Extend(n,t.Observable),n.prototype.render=function(){var t=e('<ul class="select2-results__options" role="listbox" tabindex="-1"></ul>');return this.options.get("multiple")&&t.attr("aria-multiselectable","true"),this.$results=t,t},n.prototype.clear=function(){this.$results.empty()},n.prototype.displayMessage=function(t){var n=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var o=e('<li role="alert" aria-live="assertive" class="select2-results__option"></li>'),i=this.options.get("translations").get(t.message);o.append(n(i(t.args))),o[0].className+=" select2-results__message",this.$results.append(o)},n.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},n.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n<e.results.length;n++){var o=e.results[n],i=this.option(o);t.push(i)}this.$results.append(t)}else 0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"})},n.prototype.position=function(e,t){t.find(".select2-results").append(e)},n.prototype.sort=function(e){return this.options.get("sorter")(e)},n.prototype.highlightFirstItem=function(){var e=this.$results.find(".select2-results__option[data-selected]"),t=e.filter("[data-selected=true]");t.length>0?t.first().trigger("mouseenter"):e.first().trigger("mouseenter"),this.ensureHighlightVisible()},n.prototype.setClasses=function(){var t=this;this.data.current((function(n){var o=e.map(n,(function(e){return e.id.toString()}));t.$results.find(".select2-results__option[data-selected]").each((function(){var t=e(this),n=e.data(this,"data"),i=""+n.id;null!=n.element&&n.element.selected||null==n.element&&e.inArray(i,o)>-1?t.attr("data-selected","true"):t.attr("data-selected","false")}))}))},n.prototype.showLoading=function(e){this.hideLoading();var t={disabled:!0,loading:!0,text:this.options.get("translations").get("searching")(e)},n=this.option(t);n.className+=" loading-results",this.$results.prepend(n)},n.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},n.prototype.option=function(t){var n=document.createElement("li");n.className="select2-results__option";var o={role:"option","data-selected":"false",tabindex:-1};for(var i in t.disabled&&(delete o["data-selected"],o["aria-disabled"]="true"),null==t.id&&delete o["data-selected"],null!=t._resultId&&(n.id=t._resultId),t.title&&(n.title=t.title),t.children&&(o["aria-label"]=t.text,delete o["data-selected"]),o){var a=o[i];n.setAttribute(i,a)}if(t.children){var r=e(n),s=document.createElement("strong");s.className="select2-results__group";var c=e(s);this.template(t,s),c.attr("role","presentation");for(var l=[],d=0;d<t.children.length;d++){var u=t.children[d],p=this.option(u);l.push(p)}var h=e("<ul></ul>",{class:"select2-results__options select2-results__options--nested",role:"listbox"});h.append(l),r.attr("role","list"),r.append(s),r.append(h)}else this.template(t,n);return e.data(n,"data",t),n},n.prototype.bind=function(t,n){var o=this,i=t.id+"-results";this.$results.attr("id",i),t.on("results:all",(function(e){o.clear(),o.append(e.data),t.isOpen()&&(o.setClasses(),o.highlightFirstItem())})),t.on("results:append",(function(e){o.append(e.data),t.isOpen()&&o.setClasses()})),t.on("query",(function(e){o.hideMessages(),o.showLoading(e)})),t.on("select",(function(){t.isOpen()&&(o.setClasses(),o.highlightFirstItem())})),t.on("unselect",(function(){t.isOpen()&&(o.setClasses(),o.highlightFirstItem())})),t.on("open",(function(){o.$results.attr("aria-expanded","true"),o.$results.attr("aria-hidden","false"),o.setClasses(),o.ensureHighlightVisible()})),t.on("close",(function(){o.$results.attr("aria-expanded","false"),o.$results.attr("aria-hidden","true"),o.$results.removeAttr("aria-activedescendant")})),t.on("results:toggle",(function(){var e=o.getHighlightedResults();0!==e.length&&e.trigger("mouseup")})),t.on("results:select",(function(){var e=o.getHighlightedResults();if(0!==e.length){var t=e.data("data");"true"==e.attr("data-selected")?o.trigger("close",{}):o.trigger("select",{data:t})}})),t.on("results:previous",(function(){var e=o.getHighlightedResults(),t=o.$results.find("[data-selected]"),n=t.index(e);if(0!==n){var i=n-1;0===e.length&&(i=0);var a=t.eq(i);a.trigger("mouseenter");var r=o.$results.offset().top,s=a.offset().top,c=o.$results.scrollTop()+(s-r);0===i?o.$results.scrollTop(0):s-r<0&&o.$results.scrollTop(c)}})),t.on("results:next",(function(){var e=o.getHighlightedResults(),t=o.$results.find("[data-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var i=t.eq(n);i.trigger("mouseenter");var a=o.$results.offset().top+o.$results.outerHeight(!1),r=i.offset().top+i.outerHeight(!1),s=o.$results.scrollTop()+r-a;0===n?o.$results.scrollTop(0):r>a&&o.$results.scrollTop(s)}})),t.on("results:focus",(function(e){e.element.addClass("select2-results__option--highlighted").attr("aria-selected","true"),o.$results.attr("aria-activedescendant",e.element.attr("id"))})),t.on("results:message",(function(e){o.displayMessage(e)})),e.fn.mousewheel&&this.$results.on("mousewheel",(function(e){var t=o.$results.scrollTop(),n=o.$results.get(0).scrollHeight-t+e.deltaY,i=e.deltaY>0&&t-e.deltaY<=0,a=e.deltaY<0&&n<=o.$results.height();i?(o.$results.scrollTop(0),e.preventDefault(),e.stopPropagation()):a&&(o.$results.scrollTop(o.$results.get(0).scrollHeight-o.$results.height()),e.preventDefault(),e.stopPropagation())})),this.$results.on("mouseup",".select2-results__option[data-selected]",(function(t){var n=e(this),i=n.data("data");"true"!==n.attr("data-selected")?o.trigger("select",{originalEvent:t,data:i}):o.options.get("multiple")?o.trigger("unselect",{originalEvent:t,data:i}):o.trigger("close",{})})),this.$results.on("mouseenter",".select2-results__option[data-selected]",(function(t){var n=e(this).data("data");o.getHighlightedResults().removeClass("select2-results__option--highlighted").attr("aria-selected","false"),o.trigger("results:focus",{data:n,element:e(this)})}))},n.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},n.prototype.destroy=function(){this.$results.remove()},n.prototype.ensureHighlightVisible=function(){var e=this.getHighlightedResults();if(0!==e.length){var t=this.$results.find("[data-selected]").index(e),n=this.$results.offset().top,o=e.offset().top,i=this.$results.scrollTop()+(o-n),a=o-n;i-=2*e.outerHeight(!1),t<=2?this.$results.scrollTop(0):(a>this.$results.outerHeight()||a<0)&&this.$results.scrollTop(i)}},n.prototype.template=function(t,n){var o=this.options.get("templateResult"),i=this.options.get("escapeMarkup"),a=o(t,n);null==a?n.style.display="none":"string"==typeof a?n.innerHTML=i(a):e(n).append(a)},n})),t.define("select2/keys",[],(function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}})),t.define("select2/selection/base",["jquery","../utils","../keys"],(function(e,t,n){function o(e,t){this.$element=e,this.options=t,o.__super__.constructor.call(this)}return t.Extend(o,t.Observable),o.prototype.render=function(){var t=e('<span class="select2-selection"  aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),t.attr("title",this.$element.attr("title")),t.attr("tabindex",this._tabindex),this.$selection=t,t},o.prototype.bind=function(e,t){var o=this,i=(e.id,e.id+"-results");this.options.get("minimumResultsForSearch"),this.container=e,this.$selection.on("focus",(function(e){o.trigger("focus",e)})),this.$selection.on("blur",(function(e){o._handleBlur(e)})),this.$selection.on("keydown",(function(e){o.trigger("keypress",e),e.which===n.SPACE&&e.preventDefault()})),e.on("results:focus",(function(e){o.$selection.attr("aria-activedescendant",e.data._resultId)})),e.on("selection:update",(function(e){o.update(e.data)})),e.on("open",(function(){o.$selection.attr("aria-expanded","true"),o.$selection.attr("aria-owns",i),o._attachCloseHandler(e)})),e.on("close",(function(){o.$selection.attr("aria-expanded","false"),o.$selection.removeAttr("aria-activedescendant"),o.$selection.removeAttr("aria-owns"),window.setTimeout((function(){o.$selection.focus()}),1),o._detachCloseHandler(e)})),e.on("enable",(function(){o.$selection.attr("tabindex",o._tabindex)})),e.on("disable",(function(){o.$selection.attr("tabindex","-1")}))},o.prototype._handleBlur=function(t){var n=this;window.setTimeout((function(){document.activeElement==n.$selection[0]||e.contains(n.$selection[0],document.activeElement)||n.trigger("blur",t)}),1)},o.prototype._attachCloseHandler=function(t){e(document.body).on("mousedown.select2."+t.id,(function(t){var n=e(t.target),o=n.closest(".select2");e(".select2.select2-container--open").each((function(){var t=e(this);this!=o[0]&&(t.data("element").select2("close"),setTimeout((function(){t.find("*:focus").blur(),n.focus()}),1))}))}))},o.prototype._detachCloseHandler=function(t){e(document.body).off("mousedown.select2."+t.id)},o.prototype.position=function(e,t){t.find(".selection").append(e)},o.prototype.destroy=function(){this._detachCloseHandler(this.container)},o.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},o})),t.define("select2/selection/single",["jquery","./base","../utils","../keys"],(function(e,t,n,o){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),e},i.prototype.bind=function(e,t){var n=this;i.__super__.bind.apply(this,arguments);var o=e.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",o).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",o),this.$selection.attr("role","combobox"),this.$selection.on("mousedown",(function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})})),this.$selection.on("focus",(function(e){})),this.$selection.on("keydown",(function(t){!e.isOpen()&&t.which>=48&&t.which<=90&&e.open()})),this.$selection.on("blur",(function(e){})),e.on("focus",(function(t){e.isOpen()||n.$selection.focus()})),e.on("selection:update",(function(e){n.update(e.data)}))},i.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("<span></span>")},i.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),o=this.display(t,n);n.empty().append(o),n.prop("title",t.title||t.text)}else this.clear()},i})),t.define("select2/selection/multiple",["jquery","./base","../utils"],(function(e,t,n){function o(e,t){o.__super__.constructor.apply(this,arguments)}return n.Extend(o,t),o.prototype.render=function(){var e=o.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('<ul class="select2-selection__rendered" aria-live="polite" aria-relevant="additions removals" aria-atomic="true"></ul>'),e},o.prototype.bind=function(t,n){var i=this;o.__super__.bind.apply(this,arguments),this.$selection.on("click",(function(e){i.trigger("toggle",{originalEvent:e})})),this.$selection.on("click",".select2-selection__choice__remove",(function(t){if(!i.options.get("disabled")){var n=e(this).parent().data("data");i.trigger("unselect",{originalEvent:t,data:n})}})),this.$selection.on("keydown",(function(e){!t.isOpen()&&e.which>=48&&e.which<=90&&t.open()})),t.on("focus",(function(){i.focusOnSearch()}))},o.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},o.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},o.prototype.selectionContainer=function(){return e('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation" aria-hidden="true">&times;</span></li>')},o.prototype.focusOnSearch=function(){var e=this;void 0!==e.$search&&setTimeout((function(){e._keyUpPrevented=!0,e.$search.focus()}),1)},o.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],o=0;o<e.length;o++){var i=e[o],a=this.selectionContainer(),r=this.display(i,a);"string"==typeof r&&(r=r.trim()),a.append(r),a.prop("title",i.title||i.text),a.data("data",i),t.push(a)}var s=this.$selection.find(".select2-selection__rendered");n.appendMany(s,t)}},o})),t.define("select2/selection/placeholder",["../utils"],(function(e){function t(e,t,n){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n)}return t.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},t.prototype.createPlaceholder=function(e,t){var n=this.selectionContainer();return n.html(this.display(t)),n.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),n},t.prototype.update=function(e,t){var n=1==t.length&&t[0].id!=this.placeholder.id;if(t.length>1||n)return e.call(this,t);this.clear();var o=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(o)},t})),t.define("select2/selection/allowClear",["jquery","../keys"],(function(e,t){function n(){}return n.prototype.bind=function(e,t,n){var o=this;e.call(this,t,n),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",(function(e){o._handleClear(e)})),t.on("keypress",(function(e){o._handleKeyboardClear(e,t)}))},n.prototype._handleClear=function(e,t){if(!this.options.get("disabled")){var n=this.$selection.find(".select2-selection__clear");if(0!==n.length){t.stopPropagation();for(var o=n.data("data"),i=0;i<o.length;i++){var a={data:o[i]};if(this.trigger("unselect",a),a.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle",{})}}},n.prototype._handleKeyboardClear=function(e,n,o){o.isOpen()||n.which!=t.DELETE&&n.which!=t.BACKSPACE||this._handleClear(n)},n.prototype.update=function(t,n){if(t.call(this,n),!(this.$selection.find(".select2-selection__placeholder").length>0||0===n.length)){var o=e('<span class="select2-selection__clear">&times;</span>');o.data("data",n),this.$selection.find(".select2-selection__rendered").prepend(o)}},n})),t.define("select2/selection/search",["jquery","../utils","../keys"],(function(e,t,n){function o(e,t,n){e.call(this,t,n)}return o.prototype.render=function(t){var n=e('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="text" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="textbox" aria-autocomplete="list" /></li>');this.$searchContainer=n,this.$search=n.find("input");var o=t.call(this);return this._transferTabIndex(),o},o.prototype.bind=function(e,t,o){var i=this,a=t.id+"-results";e.call(this,t,o),t.on("open",(function(){i.$search.attr("aria-owns",a),i.$search.trigger("focus")})),t.on("close",(function(){i.$search.val(""),i.$search.removeAttr("aria-activedescendant"),i.$search.removeAttr("aria-owns"),i.$search.trigger("focus")})),t.on("enable",(function(){i.$search.prop("disabled",!1),i._transferTabIndex()})),t.on("disable",(function(){i.$search.prop("disabled",!0)})),t.on("focus",(function(e){i.$search.trigger("focus")})),t.on("results:focus",(function(e){i.$search.attr("aria-activedescendant",e.data._resultId)})),this.$selection.on("focusin",".select2-search--inline",(function(e){i.trigger("focus",e)})),this.$selection.on("focusout",".select2-search--inline",(function(e){i._handleBlur(e)})),this.$selection.on("keydown",".select2-search--inline",(function(e){if(e.stopPropagation(),i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented(),e.which===n.BACKSPACE&&""===i.$search.val()){var o=i.$searchContainer.prev(".select2-selection__choice");if(o.length>0){var a=o.data("data");i.searchRemoveChoice(a),e.preventDefault()}}else e.which===n.ENTER&&(t.open(),e.preventDefault())}));var r=document.documentMode,s=r&&r<=11;this.$selection.on("input.searchcheck",".select2-search--inline",(function(e){s?i.$selection.off("input.search input.searchcheck"):i.$selection.off("keyup.search")})),this.$selection.on("keyup.search input.search",".select2-search--inline",(function(e){if(s&&"input"===e.type)i.$selection.off("input.search input.searchcheck");else{var t=e.which;t!=n.SHIFT&&t!=n.CTRL&&t!=n.ALT&&t!=n.TAB&&i.handleSearch(e)}}))},o.prototype._transferTabIndex=function(e){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},o.prototype.createPlaceholder=function(e,t){this.$search.attr("placeholder",t.text)},o.prototype.update=function(e,t){var n=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),e.call(this,t),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),n&&this.$search.focus()},o.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var e=this.$search.val();this.trigger("query",{term:e})}this._keyUpPrevented=!1},o.prototype.searchRemoveChoice=function(e,t){this.trigger("unselect",{data:t}),this.$search.val(t.text),this.handleSearch()},o.prototype.resizeSearch=function(){this.$search.css("width","25px");var e;e=""!==this.$search.attr("placeholder")?this.$selection.find(".select2-selection__rendered").innerWidth():.75*(this.$search.val().length+1)+"em",this.$search.css("width",e)},o})),t.define("select2/selection/eventRelay",["jquery"],(function(e){function t(){}return t.prototype.bind=function(t,n,o){var i=this,a=["open","opening","close","closing","select","selecting","unselect","unselecting"],r=["opening","closing","selecting","unselecting"];t.call(this,n,o),n.on("*",(function(t,n){if(-1!==e.inArray(t,a)){n=n||{};var o=e.Event("select2:"+t,{params:n});i.$element.trigger(o),-1!==e.inArray(t,r)&&(n.prevented=o.isDefaultPrevented())}}))},t})),t.define("select2/translation",["jquery","require"],(function(e,t){function n(e){this.dict=e||{}}return n.prototype.all=function(){return this.dict},n.prototype.get=function(e){return this.dict[e]},n.prototype.extend=function(t){this.dict=e.extend({},t.all(),this.dict)},n._cache={},n.loadPath=function(e){if(!(e in n._cache)){var o=t(e);n._cache[e]=o}return new n(n._cache[e])},n})),t.define("select2/diacritics",[],(function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"}})),t.define("select2/data/base",["../utils"],(function(e){function t(e,n){t.__super__.constructor.call(this)}return e.Extend(t,e.Observable),t.prototype.current=function(e){throw new Error("The `current` method must be defined in child classes.")},t.prototype.query=function(e,t){throw new Error("The `query` method must be defined in child classes.")},t.prototype.bind=function(e,t){},t.prototype.destroy=function(){},t.prototype.generateResultId=function(t,n){var o="";return o+=null!=t?t.id:e.generateChars(4),o+="-result-",o+=e.generateChars(4),null!=n.id?o+="-"+n.id.toString():o+="-"+e.generateChars(4),o},t})),t.define("select2/data/select",["./base","../utils","jquery"],(function(e,t,n){function o(e,t){this.$element=e,this.options=t,o.__super__.constructor.call(this)}return t.Extend(o,e),o.prototype.current=function(e){var t=[],o=this;this.$element.find(":selected").each((function(){var e=n(this),i=o.item(e);t.push(i)})),e(t)},o.prototype.select=function(e){var t=this;if(e.selected=!0,n(e.element).is("option"))return e.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current((function(o){var i=[];(e=[e]).push.apply(e,o);for(var a=0;a<e.length;a++){var r=e[a].id;-1===n.inArray(r,i)&&i.push(r)}t.$element.val(i),t.$element.trigger("change")}));else{var o=e.id;this.$element.val(o),this.$element.trigger("change")}},o.prototype.unselect=function(e){var t=this;if(this.$element.prop("multiple")){if(e.selected=!1,n(e.element).is("option"))return e.element.selected=!1,void this.$element.trigger("change");this.current((function(o){for(var i=[],a=0;a<o.length;a++){var r=o[a].id;r!==e.id&&-1===n.inArray(r,i)&&i.push(r)}t.$element.val(i),t.$element.trigger("change")}))}},o.prototype.bind=function(e,t){var n=this;this.container=e,e.on("select",(function(e){n.select(e.data)})),e.on("unselect",(function(e){n.unselect(e.data)}))},o.prototype.destroy=function(){this.$element.find("*").each((function(){n.removeData(this,"data")}))},o.prototype.query=function(e,t){var o=[],i=this;this.$element.children().each((function(){var t=n(this);if(t.is("option")||t.is("optgroup")){var a=i.item(t),r=i.matches(e,a);null!==r&&o.push(r)}})),t({results:o})},o.prototype.addOptions=function(e){t.appendMany(this.$element,e)},o.prototype.option=function(e){var t;e.children?(t=document.createElement("optgroup")).label=e.text:void 0!==(t=document.createElement("option")).textContent?t.textContent=e.text:t.innerText=e.text,void 0!==e.id&&(t.value=e.id),e.disabled&&(t.disabled=!0),e.selected&&(t.selected=!0),e.title&&(t.title=e.title);var o=n(t),i=this._normalizeItem(e);return i.element=t,n.data(t,"data",i),o},o.prototype.item=function(e){var t={};if(null!=(t=n.data(e[0],"data")))return t;if(e.is("option"))t={id:e.val(),text:e.text(),disabled:e.prop("disabled"),selected:e.prop("selected"),title:e.prop("title")};else if(e.is("optgroup")){t={text:e.prop("label"),children:[],title:e.prop("title")};for(var o=e.children("option"),i=[],a=0;a<o.length;a++){var r=n(o[a]),s=this.item(r);i.push(s)}t.children=i}return(t=this._normalizeItem(t)).element=e[0],n.data(e[0],"data",t),t},o.prototype._normalizeItem=function(e){n.isPlainObject(e)||(e={id:e,text:e});return null!=(e=n.extend({},{text:""},e)).id&&(e.id=e.id.toString()),null!=e.text&&(e.text=e.text.toString()),null==e._resultId&&e.id&&(e._resultId=this.generateResultId(this.container,e)),n.extend({},{selected:!1,disabled:!1},e)},o.prototype.matches=function(e,t){return this.options.get("matcher")(e,t)},o})),t.define("select2/data/array",["./select","../utils","jquery"],(function(e,t,n){function o(e,t){var n=t.get("data")||[];o.__super__.constructor.call(this,e,t),this.addOptions(this.convertToOptions(n))}return t.Extend(o,e),o.prototype.select=function(e){var t=this.$element.find("option").filter((function(t,n){return n.value==e.id.toString()}));0===t.length&&(t=this.option(e),this.addOptions(t)),o.__super__.select.call(this,e)},o.prototype.convertToOptions=function(e){var o=this,i=this.$element.find("option"),a=i.map((function(){return o.item(n(this)).id})).get(),r=[];function s(e){return function(){return n(this).val()==e.id}}for(var c=0;c<e.length;c++){var l=this._normalizeItem(e[c]);if(n.inArray(l.id,a)>=0){var d=i.filter(s(l)),u=this.item(d),p=n.extend(!0,{},l,u),h=this.option(p);d.replaceWith(h)}else{var f=this.option(l);if(l.children){var m=this.convertToOptions(l.children);t.appendMany(f,m)}r.push(f)}}return r},o})),t.define("select2/data/ajax",["./array","../utils","jquery"],(function(e,t,n){function o(e,t){this.ajaxOptions=this._applyDefaults(t.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),o.__super__.constructor.call(this,e,t)}return t.Extend(o,e),o.prototype._applyDefaults=function(e){var t={data:function(e){return n.extend({},e,{q:e.term})},transport:function(e,t,o){var i=n.ajax(e);return i.then(t),i.fail(o),i}};return n.extend({},t,e,!0)},o.prototype.processResults=function(e){return e},o.prototype.query=function(e,t){var o=this;null!=this._request&&(n.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var i=n.extend({type:"GET"},this.ajaxOptions);function a(){var a=i.transport(i,(function(i){var a=o.processResults(i,e);o.options.get("debug")&&window.console&&console.error&&(a&&a.results&&n.isArray(a.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),t(a),o.container.focusOnActiveElement()}),(function(){a.status&&"0"===a.status||o.trigger("results:message",{message:"errorLoading"})}));o._request=a}"function"==typeof i.url&&(i.url=i.url.call(this.$element,e)),"function"==typeof i.data&&(i.data=i.data.call(this.$element,e)),this.ajaxOptions.delay&&null!=e.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(a,this.ajaxOptions.delay)):a()},o})),t.define("select2/data/tags",["jquery"],(function(e){function t(t,n,o){var i=o.get("tags"),a=o.get("createTag");void 0!==a&&(this.createTag=a);var r=o.get("insertTag");if(void 0!==r&&(this.insertTag=r),t.call(this,n,o),e.isArray(i))for(var s=0;s<i.length;s++){var c=i[s],l=this._normalizeItem(c),d=this.option(l);this.$element.append(d)}}return t.prototype.query=function(e,t,n){var o=this;this._removeOldTags(),null!=t.term&&null==t.page?e.call(this,t,(function e(i,a){for(var r=i.results,s=0;s<r.length;s++){var c=r[s],l=null!=c.children&&!e({results:c.children},!0);if((c.text||"").toUpperCase()===(t.term||"").toUpperCase()||l)return!a&&(i.data=r,void n(i))}if(a)return!0;var d=o.createTag(t);if(null!=d){var u=o.option(d);u.attr("data-select2-tag",!0),o.addOptions([u]),o.insertTag(r,d)}i.results=r,n(i)})):e.call(this,t,n)},t.prototype.createTag=function(t,n){var o=e.trim(n.term);return""===o?null:{id:o,text:o}},t.prototype.insertTag=function(e,t,n){t.unshift(n)},t.prototype._removeOldTags=function(t){this._lastTag,this.$element.find("option[data-select2-tag]").each((function(){this.selected||e(this).remove()}))},t})),t.define("select2/data/tokenizer",["jquery"],(function(e){function t(e,t,n){var o=n.get("tokenizer");void 0!==o&&(this.tokenizer=o),e.call(this,t,n)}return t.prototype.bind=function(e,t,n){e.call(this,t,n),this.$search=t.dropdown.$search||t.selection.$search||n.find(".select2-search__field")},t.prototype.query=function(t,n,o){var i=this;n.term=n.term||"";var a=this.tokenizer(n,this.options,(function(t){var n=i._normalizeItem(t);if(!i.$element.find("option").filter((function(){return e(this).val()===n.id})).length){var o=i.option(n);o.attr("data-select2-tag",!0),i._removeOldTags(),i.addOptions([o])}!function(e){i.trigger("select",{data:e})}(n)}));a.term!==n.term&&(this.$search.length&&(this.$search.val(a.term),this.$search.focus()),n.term=a.term),t.call(this,n,o)},t.prototype.tokenizer=function(t,n,o,i){for(var a=o.get("tokenSeparators")||[],r=n.term,s=0,c=this.createTag||function(e){return{id:e.term,text:e.term}};s<r.length;){var l=r[s];if(-1!==e.inArray(l,a)){var d=r.substr(0,s),u=c(e.extend({},n,{term:d}));null!=u?(i(u),r=r.substr(s+1)||"",s=0):s++}else s++}return{term:r}},t})),t.define("select2/data/minimumInputLength",[],(function(){function e(e,t,n){this.minimumInputLength=n.get("minimumInputLength"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.term=t.term||"",t.term.length<this.minimumInputLength?this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e})),t.define("select2/data/maximumInputLength",[],(function(){function e(e,t,n){this.maximumInputLength=n.get("maximumInputLength"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.term=t.term||"",this.maximumInputLength>0&&t.term.length>this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e})),t.define("select2/data/maximumSelectionLength",[],(function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){var o=this;this.current((function(i){var a=null!=i?i.length:0;o.maximumSelectionLength>0&&a>=o.maximumSelectionLength?o.trigger("results:message",{message:"maximumSelected",args:{maximum:o.maximumSelectionLength}}):e.call(o,t,n)}))},e})),t.define("select2/dropdown",["jquery","./utils"],(function(e,t){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return t.Extend(n,t.Observable),n.prototype.render=function(){var t=e('<span class="select2-dropdown"><span class="select2-results"></span></span>');return t.attr("dir",this.options.get("dir")),this.$dropdown=t,t},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n})),t.define("select2/dropdown/search",["jquery","../utils"],(function(e,t){function n(){}return n.prototype.render=function(t){var n=t.call(this),o=e('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="text" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="combobox" aria-autocomplete="list" aria-expanded="true" /></span>');return this.$searchContainer=o,this.$search=o.find("input"),n.prepend(o),n},n.prototype.bind=function(t,n,o){var i=this,a=n.id+"-results";t.call(this,n,o),this.$search.on("keydown",(function(e){i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented()})),this.$search.on("input",(function(t){e(this).off("keyup")})),this.$search.on("keyup input",(function(e){i.handleSearch(e)})),n.on("open",(function(){i.$search.attr("tabindex",0),i.$search.attr("aria-owns",a),i.$search.focus(),window.setTimeout((function(){i.$search.focus()}),0)})),n.on("close",(function(){i.$search.attr("tabindex",-1),i.$search.removeAttr("aria-activedescendant"),i.$search.removeAttr("aria-owns"),i.$search.val("")})),n.on("focus",(function(){n.isOpen()||i.$search.focus()})),n.on("results:all",(function(e){null!=e.query.term&&""!==e.query.term||(i.showSearch(e)?i.$searchContainer.removeClass("select2-search--hide"):i.$searchContainer.addClass("select2-search--hide"))})),n.on("results:focus",(function(e){i.$search.attr("aria-activedescendant",e.data._resultId)}))},n.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},n.prototype.showSearch=function(e,t){return!0},n})),t.define("select2/dropdown/hidePlaceholder",[],(function(){function e(e,t,n,o){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,o)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),o=t.length-1;o>=0;o--){var i=t[o];this.placeholder.id===i.id&&n.splice(o,1)}return n},e})),t.define("select2/dropdown/infiniteScroll",["jquery"],(function(e){function t(e,t,n,o){this.lastParams={},e.call(this,t,n,o),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return t.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&this.$results.append(this.$loadingMore)},t.prototype.bind=function(t,n,o){var i=this;t.call(this,n,o),n.on("query",(function(e){i.lastParams=e,i.loading=!0})),n.on("query:append",(function(e){i.lastParams=e,i.loading=!0})),this.$results.on("scroll",(function(){var t=e.contains(document.documentElement,i.$loadingMore[0]);!i.loading&&t&&i.$results.offset().top+i.$results.outerHeight(!1)+50>=i.$loadingMore.offset().top+i.$loadingMore.outerHeight(!1)&&i.loadMore()}))},t.prototype.loadMore=function(){this.loading=!0;var t=e.extend({},{page:1},this.lastParams);t.page++,this.trigger("query:append",t)},t.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},t.prototype.createLoadingMore=function(){var t=e('<li class="select2-results__option select2-results__option--load-more"role="option" aria-disabled="true"></li>'),n=this.options.get("translations").get("loadingMore");return t.html(n(this.lastParams)),t},t})),t.define("select2/dropdown/attachBody",["jquery","../utils"],(function(e,t){function n(t,n,o){this.$dropdownParent=o.get("dropdownParent")||e(document.body),t.call(this,n,o)}return n.prototype.bind=function(e,t,n){var o=this,i=!1;e.call(this,t,n),t.on("open",(function(){o._showDropdown(),o._attachPositioningHandler(t),i||(i=!0,t.on("results:all",(function(){o._positionDropdown(),o._resizeDropdown()})),t.on("results:append",(function(){o._positionDropdown(),o._resizeDropdown()})))})),t.on("close",(function(){o._hideDropdown(),o._detachPositioningHandler(t)})),this.$dropdownContainer.on("mousedown",(function(e){e.stopPropagation()}))},n.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},n.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},n.prototype.render=function(t){var n=e("<span></span>"),o=t.call(this);return n.append(o),this.$dropdownContainer=n,n},n.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},n.prototype._attachPositioningHandler=function(n,o){var i=this,a="scroll.select2."+o.id,r="resize.select2."+o.id,s="orientationchange.select2."+o.id,c=this.$container.parents().filter(t.hasScroll);c.each((function(){e(this).data("select2-scroll-position",{x:e(this).scrollLeft(),y:e(this).scrollTop()})})),c.on(a,(function(t){var n=e(this).data("select2-scroll-position");e(this).scrollTop(n.y)})),e(window).on(a+" "+r+" "+s,(function(e){i._positionDropdown(),i._resizeDropdown()}))},n.prototype._detachPositioningHandler=function(n,o){var i="scroll.select2."+o.id,a="resize.select2."+o.id,r="orientationchange.select2."+o.id;this.$container.parents().filter(t.hasScroll).off(i),e(window).off(i+" "+a+" "+r)},n.prototype._positionDropdown=function(){var t=e(window),n=this.$dropdown.hasClass("select2-dropdown--above"),o=this.$dropdown.hasClass("select2-dropdown--below"),i=null,a=this.$container.offset();a.bottom=a.top+this.$container.outerHeight(!1);var r={height:this.$container.outerHeight(!1)};r.top=a.top,r.bottom=a.top+r.height;var s=this.$dropdown.outerHeight(!1),c=t.scrollTop(),l=t.scrollTop()+t.height(),d=c<a.top-s,u=l>a.bottom+s,p={left:a.left,top:r.bottom},h=this.$dropdownParent;"static"===h.css("position")&&(h=h.offsetParent());var f=h.offset();p.top-=f.top,p.left-=f.left,n||o||(i="below"),u||!d||n?!d&&u&&n&&(i="below"):i="above",("above"==i||n&&"below"!==i)&&(p.top=r.top-f.top-s),null!=i&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+i),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+i)),this.$dropdownContainer.css(p)},n.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},n.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},n})),t.define("select2/dropdown/minimumResultsForSearch",[],(function(){function e(t){for(var n=0,o=0;o<t.length;o++){var i=t[o];i.children?n+=e(i.children):n++}return n}function t(e,t,n,o){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,o)}return t.prototype.showSearch=function(t,n){return!(e(n.data.results)<this.minimumResultsForSearch)&&t.call(this,n)},t})),t.define("select2/dropdown/selectOnClose",[],(function(){function e(){}return e.prototype.bind=function(e,t,n){var o=this;e.call(this,t,n),t.on("close",(function(e){o._handleSelectOnClose(e)}))},e.prototype._handleSelectOnClose=function(e,t){if(t&&null!=t.originalSelect2Event){var n=t.originalSelect2Event;if("select"===n._type||"unselect"===n._type)return}var o=this.getHighlightedResults();if(!(o.length<1)){var i=o.data("data");null!=i.element&&i.element.selected||null==i.element&&i.selected||this.trigger("select",{data:i})}},e})),t.define("select2/dropdown/closeOnSelect",[],(function(){function e(){}return e.prototype.bind=function(e,t,n){var o=this;e.call(this,t,n),t.on("select",(function(e){o._selectTriggered(e)})),t.on("unselect",(function(e){o._selectTriggered(e)}))},e.prototype._selectTriggered=function(e,t){var n=t.originalEvent;n&&n.ctrlKey||this.trigger("close",{originalEvent:n,originalSelect2Event:t})},e})),t.define("select2/i18n/en",[],(function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return 1!=t&&(n+="s"),n},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return 1!=e.maximum&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}})),t.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],(function(e,t,n,o,i,a,r,s,c,l,d,u,p,h,f,m,g,_,v,w,y,b,C,x,D,k,$,A,j){function M(){this.reset()}return M.prototype.apply=function(u){if(null==(u=e.extend(!0,{},this.defaults,u)).dataAdapter){if(null!=u.ajax?u.dataAdapter=f:null!=u.data?u.dataAdapter=h:u.dataAdapter=p,u.minimumInputLength>0&&(u.dataAdapter=l.Decorate(u.dataAdapter,_)),u.maximumInputLength>0&&(u.dataAdapter=l.Decorate(u.dataAdapter,v)),u.maximumSelectionLength>0&&(u.dataAdapter=l.Decorate(u.dataAdapter,w)),u.tags&&(u.dataAdapter=l.Decorate(u.dataAdapter,m)),null==u.tokenSeparators&&null==u.tokenizer||(u.dataAdapter=l.Decorate(u.dataAdapter,g)),null!=u.query){var j=t(u.amdBase+"compat/query");u.dataAdapter=l.Decorate(u.dataAdapter,j)}if(null!=u.initSelection){var M=t(u.amdBase+"compat/initSelection");u.dataAdapter=l.Decorate(u.dataAdapter,M)}}if(null==u.resultsAdapter&&(u.resultsAdapter=n,null!=u.ajax&&(u.resultsAdapter=l.Decorate(u.resultsAdapter,x)),null!=u.placeholder&&(u.resultsAdapter=l.Decorate(u.resultsAdapter,C)),u.selectOnClose&&(u.resultsAdapter=l.Decorate(u.resultsAdapter,$))),null==u.dropdownAdapter){if(u.multiple)u.dropdownAdapter=y;else{var E=l.Decorate(y,b);u.dropdownAdapter=E}if(0!==u.minimumResultsForSearch&&(u.dropdownAdapter=l.Decorate(u.dropdownAdapter,k)),u.closeOnSelect&&(u.dropdownAdapter=l.Decorate(u.dropdownAdapter,A)),null!=u.dropdownCssClass||null!=u.dropdownCss||null!=u.adaptDropdownCssClass){var P=t(u.amdBase+"compat/dropdownCss");u.dropdownAdapter=l.Decorate(u.dropdownAdapter,P)}u.dropdownAdapter=l.Decorate(u.dropdownAdapter,D)}if(null==u.selectionAdapter){if(u.multiple?u.selectionAdapter=i:u.selectionAdapter=o,null!=u.placeholder&&(u.selectionAdapter=l.Decorate(u.selectionAdapter,a)),u.allowClear&&(u.selectionAdapter=l.Decorate(u.selectionAdapter,r)),u.multiple&&(u.selectionAdapter=l.Decorate(u.selectionAdapter,s)),null!=u.containerCssClass||null!=u.containerCss||null!=u.adaptContainerCssClass){var T=t(u.amdBase+"compat/containerCss");u.selectionAdapter=l.Decorate(u.selectionAdapter,T)}u.selectionAdapter=l.Decorate(u.selectionAdapter,c)}if("string"==typeof u.language)if(u.language.indexOf("-")>0){var S=u.language.split("-")[0];u.language=[u.language,S]}else u.language=[u.language];if(e.isArray(u.language)){var O=new d;u.language.push("en");for(var I=u.language,L=0;L<I.length;L++){var H=I[L],W={};try{W=d.loadPath(H)}catch(e){try{H=this.defaults.amdLanguageBase+H,W=d.loadPath(H)}catch(e){u.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+H+'" could not be automatically loaded. A fallback will be used instead.');continue}}O.extend(W)}u.translations=O}else{var N=d.loadPath(this.defaults.amdLanguageBase+"en"),F=new d(u.language);F.extend(N),u.translations=F}return u},M.prototype.reset=function(){function t(e){return e.replace(/[^\u0000-\u007E]/g,(function(e){return u[e]||e}))}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:l.escapeMarkup,language:j,matcher:function n(o,i){if(""===e.trim(o.term))return i;if(i.children&&i.children.length>0){for(var a=e.extend(!0,{},i),r=i.children.length-1;r>=0;r--)null==n(o,i.children[r])&&a.children.splice(r,1);return a.children.length>0?a:n(o,a)}var s=t(i.text).toUpperCase(),c=t(o.term).toUpperCase();return s.indexOf(c)>-1?i:null},minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(e){return e},templateResult:function(e){return e.text},templateSelection:function(e){return e.text},theme:"default",width:"resolve"}},M.prototype.set=function(t,n){var o={};o[e.camelCase(t)]=n;var i=l._convertData(o);e.extend(this.defaults,i)},new M})),t.define("select2/options",["require","jquery","./defaults","./utils"],(function(e,t,n,o){function i(t,i){if(this.options=t,null!=i&&this.fromElement(i),this.options=n.apply(this.options),i&&i.is("input")){var a=e(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=o.Decorate(this.options.dataAdapter,a)}}return i.prototype.fromElement=function(e){var n=["select2"];null==this.options.multiple&&(this.options.multiple=e.prop("multiple")),null==this.options.disabled&&(this.options.disabled=e.prop("disabled")),null==this.options.language&&(e.prop("lang")?this.options.language=e.prop("lang").toLowerCase():e.closest("[lang]").prop("lang")&&(this.options.language=e.closest("[lang]").prop("lang"))),null==this.options.dir&&(e.prop("dir")?this.options.dir=e.prop("dir"):e.closest("[dir]").prop("dir")?this.options.dir=e.closest("[dir]").prop("dir"):this.options.dir="ltr"),e.prop("disabled",this.options.disabled),e.prop("multiple",this.options.multiple),e.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),e.data("data",e.data("select2Tags")),e.data("tags",!0)),e.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),e.attr("ajax--url",e.data("ajaxUrl")),e.data("ajax--url",e.data("ajaxUrl")));var i;i=t.fn.jquery&&"1."==t.fn.jquery.substr(0,2)&&e[0].dataset?t.extend(!0,{},e[0].dataset,e.data()):e.data();var a=t.extend(!0,{},i);for(var r in a=o._convertData(a))t.inArray(r,n)>-1||(t.isPlainObject(this.options[r])?t.extend(this.options[r],a[r]):this.options[r]=a[r]);return this},i.prototype.get=function(e){return this.options[e]},i.prototype.set=function(e,t){this.options[e]=t},i})),t.define("select2/core",["jquery","./options","./utils","./keys"],(function(e,t,n,o){var i=function(e,n){null!=e.data("select2")&&e.data("select2").destroy(),this.$element=e,this.id=this._generateId(e),n=n||{},this.options=new t(n,e),i.__super__.constructor.call(this);var o=e.attr("tabindex")||0;e.data("old-tabindex",o),e.attr("tabindex","-1");var a=this.options.get("dataAdapter");this.dataAdapter=new a(e,this.options);var r=this.render();this._placeContainer(r);var s=this.options.get("selectionAdapter");this.selection=new s(e,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,r);var c=this.options.get("dropdownAdapter");this.dropdown=new c(e,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,r);var l=this.options.get("resultsAdapter");this.results=new l(e,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var d=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current((function(e){d.trigger("selection:update",{data:e})})),e.addClass("select2-hidden-accessible"),e.attr("aria-hidden","true"),this._syncAttributes(),e.data("select2",this)};return n.Extend(i,n.Observable),i.prototype._generateId=function(e){return"select2-"+(null!=e.attr("id")?e.attr("id"):null!=e.attr("name")?e.attr("name")+"-"+n.generateChars(2):n.generateChars(4)).replace(/(:|\.|\[|\]|,)/g,"")},i.prototype._placeContainer=function(e){e.insertAfter(this.$element);var t=this._resolveWidth(this.$element,this.options.get("width"));null!=t&&e.css("width",t)},i.prototype._resolveWidth=function(e,t){var n=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==t){var o=this._resolveWidth(e,"style");return null!=o?o:this._resolveWidth(e,"element")}if("element"==t){var i=e.outerWidth(!1);return i<=0?"auto":i+"px"}if("style"==t){var a=e.attr("style");if("string"!=typeof a)return null;for(var r=a.split(";"),s=0,c=r.length;s<c;s+=1){var l=r[s].replace(/\s/g,"").match(n);if(null!==l&&l.length>=1)return l[1]}return null}return t},i.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},i.prototype._registerDomEvents=function(){var t=this;this.$element.on("change.select2",(function(){t.dataAdapter.current((function(e){t.trigger("selection:update",{data:e})}))})),this.$element.on("focus.select2",(function(e){t.trigger("focus",e)})),this._syncA=n.bind(this._syncAttributes,this),this._syncS=n.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var o=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=o?(this._observer=new o((function(n){e.each(n,t._syncA),e.each(n,t._syncS)})),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",t._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",t._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",t._syncS,!1))},i.prototype._registerDataEvents=function(){var e=this;this.dataAdapter.on("*",(function(t,n){e.trigger(t,n)}))},i.prototype._registerSelectionEvents=function(){var t=this,n=["toggle","focus"];this.selection.on("toggle",(function(){t.toggleDropdown()})),this.selection.on("focus",(function(e){t.focus(e)})),this.selection.on("*",(function(o,i){-1===e.inArray(o,n)&&t.trigger(o,i)}))},i.prototype._registerDropdownEvents=function(){var e=this;this.dropdown.on("*",(function(t,n){e.trigger(t,n)}))},i.prototype._registerResultsEvents=function(){var e=this;this.results.on("*",(function(t,n){e.trigger(t,n)}))},i.prototype._registerEvents=function(){var t=this;this.on("open",(function(){t.$container.addClass("select2-container--open")})),this.on("close",(function(){t.$container.removeClass("select2-container--open")})),this.on("enable",(function(){t.$container.removeClass("select2-container--disabled")})),this.on("disable",(function(){t.$container.addClass("select2-container--disabled")})),this.on("blur",(function(){t.$container.removeClass("select2-container--focus")})),this.on("query",(function(e){t.isOpen()||t.trigger("open",{}),this.dataAdapter.query(e,(function(n){t.trigger("results:all",{data:n,query:e})}))})),this.on("query:append",(function(e){this.dataAdapter.query(e,(function(n){t.trigger("results:append",{data:n,query:e})}))})),this.on("open",(function(){setTimeout((function(){t.focusOnActiveElement()}),1)})),e(document).on("keydown",(function(e){var n=e.which;if(t.isOpen()){n===o.ESC||n===o.TAB||n===o.UP&&e.altKey?(t.close(),e.preventDefault()):n===o.ENTER?(t.trigger("results:select",{}),e.preventDefault()):n===o.SPACE&&e.ctrlKey?(t.trigger("results:toggle",{}),e.preventDefault()):n===o.UP?(t.trigger("results:previous",{}),e.preventDefault()):n===o.DOWN&&(t.trigger("results:next",{}),e.preventDefault());var i=t.$dropdown.find(".select2-search__field");i.length||(i=t.$container.find(".select2-search__field")),n===o.DOWN||n===o.UP?t.focusOnActiveElement():(i.focus(),setTimeout((function(){t.focusOnActiveElement()}),1e3))}else t.hasFocus()&&(n!==o.ENTER&&n!==o.SPACE&&n!==o.DOWN||(t.open(),e.preventDefault()))}))},i.prototype.focusOnActiveElement=function(){this.isOpen()&&!n.isTouchscreen()&&this.$results.find("li.select2-results__option--highlighted").focus()},i.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},i.prototype._syncSubtree=function(e,t){var n=!1,o=this;if(!e||!e.target||"OPTION"===e.target.nodeName||"OPTGROUP"===e.target.nodeName){if(t)if(t.addedNodes&&t.addedNodes.length>0)for(var i=0;i<t.addedNodes.length;i++)t.addedNodes[i].selected&&(n=!0);else t.removedNodes&&t.removedNodes.length>0&&(n=!0);else n=!0;n&&this.dataAdapter.current((function(e){o.trigger("selection:update",{data:e})}))}},i.prototype.trigger=function(e,t){var n=i.__super__.trigger,o={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===t&&(t={}),e in o){var a=o[e],r={prevented:!1,name:e,args:t};if(n.call(this,a,r),r.prevented)return void(t.prevented=!0)}n.call(this,e,t)},i.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},i.prototype.open=function(){this.isOpen()||this.trigger("query",{})},i.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},i.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},i.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},i.prototype.focus=function(e){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},i.prototype.enable=function(e){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=e&&0!==e.length||(e=[!0]);var t=!e[0];this.$element.prop("disabled",t)},i.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var e=[];return this.dataAdapter.current((function(t){e=t})),e},i.prototype.val=function(t){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==t||0===t.length)return this.$element.val();var n=t[0];e.isArray(n)&&(n=e.map(n,(function(e){return e.toString()}))),this.$element.val(n).trigger("change")},i.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},i.prototype.render=function(){var t=e('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return t.attr("dir",this.options.get("dir")),this.$container=t,this.$container.addClass("select2-container--"+this.options.get("theme")),t.data("element",this.$element),t},i})),t.define("jquery-mousewheel",["jquery"],(function(e){return e})),t.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],(function(e,t,n,o){if(null==e.fn.selectWoo){var i=["open","close","destroy"];e.fn.selectWoo=function(t){if("object"==typeof(t=t||{}))return this.each((function(){var o=e.extend(!0,{},t);new n(e(this),o)})),this;if("string"==typeof t){var o,a=Array.prototype.slice.call(arguments,1);return this.each((function(){var n=e(this).data("select2");null==n&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),o=n[t].apply(n,a)})),e.inArray(t,i)>-1?this:o}throw new Error("Invalid arguments for Select2: "+t)}}return null!=e.fn.select2&&null!=e.fn.select2.defaults&&(e.fn.selectWoo.defaults=e.fn.select2.defaults),null==e.fn.selectWoo.defaults&&(e.fn.selectWoo.defaults=o),e.fn.select2=e.fn.select2||e.fn.selectWoo,n})),{define:t.define,require:t.require}}(),n=t.require("jquery.select2");return e.fn.select2.amd=t,e.fn.selectWoo.amd=t,n},void 0===(a=o.apply(t,i))||(e.exports=a)},567:function(e){"use strict";e.exports=window.jQuery}},t={};function n(o){var i=t[o];if(void 0!==i)return i.exports;var a=t[o]={exports:{}};return e[o].call(a.exports,a,a.exports,n),a.exports}!function(){"use strict";n(357),n(707),n(279),n(233),n(207);const e=window.WPCodeSnippetManager||function(e,t,n){const o={editor_id:"wpcode_snippet_code",unload_set:!1,icon_lock:'<svg width="22" height="28" viewBox="0 0 22 28" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M19 9.33333H17.6666V6.66667C17.6666 2.98667 14.68 0 11 0C7.31998 0 4.33331 2.98667 4.33331 6.66667V9.33333H2.99998C1.53331 9.33333 0.333313 10.5333 0.333313 12V25.3333C0.333313 26.8 1.53331 28 2.99998 28H19C20.4666 28 21.6666 26.8 21.6666 25.3333V12C21.6666 10.5333 20.4666 9.33333 19 9.33333ZM6.99998 6.66667C6.99998 4.45333 8.78665 2.66667 11 2.66667C13.2133 2.66667 15 4.45333 15 6.66667V9.33333H6.99998V6.66667ZM19 25.3333H2.99998V12H19V25.3333ZM11 21.3333C12.4666 21.3333 13.6666 20.1333 13.6666 18.6667C13.6666 17.2 12.4666 16 11 16C9.53331 16 8.33331 17.2 8.33331 18.6667C8.33331 20.1333 9.53331 21.3333 11 21.3333Z" fill="#8A8A8A"/></svg>',l10n:wpcode,saving_height:!1,init:function(){o.should_init()&&(t.WPCodeSnippetManager=o,o.find_elements(),o.init_location_picker(),o.init_location_click(),o.prevent_multi_button_click(),o.init_snippet_type_switcher(),o.init_auto_insert_toggle(),o.init_dynamic_hide(),o.init_copy_target(),o.init_tags_picker(),o.init_metabox_toggler(),o.init_select2(),o.init_tinymce_listener(),o.unload_change_listener(),o.init_save_to_library(),o.init_custom_shortcode(),o.init_conditional_logic_notice(),o.init_device_type(),o.init_datetime_lite(),o.init_shortcode_attributes(),o.update_smart_tags_attributes(),o.restore_cursor_position(),o.maybe_highlight_error_line(),o.init_load_as_file(),o.init_edit_lock(),o.editor_resizer(),o.init_ai_button(),o.keyboard_shortcuts(),o.update_available_locations(o.switcher.val(),!1))},should_init:function(){return null!==e.getElementById(o.editor_id)},find_elements(){o.location_dropdown=n("#wpcode_auto_insert_location"),o.switcher=n(e.getElementById("wpcode_snippet_type")),o.$body=n("body"),o.$text_editor="undefined"!=typeof tinymce&&tinymce.get("wpcode_snippet_text"),o.$selected_location_display=n("#wpcode-selected-location-display"),o.code_type=o.switcher.val()},init_snippet_type_switcher:function(){o.switcher.on("change",(function(){let e=o.switcher.val();if(n(this).find(":selected").hasClass("wpcode-pro"))return o.switcher.val(o.code_type),void("scss"===e?o.show_pro_notice(o.l10n.scss_title,o.l10n.scss_text,o.l10n.scss_url,o.l10n.scss_button).then((function(){WPCodeCodeTypePicker.showPicker()})):"blocks"===e&&o.show_pro_notice(o.l10n.blocks_title,o.l10n.blocks_text,o.l10n.blocks_url,o.l10n.blocks_button).then((function(){WPCodeCodeTypePicker.showPicker()})));if(o.set_before_unload(),t.WPCodeAdminCodeEditor.switch_code_mode(o.editor_id,n(this).val(),n(this).find(":selected").data("mode"),n(this).find(":selected").data("lint")),o.$body.removeClass("wpcode-code-type-"+o.code_type),o.$body.addClass("wpcode-code-type-"+n(this).val()),"text"===o.switcher.val()){const e=t.WPCodeAdminCodeEditor.get_value(o.editor_id);o.$text_editor?o.$text_editor.setContent(e):n("#wpcode_snippet_text").val(e)}else t.WPCodeAdminCodeEditor.refresh(o.editor_id);const i=o.switcher.val();"php"!==o.code_type&&"php"!==i||o.update_available_locations(i),o.switcher.data("previous-type",o.code_type),o.code_type=i}))},update_available_locations(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const i=o.location_dropdown.find(".wpcode-list-item");i.removeClass("wpcode-list-item-disabled"),i.find('input[type="radio"]').prop("disabled",!1);const a=i.filter((function(){const t=n(this).data("code-type");return"all"!==t&&e!==t}));if(a.length>0&&(a.addClass("wpcode-list-item-disabled"),a.find('input[type="radio"]').prop("disabled",!0)),o.location_dropdown.find(".wpcode-items-list-category").each((function(){const e=n(this).find(".wpcode-list-item");e.sort((function(e,t){return n(e).data("index")-n(t).data("index")})),n(this).html(e)})),a.detach().appendTo(o.location_dropdown.find(".wpcode-items-list-category")),t){const e=o.location_dropdown.find(".wpcode-list-item:not(.wpcode-list-item-disabled):not(.wpcode-list-item-separator)").first();e.length>0&&e.find('input[type="radio"]').prop("checked",!0).trigger("change")}},init_location_picker:function(){o.location_dropdown.on("keydown",".wpcode-list-item-location",(function(e){if("Enter"===e.key||" "===e.key){const e=n(this).find('input[type="radio"]');e.prop("disabled")||(e.prop("checked",!0).trigger("change"),o.$selected_location_display.focus())}})),o.location_dropdown.on("change",'input[type="radio"]',(function(e){o.location_dropdown.find(".wpcode-list-item").removeClass("wpcode-list-item-selected");const t=n(this).closest(".wpcode-list-item");t.addClass("wpcode-list-item-selected"),o.$selected_location_display.text(t.find(".wpcode-list-item-title").attr("title")),o.location_dropdown.is(":visible")&&o.close_location_dropdown()}))},prevent_multi_button_click:function(){n('#wpcode-snippet-manager-form .wpcode-button[type="submit"]').click((function(e){return!e.detail||1==e.detail}))},init_location_click:function(){o.location_dropdown.hide(),n("body").on("click",".wpcode-list-item",(function(e){const t=n(this).find("label").first();t.data("upgrade-title")&&o.show_pro_notice(t.data("upgrade-title"),t.data("upgrade-text"),t.data("upgrade-link"),t.data("upgrade-button"))})),o.$selected_location_display.on("click, focus",(function(){o.location_dropdown.slideDown(200,(function(){o.init_dropdown_close()})),o.scroll_to_location_dropdown()}))},init_dropdown_close:function(){n(e).on("click.wpcodelocation",(function(e){n(e.target).closest("#wpcode_auto_insert_location").length||n(e.target).closest(".jconfirm-box").length||o.close_location_dropdown()}))},close_location_dropdown:function(){o.location_dropdown.hide(),n(e).off("click.wpcodelocation"),o.scroll_to_location_dropdown(300),o.$selected_location_display.blur()},scroll_to_location_dropdown:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:100;const t=o.$selected_location_display.offset();t&&n("html, body").animate({scrollTop:t.top-e},200)},init_auto_insert_toggle:function(){const t={toggles:"",init:function(){t.toggles=n(e.querySelectorAll(".wpcode-button-toggle")),t.listen_to_switch()},listen_to_switch:function(){t.toggles.each((function(){const e=n(this).find(".wpcode-button-toggle-input");n(this).on("click",".wpcode-button",(function(i){i.preventDefault(),o.set_before_unload(),e.val(n(this).val()).change(),t.make_button_active(n(this))}))}))},make_button_active:function(e){e.closest(".wpcode-button-toggle").find(".wpcode-button").each((function(){e.is(n(this))?n(this).removeClass("wpcode-button-secondary-inactive"):n(this).addClass("wpcode-button-secondary-inactive")}))}};t.init()},init_dynamic_hide:function(){const e={init:function(){e.elements=n("[data-show-if-id]"),e.add_listeners()},add_listeners:function(){e.elements.each((function(){const t=n(this),o=t.data("show-if-id");if(""===o)return;let i=!1,a=String(t.data("show-if-value")).split(",");t.data("hide-if-value")&&(a=String(t.data("hide-if-value")).split(","),i=!0);const r=n(o);n(".wpcode-admin-page #wpbody-content").on("change",o,(function(){e.maybe_hide(n(this),t,a,i)})),e.maybe_hide(r,t,a,i)}))},maybe_hide:function(e,t,n,i){let a=String(e.val());if("checkbox"===e.attr("type")&&(a=e.prop("checked")?"1":"0"),"radio"===e.attr("type")&&(a=e.closest("form").find('input[name="'+e.attr("name")+'"]:checked').val()),i){if(n.indexOf(a)>=0)return void t.hide();t.show(),t.find(".wpcode-select2").length>0&&o.init_select2()}else n.indexOf(a)<0?t.hide():(t.show(),t.find(".wpcode-select2").length>0&&o.init_select2())}};e.init()},init_copy_target:function(){n(".wpcode-copy-target").on("click",(function(e){e.preventDefault();const t=n(this),o=t.data("target"),i=t.data("prefix"),a=t.data("suffix"),r=n(o).val();r&&(navigator.clipboard.writeText(i+r+a),t.addClass("wpcode-show-success-icon"),setTimeout((function(){t.removeClass("wpcode-show-success-icon")}),500))}))},init_select2:function(){n(".wpcode-select2").selectWoo({templateResult:function(e){const t=n(e.element),o=t.data("label-pill"),i=t.data("upgrade-title"),a=t.data("upgrade-text"),r=t.data("upgrade-link"),s=t.data("upgrade-button"),c=n('<span class="wpcode-pro-pill">'+o+"</span>");return""!==i&&c.attr("data-upgrade-title",i),""!==a&&c.attr("data-upgrade-text",a),""!==r&&c.attr("data-upgrade-link",r),""!==s&&c.attr("data-upgrade-button",s),void 0!==o&&""!==o?((e=n("<span>"+e.text+"</span>")).append(c),e):e.text}}),n("body").on("click",".select2-results__options",(function(e){const t=n(this).closest(".select2-results__option").find(".wpcode-pro-pill");t.length>0&&o.show_pro_notice(t.data("upgrade-title"),t.data("upgrade-text"),t.data("upgrade-link"),t.data("upgrade-button"))}))},init_tags_picker:function(){const e=n(".wpcode-tags-picker");e.selectWoo({tags:!0,ajax:{url:ajaxurl,data:function(e){return{action:"ajax-tag-search",tax:"wpcode_tags",q:e.term?e.term:""}},processResults:function(e){const t=e.split(","),n=[];return t.forEach((function(e){""!==e&&n.push({id:e,text:e})})),{results:n}}}}),e.on("change",(function(){o.set_before_unload();const e=n(this).data("target");n(e).val(n(this).val().join(","))}))},init_metabox_toggler:function(){n(".wpcode-metabox-title").on("click",(function(){n(this).parent().toggleClass("wpcode-metabox-collapsed")}))},init_tinymce_listener(){if(null===o.$text_editor)return o.$text_editor=tinymce.get("wpcode_snippet_text"),void setTimeout(o.init_tinymce_listener,100);!1!==o.$text_editor?o.$text_editor.on("Paste Change input Undo Redo",(function(){o.set_before_unload(),clearTimeout(o.editor_change_handler),o.editor_change_handler=setTimeout((function(){t.WPCodeAdminCodeEditor.set_value(o.editor_id,o.$text_editor.getContent())}),100)})):n("#wpcode_snippet_text").on("paste change input",(function(){o.set_before_unload(),clearTimeout(o.editor_change_handler),o.editor_change_handler=setTimeout((function(){t.WPCodeAdminCodeEditor.set_value(o.editor_id,n("#wpcode_snippet_text").val())}),100)}))},set_before_unload(){o.unload_set||(o.unload_set=!0,o.catch_unsaved_button=!0,n(t).on("beforeunload",(function(){return"Are you sure?"})))},unload_change_listener(){const e=t.WPCodeAdminCodeEditor.get_editor(o.editor_id);e&&e.on("change",(function(){o.set_before_unload()}));const i=n("#wpcode-snippet-manager-form");i.on("change","input, select",(function(){o.set_before_unload()})),i.on("submit",(function(){n(t).off("beforeunload"),o.save_cursor_position()}))},save_cursor_position(){const e=t.WPCodeAdminCodeEditor.get_editor(o.editor_id);e&&(o.cursor_position=e.getCursor(),localStorage.setItem("wpcode_cursor_position",JSON.stringify(o.cursor_position)),localStorage.setItem("wpcode_scroll_position",JSON.stringify(e.getScrollInfo())))},restore_cursor_position(){const e=localStorage.getItem("wpcode_cursor_position");if(e){const n=JSON.parse(e),i=localStorage.getItem("wpcode_scroll_position");localStorage.removeItem("wpcode_cursor_position");const a=t.WPCodeAdminCodeEditor.get_editor(o.editor_id);if(a&&(a.focus(),a.setCursor(n),i)){const e=JSON.parse(i);a.scrollTo(e.left,e.top)}}},init_save_to_library(){n("#wpcode_save_to_library").click((function(e){e.preventDefault(),o.show_pro_notice(o.l10n.save_to_library_title,o.l10n.save_to_library_text,o.l10n.save_to_library_url)}))},init_custom_shortcode(){n("#wpcode-custom-shortcode-lite").click((function(e){e.preventDefault(),o.show_pro_notice(o.l10n.shortcode_title,o.l10n.shortcode_text,o.l10n.shortcode_url)}))},init_datetime_lite(){n(".wpcode-input-datetime[readonly]").click((function(e){e.preventDefault(),o.show_pro_notice(o.l10n.datetime_title,o.l10n.datetime_text,o.l10n.datetime_url)}))},init_device_type(){n(".wpcode-device-type-picker-lite label").click((function(e){e.preventDefault(),o.show_pro_notice(o.l10n.device_title,o.l10n.device_text,o.l10n.device_url)}))},init_load_as_file(){n("#wpcode_snippet_as_file_option #wpcode_snippet_as_file").on("change",(function(e){e.preventDefault(),n(this).prop("checked",!1),o.show_pro_notice(o.l10n.laf_title,o.l10n.laf_text,o.l10n.laf_url)}))},show_pro_notice:(e,t,n,o)=>WPCodeAdminNotices.show_pro_notice(e,t,n,o),init_conditional_logic_notice(){n("#wpcode-conditions-holder").on("change",".wpcode-cl-rule-type",(function(e){const t=n(this).find(":selected");if(t.data("upgrade-title")){e.stopPropagation(),o.show_pro_notice(t.data("upgrade-title"),t.data("upgrade-text"),t.data("upgrade-link"),t.data("upgrade-button"));const i=n(this).find("option").first();n(this).val(i.attr("value")).trigger("change")}}))},init_shortcode_attributes(){const e=n("#wpcode-shortcode-attributes-list ul"),t=n("#wpcode-shortcode-attribute-name"),i=n("#wpcode_shortcode_attribute_list_item_template").html();n("#wpcode_add_attribute").on("click",(function(a){a.preventDefault();const r=o.sanitize_key(t.val());if(""===r)return;const s=n(i);s.find(".wpcode-shortcode-attribute-name").text(r),s.find(".wpcode-shortcode-attribute-item-input").val(r),e.append(s),t.val(""),o.update_smart_tags_attributes()})),e.on("click",".wpcode-shortcode-attribute-remove",(function(e){e.preventDefault(),n(this).closest("li").remove(),o.update_smart_tags_attributes()}))},sanitize_key:e=>e.replace(/[^a-z0-9_]/gi,"").toLowerCase(),update_smart_tags_attributes(){const e=n(".wpcode-shortcode-attribute-item-input"),t=n(".wpcode-smart-tags-dropdown ul");t.find(".wpcode-attribute-smart-tag").remove(),e.length>0&&t.append('<li class="wpcode-attribute-smart-tag wpcode-smart-tag-category-label">'+o.l10n.shortcode_attributes+"</li>"),e.each((function(){const e=n(this).val();t.append('<li class="wpcode-attribute-smart-tag" ><buton class="wpcode-insert-smart-tag" data-tag="{attr_'+e+'}"><code>{attr_'+e+"}</code> - "+e+"</buton></li>")}))},maybe_highlight_error_line(){if(o.l10n.error_line<=0)return;const t=wpcode_editor[o.editor_id].codemirror;var n;t.doc.setGutterMarker(o.l10n.error_line-1,"CodeMirror-lint-markers",((n=e.createElement("div")).innerHTML='<div class="wpcode-line-error-icon"></div>',n.setAttribute("title",o.l10n.error_line_message),n)),t.doc.addLineClass(o.l10n.error_line-1,"background","wpcode-line-error-code")},init_edit_lock(){n(e).on("heartbeat-send.refresh-lock",(function(e,t){t.wpcode_lock=o.l10n.snippet_id})),o.l10n.is_locked&&o.show_locked_message(o.l10n.locked_by)},show_locked_message(e){const t=WPCodeSVG.WPCodeIcon("lock",22,28,"0 0 22 28","iconId");n.confirm({title:t+o.l10n.edited+e,boxWidth:"560px",theme:"modern no-content",type:"blue",buttons:{ok:{text:o.l10n.ok,btnClass:"wpcode-btn-confirm",action:function(){}}}})},editor_resizer(){let n=e.querySelector(".wpcode-resize-handle"),i=e.querySelector(".wpcode-code-textarea"),a=0;const r=t.WPCodeAdminCodeEditor.get_editor(o.editor_id);var s,c;function l(e){a=Math.max(200,c+e.y-s)+"px",r.setSize(null,a)}function d(n){e.body.removeEventListener("mousemove",l),t.removeEventListener("mouseup",d),i.classList.remove("wpcode-resizing"),o.save_editor_height(a)}n.addEventListener("mousedown",(function(n){var o;n.x,s=n.y,o=i,c=parseInt(t.getComputedStyle(o).height.replace(/px$/,"")),i.classList.add("wpcode-resizing"),e.body.addEventListener("mousemove",l),t.addEventListener("mouseup",d)}))},save_editor_height(e){o.saving_height&&o.saving_height.abort(),o.saving_height=n.post(ajaxurl,{action:"wpcode_save_editor_height",height:e,_wpnonce:o.l10n.nonce})},init_ai_button(){n(".wpcode-button-ai-not-available").on("click",(function(e){e.preventDefault(),e.stopPropagation(),WPCodeAdminNotices.show_pro_notice(o.l10n.ai_improve_title,o.l10n.ai_text,o.l10n.ai_improve_url,o.l10n.ai_button)}))},keyboard_shortcuts(){var i={};n(e).on("keydown",(function(e){var t=/Mac/.test(navigator.userAgent),n=!t&&e.ctrlKey,o=t&&e.metaKey;if(n||o){var a=String.fromCharCode(e.which).toUpperCase();i.hasOwnProperty(a)&&(e.preventDefault(),i[a](e))}}));const a=t.WPCodeAdminCodeEditor.get_editor(o.editor_id);var r;r=function(e){a.hasFocus()&&n("#wpcode-snippet-manager-form").submit()},i["S".toUpperCase()]=r}};return o}(document,window,jQuery);jQuery((function(){e.init()})),n(560);var t=["onChange","onClose","onDayCreate","onDestroy","onKeyDown","onMonthChange","onOpen","onParseConfig","onReady","onValueUpdate","onYearChange","onPreCalendarPosition"],o={_disable:[],allowInput:!1,allowInvalidPreload:!1,altFormat:"F j, Y",altInput:!1,altInputClass:"form-control input",animate:"object"==typeof window&&-1===window.navigator.userAgent.indexOf("MSIE"),ariaDateFormat:"F j, Y",autoFillDefaultTime:!0,clickOpens:!0,closeOnSelect:!0,conjunction:", ",dateFormat:"Y-m-d",defaultHour:12,defaultMinute:0,defaultSeconds:0,disable:[],disableMobile:!1,enableSeconds:!1,enableTime:!1,errorHandler:function(e){return"undefined"!=typeof console&&console.warn(e)},getWeek:function(e){var t=new Date(e.getTime());t.setHours(0,0,0,0),t.setDate(t.getDate()+3-(t.getDay()+6)%7);var n=new Date(t.getFullYear(),0,4);return 1+Math.round(((t.getTime()-n.getTime())/864e5-3+(n.getDay()+6)%7)/7)},hourIncrement:1,ignoredFocusElements:[],inline:!1,locale:"default",minuteIncrement:5,mode:"single",monthSelectorType:"dropdown",nextArrow:"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>",noCalendar:!1,now:new Date,onChange:[],onClose:[],onDayCreate:[],onDestroy:[],onKeyDown:[],onMonthChange:[],onOpen:[],onParseConfig:[],onReady:[],onValueUpdate:[],onYearChange:[],onPreCalendarPosition:[],plugins:[],position:"auto",positionElement:void 0,prevArrow:"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>",shorthandCurrentMonth:!1,showMonths:1,static:!1,time_24hr:!1,weekNumbers:!1,wrap:!1},i={weekdays:{shorthand:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],longhand:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},months:{shorthand:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],longhand:["January","February","March","April","May","June","July","August","September","October","November","December"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:function(e){var t=e%100;if(t>3&&t<21)return"th";switch(t%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}},rangeSeparator:" to ",weekAbbreviation:"Wk",scrollTitle:"Scroll to increment",toggleTitle:"Click to toggle",amPM:["AM","PM"],yearAriaLabel:"Year",monthAriaLabel:"Month",hourAriaLabel:"Hour",minuteAriaLabel:"Minute",time_24hr:!1},a=i,r=function(e,t){return void 0===t&&(t=2),("000"+e).slice(-1*t)},s=function(e){return!0===e?1:0};function c(e,t){var n;return function(){var o=this,i=arguments;clearTimeout(n),n=setTimeout((function(){return e.apply(o,i)}),t)}}var l=function(e){return e instanceof Array?e:[e]};function d(e,t,n){if(!0===n)return e.classList.add(t);e.classList.remove(t)}function u(e,t,n){var o=window.document.createElement(e);return t=t||"",n=n||"",o.className=t,void 0!==n&&(o.textContent=n),o}function p(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function h(e,t){return t(e)?e:e.parentNode?h(e.parentNode,t):void 0}function f(e,t){var n=u("div","numInputWrapper"),o=u("input","numInput "+e),i=u("span","arrowUp"),a=u("span","arrowDown");if(-1===navigator.userAgent.indexOf("MSIE 9.0")?o.type="number":(o.type="text",o.pattern="\\d*"),void 0!==t)for(var r in t)o.setAttribute(r,t[r]);return n.appendChild(o),n.appendChild(i),n.appendChild(a),n}function m(e){try{return"function"==typeof e.composedPath?e.composedPath()[0]:e.target}catch(t){return e.target}}var g=function(){},_=function(e,t,n){return n.months[t?"shorthand":"longhand"][e]},v={D:g,F:function(e,t,n){e.setMonth(n.months.longhand.indexOf(t))},G:function(e,t){e.setHours((e.getHours()>=12?12:0)+parseFloat(t))},H:function(e,t){e.setHours(parseFloat(t))},J:function(e,t){e.setDate(parseFloat(t))},K:function(e,t,n){e.setHours(e.getHours()%12+12*s(new RegExp(n.amPM[1],"i").test(t)))},M:function(e,t,n){e.setMonth(n.months.shorthand.indexOf(t))},S:function(e,t){e.setSeconds(parseFloat(t))},U:function(e,t){return new Date(1e3*parseFloat(t))},W:function(e,t,n){var o=parseInt(t),i=new Date(e.getFullYear(),0,2+7*(o-1),0,0,0,0);return i.setDate(i.getDate()-i.getDay()+n.firstDayOfWeek),i},Y:function(e,t){e.setFullYear(parseFloat(t))},Z:function(e,t){return new Date(t)},d:function(e,t){e.setDate(parseFloat(t))},h:function(e,t){e.setHours((e.getHours()>=12?12:0)+parseFloat(t))},i:function(e,t){e.setMinutes(parseFloat(t))},j:function(e,t){e.setDate(parseFloat(t))},l:g,m:function(e,t){e.setMonth(parseFloat(t)-1)},n:function(e,t){e.setMonth(parseFloat(t)-1)},s:function(e,t){e.setSeconds(parseFloat(t))},u:function(e,t){return new Date(parseFloat(t))},w:g,y:function(e,t){e.setFullYear(2e3+parseFloat(t))}},w={D:"",F:"",G:"(\\d\\d|\\d)",H:"(\\d\\d|\\d)",J:"(\\d\\d|\\d)\\w+",K:"",M:"",S:"(\\d\\d|\\d)",U:"(.+)",W:"(\\d\\d|\\d)",Y:"(\\d{4})",Z:"(.+)",d:"(\\d\\d|\\d)",h:"(\\d\\d|\\d)",i:"(\\d\\d|\\d)",j:"(\\d\\d|\\d)",l:"",m:"(\\d\\d|\\d)",n:"(\\d\\d|\\d)",s:"(\\d\\d|\\d)",u:"(.+)",w:"(\\d\\d|\\d)",y:"(\\d{2})"},y={Z:function(e){return e.toISOString()},D:function(e,t,n){return t.weekdays.shorthand[y.w(e,t,n)]},F:function(e,t,n){return _(y.n(e,t,n)-1,!1,t)},G:function(e,t,n){return r(y.h(e,t,n))},H:function(e){return r(e.getHours())},J:function(e,t){return void 0!==t.ordinal?e.getDate()+t.ordinal(e.getDate()):e.getDate()},K:function(e,t){return t.amPM[s(e.getHours()>11)]},M:function(e,t){return _(e.getMonth(),!0,t)},S:function(e){return r(e.getSeconds())},U:function(e){return e.getTime()/1e3},W:function(e,t,n){return n.getWeek(e)},Y:function(e){return r(e.getFullYear(),4)},d:function(e){return r(e.getDate())},h:function(e){return e.getHours()%12?e.getHours()%12:12},i:function(e){return r(e.getMinutes())},j:function(e){return e.getDate()},l:function(e,t){return t.weekdays.longhand[e.getDay()]},m:function(e){return r(e.getMonth()+1)},n:function(e){return e.getMonth()+1},s:function(e){return e.getSeconds()},u:function(e){return e.getTime()},w:function(e){return e.getDay()},y:function(e){return String(e.getFullYear()).substring(2)}},b=function(e){var t=e.config,n=void 0===t?o:t,a=e.l10n,r=void 0===a?i:a,s=e.isMobile,c=void 0!==s&&s;return function(e,t,o){var i=o||r;return void 0===n.formatDate||c?t.split("").map((function(t,o,a){return y[t]&&"\\"!==a[o-1]?y[t](e,i,n):"\\"!==t?t:""})).join(""):n.formatDate(e,t,i)}},C=function(e){var t=e.config,n=void 0===t?o:t,a=e.l10n,r=void 0===a?i:a;return function(e,t,i,a){if(0===e||e){var s,c=a||r,l=e;if(e instanceof Date)s=new Date(e.getTime());else if("string"!=typeof e&&void 0!==e.toFixed)s=new Date(e);else if("string"==typeof e){var d=t||(n||o).dateFormat,u=String(e).trim();if("today"===u)s=new Date,i=!0;else if(n&&n.parseDate)s=n.parseDate(e,d);else if(/Z$/.test(u)||/GMT$/.test(u))s=new Date(e);else{for(var p=void 0,h=[],f=0,m=0,g="";f<d.length;f++){var _=d[f],y="\\"===_,b="\\"===d[f-1]||y;if(w[_]&&!b){g+=w[_];var C=new RegExp(g).exec(e);C&&(p=!0)&&h["Y"!==_?"push":"unshift"]({fn:v[_],val:C[++m]})}else y||(g+=".")}s=n&&n.noCalendar?new Date((new Date).setHours(0,0,0,0)):new Date((new Date).getFullYear(),0,1,0,0,0,0),h.forEach((function(e){var t=e.fn,n=e.val;return s=t(s,n,c)||s})),s=p?s:void 0}}if(s instanceof Date&&!isNaN(s.getTime()))return!0===i&&s.setHours(0,0,0,0),s;n.errorHandler(new Error("Invalid date provided: "+l))}}};function x(e,t,n){return void 0===n&&(n=!0),!1!==n?new Date(e.getTime()).setHours(0,0,0,0)-new Date(t.getTime()).setHours(0,0,0,0):e.getTime()-t.getTime()}var D=function(e,t,n){return 3600*e+60*t+n};function k(e){var t=e.defaultHour,n=e.defaultMinute,o=e.defaultSeconds;if(void 0!==e.minDate){var i=e.minDate.getHours(),a=e.minDate.getMinutes(),r=e.minDate.getSeconds();t<i&&(t=i),t===i&&n<a&&(n=a),t===i&&n===a&&o<r&&(o=e.minDate.getSeconds())}if(void 0!==e.maxDate){var s=e.maxDate.getHours(),c=e.maxDate.getMinutes();(t=Math.min(t,s))===s&&(n=Math.min(c,n)),t===s&&n===c&&(o=e.maxDate.getSeconds())}return{hours:t,minutes:n,seconds:o}}n(895);var $=function(){return $=Object.assign||function(e){for(var t,n=1,o=arguments.length;n<o;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},$.apply(this,arguments)},A=function(){for(var e=0,t=0,n=arguments.length;t<n;t++)e+=arguments[t].length;var o=Array(e),i=0;for(t=0;t<n;t++)for(var a=arguments[t],r=0,s=a.length;r<s;r++,i++)o[i]=a[r];return o};function j(e,n){var i={config:$($({},o),E.defaultConfig),l10n:a};function g(){var e;return(null===(e=i.calendarContainer)||void 0===e?void 0:e.getRootNode()).activeElement||document.activeElement}function v(e){return e.bind(i)}function y(){var e=i.config;!1===e.weekNumbers&&1===e.showMonths||!0!==e.noCalendar&&window.requestAnimationFrame((function(){if(void 0!==i.calendarContainer&&(i.calendarContainer.style.visibility="hidden",i.calendarContainer.style.display="block"),void 0!==i.daysContainer){var t=(i.days.offsetWidth+1)*e.showMonths;i.daysContainer.style.width=t+"px",i.calendarContainer.style.width=t+(void 0!==i.weekWrapper?i.weekWrapper.offsetWidth:0)+"px",i.calendarContainer.style.removeProperty("visibility"),i.calendarContainer.style.removeProperty("display")}}))}function j(e){if(0===i.selectedDates.length){var t=void 0===i.config.minDate||x(new Date,i.config.minDate)>=0?new Date:new Date(i.config.minDate.getTime()),n=k(i.config);t.setHours(n.hours,n.minutes,n.seconds,t.getMilliseconds()),i.selectedDates=[t],i.latestSelectedDateObj=t}void 0!==e&&"blur"!==e.type&&function(e){e.preventDefault();var t="keydown"===e.type,n=m(e),o=n;void 0!==i.amPM&&n===i.amPM&&(i.amPM.textContent=i.l10n.amPM[s(i.amPM.textContent===i.l10n.amPM[0])]);var a=parseFloat(o.getAttribute("min")),c=parseFloat(o.getAttribute("max")),l=parseFloat(o.getAttribute("step")),d=parseInt(o.value,10),u=d+l*(e.delta||(t?38===e.which?1:-1:0));if(void 0!==o.value&&2===o.value.length){var p=o===i.hourElement,h=o===i.minuteElement;u<a?(u=c+u+s(!p)+(s(p)&&s(!i.amPM)),h&&W(void 0,-1,i.hourElement)):u>c&&(u=o===i.hourElement?u-c-s(!i.amPM):a,h&&W(void 0,1,i.hourElement)),i.amPM&&p&&(1===l?u+d===23:Math.abs(u-d)>l)&&(i.amPM.textContent=i.l10n.amPM[s(i.amPM.textContent===i.l10n.amPM[0])]),o.value=r(u)}}(e);var o=i._input.value;M(),Ce(),i._input.value!==o&&i._debouncedChange()}function M(){if(void 0!==i.hourElement&&void 0!==i.minuteElement){var e,t,n=(parseInt(i.hourElement.value.slice(-2),10)||0)%24,o=(parseInt(i.minuteElement.value,10)||0)%60,a=void 0!==i.secondElement?(parseInt(i.secondElement.value,10)||0)%60:0;void 0!==i.amPM&&(e=n,t=i.amPM.textContent,n=e%12+12*s(t===i.l10n.amPM[1]));var r=void 0!==i.config.minTime||i.config.minDate&&i.minDateHasTime&&i.latestSelectedDateObj&&0===x(i.latestSelectedDateObj,i.config.minDate,!0),c=void 0!==i.config.maxTime||i.config.maxDate&&i.maxDateHasTime&&i.latestSelectedDateObj&&0===x(i.latestSelectedDateObj,i.config.maxDate,!0);if(void 0!==i.config.maxTime&&void 0!==i.config.minTime&&i.config.minTime>i.config.maxTime){var l=D(i.config.minTime.getHours(),i.config.minTime.getMinutes(),i.config.minTime.getSeconds()),d=D(i.config.maxTime.getHours(),i.config.maxTime.getMinutes(),i.config.maxTime.getSeconds()),u=D(n,o,a);if(u>d&&u<l){var p=function(e){var t=Math.floor(e/3600),n=(e-3600*t)/60;return[t,n,e-3600*t-60*n]}(l);n=p[0],o=p[1],a=p[2]}}else{if(c){var h=void 0!==i.config.maxTime?i.config.maxTime:i.config.maxDate;(n=Math.min(n,h.getHours()))===h.getHours()&&(o=Math.min(o,h.getMinutes())),o===h.getMinutes()&&(a=Math.min(a,h.getSeconds()))}if(r){var f=void 0!==i.config.minTime?i.config.minTime:i.config.minDate;(n=Math.max(n,f.getHours()))===f.getHours()&&o<f.getMinutes()&&(o=f.getMinutes()),o===f.getMinutes()&&(a=Math.max(a,f.getSeconds()))}}T(n,o,a)}}function P(e){var t=e||i.latestSelectedDateObj;t&&t instanceof Date&&T(t.getHours(),t.getMinutes(),t.getSeconds())}function T(e,t,n){void 0!==i.latestSelectedDateObj&&i.latestSelectedDateObj.setHours(e%24,t,n||0,0),i.hourElement&&i.minuteElement&&!i.isMobile&&(i.hourElement.value=r(i.config.time_24hr?e:(12+e)%12+12*s(e%12==0)),i.minuteElement.value=r(t),void 0!==i.amPM&&(i.amPM.textContent=i.l10n.amPM[s(e>=12)]),void 0!==i.secondElement&&(i.secondElement.value=r(n)))}function S(e){var t=m(e),n=parseInt(t.value)+(e.delta||0);(n/1e3>1||"Enter"===e.key&&!/[^\d]/.test(n.toString()))&&X(n)}function O(e,t,n,o){return t instanceof Array?t.forEach((function(t){return O(e,t,n,o)})):e instanceof Array?e.forEach((function(e){return O(e,t,n,o)})):(e.addEventListener(t,n,o),void i._handlers.push({remove:function(){return e.removeEventListener(t,n,o)}}))}function I(){_e("onChange")}function L(e,t){var n=void 0!==e?i.parseDate(e):i.latestSelectedDateObj||(i.config.minDate&&i.config.minDate>i.now?i.config.minDate:i.config.maxDate&&i.config.maxDate<i.now?i.config.maxDate:i.now),o=i.currentYear,a=i.currentMonth;try{void 0!==n&&(i.currentYear=n.getFullYear(),i.currentMonth=n.getMonth())}catch(e){e.message="Invalid date supplied: "+n,i.config.errorHandler(e)}t&&i.currentYear!==o&&(_e("onYearChange"),z()),!t||i.currentYear===o&&i.currentMonth===a||_e("onMonthChange"),i.redraw()}function H(e){var t=m(e);~t.className.indexOf("arrow")&&W(e,t.classList.contains("arrowUp")?1:-1)}function W(e,t,n){var o=e&&m(e),i=n||o&&o.parentNode&&o.parentNode.firstChild,a=ve("increment");a.delta=t,i&&i.dispatchEvent(a)}function N(e,t,n,o){var a=ee(t,!0),r=u("span",e,t.getDate().toString());return r.dateObj=t,r.$i=o,r.setAttribute("aria-label",i.formatDate(t,i.config.ariaDateFormat)),-1===e.indexOf("hidden")&&0===x(t,i.now)&&(i.todayDateElem=r,r.classList.add("today"),r.setAttribute("aria-current","date")),a?(r.tabIndex=-1,we(t)&&(r.classList.add("selected"),i.selectedDateElem=r,"range"===i.config.mode&&(d(r,"startRange",i.selectedDates[0]&&0===x(t,i.selectedDates[0],!0)),d(r,"endRange",i.selectedDates[1]&&0===x(t,i.selectedDates[1],!0)),"nextMonthDay"===e&&r.classList.add("inRange")))):r.classList.add("flatpickr-disabled"),"range"===i.config.mode&&function(e){return!("range"!==i.config.mode||i.selectedDates.length<2)&&x(e,i.selectedDates[0])>=0&&x(e,i.selectedDates[1])<=0}(t)&&!we(t)&&r.classList.add("inRange"),i.weekNumbers&&1===i.config.showMonths&&"prevMonthDay"!==e&&o%7==6&&i.weekNumbers.insertAdjacentHTML("beforeend","<span class='flatpickr-day'>"+i.config.getWeek(t)+"</span>"),_e("onDayCreate",r),r}function F(e){e.focus(),"range"===i.config.mode&&ie(e)}function Y(e){for(var t=e>0?0:i.config.showMonths-1,n=e>0?i.config.showMonths:-1,o=t;o!=n;o+=e)for(var a=i.daysContainer.children[o],r=e>0?0:a.children.length-1,s=e>0?a.children.length:-1,c=r;c!=s;c+=e){var l=a.children[c];if(-1===l.className.indexOf("hidden")&&ee(l.dateObj))return l}}function B(e,t){var n=g(),o=te(n||document.body),a=void 0!==e?e:o?n:void 0!==i.selectedDateElem&&te(i.selectedDateElem)?i.selectedDateElem:void 0!==i.todayDateElem&&te(i.todayDateElem)?i.todayDateElem:Y(t>0?1:-1);void 0===a?i._input.focus():o?function(e,t){for(var n=-1===e.className.indexOf("Month")?e.dateObj.getMonth():i.currentMonth,o=t>0?i.config.showMonths:-1,a=t>0?1:-1,r=n-i.currentMonth;r!=o;r+=a)for(var s=i.daysContainer.children[r],c=n-i.currentMonth===r?e.$i+t:t<0?s.children.length-1:0,l=s.children.length,d=c;d>=0&&d<l&&d!=(t>0?l:-1);d+=a){var u=s.children[d];if(-1===u.className.indexOf("hidden")&&ee(u.dateObj)&&Math.abs(e.$i-d)>=Math.abs(t))return F(u)}i.changeMonth(a),B(Y(a),0)}(a,t):F(a)}function R(e,t){for(var n=(new Date(e,t,1).getDay()-i.l10n.firstDayOfWeek+7)%7,o=i.utils.getDaysInMonth((t-1+12)%12,e),a=i.utils.getDaysInMonth(t,e),r=window.document.createDocumentFragment(),s=i.config.showMonths>1,c=s?"prevMonthDay hidden":"prevMonthDay",l=s?"nextMonthDay hidden":"nextMonthDay",d=o+1-n,p=0;d<=o;d++,p++)r.appendChild(N("flatpickr-day "+c,new Date(e,t-1,d),0,p));for(d=1;d<=a;d++,p++)r.appendChild(N("flatpickr-day",new Date(e,t,d),0,p));for(var h=a+1;h<=42-n&&(1===i.config.showMonths||p%7!=0);h++,p++)r.appendChild(N("flatpickr-day "+l,new Date(e,t+1,h%a),0,p));var f=u("div","dayContainer");return f.appendChild(r),f}function q(){if(void 0!==i.daysContainer){p(i.daysContainer),i.weekNumbers&&p(i.weekNumbers);for(var e=document.createDocumentFragment(),t=0;t<i.config.showMonths;t++){var n=new Date(i.currentYear,i.currentMonth,1);n.setMonth(i.currentMonth+t),e.appendChild(R(n.getFullYear(),n.getMonth()))}i.daysContainer.appendChild(e),i.days=i.daysContainer.firstChild,"range"===i.config.mode&&1===i.selectedDates.length&&ie()}}function z(){if(!(i.config.showMonths>1||"dropdown"!==i.config.monthSelectorType)){var e=function(e){return!(void 0!==i.config.minDate&&i.currentYear===i.config.minDate.getFullYear()&&e<i.config.minDate.getMonth()||void 0!==i.config.maxDate&&i.currentYear===i.config.maxDate.getFullYear()&&e>i.config.maxDate.getMonth())};i.monthsDropdownContainer.tabIndex=-1,i.monthsDropdownContainer.innerHTML="";for(var t=0;t<12;t++)if(e(t)){var n=u("option","flatpickr-monthDropdown-month");n.value=new Date(i.currentYear,t).getMonth().toString(),n.textContent=_(t,i.config.shorthandCurrentMonth,i.l10n),n.tabIndex=-1,i.currentMonth===t&&(n.selected=!0),i.monthsDropdownContainer.appendChild(n)}}}function U(){var e,t=u("div","flatpickr-month"),n=window.document.createDocumentFragment();i.config.showMonths>1||"static"===i.config.monthSelectorType?e=u("span","cur-month"):(i.monthsDropdownContainer=u("select","flatpickr-monthDropdown-months"),i.monthsDropdownContainer.setAttribute("aria-label",i.l10n.monthAriaLabel),O(i.monthsDropdownContainer,"change",(function(e){var t=m(e),n=parseInt(t.value,10);i.changeMonth(n-i.currentMonth),_e("onMonthChange")})),z(),e=i.monthsDropdownContainer);var o=f("cur-year",{tabindex:"-1"}),a=o.getElementsByTagName("input")[0];a.setAttribute("aria-label",i.l10n.yearAriaLabel),i.config.minDate&&a.setAttribute("min",i.config.minDate.getFullYear().toString()),i.config.maxDate&&(a.setAttribute("max",i.config.maxDate.getFullYear().toString()),a.disabled=!!i.config.minDate&&i.config.minDate.getFullYear()===i.config.maxDate.getFullYear());var r=u("div","flatpickr-current-month");return r.appendChild(e),r.appendChild(o),n.appendChild(r),t.appendChild(n),{container:t,yearElement:a,monthElement:e}}function K(){p(i.monthNav),i.monthNav.appendChild(i.prevMonthNav),i.config.showMonths&&(i.yearElements=[],i.monthElements=[]);for(var e=i.config.showMonths;e--;){var t=U();i.yearElements.push(t.yearElement),i.monthElements.push(t.monthElement),i.monthNav.appendChild(t.container)}i.monthNav.appendChild(i.nextMonthNav)}function V(){i.weekdayContainer?p(i.weekdayContainer):i.weekdayContainer=u("div","flatpickr-weekdays");for(var e=i.config.showMonths;e--;){var t=u("div","flatpickr-weekdaycontainer");i.weekdayContainer.appendChild(t)}return Q(),i.weekdayContainer}function Q(){if(i.weekdayContainer){var e=i.l10n.firstDayOfWeek,t=A(i.l10n.weekdays.shorthand);e>0&&e<t.length&&(t=A(t.splice(e,t.length),t.splice(0,e)));for(var n=i.config.showMonths;n--;)i.weekdayContainer.children[n].innerHTML="\n      <span class='flatpickr-weekday'>\n        "+t.join("</span><span class='flatpickr-weekday'>")+"\n      </span>\n      "}}function G(e,t){void 0===t&&(t=!0);var n=t?e:e-i.currentMonth;n<0&&!0===i._hidePrevMonthArrow||n>0&&!0===i._hideNextMonthArrow||(i.currentMonth+=n,(i.currentMonth<0||i.currentMonth>11)&&(i.currentYear+=i.currentMonth>11?1:-1,i.currentMonth=(i.currentMonth+12)%12,_e("onYearChange"),z()),q(),_e("onMonthChange"),ye())}function J(e){return i.calendarContainer.contains(e)}function Z(e){if(i.isOpen&&!i.config.inline){var t=m(e),n=J(t),o=!(t===i.input||t===i.altInput||i.element.contains(t)||e.path&&e.path.indexOf&&(~e.path.indexOf(i.input)||~e.path.indexOf(i.altInput))||n||J(e.relatedTarget)),a=!i.config.ignoredFocusElements.some((function(e){return e.contains(t)}));o&&a&&(i.config.allowInput&&i.setDate(i._input.value,!1,i.config.altInput?i.config.altFormat:i.config.dateFormat),void 0!==i.timeContainer&&void 0!==i.minuteElement&&void 0!==i.hourElement&&""!==i.input.value&&void 0!==i.input.value&&j(),i.close(),i.config&&"range"===i.config.mode&&1===i.selectedDates.length&&i.clear(!1))}}function X(e){if(!(!e||i.config.minDate&&e<i.config.minDate.getFullYear()||i.config.maxDate&&e>i.config.maxDate.getFullYear())){var t=e,n=i.currentYear!==t;i.currentYear=t||i.currentYear,i.config.maxDate&&i.currentYear===i.config.maxDate.getFullYear()?i.currentMonth=Math.min(i.config.maxDate.getMonth(),i.currentMonth):i.config.minDate&&i.currentYear===i.config.minDate.getFullYear()&&(i.currentMonth=Math.max(i.config.minDate.getMonth(),i.currentMonth)),n&&(i.redraw(),_e("onYearChange"),z())}}function ee(e,t){var n;void 0===t&&(t=!0);var o=i.parseDate(e,void 0,t);if(i.config.minDate&&o&&x(o,i.config.minDate,void 0!==t?t:!i.minDateHasTime)<0||i.config.maxDate&&o&&x(o,i.config.maxDate,void 0!==t?t:!i.maxDateHasTime)>0)return!1;if(!i.config.enable&&0===i.config.disable.length)return!0;if(void 0===o)return!1;for(var a=!!i.config.enable,r=null!==(n=i.config.enable)&&void 0!==n?n:i.config.disable,s=0,c=void 0;s<r.length;s++){if("function"==typeof(c=r[s])&&c(o))return a;if(c instanceof Date&&void 0!==o&&c.getTime()===o.getTime())return a;if("string"==typeof c){var l=i.parseDate(c,void 0,!0);return l&&l.getTime()===o.getTime()?a:!a}if("object"==typeof c&&void 0!==o&&c.from&&c.to&&o.getTime()>=c.from.getTime()&&o.getTime()<=c.to.getTime())return a}return!a}function te(e){return void 0!==i.daysContainer&&-1===e.className.indexOf("hidden")&&-1===e.className.indexOf("flatpickr-disabled")&&i.daysContainer.contains(e)}function ne(e){var t=e.target===i._input,n=i._input.value.trimEnd()!==be();!t||!n||e.relatedTarget&&J(e.relatedTarget)||i.setDate(i._input.value,!0,e.target===i.altInput?i.config.altFormat:i.config.dateFormat)}function oe(t){var n=m(t),o=i.config.wrap?e.contains(n):n===i._input,a=i.config.allowInput,r=i.isOpen&&(!a||!o),s=i.config.inline&&o&&!a;if(13===t.keyCode&&o){if(a)return i.setDate(i._input.value,!0,n===i.altInput?i.config.altFormat:i.config.dateFormat),i.close(),n.blur();i.open()}else if(J(n)||r||s){var c=!!i.timeContainer&&i.timeContainer.contains(n);switch(t.keyCode){case 13:c?(t.preventDefault(),j(),ue()):pe(t);break;case 27:t.preventDefault(),ue();break;case 8:case 46:o&&!i.config.allowInput&&(t.preventDefault(),i.clear());break;case 37:case 39:if(c||o)i.hourElement&&i.hourElement.focus();else{t.preventDefault();var l=g();if(void 0!==i.daysContainer&&(!1===a||l&&te(l))){var d=39===t.keyCode?1:-1;t.ctrlKey?(t.stopPropagation(),G(d),B(Y(1),0)):B(void 0,d)}}break;case 38:case 40:t.preventDefault();var u=40===t.keyCode?1:-1;i.daysContainer&&void 0!==n.$i||n===i.input||n===i.altInput?t.ctrlKey?(t.stopPropagation(),X(i.currentYear-u),B(Y(1),0)):c||B(void 0,7*u):n===i.currentYearElement?X(i.currentYear-u):i.config.enableTime&&(!c&&i.hourElement&&i.hourElement.focus(),j(t),i._debouncedChange());break;case 9:if(c){var p=[i.hourElement,i.minuteElement,i.secondElement,i.amPM].concat(i.pluginElements).filter((function(e){return e})),h=p.indexOf(n);if(-1!==h){var f=p[h+(t.shiftKey?-1:1)];t.preventDefault(),(f||i._input).focus()}}else!i.config.noCalendar&&i.daysContainer&&i.daysContainer.contains(n)&&t.shiftKey&&(t.preventDefault(),i._input.focus())}}if(void 0!==i.amPM&&n===i.amPM)switch(t.key){case i.l10n.amPM[0].charAt(0):case i.l10n.amPM[0].charAt(0).toLowerCase():i.amPM.textContent=i.l10n.amPM[0],M(),Ce();break;case i.l10n.amPM[1].charAt(0):case i.l10n.amPM[1].charAt(0).toLowerCase():i.amPM.textContent=i.l10n.amPM[1],M(),Ce()}(o||J(n))&&_e("onKeyDown",t)}function ie(e,t){if(void 0===t&&(t="flatpickr-day"),1===i.selectedDates.length&&(!e||e.classList.contains(t)&&!e.classList.contains("flatpickr-disabled"))){for(var n=e?e.dateObj.getTime():i.days.firstElementChild.dateObj.getTime(),o=i.parseDate(i.selectedDates[0],void 0,!0).getTime(),a=Math.min(n,i.selectedDates[0].getTime()),r=Math.max(n,i.selectedDates[0].getTime()),s=!1,c=0,l=0,d=a;d<r;d+=864e5)ee(new Date(d),!0)||(s=s||d>a&&d<r,d<o&&(!c||d>c)?c=d:d>o&&(!l||d<l)&&(l=d));Array.from(i.rContainer.querySelectorAll("*:nth-child(-n+"+i.config.showMonths+") > ."+t)).forEach((function(t){var a,r,d,u=t.dateObj.getTime(),p=c>0&&u<c||l>0&&u>l;if(p)return t.classList.add("notAllowed"),void["inRange","startRange","endRange"].forEach((function(e){t.classList.remove(e)}));s&&!p||(["startRange","inRange","endRange","notAllowed"].forEach((function(e){t.classList.remove(e)})),void 0!==e&&(e.classList.add(n<=i.selectedDates[0].getTime()?"startRange":"endRange"),o<n&&u===o?t.classList.add("startRange"):o>n&&u===o&&t.classList.add("endRange"),u>=c&&(0===l||u<=l)&&(r=o,d=n,(a=u)>Math.min(r,d)&&a<Math.max(r,d))&&t.classList.add("inRange")))}))}}function ae(){!i.isOpen||i.config.static||i.config.inline||le()}function re(e){return function(t){var n=i.config["_"+e+"Date"]=i.parseDate(t,i.config.dateFormat),o=i.config["_"+("min"===e?"max":"min")+"Date"];void 0!==n&&(i["min"===e?"minDateHasTime":"maxDateHasTime"]=n.getHours()>0||n.getMinutes()>0||n.getSeconds()>0),i.selectedDates&&(i.selectedDates=i.selectedDates.filter((function(e){return ee(e)})),i.selectedDates.length||"min"!==e||P(n),Ce()),i.daysContainer&&(de(),void 0!==n?i.currentYearElement[e]=n.getFullYear().toString():i.currentYearElement.removeAttribute(e),i.currentYearElement.disabled=!!o&&void 0!==n&&o.getFullYear()===n.getFullYear())}}function se(){return i.config.wrap?e.querySelector("[data-input]"):e}function ce(){"object"!=typeof i.config.locale&&void 0===E.l10ns[i.config.locale]&&i.config.errorHandler(new Error("flatpickr: invalid locale "+i.config.locale)),i.l10n=$($({},E.l10ns.default),"object"==typeof i.config.locale?i.config.locale:"default"!==i.config.locale?E.l10ns[i.config.locale]:void 0),w.D="("+i.l10n.weekdays.shorthand.join("|")+")",w.l="("+i.l10n.weekdays.longhand.join("|")+")",w.M="("+i.l10n.months.shorthand.join("|")+")",w.F="("+i.l10n.months.longhand.join("|")+")",w.K="("+i.l10n.amPM[0]+"|"+i.l10n.amPM[1]+"|"+i.l10n.amPM[0].toLowerCase()+"|"+i.l10n.amPM[1].toLowerCase()+")",void 0===$($({},n),JSON.parse(JSON.stringify(e.dataset||{}))).time_24hr&&void 0===E.defaultConfig.time_24hr&&(i.config.time_24hr=i.l10n.time_24hr),i.formatDate=b(i),i.parseDate=C({config:i.config,l10n:i.l10n})}function le(e){if("function"!=typeof i.config.position){if(void 0!==i.calendarContainer){_e("onPreCalendarPosition");var t=e||i._positionElement,n=Array.prototype.reduce.call(i.calendarContainer.children,(function(e,t){return e+t.offsetHeight}),0),o=i.calendarContainer.offsetWidth,a=i.config.position.split(" "),r=a[0],s=a.length>1?a[1]:null,c=t.getBoundingClientRect(),l=window.innerHeight-c.bottom,u="above"===r||"below"!==r&&l<n&&c.top>n,p=window.pageYOffset+c.top+(u?-n-2:t.offsetHeight+2);if(d(i.calendarContainer,"arrowTop",!u),d(i.calendarContainer,"arrowBottom",u),!i.config.inline){var h=window.pageXOffset+c.left,f=!1,m=!1;"center"===s?(h-=(o-c.width)/2,f=!0):"right"===s&&(h-=o-c.width,m=!0),d(i.calendarContainer,"arrowLeft",!f&&!m),d(i.calendarContainer,"arrowCenter",f),d(i.calendarContainer,"arrowRight",m);var g=window.document.body.offsetWidth-(window.pageXOffset+c.right),_=h+o>window.document.body.offsetWidth,v=g+o>window.document.body.offsetWidth;if(d(i.calendarContainer,"rightMost",_),!i.config.static)if(i.calendarContainer.style.top=p+"px",_)if(v){var w=function(){for(var e=null,t=0;t<document.styleSheets.length;t++){var n=document.styleSheets[t];if(n.cssRules){try{n.cssRules}catch(e){continue}e=n;break}}return null!=e?e:(o=document.createElement("style"),document.head.appendChild(o),o.sheet);var o}();if(void 0===w)return;var y=window.document.body.offsetWidth,b=Math.max(0,y/2-o/2),C=w.cssRules.length,x="{left:"+c.left+"px;right:auto;}";d(i.calendarContainer,"rightMost",!1),d(i.calendarContainer,"centerMost",!0),w.insertRule(".flatpickr-calendar.centerMost:before,.flatpickr-calendar.centerMost:after"+x,C),i.calendarContainer.style.left=b+"px",i.calendarContainer.style.right="auto"}else i.calendarContainer.style.left="auto",i.calendarContainer.style.right=g+"px";else i.calendarContainer.style.left=h+"px",i.calendarContainer.style.right="auto"}}}else i.config.position(i,e)}function de(){i.config.noCalendar||i.isMobile||(z(),ye(),q())}function ue(){i._input.focus(),-1!==window.navigator.userAgent.indexOf("MSIE")||void 0!==navigator.msMaxTouchPoints?setTimeout(i.close,0):i.close()}function pe(e){e.preventDefault(),e.stopPropagation();var t=h(m(e),(function(e){return e.classList&&e.classList.contains("flatpickr-day")&&!e.classList.contains("flatpickr-disabled")&&!e.classList.contains("notAllowed")}));if(void 0!==t){var n=t,o=i.latestSelectedDateObj=new Date(n.dateObj.getTime()),a=(o.getMonth()<i.currentMonth||o.getMonth()>i.currentMonth+i.config.showMonths-1)&&"range"!==i.config.mode;if(i.selectedDateElem=n,"single"===i.config.mode)i.selectedDates=[o];else if("multiple"===i.config.mode){var r=we(o);r?i.selectedDates.splice(parseInt(r),1):i.selectedDates.push(o)}else"range"===i.config.mode&&(2===i.selectedDates.length&&i.clear(!1,!1),i.latestSelectedDateObj=o,i.selectedDates.push(o),0!==x(o,i.selectedDates[0],!0)&&i.selectedDates.sort((function(e,t){return e.getTime()-t.getTime()})));if(M(),a){var s=i.currentYear!==o.getFullYear();i.currentYear=o.getFullYear(),i.currentMonth=o.getMonth(),s&&(_e("onYearChange"),z()),_e("onMonthChange")}if(ye(),q(),Ce(),a||"range"===i.config.mode||1!==i.config.showMonths?void 0!==i.selectedDateElem&&void 0===i.hourElement&&i.selectedDateElem&&i.selectedDateElem.focus():F(n),void 0!==i.hourElement&&void 0!==i.hourElement&&i.hourElement.focus(),i.config.closeOnSelect){var c="single"===i.config.mode&&!i.config.enableTime,l="range"===i.config.mode&&2===i.selectedDates.length&&!i.config.enableTime;(c||l)&&ue()}I()}}i.parseDate=C({config:i.config,l10n:i.l10n}),i._handlers=[],i.pluginElements=[],i.loadedPlugins=[],i._bind=O,i._setHoursFromDate=P,i._positionCalendar=le,i.changeMonth=G,i.changeYear=X,i.clear=function(e,t){if(void 0===e&&(e=!0),void 0===t&&(t=!0),i.input.value="",void 0!==i.altInput&&(i.altInput.value=""),void 0!==i.mobileInput&&(i.mobileInput.value=""),i.selectedDates=[],i.latestSelectedDateObj=void 0,!0===t&&(i.currentYear=i._initialDate.getFullYear(),i.currentMonth=i._initialDate.getMonth()),!0===i.config.enableTime){var n=k(i.config);T(n.hours,n.minutes,n.seconds)}i.redraw(),e&&_e("onChange")},i.close=function(){i.isOpen=!1,i.isMobile||(void 0!==i.calendarContainer&&i.calendarContainer.classList.remove("open"),void 0!==i._input&&i._input.classList.remove("active")),_e("onClose")},i.onMouseOver=ie,i._createElement=u,i.createDay=N,i.destroy=function(){void 0!==i.config&&_e("onDestroy");for(var e=i._handlers.length;e--;)i._handlers[e].remove();if(i._handlers=[],i.mobileInput)i.mobileInput.parentNode&&i.mobileInput.parentNode.removeChild(i.mobileInput),i.mobileInput=void 0;else if(i.calendarContainer&&i.calendarContainer.parentNode)if(i.config.static&&i.calendarContainer.parentNode){var t=i.calendarContainer.parentNode;if(t.lastChild&&t.removeChild(t.lastChild),t.parentNode){for(;t.firstChild;)t.parentNode.insertBefore(t.firstChild,t);t.parentNode.removeChild(t)}}else i.calendarContainer.parentNode.removeChild(i.calendarContainer);i.altInput&&(i.input.type="text",i.altInput.parentNode&&i.altInput.parentNode.removeChild(i.altInput),delete i.altInput),i.input&&(i.input.type=i.input._type,i.input.classList.remove("flatpickr-input"),i.input.removeAttribute("readonly")),["_showTimeInput","latestSelectedDateObj","_hideNextMonthArrow","_hidePrevMonthArrow","__hideNextMonthArrow","__hidePrevMonthArrow","isMobile","isOpen","selectedDateElem","minDateHasTime","maxDateHasTime","days","daysContainer","_input","_positionElement","innerContainer","rContainer","monthNav","todayDateElem","calendarContainer","weekdayContainer","prevMonthNav","nextMonthNav","monthsDropdownContainer","currentMonthElement","currentYearElement","navigationCurrentMonth","selectedDateElem","config"].forEach((function(e){try{delete i[e]}catch(e){}}))},i.isEnabled=ee,i.jumpToDate=L,i.updateValue=Ce,i.open=function(e,t){if(void 0===t&&(t=i._positionElement),!0===i.isMobile){if(e){e.preventDefault();var n=m(e);n&&n.blur()}return void 0!==i.mobileInput&&(i.mobileInput.focus(),i.mobileInput.click()),void _e("onOpen")}if(!i._input.disabled&&!i.config.inline){var o=i.isOpen;i.isOpen=!0,o||(i.calendarContainer.classList.add("open"),i._input.classList.add("active"),_e("onOpen"),le(t)),!0===i.config.enableTime&&!0===i.config.noCalendar&&(!1!==i.config.allowInput||void 0!==e&&i.timeContainer.contains(e.relatedTarget)||setTimeout((function(){return i.hourElement.select()}),50))}},i.redraw=de,i.set=function(e,n){if(null!==e&&"object"==typeof e)for(var o in Object.assign(i.config,e),e)void 0!==he[o]&&he[o].forEach((function(e){return e()}));else i.config[e]=n,void 0!==he[e]?he[e].forEach((function(e){return e()})):t.indexOf(e)>-1&&(i.config[e]=l(n));i.redraw(),Ce(!0)},i.setDate=function(e,t,n){if(void 0===t&&(t=!1),void 0===n&&(n=i.config.dateFormat),0!==e&&!e||e instanceof Array&&0===e.length)return i.clear(t);fe(e,n),i.latestSelectedDateObj=i.selectedDates[i.selectedDates.length-1],i.redraw(),L(void 0,t),P(),0===i.selectedDates.length&&i.clear(!1),Ce(t),t&&_e("onChange")},i.toggle=function(e){if(!0===i.isOpen)return i.close();i.open(e)};var he={locale:[ce,Q],showMonths:[K,y,V],minDate:[L],maxDate:[L],positionElement:[ge],clickOpens:[function(){!0===i.config.clickOpens?(O(i._input,"focus",i.open),O(i._input,"click",i.open)):(i._input.removeEventListener("focus",i.open),i._input.removeEventListener("click",i.open))}]};function fe(e,t){var n=[];if(e instanceof Array)n=e.map((function(e){return i.parseDate(e,t)}));else if(e instanceof Date||"number"==typeof e)n=[i.parseDate(e,t)];else if("string"==typeof e)switch(i.config.mode){case"single":case"time":n=[i.parseDate(e,t)];break;case"multiple":n=e.split(i.config.conjunction).map((function(e){return i.parseDate(e,t)}));break;case"range":n=e.split(i.l10n.rangeSeparator).map((function(e){return i.parseDate(e,t)}))}else i.config.errorHandler(new Error("Invalid date supplied: "+JSON.stringify(e)));i.selectedDates=i.config.allowInvalidPreload?n:n.filter((function(e){return e instanceof Date&&ee(e,!1)})),"range"===i.config.mode&&i.selectedDates.sort((function(e,t){return e.getTime()-t.getTime()}))}function me(e){return e.slice().map((function(e){return"string"==typeof e||"number"==typeof e||e instanceof Date?i.parseDate(e,void 0,!0):e&&"object"==typeof e&&e.from&&e.to?{from:i.parseDate(e.from,void 0),to:i.parseDate(e.to,void 0)}:e})).filter((function(e){return e}))}function ge(){i._positionElement=i.config.positionElement||i._input}function _e(e,t){if(void 0!==i.config){var n=i.config[e];if(void 0!==n&&n.length>0)for(var o=0;n[o]&&o<n.length;o++)n[o](i.selectedDates,i.input.value,i,t);"onChange"===e&&(i.input.dispatchEvent(ve("change")),i.input.dispatchEvent(ve("input")))}}function ve(e){var t=document.createEvent("Event");return t.initEvent(e,!0,!0),t}function we(e){for(var t=0;t<i.selectedDates.length;t++){var n=i.selectedDates[t];if(n instanceof Date&&0===x(n,e))return""+t}return!1}function ye(){i.config.noCalendar||i.isMobile||!i.monthNav||(i.yearElements.forEach((function(e,t){var n=new Date(i.currentYear,i.currentMonth,1);n.setMonth(i.currentMonth+t),i.config.showMonths>1||"static"===i.config.monthSelectorType?i.monthElements[t].textContent=_(n.getMonth(),i.config.shorthandCurrentMonth,i.l10n)+" ":i.monthsDropdownContainer.value=n.getMonth().toString(),e.value=n.getFullYear().toString()})),i._hidePrevMonthArrow=void 0!==i.config.minDate&&(i.currentYear===i.config.minDate.getFullYear()?i.currentMonth<=i.config.minDate.getMonth():i.currentYear<i.config.minDate.getFullYear()),i._hideNextMonthArrow=void 0!==i.config.maxDate&&(i.currentYear===i.config.maxDate.getFullYear()?i.currentMonth+1>i.config.maxDate.getMonth():i.currentYear>i.config.maxDate.getFullYear()))}function be(e){var t=e||(i.config.altInput?i.config.altFormat:i.config.dateFormat);return i.selectedDates.map((function(e){return i.formatDate(e,t)})).filter((function(e,t,n){return"range"!==i.config.mode||i.config.enableTime||n.indexOf(e)===t})).join("range"!==i.config.mode?i.config.conjunction:i.l10n.rangeSeparator)}function Ce(e){void 0===e&&(e=!0),void 0!==i.mobileInput&&i.mobileFormatStr&&(i.mobileInput.value=void 0!==i.latestSelectedDateObj?i.formatDate(i.latestSelectedDateObj,i.mobileFormatStr):""),i.input.value=be(i.config.dateFormat),void 0!==i.altInput&&(i.altInput.value=be(i.config.altFormat)),!1!==e&&_e("onValueUpdate")}function xe(e){var t=m(e),n=i.prevMonthNav.contains(t),o=i.nextMonthNav.contains(t);n||o?G(n?-1:1):i.yearElements.indexOf(t)>=0?t.select():t.classList.contains("arrowUp")?i.changeYear(i.currentYear+1):t.classList.contains("arrowDown")&&i.changeYear(i.currentYear-1)}return function(){i.element=i.input=e,i.isOpen=!1,function(){var a=["wrap","weekNumbers","allowInput","allowInvalidPreload","clickOpens","time_24hr","enableTime","noCalendar","altInput","shorthandCurrentMonth","inline","static","enableSeconds","disableMobile"],r=$($({},JSON.parse(JSON.stringify(e.dataset||{}))),n),s={};i.config.parseDate=r.parseDate,i.config.formatDate=r.formatDate,Object.defineProperty(i.config,"enable",{get:function(){return i.config._enable},set:function(e){i.config._enable=me(e)}}),Object.defineProperty(i.config,"disable",{get:function(){return i.config._disable},set:function(e){i.config._disable=me(e)}});var c="time"===r.mode;if(!r.dateFormat&&(r.enableTime||c)){var d=E.defaultConfig.dateFormat||o.dateFormat;s.dateFormat=r.noCalendar||c?"H:i"+(r.enableSeconds?":S":""):d+" H:i"+(r.enableSeconds?":S":"")}if(r.altInput&&(r.enableTime||c)&&!r.altFormat){var u=E.defaultConfig.altFormat||o.altFormat;s.altFormat=r.noCalendar||c?"h:i"+(r.enableSeconds?":S K":" K"):u+" h:i"+(r.enableSeconds?":S":"")+" K"}Object.defineProperty(i.config,"minDate",{get:function(){return i.config._minDate},set:re("min")}),Object.defineProperty(i.config,"maxDate",{get:function(){return i.config._maxDate},set:re("max")});var p=function(e){return function(t){i.config["min"===e?"_minTime":"_maxTime"]=i.parseDate(t,"H:i:S")}};Object.defineProperty(i.config,"minTime",{get:function(){return i.config._minTime},set:p("min")}),Object.defineProperty(i.config,"maxTime",{get:function(){return i.config._maxTime},set:p("max")}),"time"===r.mode&&(i.config.noCalendar=!0,i.config.enableTime=!0),Object.assign(i.config,s,r);for(var h=0;h<a.length;h++)i.config[a[h]]=!0===i.config[a[h]]||"true"===i.config[a[h]];for(t.filter((function(e){return void 0!==i.config[e]})).forEach((function(e){i.config[e]=l(i.config[e]||[]).map(v)})),i.isMobile=!i.config.disableMobile&&!i.config.inline&&"single"===i.config.mode&&!i.config.disable.length&&!i.config.enable&&!i.config.weekNumbers&&/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),h=0;h<i.config.plugins.length;h++){var f=i.config.plugins[h](i)||{};for(var m in f)t.indexOf(m)>-1?i.config[m]=l(f[m]).map(v).concat(i.config[m]):void 0===r[m]&&(i.config[m]=f[m])}r.altInputClass||(i.config.altInputClass=se().className+" "+i.config.altInputClass),_e("onParseConfig")}(),ce(),i.input=se(),i.input?(i.input._type=i.input.type,i.input.type="text",i.input.classList.add("flatpickr-input"),i._input=i.input,i.config.altInput&&(i.altInput=u(i.input.nodeName,i.config.altInputClass),i._input=i.altInput,i.altInput.placeholder=i.input.placeholder,i.altInput.disabled=i.input.disabled,i.altInput.required=i.input.required,i.altInput.tabIndex=i.input.tabIndex,i.altInput.type="text",i.input.setAttribute("type","hidden"),!i.config.static&&i.input.parentNode&&i.input.parentNode.insertBefore(i.altInput,i.input.nextSibling)),i.config.allowInput||i._input.setAttribute("readonly","readonly"),ge()):i.config.errorHandler(new Error("Invalid input element specified")),function(){i.selectedDates=[],i.now=i.parseDate(i.config.now)||new Date;var e=i.config.defaultDate||("INPUT"!==i.input.nodeName&&"TEXTAREA"!==i.input.nodeName||!i.input.placeholder||i.input.value!==i.input.placeholder?i.input.value:null);e&&fe(e,i.config.dateFormat),i._initialDate=i.selectedDates.length>0?i.selectedDates[0]:i.config.minDate&&i.config.minDate.getTime()>i.now.getTime()?i.config.minDate:i.config.maxDate&&i.config.maxDate.getTime()<i.now.getTime()?i.config.maxDate:i.now,i.currentYear=i._initialDate.getFullYear(),i.currentMonth=i._initialDate.getMonth(),i.selectedDates.length>0&&(i.latestSelectedDateObj=i.selectedDates[0]),void 0!==i.config.minTime&&(i.config.minTime=i.parseDate(i.config.minTime,"H:i")),void 0!==i.config.maxTime&&(i.config.maxTime=i.parseDate(i.config.maxTime,"H:i")),i.minDateHasTime=!!i.config.minDate&&(i.config.minDate.getHours()>0||i.config.minDate.getMinutes()>0||i.config.minDate.getSeconds()>0),i.maxDateHasTime=!!i.config.maxDate&&(i.config.maxDate.getHours()>0||i.config.maxDate.getMinutes()>0||i.config.maxDate.getSeconds()>0)}(),i.utils={getDaysInMonth:function(e,t){return void 0===e&&(e=i.currentMonth),void 0===t&&(t=i.currentYear),1===e&&(t%4==0&&t%100!=0||t%400==0)?29:i.l10n.daysInMonth[e]}},i.isMobile||function(){var e=window.document.createDocumentFragment();if(i.calendarContainer=u("div","flatpickr-calendar"),i.calendarContainer.tabIndex=-1,!i.config.noCalendar){if(e.appendChild((i.monthNav=u("div","flatpickr-months"),i.yearElements=[],i.monthElements=[],i.prevMonthNav=u("span","flatpickr-prev-month"),i.prevMonthNav.innerHTML=i.config.prevArrow,i.nextMonthNav=u("span","flatpickr-next-month"),i.nextMonthNav.innerHTML=i.config.nextArrow,K(),Object.defineProperty(i,"_hidePrevMonthArrow",{get:function(){return i.__hidePrevMonthArrow},set:function(e){i.__hidePrevMonthArrow!==e&&(d(i.prevMonthNav,"flatpickr-disabled",e),i.__hidePrevMonthArrow=e)}}),Object.defineProperty(i,"_hideNextMonthArrow",{get:function(){return i.__hideNextMonthArrow},set:function(e){i.__hideNextMonthArrow!==e&&(d(i.nextMonthNav,"flatpickr-disabled",e),i.__hideNextMonthArrow=e)}}),i.currentYearElement=i.yearElements[0],ye(),i.monthNav)),i.innerContainer=u("div","flatpickr-innerContainer"),i.config.weekNumbers){var t=function(){i.calendarContainer.classList.add("hasWeeks");var e=u("div","flatpickr-weekwrapper");e.appendChild(u("span","flatpickr-weekday",i.l10n.weekAbbreviation));var t=u("div","flatpickr-weeks");return e.appendChild(t),{weekWrapper:e,weekNumbers:t}}(),n=t.weekWrapper,o=t.weekNumbers;i.innerContainer.appendChild(n),i.weekNumbers=o,i.weekWrapper=n}i.rContainer=u("div","flatpickr-rContainer"),i.rContainer.appendChild(V()),i.daysContainer||(i.daysContainer=u("div","flatpickr-days"),i.daysContainer.tabIndex=-1),q(),i.rContainer.appendChild(i.daysContainer),i.innerContainer.appendChild(i.rContainer),e.appendChild(i.innerContainer)}i.config.enableTime&&e.appendChild(function(){i.calendarContainer.classList.add("hasTime"),i.config.noCalendar&&i.calendarContainer.classList.add("noCalendar");var e=k(i.config);i.timeContainer=u("div","flatpickr-time"),i.timeContainer.tabIndex=-1;var t=u("span","flatpickr-time-separator",":"),n=f("flatpickr-hour",{"aria-label":i.l10n.hourAriaLabel});i.hourElement=n.getElementsByTagName("input")[0];var o=f("flatpickr-minute",{"aria-label":i.l10n.minuteAriaLabel});if(i.minuteElement=o.getElementsByTagName("input")[0],i.hourElement.tabIndex=i.minuteElement.tabIndex=-1,i.hourElement.value=r(i.latestSelectedDateObj?i.latestSelectedDateObj.getHours():i.config.time_24hr?e.hours:function(e){switch(e%24){case 0:case 12:return 12;default:return e%12}}(e.hours)),i.minuteElement.value=r(i.latestSelectedDateObj?i.latestSelectedDateObj.getMinutes():e.minutes),i.hourElement.setAttribute("step",i.config.hourIncrement.toString()),i.minuteElement.setAttribute("step",i.config.minuteIncrement.toString()),i.hourElement.setAttribute("min",i.config.time_24hr?"0":"1"),i.hourElement.setAttribute("max",i.config.time_24hr?"23":"12"),i.hourElement.setAttribute("maxlength","2"),i.minuteElement.setAttribute("min","0"),i.minuteElement.setAttribute("max","59"),i.minuteElement.setAttribute("maxlength","2"),i.timeContainer.appendChild(n),i.timeContainer.appendChild(t),i.timeContainer.appendChild(o),i.config.time_24hr&&i.timeContainer.classList.add("time24hr"),i.config.enableSeconds){i.timeContainer.classList.add("hasSeconds");var a=f("flatpickr-second");i.secondElement=a.getElementsByTagName("input")[0],i.secondElement.value=r(i.latestSelectedDateObj?i.latestSelectedDateObj.getSeconds():e.seconds),i.secondElement.setAttribute("step",i.minuteElement.getAttribute("step")),i.secondElement.setAttribute("min","0"),i.secondElement.setAttribute("max","59"),i.secondElement.setAttribute("maxlength","2"),i.timeContainer.appendChild(u("span","flatpickr-time-separator",":")),i.timeContainer.appendChild(a)}return i.config.time_24hr||(i.amPM=u("span","flatpickr-am-pm",i.l10n.amPM[s((i.latestSelectedDateObj?i.hourElement.value:i.config.defaultHour)>11)]),i.amPM.title=i.l10n.toggleTitle,i.amPM.tabIndex=-1,i.timeContainer.appendChild(i.amPM)),i.timeContainer}()),d(i.calendarContainer,"rangeMode","range"===i.config.mode),d(i.calendarContainer,"animate",!0===i.config.animate),d(i.calendarContainer,"multiMonth",i.config.showMonths>1),i.calendarContainer.appendChild(e);var a=void 0!==i.config.appendTo&&void 0!==i.config.appendTo.nodeType;if((i.config.inline||i.config.static)&&(i.calendarContainer.classList.add(i.config.inline?"inline":"static"),i.config.inline&&(!a&&i.element.parentNode?i.element.parentNode.insertBefore(i.calendarContainer,i._input.nextSibling):void 0!==i.config.appendTo&&i.config.appendTo.appendChild(i.calendarContainer)),i.config.static)){var c=u("div","flatpickr-wrapper");i.element.parentNode&&i.element.parentNode.insertBefore(c,i.element),c.appendChild(i.element),i.altInput&&c.appendChild(i.altInput),c.appendChild(i.calendarContainer)}i.config.static||i.config.inline||(void 0!==i.config.appendTo?i.config.appendTo:window.document.body).appendChild(i.calendarContainer)}(),function(){if(i.config.wrap&&["open","close","toggle","clear"].forEach((function(e){Array.prototype.forEach.call(i.element.querySelectorAll("[data-"+e+"]"),(function(t){return O(t,"click",i[e])}))})),i.isMobile)!function(){var e=i.config.enableTime?i.config.noCalendar?"time":"datetime-local":"date";i.mobileInput=u("input",i.input.className+" flatpickr-mobile"),i.mobileInput.tabIndex=1,i.mobileInput.type=e,i.mobileInput.disabled=i.input.disabled,i.mobileInput.required=i.input.required,i.mobileInput.placeholder=i.input.placeholder,i.mobileFormatStr="datetime-local"===e?"Y-m-d\\TH:i:S":"date"===e?"Y-m-d":"H:i:S",i.selectedDates.length>0&&(i.mobileInput.defaultValue=i.mobileInput.value=i.formatDate(i.selectedDates[0],i.mobileFormatStr)),i.config.minDate&&(i.mobileInput.min=i.formatDate(i.config.minDate,"Y-m-d")),i.config.maxDate&&(i.mobileInput.max=i.formatDate(i.config.maxDate,"Y-m-d")),i.input.getAttribute("step")&&(i.mobileInput.step=String(i.input.getAttribute("step"))),i.input.type="hidden",void 0!==i.altInput&&(i.altInput.type="hidden");try{i.input.parentNode&&i.input.parentNode.insertBefore(i.mobileInput,i.input.nextSibling)}catch(e){}O(i.mobileInput,"change",(function(e){i.setDate(m(e).value,!1,i.mobileFormatStr),_e("onChange"),_e("onClose")}))}();else{var e=c(ae,50);if(i._debouncedChange=c(I,300),i.daysContainer&&!/iPhone|iPad|iPod/i.test(navigator.userAgent)&&O(i.daysContainer,"mouseover",(function(e){"range"===i.config.mode&&ie(m(e))})),O(i._input,"keydown",oe),void 0!==i.calendarContainer&&O(i.calendarContainer,"keydown",oe),i.config.inline||i.config.static||O(window,"resize",e),void 0!==window.ontouchstart?O(window.document,"touchstart",Z):O(window.document,"mousedown",Z),O(window.document,"focus",Z,{capture:!0}),!0===i.config.clickOpens&&(O(i._input,"focus",i.open),O(i._input,"click",i.open)),void 0!==i.daysContainer&&(O(i.monthNav,"click",xe),O(i.monthNav,["keyup","increment"],S),O(i.daysContainer,"click",pe)),void 0!==i.timeContainer&&void 0!==i.minuteElement&&void 0!==i.hourElement){O(i.timeContainer,["increment"],j),O(i.timeContainer,"blur",j,{capture:!0}),O(i.timeContainer,"click",H),O([i.hourElement,i.minuteElement],["focus","click"],(function(e){return m(e).select()})),void 0!==i.secondElement&&O(i.secondElement,"focus",(function(){return i.secondElement&&i.secondElement.select()})),void 0!==i.amPM&&O(i.amPM,"click",(function(e){j(e)}))}i.config.allowInput&&O(i._input,"blur",ne)}}(),(i.selectedDates.length||i.config.noCalendar)&&(i.config.enableTime&&P(i.config.noCalendar?i.latestSelectedDateObj:void 0),Ce(!1)),y();var a=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);!i.isMobile&&a&&le(),_e("onReady")}(),i}function M(e,t){for(var n=Array.prototype.slice.call(e).filter((function(e){return e instanceof HTMLElement})),o=[],i=0;i<n.length;i++){var a=n[i];try{if(null!==a.getAttribute("data-fp-omit"))continue;void 0!==a._flatpickr&&(a._flatpickr.destroy(),a._flatpickr=void 0),a._flatpickr=j(a,t||{}),o.push(a._flatpickr)}catch(e){console.error(e)}}return 1===o.length?o[0]:o}"undefined"!=typeof HTMLElement&&"undefined"!=typeof HTMLCollection&&"undefined"!=typeof NodeList&&(HTMLCollection.prototype.flatpickr=NodeList.prototype.flatpickr=function(e){return M(this,e)},HTMLElement.prototype.flatpickr=function(e){return M([this],e)});var E=function(e,t){return"string"==typeof e?M(window.document.querySelectorAll(e),t):e instanceof Node?M([e],t):M(e,t)};E.defaultConfig={},E.l10ns={en:$({},a),default:$({},a)},E.localize=function(e){E.l10ns.default=$($({},E.l10ns.default),e)},E.setDefaults=function(e){E.defaultConfig=$($({},E.defaultConfig),e)},E.parseDate=C({}),E.formatDate=b({}),E.compareDates=x,"undefined"!=typeof jQuery&&void 0!==jQuery.fn&&(jQuery.fn.flatpickr=function(e){return M(this,e)}),Date.prototype.fp_incr=function(e){return new Date(this.getFullYear(),this.getMonth(),this.getDate()+("string"==typeof e?parseInt(e,10):e))},"undefined"!=typeof window&&(window.flatpickr=E);const P=window.WPCodeConditionalLogic||function(e,t,n){const o={l10n:wpcode,current_select:null,init:function(){o.should_init()&&(o.find_elements(),o.add_events(),o.show_relations_for_all_rows(),o.maybe_switch_location())},should_init:function(){return void 0!==wpcode.conditions},find_elements:function(){o.conditions=wpcode.conditions,o.conditions_holder=n(e.getElementById("wpcode-conditions-holder")),o.conditions_input=n(e.getElementById("wpcode-cl-rules")),o.add_group_button=n(e.getElementById("wpcode-cl-add-group")),o.group_template=n(e.getElementById("wpcode-conditions-group-markup")).html(),o.row_template=n(e.getElementById("wpcode-conditions-group-row-markup")).html(),o.show_hide_input=n(e.getElementById("wpcode-cl-show-hide")),o.document=n(e),o.options_dropdown=n(e.getElementById("wpcode_cl_picker"))},add_events:function(){o.init_add_group(),o.init_add_row(),o.init_remove_row(),o.init_change_type(),o.init_capture_rules(),o.init_change_show_hide(),o.init_select2(),jQuery((function(){o.trigger_row_loaded()}))},show_relations_for_all_rows(){o.conditions_holder.find(".wpcode-cl-rules-row").each((function(){o.show_hide_relation_options(n(this))}))},init_add_group:function(){o.add_group_button.on("click",(function(){o.add_group()}))},add_group(){const e=o.get_new_group();o.conditions_holder.append(e),o.add_new_row(e.find(".wpcode-cl-group-rules")),o.build_rules_from_inputs()},get_new_group:()=>n(o.group_template),get_new_row:()=>n(o.row_template),init_add_row(){o.conditions_holder.on("click",".wpcode-cl-add-row",(function(){o.add_new_row(n(this).closest(".wpcode-cl-group").find(".wpcode-cl-group-rules"))}))},init_remove_row(){o.conditions_holder.on("click",".wpcode-cl-remove-row",(function(){const e=n(this).closest(".wpcode-cl-group");n(this).closest(".wpcode-cl-rules-row").remove(),o.maybe_remove_group(e),o.build_rules_from_inputs(),o.options_dropdown.addClass("wpcode-hidden"),o.current_select=null}))},maybe_remove_group(e){0===e.find(".wpcode-cl-group-rules .wpcode-cl-rules-row").length&&(o.options_dropdown.appendTo("body"),o.remove_group(e))},remove_group(e){e.remove(),o.build_rules_from_inputs()},add_new_row(e){const t=o.get_new_row();t.appendTo(e);const n=t.find(".wpcode-cl-rule-type");o.handle_type_change(n),o.build_rules_from_inputs(),n.focus()},init_change_type(){o.conditions_holder.on("click",".wpcode-cl-rule-type-container",(function(e){e.preventDefault(),e.stopPropagation();const t=n(this).find(".wpcode-cl-rule-type");o.options_dropdown.hasClass("wpcode-hidden")||!t.is(o.current_select)?(o.options_dropdown.trigger("wpcode_select_item",t.val()),o.current_select=t,o.options_dropdown.insertAfter(t.closest(".wpcode-cl-rules-row")),o.options_dropdown.removeClass("wpcode-hidden"),o.options_dropdown.find(".wpcode-items-search-input").focus()):o.options_dropdown.addClass("wpcode-hidden")})),o.conditions_holder.on("change",".wpcode-cl-rule-type",(function(){o.handle_type_change(n(this))})),o.options_dropdown.on("change",".wpcode-radio-cl-option",(function(){const e=n(this).val();o.current_select.val(e).trigger("change"),o.options_dropdown.trigger("wpcode_select_item",e),o.options_dropdown.addClass("wpcode-hidden")}))},init_change_show_hide(){o.show_hide_input.on("change",(function(){o.build_rules_from_inputs()}))},handle_type_change(e){const t=e.find("option:selected"),n=e.val(),i=t.closest("optgroup").data("type"),a=e.closest(".wpcode-cl-rules-row"),r=o.conditions[i].options[n];a.find(".wpcode-cl-rule-value").html(o.get_input_markup(r)),a.find(".wpcode-cl-rule-relation option").prop("selected",!1),o.show_hide_relation_options(a,!0),o.init_select2(),o.trigger_row_loaded(e)},get_input_markup(e){let t="";switch(e.type){case"select":t=o.get_input_select(e.options,e.multiple);break;case"text":t=o.get_input_text();break;case"ajax":t=o.get_input_ajax(e.options,e.multiple);break;case"time":t=o.get_input_time();break;case"date":t=o.get_input_date();break;case"datetime":t=o.get_input_datetime()}return t},get_input_select(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const o=n("<select/>");return t&&(o.attr("multiple","multiple"),o.addClass("wpcode-select2")),n.each(e,(function(e,t){o.append(n("<option />",{value:t.value,disabled:!0===t.disabled}).text(t.label))})),o},get_input_text:()=>n('<input type="text" class="wpcode-input-text" />'),get_input_ajax(e,t){const o=n('<select data-action="'+e+'" class="wpcode-select2-ajax" />');return t&&o.attr("multiple","multiple"),o},get_input_time:()=>n('<input type="text" class="wpcode-input-text wpcode-input-time" />'),get_input_date:()=>n('<input type="text" class="wpcode-input-text wpcode-input-date" />'),get_input_datetime:()=>n('<input type="text" class="wpcode-input-text wpcode-input-datetime" />'),init_capture_rules(){o.conditions_holder.on("change","input,select",(function(){o.build_rules_from_inputs()}))},build_rules_from_inputs(){const e=o.conditions_holder.find(".wpcode-cl-group"),t=[];e.each((function(e){const i=n(this).find(".wpcode-cl-rules-row");t[e]=[],i.each((function(){const i=n(this),a=i.find(".wpcode-cl-rule-type"),r=a.find("option:selected").closest("optgroup").data("type"),s=a.val(),c={},l=o.conditions[r].options[s];if(c.type=r,c.option=s,c.relation=i.find(".wpcode-cl-rule-relation").val(),c.value=o.get_input_value(l,i),"post_meta"===s||"user_meta"===s){const e="post_meta"===s?".wpcode-cl-rule-meta-key":".wpcode-cl-rule-user-meta-key",t="post_meta"===s?"meta_key":"user_meta_key",n=i.find(e).val();c[t]=n||null}null!==c.value&&t[e].push(c)}))}));const i={show:o.show_hide_input.val(),groups:t};o.conditions_input.val(JSON.stringify(i))},get_input_value(e,t){let n="";switch(e.type){case"select":case"ajax":n=t.find(".wpcode-cl-rule-value select").val();break;case"text":case"time":case"date":case"datetime":n=t.find(".wpcode-cl-rule-value input").val()}return n},show_hide_relation_options(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const i=e.find(".wpcode-cl-rule-type"),a=i.val(),r=i.find("option:selected").closest("optgroup").data("type"),s=e.find(".wpcode-cl-rule-relation"),c=s.find("option"),l={select:["=","!="],ajax:["=","!="],text:["contains","notcontains","=","!="],date:["=","!=","before","after","before-or","after-or"],datetime:["=","!=","before","after","before-or","after-or"],time:["=","before","after","before-or","after-or"]}[o.conditions[r].options[a].type],d=o.l10n.cl_labels_custom[a];let u=null;if(c.each((function(){const e=n(this).attr("value");l.indexOf(e)>-1?(null===u&&(u=e),n(this).show(),d&&d[e]?n(this).text(d[e]):n(this).text(o.l10n.cl_labels[e])):n(this).hide()})),u&&t&&s.val(u),d&&d.placeholder){const t=e.find(".wpcode-select2-ajax"),n=e.find(".wpcode-input-text");t.length>0&&t.data("placeholder",d.placeholder),n.length>0&&n.attr("placeholder",d.placeholder)}},init_select2(){o.conditions_holder.find(".wpcode-select2").selectWoo(),o.conditions_holder.find(".wpcode-select2-ajax").selectWoo({ajax:{url:ajaxurl,data:function(e){return{action:n(this).data("action"),term:e.term,_wpnonce:o.l10n.nonce}}}})},trigger_row_loaded(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;n(e.body).trigger("wpcode_cl_type_loaded",{conditions_holder:o.conditions_holder,element:t})},maybe_switch_location(){const e=n('input[name="wpcode_auto_insert_location"]:checked'),t=n("#wpcode_snippet_type");n("#wpcode_conditional_logic_enable").on("change",(function(){if("php"!==t.val()||"everywhere"!==e.val()||!n(this).is(":checked"))return;const i=n(this).closest(".wpcode-metabox-form-row");n('input[name="wpcode_auto_insert_location"][value="frontend_cl"]').prop("checked",!0).trigger("change"),WPCodeAdminNotices.get_notice(o.l10n.php_cl_location_notice,"notice-warning notice-alt").insertBefore(i),o.document.trigger("wp-updates-notice-added")}))}};return o}(document,window,jQuery);P.init(),n(5),n(900),n(423),n(508),n(124),n(786),n(298),n(801),n(847),n(770),n(868),n(448),n(118),n(670),n(928),n(978),n(180),n(52),n(691),n(345)}()}();build/notices.js000064400000001156151331545640007657 0ustar00!function(){"use strict";(window.WPCodeAdminWideNotices||function(i,e,c){var n={init:function(){c(n.ready)},ready:function(){n.events()},events:function(){c(i).on("click",".wpcode-notice .notice-dismiss, .wpcode-notice .wpcode-notice-dismiss",n.dismissNotice)},dismissNotice:function(i){i.target.classList.contains("wpcode-notice-dismiss")&&c(this).closest(".wpcode-notice").slideUp(),c.post(wpcode_admin_notices.ajax_url,{action:"wpcode_notice_dismiss",_wpnonce:wpcode_admin_notices.nonce,id:(c(this).closest(".wpcode-notice").attr("id")||"").replace("wpcode-notice-","")})}};return n}(document,window,jQuery)).init()}();languages/insert-headers-and-footers.pot000064400000674507151331545640014424 0ustar00# Copyright (C) 2025 WPCode
# This file is distributed under the GPLv2 or later.
msgid ""
msgstr ""
"Project-Id-Version: WPCode Lite 2.2.6\n"
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/insert-headers-and-footers\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"POT-Creation-Date: 2025-03-06T10:00:07+00:00\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"X-Generator: WP-CLI 2.5.0\n"
"X-Domain: insert-headers-and-footers\n"

#. Plugin Name of the plugin
msgid "WPCode Lite"
msgstr ""

#. Plugin URI of the plugin
#. Author URI of the plugin
msgid "https://www.wpcode.com/"
msgstr ""

#. Description of the plugin
msgid "Easily add code snippets in WordPress. Insert scripts to the header and footer, add PHP code snippets with conditional logic, insert ads pixel, custom content, and more."
msgstr ""

#. Author of the plugin
msgid "WPCode"
msgstr ""

#: ihaf.php:125
msgid "Heads up!"
msgstr ""

#: ihaf.php:126
msgid "Your site already has WPCode Pro activated. If you want to switch to WPCode Lite, please first go to Plugins → Installed Plugins and deactivate WPCode. Then, you can activate WPCode Lite."
msgstr ""

#: includes/admin/admin-ajax-handlers.php:41
#: includes/class-wpcode-snippet.php:477
msgid "You are not allowed to change snippet status, please contact your webmaster."
msgstr ""

#. Translators: %2$s is the action that they were trying to perform, either activated or deactivated. %1$s is the error message why the action failed.
#: includes/admin/admin-ajax-handlers.php:55
msgid "Snippet not %2$s, the following error was encountered: %1$s"
msgstr ""

#: includes/admin/admin-ajax-handlers.php:57
msgctxt "Snippet status change"
msgid "activated"
msgstr ""

#: includes/admin/admin-ajax-handlers.php:57
msgctxt "Snippet status change"
msgid "deactivated"
msgstr ""

#: includes/admin/admin-ajax-handlers.php:114
#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:215
#: includes/admin/pages/class-wpcode-admin-page.php:941
msgid "Search Snippets"
msgstr ""

#. Translators: this an auto-generated title for when a snippet is saved from the generator.
#: includes/admin/admin-ajax-handlers.php:226
msgid "Generated Snippet %s"
msgstr ""

#: includes/admin/admin-ajax-handlers.php:281
msgid "Success! Your server can make SSL connections."
msgstr ""

#: includes/admin/admin-ajax-handlers.php:288
msgid "There was an error and the connection failed. Please contact your web host with the technical details below."
msgstr ""

#: includes/admin/admin-ajax-handlers.php:433
msgid "This shortcode is not used in any content yet."
msgstr ""

#: includes/admin/admin-ajax-handlers.php:442
#: includes/lite/conditional-logic/class-wpcode-conditional-snippet.php:48
msgid "WPCode Snippet"
msgstr ""

#. Translators: %d is the post id.
#: includes/admin/admin-ajax-handlers.php:453
msgid "Untitled (#%d)"
msgstr ""

#: includes/admin/admin-scripts.php:48
msgid "Please wait."
msgstr ""

#: includes/admin/admin-scripts.php:49
#: includes/admin/pages/class-wpcode-admin-page-settings.php:430
msgid "OK"
msgstr ""

#: includes/admin/admin-scripts.php:50
msgid "Already Purchased?"
msgstr ""

#: includes/admin/admin-scripts.php:52
msgid "Bonus"
msgstr ""

#: includes/admin/admin-scripts.php:53
msgid "$50 off"
msgstr ""

#: includes/admin/admin-scripts.php:54
msgid "regular price, automatically applied at checkout."
msgstr ""

#: includes/admin/admin-scripts.php:55
msgid "WPCode Lite users get"
msgstr ""

#: includes/admin/admin-scripts.php:56
#: includes/admin/admin-scripts.php:60
#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:505
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1800
#: includes/lite/class-wpcode-smart-tags-lite.php:22
msgid "Upgrade to PRO"
msgstr ""

#: includes/admin/admin-scripts.php:58
msgid "Testing Mode is a Premium Feature"
msgstr ""

#: includes/admin/admin-scripts.php:59
msgid "Upgrade to PRO today and make changes to your snippets, Header & Footer scripts or Page Scripts without affecting your live site. You choose when and what to publish to your visitors."
msgstr ""

#: includes/admin/admin-scripts.php:62
msgid "Learn more about Testing Mode"
msgstr ""

#: includes/admin/class-wpcode-admin-page-loader.php:139
#: includes/admin/class-wpcode-admin-page-loader.php:140
#: includes/admin/class-wpcode-admin-page-loader.php:197
#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:32
#: includes/class-wpcode-admin-bar-info.php:226
msgid "Code Snippets"
msgstr ""

#: includes/admin/class-wpcode-admin-page-loader.php:205
#: includes/admin/pages/class-wpcode-admin-page-settings.php:53
#: includes/class-wpcode-admin-bar-info.php:408
msgid "Settings"
msgstr ""

#: includes/admin/class-wpcode-admin-page-loader.php:220
msgid "Upgrade to WPCode Pro"
msgstr ""

#: includes/admin/class-wpcode-admin-page-loader.php:221
msgid "Get WPCode Pro"
msgstr ""

#: includes/admin/class-wpcode-code-editor.php:67
msgid "The PHP constant DISALLOW_UNFILTERED_HTML is currently defined, which is preventing WPCode from saving code accurately. Please contact your webmaster for assistance in disabling this restriction."
msgstr ""

#. Translators: Placeholder for the category name.
#: includes/admin/class-wpcode-docs.php:164
msgid "View All %s Docs"
msgstr ""

#: includes/admin/class-wpcode-metabox-snippets.php:54
msgid "WPCode Page Scripts"
msgstr ""

#: includes/admin/class-wpcode-metabox-snippets.php:56
#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:167
#: includes/generator/class-wpcode-generator-script.php:193
#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:23
msgid "Header"
msgstr ""

#: includes/admin/class-wpcode-metabox-snippets.php:57
#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:171
#: includes/generator/class-wpcode-generator-script.php:192
#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:36
msgid "Footer"
msgstr ""

#: includes/admin/class-wpcode-metabox-snippets.php:63
#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:169
#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:49
msgid "Body"
msgstr ""

#: includes/admin/class-wpcode-metabox-snippets.php:66
msgid "Custom Code Snippet"
msgstr ""

#: includes/admin/class-wpcode-metabox-snippets.php:67
#: includes/generator/class-wpcode-generator-post-type.php:384
msgid "Revisions"
msgstr ""

#. Translators: Human-Readable time to display.
#: includes/admin/class-wpcode-notifications.php:287
msgid "%1$s ago"
msgstr ""

#: includes/admin/class-wpcode-review.php:128
msgid "Are you enjoying WPCode?"
msgstr ""

#: includes/admin/class-wpcode-review.php:130
#: includes/generator/class-wpcode-generator-post-status.php:170
#: includes/generator/class-wpcode-generator-post-status.php:195
#: includes/generator/class-wpcode-generator-post-type.php:399
#: includes/generator/class-wpcode-generator-post-type.php:551
#: includes/generator/class-wpcode-generator-post-type.php:757
#: includes/generator/class-wpcode-generator-query.php:136
#: includes/generator/class-wpcode-generator-query.php:379
#: includes/generator/class-wpcode-generator-query.php:436
#: includes/generator/class-wpcode-generator-script.php:211
#: includes/generator/class-wpcode-generator-script.php:228
#: includes/generator/class-wpcode-generator-style.php:212
#: includes/generator/class-wpcode-generator-style.php:229
#: includes/generator/class-wpcode-generator-taxonomy.php:428
#: includes/generator/class-wpcode-generator-taxonomy.php:505
msgid "Yes"
msgstr ""

#: includes/admin/class-wpcode-review.php:130
msgid "Not Really"
msgstr ""

#: includes/admin/class-wpcode-review.php:134
msgid "We're sorry to hear you aren't enjoying WPCode. We would love a chance to improve. Could you take a minute and let us know what we can do better?"
msgstr ""

#: includes/admin/class-wpcode-review.php:136
#: includes/admin/class-wpcode-review.php:142
msgid "Give Feedback"
msgstr ""

#: includes/admin/class-wpcode-review.php:136
#: includes/admin/class-wpcode-review.php:142
msgid "No thanks"
msgstr ""

#: includes/admin/class-wpcode-review.php:140
msgid "That's awesome! Could you please do us a BIG favor and give it a 5-star rating on WordPress to help us spread the word and boost our motivation?"
msgstr ""

#. translators: $1$s - WPCode plugin name; $2$s - WP.org review link; $3$s - WP.org review link.
#: includes/admin/class-wpcode-review.php:193
msgid "Please rate %1$s <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">&#9733;&#9733;&#9733;&#9733;&#9733;</a> on <a href=\"%3$s\" target=\"_blank\" rel=\"noopener\">WordPress.org</a> to help us spread the word. Thank you from the WPCode team!"
msgstr ""

#. Translators: Support link tag starts with url and Support link tag ends.
#: includes/admin/class-wpcode-skin-legacy.php:92
#: includes/admin/class-wpcode-skin.php:92
msgid "There was an error installing the addon. Please try again. If you are still having issues, please %1$scontact our support%2$s team."
msgstr ""

#. Translators: The name of the addon that can't be installed, Support link tag starts with url and Support link tag ends.
#: includes/admin/class-wpcode-skin-legacy.php:105
#: includes/admin/class-wpcode-skin.php:106
msgid "There was an error installing the addon, %1$s. Please try again. If you are still having issues, please %2$scontact our support%3$s team. "
msgstr ""

#: includes/admin/class-wpcode-suggested-plugins.php:42
msgid "Easy, Fast and Secure WordPress and Website Migration."
msgstr ""

#: includes/admin/class-wpcode-suggested-plugins.php:52
msgid "Replace text across your database or media uploads in a single plugin."
msgstr ""

#: includes/admin/class-wpcode-suggested-plugins.php:62
msgid "Making Email Deliverability Easy for WordPress"
msgstr ""

#: includes/admin/class-wpcode-suggested-plugins.php:72
msgid "Powerful SEO Plugin to Boost SEO Rankings & Increase Traffic."
msgstr ""

#: includes/admin/class-wpcode-suggested-plugins.php:82
msgid "The Best Drag & Drop WordPress Form Builder."
msgstr ""

#: includes/admin/class-wpcode-suggested-plugins.php:92
msgid "Connect your WordPress plugins together and create automated workflows."
msgstr ""

#: includes/admin/class-wpcode-suggested-plugins.php:102
msgid "The easiest way to sell digital products with WordPress."
msgstr ""

#: includes/admin/class-wpcode-suggested-plugins.php:112
msgid "Raise more money for your cause with the most powerful WordPress donation and fundraising plugin."
msgstr ""

#: includes/admin/class-wpcode-suggested-plugins.php:122
msgid "Start accepting one-time and recurring payments on your WordPress site without setting up a shopping cart."
msgstr ""

#: includes/admin/class-wpcode-suggested-plugins.php:229
msgid "Plugin already installed and activated."
msgstr ""

#: includes/admin/class-wpcode-suggested-plugins.php:239
#: includes/admin/class-wpcode-suggested-plugins.php:248
msgid "Plugin activated."
msgstr ""

#: includes/admin/class-wpcode-suggested-plugins.php:277
msgid "Plugin installed and activated."
msgstr ""

#: includes/admin/class-wpcode-suggested-plugins.php:360
msgid "Enjoying WPCode? Check out some of our other top-rated FREE plugins:"
msgstr ""

#: includes/admin/class-wpcode-suggested-plugins.php:370
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:463
msgid "Install Plugin"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:34
#: includes/admin/class-wpcode-upgrade-welcome.php:35
msgid "Welcome to WPCode"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:135
msgid "Header & Footer Scripts"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:136
msgid "Effortlessly manage global headers & footers in a familiar interface."
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:140
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:38
msgid "Conversion Pixels"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:141
msgid "Easily target specific pages to track conversions reliably."
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:145
#: includes/admin/pages/class-wpcode-admin-page-settings.php:694
msgid "PHP Snippets"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:146
msgid "Add or remove features with full confidence that your site will not break."
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:150
msgid "Conditional Logic"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:151
msgid "Create advanced conditional logic rules in an easy-to-use interface."
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:155
#: includes/admin/pages/class-wpcode-admin-page-settings.php:65
msgid "Error Handling"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:156
msgid "Unique error handling capabilities ensure you will not get locked out of your site."
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:160
msgid "Snippets Library"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:161
msgid "One-click install from our extensive library of commonly-used snippets."
msgstr ""

#. Translators: This simply adds the plugin name before the logo text.
#: includes/admin/class-wpcode-upgrade-welcome.php:166
msgid "%s logo"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:175
msgid "Insert Headers and Footers is now WPCode"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:176
msgid "When we first built Insert Headers and Footers over a decade ago, it was meant to do one very simple thing: add header and footer scripts to your site without editing theme files."
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:177
msgid "Since then, the plugin has grown to over 1 million active installs with an amazing user base. We have continued to receive feature requests to add more options like controlling which pages the scripts get loaded, allowing more types of code snippets, etc."
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:178
msgid "We listened to your feedback, and we are excited to present WPCode, the next generation of Insert Headers and Footers. We chose a new name because it was only fair considering the plugin is now 10x more powerful. Aside from adding global headers and footer snippets, you can also add multiple other types of code snippets, have granular control of where the snippets are output with conditional logic, and a whole lot more."
msgstr ""

#. Translators: Placeholders 1 & 2 add a link to scroll down the page and 3 & 4 add a link to the suggestions form.
#: includes/admin/class-wpcode-upgrade-welcome.php:183
msgid "Please see the full list of features %1$sbelow%2$s and let us know what you'd like us to add next by %3$ssharing your feedback%4$s."
msgstr ""

#. Translators: Placeholders add link to the details about settings.
#: includes/admin/class-wpcode-upgrade-welcome.php:198
msgid "For those of you who want to limit the functionality and switch back to the old interface, you can do so with one click. %1$sSee details here%2$s."
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:207
msgid "We have an exciting roadmap ahead of us since you have shared tons of great ideas with us over the last several years. We truly appreciate your continued support and thank you for being an awesome user."
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:208
msgid "We truly appreciate your continued support and thank you for using WPCode."
msgstr ""

#. Translators: Placeholder for "WPBeginner".
#: includes/admin/class-wpcode-upgrade-welcome.php:219
msgid "Founder of %s"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:231
msgid "Lead Developer"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:237
msgid "What’s New in WPCode (Features & Highlights)"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:257
#: includes/admin/class-wpcode-upgrade-welcome.php:307
msgid "WPCode Generator Screen capture"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:260
msgid "Snippet Generator"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:261
msgid "WPCode now includes a snippet generator directly in the plugin."
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:262
msgid "Using the built-in generators, you can quickly add custom post types, custom post statuses, widgets, menus, build complex WP Queries and much more."
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:263
msgid "Simply fill in the fields in our guided wizard to generate a custom ready-to-use snippet for your website with 1 click. Try WordPress Snippet Generator."
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:270
msgid "Store Snippets in Cloud"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:271
msgid "A lot of you requested the ability to save and re-use snippets on multiple websites."
msgstr ""

#. Translators: Placeholders add a link to the suggestions page.
#: includes/admin/class-wpcode-upgrade-welcome.php:276
msgid "This feature is now available in the %1$sPRO version of the plugin%2$s along with other powerful features."
msgstr ""

#. Translators: Placeholders add a link to the suggestions page.
#: includes/admin/class-wpcode-upgrade-welcome.php:289
msgid "If you have specific ideas or feature requests, please let us know by %1$sfilling out this form%2$s."
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:300
msgid "WPCode Cloud Screen capture"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:310
msgid "Not ready for the new interface?"
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:311
msgid "If you are not ready to switch to the new interface, or you simply want to use the plugin just for inserting headers and footers we've got you covered."
msgstr ""

#. Translators: Placeholders add a link to the settings page.
#: includes/admin/class-wpcode-upgrade-welcome.php:316
msgid "You can switch to the simple Headers & Footers interface at any time from the %1$ssettings page%2$s."
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:325
msgid "And if you change your mind later and want to give the full plugin a shot, you can always switch back with just 2 clicks using the option at the top of the page."
msgstr ""

#: includes/admin/class-wpcode-upgrade-welcome.php:330
msgid "Add Your First Snippet"
msgstr ""

#: includes/admin/importers/class-wpcode-importer-code-snippets.php:92
#: includes/admin/importers/class-wpcode-importer-woody.php:89
msgid "Unknown Snippet"
msgstr ""

#: includes/admin/importers/class-wpcode-importer-code-snippets.php:93
#: includes/admin/importers/class-wpcode-importer-woody.php:90
msgid "The snippet you are trying to import does not exist."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:45
msgid "1-Click"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:97
msgid "Connect your site to the WPCode Library"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:98
msgid "You're almost there! To finish installing the snippet, you need to connect your site to your account on the WPCode Library. This will allow you to install snippets directly to your site in the future."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:99
msgid "You'll also get access to tens of free expert-curated snippets that can be installed with 1-click from inside the plugin."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:102
#: includes/admin/pages/class-wpcode-admin-page-click.php:142
#: includes/admin/pages/class-wpcode-admin-page.php:1300
msgid "Connect to Library"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:109
msgid "Your site is already connected to the  WPCode Library using another account"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:111
msgid "In order to continue installing the snippet from the WPCode library you have to either login to the Library with the same account used to connect this site to the WPCode library initially or disconnect this site from the WPCode library and connect using your own account."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:115
msgid "Disconnect Site From Library"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:118
msgid "Login with another user on the WPCode Library"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:127
msgid "Congratulations, your site is now connected!"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:128
msgid "Your site is now connected to the WPCode Library and you can install snippets directly from the library. Please click the button below to resume installing the snippet you were viewing."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:131
msgid "Resume Snippet Installation"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:138
msgid "Your site is not connected to the WPCode library."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:139
msgid "Connect now to enable installing public snippets from the WPCode library with 1-click and also get access to tens of expert-curated snippets that you can install from inside the plugin."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:150
msgid "No snippet provided."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:157
msgid "Missing authentication token, please click the link in the WPCode Library again."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:170
msgid "We encountered an error loading your snippet, please try again in a few minutes"
msgstr ""

#. translators: %s: The error message from the API.
#: includes/admin/pages/class-wpcode-admin-page-click.php:175
msgid "We encountered the following error loading your snippet: %s"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:186
msgid "Go back to the library"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:194
msgid "Library Snippet Preview"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:195
msgid "Please review the snippet below and confirm that you would like to install it."
msgstr ""

#. Translators: %s: The snippet name.
#: includes/admin/pages/class-wpcode-admin-page-click.php:199
msgid "Snippet title: %s"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:205
msgid "Code preview"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:209
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:547
#: includes/admin/pages/class-wpcode-code-snippets-table.php:707
msgid "Code Type"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:230
msgid "Confirm & Install Snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-click.php:255
msgid "Confirm Snippet Installation"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:252
#: includes/admin/pages/class-wpcode-admin-page.php:941
msgid "All Snippets"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:340
#: includes/generator/class-wpcode-generator-post-type.php:231
msgid "Add New"
msgstr ""

#. Translators: %d - Trashed snippets count.
#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:358
msgid "%d snippet was successfully moved to Trash."
msgid_plural "%d snippets were successfully moved to Trash."
msgstr[0] ""
msgstr[1] ""

#. translators: %d - Restored from trash snippets count.
#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:366
msgid "%d snippet was successfully restored."
msgid_plural "%d snippet were successfully restored."
msgstr[0] ""
msgstr[1] ""

#. translators: %d - Deleted snippets count.
#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:374
msgid "%d snippet was successfully permanently deleted."
msgid_plural "%d snippets were successfully permanently deleted."
msgstr[0] ""
msgstr[1] ""

#. translators: %d - Activated snippets count.
#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:384
msgid "%d snippet was successfully activated."
msgid_plural "%d snippets were successfully activated."
msgstr[0] ""
msgstr[1] ""

#. translators: %d - Failed to activate snippets count.
#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:393
msgid "%d snippet was not activated due to an error."
msgid_plural "%d snippets were not activated due to errors."
msgstr[0] ""
msgstr[1] ""

#. translators: %d - Deactivated snippets count.
#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:402
msgid "%d snippet was successfully deactivated."
msgid_plural "%d snippets were successfully deactivated."
msgstr[0] ""
msgstr[1] ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:427
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2319
msgid "Enable Error Logging"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:439
msgid "This view lists your snippets that threw errors. Some of the snippets may have also been automatically disabled due to potentially preventing you from accessing the admin."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:441
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2410
msgid "Learn More"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:448
msgid "In order to get more info about the errors please consider enabling error logging."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:469
msgid "Number of snippets per page:"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:502
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1760
msgid "Blocks snippets is a Pro Feature"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:503
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1761
msgid "Upgrade to PRO today and unlock building snippets using the Gutenberg Block Editor. Create templates using blocks and use the full power of WPCode to insert them in your site."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:506
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1764
msgid "SCSS snippets is a Pro Feature"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:507
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1765
msgid "Upgrade to PRO today and unlock editing snippets using SCSS code with optimized compiling directly in the WordPress admin."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:532
msgid "Order Snippets By"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:534
msgid "Order snippets by"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:538
#: includes/admin/pages/class-wpcode-code-snippets-table.php:700
#: includes/generator/class-wpcode-generator-post-status.php:128
#: includes/generator/class-wpcode-generator-post-type.php:136
#: includes/generator/class-wpcode-generator-sidebar.php:130
msgid "Name"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:539
#: includes/admin/pages/class-wpcode-code-snippets-table.php:703
msgid "Created"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:540
#: includes/admin/pages/class-wpcode-code-snippets-table.php:704
msgid "Last Updated"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:541
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1064
#: includes/admin/pages/class-wpcode-code-snippets-table.php:708
#: includes/generator/class-wpcode-generator-hooks.php:1360
msgid "Priority"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:547
msgid "Ascending"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-code-snippets.php:548
msgid "Descending"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-duplicator.php:88
msgid "Easy, Fast and Secure WordPress Backups and Website Migration. Join 1,500,000+ professionals who trust Duplicator. No Code Required."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-duplicator.php:93
msgid "Duplicator Screenshot"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-duplicator.php:99
msgid "Secure Backups."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-duplicator.php:100
msgid "Website Cloning."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-duplicator.php:101
msgid "Cloud Storage."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-duplicator.php:102
msgid "1-Click Restore."
msgstr ""

#. translators: %s is the plugin name.
#: includes/admin/pages/class-wpcode-admin-page-duplicator.php:115
#: includes/admin/pages/class-wpcode-admin-page-search-replace.php:114
msgid "Install and Activate %s"
msgstr ""

#. translators: %s is the plugin name.
#: includes/admin/pages/class-wpcode-admin-page-duplicator.php:124
#: includes/admin/pages/class-wpcode-admin-page-search-replace.php:123
msgid "Install %s from the WordPress.org plugin repository."
msgstr ""

#. translators: %s is the plugin name.
#: includes/admin/pages/class-wpcode-admin-page-duplicator.php:137
#: includes/admin/pages/class-wpcode-admin-page-search-replace.php:136
msgid "Install %s"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-duplicator.php:146
msgid "Please ask your website administrator to install Duplicator."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:38
msgid "File Editor"
msgstr ""

#. Translators: %s is the name of the file.
#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:81
msgid "%s Editor"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:91
msgid "Enable file output"
msgstr ""

#. Translators: %s is the name of the file.
#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:107
msgid "Use this area to edit your %s file."
msgstr ""

#. Translators: %1$s is the opening link tag, %2$s is the closing link tag.
#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:116
msgid "The file contents above will be used to generated a dynamic file. There is no physical file created on your server. %1$sLearn more%2$s."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:134
#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:233
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:176
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:253
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:317
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:367
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:427
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:810
#: includes/admin/pages/class-wpcode-admin-page-settings.php:168
#: includes/admin/pages/class-wpcode-admin-page-settings.php:463
#: includes/admin/pages/class-wpcode-admin-page-settings.php:652
msgid "Save Changes"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:137
msgid "View File"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:202
msgid "Content added here will be appended to the robots.txt content generated by WordPress and other plugins."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:240
msgid "Simplify your website management with the WPCode File Editor! Say goodbye to the hassle of manually editing files on your server."
msgstr ""

#. translators: %1$s and %2$s are <u> tags.
#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:244
msgid "With this powerful tool, you can easily customize crucial files like %1$sads.txt%2$s, %1$sapp-ads.txt%2$s, %1$srobots.txt%2$s, and %1$sservice-worker.js%2$s right from your WordPress admin."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:251
msgid "File Editor is a PRO Feature"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:254
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:74
#: includes/admin/pages/class-wpcode-admin-page-settings.php:496
#: includes/admin/pages/class-wpcode-admin-page-settings.php:674
msgid "Upgrade to WPCode PRO"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:258
msgid "Learn More about the File Editor"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:262
msgid "No manual coding, no FTP"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:263
msgid "Effortless integrations setup"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:264
msgid "Reduce the number of plugins"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-file-editor.php:265
msgid "Prevent advertising fraud"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-generator.php:73
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1068
msgid "Generator"
msgstr ""

#. Translators: gets replaced with the snippet title.
#: includes/admin/pages/class-wpcode-admin-page-generator.php:101
msgid "You are now editing the generated snippet: \"%s\". Updating the snippet will override any edits you made to the code."
msgstr ""

#. Translators: gets replaced with the generator name.
#: includes/admin/pages/class-wpcode-admin-page-generator.php:114
msgid "%s Generator"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-generator.php:140
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:416
msgid "All Generators"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-generator.php:140
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:416
msgid "Search Generators"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-generator.php:155
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:432
msgid "Generate"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-generator.php:207
msgid "Update code"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-generator.php:217
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:510
#: includes/admin/pages/class-wpcode-admin-page.php:1120
msgid "Code Preview"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-generator.php:221
msgid "Update Snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-generator.php:223
#: includes/admin/pages/class-wpcode-admin-page.php:1125
msgid "Use Snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-generator.php:226
msgctxt "Copy to clipboard"
msgid "Copy Code"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-generator.php:258
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1694
#: includes/generator/class-wpcode-generator-type.php:212
msgid "Remove Row"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:57
msgid "Header & Footer"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:109
msgid "Headers & Footers mode activated. Use the toggle next to the Save Changes button to disable it at any time."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:110
msgid "Headers & Footers mode deactivated, if you wish to switch back please use the option on the settings page."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:128
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:182
msgid "Sorry, you only have read-only access to this page. Ask your administrator for assistance editing."
msgstr ""

#. translators: %s: The `<head>` tag
#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:154
msgid "These scripts will be printed in the %s section."
msgstr ""

#. translators: %s: The `<head>` tag
#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:159
msgid "These scripts will be printed just below the opening %s tag."
msgstr ""

#. translators: %s: The `</body>` tag
#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:164
msgid "These scripts will be printed above the closing %s tag."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:228
msgid "Global Header and Footer"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:251
msgid "Simple mode"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:310
msgid "Settings Saved. Please don't forget to clear the site cache if you are using a cache plugin, so that the changes will be reflected for all users."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:335
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2265
#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:313
msgid "Code Revisions is a Pro Feature"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:338
msgid "Upgrade to WPCode Pro today and start tracking revisions and see exactly who, when and which changes were made to global Headers & Footers scripts."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:341
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2271
#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:319
msgid "Upgrade to Pro and Unlock Revisions"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:345
#: includes/admin/pages/class-wpcode-admin-page-library.php:219
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2275
#: includes/admin/pages/trait-wpcode-my-library-markup.php:237
#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:150
#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:293
#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:323
msgid "Learn more about all the features"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:351
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2180
msgid "Code Revisions"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-headers-footers.php:353
msgid "Easily switch back to a previous version of your global scripts."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-library.php:52
msgid "Library"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-library.php:63
msgid "Snippets"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-library.php:64
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:384
msgid "My Library"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-library.php:65
msgid "My Favorites"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-library.php:181
msgid "We encountered an error while trying to load the snippet data. Please try again."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-library.php:212
msgid "My Favorites is a PRO Feature"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-library.php:213
msgid "Upgrade to WPCode PRO today and see the snippets you starred in the WPCode Library directly in the plugin."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-library.php:215
msgid "Upgrade to PRO and Unlock \"My Favorites\""
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-library.php:223
msgid "Load favorite snippets in the plugin"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-library.php:224
msgid "Import snippets from the WPCode Library"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-library.php:225
msgid "Save your snippets to the WPCode Library"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-library.php:226
#: includes/admin/pages/trait-wpcode-my-library-markup.php:245
msgid "Set up new websites faster"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-library.php:227
msgid "Easily implement features on multiple sites"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-library.php:228
#: includes/admin/pages/trait-wpcode-my-library-markup.php:246
msgid "Edit snippets in the WPCode Library"
msgstr ""

#. translators: %1$s and %2$s are <u> tags.
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:65
msgid "While you can always add pixels manually using code snippets, our Conversion Pixels addon helps you %1$ssave time%2$s while %1$sreducing errors%2$s. It lets you properly implement Facebook, Google, Pinterest, TikTok and Snapchat ads tracking with deep integrations for eCommerce events, interaction measurement, and more. This addon is available on WPCode Plus plan or higher."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:71
msgid "Conversion Pixels Addon is a PRO Feature"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:79
msgid "Seamless integration with WooCommerce, Easy Digital Downloads and MemberPress"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:80
msgid "Works with Facebook, Google Ads, Pinterest, TikTok and Snapchat"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:81
msgid "No coding required"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:82
msgid "1-click setup for conversion tracking"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:94
msgid "Facebook"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:95
msgid "Google"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:96
msgid "Pinterest"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:97
msgid "TikTok"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:98
msgid "Snapchat"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:99
msgid "Click Tracking"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:130
msgid "Facebook Pixel"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:133
msgid "Facebook Pixel ID"
msgstr ""

#. translators: %1$s and %2$s are the opening and closing anchor tags.
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:139
msgid "You can find your Facebook Pixel ID in the Facebook Ads Manager. %1$sRead our step by step directions%2$s. "
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:147
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:397
msgid "Conversions API Token"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:151
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:401
msgid "The Conversions API token allows you to send API events that are more reliable and can improve audience targeting."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:157
msgid "Facebook Pixel Events"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:161
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:237
msgid "PageView Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:163
msgid "Enable the PageView event to track and record page visits on all the pages of your website using the Facebook Pixel."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:170
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:247
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:311
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:361
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:421
msgid "eCommerce Events Tracking"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:188
msgid "Google Analytics & Ads Tracking"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:191
msgid "Google Analytics ID"
msgstr ""

#. translators: %1$s and %2$s are the opening and closing anchor tags.
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:197
msgid "You can find your Google Analytics ID in the Google Analytics Admin panel. %1$sRead our step by step directions%2$s. "
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:205
msgid "Google Ads Tag ID"
msgstr ""

#. translators: %1$s and %2$s are the opening and closing anchor tags.
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:211
msgid "You can find your Google Ads Tag ID in the Google Ads Settings under Google Tag. %1$sRead our step by step directions%2$s. "
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:219
msgid "Ads Conversion Label"
msgstr ""

#. translators: %1$s and %2$s are the opening and closing anchor tags.
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:225
msgid "Add your Google Ads Conversion Label for tracking conversion events. %1$sLearn More%2$s."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:233
msgid "Google Events"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:239
msgid "Enable PageView event on all pages."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:265
msgid "Pinterest Tag"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:268
msgid "Tag ID"
msgstr ""

#. translators: %1$s and %2$s are the opening and closing anchor tags.
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:274
msgid "You can find your Tag id in your Pinterest Business account. %1$sRead our step by step directions%2$s. "
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:282
msgid "Ad Account ID"
msgstr ""

#. translators: %1$s and %2$s are the opening and closing anchor tags.
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:288
msgid "You can find your Ad Account ID in your Pinterest Business account. %1$sRead more%2$s. "
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:296
msgid "Conversion Access Token"
msgstr ""

#. translators: %1$s and %2$s are the opening and closing anchor tags.
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:302
msgid "You can find your Conversion Access Token under Ads > Conversions > Conversion access token. %1$sRead more%2$s. "
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:329
msgid "TikTok Pixel"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:332
msgid "Pixel ID"
msgstr ""

#. translators: %1$s and %2$s are the opening and closing anchor tags.
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:338
msgid "You can find your Pixel id in your TikTok Business Account. %1$sRead our step by step directions%2$s."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:346
msgid "Events API Access Token"
msgstr ""

#. translators: %1$s and %2$s are the opening and closing anchor tags.
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:352
msgid "You can generate an access token in the Pixel Settings under Access Token Generation. %1$sRead more%2$s"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:379
msgid "Snapchat Pixel"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:382
msgid "Snap Pixel ID"
msgstr ""

#. translators: %1$s and %2$s are the opening and closing anchor tags.
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:388
msgid "You can find your Snapchat Pixel ID in the Snapchat Ads Manager. %1$sRead our step by step directions%2$s. "
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:407
msgid "Snapchat Pixel Events"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:411
msgid "Pave View Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:413
msgid "Enable the PAGE_VIEW event to track and record page visits on all the pages of your website using the Snapchat Pixel."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:440
msgid "ViewContent Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:442
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:563
msgid "Turn on the \"ViewContent\" event to track views of product pages on your website."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:447
msgid "AddtoCart Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:449
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:570
msgid "Turn on the \"AddToCart\" event to track when items are added to a shopping cart on your website."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:454
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:575
msgid "InitiateCheckout Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:456
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:577
msgid "Turn on the \"InitiateCheckout\" event to track when a user reaches the checkout page on your website."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:461
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:499
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:708
msgid "Purchase Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:463
msgid "Turn on the \"Purchase\" event to track successful purchases on your website."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:478
msgid "View Item Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:480
msgid "Send the View Item event to track views of product pages on your website."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:485
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:530
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:568
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:694
msgid "Add to Cart Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:487
msgid "Send the Add to Cart event when a product is added to the cart."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:492
msgid "Begin Checkout Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:494
msgid "Send the Begin Checkout event when the user sees the checkout page."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:501
msgid "Send the Purchase event when the user completes a purchase."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:506
msgid "Conversion Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:508
msgid "Send the conversion event with the Google Ads label set above on a successful purchase."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:523
msgid "PageVisit Product Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:525
msgid "Turn on the \"PageVisit\" event to track views of product pages on your website."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:532
msgid "Turn on the Add to Cart event to track when items are added to a shopping cart on your website."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:537
msgid "Checkout PageVisit Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:539
msgid "Enable the Checkout PageVisit event to track when a user reaches the checkout page on your website."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:544
msgid "Checkout Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:546
msgid "Turn on the \"Checkout\" event to track successful purchases on your website."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:561
msgid "ViewContent Product Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:582
msgid "PlaceAnOrder Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:584
msgid "Turn on the \"PlaceAnOrder\" event to track successful purchases on your website."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:660
msgid "Disabled, no eCommerce Platform Detected"
msgstr ""

#. translators: %s is the name of the eCommerce provider.
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:664
msgid "%s Tracking Enabled"
msgstr ""

#. translators: %s a html break.
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:670
msgid "Advanced eCommerce tracking is available for WooCommerce, Easy Digital Downloads and MemberPress. %s These plugins are detected automatically and when available you can toggle individual events using the options below."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:687
msgid "View Content Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:689
msgid "Turn on the \"VIEW_CONTENT\" event to track views of product pages on your website."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:696
msgid "Turn on the \"ADD_CART\" event to track when items are added to a shopping cart on your website."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:701
msgid "Start Checkout Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:703
msgid "Turn on the \"START_CHECKOUT\" event to track when a user reaches the checkout page on your website."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:710
msgid "Turn on the \"PURCHASE\" event to track successful purchases on your website."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:724
msgid "Custom Click Tracking"
msgstr ""

#. Translators: %1$s is the opening link tag, %2$s is the closing link tag
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:729
msgid "Use this section to add custom click events to your site. You can add as many as you like. Each event can have multiple pixels and each pixel can have a custom event name and value. Read more about how to configure these settings in %1$sthis article%2$s"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:739
msgid "CSS Selector"
msgstr ""

#. Translators: %1$s is an opening anchor tag, %2$s is a closing anchor tag.
#: includes/admin/pages/class-wpcode-admin-page-pixel.php:745
msgid "Define the HTML element that triggers the event upon clicking (button, link, etc). Input the appropriate CSS selector here. %1$sLearn more%2$s"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:753
msgid "Event Name"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:757
msgid "Assign a unique identifier to your event for easy recognition and categorization. "
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:761
msgid "Event Value"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:765
msgid "Input a numerical value for your event. This helps in quantifying user interactions for your tracking needs. "
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-pixel.php:804
msgid "Add New Click Event"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-search-replace.php:87
msgid "Confidently replace any text in your database and update images without duplicating uploads, all with a single plugin."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-search-replace.php:92
msgid "Search & Replace Everything Screenshot"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-search-replace.php:98
msgid "Replace Text Across Your Whole Database."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-search-replace.php:99
msgid "Preview Changes Every Time."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-search-replace.php:100
msgid "Replace Image Sources to Clear Up Space."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-search-replace.php:101
msgid "Support for Serialized Data."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-search-replace.php:145
msgid "Please ask your website administrator to install Search & Replace Everything."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:52
msgid "WPCode Settings"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:64
msgid "General Settings"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:66
#: includes/admin/pages/class-wpcode-admin-page-settings.php:624
msgid "Access Control"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:88
msgid "Settings Saved."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:125
msgid "This allows you to disable all Code Snippets functionality and have a single \"Headers & Footers\" item under the settings menu."
msgstr ""

#. Translators: Placeholders make the text bold.
#: includes/admin/pages/class-wpcode-admin-page-settings.php:130
msgid "%1$sNOTE:%2$s Please use this setting with caution. It will disable all custom snippets that you add using the new snippet management interface."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:136
msgid "License Key"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:141
msgid "Headers & Footers mode"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:153
msgid "Allow Usage Tracking"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:157
msgid "By allowing us to track usage data, we can better help you, as we will know which WordPress configurations, themes, and plugins we should test."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:179
msgid "Remove ALL WPCode data upon plugin deletion."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:184
msgid "All WPCode snippets & scripts will be unrecoverable."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:188
msgid "Delete All Data on Uninstall"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:206
msgid "WPCode Library Connection"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:211
msgid "Editor Height"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:217
msgid "Dark Mode"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:221
msgid "Enable Dark Mode across WPCode."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:228
msgid "Admin Bar Info"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:232
msgid "Enable the admin bar menu that shows info about which snippets & scripts are loaded on the current page."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:248
msgid "Connect to the WPCode Library"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:251
msgid "Disconnect from the WPCode Library"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:376
msgid "Auto height"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:379
msgid "Set the editor height in pixels or enable auto-grow so the code editor automatically grows in height with the code."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:394
msgid "You're using WPCode Lite - no license needed. Enjoy!"
msgstr ""

#. Translators: %1$s - Opening anchor tag, do not translate. %2$s - Closing anchor tag, do not translate.
#: includes/admin/pages/class-wpcode-admin-page-settings.php:401
msgid "To unlock more features consider %1$supgrading to PRO%2$s."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:408
msgid "Already purchased? Simply enter your license key below to enable WPCode PRO!"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:410
msgid "Paste license key here"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:412
msgid "Verify Key"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:429
msgid "Oops!"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:431
msgid "Almost Done"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:432
#: includes/admin/pages/class-wpcode-code-snippets-table.php:469
msgid "Activate"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:433
msgid "Unfortunately there was a server connection error."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:478
msgid "Email Notifications"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:481
msgid "Receive email notifications when snippets throw errors or are automatically deactivated."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:493
msgid "Email Notifications is a Pro Feature"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:494
msgid "Do you want to get email notifications the moment your snippets throw an error or are automatically deactivated? Upgrade today and improve your workflow with WPCode Error Email Notifications."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:512
msgid "Error Notifications"
msgstr ""

#. Translators: %1$s: opening anchor tag, %2$s: closing anchor tag. Link to docs about error notifications.
#: includes/admin/pages/class-wpcode-admin-page-settings.php:518
msgid "Send email notifications when snippets throw errors? %1$sLearn more%2$s"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:528
#: includes/admin/pages/class-wpcode-admin-page-settings.php:569
msgid "Send To"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:532
msgid "Enter a comma separated list of email addresses to receive error notifications. Defaults to the admin email address."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:548
#: includes/admin/pages/class-wpcode-admin-page-settings.php:589
msgid "Preview Email"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:553
msgid "Deactivation Notifications"
msgstr ""

#. Translators: %1$s: opening anchor tag, %2$s: closing anchor tag. Link to docs about error notifications.
#: includes/admin/pages/class-wpcode-admin-page-settings.php:559
msgid "Send an email when a snippet gets automatically deactivated? %1$sLearn more%2$s"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:573
msgid "Enter a comma separated list of email addresses to receive deactivation notifications. Defaults to the admin email address."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:601
msgid "Error Logging"
msgstr ""

#. Translators: %1$s: opening anchor tag, %2$s: closing anchor tag.
#: includes/admin/pages/class-wpcode-admin-page-settings.php:607
msgid "Log errors thrown by snippets? %1$sView Logs%2$s"
msgstr ""

#. Translators: %1$s - Opening anchor tag. %2$s - Closing anchor tag.
#: includes/admin/pages/class-wpcode-admin-page-settings.php:629
msgid "Select the user roles that are allowed to manage different types of snippets or parts of WPCode. By default, all permissions are provided only to administrator users. Please see our %1$sAccess Control documentation%2$s for more details."
msgstr ""

#. translators: %1$s and %2$s are <u> tags.
#: includes/admin/pages/class-wpcode-admin-page-settings.php:665
msgid "Improve the way you and your team manage your snippets with the WPCode Access Control settings. Enable other users on your site to manage different types of snippets or configure Conversion Pixels settings and update configuration files. This feature is available on the %1$sWPCode Pro%2$s plan or higher."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:671
msgid "Access Control is a PRO Feature"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:679
msgid "Save time and improve website management with your team"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:680
msgid "Delegate snippet management to other users with full control"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:681
msgid "Enable other users to set up ads & 3rd party services"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:682
msgid "Choose if PHP snippets should be enabled on the site"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:697
msgid "Disable PHP snippets"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:701
msgid "This option will completely disable PHP snippets execution and the option to edit or add new PHP snippets."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-settings.php:768
msgid "Make Sure Important Emails Reach Your Inbox"
msgstr ""

#. Translators: %1$s: opening anchor tag, %2$s: closing anchor tag.
#: includes/admin/pages/class-wpcode-admin-page-settings.php:773
msgid "Solve common email deliverability issues for good. %1$sGet WP Mail SMTP%2$s!"
msgstr ""

#. Translators: This adds the name of the plugin "WPCode".
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:85
msgid "Add %s Snippet"
msgstr ""

#. Translators: This adds the name of the plugin "WPCode".
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:86
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:139
msgid "Add Snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:132
msgid "Save Snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:133
msgid "Create Custom Snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:135
msgid "Edit Snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:136
msgid "Update"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:168
msgid "You cannot edit this snippet because it is in the Trash. Please restore it and try again."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:194
msgid "Snippet updated."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:195
msgid "Snippet created & Saved."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:196
msgid "We encountered an error activating your snippet, please check the syntax and try again."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:197
msgid "Sorry, you are not allowed to change the status of the snippet."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:198
msgid "Snippet updated & executed."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:199
msgid "Your changes are saved but your snippet was deactivated due to an error, please check the syntax and try again."
msgstr ""

#. translators: %s: Error message.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:211
msgid "Error message: %s"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:244
msgid "Don't forget to activate your snippet using the toggle next to the \"Update\" button when you are ready to start using it."
msgstr ""

#. Translators: this changes the edit page title to show the snippet title.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:278
msgid "Edit snippet \"%s\""
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:325
msgid "Add Your Custom Code (New Snippet)"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:326
msgid "Choose this blank snippet to start from scratch and paste any custom code or simply write your own."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:338
msgid "Add Custom Snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:342
msgid "Generate snippet using AI"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:343
msgid "Generate a new snippet specific to your needs leveraging the power of WPCode's AI integration."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:351
msgid "Generate Snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:375
msgid "Snippet Library"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:378
msgid "Snippet Generators"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:381
msgid "Plugin Snippets"
msgstr ""

#. Translators: The placeholders add links to create a new custom snippet or the suggest-a-snippet form.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:400
msgid "To speed up the process you can select from one of our pre-made library, or you can start with a %1$sblank snippet%2$s and %1$screate your own%2$s. Have a suggestion for new snippet? %3$sWe’d love to hear it!%4$s"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:413
msgid "Create custom snippets for your website easily by filling out a form. You can also use this form to update your snippets later, without having to write or edit any code."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:443
msgid "Easily add code snippets that extend other plugins on your site from a library maintained by the plugin authors."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:453
msgid "You don't have any plugins installed that extend the WPCode library, install any of the plugins below to start expanding the WPCode snippet library:"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:493
msgid "Add title for snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:562
msgid "Select the code type for your snippet:"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:599
msgid "Insertion"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:605
msgid "Choose \"Auto Insert\" if you want the snippet to be automatically executed in one of the locations available. In \"Shortcode\" mode, the snippet will only be executed where the shortcode is inserted."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:608
msgid "Insert Method"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:610
#: includes/admin/pages/class-wpcode-code-snippets-table.php:702
#: includes/lite/conditional-logic/class-wpcode-conditional-location.php:70
msgid "Location"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:614
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:673
#: includes/admin/pages/class-wpcode-code-snippets-table.php:706
#: includes/class-wpcode-admin-bar-info.php:283
msgid "Shortcode"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:632
msgid "Your snippet can be either automatically executed or only used as a shortcode. When using the \"Auto Insert\" option you can choose the location where your snippet will be placed automatically."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:643
msgid "before paragraph number"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:644
msgid "after paragraph number"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:645
msgid "before post number"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:646
msgid "after post number"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:647
msgid "minimum number of words"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:648
msgid "number of words"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:669
msgid "Auto&nbsp;Insert"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:717
msgid "Who (visitor)"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:721
msgid "Where (page)"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:725
#: includes/class-wpcode-auto-insert.php:55
msgid "eCommerce"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:729
msgid "Advanced"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:739
msgid "Search Options"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:755
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:819
msgid "Selected"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:811
msgid "Search locations"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:971
msgid "Please save the snippet first"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1063
msgid "Tag"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1065
#: includes/admin/pages/class-wpcode-code-snippets-table.php:709
msgid "Note"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1072
msgid "Basic info"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1074
msgid "Tags: Use tags to make it easier to group similar snippets together. <br />Priority: A lower priority will result in the snippet being executed before others with a higher priority. <br />Note: Add a private note related to this snippet."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1086
msgid "Using conditional logic you can limit the pages where you want the snippet to be auto-inserted."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1090
msgid "Enable Logic"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1091
msgid "Conditions"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1096
msgid "Smart Conditional Logic"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1098
msgid "Enable logic to add rules and limit where your snippets are inserted automatically. Use multiple groups for different sets of rules."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1140
msgid "Update Generated Snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1211
msgid "Snippet Status:"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1214
#: includes/admin/pages/class-wpcode-admin-page-tools.php:369
#: includes/admin/pages/class-wpcode-code-snippets-table.php:1076
msgid "Active"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1217
#: includes/admin/pages/class-wpcode-admin-page-tools.php:370
#: includes/admin/pages/class-wpcode-code-snippets-table.php:1079
msgid "Inactive"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1230
msgid "Execute Snippet Now"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1260
msgid "Save to Library"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1283
msgid "Restricted Code Detected"
msgstr ""

#. Translators: %1$s is the opening link tag, %2$s is the closing link tag.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1288
msgid "For your protection, we blocked the addition of certain types of code that could compromise your website's security. If you believe this is in error or need assistance, please %1$scontact our support team%2$s."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1476
msgid "+ Add new group"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1493
msgid "Show"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1494
msgid "Hide"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1510
msgid "This code snippet if"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1624
msgctxt "Conditional logic add another \"and\" rules row."
msgid "AND"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1625
msgid "Add another \"AND\" rules row."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1727
msgctxt "Conditional logic \"or\" another rule"
msgid "OR"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1748
msgid "Save to Library is a Pro Feature"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1749
msgid "Upgrade to PRO today and save your private snippets to the WPCode library for easy access. You can also share your snippets with other users or load them on other sites."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1751
msgid "Custom Shortcode is a Pro Feature"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1752
msgid "Upgrade today to use a custom shortcode and nerver worry about changing snippet ids again, even when importing your snippets to another site. You'll also get access to a private library that makes setting up new sites a lot easier."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1754
msgid "Device Type is a Pro Feature"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1755
msgid "Upgrade to PRO today and unlock one-click device targeting for your snippets."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1757
msgid "Scheduling snippets is a Pro Feature"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1758
msgid "Upgrade to PRO today and unlock powerful scheduling options to limit when your snippet is active on the site."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1768
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1931
msgid "Shortcode Attributes"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1769
msgid "Load as file is a Pro Feature"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1770
msgid "Upgrade to PRO today and unlock loading your CSS and JS snippets as files for better performance and improved compatibility with caching plugins."
msgstr ""

#. Translators: %1$s Opening anchor tag. %2$s Closing anchor tag.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1774
msgid "For better results using conditional logic with PHP snippets we automatically switched the auto-insert location to \"Frontend Conditional Logic\" that runs later. If you want to run the snippet earlier please switch back to \"Run Everywhere\" but note not all conditional logic options will be available. %1$sRead more%2$s"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1790
msgid "The snippet has been recently deactivated due to an error on this line"
msgstr ""

#. Translators: The name of the user that is currently editing the snippet is appended at the end.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1794
msgid "This snippet is currently being edited by "
msgstr ""

#. Translators: The name of the user that is currently editing the snippet is appended at the end.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1795
msgid "AI Snippet Generation is a Pro Feature"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1796
msgid "Improving Snippets with AI is a Pro Feature"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1797
msgid "Upgrade today to access the WPCode AI code generator, which allows you to create code snippets simply by describing their functionality using the power of AI."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1883
#: includes/class-wpcode-admin-bar-info.php:289
msgid "Custom Shortcode"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1886
msgid "Shortcode name"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1891
msgid "Use this field to define a custom shortcode name instead of the id-based one."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1905
msgid "Add&nbsp;Attribute"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1909
msgid "Attribute name"
msgstr ""

#. Translators: %1$s is the opening <code> tag, %2$s is the closing </code> tag.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1916
msgid "Use this field to define the attribute name for your shortcode and click Add Attribute. Attributes added here will be available to use as smart tags and as variables inside snippets. E.g. an attribute named \"keyword\" will be available in a PHP snippet as %1$s$keyword%2$s. %3$sLearn more%4$s."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:1986
msgid "Schedule snippet"
msgstr ""

#. Translators: Link to the documentation article for files as snippets. %1$s is the opening anchor tag, %2$s is the closing anchor tag.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2009
msgid "If enabled, this snippet will be loaded as a physical file instead of being inserted in the source of the page. %1$sLearn more%2$s."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2022
msgid "Load as file"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2051
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2052
msgid "Start Date"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2053
msgid "Clear start date"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2060
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2061
msgid "End Date"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2062
msgid "Clear end date"
msgstr ""

#. Translators: %1$s and %2$s are HTML tags for a link to the documentation article.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2071
msgid "Looking for more scheduling options? %1$sClick here%2$s to read more about all the available options."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2145
msgid "Find Where This Shortcode Is Used"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2149
msgid "Click to search for any posts or pages where this shortcode is being used."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2159
msgid "Locations Used"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2175
msgid "As you make changes to your snippet and save, you will get a list of previous versions with all the changes made in each revision. You can compare revisions to the current version or see changes as they have been saved by going through each revision. Any of the revisions can then be restored as needed."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2182
msgid "Easily switch back to a previous version of your snippet."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2194
msgid "Limit where you want this snippet to be loaded by device type. By default, snippets are loaded on all devices."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2200
#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:48
msgid "Device Type"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2214
msgid "Any device type"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2215
msgid "Desktop only"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2216
msgid "Mobile only"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2268
msgid "Upgrade to WPCode Pro today and start tracking revisions and see exactly who, when and which changes were made to your snippet."
msgstr ""

#. Translators: The placeholder gets replaced with the display name of the user currently editing the snippet.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2296
msgid "Notice: %1$s is also editing this snippet. Please be aware that your changes could be overwritten."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2310
msgid "View Error Logs"
msgstr ""

#. Translators: The placeholder gets replaced with the time passed since the snippet was deactivated.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2335
msgid "This snippet was automatically deactivated due to an error at %1$s on %2$s (%3$s ago)."
msgstr ""

#. Translators: The placeholder gets replaced with the time passed since the snippet was deactivated.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2347
msgid "This snippet first threw an error at %1$s on %2$s (%3$s ago)."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2358
#: includes/class-wpcode-snippet-execute.php:615
msgid "Error message:"
msgstr ""

#. Translators: The placeholders make the text bold and add the line number.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2367
msgid "The error occurred on %1$sline %3$d%2$s of this snippet's code (highlighted below)."
msgstr ""

#. Translators: The placeholder is replaced with the URL where the error happened.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2381
msgid "The error was triggered at the following URL: %1$s"
msgstr ""

#. Translators: The placeholders are for the link to the error logs.
#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2392
msgid "You can %1$sview the error log%2$s to get more details about the error that caused this. The error will also be in a snippet-specific log whose name starts with snippet-%3$d (the id of this snippet)."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2398
msgid "You can enable error logging to get more details about the error that caused this."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2403
msgid "This message will disappear when the snippet is updated."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-snippet-manager.php:2453
msgid "Use AI to improve your snippet by describing the changes you want"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:59
msgid "Tools"
msgstr ""

#. Translators: Adds a link to the snippets list in the admin.
#: includes/admin/pages/class-wpcode-admin-page-tools.php:94
msgid "Import was successfully finished. You can go and check %1$syour snippets%2$s."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:140
msgid "WPCode Snippet Import"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:141
msgid "Select a WPCode export file"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:147
msgid "No file chosen"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:151
msgid "Choose a file&hellip;"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:160
#: includes/admin/pages/class-wpcode-admin-page-tools.php:193
#: includes/admin/pages/class-wpcode-admin-page-tools.php:315
#: includes/admin/pages/class-wpcode-admin-page-tools.php:491
msgid "Import"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:166
msgid "Import from Other Code Plugins"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:167
msgid "WPCode makes it easy for you to switch by allowing you import your third-party snippet plugins with a single click."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:170
msgid "Select previous Code plugin"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:176
msgid "Not Installed"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:178
msgid "Not Active"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:208
msgid "Export Code Snippets"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:212
#: includes/admin/pages/class-wpcode-code-snippets-table.php:712
#: includes/generator/class-wpcode-generator-post-status.php:111
msgid "Status"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:217
msgid "Code type"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:222
#: includes/admin/pages/class-wpcode-code-snippets-table.php:705
msgid "Tags"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:229
msgid "Export Snippets"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:243
msgid "System Information"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:248
msgid "Test SSL Connections"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:249
msgid "Click the button below to verify your web server can perform SSL connections successfully."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:251
msgid "Test Connection"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:274
msgid "Snippets import"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:278
msgid "Select the Snippets you would like to import."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:282
#: includes/admin/pages/class-wpcode-admin-page.php:1024
msgid "Available Snippets"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:287
#: includes/admin/pages/class-wpcode-code-snippets-table.php:512
msgid "No snippets found."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:301
msgid "Select All"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:306
msgid "Snippets to Import"
msgstr ""

#. Translators: These add markup to display which snippet out of the total from the provider name.
#: includes/admin/pages/class-wpcode-admin-page-tools.php:327
msgid "Importing %1$s of %2$s snippets from %3$s."
msgstr ""

#. Translators: this adds the total snippets count that have been completed.
#: includes/admin/pages/class-wpcode-admin-page-tools.php:345
msgid "Congrats, the import process has finished! We have successfully imported %s snippets. You can review the results below."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:368
#: includes/admin/pages/class-wpcode-code-snippets-table.php:1073
msgid "All"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:402
msgid "No snippets available to export."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:427
msgid "No tags available."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:492
msgid "Export"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:493
msgid "System Info"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:494
msgid "Importer"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:495
#: includes/class-wpcode-admin-bar-info.php:422
msgid "Logs"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:606
msgid "Please upload a valid .json snippets export file."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:607
#: includes/admin/pages/class-wpcode-admin-page-tools.php:620
msgid "Error"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:619
msgid "Snippets data cannot be imported."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:680
#: includes/admin/pages/class-wpcode-code-snippets-table.php:407
msgid "Edit"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:696
msgid "Testing"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:968
msgid "You do not have sufficient permissions to view logs."
msgstr ""

#. translators: %1$s: opening anchor tag, %2$s: closing anchor tag.
#: includes/admin/pages/class-wpcode-admin-page-tools.php:979
msgid "No logs found. You can enable logging from the %1$ssettings panel%2$s."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:1017
msgid "Delete log"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:1027
msgid "View"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:1035
msgid "Log is empty."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:1055
msgid "Link expired. Please refresh the page and retry."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:1059
msgid "You do not have sufficient permissions to delete logs."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page-tools.php:1078
msgid "Are you sure you want to delete this log?"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:119
msgid "You do not have permission to access this page."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:257
msgid "Search docs"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:261
#: includes/admin/pages/class-wpcode-code-snippets-table.php:1017
msgid "Clear"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:268
msgid "No docs found"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:283
msgid "View Documentation"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:284
msgid "Browse documentation, reference material, and tutorials for WPCode."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:285
msgid "View All Documentation"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:289
msgid "Get Support"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:290
msgid "Submit a ticket and our world class support team will be in touch soon."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:291
msgid "Submit a Support Ticket"
msgstr ""

#. Translators: Placeholder for the number of active notifications.
#: includes/admin/pages/class-wpcode-admin-page.php:303
msgid "New Notifications (%s)"
msgstr ""

#. Translators: Placeholder for the number of dismissed notifications.
#: includes/admin/pages/class-wpcode-admin-page.php:314
msgid "Notifications (%s)"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:321
msgid "Dismissed Notifications"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:324
msgid "Active Notifications"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:347
msgid "Dismiss all"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:389
msgid "Dismiss"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:438
msgid "Testing Mode"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:451
msgid "Help"
msgstr ""

#. translators: %s is the title of the metabox.
#: includes/admin/pages/class-wpcode-admin-page.php:607
msgid "Collapse Metabox %s"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:726
msgid "Use snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:739
msgid "Edit snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:740
msgid "Used"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:753
msgid "Preview"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:763
msgid "Connect to library to unlock (Free)"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:947
msgid "We encountered a problem loading the Snippet Library items, please try again later."
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:1116
msgid "Preview Snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:1126
msgid "Edit in Library"
msgstr ""

#. translators: %d - snippets count.
#: includes/admin/pages/class-wpcode-admin-page.php:1291
msgid "Get Access to Our Library of %d FREE Snippets"
msgstr ""

#: includes/admin/pages/class-wpcode-admin-page.php:1296
msgid "Connect your website with WPCode Library and get instant access to FREE code snippets written by our experts. Snippets can be installed with just 1-click from inside the plugin and come automatically-configured to save you time."
msgstr ""

#. Translators: This is the format for displaying the date in the admin list, [date] at [time].
#: includes/admin/pages/class-wpcode-code-snippets-table.php:145
#: includes/admin/pages/class-wpcode-code-snippets-table.php:154
msgid "%1$s at %2$s"
msgstr ""

#. Translators: The tag by which to filter the list of snippets in the admin.
#: includes/admin/pages/class-wpcode-code-snippets-table.php:187
msgid "Filter snippets by tag: %s"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:254
msgid "Toggle Snippet Status"
msgstr ""

#. Translators: %1$s is the time since the snippet was deactivated, %2$s is the date and time of deactivation.
#: includes/admin/pages/class-wpcode-code-snippets-table.php:266
msgid "This snippet was automatically deactivated because of a fatal error at %2$s on %3$s (%1$s ago)"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:274
msgid "This snippet threw an error, you can see more details when editing the snippet."
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:325
#: includes/admin/pages/class-wpcode-code-snippets-table.php:406
msgid "Edit This Snippet"
msgstr ""

#. translators: %s: User display name
#: includes/admin/pages/class-wpcode-code-snippets-table.php:337
msgid "%s is currently editing"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:379
msgid "Restore this snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:380
#: includes/admin/pages/class-wpcode-code-snippets-table.php:463
msgid "Restore"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:396
msgid "Delete this snippet permanently"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:397
#: includes/admin/pages/class-wpcode-code-snippets-table.php:464
msgid "Delete Permanently"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:426
msgid "Move this snippet to trash"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:427
#: includes/admin/pages/class-wpcode-code-snippets-table.php:468
#: includes/admin/pages/class-wpcode-code-snippets-table.php:1082
msgid "Trash"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:446
msgid "Duplicate this snippet"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:447
msgid "Duplicate"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:470
msgid "Deactivate"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:699
#: includes/generator/class-wpcode-generator-query.php:298
msgid "ID"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:701
#: includes/conditional-logic/class-wpcode-conditional-page.php:152
#: includes/generator/class-wpcode-generator-post-type.php:378
#: includes/generator/class-wpcode-generator-query.php:225
#: includes/generator/class-wpcode-generator-query.php:299
msgid "Author"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:964
msgid "of"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:966
msgid "Current Page"
msgstr ""

#. Translators: %s: the number of items.
#: includes/admin/pages/class-wpcode-code-snippets-table.php:995
msgid "%s item"
msgid_plural "%s items"
msgstr[0] ""
msgstr[1] ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:1013
#: includes/generator/class-wpcode-generator-hooks.php:1337
msgid "Filter"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:1049
msgid "Filter by location"
msgstr ""

#: includes/admin/pages/class-wpcode-code-snippets-table.php:1051
msgid "All locations"
msgstr ""

#: includes/admin/pages/trait-wpcode-my-library-markup.php:230
msgid "My Library is a PRO Feature"
msgstr ""

#: includes/admin/pages/trait-wpcode-my-library-markup.php:231
msgid "Upgrade to WPCode PRO today and save your snippets in your private library directly from the plugin and import them with 1-click on other sites."
msgstr ""

#: includes/admin/pages/trait-wpcode-my-library-markup.php:233
msgid "Upgrade to PRO and Unlock \"My Library\""
msgstr ""

#: includes/admin/pages/trait-wpcode-my-library-markup.php:241
msgid "Save your snippets to your library"
msgstr ""

#: includes/admin/pages/trait-wpcode-my-library-markup.php:242
msgid "1-click import snippets from you library"
msgstr ""

#: includes/admin/pages/trait-wpcode-my-library-markup.php:243
msgid "Deploy new snippets from your account"
msgstr ""

#: includes/admin/pages/trait-wpcode-my-library-markup.php:244
msgid "Update snippets across all your sites"
msgstr ""

#: includes/admin/pages/trait-wpcode-revisions-display.php:96
#: includes/generator/class-wpcode-generator-query.php:514
msgid "Compare"
msgstr ""

#. Translators: time since the revision has been updated.
#: includes/admin/pages/trait-wpcode-revisions-display.php:106
msgid "Updated %s ago"
msgstr ""

#. Translators: The placeholder gets replaced with the extra number of revisions available.
#: includes/admin/pages/trait-wpcode-revisions-display.php:129
msgid "%d Other Revisions"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-admin.php:42
msgid "Admin Area"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-admin.php:53
msgid "Admin header"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-admin.php:54
msgid "Insert snippet in the wp-admin header area."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-admin.php:57
msgid "Admin footer"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-admin.php:58
msgid "Insert snippet in the wp-admin footer."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-archive.php:50
msgid "Categories, Archives, Tags, Taxonomies"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-archive.php:61
msgid "Insert Before Excerpt"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-archive.php:62
msgid "Insert snippet above post summary."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-archive.php:65
msgid "Insert After Excerpt"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-archive.php:66
msgid "Insert snippet below post summary."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-archive.php:69
msgid "Between Posts"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-archive.php:70
msgid "Insert snippet between multiple posts."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-archive.php:73
msgid "Before Post"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-archive.php:74
#: includes/auto-insert/class-wpcode-auto-insert-single.php:72
msgid "Insert snippet at the beginning of a post."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-archive.php:77
msgid "After Post"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-archive.php:78
#: includes/auto-insert/class-wpcode-auto-insert-single.php:76
msgid "Insert snippet at the end of a post."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-everywhere.php:59
msgid "PHP Snippets Only"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-everywhere.php:70
msgid "Run Everywhere"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-everywhere.php:71
msgid "Snippet gets executed everywhere on your website."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-everywhere.php:74
msgid "Frontend Only"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-everywhere.php:75
msgid "Snippet gets executed only in the frontend of the website."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-everywhere.php:78
msgid "Admin Only"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-everywhere.php:79
msgid "The snippet only gets executed in the wp-admin area."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-everywhere.php:82
msgid "Frontend Conditional Logic"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-everywhere.php:83
msgid "Ideal for running the snippet later with conditional logic rules in the frontend."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-everywhere.php:86
msgid "On Demand"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-everywhere.php:87
msgid "Execute this snippet on demand or programmatically just when you need it."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-single.php:60
msgid "Page, Post, Custom Post Type"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-single.php:71
msgid "Insert Before Post"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-single.php:75
msgid "Insert After Post"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-single.php:79
msgid "Insert Before Content"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-single.php:80
msgid "Insert snippet at the beginning of the post content."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-single.php:83
msgid "Insert After Content"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-single.php:84
msgid "Insert snippet at the end of the post content."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-single.php:87
msgid "Insert Before Paragraph"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-single.php:88
msgid "Insert snippet before paragraph # of the post content."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-single.php:91
msgid "Insert After Paragraph"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-single.php:92
msgid "Insert snippet after paragraph # of the post content."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-site-wide.php:49
msgid "Site Wide (Frontend)"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-site-wide.php:60
msgid "Site Wide Header"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-site-wide.php:61
msgid "Insert snippet between the head tags of your website on all pages."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-site-wide.php:64
msgid "Site Wide Body"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-site-wide.php:65
msgid "Insert the snippet just after the opening body tag."
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-site-wide.php:68
msgid "Site Wide Footer"
msgstr ""

#: includes/auto-insert/class-wpcode-auto-insert-site-wide.php:69
msgid "Insert the snippet in the footer just before the closing body tag."
msgstr ""

#: includes/capabilities.php:51
msgid "Edit Text/Blocks Snippets"
msgstr ""

#: includes/capabilities.php:52
msgid "This enables users to edit just text & blocks snippets, no HTML code is allowed."
msgstr ""

#: includes/capabilities.php:55
msgid "Edit HTML, JavaScript & CSS Snippets"
msgstr ""

#: includes/capabilities.php:56
msgid "This enables users to add and manage HTML, JavaScript & CSS snippets but also Text & Blocks snippets."
msgstr ""

#: includes/capabilities.php:59
msgid "Edit PHP Snippets"
msgstr ""

#: includes/capabilities.php:60
msgid "This enables users to add and manage PHP snippets and all the other types of snippets."
msgstr ""

#: includes/capabilities.php:63
msgid "Manage Conversion Pixels Settings"
msgstr ""

#: includes/capabilities.php:64
msgid "This enables users to manage the conversion pixels settings."
msgstr ""

#: includes/capabilities.php:67
msgid "Use the File Editor"
msgstr ""

#: includes/capabilities.php:68
msgid "This enables users to use the file editor."
msgstr ""

#: includes/class-wpcode-admin-bar-info.php:156
msgid "Snippets With Errors"
msgstr ""

#: includes/class-wpcode-admin-bar-info.php:175
msgid "Loaded on this page"
msgstr ""

#. translators: %d is the total number of global scripts.
#: includes/class-wpcode-admin-bar-info.php:196
msgid "Global Scripts (%d)"
msgstr ""

#: includes/class-wpcode-admin-bar-info.php:286
msgid "Gutenberg Block"
msgstr ""

#: includes/class-wpcode-admin-bar-info.php:348
msgid "Global Header"
msgstr ""

#: includes/class-wpcode-admin-bar-info.php:353
msgid "Global Body"
msgstr ""

#: includes/class-wpcode-admin-bar-info.php:357
msgid "Global Footer"
msgstr ""

#: includes/class-wpcode-admin-bar-info.php:360
msgid "Disabled via Page Scripts"
msgstr ""

#: includes/class-wpcode-admin-bar-info.php:396
msgid "+ Add Snippet"
msgstr ""

#: includes/class-wpcode-admin-bar-info.php:442
msgid "Help Docs"
msgstr ""

#: includes/class-wpcode-auto-insert.php:53
msgid "Global"
msgstr ""

#: includes/class-wpcode-auto-insert.php:54
msgid "Page-Specific"
msgstr ""

#: includes/class-wpcode-generator.php:94
msgid "Admin"
msgstr ""

#: includes/class-wpcode-generator.php:95
#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:59
msgid "Content"
msgstr ""

#: includes/class-wpcode-generator.php:96
msgid "Core"
msgstr ""

#: includes/class-wpcode-generator.php:97
msgid "Design"
msgstr ""

#: includes/class-wpcode-generator.php:98
#: includes/generator/class-wpcode-generator-post-type.php:539
msgid "Query"
msgstr ""

#: includes/class-wpcode-install.php:151
msgid "Snippet was deactivated due to an error."
msgstr ""

#: includes/class-wpcode-install.php:218
msgid "Display a message after the 1st paragraph of posts"
msgstr ""

#: includes/class-wpcode-install.php:230
msgid "Completely Disable Comments"
msgstr ""

#: includes/class-wpcode-library-auth.php:61
msgid "Your WordPress Site"
msgstr ""

#: includes/class-wpcode-library-auth.php:101
#: includes/class-wpcode-library-auth.php:171
msgid "You do not have permissions to connect WPCode to the library."
msgstr ""

#: includes/class-wpcode-library-auth.php:131
msgid "Authentication successfully completed"
msgstr ""

#: includes/class-wpcode-library-auth.php:132
msgid "Reloading page, please wait."
msgstr ""

#: includes/class-wpcode-smart-tags.php:43
msgid "Content ID"
msgstr ""

#: includes/class-wpcode-smart-tags.php:47
msgid "Content title"
msgstr ""

#: includes/class-wpcode-smart-tags.php:51
msgid "Content Categories"
msgstr ""

#: includes/class-wpcode-smart-tags.php:55
msgid "User's email"
msgstr ""

#: includes/class-wpcode-smart-tags.php:59
msgid "User's first name"
msgstr ""

#: includes/class-wpcode-smart-tags.php:63
msgid "User's last name"
msgstr ""

#: includes/class-wpcode-smart-tags.php:67
msgid "Custom Field (meta)"
msgstr ""

#: includes/class-wpcode-smart-tags.php:72
msgid "Author ID"
msgstr ""

#: includes/class-wpcode-smart-tags.php:76
msgid "Author Name"
msgstr ""

#: includes/class-wpcode-smart-tags.php:80
msgid "Author URL"
msgstr ""

#: includes/class-wpcode-smart-tags.php:84
msgid "Login URL"
msgstr ""

#: includes/class-wpcode-smart-tags.php:88
msgid "Logout URL"
msgstr ""

#: includes/class-wpcode-smart-tags.php:92
msgid "Permalink"
msgstr ""

#: includes/class-wpcode-smart-tags.php:99
msgid "Order number"
msgstr ""

#: includes/class-wpcode-smart-tags.php:103
msgid "Order subtotal"
msgstr ""

#: includes/class-wpcode-smart-tags.php:107
msgid "Order total"
msgstr ""

#: includes/class-wpcode-smart-tags.php:193
#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:202
msgid "Show Smart Tags"
msgstr ""

#: includes/class-wpcode-smart-tags.php:196
msgid "Hide Smart Tags"
msgstr ""

#: includes/class-wpcode-smart-tags.php:227
msgid "Learn more about Smart Tags"
msgstr ""

#: includes/class-wpcode-snippet-execute.php:131
msgid "HTML Snippet"
msgstr ""

#: includes/class-wpcode-snippet-execute.php:132
msgid "Easily insert scripts from other sites or build custom elements using HTML."
msgstr ""

#: includes/class-wpcode-snippet-execute.php:138
msgid "Text Snippet"
msgstr ""

#: includes/class-wpcode-snippet-execute.php:139
msgid "Create reusable text snippets that you can visually format in a familiar editor."
msgstr ""

#: includes/class-wpcode-snippet-execute.php:144
msgid "Blocks Snippet (PRO)"
msgstr ""

#: includes/class-wpcode-snippet-execute.php:146
msgid "Use the Block Editor to create components that you can insert anywhere in your site."
msgstr ""

#: includes/class-wpcode-snippet-execute.php:151
msgid "CSS Snippet"
msgstr ""

#: includes/class-wpcode-snippet-execute.php:152
msgid "Write CSS styles directly in WPCode and easily customize how your website looks."
msgstr ""

#: includes/class-wpcode-snippet-execute.php:157
msgid "SCSS Snippet (PRO)"
msgstr ""

#: includes/class-wpcode-snippet-execute.php:159
msgid "Write SCSS styles directly in WPCode and easily customize how your website looks."
msgstr ""

#: includes/class-wpcode-snippet-execute.php:164
msgid "JavaScript Snippet"
msgstr ""

#: includes/class-wpcode-snippet-execute.php:165
msgid "Add custom JavaScript code to your site to add interactivity or integrate with other services."
msgstr ""

#: includes/class-wpcode-snippet-execute.php:170
msgid "PHP Snippet"
msgstr ""

#: includes/class-wpcode-snippet-execute.php:171
msgid "Extend or add functionality using PHP code with full control on where it's executed"
msgstr ""

#: includes/class-wpcode-snippet-execute.php:176
msgid "Universal Snippet"
msgstr ""

#: includes/class-wpcode-snippet-execute.php:177
msgid "Start writing HTML and add PHP code like you would in a .php file with Universal snippets."
msgstr ""

#: includes/class-wpcode-snippet-execute.php:565
msgid "Snippet has not been activated due to an error."
msgstr ""

#: includes/class-wpcode-snippet-execute.php:569
msgid "Please click the back button in the browser to update the snippet."
msgstr ""

#: includes/class-wpcode-snippet-execute.php:572
msgid "WPCode has detected an error in one of the snippets which has now been automatically deactivated."
msgstr ""

#: includes/class-wpcode-snippet-execute.php:586
msgid "View Snippets With Errors"
msgstr ""

#: includes/class-wpcode-snippet-execute.php:600
msgid "View error logs"
msgstr ""

#: includes/class-wpcode-snippet-execute.php:609
msgid "Enable error logging"
msgstr ""

#: includes/class-wpcode-snippet.php:694
msgid "Untitled Snippet"
msgstr ""

#. translators: %s: Snippet title and ID used in the error log for clarity.
#: includes/class-wpcode-snippet.php:743
msgid "Snippet %s was automatically deactivated due to a fatal error."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:37
msgid "Page"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:48
msgid "Type of page"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:49
msgid "Choose a WordPress-specific type of page for your rule."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:53
msgid "Homepage"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:57
msgid "Archive"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:61
msgid "Single post/page"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:65
msgid "Search page"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:69
msgid "404 page"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:73
msgid "Author page"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:77
msgid "Blog home"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:84
#: includes/generator/class-wpcode-generator-query.php:204
msgid "Post type"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:85
msgid "Target by post type: posts, pages or custom post types."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:91
msgid "Referrer"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:92
msgid "Use the page referrer/last visited page url as a condition."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:97
msgid "Taxonomy page"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:98
msgid "Load only on pages for a specific category/taxonomy."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:104
msgid "Taxonomy term"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:105
msgid "Choose category/taxonomy terms to target for single or archive pages."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:113
msgid "Page URL"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:114
msgid "Use the page URL to limit where this snippet is loaded."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:119
msgid "Post meta"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:120
msgid "Target specific posts based on custom post meta values."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:124
msgid "Post Meta rules are a Pro feature"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:125
#: includes/conditional-logic/class-wpcode-conditional-page.php:136
msgid "Upgrade today to create conditional logic rules for specific pages or posts."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:130
msgid "Post/Page"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:131
msgid "Pick specific posts or pages to load the snippet on."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:135
msgid "Post specific rules are a Pro feature"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:141
msgid "Page Template"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:142
msgid "Load the snippet only on pages with a specific template."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:146
msgid "Page Template rules are a Pro feature"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:147
msgid "Upgrade today to create conditional logic rules for specific page templates."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:153
msgid "Load the snippet only on pages with a specific author."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:157
msgid "Post Author rules are a Pro feature"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-page.php:158
msgid "Upgrade today to create conditional logic rules based on the page/post author."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-user.php:37
msgid "User"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-user.php:48
msgid "Logged-in"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-user.php:49
msgid "Check if your site visitor is logged in."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-user.php:53
msgid "True"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-user.php:57
msgid "False"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-user.php:64
msgid "User Role"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-user.php:65
msgid "Target a specific user role."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-user.php:71
msgid "User Meta"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-user.php:72
msgid "Target users based on user meta values."
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-user.php:76
msgid "User Meta is a Pro Feature"
msgstr ""

#: includes/conditional-logic/class-wpcode-conditional-user.php:77
msgid "Get access to User Meta conditional logic rules by upgrading to PRO today."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:35
msgid "Admin Bar Menu"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:36
msgid "Add a custom admin bar menu with links or content."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:47
#: includes/generator/class-wpcode-generator-contact-methods.php:47
#: includes/generator/class-wpcode-generator-cronjob.php:47
#: includes/generator/class-wpcode-generator-hooks.php:1279
#: includes/generator/class-wpcode-generator-menu.php:47
#: includes/generator/class-wpcode-generator-post-status.php:47
#: includes/generator/class-wpcode-generator-post-type.php:47
#: includes/generator/class-wpcode-generator-query.php:72
#: includes/generator/class-wpcode-generator-script.php:47
#: includes/generator/class-wpcode-generator-sidebar.php:47
#: includes/generator/class-wpcode-generator-style.php:47
#: includes/generator/class-wpcode-generator-taxonomy.php:47
#: includes/generator/class-wpcode-generator-widget.php:47
msgid "Info"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:54
#: includes/generator/class-wpcode-generator-contact-methods.php:54
#: includes/generator/class-wpcode-generator-cronjob.php:54
#: includes/generator/class-wpcode-generator-hooks.php:1286
#: includes/generator/class-wpcode-generator-menu.php:54
#: includes/generator/class-wpcode-generator-post-status.php:54
#: includes/generator/class-wpcode-generator-post-type.php:54
#: includes/generator/class-wpcode-generator-query.php:79
#: includes/generator/class-wpcode-generator-script.php:54
#: includes/generator/class-wpcode-generator-sidebar.php:54
#: includes/generator/class-wpcode-generator-style.php:54
#: includes/generator/class-wpcode-generator-taxonomy.php:54
#: includes/generator/class-wpcode-generator-widget.php:54
msgid "Overview"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:55
msgid "Generate a snippet to add a custom menu to the admin bar by filling in a simple form."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:63
#: includes/generator/class-wpcode-generator-contact-methods.php:63
#: includes/generator/class-wpcode-generator-cronjob.php:68
#: includes/generator/class-wpcode-generator-hooks.php:1304
#: includes/generator/class-wpcode-generator-menu.php:68
#: includes/generator/class-wpcode-generator-post-status.php:63
#: includes/generator/class-wpcode-generator-post-type.php:63
#: includes/generator/class-wpcode-generator-query.php:93
#: includes/generator/class-wpcode-generator-script.php:63
#: includes/generator/class-wpcode-generator-sidebar.php:68
#: includes/generator/class-wpcode-generator-style.php:63
#: includes/generator/class-wpcode-generator-taxonomy.php:63
#: includes/generator/class-wpcode-generator-widget.php:63
msgid "Usage"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:65
#: includes/generator/class-wpcode-generator-contact-methods.php:65
msgid "Fill in the forms sections using the menu on the left."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:66
#: includes/generator/class-wpcode-generator-contact-methods.php:66
#: includes/generator/class-wpcode-generator-cronjob.php:71
#: includes/generator/class-wpcode-generator-hooks.php:1307
#: includes/generator/class-wpcode-generator-menu.php:71
#: includes/generator/class-wpcode-generator-post-status.php:66
#: includes/generator/class-wpcode-generator-post-type.php:66
#: includes/generator/class-wpcode-generator-query.php:96
#: includes/generator/class-wpcode-generator-script.php:66
#: includes/generator/class-wpcode-generator-sidebar.php:71
#: includes/generator/class-wpcode-generator-style.php:66
#: includes/generator/class-wpcode-generator-taxonomy.php:66
#: includes/generator/class-wpcode-generator-widget.php:66
msgid "Click the \"Update Code\" button."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:67
#: includes/generator/class-wpcode-generator-contact-methods.php:67
#: includes/generator/class-wpcode-generator-cronjob.php:72
#: includes/generator/class-wpcode-generator-hooks.php:1308
#: includes/generator/class-wpcode-generator-menu.php:72
#: includes/generator/class-wpcode-generator-post-status.php:67
#: includes/generator/class-wpcode-generator-post-type.php:67
#: includes/generator/class-wpcode-generator-query.php:97
#: includes/generator/class-wpcode-generator-script.php:67
#: includes/generator/class-wpcode-generator-sidebar.php:72
#: includes/generator/class-wpcode-generator-style.php:67
#: includes/generator/class-wpcode-generator-taxonomy.php:67
#: includes/generator/class-wpcode-generator-widget.php:67
msgid "Click on \"Use Snippet\" to create a new snippet with the generated code."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:68
#: includes/generator/class-wpcode-generator-contact-methods.php:68
#: includes/generator/class-wpcode-generator-cronjob.php:73
#: includes/generator/class-wpcode-generator-hooks.php:1309
#: includes/generator/class-wpcode-generator-menu.php:73
#: includes/generator/class-wpcode-generator-post-status.php:68
#: includes/generator/class-wpcode-generator-post-type.php:68
#: includes/generator/class-wpcode-generator-query.php:98
#: includes/generator/class-wpcode-generator-script.php:68
#: includes/generator/class-wpcode-generator-sidebar.php:73
#: includes/generator/class-wpcode-generator-style.php:68
#: includes/generator/class-wpcode-generator-taxonomy.php:68
#: includes/generator/class-wpcode-generator-widget.php:68
msgid "Activate and save the snippet and you're ready to go"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:77
#: includes/generator/class-wpcode-generator-contact-methods.php:77
#: includes/generator/class-wpcode-generator-cronjob.php:82
#: includes/generator/class-wpcode-generator-hooks.php:1318
#: includes/generator/class-wpcode-generator-menu.php:82
#: includes/generator/class-wpcode-generator-post-status.php:77
#: includes/generator/class-wpcode-generator-post-type.php:77
#: includes/generator/class-wpcode-generator-query.php:107
#: includes/generator/class-wpcode-generator-script.php:77
#: includes/generator/class-wpcode-generator-sidebar.php:82
#: includes/generator/class-wpcode-generator-style.php:77
#: includes/generator/class-wpcode-generator-taxonomy.php:77
#: includes/generator/class-wpcode-generator-widget.php:77
msgid "Examples"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:78
msgid "You could add a new admin bar menu for links you use often, a list of posts, a site you often visit when in the admin, etc."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:84
#: includes/generator/class-wpcode-generator-contact-methods.php:84
#: includes/generator/class-wpcode-generator-cronjob.php:89
#: includes/generator/class-wpcode-generator-menu.php:89
#: includes/generator/class-wpcode-generator-post-status.php:84
#: includes/generator/class-wpcode-generator-post-type.php:84
#: includes/generator/class-wpcode-generator-query.php:114
#: includes/generator/class-wpcode-generator-script.php:89
#: includes/generator/class-wpcode-generator-sidebar.php:89
#: includes/generator/class-wpcode-generator-style.php:89
#: includes/generator/class-wpcode-generator-taxonomy.php:84
#: includes/generator/class-wpcode-generator-widget.php:84
msgid "General"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:90
#: includes/generator/class-wpcode-generator-contact-methods.php:90
#: includes/generator/class-wpcode-generator-cronjob.php:95
#: includes/generator/class-wpcode-generator-menu.php:95
#: includes/generator/class-wpcode-generator-post-status.php:90
#: includes/generator/class-wpcode-generator-post-type.php:90
#: includes/generator/class-wpcode-generator-script.php:95
#: includes/generator/class-wpcode-generator-sidebar.php:95
#: includes/generator/class-wpcode-generator-style.php:95
#: includes/generator/class-wpcode-generator-taxonomy.php:90
msgid "Function name"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:91
#: includes/generator/class-wpcode-generator-cronjob.php:96
#: includes/generator/class-wpcode-generator-menu.php:96
#: includes/generator/class-wpcode-generator-post-status.php:91
#: includes/generator/class-wpcode-generator-post-type.php:91
#: includes/generator/class-wpcode-generator-script.php:96
#: includes/generator/class-wpcode-generator-sidebar.php:96
#: includes/generator/class-wpcode-generator-style.php:96
#: includes/generator/class-wpcode-generator-taxonomy.php:91
msgid "Make this unique to avoid conflicts with other snippets"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:101
msgid "Position"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:102
msgid "Select where you want the menu item to be displayed on the admin bar."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:106
msgid "Last item on the left"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:107
msgid "Before Site Name"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:108
msgid "After Site Name"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:109
msgid "Before \"New\" Button"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:110
msgid "After \"New\" Button"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:117
msgid "Menu Structure"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:123
msgid "Menu ID"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:124
msgid "Unique menu id for the admin bar menu."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:131
msgid "Menu Title"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:132
msgid "Text or HTML that will show up in the admin bar top-level item. Use HTML if you want to display an image."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:139
msgid "Menu item link"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:140
msgid "If left empty, the top level menu item will not be a link, just text."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:147
msgid "Menu item target"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:148
msgid "The menu item is a link use this field to set the target attribute. Use \"_blank\" to open the link in a new tab."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:158
msgid "Submenu Item Title"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:159
msgid "Text or HTML for the submenu item."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:167
msgid "Submenu item link"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:168
msgid "If left empty, this menu item will not be a link, just text."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:176
msgid "Submenu item target attribute"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:177
msgid "If the menu item is a link use this for the target attribute. Use \"_blank\" to open in a new tab."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:188
msgid "Add more submenu items"
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:189
msgid "Use the \"Add submenu item\" button below to add multiple submenu items."
msgstr ""

#: includes/generator/class-wpcode-generator-admin-bar.php:193
msgid "Add submenu item"
msgstr ""

#: includes/generator/class-wpcode-generator-contact-methods.php:35
#: includes/generator/class-wpcode-generator-contact-methods.php:111
msgid "Contact Methods"
msgstr ""

#: includes/generator/class-wpcode-generator-contact-methods.php:36
msgid "Add additional contact methods to WordPress user profiles."
msgstr ""

#: includes/generator/class-wpcode-generator-contact-methods.php:55
msgid "Use this generator to create a snippet which adds more contact methods to your WordPress users profiles."
msgstr ""

#: includes/generator/class-wpcode-generator-contact-methods.php:78
msgid "You can add extra fields for user profiles like their extended address, city, country, phone number, social media profiles (Facebook, Twitter, etc)."
msgstr ""

#: includes/generator/class-wpcode-generator-contact-methods.php:91
msgid "Make this unique to avoid conflicts with other snippets."
msgstr ""

#: includes/generator/class-wpcode-generator-contact-methods.php:101
#: includes/generator/class-wpcode-generator-cronjob.php:106
#: includes/generator/class-wpcode-generator-menu.php:106
#: includes/generator/class-wpcode-generator-post-status.php:101
#: includes/generator/class-wpcode-generator-post-type.php:101
#: includes/generator/class-wpcode-generator-sidebar.php:106
#: includes/generator/class-wpcode-generator-taxonomy.php:102
#: includes/generator/class-wpcode-generator-widget.php:113
msgid "Text Domain"
msgstr ""

#: includes/generator/class-wpcode-generator-contact-methods.php:102
#: includes/generator/class-wpcode-generator-cronjob.php:107
#: includes/generator/class-wpcode-generator-menu.php:107
#: includes/generator/class-wpcode-generator-post-status.php:102
#: includes/generator/class-wpcode-generator-post-type.php:102
#: includes/generator/class-wpcode-generator-sidebar.php:107
#: includes/generator/class-wpcode-generator-taxonomy.php:103
msgid "Optional text domain for translations."
msgstr ""

#: includes/generator/class-wpcode-generator-contact-methods.php:117
msgid "Contact Method Slug"
msgstr ""

#: includes/generator/class-wpcode-generator-contact-methods.php:118
msgid "A lowercase with no spaces slug for usage in the code. For example: \"facebook\" or \"telephone\"."
msgstr ""

#: includes/generator/class-wpcode-generator-contact-methods.php:126
msgid "Contact Method Label"
msgstr ""

#: includes/generator/class-wpcode-generator-contact-methods.php:127
msgid "This will show up as a label next to the contact method field. For example: \"Facebook URL\" or \"Phone number\"."
msgstr ""

#: includes/generator/class-wpcode-generator-contact-methods.php:138
msgid "Add more contact methods"
msgstr ""

#: includes/generator/class-wpcode-generator-contact-methods.php:139
msgid "Use the \"Add contact method\" button below to add as many contact methods as you wish."
msgstr ""

#: includes/generator/class-wpcode-generator-contact-methods.php:143
msgid "Add contact method"
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:35
msgid "Schedule a Cron Job"
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:36
msgid "Generate a snippet to schedule a recurring event using the WordPress cron."
msgstr ""

#. Translators: Placeholders add links to the wordpress.org references.
#: includes/generator/class-wpcode-generator-cronjob.php:57
msgid "This generator makes it easy to generate a snippet that will schedule a recurring event using %1$swp_schedule_event%2$s."
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:70
#: includes/generator/class-wpcode-generator-hooks.php:1306
#: includes/generator/class-wpcode-generator-menu.php:70
#: includes/generator/class-wpcode-generator-post-status.php:65
#: includes/generator/class-wpcode-generator-post-type.php:65
#: includes/generator/class-wpcode-generator-query.php:95
#: includes/generator/class-wpcode-generator-script.php:65
#: includes/generator/class-wpcode-generator-sidebar.php:70
#: includes/generator/class-wpcode-generator-style.php:65
#: includes/generator/class-wpcode-generator-taxonomy.php:65
#: includes/generator/class-wpcode-generator-widget.php:65
msgid "Fill in the forms using the menu on the left."
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:83
msgid "You may want to run some code once every hour, day or week, for example you could use this to send an email with the number of published posts every week."
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:116
#: includes/lite/conditional-logic/class-wpcode-conditional-schedule.php:37
msgid "Schedule"
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:122
msgid "Recurrence"
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:123
msgid "Choose how often you want this event to run."
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:127
msgid "Hourly"
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:128
msgid "Twice Daily"
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:129
msgid "Daily"
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:130
msgid "Custom"
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:138
msgid "Custom Recurrence Name"
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:139
msgid "This is the recurrence name slug, lowercase and no space."
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:145
msgid "Custom Recurrence Label"
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:148
msgid "This label will be used in a list of cron events, for example."
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:152
msgid "Custom Recurrence Interval"
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:155
msgid "The number of seconds of this interval."
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:161
#: includes/generator/class-wpcode-generator-hooks.php:1379
msgid "Code"
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:167
#: includes/generator/class-wpcode-generator-hooks.php:1342
msgid "Hook name"
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:168
msgid "Unique name of your hook used to run when scheduled."
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:177
#: includes/generator/class-wpcode-generator-hooks.php:1385
msgid "PHP Code"
msgstr ""

#: includes/generator/class-wpcode-generator-cronjob.php:178
msgid "Custom PHP code that will run when the event is triggered."
msgstr ""

#: includes/generator/class-wpcode-generator-hooks.php:35
msgid "Hooks"
msgstr ""

#: includes/generator/class-wpcode-generator-hooks.php:36
msgid "Generate a snippet for an action or a filter using any available hook."
msgstr ""

#. Translators: Placeholders add links to the wordpress.org references.
#: includes/generator/class-wpcode-generator-hooks.php:1289
msgid "Using this generator you can safely add custom %1$shooks%2$s using either %3$sadd_action%4$s or %5$sadd_filter%6$s."
msgstr ""

#: includes/generator/class-wpcode-generator-hooks.php:1319
msgid "You can use this to quickly get started with adding an action or filter."
msgstr ""

#: includes/generator/class-wpcode-generator-hooks.php:1325
msgid "Hook Details"
msgstr ""

#: includes/generator/class-wpcode-generator-hooks.php:1331
msgid "Hook type"
msgstr ""

#: includes/generator/class-wpcode-generator-hooks.php:1332
msgid "Can be either an action or a filter"
msgstr ""

#: includes/generator/class-wpcode-generator-hooks.php:1336
msgid "Action"
msgstr ""

#: includes/generator/class-wpcode-generator-hooks.php:1343
msgid "Input hook name or pick one from the suggested list as you type."
msgstr ""

#: includes/generator/class-wpcode-generator-hooks.php:1353
msgid "Callback function"
msgstr ""

#: includes/generator/class-wpcode-generator-hooks.php:1354
msgid "Name of the function you want to add to this hook."
msgstr ""

#: includes/generator/class-wpcode-generator-hooks.php:1361
msgid "Priority of this hook, by default 10."
msgstr ""

#: includes/generator/class-wpcode-generator-hooks.php:1370
msgid "Arguments list"
msgstr ""

#: includes/generator/class-wpcode-generator-hooks.php:1371
msgid "Add comma-separated custom arguments that will be passed to the callback function depending on the action/filter."
msgstr ""

#: includes/generator/class-wpcode-generator-hooks.php:1386
msgid "Custom PHP code you want to run in the function, you can also edit this after you create the snippet."
msgstr ""

#: includes/generator/class-wpcode-generator-menu.php:35
msgid "Navigation Menu"
msgstr ""

#: includes/generator/class-wpcode-generator-menu.php:36
msgid "Generate a snippet to register new navigation menus for your website."
msgstr ""

#. Translators: Placeholders add links to the wordpress.org references.
#: includes/generator/class-wpcode-generator-menu.php:57
msgid "This generator makes it easy to add new navigation menus to your website using the \"register_nav_menus\" function."
msgstr ""

#: includes/generator/class-wpcode-generator-menu.php:83
msgid "You can add a new navigation menu for your website to display in a flyout menu that is not part of the theme, for example."
msgstr ""

#: includes/generator/class-wpcode-generator-menu.php:116
msgid "Menus"
msgstr ""

#: includes/generator/class-wpcode-generator-menu.php:122
msgid "Menu name"
msgstr ""

#: includes/generator/class-wpcode-generator-menu.php:123
msgid "This is the menu name slug, lowercase and no space."
msgstr ""

#: includes/generator/class-wpcode-generator-menu.php:130
msgid "Menu label"
msgstr ""

#: includes/generator/class-wpcode-generator-menu.php:131
msgid "Add a descriptive label for this menu in the admin."
msgstr ""

#: includes/generator/class-wpcode-generator-menu.php:141
msgid "Add another menu"
msgstr ""

#: includes/generator/class-wpcode-generator-menu.php:142
msgid "Use the \"Add menu\" button below to add as many menu locations as you need."
msgstr ""

#: includes/generator/class-wpcode-generator-menu.php:146
msgid "Add Menu"
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:35
#: includes/generator/class-wpcode-generator-post-status.php:117
msgid "Post Status"
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:36
msgid "Use this tool to generate a custom post status for your posts."
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:55
msgid "Generate custom post statuses for your posts to improve the way you manage content."
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:78
msgid "You could add a new status called \"Pending Review\" that your authors can use before the content will be published"
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:118
msgid "Name of status used in the code, lowercase maximum 32 characters."
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:129
msgid "The singular name that will be displayed in the admin. "
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:136
#: includes/generator/class-wpcode-generator-post-type.php:144
#: includes/generator/class-wpcode-generator-taxonomy.php:137
msgid "Name (Plural)"
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:137
msgid "The post status plural name. For example: Drafts."
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:146
#: includes/generator/class-wpcode-generator-post-type.php:441
#: includes/generator/class-wpcode-generator-taxonomy.php:309
msgid "Visibility"
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:152
#: includes/generator/class-wpcode-generator-post-type.php:447
#: includes/generator/class-wpcode-generator-taxonomy.php:315
msgid "Public"
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:153
#: includes/generator/class-wpcode-generator-post-status.php:167
msgid "Should the posts with this status be visible in the frontend?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:156
#: includes/generator/class-wpcode-generator-post-status.php:184
msgid "Yes - Default"
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:157
#: includes/generator/class-wpcode-generator-post-status.php:185
#: includes/generator/class-wpcode-generator-post-type.php:411
#: includes/generator/class-wpcode-generator-post-type.php:426
#: includes/generator/class-wpcode-generator-post-type.php:454
#: includes/generator/class-wpcode-generator-post-type.php:465
#: includes/generator/class-wpcode-generator-post-type.php:479
#: includes/generator/class-wpcode-generator-post-type.php:521
#: includes/generator/class-wpcode-generator-post-type.php:532
#: includes/generator/class-wpcode-generator-post-type.php:552
#: includes/generator/class-wpcode-generator-post-type.php:622
#: includes/generator/class-wpcode-generator-post-type.php:636
#: includes/generator/class-wpcode-generator-post-type.php:647
#: includes/generator/class-wpcode-generator-query.php:137
#: includes/generator/class-wpcode-generator-query.php:342
#: includes/generator/class-wpcode-generator-query.php:437
#: includes/generator/class-wpcode-generator-script.php:210
#: includes/generator/class-wpcode-generator-script.php:229
#: includes/generator/class-wpcode-generator-style.php:211
#: includes/generator/class-wpcode-generator-style.php:230
#: includes/generator/class-wpcode-generator-taxonomy.php:322
#: includes/generator/class-wpcode-generator-taxonomy.php:336
#: includes/generator/class-wpcode-generator-taxonomy.php:347
#: includes/generator/class-wpcode-generator-taxonomy.php:361
#: includes/generator/class-wpcode-generator-taxonomy.php:372
#: includes/generator/class-wpcode-generator-taxonomy.php:417
msgid "No"
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:166
msgid "Exclude from search results"
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:171
#: includes/generator/class-wpcode-generator-post-status.php:196
msgid "No - Default"
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:180
msgid "Show in admin all list"
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:181
msgid "Show statuses in the edit listing of the post."
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:191
msgid "Show in admin status list"
msgstr ""

#: includes/generator/class-wpcode-generator-post-status.php:192
msgid "Show statuses list at the top of the edit listings. e.g. Published (12) Custom Status (2)"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:35
#: includes/generator/class-wpcode-generator-post-type.php:111
msgid "Post Type"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:36
msgid "Use this tool to generate a custom post type for your website."
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:55
msgid "Generate custom post types for your website using a snippet."
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:78
msgid "You can add custom post types for specific items that are not blog posts, for example, if your site is about music you can have post types for artists, albums or songs."
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:117
msgid "Post Type Key"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:118
msgid "Name of post type used in the code, lowercase maximum 20 characters."
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:125
#: includes/generator/class-wpcode-generator-sidebar.php:138
#: includes/generator/class-wpcode-generator-widget.php:150
#: includes/generator/class-wpcode-generator-widget.php:223
msgid "Description"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:126
msgid "A short description of the post type."
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:137
msgid "The singular post type name (e.g. Artist, Album, Song)."
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:145
msgid "The post type plural name (e.g. Artists, Albums, Songs)."
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:155
msgid "Link To Taxonomies"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:156
msgid "Comma-separated list of Taxonomies (e.g. post_tag, category)"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:163
#: includes/generator/class-wpcode-generator-taxonomy.php:156
msgid "Hierarchical"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:164
msgid "Hierarchical post types can have parents/children."
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:168
msgid "Yes, like pages"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:169
msgid "No, like posts"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:176
#: includes/generator/class-wpcode-generator-taxonomy.php:169
msgid "Labels"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:182
#: includes/generator/class-wpcode-generator-taxonomy.php:175
msgid "Menu Name"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:189
msgid "Admin Bar Name"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:196
msgid "Archives"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:203
msgid "Attributes"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:210
#: includes/generator/class-wpcode-generator-taxonomy.php:189
msgid "Parent Item"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:217
#: includes/generator/class-wpcode-generator-taxonomy.php:182
msgid "All Items"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:224
#: includes/generator/class-wpcode-generator-taxonomy.php:210
msgid "Add New Item"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:238
msgid "New Item"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:248
#: includes/generator/class-wpcode-generator-taxonomy.php:220
msgid "Edit Item"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:255
#: includes/generator/class-wpcode-generator-taxonomy.php:227
msgid "Update Item"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:262
#: includes/generator/class-wpcode-generator-taxonomy.php:234
msgid "View Item"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:269
msgid "View Items"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:276
msgid "Search Item"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:283
#: includes/generator/class-wpcode-generator-taxonomy.php:279
msgid "Not Found"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:290
msgid "Not Found in Trash"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:297
msgid "Featured Image"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:304
msgid "Set featured image"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:314
msgid "Remove featured image"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:321
msgid "Use as featured image"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:328
msgid "Insert into item"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:335
msgid "Uploaded to this item"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:342
#: includes/generator/class-wpcode-generator-taxonomy.php:293
msgid "Items list"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:349
#: includes/generator/class-wpcode-generator-taxonomy.php:300
msgid "Items list navigation"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:356
msgid "Filter items list"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:365
#: includes/generator/class-wpcode-generator-widget.php:239
msgid "Options"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:371
msgid "Supports"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:372
msgid "Select which features this post type should support"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:376
#: includes/generator/class-wpcode-generator-query.php:300
msgid "Title"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:377
msgid "Content Editor"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:379
msgid "Featured image"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:380
msgid "Excerpt"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:381
msgid "Trackbacks"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:382
#: includes/generator/class-wpcode-generator-query.php:487
msgid "Custom Fields"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:383
msgid "Comments"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:385
msgid "Page Attributes"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:386
msgid "Post Formats"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:394
msgid "Exclude From Search"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:395
msgid "Exclude the posts of this post type from search results?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:400
#: includes/generator/class-wpcode-generator-post-type.php:758
#: includes/generator/class-wpcode-generator-taxonomy.php:427
#: includes/generator/class-wpcode-generator-taxonomy.php:506
msgid "No - default"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:405
msgid "Enable Export"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:406
msgid "Allow exporting posts of this post type in Tools > Export."
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:410
#: includes/generator/class-wpcode-generator-post-type.php:424
#: includes/generator/class-wpcode-generator-post-type.php:453
#: includes/generator/class-wpcode-generator-post-type.php:464
#: includes/generator/class-wpcode-generator-post-type.php:478
#: includes/generator/class-wpcode-generator-post-type.php:520
#: includes/generator/class-wpcode-generator-post-type.php:531
#: includes/generator/class-wpcode-generator-post-type.php:621
#: includes/generator/class-wpcode-generator-post-type.php:635
#: includes/generator/class-wpcode-generator-post-type.php:646
#: includes/generator/class-wpcode-generator-taxonomy.php:321
#: includes/generator/class-wpcode-generator-taxonomy.php:335
#: includes/generator/class-wpcode-generator-taxonomy.php:346
#: includes/generator/class-wpcode-generator-taxonomy.php:360
#: includes/generator/class-wpcode-generator-taxonomy.php:371
#: includes/generator/class-wpcode-generator-taxonomy.php:416
msgid "Yes - default"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:419
msgid "Enable Archives"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:420
msgid "Enables archives for this post type, the post type key is used as default."
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:425
msgid "Yes - using custom slug"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:431
msgid "Custom Archive Slug"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:432
msgid "Custom archive slug (if selected above)."
msgstr ""

#. Translators: Placeholders add a link to the wp.org documentation page.
#: includes/generator/class-wpcode-generator-post-type.php:449
msgid "Should this post type be %1$svisible to authors%2$s?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:459
#: includes/generator/class-wpcode-generator-taxonomy.php:330
msgid "Show UI"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:460
msgid "Should this post type be visible in the Admin?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:473
msgid "Show in Menu?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:474
msgid "Should this post type be visible in the admin menu?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:484
msgid "Menu position"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:485
msgid "Choose the admin menu position."
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:489
msgid "Below Posts (5)"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:490
msgid "Below Media (10)"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:491
msgid "Below Pages (20)"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:492
msgid "Below Comments (30)"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:493
msgid "Below First Separator (60)"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:494
msgid "Below Plugins (65)"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:495
msgid "Below Users (70)"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:496
msgid "Below Tools (75)"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:497
msgid "Below Settings (80)"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:498
msgid "Below Second Separator (100)"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:503
msgid "Menu Icon"
msgstr ""

#. Translators: Placeholder adds a link to the dashicons page.
#: includes/generator/class-wpcode-generator-post-type.php:505
msgid "Icon used next to the post type label in the admin menu. Use either a %1$sdashicon%2$s name or a full URL to an image file."
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:515
msgid "Show in Admin Bar?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:516
msgid "Should this post type be visible in the admin bar?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:526
msgid "Show in Navigation Menus?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:527
msgid "Should this post type be available for use in menus (Appearance > Menus)?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:545
msgid "Publicly Queryable"
msgstr ""

#. Translators: Placeholders add link to wp.org docs.
#: includes/generator/class-wpcode-generator-post-type.php:547
msgid "Enable frontend requests using the query variable. %1$sSee Documentation.%2$s"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:560
msgid "Query variable"
msgstr ""

#. Translators: Placeholders add link to wp.org docs.
#: includes/generator/class-wpcode-generator-post-type.php:562
msgid "Key used for querying posts in the frontend. %1$sSee Documentation.%2$s"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:566
#: includes/generator/class-wpcode-generator-post-type.php:598
msgid "Default (post type key)"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:567
msgid "Custom variable"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:575
msgid "Custom Query Variable"
msgstr ""

#. Translators: Placeholder adds a link to the dashicons page.
#: includes/generator/class-wpcode-generator-post-type.php:577
msgid "The custom query variable to use for this post type. %1$sSee documentation%2$s."
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:586
#: includes/generator/class-wpcode-generator-taxonomy.php:379
msgid "Permalinks"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:592
msgid "Rewrite Permalinks"
msgstr ""

#. Translators: Placeholders add link to wp.org docs.
#: includes/generator/class-wpcode-generator-post-type.php:594
msgid "Use the default permalink structure, disable permalinks for this post type or use custom options. %1$sSee Documentation.%2$s"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:599
#: includes/generator/class-wpcode-generator-taxonomy.php:391
msgid "Disable permalink rewrites"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:600
#: includes/generator/class-wpcode-generator-taxonomy.php:392
msgid "Custom permalink structure"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:608
#: includes/generator/class-wpcode-generator-taxonomy.php:400
msgid "URL Slug"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:609
msgid "The slug used for this post types base. (for example: artist in www.example.com/artist/ )"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:616
msgid "Use URL Slug?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:617
msgid "Use the post type name as URL slug base?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:630
msgid "Use pagination?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:631
msgid "Allow the post type to have pagination?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:641
msgid "Use feeds?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:642
msgid "Allow the post type to have feeds?"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:654
#: includes/generator/class-wpcode-generator-post-type.php:660
#: includes/generator/class-wpcode-generator-taxonomy.php:435
#: includes/generator/class-wpcode-generator-taxonomy.php:441
msgid "Capabilities"
msgstr ""

#. Translators: Placeholders add link to wp.org docs.
#: includes/generator/class-wpcode-generator-post-type.php:662
msgid "User capabilities in relation to this post type. %1$sSee Documentation.%2$s"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:666
#: includes/generator/class-wpcode-generator-taxonomy.php:447
msgid "Base capabilities - default"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:667
#: includes/generator/class-wpcode-generator-post-type.php:686
#: includes/generator/class-wpcode-generator-taxonomy.php:448
#: includes/generator/class-wpcode-generator-taxonomy.php:453
msgid "Custom Capabilities"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:672
msgid "Base Capablities Type"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:673
msgid "Use base capabilities from a core post type."
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:677
msgid "Posts"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:678
msgid "Pages"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:687
msgid "Use the fields below to use custom capabilities for this post type."
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:691
msgid "Read Post"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:698
msgid "Read Private Posts"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:705
msgid "Publish Posts"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:715
msgid "Delete Posts"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:722
msgid "Edit Post"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:729
msgid "Edit Posts"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:736
msgid "Edit Others Posts"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:745
#: includes/generator/class-wpcode-generator-taxonomy.php:494
msgid "Rest API"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:751
#: includes/generator/class-wpcode-generator-taxonomy.php:500
msgid "Show in Rest API?"
msgstr ""

#. Translators: Placeholders add link to wp.org docs.
#: includes/generator/class-wpcode-generator-post-type.php:753
msgid "Add the post type to the WordPress wp-json API. %1$sSee Documentation.%2$s"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:766
#: includes/generator/class-wpcode-generator-taxonomy.php:514
msgid "Rest Base"
msgstr ""

#. Translators: Placeholders add link to wp.org docs.
#: includes/generator/class-wpcode-generator-post-type.php:768
msgid "The base slug that this post type will use in the REST API. %1$sSee Documentation.%2$s"
msgstr ""

#: includes/generator/class-wpcode-generator-post-type.php:777
#: includes/generator/class-wpcode-generator-taxonomy.php:524
msgid "Rest Controller Class"
msgstr ""

#. Translators: Placeholders add link to wp.org docs.
#: includes/generator/class-wpcode-generator-post-type.php:779
msgid "The name of a custom Rest Controller class instead of WP_REST_Posts_Controller. %1$sSee Documentation.%2$s"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:42
msgid "WP_Query"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:43
msgid "Generate a snippet using WP_Query to load posts from your website."
msgstr ""

#. Translators: Placeholders add links to the wordpress.org references.
#: includes/generator/class-wpcode-generator-query.php:82
msgid "This generator makes it easy for you to create custom queries using %1$sWP_Query%2$s which you can then extend to display posts or similar."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:108
msgid "You can use this generator to get quickly started with a query for all the posts of an author and display them using the shortcode functionality of WPCode or automatically displaying the posts using the auto-insert option."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:120
msgid "Query variable name"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:121
msgid "If you want to use something more specific. The leading $ will be automatically added."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:131
msgid "Include loop"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:132
msgid "Select yes if you want to include an empty loop of the results that you can fill in for output."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:144
msgid "IDs & Parents"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:150
msgid "Post ID(s)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:151
msgid "Query a specific post ID or comma-separated list of ids. Cannot be combined with \"Post ID not in\" below."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:158
msgid "Post ID not in"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:159
msgid "Post ids to exclude from this query. Cannot be combined with \"Post ID(s)\" above."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:169
msgid "Post parent ID(s)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:170
msgid "Comma-separated list of post parent ids if the post type is hierarchical (like pages)."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:177
msgid "Post parent not in"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:178
msgid "Comma-separated list of post parent ids to exclude."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:188
msgid "Post slugs"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:189
msgid "Comma-separated list of post slugs to query by."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:198
msgid "Type & Status"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:205
msgid "Post type to query by, start typing to get suggestions."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:215
msgid "Post status"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:216
msgid "Post status to query by."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:231
msgid "Author ID(s)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:232
msgid "Author ID or comma-separated list of ids."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:238
msgid "Author not in"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:239
msgid "Comma-separated list of author ids to exclude from the query."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:250
msgid "Author name"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:251
msgid "Use the \"user_nicename\" parameter to query by author."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:259
msgid "Search"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:265
msgid "Search term"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:266
msgid "Search for posts by this search term."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:274
msgid "Order"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:280
msgid "Results Order"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:284
msgid "Descending order (3, 2, 1; c, b, a)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:285
msgid "Ascending order (1, 2, 3; a, b, c)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:293
msgid "Order by"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:297
msgid "No order (none)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:301
msgid "Slug (name)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:302
msgid "Post type (type)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:303
msgid "Date (default)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:304
msgid "Modified date"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:305
msgid "Parent id"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:306
msgid "Random"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:307
msgid "Comment count"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:308
msgid "Relevance (for search)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:309
msgid "Page Order (menu_order)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:311
msgid "Meta value"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:312
msgid "Numerical meta value (meta_value_num)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:313
msgid "Order of ids in post__in"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:314
msgid "Order of names in post_name__in"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:315
msgid "Order of ids in post_parent__in"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:320
#: includes/generator/class-wpcode-generator-query.php:493
msgid "Meta Key"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:321
msgid "Meta key to use if you choose to order by meta value."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:331
msgid "Pagination"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:337
msgid "Use Pagination"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:340
msgid "Choose no to display all posts (not recommended)."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:343
msgid "Yes (default)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:348
msgid "Page number"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:349
msgid "Which page to show."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:358
msgid "Posts per page"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:359
msgid "How many posts should be displayed per page."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:365
msgid "Offset"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:366
msgid "Number of posts to skip."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:375
msgid "Ignore sticky posts"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:380
msgid "No (default)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:387
#: includes/generator/class-wpcode-generator-query.php:393
#: includes/generator/class-wpcode-generator-taxonomy.php:35
#: includes/generator/class-wpcode-generator-taxonomy.php:112
msgid "Taxonomy"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:394
msgid "Taxonomy slug that you want to query by."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:402
msgid "Field"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:403
msgid "Select taxonomy term by."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:409
msgid "Term ID (default)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:410
msgid "Term Name"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:411
msgid "Term Slug"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:412
msgid "Term Taxonomy ID"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:417
msgid "Terms"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:418
msgid "Comma-separated list of terms to query by."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:430
msgid "Include Children"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:434
msgid "Whether or not to include children for hierarchical taxonomies."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:443
msgid "Operator"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:447
msgid "Operator to test relation by."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:465
msgid "Add another taxonomy"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:466
msgid "Use the \"Add Taxonomy\" button below to query multiple taxonomies."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:470
msgid "Add Taxonomy"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:475
msgid "Tax Relation"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:479
#: includes/generator/class-wpcode-generator-query.php:579
msgid "AND (default)"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:480
#: includes/generator/class-wpcode-generator-query.php:580
msgid "OR"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:494
msgid "The key of the custom field."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:502
msgid "Meta Value"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:503
msgid "Value to query the meta by."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:515
msgid "How to compare the value for querying by meta."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:542
msgid "Type"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:543
msgid "Type of custom field."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:565
msgid "Add another meta query"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:566
msgid "Use the \"Add Meta\" button below to use multiple meta queries."
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:570
msgid "Add Meta"
msgstr ""

#: includes/generator/class-wpcode-generator-query.php:575
msgid "Relation"
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:35
msgid "Register Scripts"
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:36
msgid "Generate a snippet to load JavaScript scripts using wp_register_script."
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:55
msgid "Using this generator you can create a WordPress function to register and enqueue scripts."
msgstr ""

#. Translators: the placeholders add a link to getboostrap.com.
#: includes/generator/class-wpcode-generator-script.php:80
msgid "You can use this to load external scripts or even scripts from a theme or plugin. For example, you could load %1$sbootstrap%2$s from a cdn."
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:107
#: includes/generator/class-wpcode-generator-style.php:107
msgid "Action (hook)"
msgstr ""

#. Translators: placeholders add links to documentation on wordpress.org.
#: includes/generator/class-wpcode-generator-script.php:110
msgid "Hook used to add the scripts: %1$sfrontend%2$s, %3$sadmin%4$s, %5$slogin%6$s or %7$sembed%8$s."
msgstr ""

#. Translators: placeholder adds the hook name.
#: includes/generator/class-wpcode-generator-script.php:124
#: includes/generator/class-wpcode-generator-style.php:124
msgid "Frontend (%s)"
msgstr ""

#. Translators: placeholder adds the hook name.
#: includes/generator/class-wpcode-generator-script.php:126
#: includes/generator/class-wpcode-generator-style.php:126
msgid "Admin (%s)"
msgstr ""

#. Translators: placeholder adds the hook name.
#: includes/generator/class-wpcode-generator-script.php:128
#: includes/generator/class-wpcode-generator-style.php:128
msgid "Login (%s)"
msgstr ""

#. Translators: placeholder adds the hook name.
#: includes/generator/class-wpcode-generator-script.php:130
#: includes/generator/class-wpcode-generator-style.php:130
msgid "Embed (%s)"
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:137
msgid "Scripts"
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:143
msgid "Script name"
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:144
#: includes/generator/class-wpcode-generator-style.php:144
msgid "This will be used as an identifier in the code, should be lowercase with no spaces."
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:153
msgid "Script URL"
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:154
msgid "The full URL for the script e.g. https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js."
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:163
#: includes/generator/class-wpcode-generator-style.php:163
msgid "Dependencies"
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:164
msgid "Comma-separated list of scripts required for this script to load, e.g. jquery"
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:173
msgid "Script Version"
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:174
msgid "The script version."
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:186
msgid "Header or Footer?"
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:187
msgid "Load the script in the page head or in the footer."
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:199
msgid "Deregister script?"
msgstr ""

#. Translators: Placeholders for wp.org docs link.
#: includes/generator/class-wpcode-generator-script.php:202
msgid "Should the script be %1$sderegistered%2$s first? (for example, if you are replacing an existing script)."
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:217
msgid "Enqueue script?"
msgstr ""

#. Translators: Placeholders for wp.org docs link.
#: includes/generator/class-wpcode-generator-script.php:220
msgid "Should the script be %1$senqueued%2$s or just registered? (select \"No\" only if you intend enqueueing it later."
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:241
msgid "Add more scripts"
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:242
msgid "Use the \"Add script\" button below to add multiple scripts in this snippet."
msgstr ""

#: includes/generator/class-wpcode-generator-script.php:246
msgid "Add script"
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:35
msgid "Sidebar"
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:36
msgid "Generate a snippet to register a sidebar for your widgets."
msgstr ""

#. Translators: Placeholders add links to the wordpress.org references.
#: includes/generator/class-wpcode-generator-sidebar.php:57
msgid "This generator makes it easy to add sidebars to your website using the \"register_sidebar\" function."
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:83
msgid "You can add multiple widget areas for your footer or post-type specific sidebars."
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:116
msgid "Sidebars"
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:122
msgid "Sidebar Id"
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:123
msgid "This is the sidebar unique id, used in the code, lowercase with no spaces."
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:131
msgid "Add a descriptive label for this sidebar to be used in the admin."
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:139
msgid "A short description for the the admin area."
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:146
#: includes/generator/class-wpcode-generator-widget.php:158
msgid "CSS Class"
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:147
msgid "Use an unique CSS class name for better control over this sidebar's styles in the admin."
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:157
msgid "Before Title"
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:158
msgid "HTML code to add before each widget title."
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:166
msgid "After Title"
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:167
msgid "HTML code to add after each widget title."
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:175
msgid "Before Widget"
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:176
msgid "HTML code to add before each widget."
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:184
msgid "After Widget"
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:185
msgid "HTML code to add after each widget."
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:199
msgid "Add another sidebar"
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:200
msgid "Use the \"Add Sidebar\" button below to add as many sidebars as you need."
msgstr ""

#: includes/generator/class-wpcode-generator-sidebar.php:204
msgid "Add Sidebar"
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:35
msgid "Register Stylesheets"
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:36
msgid "Generate a snippet to load CSS stylesheets using wp_register_style."
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:55
msgid "Using this generator you can create a WordPress function to register and enqueue styles."
msgstr ""

#. Translators: the placeholders add a link to getboostrap.com.
#: includes/generator/class-wpcode-generator-style.php:80
msgid "You can use this to load external styles or even styles from a theme or plugin. For example, you could load %1$sfontawesome%2$s from a cdn."
msgstr ""

#. Translators: placeholders add links to documentation on wordpress.org.
#: includes/generator/class-wpcode-generator-style.php:110
msgid "Hook used to add the styles: %1$sfrontend%2$s, %3$sadmin%4$s, %5$slogin%6$s or %7$sembed%8$s."
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:137
msgid "Styles"
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:143
msgid "Style name"
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:153
msgid "Stylesheet URL"
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:154
msgid "The full URL for the stylesheet e.g. https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css."
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:164
msgid "Comma-separated list of styles required for this style to load, e.g. jquery"
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:173
msgid "Style Version"
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:174
msgid "The style version."
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:186
msgid "Media"
msgstr ""

#. Translators: placeholders add a link to the W3.org reference.
#: includes/generator/class-wpcode-generator-style.php:189
msgid "Load the style %1$smedia type%2$s, usually \"all\"."
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:200
msgid "Deregister style?"
msgstr ""

#. Translators: Placeholders for wp.org docs link.
#: includes/generator/class-wpcode-generator-style.php:203
msgid "Should the style be %1$sderegistered%2$s first? (for example, if you are replacing an existing style)."
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:218
msgid "Enqueue style?"
msgstr ""

#. Translators: Placeholders for wp.org docs link.
#: includes/generator/class-wpcode-generator-style.php:221
msgid "Should the style be %1$senqueued%2$s or just registered? (select \"No\" only if you intend enqueueing it later."
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:242
msgid "Add more styles"
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:243
msgid "Use the \"Add style\" button below to add multiple styles in this snippet."
msgstr ""

#: includes/generator/class-wpcode-generator-style.php:247
msgid "Add style"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:36
msgid "Create a custom taxonomy for your posts using this generator."
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:55
msgid "Use this generator to create custom taxonomies for your WordPress site."
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:78
msgid "Use this to add more taxonomies to posts or custom post types. For example, if you used the Post Type generator to create an Artist post type you can use this one to create a Genre taxonomy."
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:118
msgid "Taxonomy Key"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:119
msgid "Name of taxonomy used in the code, lowercase maximum 20 characters."
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:129
msgid "Name (Singular)"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:130
msgid "The singular taxonomy name (e.g. Genre, Year)."
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:138
msgid "The taxonomy plural name (e.g. Genres, Years)."
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:148
msgid "Link To Post Type(s)"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:149
msgid "Comma-separated list of Post Types (e.g. post, page)"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:157
msgid "Hierarchical taxonomies can have descendants."
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:161
msgid "No, like tags"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:162
msgid "Yes, like categories"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:196
msgid "Parent Item colon"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:203
msgid "New Item Name"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:241
msgid "Separate Items with commas"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:248
msgid "Add or Remove Items"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:255
msgid "Choose From Most Used"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:265
msgid "Popular Items"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:272
msgid "Search Items"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:286
msgid "No items"
msgstr ""

#. Translators: Placeholders add a link to the wp.org documentation page.
#: includes/generator/class-wpcode-generator-taxonomy.php:317
msgid "Should this taxonomy be %1$svisible to authors%2$s?"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:331
msgid "Should this taxonomy have an User Interface for managing?"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:341
msgid "Show Admin Column"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:342
msgid "Should this taxonomy add a column in the list of associated post types?"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:355
msgid "Show Tag Cloud"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:356
msgid "Should this taxonomy be visible in the tag cloud widget?"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:366
msgid "Show in Navigation Menus"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:367
msgid "Should this taxonomy be available in menus (Appearance > Menus)."
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:385
msgid "Permalink Rewrite"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:386
msgid "Use Default Permalinks, disable automatic rewriting or use custom permalinks."
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:390
msgid "Default (taxonomy key)"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:401
msgid "If you selected custom permalinks use this field for the rewrite base, e.g. taxonomy in https://yoursite.com/taxonomy"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:411
msgid "Prepend permastruct"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:412
msgid "Should the permastruct be prepended to the url (with_front parameter)."
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:422
msgid "Hierarchical URL Slug"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:423
msgid "For hierarchical taxonomies use the whole hierarchy in the URL?"
msgstr ""

#. Translators: Placeholders add link to wp.org docs.
#: includes/generator/class-wpcode-generator-taxonomy.php:443
msgid "User capabilities in relation to this taxonomy. %1$sSee Documentation.%2$s"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:454
msgid "Use the fields on the right to assign custom capabilities for this taxonomy."
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:461
msgid "Edit Terms"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:468
msgid "Delete Terms"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:478
msgid "Manage Terms"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:485
msgid "Assign Terms"
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:501
msgid "Add the taxonomy to the WordPress wp-json API."
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:515
msgid "The base slug that this taxonomy will use in the REST API."
msgstr ""

#: includes/generator/class-wpcode-generator-taxonomy.php:525
msgid "The name of a custom Rest Controller class instead of WP_REST_Terms_Controller."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:35
#: includes/generator/class-wpcode-generator-widget.php:123
msgid "Widget"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:36
msgid "Generate a snippet to register a custom sidebar widget for your website."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:55
msgid "Using this generator you can easily add a custom sidebar widget with settings."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:78
msgid "Sidebar widgets are very useful when you want to display the same content on multiple pages, you can create a widget with contact methods, for example and fields to set a phone number, email, etc."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:90
msgid "Class name"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:91
msgid "Make this unique to avoid conflicts with other similar snippets."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:102
msgid "Prefix"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:103
msgid "Used to prefix all the field names."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:114
msgid "Optional textdomain for translations."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:129
msgid "Widget ID"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:130
msgid "Unique id for the widget, used in the code."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:138
msgid "Widget Title"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:139
msgid "The title of the widget (displayed in the admin)."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:151
msgid "Description used in the admin to explain what the widget is used for."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:159
msgid "Widget-specific CSS class name."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:168
msgid "Widget Output Code"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:169
msgid "PHP Code used for outputting the fields in the frontend. If left empty it will output the fields values in a simple list."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:177
msgid "Fields"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:183
msgid "Field Type"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:184
msgid "Pick the type of field you want to use for this setting."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:188
msgid "Text"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:189
msgid "Email"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:190
msgid "URL"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:191
msgid "Number"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:192
msgid "Textarea"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:193
msgid "Select"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:194
msgid "Checkboxes"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:195
msgid "Radio"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:201
msgid "Field ID"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:202
msgid "Unique id for this field, used in the code."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:209
msgid "Field Label"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:210
msgid "The label displayed next to this field in the admin form."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:224
msgid "Display a short descriptive text below this field."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:231
msgid "Default"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:232
msgid "Set the default value for this field."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:240
msgid "Use value|label for each line to add options for select, checkbox or radio."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:250
msgid "Add another field"
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:251
msgid "Use the \"Add field\" button below to add as many fields as you need."
msgstr ""

#: includes/generator/class-wpcode-generator-widget.php:255
msgid "Add field"
msgstr ""

#: includes/helpers.php:166
msgctxt "Copy to clipboard"
msgid "Copy"
msgstr ""

#: includes/helpers.php:180
msgid "Contains"
msgstr ""

#: includes/helpers.php:181
msgid "Doesn't Contain"
msgstr ""

#: includes/helpers.php:182
msgid "Is"
msgstr ""

#: includes/helpers.php:183
msgid "Is not"
msgstr ""

#: includes/helpers.php:184
msgid "Is Before"
msgstr ""

#: includes/helpers.php:185
msgid "Is After"
msgstr ""

#: includes/helpers.php:186
msgid "Is on or Before"
msgstr ""

#: includes/helpers.php:187
msgid "Is on or After"
msgstr ""

#: includes/lite/admin/class-wpcode-admin-page-loader-lite.php:35
#: includes/lite/admin/class-wpcode-admin-page-loader-lite.php:36
#: includes/lite/class-wpcode-admin-bar-info-lite.php:71
msgid "Upgrade to Pro"
msgstr ""

#: includes/lite/admin/class-wpcode-connect.php:67
msgid "You are not allowed to install plugins."
msgstr ""

#: includes/lite/admin/class-wpcode-connect.php:73
msgid "Please enter your license key to connect."
msgstr ""

#: includes/lite/admin/class-wpcode-connect.php:77
msgid "Only the Lite version can be upgraded."
msgstr ""

#: includes/lite/admin/class-wpcode-connect.php:95
msgid "WPCode Pro is installed but not activated."
msgstr ""

#: includes/lite/admin/class-wpcode-connect.php:148
msgid "There was an error while installing an upgrade. Please download the plugin from wpcode.com and install it manually."
msgstr ""

#: includes/lite/admin/class-wpcode-connect.php:181
#: includes/lite/admin/class-wpcode-connect.php:194
#: includes/lite/admin/class-wpcode-connect.php:255
msgid "Plugin installed & activated."
msgstr ""

#: includes/lite/admin/class-wpcode-connect.php:202
msgid "There was an error while installing an upgrade. Please check file system permissions and try again. Also, you can download the plugin from wpcode.com and install it manually."
msgstr ""

#: includes/lite/admin/class-wpcode-connect.php:229
msgid "No key provided."
msgstr ""

#: includes/lite/admin/class-wpcode-connect.php:259
msgid "Pro version installed but needs to be activated on the Plugins page inside your WordPress admin."
msgstr ""

#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:64
msgid "Choose the snippets you want to run on this page. Please note: only active snippets will be executed."
msgstr ""

#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:69
msgid "Select snippets"
msgstr ""

#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:75
msgid "Search snippets"
msgstr ""

#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:81
msgid "Load more snippets"
msgstr ""

#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:88
msgid "+ Choose Snippet"
msgstr ""

#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:140
#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:283
#: includes/lite/class-wpcode-admin-bar-info-lite.php:91
msgid "Page Scripts is a Pro Feature"
msgstr ""

#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:143
#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:286
#: includes/lite/class-wpcode-admin-bar-info-lite.php:92
msgid "While you can always use global snippets, in the PRO version you can easily add page-specific scripts and snippets directly from the post edit screen."
msgstr ""

#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:146
#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:289
#: includes/lite/class-wpcode-admin-bar-info-lite.php:93
msgid "Upgrade to Pro and Unlock Page Scripts"
msgstr ""

#. Translators: placeholder for the name of the section (header or footer).
#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:171
msgid "Add scripts below to the %s section of this page."
msgstr ""

#. Translators: placeholder for the name of the section (header or footer).
#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:182
msgid "Disable global %s scripts on this page"
msgstr ""

#. Translators: placeholder for the name of the section (header or footer).
#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:193
msgid "%s - any device type"
msgstr ""

#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:309
msgid "As you make changes to your page scripts and save, you will get a list of previous versions with all the changes made in each revision. You can compare revisions to the current version or see changes as they have been saved by going through each revision. Any of the revisions can then be restored as needed without interfering with your post/page."
msgstr ""

#: includes/lite/admin/class-wpcode-metabox-snippets-lite.php:316
msgid "Upgrade to WPCode Pro today and start tracking revisions and see exactly who, when and which changes were made to your page scripts."
msgstr ""

#. Translators: more here is used in the sense of "get access to more snippets" and gets replaced with the number of snippets if the library items are loaded correctly.
#: includes/lite/admin/notices.php:37
msgid "more"
msgstr ""

#. Translators: %1$s and %2$s add a link to the settings page. %3$s and %4$s make the text bold. %6$s is replaced with the number of snippets and %5$s adds a "new" icon.
#: includes/lite/admin/notices.php:42
msgid "%5$s%1$sConnect to the WPCode Library%2$s to get access to %3$s%6$s FREE snippets%4$s!"
msgstr ""

#. Translators: %1$s and %2$s add a link to the upgrade page. %3$s and %4$s make the text bold.
#: includes/lite/admin/notices.php:88
msgid "%3$sYou're using WPCode Lite%4$s. To unlock more features consider %1$supgrading to Pro%2$s."
msgstr ""

#: includes/lite/admin/notices.php:116
msgid "Get WPCode Pro and Unlock all the Powerful Features"
msgstr ""

#: includes/lite/admin/notices.php:119
msgid "Save & Reuse snippets in your private Cloud Library"
msgstr ""

#: includes/lite/admin/notices.php:120
msgid "Add page-specific scripts when editing a post/page."
msgstr ""

#: includes/lite/admin/notices.php:121
msgid "Track all snippet changes with Advanced Code Revisions"
msgstr ""

#: includes/lite/admin/notices.php:124
msgid "Load snippets by device (mobile/desktop) with 1-click."
msgstr ""

#: includes/lite/admin/notices.php:125
msgid "Easily insert and reuse content with Custom Shortcodes."
msgstr ""

#: includes/lite/admin/notices.php:126
msgid "Precisely track eCommerce conversions for WooCommerce and EDD."
msgstr ""

#: includes/lite/admin/notices.php:132
msgid "Get WPCode Pro Today and Unlock all the Powerful Features »"
msgstr ""

#. Translators: Placeholders make the text bold.
#: includes/lite/admin/notices.php:137
msgid "%1$sBonus:%2$s WPCode Lite users get %3$s$50 off regular price%4$s, automatically applied at checkout"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-anywhere.php:58
msgid "Anywhere (CSS Selector)"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-anywhere.php:69
msgid "Before HTML Element"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-anywhere.php:70
msgid "Insert snippet before the HTML element specified by the CSS selector."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-anywhere.php:73
msgid "After HTML Element"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-anywhere.php:74
msgid "Insert snippet after the HTML element specified by the CSS selector."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-anywhere.php:77
msgid "At the start of HTML Element"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-anywhere.php:78
msgid "Insert snippet before the content of the HTML element specified by CSS selector."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-anywhere.php:81
msgid "At the end of HTML Element"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-anywhere.php:82
msgid "Insert snippet after the content of the HTML element specified by CSS selector."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-anywhere.php:85
msgid "Replace HTML Element"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-anywhere.php:86
msgid "Completely replace the HTML element specified by the CSS selector with the output of this snippet."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-anywhere.php:97
msgid "Insert Anywhere by CSS Selector is a Premium feature"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-anywhere.php:98
msgid "Upgrade to PRO today and insert snippets anywhere on your site using CSS selectors to target any HTML element."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:70
msgid "Insert After # Words"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:71
msgid "Insert snippet after a minimum number of words."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:74
msgid "Insert Every # Words"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:75
msgid "Insert snippet every # number of words."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:78
msgid "Insert in the Middle of the Content"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:79
msgid "Insert snippet in the middle of the post content."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:82
msgid "Insert after first Quarter (25%)"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:83
msgid "Insert snippet after the first quarter of the post content."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:86
msgid "Insert after 3rd Quarter (75%)"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:87
msgid "Insert snippet after the third quarter of the post content."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:90
msgid "Insert after first Third (33%)"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:91
msgid "Insert snippet after the first third of the post content."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:94
msgid "Insert after second Third (66%)"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:95
msgid "Insert snippet after the second third of the post content."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:98
msgid "Insert after 80%"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:99
msgid "Insert snippet after 80% of the post content."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:110
msgid "Word-based content locations are a PRO feature"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-content.php:111
msgid "Upgrade to PRO today and get access to automatic word-count based insert locations."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:69
msgid "Before the Purchase Button"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:70
msgid "Insert snippet before the EDD purchase button."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:73
msgid "After the Purchase Button"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:74
msgid "Insert snippet after the EDD purchase button."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:77
msgid "Before the Single Download"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:78
msgid "Insert snippet before the single EDD download content."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:81
msgid "After the Single Download"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:82
msgid "Insert snippet after the single EDD download content."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:85
#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:94
msgid "Before the Cart"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:86
msgid "Insert snippet before the EDD cart."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:89
#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:98
msgid "After the Cart"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:90
msgid "Insert snippet after the EDD cart."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:93
msgid "Before the Checkout Cart"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:94
msgid "Insert snippet before the EDD cart on the checkout page."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:97
msgid "After the Checkout Cart"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:98
msgid "Insert snippet after the EDD cart on the checkout page."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:101
#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:102
msgid "Before the Checkout Form"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:102
msgid "Insert snippet before the EDD checkout form on the checkout page."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:105
#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:106
msgid "After the Checkout Form"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:106
msgid "Insert snippet after the EDD checkout form on the checkout page"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:117
msgid "Easy Digital Downloads Locations are a PRO feature"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-edd.php:118
#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:110
#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:131
msgid "Upgrade to PRO today and get access to advanced eCommerce auto-insert locations and conditional logic rules for your needs."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:69
msgid "Before the Registration Form"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:70
msgid "Insert snippet before the MemberPress registration form used for checkout."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:73
msgid "Before Checkout Submit Button"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:74
msgid "Insert snippet right before the MemberPress checkout submit button."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:77
msgid "Before Checkout Coupon Field"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:78
msgid "Insert snippet before the MemberPress checkout coupon field."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:81
msgid "Before Account First Name"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:82
msgid "Insert snippet to the Home tab of the MemberPress Account page before First Name field."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:85
msgid "Before Subscriptions Content"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:86
msgid "Insert snippet at the beginning of the Subscriptions tab on the MemberPress Account page."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:89
msgid "Before Login Form Submit"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:90
msgid "Insert snippet before the Remember Me checkbox on the MemberPress Login page."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:93
msgid "Before the Unauthorized Message"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:94
msgid "Insert a snippet before the notice that access to the content is unauthorized. "
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:97
msgid "After the Unauthorized Message"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:98
msgid "Insert a snippet after the notice that access to the content is unauthorized. "
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-memberpress.php:109
msgid "MemberPress Locations are a PRO feature"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:70
msgid "Before the List of Products"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:71
msgid "Insert snippet before the list of products on a WooCommerce page."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:74
msgid "After the List of Products"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:75
msgid "Insert snippet after the list of products on a WooCommerce page."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:78
msgid "Before the Single Product"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:79
msgid "Insert snippet before the content on the single WooCommerce product page."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:82
msgid "After the Single Product"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:83
msgid "Insert snippet after the content on the single WooCommerce product page."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:86
msgid "Before the Single Product Summary"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:87
msgid "Insert snippet before the product summary on the single WooCommerce product page."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:90
msgid "After the Single Product Summary"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:91
msgid "Insert snippet after the product summary on the single WooCommerce product page."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:95
msgid "Insert snippet before the cart on WooCommerce pages."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:99
msgid "Insert snippet after the cart on WooCommerce pages."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:103
msgid "Insert snippet before the checkout form on the WooCommerce checkout page."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:107
msgid "Insert snippet after the checkout form on the WooCommerce checkout page."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:110
msgid "Before Checkout Payment Button"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:111
msgid "Insert snippet before the checkout payment button on the WooCommerce checkout page."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:114
msgid "After Checkout Payment Button"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:115
msgid "Insert snippet after the checkout payment button on the WooCommerce checkout page."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:118
msgid "Before the Thank You Page"
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:119
msgid "Insert snippet before the thank you page content for WooCommerce."
msgstr ""

#: includes/lite/auto-insert/class-wpcode-auto-insert-woocommerce.php:130
msgid "WooCommerce Locations are a PRO feature"
msgstr ""

#: includes/lite/class-wpcode-admin-bar-info-lite.php:29
msgid "Page Scripts"
msgstr ""

#: includes/lite/class-wpcode-smart-tags-lite.php:20
msgid "Smart Tags are a Premium feature"
msgstr ""

#: includes/lite/class-wpcode-smart-tags-lite.php:21
msgid "Upgrade to PRO today and simplify the way you write advanced snippets using smart tags without having to write any PHP code."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:37
msgid "Device"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:49
msgid "Target either desktop or mobile devices."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:52
msgid "Device Type Rules are a Pro Feature"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:53
msgid "Get access to advanced device type conditional logic rules by upgrading to PRO today."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:58
msgid "Desktop"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:63
msgid "Mobile"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:70
msgid "Browser Type"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:71
msgid "Target specific visitor web browsers."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:74
msgid "Browser Type Rules are a Pro Feature"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:75
msgid "Get access to advanced device conditional logic rules by upgrading to PRO today."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:80
msgid "Operating System"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:81
msgid "Target operating systems like Windows, Mac OS or Linux."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:84
msgid "Operating System Rules are a Pro Feature"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:85
msgid "Get access to advanced operating system conditional logic rules by upgrading to PRO today."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:90
msgid "Cookie Name"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:91
msgid "Load or hide a snippet by cookie name."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:94
#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:104
msgid "Cookie-based Rules are a Pro Feature"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:95
#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:105
msgid "Get access to advanced cookie conditional logic rules by upgrading to PRO today."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:100
msgid "Cookie Value"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-device.php:101
msgid "Load or hide a snippet by cookie value."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-edd.php:48
msgid "EDD Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-edd.php:49
msgid "Load the snippet on specific Easy Digital Downloads pages."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-edd.php:52
msgid "Easy Digital Downloads Page Rules is a Pro Feature"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-edd.php:53
msgid "Get access to advanced conditional logic rules for Easy Digital Downloads by upgrading to PRO today."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-edd.php:58
#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:58
msgid "Checkout Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-edd.php:63
msgid "Confirmation Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-edd.php:68
msgid "Single Download Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-edd.php:73
msgid "Download Category Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-edd.php:78
msgid "Download Tag Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-location.php:40
msgid "Country"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-location.php:41
msgid "Limit loading the snippet based on the visitor's country."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-location.php:45
#: includes/lite/conditional-logic/class-wpcode-conditional-location.php:56
msgid "Location Rules are a Pro Feature"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-location.php:46
#: includes/lite/conditional-logic/class-wpcode-conditional-location.php:57
msgid "Get access to location-based conditional logic rules by upgrading to PRO today."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-location.php:51
msgid "Continent"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-location.php:52
msgid "Target entire continents with ease."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-memberpress.php:49
msgid "MemberPress Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-memberpress.php:50
msgid "Load the snippet on specific MemberPress pages."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-memberpress.php:53
msgid "MemberPress Page Rules is a Pro Feature"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-memberpress.php:54
#: includes/lite/conditional-logic/class-wpcode-conditional-memberpress.php:83
msgid "Get access to advanced conditional logic rules for MemberPress by upgrading to PRO today."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-memberpress.php:59
msgid "Registration Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-memberpress.php:63
#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:63
msgid "Thank You Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-memberpress.php:67
msgid "Account Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-memberpress.php:71
msgid "Login Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-memberpress.php:77
msgid "User active membership"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-memberpress.php:78
msgid "Check if the current user has a specific MemberPress subscription active."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-memberpress.php:82
msgid "MemberPress Active Membership Rules is a Pro Feature"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-schedule.php:48
msgid "Date"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-schedule.php:49
msgid "Check whether today is before or after a date."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-schedule.php:53
msgid "Date & Time"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-schedule.php:54
msgid "Get more specific by also including a specific time."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-schedule.php:58
msgid "Day of the Week"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-schedule.php:59
msgid "Load the snippet on specific days of the week."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-schedule.php:64
msgid "Current time"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-schedule.php:65
msgid "Check whether it's before or after a specific time"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-schedule.php:72
msgid "Scheduling rules are a Pro Feature"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-schedule.php:73
msgid "Upgrade today and get access to advanced scheduling conditional logic rules."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-snippet.php:37
msgid "Snippet"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-snippet.php:49
msgid "Load this snippet based on another snippet being loaded."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-snippet.php:53
msgid "WPCode Snippet Loaded Rules are a Pro Feature"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-snippet.php:54
msgid "Upgrade today and use conditional logic rules based on other WPCode snippets being loaded."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:48
msgid "WooCommerce Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:49
msgid "Load the snippet on specific WooCommerce pages."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:52
msgid "WooCommerce Page Rules is a Pro Feature"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:53
#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:106
msgid "Get access to advanced conditional logic rules for WooCommerce by upgrading to PRO today."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:68
msgid "Cart Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:73
msgid "Single Product Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:78
msgid "Shop Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:83
msgid "Product Category Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:88
msgid "Product Tag Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:93
msgid "My Account Page"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:100
msgid "WooCommerce Cart"
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:101
msgid "Load the snippet based on the WooCommerce Cart Contents."
msgstr ""

#: includes/lite/conditional-logic/class-wpcode-conditional-woocommerce.php:105
msgid "WooCommerce Cart Contents Rule is a Pro Feature"
msgstr ""

#: includes/safe-mode.php:75
msgid "WPCode is in Safe Mode which means no snippets are getting executed. Please disable any snippets that have caused errors and when done click the button below to exit safe mode."
msgstr ""

#: includes/safe-mode.php:76
msgid "The link will open in a new window so if you are still encountering issues you safely can return to this tab and make further adjustments"
msgstr ""

#: includes/safe-mode.php:78
msgid "Exit safe mode"
msgstr ""
languages/index.php000064400000000100151331545640010330 0ustar00<?php
//Nothing to see here

header( 'HTTP/1.0 403 Forbidden' );

Youez - 2016 - github.com/yon3zu
LinuXploit